<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>No.5972 Publishment Website</title>
  
  <subtitle>Easier than easy.</subtitle>
  <link href="/cms/feed.xml" rel="self"/>
  
  <link href="https://no5972.moe/cms/"/>
  <updated>2026-04-03T02:21:47.863Z</updated>
  <id>https://no5972.moe/cms/</id>
  
  <author>
    <name>No.5972</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>仅作笔记用：PS 添加参考线，以像素为单位</title>
    <link href="https://no5972.moe/cms/archivers/176.html"/>
    <id>https://no5972.moe/cms/archivers/176.html</id>
    <published>2026-02-28T09:00:00.000Z</published>
    <updated>2026-04-03T02:21:47.863Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>在 PhotoShop 中添加参考线时，对话框默认填入的数值单位为“厘米”。</p><p>如果要使用像素单位的数值，直接在这个输入框中填入数字 + “像素”两个字，就可以以像素为单位添加参考线。这样就不需要按照 DPI 计算成厘米单位的数值了（图片来源：脚本之家）。</p><p><img src="https://images.weserv.nl/?url=https://picx.zhimg.com/v2-fef651e4b0cc584d60ad39408623a4e9_r.jpg" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      在 PhotoShop 中添加参考线时，对话框默认填入的数值单位为“厘米”。如果要使用像素单位的数值，直接在这个输入框中填入数字 + “像素”两个字，就可以以像素为单位添加参考线。这样就不需要按照 DPI 计算成厘米单位的数值了
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：安卓系统提前运行小花仙互通微端的临时方案，本地运行，不借助云电脑</title>
    <link href="https://no5972.moe/cms/archivers/175.html"/>
    <id>https://no5972.moe/cms/archivers/175.html</id>
    <published>2026-02-01T18:00:00.000Z</published>
    <updated>2026-02-14T03:07:59.580Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>这只是官方未推出移动端之前的在手机上游玩小花仙互通版的临时方案，鄙人当然还是推荐等一等官方推出的移动端。关于怎么把游戏传到手机上，先在电脑上把互通微端下载下来，不要安装，用 7-zip 等解压缩工具强行打开，里面有一个 <code>app.7z</code>，打开这个 7z，然后此时不要选中任何条目，点击工具栏上的提取或者解压到，找一个地方新建文件夹然后解压到这个新建的文件夹里面。</p><p>然后在电脑上运行里面的 <code>flowerfairy.exe</code>，把游戏更新一遍，等加载到登录界面的时候退出。这时候再把这个文件夹用解压缩工具打成一个压缩包，建议用 zip 格式的，对手机兼容性更好。然后用各位手机支持的任何方式把这个压缩包传到手机上，鄙人这里 iqoo 用的是 vivo 自带的互传网页版。然后在手机上解压这个压缩包，还是建议新建一个文件夹来解压缩。</p><p>然后打开盖世游戏 APP，导入游戏，导入时注意选择里面的 <code>Games\Hua.exe</code>，不建议选择 <code>flowerfairy.exe</code>。首次启动微端时他会自动开始下载和安装环境，这边大概下载了 429MB，环境我看他自动检测出来的是 proton。鄙人这边骁龙 870 CPU 每次启动大约需要四分钟左右的时间。建议手机预留至少 10GB 存储空间。目前只测试了骁龙的 CPU，麒麟和天玑的还没看，大概率还不行，这点需注意。</p><p><img src="https://images.weserv.nl/?url=https://pic3.zhimg.com/v2-d6b5fb5c6fedb6689ac64e31796eec70_r.jpg" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://pic2.zhimg.com/v2-62c492dde0c8db55341c31bb10b72751_r.jpg" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://pic4.zhimg.com/v2-7e1bb1345ef881adaf770a2b6322107b_r.jpg" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这只是官方未推出移动端之前的在手机上游玩小花仙互通版的临时方案，鄙人当然还是推荐等一等官方推出的移动端。环境我看他自动检测出来的是 Proton。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>Win11 使用 QEMU 虚拟机运行 VC6 的可行性</title>
    <link href="https://no5972.moe/cms/archivers/174.html"/>
    <id>https://no5972.moe/cms/archivers/174.html</id>
    <published>2025-10-27T03:00:00.000Z</published>
    <updated>2026-02-14T03:05:00.253Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>有些学校或者老师仍然在要求学生必须使用 VC6 来学习 C 语言基础。但是现在的 Win11 已经逐渐开始停止支持 VC6 这个上古时期的 IDE 的运行。 <strong>有的时候不是要建议学生换用现代的 IDE 来学习，而是学校或者老师要求学生必须使用 VC6 这个上古时期的 IDE 来学习，学生是被迫、不得不使用 VC6 的。</strong> 上次探讨了使用 Copy v86 在线网页运行 VC6 的可行性，但是仍然存在一些缺陷，保存文件不是很方便，不能输入和显示中文，也不能写 MFC 程序（这个和前面那个不能输入和显示中文有关，这个英文版的 VC6 把 MFC 相关的开发环境给精简掉了）。这里再探讨一下可否使用 QEMU 虚拟机在 Win11 运行 VC6。 <strong>庆幸的是，有一个很简便的可以导入磁盘镜像一键启动的绿色免安装单文件直接运行的图形界面的工具《QEMU 启动测试器》，可以直接运行 QEMU 虚拟机，这样就不需要安装虚拟机软件了。</strong> 这个启动的操作比网页版稍微复杂一点点，不过也只是复杂一点点。</p><p>鄙人这里也已经封装好了一个磁盘镜像，不过鄙人还没研究出来怎么搞快照，印象中 QEMU 也有快照功能（参考鄙人以前发的飞腾提供的 PhyFusion，那个就有快照功能，这个本质上就是 QEMU 的一个 GUI 封装），所以每次使用的时候还是要完整的开机一次。鄙人是找了一个“贝贝精简系统 BABEXP-V0.14-H 最小中文家庭版”的精简版 XP 系统，这个系统包只有 75MB，安装后 C 盘占用 1 点多 GB，用 7z 压缩磁盘镜像之后只有不到 80MB。 <a href="https://wujiuqier.lanzouk.com/izYpv39j5e8j" target="_blank" rel="noopener">https://wujiuqier.lanzouk.com/izYpv39j5e8j</a> 这个支持显示和输入中文，输入法还是保留了一个智能 ABC 的，虽然这个打字不是很方便，但是用于学习 C 语言编程也够用了。<a href="https://www.bilibili.com/video/BV1184y1F7B2/" target="_blank" rel="noopener">感谢 B 站的 @Moemuu 提供的线索</a>。</p><p><strong>具体操作过程：到网上找到这个《QEMU 启动测试器》，这个就是一个免安装的单文件 EXE，双击打开直接就可以使用。把下载好的磁盘镜像压缩包解压，此时会得到一个 400 多 MB 的 <code>.qcow2</code> 的文件，这个就是磁盘镜像。打开那个“Q启动测试.exe”，上面的选项里面选择第二行第一个“磁盘镜像”，然后直接把这个 400 多 MB 的 <code>.qcow2</code> 的文件拖放到这个窗口的中间的文本框里面，内存大小输入 1000 或者 1024 都可以（别太大太小就行，太大了物理机电脑可能带不动，太小了虚拟机可能带不动）。然后点击“开始测试”，静候开机，看到桌面之后，桌面上就有一个“VC666”的图标，直接打开就能运行和使用 VC6 了。这个可以显示中文，界面也是中文版的，也可以用智能 ABC 输入法输入中文，也可以写控制台和 MFC 程序。这个启动器是会直接写入磁盘镜像的，也就是说编写的代码保存之后，下次开机还是保存在虚拟机上的。</strong></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174803301-1377498548.png" alt="image" /></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174814292-1229761202.png" alt="image" /></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174823741-53834603.png" alt="image" /></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174847129-2086274837.png" alt="image" /></p><p>如果不放心现成的磁盘镜像，或者一定想自己动手配置的话，下面是从头开始配置的过程：</p><ol><li>下载安装 QEMU Manager 这个工具，点击工具栏第一个按钮虚拟机。</li></ol><ul><li>虚拟机名字随便起一个，操作系统选 Windows XP，其他保持默认。</li><li>内存大小填 1000 或者 1024，主要虚拟硬盘选创建一个新的虚拟磁盘镜像，磁盘大小选 2GB，勾选压缩磁盘，格式选 qcow2。</li><li>第三个选项勾不勾都行，个人建议还是勾上，方便管理。</li></ul><ol start="2"><li>左侧树形图选择刚才创建的虚拟机，右侧选择驱动器，双击 CD-ROM，点击右侧两个点的按钮，找到前述所说的“贝贝精简系统 BABEXP-V0.14-H 最小中文家庭版”的精简版 XP 系统的 ISO 文件，确定。</li><li>然后点击工具栏的播放按钮开机，立刻点进去虚拟机的显示画面并立刻连续击键 F12，打开启动菜单，按主键盘区的数字键“3”从虚拟机的光驱启动。</li><li>按照这个系统包的安装过程走一遍，把这个精简版 XP 系统装到虚拟机的磁盘上。</li><li>还是用 UltraISO 往虚拟机里面传输文件，需要准备这些：</li></ol><ul><li>VC6 绿色版压缩包，这里准备的是一个 50 多 MB 的，名字可能不好找，大致搜索一下“VC6 绿色版”应该可以找到。压缩包是 ZIP 格式的，大小是 55,066,220 字节，MD5 码是 <code>c1fad870bfc969f57679a85196fc6043</code>。把准备好的文件直接拖到 UltraISO 的右上方的窗格里面。然后把这个文档保存为 ISO 文件。</li><li>一个 XP 可用的 7-Zip 安装包，这里找了一个 9.22 的版本。</li></ul><ol start="6"><li>安装好之后重启一遍虚拟机，把弹出来几个找到新硬件的向导全部一路 next，这些驱动都被精简掉了，主要是声卡、网卡这些，不过不影响 VC6 写代码（涉及多媒体的程序确实不行就是）。</li><li>关闭虚拟机，还是右侧选择驱动器，双击 CD-ROM，点击右侧两个点的按钮，找到并选择刚才在 UltraISO 里面保存的 ISO 文件，确定。</li><li>打开虚拟机，打开“我的电脑”，打开里面的光盘，先把里面的 7-zip 安装包安装，一路 next 就行。然后右键那个 VC6 绿色版的压缩包，选择 7-Zip - 提取文件，解压到 C 盘的任意位置。</li><li>找到解压缩出来的地方，打开里面的 <code>VC6.0green\Common\MSDev98\Bin\MSDEV.EXE</code>，右键发送到 - 桌面快捷方式，然后把桌面上创建出来的这个 VC6 的快捷方式重命名一下。以后就可以用这个快捷方式运行和使用 VC6 了。</li><li>建议把这个磁盘镜像备份一下，以后方便重置环境。关闭虚拟机，把这个 <code>.qcow2</code> 的磁盘镜像文件压缩成一个压缩包文件即可。</li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      上次探讨了使用 Copy v86 在线网页运行 VC6 的可行性，但是仍然存在一些缺陷，保存文件不是很方便，不能输入和显示中文，也不能写 MFC 程序（这个和前面那个不能输入和显示中文有关，这个英文版的 VC6 把 MFC 相关的开发环境给精简掉了）。这里再探讨一下可否使用 QEMU 虚拟机在 Win11 运行 VC6。 庆幸的是，有一个很简便的可以导入磁盘镜像一键启动的绿色免安装单文件直接运行的图形界面的工具《QEMU 启动测试器》，可以直接运行 QEMU 虚拟机，这样就不需要安装虚拟机软件了。这个启动的操作比网页版稍微复杂一点点，不过也只是复杂一点点。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>Win11 使用 Copy v86 在线网页运行 VC6 学习 C 语言的可行性</title>
    <link href="https://no5972.moe/cms/archivers/173.html"/>
    <id>https://no5972.moe/cms/archivers/173.html</id>
    <published>2025-10-24T11:00:00.000Z</published>
    <updated>2025-10-28T10:03:03.640Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>首先，程序员节快乐。有些学校或者老师仍然在要求学生必须使用 VC6 来学习 C 语言基础。但是现在的 Win11 已经逐渐开始停止支持 VC6 这个上古时期的 IDE 的运行。 <strong>有的时候不是要建议学生换用现代的 IDE 来学习，而是学校或者老师要求学生必须使用 VC6 这个上古时期的 IDE 来学习，学生是被迫、不得不使用 VC6 的。</strong> 这里探讨一下可否用 Copy v86 在线网页虚拟机运行 VC6 学习 C 语言，这样就不用安装虚拟机软件还要往虚拟机里面安装操作系统这么麻烦了。</p><p>当然，鄙人也尝试了一下直接封装一个虚拟机快照，这样就不需要把下面的非常麻烦的配置过程一点点的走一遍了（至少对于现在的电脑小白来说是非常麻烦的），这个快照也已经上传了，<a href="https://wujiuqier.lanzouk.com/iZJ313983p7g" target="_blank" rel="noopener">https://wujiuqier.lanzouk.com/iZJ313983p7g</a> 。把下载好的快照压缩包解压，此时会得到一个 400 多 MB 的 <code>.bin</code> 的文件，这个就是快照。访问 Copy v86 网站，点击进入 Windows 2000 的那个选项，稍等片刻加载，看到桌面之后点击网页顶部的 Load State 按钮，找到并选择解压出来的那个 <code>.bin</code> 的快照文件，这时候就直接打开 VC6 这个 IDE 了。</p><p>如果要保存写好的代码的话，可以点击网页顶部的 Save State 按钮，稍等片刻，就把当前运行的系统保存为快照文件，这样下次运行就可以点击网页顶部的 Load State 按钮调出之前编写的代码了。不过每次保存快照会有 400 多 MB 的快照要保存，请留意磁盘空间是否足够。</p><p>这个 Win2000 的环境，虚拟内存设置的比较低，有时候会弹出“Your system is low on memory”的报错，这个目前来看暂时是不影响这个 VC6 的运行的，可以直接点击 OK 忽略。另外，这个 Win2000 的环境是英文的，打不了中文，也显示不了中文，所以只能搞一个英文版的 VC6，需要使用者能看懂 VC6 的英文界面，并且涉及到 printf 输出的语句，还是要用英文来写这个字符串。这个 VC6 是精简过的，不能写 MFC，但是写一些简单的控制台应用程序足够了。</p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174320654-1347475663.png" alt="image" /></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202510/2259503-20251027174334423-2109133679.png" alt="image" /></p><p>如果不放心现成的快照，或者一定想自己动手配置的话，下面是从头开始配置的过程：</p><ol><li>使用 UltraISO 往虚拟机里面传输文件，需要准备这些：</li></ol><ul><li>VC6 英文版安装包，这里找到一个精简版，不能写 MFC，但是写一些简单的控制台应用程序足够了（搜索关键词：Visual C++ 6.0精简版 绿色英文版）。安装包是 EXE 格式的，大小是 17,147,148 字节，MD5 是 <code>7fee6b34304961721c6a9d7283e82973</code>；不过最好是把这个安装包重命名成一个英文的文件名，怕他不识别非 ASCII 的文件名。</li><li>一个 <code>MSVCP60.DLL</code> 文件，copy v86 把系统里面的 VC6 运行库给精简掉了，可以去网上搜索下载，注意请下载 32 位的。</li></ul><ol start="2"><li>把准备好的文件直接拖到 UltraISO 的右上方的窗格里面。然后把这个文档保存为 ISO 文件。</li><li>这样应该也就够了。访问 Copy v86 网站，点击进入 Windows 2000 的那个镜像，稍等片刻加载，看到桌面之后点击 Insert CD Image，找到并选择刚才在 UltraISO 里面保存的 ISO 文件。然后打开桌面的 My Computer，双击出现的 D 盘，也就是那个“光驱”。</li><li>把那个 VC6 的安装包双击打开。这个安装包还是用的中文做的，而这个 Copy v86 的 Win2000 镜像尚未支持中文，所以会显示乱码，没关系，留意下方的三个按钮，第二个按钮就是“下一步”的按钮，直接一路 next 就可以了。安装好之后有一个复选框，那个是点击这个第二个按钮完成之后立刻运行的，勾不勾都可以，不勾的话就需要从桌面生成的“Visual C++ 6.0”这个快捷方式手动运行。</li><li>把这个 <code>MSVCP60.DLL</code> 复制到 <code>C:\WINNT\System32</code> 目录，可以 Ctrl-C 然后到前述那个目录 Ctrl-V，也可以直接用工具栏的“复制到文件夹”那个按钮然后定位到前述那个目录然后点击确定。</li><li>如果刚才安装进度走完之后没有勾选那个复选框，那么就从桌面再双击一次“Visual C++ 6.0”这个快捷方式，如果勾选了的话，此时应该是自动打开了 VC6 运行环境的。这样就完成了再 Copy v86 这个网页虚拟机的 VC6 简易开发环境的配置。</li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      有些学校或者老师仍然在要求学生必须使用 VC6 来学习 C 语言基础。但是现在的 Win11 已经逐渐开始停止支持 VC6 这个上古时期的 IDE 的运行。 有的时候不是要建议学生换用现代的 IDE 来学习，而是学校或者老师要求学生必须使用 VC6 这个上古时期的 IDE 来学习，学生是被迫、不得不使用 VC6 的。这里探讨一下可否用 Copy v86 在线网页虚拟机运行 VC6 学习 C 语言，这样就不用安装虚拟机软件还要往虚拟机里面安装操作系统这么麻烦了。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：利用 AI 大模型将 DNF 角色截图转换成手办图（推荐模型 Gemini 2.5 Flash Image）</title>
    <link href="https://no5972.moe/cms/archivers/172.html"/>
    <id>https://no5972.moe/cms/archivers/172.html</id>
    <published>2025-08-31T07:00:00.000Z</published>
    <updated>2025-10-14T07:40:41.978Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><img src="https://images.weserv.nl?url=https://picx.zhimg.com/v2-be7a1f53f867b90814811787e380d5b4_r.png" alt="" /></p><p><img src="https://images.weserv.nl?url=https://picx.zhimg.com/v2-4a02f49f23dab43b8481b81e37365a44_r.png" alt="" /></p><h1 id="更新一个使用-openrouter-调用这个模型的办法"><a class="markdownIt-Anchor" href="#更新一个使用-openrouter-调用这个模型的办法"></a> 更新一个使用 OpenRouter 调用这个模型的办法</h1><p>这个方法需要一点 $，大概一张图 $0.04。在这个网站注册一个账号，可以使用邮箱，也可以使用 GitHub 等平台第三方登录。然后进入右上角头像，Credits，点击 Add Credits，然后在面板的下方点击开启 Use one-time payment methods，里面有国内常用的两大平台的之父方式，5 刀起充。</p><p>准备好额度之后，点击右上角 Chat，再点击左上方 Add Model，然后搜索 flash image，选择 Google: Gemini 2.5 Flash Image Preview (Nano Banana)，然后下方聊天输入框点击上面的 Image 开启生成图片的模式。然后上传要使用的图片，把本文下面原来放上去的那个提示词输入，并根据实际情况调整。最后点击右下方紫色的按钮提交，稍等片刻就得到生成的图片了。</p><h1 id="原来的-lmarena-的方法"><a class="markdownIt-Anchor" href="#原来的-lmarena-的方法"></a> 原来的 LMArena 的方法</h1><p>访问 <a href="https://lmarena.ai" target="_blank" rel="noopener">https://lmarena.ai</a> ，选 Battle 模式，点击开启 Image</p><p><strong>（更新：现在可以直接选择 Direct Chat 模式了，把上面的 Battle 改成 Direct Chat，然后点击下边图像按钮开启生成图片的模式，然后模型选择 Google Gemini 2.5 Flash Image Preview (Nano Banana)。那个 nano-banana 其实就是这个，这个现在已经可以直接在 Direct Chat 模式里面调用了。（还得是你谷歌老大哥在行））</strong></p><p><img src="https://images.weserv.nl?url=https://pic1.zhimg.com/v2-6798c021a5ab17d573a135a035dfc27c_r.png" alt="" /></p><p>上传 1:1 比例的角色截图，输入该提示并提交</p><blockquote><p>Realistic PVC figure based on the game screenshot character,<br />exact pose replication<br />highly detailed textures<br />PVC material with subtle sheen and smooth paint finish,<br />placed on an indoor wooden computer desk (with subtle desk items like a figure box/mouse),<br />illuminated by soft indoor light (mix of desk lamp and natural window light) for realistic shadows and highlights,<br />macro photography style, high resolution, sharp focus on the figure, shallow depth of field (desk background slightly blurred but visible),<br />no stylization, true-to-reference color and design, 1:1 scale.</p></blockquote><p>（提示词来源网络）</p><p>如果你的英语好的话，也可以在提示词后面空一行，然后添加服饰方面的提示（空一行主要是方便你自己后续修改、维护这个提示词），这样可以得到更准确、细节更丰富的效果。</p><p>例如鄙人这里示例使用的战灵天舞天空套花仙子的形象可以这样写：</p><blockquote><p>the girl is a young fairy in white stockings and green sandals with pink rose inlay. the skirt is made of pink rose petals.</p></blockquote><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      现在可以直接选择 Direct Chat 模式了，把上面的 Battle 改成 Direct Chat，然后点击下边图像按钮开启生成图片的模式，然后模型选择 Google Gemini 2.5 Flash Image Preview (Nano Banana)。那个 nano-banana 其实就是这个，这个现在已经可以直接在 Direct Chat 模式里面调用了。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：其他盘的页面文件突然不见了怎么办</title>
    <link href="https://no5972.moe/cms/archivers/171.html"/>
    <id>https://no5972.moe/cms/archivers/171.html</id>
    <published>2025-06-05T14:00:00.000Z</published>
    <updated>2025-09-04T08:57:05.247Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>DNF 玩家如果电脑只有 16GB 内存的话，通常需要手动设置页面文件，才能保证游戏稳定运行。而 C 盘的页面文件一般不会掉，但是有时候会出现其他盘的页面文件莫名其妙消失的情况，而此时去高级系统设置查看，发现页面文件却还是之前设置好的。两个地方显示的情况是不一样的。这种情况可以手动重新创建一个页面文件，看看能不能恢复。</p><p>打开开始菜单或者系统搜索框，输入高级系统设置，打开高级系统设置，高级选项卡，在“性能”那一栏点击设置，高级选项卡，点击更改，<strong>选择丢失页面文件的那个盘，记下这个设置参数，然后改成无分页文件，点击设置。</strong> 一路确认，然后按照提示重启一遍电脑。</p><p>重启之后再打开高级系统设置，高级选项卡，在“性能”那一栏点击设置，高级选项卡，点击更改，<strong>还选择丢失页面文件的那个盘，改回之前的页面文件设置，如自定义大小等。点击设置。</strong> 一路确认，然后再看看那个盘页面文件是不是回来了，再从任务管理器里面看看虚拟内存是不是恢复正常了。</p><p><img src="https://images.weserv.nl?url=https://img2024.cnblogs.com/blog/2259503/202506/2259503-20250605222359443-2139334993.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      DNF 玩家如果电脑只有 16GB 内存的话，通常需要手动设置页面文件，才能保证游戏稳定运行。而 C 盘的页面文件一般不会掉，但是有时候会出现其他盘的页面文件莫名其妙消失的情况，而此时去高级系统设置查看，发现页面文件却还是之前设置好的。两个地方显示的情况是不一样的。这种情况可以手动重新创建一个页面文件，看看能不能恢复。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>实用为先! 图说Photoshop 6.0轻松入门四步走</title>
    <link href="https://no5972.moe/cms/archivers/170.html"/>
    <id>https://no5972.moe/cms/archivers/170.html</id>
    <published>2025-05-07T03:00:00.000Z</published>
    <updated>2025-05-27T08:53:30.762Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.imagecode.net/service/dnb10year/?id=20359&amp;salt=560d93a330f2451c792115f552b4758b" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%94%B5%E8%84%91%E6%8A%A5-brightgreen" alt="电脑报" /></a></p><h1 id="第一步界面和工具"><a class="markdownIt-Anchor" href="#第一步界面和工具"></a> 第一步：界面和工具</h1><p>栏目软件世界<br />作者张德海<br />发布2001年37期</p><p>BoBo：人的心情时好时坏，最近BoBo 的情绪不大好，因为学Photoshop6.0好长一段时间了，感觉怎么也进不了门，每次看到燕子JJ(以前每期&ldquo;图形图像常见问题解答&rdquo;栏目中的Photoshop特邀专家，就是她了。)在Photoshop中如&ldquo;行云流水般&rdquo;自如，真是羡慕啊。要知道如今不会Photoshop还谈何设计呢？不会它，在设计界还有得混的吗？55555&hellip;&hellip;我好烦！我好烦&hellip;&hellip;<br />　　燕子：BoBo你烦什么？不就是学不进Photoshop嘛。肯定是你方法不对了。看你每天那么痛苦的样子，以后我就帮助你吧，每周教你一点，包你学习既轻松又少走弯路。不过在你学习开始前要申明一点：任何软件都是用来干实事的，一切都要从实用开始知道吗<br />　　BoBo:YES！太好了(嘻嘻！苦思无门，机会终于来了！神仙保佑，千万别错过这次机会呀)。世界真是美丽，空气真是清新&hellip;&hellip;<br />　　本期类容提要：<br />　　☆一、Photoshop6.0界面熟悉。<br />　　☆☆二、工具面板介绍：重点列举Photoshop6.0的新工具。<br />　　☆☆☆三、工具运用技巧实例：这部分是本期的中心所在，&mdash;&mdash;&ldquo;工具是死的，人是活的&rdquo;，用活工具方可入门，记住一切都在一个&ldquo;活&rdquo;字。<br />　　(注：☆表示在本文章中的重点程度，★表示本节在整个Photoshop中的重要程度，最高为5颗星。)。</p><h2 id="一-界面熟悉"><a class="markdownIt-Anchor" href="#一-界面熟悉"></a> 一、界面熟悉</h2><p><br />　　燕子：Photoshop6.0的界面和以前的版本比较改变较大。更人性化、更便捷了。在右图中我们主要列出了4部分(不包括工作区)。在实际运用中主要是要熟练掌握这4部分。在这4部分的学习要分重点，有技巧地学才会很轻松。不然数不尽的命令菜单和控制面板会令你头晕目眩，找不着边际。这正是初学者对Photoshop畏难的最大原因。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608473-653930419.jpg" alt="IMG_256" /><br />)<br />　　BoBo：你说得太对了，我学其它软件的时候也不是那么笨呀，可在Photoshop那么多的面板中转呀，转呀，一会儿头就晕了。</p><h2 id="二-工具面板介绍"><a class="markdownIt-Anchor" href="#二-工具面板介绍"></a> 二、工具面板介绍</h2><p>　　<br />　　燕子：工欲擅其事，必先利其器。工具箱这部分是Photoshop当中使用率最高的部分，可知道它的重要性了吧？在左图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-547673274.jpg" alt="IMG_257" /><br />)中，从上到下我们可以把它分成ABCDE5部分，A为工具区(后面将作介绍)、B为色彩设定(点取此处可直接选取颜色)、C为正常/遮罩模式(显示两种模式，遮罩模式可以做出特殊效果，在后面的章节将作介绍)、D为窗口显示模式(几种图片视窗的显示模式)、E为跳至Image Ready(点击此处直接可以跳至Image Ready软件)。在&ldquo;工具区&rdquo;部分可以看到它分为&ldquo;选取及编辑类工具&rdquo;、&ldquo;绘图及修复工具&rdquo;、&ldquo;路径及放缩工具&rdquo;3大类。有的工具右下角有个小的倒三角形，将鼠标点击此处，就可以弹出下拉工具组，如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608109-633536874.jpg" alt="IMG_258" /><br />)。之所以分成这3类是为了便于我们理解。其中第一部分&ldquo;选取及编辑类工具&rdquo;是使用率最高的。比如说，我们要想对图片的某一区域进行改变，首先我们得用选取工具对其进行选取，然后才能用移动工具(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608352-1121729533.jpg" style="display:inline; margin: 0;" alt="IMG_259" />)移动它，或做其他效果处理。好，下面&hellip;&hellip;<br />　　BoBo：哎呀，你太啰嗦了吧？对工具介绍的书一大堆，哪儿都是，我下去查查不就行了吗？讲讲6.0新增的工具就行了。</p><h3 id="photoshop60新增工具"><a class="markdownIt-Anchor" href="#photoshop60新增工具"></a> Photoshop6.0新增工具</h3><p><br />　　燕子：好，那我也就不多浪费时间了，不过这部分可不要偷懒哟，没看到有4颗星吗？想学好Photoshop该知道怎么做了吧？<br />　　在Photoshop6.0中新增的工具主要有以下一些：<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114607979-1017877943.jpg" style="display:inline; margin: 0;" alt="IMG_260" />)切割(Slice)工具：专门用于网页图像的切割。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608353-1405390297.jpg" style="display:inline; margin: 0;" alt="IMG_261" />)切割选取(Slice Select)工具：将图像切割后，选取切割的部分。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114607987-2008460544.jpg" style="display:inline; margin: 0;" alt="IMG_262" />)历史记录笔刷(History Brush)工具：搭配History(历史记录)控制面板的多重恢复功能，可以神奇地将局部的图像恢复到数个状态以前。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-341779596.jpg" style="display:inline; margin: 0;" alt="IMG_263" />)艺术历史记录(Art History Brush)工具：与History Brush工具用法相同，同样必须搭配History(历史记录)控制面板使用，不过它能够提供特殊的笔触以创造全新的图像风格。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-585288872.jpg" style="display:inline; margin: 0;" alt="IMG_264" />)直线(Line)工具：拖拉直线工具可画出直线的向量物件。单击直线工具在里面还有很多，如(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608393-190018397.jpg" style="display:inline; margin: 0;" alt="IMG_265" />)矩形、(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114607992-11343984.jpg" style="display:inline; margin: 0;" alt="IMG_266" />)圆角、(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608352-283079173.jpg" style="display:inline; margin: 0;" alt="IMG_267" />)椭圆、(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608314-1472251041.jpg" style="display:inline; margin: 0;" alt="IMG_268" />)多边形及(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-903554200.jpg" style="display:inline; margin: 0;" alt="IMG_269" />)自定形状等矢量工具，这是Photoshop6.0新增工具中最令人兴奋的了，它使设计者工作更加方便并大大提高了工作效率<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-1022383025.jpg" style="display:inline; margin: 0;" alt="IMG_270" />)备注(Notes)工具：用来给图像加入文字注解。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608333-1475486318.jpg" style="display:inline; margin: 0;" alt="IMG_271" />)声音注解(Audio Annotation)工具：用来给图像加入声音注解，不过必须搭配麦克风使用。<br />　　(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608152-1149670.jpg" style="display:inline; margin: 0;" alt="IMG_272" />)测量(Measure)工具：利用此工具并在图像上拖拉起点和终点，可以测量物体的大小、距离与角度。<br />　　BoBo：这些工具都很有意思，下来后我还得找书查查，仔细研究研究。</p><h2 id="三-活用工具"><a class="markdownIt-Anchor" href="#三-活用工具"></a> 三、活用工具</h2><p><br />　　燕子：工具是死的，人是活的，对这部分的学习，主要掌握工具与工具之间的配合灵巧使用。下面我们就来看看一个很有趣的实例。<br />　　1 点&ldquo;File&rarr;New&rdquo;新建一个页面，对弹出的参数面板进行设置，如下图。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114607997-2018099504.jpg" alt="IMG_273" /><br />)<br />　　2 选取工具箱中的渐变工具(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608353-1686480348.jpg" style="display:inline; margin: 0;" alt="IMG_274" />)，在&ldquo;选项控制栏&rdquo;中双击渐变条(下图画椭圆的部分) 在弹出的控制面板中选下图画圆圈的渐变效果。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608412-1961918010.jpg" alt="IMG_275" /><br />)<br />　　3 将光标移到右上图起点处，拖动鼠标至终点位置，结果如右下图所示。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-24907912.jpg" alt="IMG_276" /><br />)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608123-1905309426.jpg" alt="IMG_277" /><br />)<br />　　4 在图层面板中(如没有点菜单栏中的&ldquo;Window&rarr;Show Layers&rdquo;调出图层)新建一层(点击图层面板中的新建按钮，右图中画圈的部分)。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608116-972199793.jpg" alt="IMG_278" /><br />)<br />　　5 将调色板的前景色设置为黑色，然后点取&ldquo;工具箱&rdquo;中的&ldquo;油漆桶&rdquo;工具(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608333-2109392788.jpg" style="display:inline; margin: 0;" alt="IMG_274" alt="IMG_279" />)。确定当前层是新建层，然后用&ldquo;油漆桶&rdquo;工具在工作区单击，如图所示。这一步执行后Layer1被黑色覆盖整个画面。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-1576171315.jpg" alt="IMG_280" /><br />)<br />　　6 选取工具面板上的橡皮擦工具。然后在&ldquo;选项控制栏&rdquo;中，点笔刷属性的倒三角形，展开笔刷下拉选项，选择一个比较小的笔刷。下面我们将用笔刷擦出我们想要的图案。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608198-1773041838.jpg" alt="IMG_281" /><br />)<br />　　7 回到工作区，使用橡皮擦工具拖动鼠标画出你想画的图案(任意的，见左图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608313-803778900.jpg" alt="IMG_282" /><br />))，在你拖动的地方就会出现下一层的七彩颜色，因为你将Layer1的黑色擦掉了。怎么样？好看吧？(注：黑白图片体现不出彩色的效果，请一定要实验)<br />　　BoBo：哇！真神奇，没想到&ldquo;橡皮擦&rdquo;还有这样用的呀！<br />　　燕子：是呀，不过这不完全是&ldquo;橡皮擦&rdquo;的作用哟，是几个工具配合的结果。其实，工具之间合理的配合使用会做出非常漂亮的作品出来。<br />　　编后：今天主要是学Photoshop&ldquo;工具箱&rdquo;这部分，这里我们讲得比较简略，重在方法上的引导。为督促大家的学习，我们将进行好作品征集，从中选出优秀的作品登在《电脑报》上，以让更多的读者学习。给予大家交流的机会，而且更重要的是还有特别大奖等着你哟！赶快参与吧！<br />　　作品的要求：<br />　　只能用&ldquo;工具箱&rdquo;中的工具；作品要注明用了哪些工具。作品要有思想，主题明确。文件大小不超过300K。E-mail:xiangbo@cpcw.com，平信请寄：重庆市人民路236号电脑报编辑部图形图像栏目收就可以了。邮编：400015。</p><h1 id="第二步选项控制栏"><a class="markdownIt-Anchor" href="#第二步选项控制栏"></a> 第二步：选项控制栏</h1><p>栏目软件世界<br />作者燕子<br />发布2001年38期</p><p>BoBo：燕子JJ，我看你在用&ldquo;油漆桶&rdquo;工具的时候，怎么填出的是图案，我怎么试也是前景色的颜色呀？<br />　　燕子：很好，你提的这个问题很典型。在上一期(37期)我们主要讲了&ldquo;工具面板&rdquo;的单一使用。通过今天的学习，你就会知道刚才问题的原因所在了。今天我们就来看与Photoshop中的工具最具直接关系的&ldquo;选项控制栏&rdquo;。要想运用好Photoshop中的工具，这部分是其精华部分哟。好，我们快点进入正题吧。<br />　　本期内容提要：<br />　　☆一、认识&ldquo;选项控制栏&rdquo;<br />　　☆☆☆二、深入了解&ldquo;选项控制栏&rdquo;：在这里你会有许多惊喜的发现，许多工作在这里都可以变得很简捷。<br />　　☆☆三、实例操作：结合Photoshop 6.0新增工具中最有代表的&ldquo;几何绘图工具&rdquo;，看看其&ldquo;选项控制栏&rdquo;中的秘密。<br />　　　第二步：&ldquo;选项控制栏&rdquo;大揭秘</p><h2 id="一-认识选项控制栏"><a class="markdownIt-Anchor" href="#一-认识选项控制栏"></a> 一、认识“选项控制栏”</h2><p><br />　　BoBo：&ldquo;大揭秘&rdquo;！太夸张了吧？不就是一些参数设置吗？<br />　　燕子：呵呵，这里面可不只是简单的参数设置哟，这里面的好东东可多了，技巧也很多。<br />　　&ldquo;选项控制栏&rdquo;位于&ldquo;菜单栏&rdquo;的下面，它是在Photoshop 6.0版本中改变最显著的地方之一，它是以前版本的&ldquo;选项控制面板&rdquo;与&ldquo;笔刷控制面板&rdquo;的总和。它的外观和参数设置随着工具的不同而改变(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-1209921842.jpg" alt="IMG_256" /><br />)。它们用于工具属性和一些参数的设置，都是扩展工具的应用范围和功能。<br />　　BoBo：对这部分很简单，我基本上都能看懂。不就是一些简单参数设置。<br />　　燕子：对，单纯地从面板上文字对照的理解来说，这部分是比较的简单，但我还是得提醒你，初学者常忽略这里面最有利的资源。比如图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-827682168.jpg" alt="IMG_257" /><br />)，我们选用的是工具箱中的&ldquo;渐变工具&rdquo;，在它的&ldquo;选项控制栏&rdquo;中除了上面一些渐变类别设置和常规模式及一些其他参数设置外，我们还应该知道在每种不同渐变的下拉菜单中又有很多的样式渐变效果，在下拉菜单的右上角，点击倒三角形，又有很多菜单(注意画圈的部分)，例如菜单中的&ldquo;Load Gradients&rdquo;(载入渐变)，里面又有很多现成的渐变效果。其它很多工具也一样。<br />　　BoBo: 哦，有点意思。你能再讲细一点吗？<br />　　燕子：好的，下面我们以Photoshop 6.0最具有代表性的&ldquo;几何绘图工具&rdquo;为例，看看它的&ldquo;选项控制栏&rdquo;的具体运用。</p><h2 id="二-深入了解"><a class="markdownIt-Anchor" href="#二-深入了解"></a> 二、深入了解</h2><p><br />　　Photoshop中&ldquo;几何绘图工具&rdquo;的增加，弥补了它在矢量作图上的不足。尤其是在网页制作上大大方便了设计者的绘图工作。它的基本情况如图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608472-1593148516.jpg" alt="IMG_258" /><br />)所示。从图中我看到我们将&ldquo;几何绘图工具&rdquo; 的&ldquo;选项控制栏&rdquo;分成了三部分，其中第一部分的&ldquo;三种用途模式&rdquo;比较难掌握，后面的两部分很好理解，就不多讲了。我们现在就来先看看&ldquo;三种用途模式&rdquo;是怎么一回事吧<br />　　&ldquo;三种用途模式&rdquo;分别是(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608081-1535202343.jpg" alt="IMG_259" />)&ldquo;型板图层&rdquo;、(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608128-1702514448.jpg" style="display:inline; margin: 0;" alt="IMG_274" alt="IMG_260" />)&ldquo;路径与图层路径遮罩&rdquo;、(<img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608333-625809821.jpg" style="display:inline; margin: 0;" alt="IMG_274" alt="IMG_261" />)&ldquo;填色区域&rdquo;。图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-889183608.jpg" style="display:inline; margin: 0;" alt="IMG_274" alt="IMG_262" /><br />)、图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608432-1584156516.jpg" alt="IMG_263" /><br />)、图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-12265513.jpg" alt="IMG_264" /><br />)是对它们三种用途的比较。<br />　　BoBo：对这部分我理解有点困难了，你用实例再说具体些吧！<br />　　燕子：好的，那我们就以这部分的&ldquo;型板图层&rdquo;再结合其他两部分(几何工具的几种样式和它的一些常规参数设置)为例，来看看它具体的运用吧。</p><h2 id="三-实例操作"><a class="markdownIt-Anchor" href="#三-实例操作"></a> 三、实例操作</h2><p><br />　　1.点&ldquo;File&rarr;New&rdquo;(快捷键&ldquo;Ctrl+N&rdquo;)新建一个页面。接着按照图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608472-978768162.jpg" alt="IMG_265" /><br />)画圈的步骤先选择工具箱中的&ldquo;几何绘图工具&rdquo;；在属性面板中选&ldquo; 型板图层&rdquo;；在几种样式中选&ldquo;自定形状矢量工具&rdquo;，展开它的下拉菜单，在下拉菜单中，点击右上角的倒三角形，再点&ldquo;Load Shapes&rdquo;(载入样式)，在弹出的对话框中选&ldquo;Load Custom&rdquo;，然后点&ldquo;Load&rdquo;(载入)，在弹出的对话框中调出菜单中的&ldquo;Custom Shapes&rdquo;选项。<br />　　OK，现在我们可以看到&ldquo;自定形状矢量工具&rdquo;，它的下拉菜单中有很多形状的样式图案。我们任选一种图案。<br />　　2.在&ldquo;Layer Style&rdquo;(层样式)的下拉菜单中同样可以调出很多现有的样式效果，如图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608452-1525176461.jpg" alt="IMG_266" /><br />)所示。这里有很多样式供我们选择。<br />　　3.我们选择图8中的一个样式效果，回到工作区，现在我们就可以直接在画布中，拖画出很漂亮的图案效果出来，如果不满意还可以继续换其它效果(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608333-865176182.jpg" alt="IMG_267" /><br />)。怎么样？效果很棒吧！<br />　　BoBo：啊！效果真的很漂亮，Photoshop真是&ldquo;博大精深&rdquo;啊！<br />　　燕子：是呀，不然它怎么是图像处理的&ldquo;天王巨星&rdquo;呢。还有在&ldquo;Layer Style&rdquo;(层样式)的右边的Mode(模式)的下拉菜单中还可做出很多令你惊讶的模式效果。限于篇幅这就靠你去研究了，相信你能从中挖掘出更多的鲜为人知的秘密，呵呵。<br />　　编后：以上所讲的，只是其中很小的一部分，更多的还有待大家的去发现和研究。如果有好的发现，一定要来信告诉我们哟，我们一定在第一时间报道更多的Photoshop爱好者，供参考学习。在下期我们将对Photoshop 6.0的菜单部分学习。</p><h1 id="第三步菜单栏一文件-编辑-图像"><a class="markdownIt-Anchor" href="#第三步菜单栏一文件-编辑-图像"></a> 第三步：菜单栏（一）文件、编辑、图像</h1><p>栏目软件世界<br />作者燕子<br />发布2001年39期</p><p>BoBo：燕子JJ：上两次你所讲的&ldquo;工具面板&rdquo;和&ldquo;选项控制菜单&rdquo;我很快就理解了，是不是Photoshop就这么简单呀？快点告诉我今天我们将学什么呢？<br />　　燕子：很好，看来你有一些进步了，不过别急，后面的任务还非常的艰巨。今天我们将进入到Photoshop学习的第三步，对&ldquo;菜单栏&rdquo;的学习，这部分内容比较多，我们将分三次进行，可想而知它的分量了吧？<br />　　本期内容提要：<br />　　一、对File(文件)、Edit(编辑)、Imagec(图像)的学习。这部分以Imagec为重点，在以前我们介绍得很多，文中有以前文章的链接，请注意。<br />　　二、对图案制作实例的学习，主要是对这部作一个技巧指引。<br />　　燕子：如果说前面的两部分是为我们今天的学习做准备，那么恭喜你，你离成功又靠近了一步。<br />　　在Photoshop中菜栏单一共是9部分(图1)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608189-1167799249.jpg" alt="IMG_256" /><br />)，今天我们学习前面的三部分，File(文件)、Edit(编辑)和Image(图像)，下面我们先来分别的看看这三部分的内容。</p><h2 id="一-文件file菜单"><a class="markdownIt-Anchor" href="#一-文件file菜单"></a> 一、文件(File)菜单</h2><p><br />　　File(文件)菜单如图2(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608219-814550066.jpg" alt="IMG_257" /><br />)，在Photoshop 6.0中对文件的新建、打开及关闭，这部分变化不大。在存储当中变化最大的是Save For Web(存储为网页)它是指将文件另外储存为一个专门为网页场合使用的gif、jpeg或Png最佳化副本，而保持原本文件的执行状。这是6.0版本对网页作业的加强。执行(File文件&rarr;Saver for Web网页最佳化)指令，调出对话框(图3)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608432-380070502.jpg" alt="IMG_258" /><br />)。我们就可利用这个对话框完成gif、jpeg或Png最佳化存储。如果对网页设计感兴趣的话，这部分可得仔细地研究了。<br />　　在File(文件)下面的其他设置，如Reveer(恢复)、Place(置入)&hellip;&hellip;这些常规的命令可以查阅相关的参考资料。<br />　　BoBo：我最头痛的就是对这些命令一个一个的学习，学了后面的就忘了前面。对这么多的命令菜单该如何学习好呢？<br />　　燕子：对，这么多的命令菜单使我们迷茫在其中不知所措。而且对初学者而言，一开始我们只要掌握这部分的几个重要命令，如文件的页面设置，打开、关闭及存储就可以了，其它的等我们对Photoshop有一定的熟悉程度之后再来理解，就轻松多了。</p><h2 id="二-编辑edit菜单"><a class="markdownIt-Anchor" href="#二-编辑edit菜单"></a> 二、编辑(Edit)菜单</h2><p><br />　　在编辑菜单中，我们的使用率也是非常高，一些最常用的命令和其他软件一样。除了这些常规的命令外，这里多是对图形进行改变的设置。如Transform(变形)下面的Scale(缩放)、Rotate(旋转)等。这部分的技巧也非常多，在后面实例中我们会运用到的如Define Pattern(定义图案)。而Color Settings(颜色设定)及Preset Manager(预射管理程序)这些我们运用得不多，初学习者可暂时不去了解它，如果有兴趣，也可查查资料。其中这部分的最后一项指令：Preferences(自定义格式)在这里面有很多对Photoshop自身的设置，如系统的优化，控制面板的一些属性设置等。作为初学者，对这部分最好不要做过多的改动，以至于对Photoshop使用不灵。在《电脑报》23期B12版的《Photoshop常见问题解析》中对这部分有详细介绍。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608213-107487349.jpg" alt="IMG_259" /><br />)</p><h2 id="三-图像image菜单"><a class="markdownIt-Anchor" href="#三-图像image菜单"></a> 三、图像(Image)菜单</h2><p><br />　　图像菜单中的指令主要用来设定有关图像的各项属性，例如图像色彩模式，色彩调整、图像尺寸，分辨率等。由于Photoshop本来就是一个专业级的图像处理巨匠，因此对图像的调整是它的拿手好戏了。对这部分的内容《电脑报》介绍得相当的多了，要是对Photoshop没有较好的掌握，这部分是得花大力气的了。<br />　　BoBo：是吗？那我该如何掌握呢？<br />　　燕子：对图像菜单的理解主要是对Mode(模式)和Adjust(调整)这两部分的理解。在这当中涉及的术语非常多。例如在模式当中又分Bitmap(点阵模式)(以黑白两色来表现图像的模式)、Grayscale(灰度)(以256色灰阶表现图像的模式)等。要很好的理解它们要先了解一些印刷知识和色彩知识，Adjust(调整)这部分的知识《电脑报》第6、7期的B12版的《让你更靓丽&mdash;&mdash;图片处理的一般技术》有详细的介绍。这些内容我们不一定全部掌握，了解其中最主要的几个就够了。<br />　　除Mode(模式)和Adjust(调整)是这部分的重点外，下面一些指令我们也应该有一些了解，限于篇幅，这里就不多讲了。其中需要提到是，在这部分有个Rotate Canvas(旋转版面)与在Edit(编辑)菜单中的Transform(变形)下面的Rotate(画布旋转)是不同的，注意比较。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608166-471393622.jpg" alt="IMG_260" /><br />)<br />　　BoBo：对这么多命令菜单的学习实在是不轻松呀，看来还得有一个长期的过程呀。<br />　　燕子：是呀，看来你有些累吧？右面我们就来看一个实例轻松轻松吧。<br />　　1.新建一个5cm&times;5cm、300dpi、RGB模式的页面，选取工具箱中的矩形工具，按住Shift键，在页面中画一个小的正方形选区。如下图所示。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608413-1947790809.jpg" alt="IMG_261" /><br />)<br />　　2.点取工具箱中的渐变工具，在&ldquo;选项控制栏&rdquo;中选择&ldquo;锥形渐变&rdquo;，然后在选区的正中向外拉出锥形渐变效果。如下图所示。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608352-1122369280.jpg" alt="IMG_262" /><br />)<br />　　3.单击Edit(编辑)&rarr;Define Pattern(定义图案)，在弹出Pattern Name(给图案命名)对话框中输入样本的名称，例如&ldquo;000&rdquo;(右图)，然后点OK，结束。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608134-697051525.jpg" alt="IMG_263" /><br />)<br />　　4.按&ldquo;Ctrl+D&rdquo;取消选区，单击Edit(编辑)&rarr;Fill(填充)，在弹出的填充的对话框中选择&ldquo;000&rdquo;刚才的样本，如下图所示。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608225-88039478.jpg" alt="IMG_264" /><br />)<br />　　5.现在，我们看到很漂亮的几何图案就出现了，如下图。下面我们还可再变化一下。<br />　　6.单击Image(图像)&rarr;Adjust(调整)&rarr;Curves(曲线调整)，在弹出的曲线调整的对话框中，调整曲线的形式如左下图所示，然后按OK结束。最后的效果如右下图。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608413-2142755567.jpg" alt="IMG_265" /><br />)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608432-137051674.jpg" alt="IMG_266" /><br />)</p><h2 id="作品征集"><a class="markdownIt-Anchor" href="#作品征集"></a> 作品征集</h2><p><br />　　学习Photoshop 6.0系列的两期以来，小编收到了很多喜爱Photoshop朋友的学习作品和来信，小编很受感动。其中很多初学者的&ldquo;作品&rdquo;虽显得还不是很成熟，但他们都学习得很认真。从中我们选了两幅作品，由于版面的原因其他的没能选上，希望别泄气。在我们的Photoshop学习完之后，我们将有个&ldquo;Photoshop作品赏析&rdquo;，希望大家踊跃参加，提高我们的Photoshop制作水平。被评选上的读者，我们将发给丰厚的奖品。(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-2000289396.jpg" alt="IMG_267" /><br />)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608314-1835122795.jpg" alt="IMG_268" /><br />)<br />　　主题：以&ldquo;《电脑报》10岁了&rdquo;为题<br />　　投稿要求：用Photoshop软件，根据你对《电脑报》的理解，发挥你的想像，可对电脑报十周年的历程作一个回顾，也可对将来进行展望。主题明确，画面清晰、健康。图片大小不要超过300KB。</p><h1 id="第三步菜单栏二图层-选取"><a class="markdownIt-Anchor" href="#第三步菜单栏二图层-选取"></a> 第三步：菜单栏（二）图层、选取</h1><p>栏目软件世界<br />发布2001年40期</p><p>BoBo：燕子JJ，我学Photoshop有一段时间了，有时我常在想，在Photoshop中到底什么是最重要的？让我心中有个底吧。<br />　　燕子：呵呵，看来你有点急了。学习可不能偷懒呀，不过你今天算是问对了一部分，因为今天的内容的确是非常的重要。可以说它就是Photoshop的灵魂了，呵呵，夸张了吧。<br />　　本期内容提要：<br />　　一、☆☆☆☆☆ 图层(Layer)菜单：对图层概念的理解是本篇的重点。<br />　　二、☆☆☆ 选取(Seleet)菜单：除了对概念和指令的了解，还要注重运用技巧。<br />　　三、☆☆☆路牌的制作：通过实例对层理解，选取的运用。<br />　　　不懂图层，就不会Photoshop！&mdash;&mdash;菜单栏的学习(中)：★★★★★<br />　　燕子：在今天的学习前，首先我要祝贺你，你已经学习到Photoshop最重要的部分了，今天的内容很重要，所以这次我们重点学习，Layer(图层)和Selecet(选取)菜单两部分。前面说今天的内容是Photoshop的灵魂，那是有道理的，还有句行业内的话这么说，&ldquo;如果不懂图层就等于没有学过Photoshop！&rdquo;可知道它的重要性了吧。对初学者而言，今天重点是对&ldquo;层&rdquo;和&ldquo;选取&rdquo;概念的理解，理解了它的概念，当中的内容学习就轻松了。在&ldquo;选取菜单&rdquo;这部分主要是它的技巧非常多，注重技巧的学习。</p><h2 id="图层layer菜单"><a class="markdownIt-Anchor" href="#图层layer菜单"></a> 图层(Layer)菜单</h2><p><br />　　燕子：Photoshop之所以一直这样高高地处于图像处理老大的位置，除了它强大的图像处理能力外，图层也是它最大的魅力所在！对图层的理解我们先来看看右图的图示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-810835658.jpg" alt="IMG_256" /><br />)。在图示中我们看得很清楚，在Photoshop当中的图片效果是由一层一层合起来的。我们可以将每个图层想象成一层非常薄的透明的薄膜。我们作图就是一层一层透明膜上作用叠加起来的。这样的好处可以用&ldquo;完美之极&rdquo;来形容。它将用户的操作置于不同的图层内，如果出现不满意的地方，那么我们只需要对当前层进行修改就行了，而其他图层都不会受到影响。<br />　　对图层的含义理解了，对它的菜单指令，是不难理解的，层菜单的内容如下图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608412-807512849.jpg" alt="IMG_257" /><br />)，对这部分的学习我们不要钻到里面就去了出不来。自从Photoshop 3.0引进图层的观念后，它就迅速的强大起来。经历了4.0、5.0&hellip;&hellip;到现在的6.0。一路的锤炼与提升，使它原本从配角的位置成为今天的主要骨干角色，一些Photoshop传统的图像处理功能，像Selection(选取范围)、Alpha Channe(通道)、Path(路径)等所担当的工作慢慢地被它越来越强大的功能所代替。在Photoshop升级到6.0后，图层菜单更加丰富多彩，有时就连老鸟也时时被它弄糊涂。限于篇幅，在这里我们只能给你讲明它的概念了。对它的详细的操作可查阅相关的资料。<br />　　BoBo：哦，我明白了，对它的掌握必须对它有足够的认识和了解，下来后我一定要对它进行一次详细的剖析。</p><h2 id="选取select菜单"><a class="markdownIt-Anchor" href="#选取select菜单"></a> 选取(Select)菜单</h2><p><br />　　燕子：当我们要对图像的某一部分做变化时，那么首先我们必须在要处理的部分做一个记号，代表唯有在记号内的图像才能被处理。这里所谓的记号，就是我们的所说的选取范围(Selection)。对选取这部分(左图)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608313-917064416.jpg" alt="IMG_258" /><br />)，发展到现在的6.0版本，已经是很完美了，和以前的变化不大。在早期的Photoshop当中选取，负担了绝大多数的图像处理任务，随着图层功能的强大，取代了很多以前不胜任的工作，所以有关它的学习比较轻松，重要的是使用中的技巧。例如很多人对选取只限制于在多工具箱中选取几个工具进行简单的使用，除此之外我们还可配合键盘和菜单，将几种选取相互进行配和使用。还有在选取菜单下面的Modify(改变)下的展开指令中，有Border(选取边框)、Smooth(圆滑选取)、Expand(扩展选取)、Contract(收缩选取)几种扩展选项，了解它们的用处，我们的工作会得心应手。<br />　　BoBo：你说图层有那么大的功能，选取又有技巧，能举一实例说明吗？<br />　　燕子：噢！看来你还真会考人，对图层这么庞大的功能，选取的技巧也非常多，我们的例子只能看到它们作用很小的一方面了，好吧看看下面的实例吧。</p><h2 id="标牌的制作"><a class="markdownIt-Anchor" href="#标牌的制作"></a> 标牌的制作</h2><p><br />　　1.新建一个5cm&times;5cm、300dpi、RGB模式的页面，按&ldquo;Ctrl+Alt+'&rdquo;快捷键显示出参考线，选取工具箱中的圆形工具，按住Shift键，在页面中画一个正圆选区。如右图所示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608452-619334651.jpg" alt="IMG_259" /><br />)。<br />　　2.按住Alt键，将光标移到起点处拖动鼠标到终点的位置。拉出一个圆形选区，以减去与原来选取框重叠的范围。如右图所示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608412-1181526792.jpg" alt="IMG_260" /><br />)，一次不行可多重复几次。(如果这种方法比较难掌握，也可以在第一步的基础上用另外一种比较简单的办法，点&ldquo;Select选取&rarr;Modify改变&rarr;Border选取边框&rdquo;，在弹出的对话框中设置为&ldquo;20&rdquo;然后点OK结束。<br />　　3.单击&ldquo;Layer图层&rarr;New新建&rarr;Layer图层&rdquo;，在弹出的对话框中将Name(名称)栏输入&ldquo;边框&rdquo;，其他设置不变，然后点OK结束。然后将工具面板中的前景色选红色，用油漆桶工具将刚才的选区填上红色。注意这一层红色是填在新建的&ldquo;边框&rdquo;图层上的，如右图所示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-472296869.jpg" alt="IMG_261" /><br />)。<br />　　4.将前景色设为黑色，选择&ldquo;文字工具&rdquo;在面板中输入&ldquo;停&rdquo;字，这时图层面板上自动增加一层文字的图层，如右图所示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608452-1910455131.jpg" alt="IMG_262" /><br />)。<br />　　5.单击&ldquo;Layer(图层)&rarr;New(新建)&rarr;Layer(图层)&rdquo;，在弹出的对话框中将Name(名称)栏输入&ldquo;禁止红线&rdquo;，而其他设置不变，然后点OK结束。然后点取工具箱中的矩形选取工具，画一个与红色边框一样宽的长条选区，如右图所示(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608453-395537830.jpg" alt="IMG_263" /><br />)。<br />　　6.将前景色设为和红色边框一样的红色，按&ldquo;Ctrl+T&rdquo;把鼠标放在控制框外，再将红色条旋转45度，点取工具箱中的移动工具，将红色条移到红色边框正中，把红色边框外边的多余的部分去掉。再按&ldquo;Ctrl+Alt+'&rdquo;去掉参考线。结果如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608023-1911112100.jpg" alt="IMG_264" /><br />)。<br />　　BoBo：看明白了，这个实例说明了图层和选取在这幅图中的作用。是挺方便的。<br />　　燕子：这只是一个简单的说明，它们的运用远远不止这么简单，你下去可要去试试，等你熟练地掌握了它们的时候，你会发现它们设计得太完美了。一般而言，只要计算机的内存足够大，那么创建图层的数量是不受限制的。好了，今天就讲到这里吧，下期我们将进入到你最心动的部分&mdash;&mdash;&ldquo;Photoshop滤镜篇&rdquo;。等着下期再见吧！<br />　　特别提醒：小编收到很多读者的作品和来信，或许是对自己的成果太激动，发给小编的时候忘了写姓名和地址，请后面一定要写明姓名和联系方式。还有在来信中说了他们很多的问题和建议，小编不能一一的回复，但小编表示力争做到最好，其中有代表性的问题，我们将在今后结合实例或在问题解答栏目中回答。</p><h1 id="第三步菜单栏三滤镜-视图-帮助"><a class="markdownIt-Anchor" href="#第三步菜单栏三滤镜-视图-帮助"></a> 第三步：菜单栏（三）滤镜、视图、帮助</h1><p>栏目软件世界<br />作者燕子<br />发布2001年41期</p><p>编者按：快乐的长假结束后，小编上班打开信箱一看，几百封来信使小编感到从来没有过的幸福和富有，或许是作者太伟大、太激动，大部分作者只将自己的作品投过来了，却没有署名也没有地址。小编不得不在开篇提醒，为了不使你白白辛苦，请在今后的来稿中一定要署名和写上你的地址以方便我们联系。Photoshop 6.0系列的学习已渐近尾声了，看到这么多人喜爱它，除了Photoshop本身的魅力外，那就是我们的生活已经离不开设计，有了设计我们的生活才精彩！下面看看今天我们带来什么呢？<br />　　BoBo：燕子JJ，有没有一种方法能够使我一下子做出非常棒的效果？而不需要太多步骤对大量的命令菜单进行操作。<br />　　燕子：呵呵，想偷懒？学习要踏踏实实，光想走捷径可不好。不过，为了不让你失望，今天的学习内容可以满足你这种&ldquo;偷懒&rdquo;的想法。<br />　　　菜单栏的学习(下):<br />　　燕子：经过前面艰难的&ldquo;跋涉&rdquo;，我们终于要跨过&ldquo;菜单栏&rdquo;这最艰难的一道坎。今天我们学习Photoshop 6.0菜单栏的最后几部分。我们将重点介绍Filter(滤镜)菜单，只作简单介绍View(视图)菜单和Help(帮助)菜单。Window(窗口)菜单我们将在下期的第四步中结合控制面板作介绍。</p><h2 id="滤镜filter菜单"><a class="markdownIt-Anchor" href="#滤镜filter菜单"></a> 滤镜(Filter)菜单</h2><p><br />　　任何版本中，滤镜都是Photoshop中最吸引人的。只需一个小小的指令就可以做出炫目的效果来。不可否认，许多人都是冲着它来学Photoshop的。在Photoshop 6.0中有100多个滤镜特效指令，够你去学一阵子了。如果还觉得不够，在它的外挂滤镜中，更是百花齐放，例如出名的有MetaCreations公司的KPT系列、Alien Skin公司的Xenofex 1.0，还有它的Black Box、Eye Candy系列，等等。我们在《电脑报》31~35期介绍了很多另类滤镜，去看看吧。<br />　　Photoshop滤镜一方面给我们的创作带来神奇效果，另一方面它也会给你带来千篇一律，没有自己个性的作品。在许多人眼里，就被排斥。对这部分而言，我们不要过分依赖它的效果，适当应用在我们有创意的作品中，它就会给我的作品增添光彩。<br />　　对这部分的学习，没有好多技巧可言，需要我们一个一个地实验，然后记住它的效果。我们看看图1(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608053-1624230158.jpg" alt="IMG_256" /><br />)中，在Filter(滤镜)菜单下面的每一个指令下面，又有很多子菜单。其实这是给我们分好类了，我们首先要掌握主要的几类，然后再去了解每一类的里面又有那些效果。例如Artistic(艺术效果)滤镜功能总共有15个滤镜，每个都可以做出变化多端的美术效果。但Artistic系列的滤镜必须在RGB的色彩模式下才可发生作用。如果你的文件是CMYK模式，必须先转换为RGB的色彩模式才能生效。又例如，Blur(模糊)滤镜功能，它主要是让图像较为柔和，利用它可以制作出梦幻的渐隐效果，其功能类似摄影用的柔焦镜效果。Brush Stroke(笔触)：这里面主要是具有笔触的特殊效果，Distort(变形)：可以将图像制作出别出心裁的变形效果&hellip;&hellip;其它的我们就不一一的列举了。<br />　　另外要说的是对于第三方滤镜的安装，只要将它安装到系统Photoshop 6.0下面的Plug-Ins目录下就可以了(图2)(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608046-831500582.jpg" alt="IMG_257" /><br />)。启动后它自动增加到滤镜菜单的最下面。有的是在安装时需要注册号，有的在安装完启动时需要填入注册号。用法都相差不多。<br />　　BoBo：将它说得这么神奇，能举一个简单的例子吗？<br />　　燕子：好呀，我们就看其中Distort(变形)下面的Ripple(涟漪效果)和ZigZag(扭曲效果)吧。其他的效果你就自己去试试吧。</p><h3 id="两种水纹效果"><a class="markdownIt-Anchor" href="#两种水纹效果"></a> 两种水纹效果</h3><p><br />　　1.新建一个5cm&times;5cm、300dpi、RGB模式的页面，将工具箱中的前景色设置为蓝色。将画布填成蓝色的底，然后再将工具箱中的前景色设置为白色，点取工具箱中的毛笔工具，在&ldquo;选项控制栏&rdquo;中选取比较大的笔头，在画布上画几条白色的条纹如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608293-1010773674.jpg" alt="IMG_258" /><br />)。<br />　　2.单击Filter(滤镜)&rarr;Distort(变形)&rarr;Ripple(涟漪效果)，在弹出的对话框中设置参数如左下图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608272-1129322887.jpg" alt="IMG_259" /><br />)。然后按OK我们看到画布马上就变成了很漂亮的水纹了，如右下图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608473-119337310.jpg" alt="IMG_260" /><br />)。<br />　　3.如果在第一步执行Filter(滤镜)&rarr;Distort(变形)&rarr;ZigZag(扭曲)那又将是另外一种水波效果如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608160-1808014329.jpg" alt="IMG_261" /><br />)。<br />　　很神奇吧？在这当中还有很多神奇的效果，去试试吧。</p><h2 id="视图view菜单"><a class="markdownIt-Anchor" href="#视图view菜单"></a> 视图(View)菜单</h2><p><br />　　View(视图)菜单中的指令不会影响到处理中的图像，使用视图指令的主要目的是协助图像处理的工作顺利进行。在6.0版中，预览功能有了相当的提高，你可以分别针对图形的路径(Path)、选取范围(Selection)、网格(Grid)、参考线(Guide)、图像切割(Slices)、备注(Notes)等分别预览如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608414-574963340.jpg" alt="IMG_262" /><br />)。</p><h2 id="帮助help菜单"><a class="markdownIt-Anchor" href="#帮助help菜单"></a> 帮助(Help)菜单</h2><p><br />　　和许多软件一样，在你遇到问题的时，它里面有你想要找到的答案。此外也可以在帮助菜单下进行一些Photoshop的套装指令设置如右图(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608060-120043928.jpg" alt="IMG_263" /><br />)。<br />　　BoBo：对这两部分我只要求简单的了解就可以了。<br />　　燕子：好吧，不过还是去认真了解一下比较好。到今天菜单部分的学习基本上结束了。<br />　　菜单部分里面的内容非常多，通过三期的讲解对读者做了一个简单指引。希望除我们给出了学习的方法外，自己也应该多做总结。重点的地方我们作了特别提醒，希望能引起你的注意。下期将是我们Photoshop 6.0的最后一期，即对控制面板进行介绍。</p><h1 id="第四步浮动控制面板"><a class="markdownIt-Anchor" href="#第四步浮动控制面板"></a> 第四步：浮动控制面板</h1><p>栏目软件世界<br />作者燕子<br />发布2001年42期</p><p>BoBo：时间过得真快呀，不知不觉对Photoshop 6.0我已经学习了5期了。<br />　　燕子：是呀，今天我们就进入最后的一期学习了。可要把握好最后一道关哟！<br />　　(文章重要程度) ★★★★<br />　　燕子：在上一次我们讲Photoshop&ldquo;菜单栏&rdquo;部分时，其中的Window(窗口)菜单我们没有讲。在这一次，我们将它和&ldquo;浮动控制面板&rdquo;一起讲。<br />　　在Photoshop中的Window菜单栏(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608074-177815447.jpg" alt="IMG_256" /><br />1)主要掌管了三件事，1.浮动控制面板的显示与隐藏；2.调出各式的资料库；3.在开启多个文件时，文件之间的切换(Notes)分别预览。今天我们的任务是对Window菜单中的&ldquo;浮动控制面板&rdquo;进行了解，以及在实际工作中我们怎样运用它们。</p><h2 id="一-认识浮动控制面板"><a class="markdownIt-Anchor" href="#一-认识浮动控制面板"></a> 一、认识浮动控制面板</h2><p><br />　　菜单Window&rarr;Show&hellip;/Hide&hellip;(就是指显示或隐藏当前的控制面板)，在Photoshop 6.0版本中，由于增强了&ldquo;选项控制栏&rdquo;的功能，对工具箱中的&ldquo;工具控制面板&rdquo;全都简化到&rdquo;选项控制栏中去了。这样的改变使Photoshop 6.0&ldquo;浮动控制面板&rdquo;比以前的版本简化多了，学习它就更容易了。如果说&ldquo;选项控制栏&rdquo;主要是对&ldquo;工具箱&rdquo;功能的延伸，那么&ldquo;浮动控制面板&rdquo;就主要是对&ldquo;菜单栏&rdquo;指令的延伸。无论是&ldquo;选项控制栏&rdquo;&ldquo;还是浮动控制面板&rdquo;，它们都是便于我们的操作更加方便、快捷，熟练掌握&ldquo;浮动控制面板&rdquo; 对实际工作中有很大的作用，它是学好Photoshop的重要环节。<br />　　BoBo：这么多的&ldquo;浮动控制面板&rdquo;操作一定很复杂吧？我该怎么掌握它们呢？<br />　　燕子：我们说它重要并不表示它很复杂，除了个别的比较难外，大部分还是很好理解的。</p><h2 id="二-浮动控制面板的操作"><a class="markdownIt-Anchor" href="#二-浮动控制面板的操作"></a> 二、浮动控制面板的操作</h2><h3 id="1浮动面板之间的组合与分离"><a class="markdownIt-Anchor" href="#1浮动面板之间的组合与分离"></a> 1.浮动面板之间的组合与分离</h3><p><br />　　在我们工作的时候，有时要调出很多的浮动控制面板，使我们的工作区域变得非常的小，如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608473-1007088107.jpg" alt="IMG_257" /><br />2所示，这样操作显示不方便。其实软件设计师早就考虑到了这一点。如果你工作区的&ldquo;浮动控制面板&rdquo;太多，这时你可以将几个浮动控制面板拖到一个浮动控制面板中使它们组合在一起。操作方法如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-49839874.jpg" alt="IMG_258" /><br />3：合并后你需要哪个控制面板，只须点击相应的控制面板的名称即可进入当前控制面板。如果你要将几个合并的浮动控制面板分开，只须用鼠标点击当前控制面板的名称位置，往外拖拉就行了。<br />　　一般经常使用Photoshop的人，都是将自己经常用到的几个浮动控制面板重新组合在一起。这样用起来非常的方便。你也可以试试。</p><h3 id="2浮动控制面板的基本操作"><a class="markdownIt-Anchor" href="#2浮动控制面板的基本操作"></a> 2.浮动控制面板的基本操作</h3><p><br />　　每个浮动控制面板的功能部分大致相似。我们先看看Photoshop中最重要的浮动控制面板──Layer(层面板)。我们打开Photoshop 6.0中自带的图片(Science.psd)，然后点菜单&ldquo;Window&rarr;Show Layers&rdquo;，我们看到它的层面板上的功能部分，如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608431-1363850329.jpg" alt="IMG_259" /><br />4所示。对&ldquo;层&rdquo;的概念我们在《电脑报》40期已经作了详细的介绍。层菜单中的命令在层控制面板中大部分都可实现。平常我们对层的操作，一般是在它的&ldquo;浮动控制面板&rdquo;中进行，对&ldquo;层菜单&rdquo;的操作很少。例如层的新建、删除，只需要点层浮动控制面板下面的快捷按钮就可以了。点右上角的倒三角形，在它的下拉菜单命令和菜单栏中的层菜单的命令都相差不多，在学习的时候结合起来学，就很快明白了。<br />　　BoBo：哇！没想到一个控制面板也这么复杂呀？很难学吧？<br />　　燕子：呵呵，把你吓着了吧？层控制面板是有点复杂，但学会了图层，Photoshop就学会了一半了，对这部分可要去查查相关的资料哟，学好它得花大力气。<br />　　下面我们看看字体控制面板和段落文本排列方式控制面板，点&ldquo;Window&rarr;Show Charecter&rdquo;，&ldquo;字体控制面板&rdquo;与&ldquo;层控制面板&rdquo;相比较简单多了。字体控制面板是Photoshop 6.0新增的。在以前的版本中，Photoshop对文字的处理不是很好，在6.0中可是大大的改观了。如对段落文本的排列及排列方式，处理起来非常的方便，如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608452-544417429.jpg" alt="IMG_260" /><br />5所示。是不是有点像文字处理软件呀？这部分比较简单，基本上自己可以看明白。再看看历史控制面板(<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608393-1499530061.jpg" alt="IMG_261" /><br />6)。这个控制面板更简单了，它的作用是我们在进行误操作时，它可以帮助我们恢复到以前的步骤当中去。它有效步骤是30步，足够了吧？<br />　　BoBo：对&ldquo;浮动控制面板&rdquo;的运用能举个实例吗？<br />　　燕子：好吧，下面就跟着我来吧。</p><h2 id="霓虹灯效果"><a class="markdownIt-Anchor" href="#霓虹灯效果"></a> 霓虹灯效果</h2><p><br />　　1.新建一个5cm&times;5cm、300dpi、RGB模式的页面，将工具箱中的前景色选黑色。选用工具箱中的&ldquo;油漆桶工具&rdquo;把画布填成黑色，然后再选工具箱中的&ldquo;文字工具&rdquo;，将工具箱中的前景色选白色，在工作面板中输入&ldquo;霓虹灯&rdquo;三个字。<br />　　2.点取选取工具，单击&ldquo;Window&rarr;Show Charecter&rdquo;打开字体控制面板对字体的设置如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-1260686355.jpg" alt="IMG_262" /><br />7。<br />　　3.点&ldquo;Window&rarr;Show Layers&rdquo;打开图层控制面板，单击图层控制面板下面的&ldquo;新建&rdquo;按钮，新建一个图层。按住Ctrl键的同时。单击&ldquo;霓虹灯&rdquo;图层，则建立了一个文字选区。并将&ldquo;霓虹灯&rdquo;图层拖到原控制面板下面的垃圾桶按钮上删掉。<br />　　4.点&ldquo;Window&rarr;Show Paths&rdquo;打开路径控制面板。单击路径控制面板下面的&ldquo;把选取变为路径按钮&rdquo;，如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608372-1864671668.jpg" alt="IMG_263" /><br />8。<br />　　5.设置前景色为黄色。选择工具箱中的喷枪工具，单击其选项栏中的按钮，在弹出的画笔选项对话框中设置各项参数，如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608394-1286734494.jpg" alt="IMG_264" /><br />9。<br />　　6.单击路径控制面板下方的描绘按钮，结果如下图所示。<br />　　7.设置前景色为品红，其中R:255、G:0、B:255，设置画笔的&ldquo;直径&rdquo;为6px，再一次描绘路径，结果如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608412-204912734.jpg" alt="IMG_265" /><br />10。<br />　　8.按照前面的方法，在字的下面输入一串英文，做成霓虹灯的效果做陪衬，或者再加入其它效果，这样更完整。最后如<br /><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250507114608431-548030406.jpg" alt="IMG_266" /><br />11。</p><h1 id="结束语"><a class="markdownIt-Anchor" href="#结束语"></a> 结束语：</h1><p><br />　　这次Photoshop 6.0系列讲座到此就全部结束了。我们一共是分四部分来学习的，每一部分我们给出了学习方法，重要的地方作了提醒。还有每一次的讲解都带有一个实例。所有这些都是对Photoshop学习的指引，更多的还得靠自己查资料多努力了。<br />　　下一期我们将是许多读者这次对Photoshop学习后的作品展示，还没有投稿的朋友请赶快将你的作品投给我们哟！投稿方式及要求请见《电脑报》39期B4版。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      燕子：不就是学不进Photoshop嘛。肯定是你方法不对了。看你每天那么痛苦的样子，以后我就帮助你吧，每周教你一点，包你学习既轻松又少走弯路。不过在你学习开始前要申明一点：任何软件都是用来干实事的，一切都要从实用开始。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>关于 Win7 运行豆包桌面版提示无法定位程序输入点 / 系统版本过低，无法安装和运行的问题</title>
    <link href="https://no5972.moe/cms/archivers/169.html"/>
    <id>https://no5972.moe/cms/archivers/169.html</id>
    <published>2025-04-08T18:00:00.000Z</published>
    <updated>2026-05-06T14:14:34.331Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><!-- ![](https://images.weserv.nl?url=https://www.callmysoft.com/ueditor/php/upload/image/20250108/1736340480423184.png) --><p><img src="https://images.weserv.nl?url=https://www.callmysoft.com/ueditor/php/upload/image/20250108/1736340480423184.png" width="50%"></img></p><p>鉴于豆包安装包现已增强了系统版本检测，本文步骤可能会比较复杂，如果读者看不懂的话，鄙人建议读者找一个身边懂电脑的朋友或者贵单位的信息部门，把本文交给他们，然后让他们指导读者来操作或者直接代为操作。</p><h1 id="先上具体步骤"><a class="markdownIt-Anchor" href="#先上具体步骤"></a> 先上具体步骤：</h1><p>一、下载并安装 VxKex NEXT 这个开源组件，可以在网上搜索这个开源组件的名字（注意找到正确的下载链接）。<br />二、从一个特殊的网页下载<strong>豆包离线版安装包</strong>（即在豆包桌面版的下载引导网页的网址后面加一串参数）：<a href="https://www.doubao.com/download/desktop?ug_apk_token=dnsqL" target="_blank" rel="noopener">https://www.doubao.com/download/desktop?ug_apk_token=dnsqL</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?ug_apk_token&#x3D;dnsqL</span><br></pre></td></tr></table></figure><p>然后将 <code>.exe</code> 格式的豆包安装包使用解压缩软件（7-Zip、WinRAR 等）直接解压出来。右键这个 <code>.exe</code> 的安装包文件，选择 7-Zip - 解压文件，或者带有 WinRAR 图标的“解压文件”，或者其他解压缩软件的选项，或者解压缩到什么什么目录的选项（不要选择解压缩到当前目录），指定一个尽可能干净的目录来解压。</p><ul><li><strong>不要直接双击运行，Win7 系统是无法直接运行的，安装包本身现在添加了系统版本检测，VxKex 的“报告其他版本的 Windows”功能目前是无效的。</strong></li><li><strong>建议小白用户不要选择解压到当前目录，小心和当前目录其他文件搅到一起了，清理会很困难。请选择解压到 Doubao_installer 子目录，或者选择解压文件，然后指定一个尽可能干净的目录。</strong></li></ul><p>三、解压缩之后前往解压缩出来的目录，找到 <code>Doubao.exe</code> 这个主程序文件并右键，选择属性，VxKex NEXT 选项卡，勾选“为此程序启用 VxKex NEXT”并确定。然后看看能不能打开这个程序。最好能把这个程序创建一个桌面快捷方式（右键这个文件选择发送到 - 桌面快捷方式）。</p><p>四、如有必要，将 <code>%TEMP%\doubao_ext\</code> 、 <code>%LOCALAPPDATA%\Doubao\Application\app\</code> 目录及其子目录下所有 <code>shellext.dll</code>、 <code>shellextcore.dll</code> 删除，并想办法阻止豆包在此目录及其子目录下创建这些文件（可通过设置文件夹权限等手段），防止资源管理器崩溃等异常情况。</p><ul><li>这样设置后运行豆包桌面版可能会弹出“安装文件缺失”的提示，对于 Win7 系统而言，请无视该提示，直接点击确定，豆包仍会继续运行，此缺失文件目前尚未发现影响豆包运行的情况。 <em>此文件通常和右键文件的菜单有关，但目前尚未发现豆包有修改文件右键菜单的情况。</em></li></ul><div class="note warning"><p>如果运行程序时提示的是“Doubao.exe 不是有效的 Win32 应用程序”，而不是“无法定位程序输入点”，那么请先右键桌面上或者开始菜单里面的“计算机”，选择“属性”，看一看电脑的系统是不是 32 位的。 <strong>如果是 32 位的 Win7，这种情况就不要看上面的步骤了，请老老实实把电脑的系统重装成 Win10 64 位或 Win11（重装前注意备份好个人资料，例如桌面、文档、下载、图片等）。</strong> 豆包电脑版是一个纯 64 位的应用程序，32 位的 Win7 肯定是不支持的。</p><p><img src="https://images.weserv.nl?url=https://pic4.zhimg.com/v2-86ee662b5304cb6e491f4b4a665ccd23_r.jpg" alt="" /></p></div><p><em>不过鄙人这个图是在和 Win7 相同版本内核的 Windows Server 2008 下测试的，不过如果 Windows Server 2008 能跑通，Win7 基本也就八九不离十了，就还是按照上面的步骤设置即可打开豆包桌面版，如下若干张图所示。</em></p><p><img src="https://images.weserv.nl?url=https://picx.zhimg.com/v2-4ea31bba2bc3eef8f7b72c2b1c6fe08d_r.png" alt="" /></p><div class="group-picture"><div class="group-picture-row"><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl?url=https://pic3.zhimg.com/v2-a986a3e626c8c2e0774f8bc3e54c5c96_r.png" alt="" /></div><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl?url=https://pic1.zhimg.com/v2-59ed271749f9c3d77aff048c62ba633e_r.png" alt="" /></div></div></div><h1 id="事情是这样的"><a class="markdownIt-Anchor" href="#事情是这样的"></a> 事情是这样的：</h1><p>刚刚收到来自 <a href="https://space.bilibili.com/85914396" target="_blank" rel="noopener">@Geeker Z</a> 的最新线索，有一个开源项目 VxKex NEXT 提供了对 Win7 操作系统运行 Win10/11 应用程序的兼容支持。鄙人之前已在某个回答提到过，豆包桌面版其实就是一个 Chromium 浏览器的简单封装，而那个线索视频里面展示的正是在 Win7 下正常运行了新版的谷歌浏览器，所以理论上这个也可以用于在 Win7 里面使用豆包桌面版。</p><p>260410 更新：豆包的安装包现在新增了从系统 API 检测版本的特性，不是简单的一个“无法定位程序输入点”了，现在检测到系统版本过低的情况就会直接提示“系统版本过低：无法为您安装豆包客户端，因为当前系统版本低于客户端支持的最低系统版本”，并且现在豆包默认的下载方式改成了在线安装包，也不好直接从这个在线安装包里面提取下载链接，在线和离线安装包都有这个加强了的系统版本检测。刚才动用了一点手段找到了离线安装包的下载引导页的网址，这个网址藏的还是比较深的。从这个下载引导页进来下载就是豆包的离线安装包了。请留意本文前述的更新后的操作步骤。可能会比较复杂，如果看不懂的话，建议读者还是找一个身边懂电脑的朋友或者贵单位的信息部门，把本文交给他们，然后让他们指导大家来操作或者直接代为操作吧。</p><p>不过鄙人这边手头暂时没有 Win7 的测试环境，暂时没法试验可否用于在 Win7 运行豆包桌面版，并且也无法保证有效。</p><p><a href="https://github.com/YuZhouRen86/VxKex-Next/releases/latest" target="_blank" rel="noopener">GitHub YuZhouRen86/VxKex-Next</a></p><p><a href="https://www.bilibili.com/video/BV1SedHYsE6b/" target="_blank" rel="noopener">让 Win7 强行兼容 Win10 应用？VxKex 扩展内核安装体验_哔哩哔哩_bilibili</a></p><p>（篇头图源网络）</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      刚刚收到来自 @Geeker Z 的最新线索，有一个开源项目 VxKex NEXT 提供了对 Win7 操作系统运行 Win10/11 应用程序的兼容支持。鄙人之前已在某个回答提到过，豆包桌面版其实就是一个 Chromium 浏览器的简单封装，而那个线索视频里面展示的正是在 Win7 下正常运行了新版的谷歌浏览器，所以理论上这个也可以用于在 Win7 里面使用豆包桌面版。不过鄙人这边手头暂时没有 Win7 的测试环境，暂时没法试验可否用于在 Win7 运行豆包桌面版，并且也无法保证有效。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>C 语言 手动给 Win9x 蓝屏</title>
    <link href="https://no5972.moe/cms/archivers/168.html"/>
    <id>https://no5972.moe/cms/archivers/168.html</id>
    <published>2025-04-07T08:30:00.000Z</published>
    <updated>2026-04-03T02:28:43.104Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>刚刚在某乎的一个评论区看到<a href="https://www.zhihu.com/question/264036496/answer/277259763" target="_blank" rel="noopener">有人提出了这样的问题</a>，现有的从网上找到的代码基本上都是给 NT 内核的系统手动蓝屏的（如 Win2000、XP、7、8、10、11 等）。但是如果是 Win9x/ME 这样的系统，那就不是 NT 内核，就不能用诸如 <code>NtRaiseHardErr</code> 这样的函数来手动蓝屏，只会弹出一个“该程序执行了非法操作，将被关闭”的提示，因为 9x/ME 的 <code>ntdll.dll</code> 库文件根本就没有这个函数。</p><p>从虚拟机里面稍微研究了一下，其实可以直接用之前广为流传的 Win9x 的那个 con bug 就能实现，就是在 Win + R 的运行窗口输入 <code>con/con</code> 命令，就会直接触发蓝屏。只需要把这个 con bug 封装成一个 C 语言程序就可以了。不过 <code>system</code>  函数直接执行出来的话程序可能只会输出“Bad command or file name”就结束了，所以保险起见，前面再加一个 <code>explorer</code>，这样就可以写一个给 Win9x 系统手动蓝屏的程序了。</p><div class="note warning"><p>不过，这个 bug 在 ME 系统已经被修复，已无法使用 con 来触发蓝屏了。所以这个做法只对 Win9x 系统有效。</p></div><div class="note danger"><p><strong>注意该程序仅供试验和研究之用，请备份好相应数据再尝试，不要瞎搞！</strong></p></div><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    system(<span class="string">"explorer con/con"</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202504/2259503-20250407155426969-585222943.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202504/2259503-20250407155433796-400043220.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      刚刚在某乎的一个评论区看到有人提出了这样的问题，现有的从网上找到的代码基本上都是给 NT 内核的系统手动蓝屏的（如 Win2000、XP、7、8、10、11 等）。但是如果是 Win9x 这样的系统，那就不是 NT 内核，就不能用诸如 NtRaiseHardErr 这样的函数来手动蓝屏，只会弹出一个“该程序执行了非法操作，将被关闭”的提示，因为 9x/ME 的 ntdll.dll 库文件根本就没有这个函数。从虚拟机里面稍微研究了一下，其实可以直接用之前广为流传的 Win9x 的那个 con bug 就能实现，就是在 Win + R 的运行窗口输入 con/con 命令，就会直接触发蓝屏。只需要把这个 con bug 封装成一个 C 语言程序就可以了。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：GPT4All 本地部署 DeepSeek R1 模型，简明说明（手动下载模型）</title>
    <link href="https://no5972.moe/cms/archivers/167.html"/>
    <id>https://no5972.moe/cms/archivers/167.html</id>
    <published>2025-02-17T08:00:00.000Z</published>
    <updated>2025-09-04T08:59:27.648Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>GPT4All 内置的模型库，大部分模型是用的抱脸的网址，通常无法直连下载。 <strong>我们这里提出一个手动下载和导入 DeepSeek R1 模型的本地部署方法。本方法的关键是找到 GPT4All 默认的读取路径。</strong> 此外，GPT4All 不仅支持独显推理，也可使用 CPU 硬算。 <em>（不过听别处文章评论区说个别模型用独显是不行的，这个这边也没法证实，鄙人手头暂时没有能跑 AI 的独显；个人猜想 DeepSeek R1 应该不会存在这个问题）</em></p><ol><li><p><a href="https://www.nomic.ai/gpt4all" target="_blank" rel="noopener">下载安装 GPT4All 3.8.0 或以上的版本</a></p><ul><li>该版本开始已原生支持 DeepSeek R1 深度推理</li><li>大约需要下载 600 多 MB 的本体包<br /><img src="https://pic1.zhimg.com/v2-774c98158cf16894663f6730aa168dcc_r.png" alt="" /></li></ul></li><li><p>从<a href="https://huggingface.co/models?search=deepseek%20gguf" target="_blank" rel="noopener">抱脸</a>或<a href="https://www.modelscope.cn/search?search=deepseek%20gguf" target="_blank" rel="noopener">魔搭社区</a>下载 gguf 格式的 DeepSeek R1 模型。</p><ul><li>这边 12GB 内存 CPU 硬算可以跑 llama8B 和 Qwen7B 这两个模型。</li><li>请留意找到正确的模型<br /><img src="https://picx.zhimg.com/v2-5736c083a875fc93701225b4abcd9b2f_r.png" alt="" /></li></ul></li><li><p>将下载好的 gguf 格式的模型文件放在 <code>%LOCALAPPDATA%\nomic.ai\GPT4All</code> 目录</p><ul><li>GPT4All 在运行时将自动识别该目录下的模型文件。<br /><img src="https://picx.zhimg.com/v2-07c3fd8a95d1ad99755c19034f361ebf_r.png" alt="" /></li></ul></li><li><p>打开 GPT4All，从左侧按钮切换到模型界面，看看是否识别到了 DeepSeek</p><ul><li>首次启动时可能会弹出“匿名使用分析，以改进 GPT4All”和“匿名分享聊天到 GPT4All 数据湖”这两个选项，如果在意数据安全的话应都选择“否”。此项可在设置的“开启数据湖”中找到。<br /><img src="https://picx.zhimg.com/v2-caf462bd85d51de9365b5f2ef1d6df07_r.png" alt="" /></li></ul></li><li><p>如果识别到了，左侧切换到对话，选择下载的 DeepSeek R1 模型，等待加载完毕。然后就可以开始对话了。</p><ul><li>这边测试使用 i3-6100 CPU 硬算，大概是 2.4 令牌左右每秒。<br /><img src="https://pica.zhimg.com/v2-86f2b382014ca51e0b79429f80483008_r.png" alt="" /><br /><img src="https://picx.zhimg.com/v2-9063342ea6cd23c83d2d90499655100b_r.png" alt="" /><br /><img src="https://pic1.zhimg.com/v2-3e78cafe3c953a3003d3993733cad688_r.png" alt="" /><br /><img src="https://pica.zhimg.com/v2-957228f710cba37cf5dfe205cc7b345e_r.png" alt="" /></li></ul></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      GPT4All 内置的模型库，大部分模型是用的抱脸的网址，通常无法直连下载。 我们这里提出一个手动下载和导入 DeepSeek R1 模型的本地部署方法。本方法的关键是找到 GPT4All 默认的读取路径。 此外，GPT4All 不仅支持独显推理，也可使用 CPU 硬算。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>大学 C 语言在线 PTA 平台编译提示警告未使用 scanf 返回值的问题</title>
    <link href="https://no5972.moe/cms/archivers/166.html"/>
    <id>https://no5972.moe/cms/archivers/166.html</id>
    <published>2024-10-31T10:00:00.000Z</published>
    <updated>2026-04-03T02:30:32.388Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>最近在知乎发现有不少大学生在使用 PTA 平台在线编写 C 语言代码，编译时提示警告未使用 <code>scanf</code> 返回值的问题。具体现象是编译器输出显示为类似于这样的提示。</p><p><img src="https://pic1.zhimg.com/v2-49a840da51c32c05bad9caae7d14b102_r.png" alt="" /></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">a.c: In <span class="keyword">function</span> ‘main’:</span><br><span class="line">a.c:9:5: warning: ignoring <span class="built_in">return</span> value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]</span><br><span class="line">    9 |     scanf(<span class="string">"%d"</span>, &amp;num);</span><br><span class="line">      |     ^~~~~~~~~~~~~~~~~</span><br></pre></td></tr></table></figure><p>有不少同学认为程序有问题，要是这样认为倒也是，因为 PTA 平台默认使用的 GCC 编译器希望你重视函数返回值的问题，希望你用上 <code>scanf</code> 函数的返回值。但话又说回来，使用这个 PTA 平台编写 C 语言的大学生基本上都是初学 C 语言的，而教材上的范例程序基本上都不会用到 <code>scanf</code> 的返回值。 <em>都这样了知乎上还有人和鄙人杠说“这个返回值其实是很重要的”。 这显然是为了杠而杠了，C 语言初学阶段先把功能或者是题目需求搞定再说细节上的问题。</em></p><div class="note warning"><p><strong>不过，还是希望各位初学者重视编译器的警告，虽然这对部分英语基础不是很好的同学可能有些困难，但是根据警告完善代码，还是非常重要的，这更好地保障了应用程序的稳定性。</strong></p></div><p>这里鄙人专门注册了一个 PTA 平台的账号研究了一下，并且参考了 StackOverflow 上一些大佬的回答，汇总了几种解决这个警告的办法。</p><h1 id="一种方法切换编译器"><a class="markdownIt-Anchor" href="#一种方法切换编译器"></a> 一种方法：切换编译器</h1><p>PTA 平台其实提供了好几种 C 语言的编译器，鄙人实测了一下，只要把编译器切换到 clang，就不会警告未使用 <code>scanf</code> 返回值的问题了。</p><p>切换编译器的下拉框一般位于代码框的上方，他这里默认选择的是“C (gcc)”，我们把这个下拉框选择“C (clang)”，再尝试提交程序，这样就不会警告未使用 <code>scanf</code> 返回值的问题了。</p><p><img src="https://picx.zhimg.com/v2-2757bbebe33b3708d1f5c56ac1c32327_r.png" alt="" /></p><p><img src="https://pic4.zhimg.com/v2-a334f9676dd2ccb61300b10c5336b766_r.png" alt="" /></p><h1 id="另一种方法修改代码"><a class="markdownIt-Anchor" href="#另一种方法修改代码"></a> 另一种方法：修改代码</h1><p>参考 <a href="https://stackoverflow.com/a/7273026" target="_blank" rel="noopener">StackOverflow 上 rivy 大佬在这个回答的评论区里面提供的线索</a> ，只要把 <code>scanf</code> 语句稍微修改一下即可。比如说鄙人这个程序里面有一个</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;num);</span><br></pre></td></tr></table></figure><p>只要在 <code>scanf</code> 前面加一个 <code>(void)!</code>，就像这样</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">void</span>)!<span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;num);</span><br></pre></td></tr></table></figure><p>GCC 编译器就不会再警告未使用 <code>scanf</code> 返回值的问题了。</p><p><img src="https://pic1.zhimg.com/v2-d6091155c84a83af5eca406241e5f558_r.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最近在知乎发现有不少大学生在使用 PTA 平台在线编写 C 语言代码，编译时提示警告未使用 scanf 返回值的问题。有不少同学认为程序有问题，要是这样认为倒也是，因为 PTA 平台默认使用的 GCC 编译器希望你重视函数返回值的问题，希望你用上 scanf 函数的返回值。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：请勿在安装好的可正常使用的 Windows 系统中运行 msoobe.exe</title>
    <link href="https://no5972.moe/cms/archivers/165.html"/>
    <id>https://no5972.moe/cms/archivers/165.html</id>
    <published>2024-10-15T10:00:00.000Z</published>
    <updated>2025-01-23T09:14:26.103Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>请勿在一个安装好的、可正常使用的 Windows 系统下运行 <code>msoobe.exe</code> 程序。</p><p>这将有可能导致系统卡死在“请稍候”或者“海内存知己，天涯若比邻”的画面，相当于系统崩溃的结果。此时只能使用 CMD 盲打 <code>shutdown -r -t 0</code> 或者直接按机箱上的电源键或重启键重启。</p><p>据信运行此程序后会在系统下创建一个名为 <code>defaultuser0</code> 的账号，且无法从设置或控制面板删除。</p><p>可使用 <code>net user defaultuser0 /delete</code> 命令删除。</p><p>参考：<a href="https://www.bilibili.com/video/BV1gM411P7gc/" target="_blank" rel="noopener">安装好系统后运行OOBE程序（msoobe.exe）会怎么样？_哔哩哔哩_bilibili</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      请勿在一个安装好的、可正常使用的 Windows 系统下运行 msoobe.exe 程序。这将有可能导致系统卡死在“请稍候”或者“海内存知己，天涯若比邻”的画面，相当于系统崩溃的结果。此时只能使用 CMD 盲打 shutdown -r -t 0 或者直接按机箱上的电源键或重启键重启。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：M.2转接卡转移原机械硬盘系统盘</title>
    <link href="https://no5972.moe/cms/archivers/164.html"/>
    <id>https://no5972.moe/cms/archivers/164.html</id>
    <published>2024-09-25T02:00:00.000Z</published>
    <updated>2024-09-26T10:01:51.018Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><ol><li>这是台惠普 Prodesk 400 G4 的品牌机，主板是 H270，现需要添置一块 M.2 NVMe 的固态硬盘，但这个主板没有 M.2 插槽，故使用 PCI-E 转接卡转接。</li><li><strong>这个品牌机主板的 BIOS 可以直接识别转接卡上的固态硬盘作为启动项，但是貌似只能以传统方式引导转接卡上的 NVMe 硬盘，UEFI 方式会直接失败。</strong> 要用 UEFI 方式的话，除非用 Clover 方式安装，但这个 Clover 的过程过于复杂。</li><li>如果原机械硬盘是 Win7 的系统，DG 转移完数据之后，找一个支持 NVMe 硬盘的 Ghost Win7 系统，使用 Ghost Explorer 将 GHO 镜像里面的 <code>C:\Windows\System32\DriverStore</code> 整个目录提取出来，然后使用 Dism++ 将提取出来的目录添加驱动到新的转接卡的 NVMe 硬盘上。注意所找的 Ghost 系统位数要和原机械硬盘的系统保持一致。</li><li>如果 Win7 系统启动报错 <code>0xc000000e</code>，是因为 BCD 里面存储的启动项信息还是原来机械硬盘的 ID，不是新硬盘的 ID。这种情况一般是切换回原来的机械硬盘或者 U 盘 PE 系统，使用 Dism++ 工具修复新硬盘的引导。</li><li>如果安装 Win10 系统，注意以 MBR 方式安装，不要用 GPT 方式安装。</li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这是台惠普 Prodesk 400 G4 的品牌机，主板是 H270，现需要添置一块 M.2 NVMe 的固态硬盘，但这个主板没有 M.2 插槽，故使用 PCI-E 转接卡转接。
    
    </summary>
    
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>如何删除 WPS 在图片文件属性中添加的“属性修改”选项卡</title>
    <link href="https://no5972.moe/cms/archivers/163.html"/>
    <id>https://no5972.moe/cms/archivers/163.html</id>
    <published>2024-09-12T09:00:00.000Z</published>
    <updated>2024-09-25T02:45:24.449Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>近期发现 WPS 2023 这一个非常恼人的特性，在图片文件的属性窗口里面乱加第三方选项卡。同事的电脑安装了这个版本，就让同事从注册表试了一下。还好金山他们藏的不是很深，借助 GPT 很快也就找到了。这里再用鄙人自己的虚拟机演示一遍。</p><p><img src="https://pica.zhimg.com/v2-f912effcfb9a122224af41fba66d7c14_r.png" alt="" /></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_CLASSES_ROOT\*\shellex\PropertySheetHandlers\&#123;593F1699-1B70-4443-A2EE-39483EBA4346&#125;</span><br></pre></td></tr></table></figure><p>右键开始按钮，运行，输入 regedit 确定打开注册表编辑器，定位到上面写的这串路径。把左侧这个名为 <code>{593F1699-1B70-4443-A2EE-39483EBA4346}</code> 的目录删除。</p><p><img src="https://pica.zhimg.com/v2-0acbfc7ef105569648fe67e5e67d7398_r.png" alt="" /></p><p>此时再右键图片文件查看属性，WPS 乱加上去的“属性修改”选项卡已成功移除。</p><p><img src="https://pic3.zhimg.com/v2-2793d50f8a0ac61a65d28d9c6b8c6170_r.png" alt="" /></p><hr /><p>如果仍有“属性修改”选项卡，则右键任务栏空白处，任务管理器，左侧倒数第二个列表图标的按钮， 把 explorer.exe 这个进程结束进程，然后点击上方运行新任务，输入 explorer 确定。此时再右键图片文件查看属性，WPS 乱加上去的“属性修改”选项卡已成功移除。</p><p><img src="https://pica.zhimg.com/v2-534f3b053c7e45e3bcbf803b340699ca_r.png" alt="" /></p><p><img src="https://pic3.zhimg.com/v2-c278d74e99642d692602cbe35603d6a6_r.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      近期发现 WPS 2023 这一个非常恼人的特性，在图片文件的属性窗口里面乱加第三方选项卡。同事的电脑安装了这个版本，就让同事从注册表试了一下。还好金山他们藏的不是很深，借助 GPT 很快也就找到了。这里再用鄙人自己的虚拟机演示一遍。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>PowerShell 编程实例：将一张 PNG 的图像隐藏到另外一个 PNG 文件中，不改变原 PNG 图像</title>
    <link href="https://no5972.moe/cms/archivers/162.html"/>
    <id>https://no5972.moe/cms/archivers/162.html</id>
    <published>2024-08-23T09:00:00.000Z</published>
    <updated>2024-09-26T09:51:52.611Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>此代码的作用是，将一张 PNG 的图像隐藏到另外一个 PNG 文件中，不改变原 PNG 文件的图像的任何地方。</p><p>大致原理是，通过 PowerShell 向 PNG 文件指定位置添加任意内容，而不破坏 PNG 文件的图像。将要隐藏的 PNG 文件的内容转换为 Base64 字符串，然后将这个 Base64 字符串隐藏到宿主 PNG 文件的指定位置即可。</p><p>隐藏好的 PNG，图像和原来的 PNG 没有任何区别。但用纯文本编辑器强行打开，就能看到后半部分隐藏了另外一张图片的 Base64 内容，这部分 Base64 内容能够还原为另外一张 PNG 图片。此前一些将链接隐藏到一张图片中的“图种”也是类似的原理。</p><table><thead><tr><th>原来是这个 PNG：</th><th>要隐藏的 PNG：</th><th>隐藏好的 PNG：</th></tr></thead><tbody><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAADiCAYAAACcPi8UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAADKDSURBVHhe7Z0HfBzVtf/P7qp3yZIluWJZ7gaMIYBNMxB6eyQGwj8JIfAIkPpSSAKBJAQCPB4pkBBSHoSSQHgmkEBCqMExxHTb2NjIyJZxU7Gs3svu/u/vzJzV1Wi2qe2uNN/P52rqju6985tzzr1zZ8blV5CDQ4S4zamDQ0Q4gnGICkcwDlHhCMYhKhzBOESFIxiHqHAE4xAVjmAcosIRjENUOIJxiApHMA5R4QjGISocwThEhSMYh6hwBOMQFY5gHKLCEYxDVDiCcYgKRzAOUeEIxiEqHME4RIUjGIeocATjEBWOYByiwhGMQ1Q4gnGICkcwDlHhCMYhKhzBOESFIxiHqHAE4xAVjmAcosIRjENUOIJxiApHMA5R4QjGISocwThEhSMYh6hwBOMQFY5gHKIi4V/svP9HLpr+/aFFaLzTRQXfDl60qk1P8bSloZr6e7po8/sf0RHLyilv6mwqW3Yhb3v72bt4mpGdS25PCi1a+TleDkaw/xksj4nIxHgT+LpziE78O9ET+USrm4heX6oUUUX06U5zhwEglOYDu8nb32+uMUhKTacN735gLhEtP3IR9bS30dbt+3h51SkreQpSMnJo5uJzzSWNP2YQlZURrXh/IC+StwnChBDMc6tddOYV04jOXktU+w2ixzYRVdco05BBOza1UfnV2LafNrzw84BQpkyby8JJTc+knq4Oqq1ppJq6Rt6mU1pcQAV5GZSZm09TppeRt6eDers7lcXxkDs5h2bv+U/a8ZtqKl+WTdSpBDqtlOjSZUQlPyV6dhU990A1nfnExLAuIOEFw27gY6cQnfxrZT6eJdq6hiitgKhoKm17+H5anK1O5KEeejvje7x/yaxynvb1+1kwwYQiFE9Jp7YOJTKXh+bMKiRPchLNPWwFdbQ2KVfWQXN2XkO0xUvb2tpo8WVXEtUfIOpWx1tykbI2ZxO9cg0deP2fNPUGxyXFhOrKF3lauu4Mci1eTNWFP6NpB3/P66i/l9Z8+s900d+up7233E57soiO+72fNr58Lx2y4ChjH0V7cw3VV3/EYtEpKS3gGOaVF17m5cOWHsJTiWFeW/sWzZ5dRPn5WTS9bDGl55VSe+N+Fk71PZ+iWe1EM2+6ntaceztd9MdPKj+Xwr+vLvy8yuPXyb9tG9Wc+DyvA9PmnWbOJQ4JIRgRCSgonG7OKUPy+mnkr6kh11n3EW3/P6Kp82jj//2GjrjsZGq74xXKOtZF+455krLUiU1Kz6P+rmbate11/q2Ipagoh6eIYRCzAFgRWcZ8WkY2ZWQpS6XYuf1DnkI0oPywE8hP/ZT//AnU/oafsr97Mm18+BU64uKriQ5UEi24mPz/uJZcpaXUvWKgHKDx4H5zLnHEE9eCEaHoItHp/N0S1SpRJ1DFCnT2U7T3omOobx5RXh5RsjpX9UVKEN+sYKEAiEUXiicpaVAM4+vvonQljMy0FOruRUhiBM12MYwunPLlp1LTPcupqF65OvX/m9W/w/+fueZNor+q4PiCfyvXOZ8yrtrKv7FDxBPvwolLwQQTSnJ6IW2/oZgW/4eKDUCPh+iQOUQf7aKu7c9Q+srl1P/gBuqbr/ZV59P9k1ZqqdtGTQerA/EKKJ1RTEmeJLYa27dWUEtLG3V293G8Ulg4hQ4ebOC4JTsziffXY5iyQ49WniaVY5jajyqoqamdFh2+jLIKZ1P2bcsD/zvp8uXUtX4DpS84L5BHSvXy8bb95VlacFsdz/d1HeSpEO/CibuOO4gFQhGxQCSSwOKTiqhrswpuT/wB0Wk/Ub5FVbCa4iQJ6V/2k+vOOurrVUGFQsQyu2wmiyUlJYXFsvaf62nX7hpqbG6njLRkmjZzOruguoYuFhCEwmJRtLd10Zate2nT6+uou72FPG43WxZxTf7+TvL+eC+lfamPlwHnScsj8oy8owwiFGv5pOy6G44n4srCiFiAVKCACn7jpaeNeZ+bvGu+Q2fecodaaFHR6ed5fdUN86mMUlULxU2+i+uou62aGqqNvpX21hYVE3dTWmY+L697ZR3VHGijFI+PpkzJpblzZtCUonwlsi7auGkH73PI7Kl0oK6J2tt7KSsrherqWig51UMrjl1CRTPKqbezlQpmLKIdG17m1te08pXk+bMKlLf6qIp6qOw2U8WbVVCenEvP3fRdSrvkdmOdybEfP9+2rADWJt4sTdwIRhcLQCXqIrGyalkNUY06seXnq2ZsN9GOn9KOe/eok6wqXLkF/2W7yNvXw/se3LOJuru6aUrJTHYnTz36GO2uaSO/t59KCjNo4YKZylLkKPfSyvtX7TTcxbJlc2jHjv0slOKSAmpsaqGOjm7Kz82hU04/jvti/K4Uyi85hNoP7ubfFK69kC3LR2qx/Euz1J9vEKWlqfypcpSW0+/W9NO8eTN5XysiHt1NxZto4vZe0qvPPDBELJWVezmtmrGZqCuT/JX/oB3XXkO0/1Wi1lYqXzWDar7wFPVfWkE9nU2UmTONA16cVIglK286bfz3y/TRviYV0PZSdrqbVh63zDy6atQoa9LT3a9E0UW9qomuk5uTYc4RNbW00luvb6DUrAJ1xfWyWBDDgO7VG8hzdx/nBXlC3pBH5BV5vurkpkA5kHRQXpQ7nom5YNoPXT3IuqDSdKHolbt9dyMnWnEz0b6HaN9zfipfkkr7X/kz0eq3qLFvH/Urq9LVsp9ylDgkhoEFKJz5MWqorQxYjxmF6fTxU4/keYAYB3ELWk8NbT3U1+PlpjUoL5vCLaWCvCzKzFTWQlFX20jdHe2UWzSDUjNyOIaZOvsoFk9vey3nBXlC3pBH5BV5Rt6lHEh6+QS9DuItnompYCAWHTuhCKjcBbMLOBGptqtqEs+8frnyP/00vXi+alLP5+YsyCosU42adNUEblUnM4/yig/l9c0H9tOiJXPpDCWUE086jKbPO1KZ/AaaWqxaTUlujmN6+tyUnpbOIimePkdty6eUtEwljFJaethCmjO7lGZOV0GqimWqd++itJzplFu8iNIyCikpOYVmLDmXDux+h/OCPCFvyCPnVeUZeb/rN48FysIXgImdcOKNmAoma8sT1Prk1XwV6ZVTOH02+3nx9XWN7Vy5V91wLyfcDqDTd1PjSxuMezdZe8mtNIH+F8Qq5PWqaYNyS81KMPnkciVxADx19mI6/PhzaNrsObTwY+dRfc0+mlW2kHIKVayhmH/oYTzNzXJRcWkx5U1bTMUz51FhUR7lFhRRSdnhNGfeXJpTNkf926m8r0cdOyWjiNKyp/Gyv7+Lp8gL8oS8IY+cV+QZeVdIWVAulA9ImVF+AfUST1YmLmKYHR+8Z84ZYikoKuQAEFcbKrO4IIsrV5AhBHwf8et76d8vdfHwgZ1L/4eycnLJ6+un5uptyiV1kDu1gHx9bdTWcoAKSxcoN9JERTMXU0dbPfl7W5WrmkeNdVXkSsrgrv7O9lZasmiuineKWAypyR7q7FKtnu0VlJldpCzNNMpS4pm3ZCmlZRVRZ0c958WdnE09XW0sTFiZjrOfopwvVXDekEe5OW4d/oByoXwoJ8qLcqP8umj0+ok1cRX0ilhwRT1y34BAdLHoTD1TmXkF7hcB9NxKDFO750PyJOfxFV+/bxN5+7up3+chn7dPuZgcqtu3izLzplJqag5VbNtFhYWZlJqSQQ3m1b7p3S2qldWhmuP1tHdPNS0/8QKq3b2ZGusP0rzDV1FR6Qw6dMXZ1NV2kGMWv7+fhdrevJ+XBcmb5NUOvXwoN8pvFU28EFPBwMziBABUTvmiwweJRaxLUJa/a84Y9MIdKer2VNLB+mZKzy2gjtZqqtz8NqVnF1LrwUreXrtrE1VufZ8ycwupR8U5hVOnUvEsFWskpXIHHeCpWsZ6bMd+2B+/w+8Bjofj7qlYz8L0JKvgdsdmJc4e7pOBNQtgyasVsTJARIP6ENGgnuLBLcWNhUHlWDuwQDDrYgd6YhHDvL+lknq7O9il7Nj0Eu3dvZcycmbRzs1vKVG10IbXXzN/oRouFW9R6UwjVkJTXKejuZaSPB7ejv0E/B7HwfFw3HfeeIv83i7VQqqi7RW7qa25mvpVHAUXFil25UR9oF7iibgRjIglYutiAzrautqb2DrgnhBcCtxNTWOvikZ7aVfVLtpfVUX5ecadZ7ipN9ZvpoP7jU43K1vfXEstDQd5+/ubK3h/gN/jODgejvtBVb2KZQbEdnCf2ldZJLioaLBaGWB3EcWSmAmmu2mbOWdYF6D3cA4HxDDorUXH22EnXMiBbk1DF+VmuKi1tYNKVcunu6uTmpqNYQwfbgrtJoDbNXDSZX/8HsfB8XDcmvoeaqypondeXcvbd1eplpGybiNF6kO3Mnq9xYKYWhj4ZQR3VuQqixbEMOitFf740J+ouaWdps1ZoCyFvRXR/9f+qgpzbii4n2QHjtvV76NNG7fw8t79xkmGdRkUw0SBXflRTxLvxZK4cEmjZXYRw7y7tZb2HeyiDuWaAG4BFBXk0b4P3uZlgIDYSqiTIRbJDjnu1i3a7XLFnm3ruPd3NIgntxQTwcCspuUvDjShAcyvPgINoBPrd7d9yVwKj95rCqprGqmlw0/pWXnmmqFU7DNaRcAultm7a485F5ruvoFhDUJPp3EzMxJQTumoFFAf4pakqY16i6VbipugNxK853+TGnI+xvO4rWC9taDz3z++m6enHF1KTbVGc1rHzsqMBFgy4X0VaHMcMwFJGMGIOPIvvSQgGmAVzZcXN/B0WmkBJ8QeH2zdGbhPo9+r0QnWUoqGf66vpAPN/ZwWN79BrU1GL/BEYtwF4+0+wGY1GDDL1uY0zHXP7t08kNr9mdNYNOlzZnPCegFimbnqCrrzR99hd5RtDNqny88+nj5/kfE040iA2GCZkHQBnnRYkXlTVFm2r67m/498ZG5Yw+vCYXW7KL/VPemg/lCPsSBhLMyU1rep6bHHyfeHF/lJga5du6l57Tper+MqXkje2go+gXql+zvqqWZXH23+VxWtuecv3BL520vvUUmuh15784PAyddBsBsq4MXxIEaA/4X/6d/7Nv9/5GMikhCCwcnAVQhxdK5/g8UCy2IVC/DWfkCe4gXm0gC33/sK1e/ZS9vf20zvNzXQr37xOD364FOcgnUQijWReOcHN98fSBAdjofjWsH/Rz4iwS7YjWfiUjB6BWJev/IxJALYieWQr71A+/+Fh9qMIQSCLpbVf99PS/OnmFuI53Hy/Wfcy9YC6bh5swPzWL/ks/fyPoL8HsfDcXVc047AXzMfkYHyWcscr8RUMBiram1KC9arHpUovl5EEwy5umcsMoJjEcsP31ZiMYaxBDi3rpqn1vWC3Xr5DY6H4wL5Xy7NukDAobCzLsGsXbyM7Y25henscXNfAzqn0Ncwf9nAsEmAu7VWKxMKsTIY9CTc/cMzeLpSnRsk8MP13WwpSo3FwHor0fxG/udwrIt1KAPqAfWBekH9oJ7igfjIRYToViZajj/vHHOO6IVaw9LAUpSZ6wRXZlEg6QT7jX5c4K/bztPhWJdEYNwF40mbOqhJWL70VB5RJlYG4OoSqzKcgUR2J+v6L51szhGdXjKd9s9y0XFqXrdnEIk7uzCQdNEE+41+XLD3lfvDisUKyodyirURKyvWBfWDehJQf6jHWJAwFkYENBIr07fpMZ7CWvyueBpdr9LpKmG5v/IlFokOlrEe2P1GjqcTiVjEukh5EomYCMZqZZauvJQ2/ds4MXJvSZB7KNFamQuv+rE5R7TnrWfJ09vMFgMn+dd3/YQ+dv55gWQnFkFE870vXBPY/xPf+gYfB8fDcQX9f0aKWBe7cgPUC+pHiKV1AXFlYXS3ZIdclStWHU9r19xhrg2OfodawEn+zwsOp5uvWx1IQyxLyTLytQ3cvcZ2fX/8XndXeoAdDuQb+Q9nXcQdxRsxE4zVyhx77lcHPbylt5asV1804GTCTex5/SlyNxk3ISEAPdkh+wp2v8E+OC6wE2ek6OWT1hFAfaBehFhbFxBTC2MVDdCvKlyBMlRRwLrX177GpjwSKzMcPrr7dHNudEF+kW/k32pdUE59ndW6xINYQMxdki6aVRd9l68qdFKJlUElwjzrI+gjBccTdCujuxsdWT/j7G8TzVoRcj+xLhLk6v8rUlAeGfyOcop1QflRD3LMeBELGDfBhBrLIqJBQiVZx9ra+XIMR4jWylhFYxWE++D7tPmiB+j9K57mKZZ15DdWsUSCWBe7YRTW8qH8qAepk3gRCxgXwUQylgWVolsb/ZaB9fYBrkYEjcMhIBolBiRdNL7CpTxd9uo9PJVlwEIxfxOtWHTsgl27sopQ4kksYFwEE8lYFgEVdMJ5VwSsDMw05q2iAcOxMoBFo5raSEmtleRuO2AIQgWzyy67gOjq3/IUy7xebcd+8ptoxRLKuqBcKJ8E+ZhH+eNNKMK4CCbSsSzhGGl/jA5OOtJHrz1FvoPbAtamf5Wf+r9VxlOxKtiO/eQ3VkbS/5JojFsME8lYFgFXlzWIDPeIxVPPrzPnoqPwf3MClkNcjp5kW/ZNw3tkJBzWcqHc8WpdwLgJBoQayzJcxC3lt65n0fzz7cgGLgGJobo/aqfZDZcGxKGnWdtOp5kvH0qps6OzbAD5CeWOEpFxFQwIN5ZlJCxcciiVlpawaCKxOMgLYql5O1UTujCHxcECcV3NIsF8w2lL2H3axVvBwP9GwjtlokV+G6+Mu2DGkqw0Y9Q3RIOTFUnle57+CQui+cY7yL1qGcdaXb97jNcB9xXfZ+tiZ2Hqn/gH9bz2Lqf+A42B+bMzMzkhH9Ey65CyiPMeC+Lyxc4AlXXW0YWBVoQEifD51p5SCYRh9pee+XWqb+mkso+qeF2fuiRebOvg+QvPOJGngrikjJXHkn/JHHJt3WW8il616FzFU8i3aXA/DMSlA8FMOcsc3pCarJqDgx9mW/fszwflTZD7YVIebJNOu/akudTV00+V5gN0LY3GoyrWvMeKcbcwet+LHXJl2ZlzqdxQpCURiyX5iCXkmT+H0srn8NUOcNyOez8XSAAuCSIBmPp/chbPAwToSK7rZ9LOFRX04e3nDEpNlb+kll/eTb5dqsnv9RnTCEE57AL5wuxUKsrLoKOXltG8ObPYzYrFiQfG1cJALIgbZGpFhAJTDvdS5FGVqlkYYHcfBleniAlX75VfMyyBnEBvczP1v2d0xqUvxyDtwZ1yoPsTv+Zp2pPX8DyERLd8jPwZhdxassOfUUKtz+2m7HNWk3vhIeRrbCFPv5f8udl0/93f5HyKZUQZdMTKAN3CUPYiJXpjEHt7Vw919ytLpixmTU1tXFibcW8l2YlFtyoQS1FuBuWb7/nXr8Jw1kXHerVDKFaxuDoPBlL6H1azWABPlVgAtvlLIRwjHsEUySo4l9tFSemp5E3yRGxp9PLo5ezuN67hLHW8rHR14aj6QL0gvkGS+ooFMW0lScGlIkQsqCRUlh1nfuHOQK8o0OcFxA7uOcYQAVgXT3GTcYLnrOKTDYuRtONl8lS/NyhhHRiy7YO/kWv2caZYCjlZcbnd1L+7luhAE732wdAnHq15tnvjFOjv6+UE0YhwACxuhulacWHFyk3FrJWEwkrBASpDWjnA+oYCXI1zT/6KuTQ80HPLTyQq4dCKqwYl3xGXUH/5qSwmTLGsb6PuBnKXnWQeaTBJS+cOTKca3zIIB8SATjqr1Uzq3klNHf3KHRnCQdJBPeXmZHOKBTETDJCCy5UjWCtJaO/upfTUpMDzOQG/b4Ovo9P25EE0fAugvmpQ8rlnqQwtJ9/cy3jat8NrrO8e/MoOz9xTyH3IMUY6bDXlf+c75haDpKnGM9ZWZLgGSCk5MWBF7EA5EbdAOIhh0GrCus6ODiOWaW3jJBfbeBIzwaCwUnBUAioDlYLKwVWGMSIYLS9XYPZhn2ELhFZQJLz2r9+ac0Yc4q3LD0yRYElkHgLxrjsmkABaWLxt11oWD5Kv6l9E727nd/K66rsJL4xu/P3gZ5AivREKMUA0x15oCA7lRHlR7jmZNVwfBxqaaHNFFU9FKECsiwTB40nMBCOFDRTeFA5aRtbxrL5DLjDnDHBl4mqVloe1eSotKqGxMpeb2f1t83iK1Oc9ITAPkdz6f9cFki4a7IcpEn7vnV2srJcSy7Qi8tVuIteBA9xZ5/f5uF8GWP8/rIsMP0W+cVFABOJ60HckoNwo/5KprQGB8IWl6kvSno+qeBqL1lLMBINOOb3wSCvL/QGxiHURscBtwR3BRKOSdYLd9fV+uIun+Qvn89SD97mb6PPgzVeM99vJVLD+xq1aQS4VlPurleDbp5B/6lRqrT2gBOOnnJKhNw2teYM7AhBBW3UliwfuB/GZWBkRDeqD9zXFYU2xIKYxjBQc4kGyE4vEOXBHUrmYCviNFQx7xJVc6f6QTyZimb6NW7nFhKl1XtDFArFxUvvp8y68slW5pd6qPdRYtYsKVl/M+7t7+/j/wbrob70Eeh6Rd7heUNuTypYGYF3xiqttRYO60ZmUryyTd7VJ4UUsMlBKxAJgXVChUtFSyQC/CRb46sA6BEvghfqf8lSw2y95cTl5tynhKAsD/K0d1PSrXw7cHrABeUMerVhdccXWLTwVi4p6ENEAqSukUC9kEsL1qA+XmFoYFFySiAXxyIFk46NX7LvNCtUrFesEERiuTPSefvbaIE9FosVklxSehc9RzxPz6Jn7nuHkOfHNIfuhX8fXb3zk0wpuD/hDvHhI8ghE9NI8BnA53AgwXXNl23SuBxGNXk9I4dB71EebmApGR8SCp/yk4qxJKlWQwFc/IaFwZ2YMTUoISMlnbQmkIfvkGifWjua9eyklaxu5MgzBWGMW5A15lCY1BI8WEAj0qWjlEjeNehDRREuwHvXRIC4EY/3oglSanoCIRq5MO4ZTwSFRQS4FsSw66LMBcEGh8sDiN60mhCPWEuUKxnA+SjEWYgHxY2FM6xIKqVTdJQFcwXIzz3qTb8REIBYryIM8DmvND8TPolFJbyEiyYUhiJWJJ2IuGFw9kQStekUjjRboEY40BSO1rIQ7BSNFrKY1BSOS+hkvYi4YVAaakeGsCwhVudYhD0JG3Z+oad2b3CxGExp3kvUUMQdUywxJgeY1N9fDECxPicyYCQZB11g17YTimQP9Hej/WOwyvhhrhzSNuV/FTNJKCospFMC/M0nauZl6kjeYS4MD3qQ1vxjU46vndbSI5s3oo8WoC8a3Yy8XJPPCc3joIwqkP+1oJVQzUfpookUPOvfuqKSi1WdRU4Xx8Qjp5kcKi2ZVgIgllHUZbtAdqqx2dSTiCPdm9NFmVAWDzLqLC8i9bCmPwnefcQYXSLYFAz2j768f/DanSDuodKyDmha2GJ/aA9xtb7EoQ5rP1mQ2uUEkYhkJKKtVNKgTa6+xEM3TpKPJsAQDCwIBSJJl4M9MJ9dpy8lzRDl59xlXNUbchyoIKgsVgwqTFEosCJRh4uv2Gl9bDeeO7IAgIsEa7OK+lNybCseiTFfALSGvyHOoJrKIRhLqJFg9jNbTpNEStWAgDlgQuBwkqBqZxTRj4+M88sx/3KFE++rJfTDyz7+gYvQUDpyAUE3oqTteoh0vvEoLf7beXDNApGLRkRgIwL0hfrGOhSkJ8Y1H5FUEHopo6iGap0lHi6gGgfu//3vyLysn9/Il6pc9KsrLIerzqlKmkC8lme/kCrjd7+roUk69lfrbOqn/zU2UduUnza3DR65QEQuuYNwWOH7ZUfzw/LpXn+NeVV0wGH4gMUs0YmHrosUwQGIhEYz3vT9R5YP3UPnpJ/BbwOsypnDejs9q4v9fu/L8QB6B9PiO5kuaYd3HqqPOSlQWBs/p+PcpH75BBXZepbP6FiI8y3PHY+T60cMsEoCp7z+uI++nv0/er9xFLSs/RR1fH9nboiAUO7EEG9pgZ12GY1l0rGIBnsM/xdNQII/imiTvenlGyniJBQw/6C3KJdpfT96NOzjA9dc1kP/an/INOkwRkAGYy+GA96PAjyPwQ0JFS0LlI+kBobyaA8C6CLj6+q69PWqxWK2LBL14EtL34+A39oK5JeRV8q2XRcqHssq7cQT5H8H+VyyIyiUh4+lXXUqeGSroK88wRPLEusBTgohtXNddTL5v3RcIxPRgN1Ifi4qzGxIAxK9/uGkrzZrt4mYsKn7avPN4fXXlM1Sy/mm2Lsiv/wrjgTXXAw/x1I6MN/5gzg0AwXSf+gXOf9azxjNL7WdfQ+7vDYzjxfFxdSMvoMN8wrKl9p+UW3JKYB5uCB2UekwCgdiB4Qx4e4OdSMbTkgRjWIIBHlgYhf+DvSwcnlci8fziW+yGgC6Y4YglVNAngpGhj0ed+WV657lfBoQz7bM/CIhFyGoaKsL2/MJBYkJ+c3c8z2IRpAy6WATUSfUjN1N2Tg5lFw0025GXBUd+mra/+0dePvbj54cNYkVEdqKJB7GAqFwSMo0H1fkZZCUUL2IYBSyMjrijkRBOLNPmDh43K2B9/o49lPbYf7MQJIUCwoIo0NJDn0ZLufExC52/pw18TNTK/GVLqK21ldrqmwIJfLg1+GeN7bCWWUQSL2IBw3pUVpSPZjVADCMPsru/cgn5fvH4sKwLEAsTiXUBYmHAEpcR0+SfaAzilhgE8QfiGCuSPwFicV1bRr7v/3tQ7BWsHKgHOZnIk52VEWBhQCRWRixMPDIswQjsotRVKRYFlgaddt7/eXjYggGhRPOvZ4yWxTHHGz2wumCOP8l0I5pQAD8lsHFroB8FD5wh77BC3ZcOuBjkN2/VibZigYU5pzud5+XVH/qVL4IRavfXcPwiRCKYeBcLGJFggFgbCAd0l6oW0/otwxZLKMQVJfXv4YrVO+9YLDZCARCLzIPOYz8TCHTljjV+g6AWiCCsYglXFquVgWuSGAaBL3p6w1lPHf/KW8m1/kZzKT4YfrPaBFcZEq5KfgmPamqPlVgQK4hYUPGDxKLASUeS542AVSx2yP0iCAXiQP51sYwEV5rRUYe8Is/Ie6CFdKuKrazJAkQTT4zYwtjxmx9cQyVLTqILLg4/xiUSrJYFFS/N6eMXXTTEogjBxFJdt4vyLriJrQwsDATTVHoCi+Mzu96hP8w5ytyT6P/986/c8eh74Ed81zsUVgsDYGUQ/Pq73w00r6UMtpZGRHOjauGpef+zxvuI48XSjI1gfnU3/edze4a8sSlScAVKZeIkSIBrFcuKUqN73U4oIJxlgWuCJYFlebKugi558iH+DcSTX/Nq4DiIfYYrmqy7/8xTCACP0VpFA3ThSNnXe86llTdfxOviSTRjIhjw8NSl9OljzxiRaHTsxGIVhD6CTtxMKHRLAssiFgmCQWcd5kU0j3/ic2xt5PZAMOHogmGxwFJoBBONkHrOk+Yc0etvvmHOGaz0/s2cix1jJhgEwy/e9dWQY1VDgYpHfwrAcIIDqcaofIjlxLP/i+cF61DLSMQiyG/lN6FEg6A4d/2feD6YcEQwpY+qFpJFLIKIBlhvQnKge7YxtHP9D9bQsdvvo47rH6TsNTfxulgz4qA3GE2vPEQH1j9qLkUHHmqHWGTsicQoVrHgZI9ELMGA5dGDXaslA5I3eQBfQGCuiwUjEK3YfYBDgNsRFyRALG0X3WIuxZYxE8zMwoEXEUYKKp/FogkFqaG4kU04wD0eSfqTiUijIRaIA7EMmtG6dRHRSJ6EIaJB0KqL5d3gL5pGmezuWMezaMZMMCD9vtfo/Hv/ymZaT1aCCQUnSU4UOugCHXM2jGTogi6AUCAQlr4aW9HYieXIRQPL2hRWRu90BPo+dgFuPIhm2IKRDrtQzL7/Z9w/gyaxnja++hZvxzGQrEKRQdpiScS62AGhjHScixURKdCtjBWraELhLjfiEpkKetms+xz7qPH5PhESiLVohiUYnGR01oUSDbrwj1y1gv527bn0t0cG3zyb98U7+bfoHUZCkxUJV69cwaEQkYy2UIJhFY0uKBFN0l9eG2JdOp54k08+li/KH3h/XzgC+8I62bi0WIpmWIIRsej3UnQCYlFCOfezqzmBnukncxKhCLjpJykUwUQyKK4ZRYJZFmAnmmBYrUrUKNHoVgbESjTDdknBxAJq9u4PWBURCRI6yJDgppAw4IoHXRVP4cHMSLj5h7EouhVJSSnjY+mIQHp7jeY27iPZiWk4SMedjp1rEtGkrn1/SBMa1iXz9st53tqnpBPJfSUcyw4cf7xFMyZB76e+eDknQYQi4AE3fr9/XQOP1EOSdcHA3V68f1e3JP3JtZS0P9UQyyi0kKyghzeYKxKs68QdCVhOu/dteqRq4BkprENfjNzBtlqPNd/83dD7SjZWBpZrvEUzJoLRefGOLwVu5Omi4Pf6q8QfgtAGXGEe7grd9iIOpKS+Eq5giEQSi0UxFmKJFPfPHh9iXXTcfzKGOEA0sDRIvVPauCywLhABOuYCKKG0vbeHk/xWJ9aiGVPB6JYGg614vIwki1AiAQLRExhtsVjdkZ0rChXbhCLlhX0sEqS+L/yZT7Lei+t73Pg8YPbhszgNwbRcdqLhY1it0hgwKoKR1lKwVhOGOcinZHjguDkGOBhiZXhcLca4SNKAUEZTLNJjHG44g749nHUBvk+dwgn7uS8Z+IC6iESmgLer/eQ3vnkDF5Q1jrGKhkFexlg0IxaMVSzBRBMtAdFc+p1Bo+JGWyhWZFSdjm5lrD3AodBdje0JtiGwn2lNICJdVNb4KNLjjhajcvNRF0mo1pM8ZhvOwuggzgH6sEkdxEfWFk00wLJwZ6E5hEE/FraJOCEQ9BHJ9mDWhU+gOqmwCClfO5t6736W10uLSQeCGrLeFAR+D6FIbCLzmavN8crA7EUWuPmu9TaPBaN2txqiCSUWMBzBCCIcO0RMds8XhUMXDNCtly4YoMc3doLRrYMIBohoooGFoXXcWQU0SDgmss9YMmbDG4IxEtHo6AJynaxaXhW7uR8nWtFEKhh9uAMIKhjtBGc+eB1bJggGJ5jX3aSa0hnaByzM/a3wviIaYIpQBGHXKhprsYAxb1aPCwXmC6DRt3Pp93h+uEAkwbD2ywRDxAJYLBa3A9chyXXCEYYoLO5FkP2s2yEOaxoPxl0wGIGHFhOa1sPF6p5chw68TQrBcrSiwTNLemAdimCi0a0LQD8SUjj8nd3kykiztzSaSFg0OohVxqEZbWViWBgLIppwwsF21w2/CnQmimisVsbaNwPR9KxayicMQhniigrSDWu38PCBK99iIdDnwv0u5u/clTXkfuZtngpDRGLC7gjuEGmcRRMTwYzEytgFv64ZQx/8gmh04dgl2UdA56KdpbFrhfGd9cef4d5YTupEi1isDDrxHwx9U5brAS0ortjHE8QvEEYgkDaRlpJ1/XgRkWAQqI732xpHCxGFXQoGRBPKnaD5jXtj6CeCaLxvbebkqhj8hilrb60EvjjZYkkCFsUUCmNaI95fNb0hEhFKAGWZcBzcQhhPwgpGxIGhB+P5tkY7gjats4Ze1dEiwy3keXEgwpGEZe6rCTMMA7hnFgXtD0HMgp5c3f0MQRONJAGi46TdVhgvwgoGHWO4GkfzbY01VXvJ/6cfB9xSJCkUfu3jomMJ4hKrWFAX0g+EeTTtw+F/daMR6IqgxLosnEF0z1fIXWC8SoVFI6lg4LuY490y0gkrGNwHGs23NUIsoL62ng78/L9YNJEkFo6NG3E9eSe/iNF13zfMNSNHtzI6QS3ccGlsNUQDoSB98UJzgzoxSjSSrHDQGyMi7rgTFwTLMprPTAOIqKikiEUkU5CWMeBq8raYA6WWzCFXX7+64nLIl55m+yJGf5sxXsa1s5qnvneMZ4iYCnvLCDHogrSzFOK2sJ9VPLiQZDvmYY10t4R4Ay4ko6eZOlPzuG+GxYAXS+pARAK2qWXfu1uM5cYOI7BGbKOmsbAwUfX0QjThuv+Hiy6a0rKhzUnZ7vqU0bqREwYLA9FALHi33mhiFY0IAlhFYycYbPccfRivQ3AKsQARDLAVjQCxNLYQ7VKBrSYWECvBRNWsHiuxAIgkmFh0EPvo1sD/iW+PiVjCoecB6GLCvIhNWlAilgB6R51uVSywoHSxmMFwrIhKMLEGgkKyisZlfhZvuOBYdkkXgR3YRxdNpKCvBgLgprFyN7AicFlDEta/+IYhFlgkJZZgnXnjxbjffBwucElifazuyX3LleS76X7eNtrobimYgJAHiMeKuCmrqOSY6Almq6G1gHQ6fmsM0cQ++uAriCkWTWqQMIIBwUTj+d8bx0wwQE5wKIujiyaYQATdtUuLRzr59I44CW5lXkQTS8EklEsKFt/g7eTh+mqCoff1DPcYQNwTEgSip5R3HuXU9tefDYkDcdKRZOA3XI8kAdtFOLEmIsHE460ACZLRl0MNytdLX02Uyba/RyUduTkZCrEqEI4IA1MIpWF/HadQAT0LR1mZYDGK7aDwGJBQLslKxddX0szyedT7yZ9Qd2cXTf2vn5tbIgcBNIQH9wbg4gAGeel0PPV3W5ekCwVAwBAGXKYQSiiD0IZXwu0gKIZlYdejb3v8hYH140zCCwZfEenszCNPbQW1nnVr4MTrQBAA22ReJ+cfNw75rQhHxxqbABGKCE8Xhx5zRYRFMEPiFLVdYpxYiAUktGCAiKanqpaXceIFEYicNJzAll9cwlbJivxOF5XVUthZMBEKiEocwTDHt0AYsRJFKCaMYICIRoAIIBD9MzjixgA+HyzUL/hywNJYfwN04VgZFaEkCAnVSgoHBKAnCCAY2O7OKw2kou2/DPsbCMMuTSYSXjCwBPiYFr6GBkQAAAKwQ8Ri/agoCPabySaMYEwoCwP8GSUsBBGNHdiG/RyiJ2EF47v6Lk5WXMUL+etskRBqPxwbQ1PjsQ8qliSkYHAS0bmGJi3m511uvAsO+OsqiHatNZciw9dcM8iVAf8S49GVrF/dxMLxb3rSEY8iIQWDEXHolaWPrwx8Ic7VWUuu+/qJbnqbBYAUCdgvSasGEQ0+JOa55pP8OWX8H3xDKdzd68lAQgoGva4fLV9A9NJ6/qA6RCJ4Lj2LXJVHm0sGsBB27gvoYvG/PZP8t++l+Z2fYHF4d5iiU/8Hw1LRcacPhJ+MJGw/DE4cBmTvKs2hMl8yiyjrhmv404KuZUdRf/ofqPvbO3nfwOg387sH6IuZf/HFRHNWBdwXhMIoa4KPoHoffJAFgvHMOngH33C/nzARSCjBwErg7q/1iQWcRMFzuXGXd2NRF7/eFS4Lnxd0r1pGdOnHeRsEM+OlaYGxKv4vzqCuzzxhuDdYresu4ycROq64iTJu/hr5H/wLCwlf+ocY6ROH8nEmIwkjGIgF1mROTSs1nLaEvx8NCwPLwR/20si79bt84gOokw08Xx34Mr/3nj8b4lBxivfXxidqeMCT+Zll/8wk8r2+jUXC8RKwOc5kI2FiGLRaDtmwndwXrKSCh19iqwJrg5M45cEHqODlh3k/TBGwyskVy8Df2taA1UEc5Pvremq87OMsOh7GoETUcPkV1HjqZfybntk5LCQcB7+Rzy9PVhLGwqBJKy7E/ZtvGcuaC8GHSVkkajnS2COci2P3tnw6tZ9nfOPAGgtNRhLGwmBAEk4UxAK4iQu3A5HUG8VwrzBekgxrNOU3twdOPFyX1W0BHAvHrb8ymZd5v29cxWNhYFW8+z5UKnHxQCgkiAVilG8lTEYSslkN+Co3LYrv+eep9bfXU/PMIj7RnnKzA05th2hwokM9fIcAGELBfnNPPYZjFgiEBZnkCTxQh8FRnXddQyXTJ69oElYwAMHn5usuobrvXMIj7gDcFAexM4r4hLt/dJwRg4QAHYGIjyAw78Yd1PXHmweeukweeLISyFfvJysJLRg7EJiC9i/ewhZh3d7sIQOvraAPh4dkKoEhYO7r6KbkzDS2WpRtPAKiP7YLJquVmXCCabn5cuNEr9dexx4GCAovaUR8Uvmrb7O1gmjyS4ybkzJ1SLCOOztwleNqB7oVgIWQb0afdN7gD3GGo7enl5KTk/itEDr8SG6fl+c7e3t4Wr1zN3/ncbKQ8BbmiBOOptr9kd1ojJSU1BRa9/eXWSBCU+1Baj7QSHX7azlBjEgdbR3mHpODCeWSJPAdDWCVRDQQCywWmOyxzISLYUYTiKavrz8Q04hoJjOOYMIA94Q4SEQDJrOVmRCCGYs4RgeWRkQz2ZlwFkZOqliD0cIqmslqZRyXFAXhRDMZcAQTJfOXLAzqniaDlZkwghnrOEaY7A+0ORZmGEzmIHhCCmY8TqSIxoq4JZfLxemYQ4+kz170/8ytiY9jYcaIz6y+lG658Yd03n+cTwsWLmDxTAQS/uajDq5sXOEALRhYGlgBWIOx4l/PvMiBsBXEU8tPHPigBMRz060/pESv7gllYcYr8I0ECHfDuoEXGUIsEE2iWxrHJY2QYLGMHRDNQ/f/PqFF4whmDLFaGfC5Kz+f0JZmwgsG8QXijLEklJWxE00iu6cJK5h46iPRg18BokFLKtFEM6EEo7eSxptgVmba3OAvZP7DE48lnGicGGYMEbFU79zDyQ6IJqHcE/phJgrqauV09NLl6OwIJHVCeN14sPbpF/xKHIH/jXlJep5imceRMGEsDLrg0aP6YcV2c01sWHX+6YMsi46+/Nb7G0gJxFwyYppEYEK5pFnmK8Wee/H5gBtAuvLzV9Cdt93B28YLq1iCoYsmEXBimFFGWW1SbslcGopVSPOVVUTgi5QITEjBxHp0f6S9v3BLCHofWfMopze3vGtuiV8cCzNGRHPLwGlWx5iMlFRzLrYgALaKxq5fJpH6YiaNhcHJizWhOvEShQknGMQFLW1tfHL0hKsYTe/xRprZSAD5wB3rRGXCCQa9prl5uXxi0GSVFCuQH53Tzjqd71gnKhNOMDf84EZyJ3noocce4SarJHTqxRqI2CoWrENLCc3xhID7eycAjfUNfp/Xay4Z9HT38HTrext5+18ef5SXxwtUL7r89SmSsniBpATD6xKFCWNhzjz5NHrkwYfJ12+88AcvBUpNS+XWx5LDj6Bnnn6abrvF/nsD44F0/evuEZYvoayLYsK5pNtuvpVFc8JRK2Iew0AIMlgqlvkYTSacYEBnV/wMnhLR4HETPaZKROsCJqRg4u3VqCIaCERPiSYWMKGeS8IThhje8Ps/3s9xiw5aI7hf4zAyJpRgHMaeCemSHMYORzAOUeEIxiEqHME4RIUjGIeocATjEBWOYByiwhGMQ1Q4gnGIAqL/DxPvXR6sozalAAAAAElFTkSuQmCC" alt="" /></td><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAHOdJREFUeNq0e3tYVWXa928d9oF9YrM5K8hRQUCdFKJEUfNYiqSZn5ZThI6N2euM41Rv6XXN9c1VY2XWTJ9SmqGmpR19HU00NZ0kNIVCkFMCchQ35w3s09rr8P0xPOtbewOGve/3XBeXslin+37uw+/+3fei3G43RrMkSYIkSUOODS6apmmR/O5yueB0OmEwGKDVasFxHGiahiRJuHjx4t9LSkqeVqvVXvcSBAFms9n61FNPzdJoNFZJkihJkiSKoiAIAiiKAsMwkCRJfpYkSRQAr5diGAYul0t+HsMwEEVxRLlojHJRFAWapr1+KIoCRVFgWVZsaWlBd3c3BEFAe3t7eGNj45+sVutClUoFhmHgdDrBcRw6OjoepmnaTFGUGYD8Q9O0eWBgIKG+vj6OZVlQFCWpVCoAoC9cuLC/sLBwS319faDL5RIHBgbg8XhAUZTkq8TCwkI0NzfL7/dLi8U9LIqivKyApmlZ6x6PB729vdOrq6vXlJeXr+jr6wsOCAjoWLBgwUqWZW+43e7f3L59e25XV1cUwzBDd4KmwfM8bt68+Z+iKJ7X6XQ/MQxT0dbW9nxJSUkOTdOoqan5Y2Rk5P6YmJj8sWPHNmi1Wng8Hq93u3PnDkJCQkYv0724gCAIYBiGaJYCIImiSFdUVKyurq7+XWtra6bb7aYYhgHDMOB5HjqdjhcEoZ/n+QBRFOXrfd2JHON5HqIoQqPRSAzD9AuCYCImLIoiRFGE2WzuHTdu3JGJEye+Hx0dXSaKIiiKAs/zKCgoQFJSEmJjYyGKImiavqsLsKPdeUEQ0NHRAYvFgkH/lSiKgiiK2suXL+/q7Ow0azQaKH2bZVk4nU4WQABN00rljWhZLMsShVMcx5mImxFLYxgGfX195h9//HFDT09PemRk5DRiib9msb/mIoqiqMFgJFAU5WIYxqFWq83EtJW7qzxG4ggRSCm4JEkQRXGIiw1nLUSZQUFBFYNBjmIYRvr/qoDBYEcEkgAIAwMDqKqq2uhwOCyD1uAlGAmWZFcFQYDdbofL5YLb7YbH44FKpQLLslCr1dBoNNBqtRgMguA4bojwyoDc398f09HRMamnp6c8PDwcer0eDMOMOgCORgFympEkCW1tbbl1dXVUcnLyIbvdHn316tWdNTU1S4ig5DyapqFWqyFJEjo7O1FXV4fa2lo0NTXJwpNdZBgGgiBAEATQNA29Xo+oqCiMHz8ecXFxMJvNoGkabrd7iKvU1dXNsFqthTExMds4jss3mUz3d3V1bRwYGNgtSdIFHzngmzIBgHK5XF7aUmpcuYuVlZWPnTp16jNBEOioqKhbDocjyGq1GtVqNcjuMwwDjUYDh8OBiooKXL58GU1NTQgICMBvfvMbpKamIiEhAdHR0QgMDIRWqwUAOJ1OWK1WVFZWorq6GiUlJairq4PT6UR0dDRSU1ORmJgIPz8/uN3uIe9IURQsFktTb29vpMvlosxmc296evpjSUlJ36pUKlaSJBHAsJGQcjqdXgd4npcfQNM0dDodWlpa5n711VdfDQwMmFQqFcnBsqkRM3e73SgpKUFhYSFsNhuWLFmCJ554ApmZmbBYLPfkm3l5edi4caP8e0REBB588EGkpaWBZVlwHOflbiQTkICt0Wj6MzIynpw6deoJAJQ0nC+NpAByI7Vajfr6+klnzpz5pq+vL4z4sq8vsiyL6upqnDx5Eq2trQCA06dPY+HChV7nk7RE3kUZM5TRvry8HPPmzUN7e7vsIkpFLFy4ECkpKfB4PLLg5H5KhTAMw6Wlpf3+gQce2K90HyUOGRIDGIZBe3s7gZ/jCwsLP7fZbGGDqMzL9FQqFVwuF/75z3/i+++/lwWaOXMmMjIyZPNURm9l1Fe+CM/zcrA8fPgw2tvbh80ALS0tyM/PR0ZGBh555BFoNBp4PB7ZXckzBxWnvnLlSv64ceM6oqKiTno8HviCMHa4CNvf3w+Px4PW1taNzc3NCX5+fkP8zs/PD1arFZ988gkaGxtlAdevX4833ngDer0egiDA12qUO97X14fi4mJwHIdFixbJu79nz55hYxLZIFEUUVhYiJaWFqxatQohISFDYgN5hlardbjdbmtraytYlkVQUJD3pgwT9an4+HgkJycjLS3tI6PROMDz/BDhb926hT179sjC33fffSgoKMB7770Hk8kk74JvMUUevnv3bkybNg1z587F+++/L+98bm4ubDabl0v4uhFZDQ0N+OCDD9DU1CQHVOWzBEHAxIkTj4SHh1/T6XQICgoi2YryUoDSB5UP5XneQ9O0qDRFnU6Huro67N27F93d3UhMTEReXh6KiorQ0tKC2NhYZGVlob29XX4J4sPk3idPnsTzzz8PmqYRGxuLsLAw5OTkYO3atSguLvby4+EqUOWxrq4u5Ofno6mpSU69SmTY19c3ThRFOiAgQFnASV4KUOyOxLKspFKpYLfbcfHixbf6+/tN5EKNRoPbt2/jww8/BMdx2Lx5My5evIgNGzZAq9UiPj4ekydPRlNTE6qqqrwgbHFxMfbt24d//etf2LBhA8LCwvDCCy+A53ns2bMHBw8eBMdxUKlUowYx5N59fX04cOAAOjo6oNFovOJATU3N/MbGxlxiPT09PRgYGJCfwSr9zOFwoLe3V2s0GqVbt27lNjY2LiDYnmEY9Pf3Iz8/HxRF4YsvvsCjjz4qIzyKopCZmYnMzEwv3yW7YTQa8cUXX6CrqwstLS2YO3cuJkyYgPj4eKSkpKCgoEC+1wgZa8QijaZp9PT04PDhw9iwYQNYlpUzDsMwuHr16g6VSvUTz/M3JEmigoKCXAaD4d8KoP6tCkmSJFRXV//+ypUrW9VqNZxOZ7jSJViWxdGjR0FRFK5cuYKUlJQheF8pOAFGu3fvhlarxdq1a3H69GkUFhYiJycHkZGRyMzMRGJiIo4cOeKVHYbb5ZHIGGVMaG5uxvHjx7Fq1SoZRjMMg97eXvO5c+f+JQhCr06ncy1dunQuRVGNkiSBJQJ6PB5VTU3Npv7+/ggl4UGCXlFREaqrq1FQUOAl/HA7Qvz98OHDKC0tRUREhPz3q1ev4pNPPoHFYsFnn32G999/3yt/3+2eRFgl7PYtkn744QdMnDgRU6ZMASn1aZqGy+XSA9D39PSgoaEhOzQ09F1JkkATGHv79u2ZVqt1okqlgkqlkiHwoAbx1Vdf4bnnnsOCBQvuaqIEHBUXF+P48eNwu9345JNPIAgCvvzyS7zzzjvYsGEDli9fjrVr13qVwCMtwgPodDqEhYV5pbnh1tdffw2Hw+EVDEndAQCNjY3rPB6PTpIk0CTa1tfXr1YWHORHrVbj4sWLMJlM2Lp166j8UhRFTJo0CTt37oTFYsGMGTPw4osvYsWKFWhpacGPP/6I8vJyDAwMyH5PXlIpFPk/iRUsy+Kxxx7zguBKao5c09HRge+++w4ajWaIpbAsi5aWlknt7e2zNBoNaJqmpYGBgbC6urplSl8mUbS7uxsXL17EH//4R4SFhXnVCncjT/38/EhQxenTp/H222/L91SWrMpgSQLglClTEBAQAEmSoNVqsWvXLsTFxaGvrw9HjhwZUgj5okziar29vfAlS0iZXVZW9h9Op5OmBUFAU1PTss7OzkBfmKhSqXDt2jUEBATgd7/7ndeu/FJqAoDExES0tbXh9u3bXpblG7yIFaxZswZPP/00MjMzQaK0KIr45ptv8PrrryM5OVkmXg0GA/z8/OQM5Lt6enpw/fp1kGrVC/6yLGpqah5ub29Pptvb22EwGG4EBQXVKREfRVFwu90oKirCk08+idDQ0CGpbViamaZx/vx5vPPOO7hw4QJ6enrk49HR0QgPD8eOHTsQHR0t76AkSQgODsbu3btx4MABbN68Gfv378e6devg8Xjw1ltv4dixY/j4448REhICSZKQlpaGc+fOISoqyssSlFbw008/geO4YRUUERFxzmg0tlMulwssy6KtrS3s1KlTlzo6OuIZhoFarUZDQwN27dqF7777DjNmzBh1Xs7OzsaJEyfkY6tWrcLzzz+PoKAg7N+/H5WVlXjmmWdw6NAhHDt2TPbzJUuWoLGxEU1NTYSAwe3btyFJEkJCQlBcXIz33nsP27dvB0VReP311xEdHY1Vq1ZhJEZq8+bNGDNmjFw+ezweJCcnn1q8ePEKURSdLGFiLRaLWxAEk3InKysrER8fj9TU1FEDE6vViqKiIvn35cuXY8+ePTCZTNi7dy82b96M8+fP491338WmTZtw7NgxvPrqq0hOTsaaNWtgt9uHWBRN02hvb0daWpocP0RRxNatW7Fx40ZMnjwZ169f97pOr9eD53n8/PPPiIyMlAOlJEnQaDR2tVrtdLlcFEvMuby8fG5vb2+IkrauqqrC/PnzvQqN0ayYmBgAwMSJE/HBBx/AZDLJu2w0GtHS0oJp06Zh8eLFePzxx2G32zFhwgTQNA2DwYCEhARQFIXi4mIvl7RarV5K4Xke//jHP6DX673ob0mSkJqaKlvNnDlzvMBZa2vrA06nU6dSqRzsoEbgcDhSeZ6XU4fdbkdXVxfS09NH3TOgaRphYWHYu3cvSkpKEBQUhIMHD+LmzZvo7u6Gy+XCCy+8gLS0NCQmJkKtVuPDDz9EWVkZ+vv78cMPP0CSJDQ3N+POnTvIyckZEu1J2iYYRRRFL6shm2c0GjF9+nScOnUKTqdTxhoMw8Bms4XdunUrISkp6Se2ra0toL29fWltbe2TBHKyLIuenh5wHIekpKRR7TpJa4cPH8ZLL72E7u5ucBw3JNqvXbsWWVlZcuQ3Go0YP348+vv7ERcXBwBISkpCfn7+sOgvNTUVDQ0N6OzslO9pMpmQlpaGuro6NDQ0yIJOnDgRHo8HNpsNwcHBcsbweDyqmzdvvuTv71/Lnj59+lJXV1cyob0JfrbZbNBqtYiKihq1Aq5du4bf/va3XnlZGZAAYMeOHbh69SpycnIQFxeHjz/+GGfPnkVmZiYaGxtht9tRU1ODvLw8+T4ECQLAggULsHbtWpSWlqKhoQFarRZz5sxBYmIienp68Morr2DPnj1gGAbx8fEy8RIWFuYFuG7cuPG/bt68KbDd3d0xim6MbEYulwt6vR5+fn53xefk/Lq6OuzcuXNYUKI8/9KlS7h06RLy8vKwfPlyFBUVobKyEgcPHvQ639/fHyzLgud5uRiiKArbt2+HIAhISEhAQUEBli5dinHjxhFmGK+++iqOHTsGh8MBk8kEvV7vVf6SpVarwfN8P8swDAdA5wtlBUGAVqvFcI1MX2RVUFCAp556Cp2dnSP24nwV0t3djX379g3bdAWAJ554AikpKdi4caMXmSpJEt544w35vGvXriE7Oxt6vR4AEBQUhHXr1uHMmTOyDMOhV5ny/yVEd7dChaIotLa2YtOmTejs7IQvcTqabtNIyPLbb7/Fc889h7/97W9ysCP4X7ksFgvMZrMciAFg3bp1YBgGe/fuhdPpvOsm0nd7OafTKbefR9rRN998E7W1tTIJcbdO7L0opra2Fn/4wx/w8ssvY/Xq1UNcjqzVq1dDr9d75fmYmBgvYuRuiqZ5nvcnJqI8kXR4CIIayZz7+vpkWlvJ39/L1MlwrXJRFPHuu++isLAQb7/9NtLT04fc/9lnn8Vrr70mxwhlTzAnJwc5OTlwu90yTearQEmSaDo1NfVPISEhlf9u+P6/k4xGIxwOh5xuhqOcfdmg/8lFhFm+fDk6Oztx8uRJhIWFyURpXFwc/vrXvw5rFUqGiOM4+Pv7e1kmQb8qlUqgZ82a9fcnn3zyvoiIiArSYBAEQY7ClZWVwz6AoijY7XZcu3btf1x4IiTLsujo6MDq1avB87ycZQgFTyZBRirPq6qqoFKpYDKZvBTg8XiQkpLy+bJly+bSNE3TGo2GGzNmzFfkRoIgwGQyQafToaSkZETztdlsaGtrG3WZPFwQu5sSSJuutLQUCxYsQEpKCq5fv468vDx89NFHKCsr8zXpIdWgXq+HwWDwgskqlUqMjY39+7hx436iAUg8zyMoKOiiRqMRyA00Gg2io6Nx+fLlIRomaTI8PBwvvviinCnuFmyUZh0eHg4/P78R+xG+sYZlWZSXl2PJkiU4ePAgnn76abz++usICAgY8RpJknDp0iVMmDDBC0cIgoDg4ODmsWPHXud5HjQZRYuNjS0zGAxO5YkpKSkoLS1Fc3PziOlry5YtSExMHNIHvFvN8Mwzz2DHjh1D2m0jXSOKIliWRXNzM95++238/PPPmDdvHiIjI4e1MgCorq7GjRs3kJiY6PXOgiBgzJgx3+j1evtg/UJDkiT2hx9++Ftvb6+eAA5BEBAXFwePx4NPP/10xJkeURRluKxEkiMJQ1EUPvroIxnrj6YHQEyblMIkyt9tlvH48eOgKApxcXEyEBJFESqVCnV1dUuLi4uf4HleRQ+On/22sLBwPcMwlLJba7FYMHXqVGzbtg2PPPIIjh496kUrEY4vLy8P2dnZI6Y1XxaJEKO/tPuEliPlOBHikUcewbJly0Ycn3E6nTh06BCmTJkCo9EIj8cjP5+madhsttBLly59bLPZptIURcFsNreo1WrJN9UJgoD7778fHo8HBQUFWL16NVauXOn18gAwbtw4fPrpp/jwww+xdOlSpKWlIScnB1lZWcjJyUFUVJRXn++XZniULhYcHIyVK1fKIGvy5MnYt28ffCdNldeeOXMGlZWVmD59uhxIfZUVEBBQYzabq1mO45iwsLCzUVFR39fW1s5Q3pjjOMTExCA5ORk3btwATdP4/PPPMWHCBEydOtWL0FSr1cjNzUVubi7sdruMzQGgpqYGR48exffff49z5879otkr/37nzh1UVFSAoigYDAbk5+cjPDzci/7yZXxfffVVTJgwATExMV5js8r3TUlJed/Pz89Gk9mZhISEwyNF4jlz5ni1pxwOh1fDQlmoEDpKeX1CQgL+8pe/YMeOHXedFSQ/xFw3bdqE2bNno7i4GJIkYceOHZg2bZpXrCGWRWr9Q4cOoaSkBIsXL5aRo/L8QYzTm5KScmTwWbRE0zSCg4OPG43GLt/mJM/ziI+PxwMPPCAfLysrA2GQlUXKSIIpqWpy3d0QJHlOSEgIuru7AQAZGRlYv379kFSnpLpaWlrw8ssvIz09HVFRUV5jtMrdT0hI+C+DwWAVBEFuj1NBQUF3EhIS/kmGmgnFJUmSPMERHBwsV2qFhYX3NI8HQOYBCY4YSfhHH30Uc+bMwbZt21BaWgoAmDFjBpST48pnk7HcDRs2wOl0YsmSJVBS/KIowuPxwOVyQaVSYcqUKf9HBmbEdEVRRGRk5Pbly5f/fvHixc9GR0efJJy6KIrQ6/VYsWKF7Aovv/wyOjs770kBRqMRn376KWbNmvWL/cXs7GyvY4QeJ5PnX375JXiel93ltddew8mTJ7FmzRro9Xp59weLJC41NfXvWVlZv583b95jRqPxRxJDmG3btsmDxna7vTs+Pr4kODi4xGg0Hmtra1vlcDgshOQICQmBTqdDVVUVWlpawDAM5s+ff08YX6PRYM6cOTh27BhsNtuw59XX16OqqgpqtRrp6em4desWuru7sX79eng8HixatAihoaGYOXMmAGDfvn3YsmULsrOzkZqa6mX6LpcL6enpe6ZPn74pPDy8hGGYKpZlZe6C9jU/MsI6duxY16xZs/7MsixHgh3HccjIyMC8efMAAEeOHIHL5brncfvw8HAEBgaOeJ7b7UZ9fT2cTidWrFgBAEhOTobH48GyZcvQ0tIid5YPHjyI9evXY+7cuZg9e7bXsNQgXG+dOnXqX8mgly+/QQ+H1IhZjR079muz2dyq7N97PB4sXrwYDz30EBobG2XycrQWQFEUenp60NXVdVdFMQyDgYEBvPLKK1i5ciUOHjyI8+fP4+zZs3jttdcQEBCAN998Ezk5OXjooYeQlZXlxV0Msr+YMmVKhb+/v9Xlcg0L0lglSRgREQGNRiO/gM1mu99ms43xnQDhOA5ZWVnQarXYsmULqqqq8NZbb8Hf33/INJjvnCAAtLe3o7Gx0Sv1DcckiaKI3NxcuQz+7LPPsHz5csyYMQO5ubnYv38/lixZgrlz54IIqLS0wRmhhEmTJgWwLNtDOEPCfkuSBJYMIttsNnkOiEDQhoaGVIfDofHtDBFXWbBgAUJCQnDo0CFcvnwZO3fuxMKFC2WBRhpzi4mJwfz583H27Nlhy2PSKjcYDHjsscfk49u3b0dpaSkWLVqEhoYG5ObmYtKkSbLZ+4IiURThdDr7JUmSg71ych0AaI/HI6c8ZdtJkiSEhoZ+Pnbs2CtkcMI3t7tcLkyZMgV//vOfIQgCHn74YaxcuRLFxcXDpkiSbQwGA3bt2oWgoCB5JkBZ0wuCgKCgIHz77beYPn06AKCoqAgvvfQSVqxYAZqm8cILL2Dy5Mky0vO1NrfbjZCQkFsLFy58VK1Wdw2HGimKAnW3ocTB8RhLUVHRkYqKigVqtVqmvYmZKb8jKCsrw4kTJ9DT04NFixZh3bp1mD17Nsxm87C+fvz4caxbt86ry6NWq/Hggw9i69atyMjIwIkTJ3DgwAF88803CAwMRHZ2NpKTk704SGUDhsBhs9ncuWzZsnkRERHXOY6jR5wWJ7B2pKXVauF2u81nzpw5UFZWlq38aszXctRqNTiOQ0VFBb777js0NDQgNDQUc+bMwcyZM5Geno7IyEiYTCY51pSXlyMvLw+3b99GbGwsxo4dC5ZlUVpailOnTqGjowPjxo3DQw89hIkTJ0KlUsnBThntlXFEo9EIixYtejwpKenYLxG1o/loigIgOZ1OzYULF3bfuXNndmZm5nZRFA0XLlz43729vf7KfgBRhCiKaGtrQ1VVFa5fvw6r1QpBEBAQEICQkBAYjUawLAud7t89md7eXthsNlitVnAch8DAQEyaNAmTJ09GaGgoaJoe8gWJJElwuVwYP348pk+fjrq6OpSVlbnS09P/+OCDD+4ZRIPUcB9K3IsCZD91u920zWYzRUZG9trtdhQXF09pamraZbVaMwY/YvQqPcnnMKIooq+vD11dXejs7ERnZyf6+/vl6Q2NRgODwQCLxYLg4GAEBwdDr9eDZVmQGKU0c8Xu81OnTn1v5syZ+VqtlpEkiWpubnYGBARU+Pn5jfiNwK9SAEVRcDgcGBgYwJgxY2Cz2dDb2wuTyWT48ssva7u7u0NJuhyu/iZsjjLIDgeSyGzxSIOTxNQFQUBSUtKBjIyMZwICAuSq0Dfa/3e/GRqWchJFEVqtFhEREeB53uPxeNSkLPYVzlewX9MlUt5PiRdsNtuYq1evIj4+HtHR0TKkv5f65Fd9NicIAurq6jD4AYIQHh5+0el0ZnEcx5LBBWUDgihHmWZ/qSdA/lV+dUaOC4IAnU7nCgkJqTQajWhra0NgYCD8/f3vWZZfrQAyd8OyLK/RaJb7+/vfx3Hc2ubm5uyurq4IUqPHx8cftVgs5V1dXZkulyumu7s7kuM4v5FAkk6n69Xr9XcsFkuJxWIpqa+vX9Xa2no/4SFNJlNdUlLSYY1GcyQ2NrYmJCREVvKv6UveUwyw2+0YGBhAYGCg/Bkby7Kor69Hd3c3YmJi4O/vb25sbFxWVlb2bHR0dFF6evqfWJbFwMAAtFotVVNT88SZM2cOD9drYBiGe/zxxxcGBgZeJNMjHR0dEefPn/8vtVpti42N3RMaGnoqNDR0QBRFuN1uGdYq54Yoihp1p/q/rQDCwmq1Wuh0Onm8hqIoymQySYPXMzRNiwAkjuOor7/++pva2tpU5Uu63W7cf//9bQsXLpzL83zboLnTFEWJoigaJEmysywrDX4LJE+4++L/e1XA/x0ATuQ3r6vkAZMAAAAASUVORK5CYII=" alt="" /></td><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAADiCAYAAACcPi8UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAADKDSURBVHhe7Z0HfBzVtf/P7qp3yZIluWJZ7gaMIYBNMxB6eyQGwj8JIfAIkPpSSAKBJAQCPB4pkBBSHoSSQHgmkEBCqMExxHTb2NjIyJZxU7Gs3svu/u/vzJzV1Wi2qe2uNN/P52rqju6985tzzr1zZ8blV5CDQ4S4zamDQ0Q4gnGICkcwDlHhCMYhKhzBOESFIxiHqHAE4xAVjmAcosIRjENUOIJxiApHMA5R4QjGISocwThEhSMYh6hwBOMQFY5gHKLCEYxDVDiCcYgKRzAOUeEIxiEqHME4RIUjGIeocATjEBWOYByiwhGMQ1Q4gnGICkcwDlHhCMYhKhzBOESFIxiHqHAE4xAVjmAcosIRjENUOIJxiApHMA5R4QjGISocwThEhSMYh6hwBOMQFY5gHKIi4V/svP9HLpr+/aFFaLzTRQXfDl60qk1P8bSloZr6e7po8/sf0RHLyilv6mwqW3Yhb3v72bt4mpGdS25PCi1a+TleDkaw/xksj4nIxHgT+LpziE78O9ET+USrm4heX6oUUUX06U5zhwEglOYDu8nb32+uMUhKTacN735gLhEtP3IR9bS30dbt+3h51SkreQpSMnJo5uJzzSWNP2YQlZURrXh/IC+StwnChBDMc6tddOYV04jOXktU+w2ixzYRVdco05BBOza1UfnV2LafNrzw84BQpkyby8JJTc+knq4Oqq1ppJq6Rt6mU1pcQAV5GZSZm09TppeRt6eDers7lcXxkDs5h2bv+U/a8ZtqKl+WTdSpBDqtlOjSZUQlPyV6dhU990A1nfnExLAuIOEFw27gY6cQnfxrZT6eJdq6hiitgKhoKm17+H5anK1O5KEeejvje7x/yaxynvb1+1kwwYQiFE9Jp7YOJTKXh+bMKiRPchLNPWwFdbQ2KVfWQXN2XkO0xUvb2tpo8WVXEtUfIOpWx1tykbI2ZxO9cg0deP2fNPUGxyXFhOrKF3lauu4Mci1eTNWFP6NpB3/P66i/l9Z8+s900d+up7233E57soiO+72fNr58Lx2y4ChjH0V7cw3VV3/EYtEpKS3gGOaVF17m5cOWHsJTiWFeW/sWzZ5dRPn5WTS9bDGl55VSe+N+Fk71PZ+iWe1EM2+6ntaceztd9MdPKj+Xwr+vLvy8yuPXyb9tG9Wc+DyvA9PmnWbOJQ4JIRgRCSgonG7OKUPy+mnkr6kh11n3EW3/P6Kp82jj//2GjrjsZGq74xXKOtZF+455krLUiU1Kz6P+rmbate11/q2Ipagoh6eIYRCzAFgRWcZ8WkY2ZWQpS6XYuf1DnkI0oPywE8hP/ZT//AnU/oafsr97Mm18+BU64uKriQ5UEi24mPz/uJZcpaXUvWKgHKDx4H5zLnHEE9eCEaHoItHp/N0S1SpRJ1DFCnT2U7T3omOobx5RXh5RsjpX9UVKEN+sYKEAiEUXiicpaVAM4+vvonQljMy0FOruRUhiBM12MYwunPLlp1LTPcupqF65OvX/m9W/w/+fueZNor+q4PiCfyvXOZ8yrtrKv7FDxBPvwolLwQQTSnJ6IW2/oZgW/4eKDUCPh+iQOUQf7aKu7c9Q+srl1P/gBuqbr/ZV59P9k1ZqqdtGTQerA/EKKJ1RTEmeJLYa27dWUEtLG3V293G8Ulg4hQ4ebOC4JTsziffXY5iyQ49WniaVY5jajyqoqamdFh2+jLIKZ1P2bcsD/zvp8uXUtX4DpS84L5BHSvXy8bb95VlacFsdz/d1HeSpEO/CibuOO4gFQhGxQCSSwOKTiqhrswpuT/wB0Wk/Ub5FVbCa4iQJ6V/2k+vOOurrVUGFQsQyu2wmiyUlJYXFsvaf62nX7hpqbG6njLRkmjZzOruguoYuFhCEwmJRtLd10Zate2nT6+uou72FPG43WxZxTf7+TvL+eC+lfamPlwHnScsj8oy8owwiFGv5pOy6G44n4srCiFiAVKCACn7jpaeNeZ+bvGu+Q2fecodaaFHR6ed5fdUN86mMUlULxU2+i+uou62aGqqNvpX21hYVE3dTWmY+L697ZR3VHGijFI+PpkzJpblzZtCUonwlsi7auGkH73PI7Kl0oK6J2tt7KSsrherqWig51UMrjl1CRTPKqbezlQpmLKIdG17m1te08pXk+bMKlLf6qIp6qOw2U8WbVVCenEvP3fRdSrvkdmOdybEfP9+2rADWJt4sTdwIRhcLQCXqIrGyalkNUY06seXnq2ZsN9GOn9KOe/eok6wqXLkF/2W7yNvXw/se3LOJuru6aUrJTHYnTz36GO2uaSO/t59KCjNo4YKZylLkKPfSyvtX7TTcxbJlc2jHjv0slOKSAmpsaqGOjm7Kz82hU04/jvti/K4Uyi85hNoP7ubfFK69kC3LR2qx/Euz1J9vEKWlqfypcpSW0+/W9NO8eTN5XysiHt1NxZto4vZe0qvPPDBELJWVezmtmrGZqCuT/JX/oB3XXkO0/1Wi1lYqXzWDar7wFPVfWkE9nU2UmTONA16cVIglK286bfz3y/TRviYV0PZSdrqbVh63zDy6atQoa9LT3a9E0UW9qomuk5uTYc4RNbW00luvb6DUrAJ1xfWyWBDDgO7VG8hzdx/nBXlC3pBH5BV5vurkpkA5kHRQXpQ7nom5YNoPXT3IuqDSdKHolbt9dyMnWnEz0b6HaN9zfipfkkr7X/kz0eq3qLFvH/Urq9LVsp9ylDgkhoEFKJz5MWqorQxYjxmF6fTxU4/keYAYB3ELWk8NbT3U1+PlpjUoL5vCLaWCvCzKzFTWQlFX20jdHe2UWzSDUjNyOIaZOvsoFk9vey3nBXlC3pBH5BV5Rt6lHEh6+QS9DuItnompYCAWHTuhCKjcBbMLOBGptqtqEs+8frnyP/00vXi+alLP5+YsyCosU42adNUEblUnM4/yig/l9c0H9tOiJXPpDCWUE086jKbPO1KZ/AaaWqxaTUlujmN6+tyUnpbOIimePkdty6eUtEwljFJaethCmjO7lGZOV0GqimWqd++itJzplFu8iNIyCikpOYVmLDmXDux+h/OCPCFvyCPnVeUZeb/rN48FysIXgImdcOKNmAoma8sT1Prk1XwV6ZVTOH02+3nx9XWN7Vy5V91wLyfcDqDTd1PjSxuMezdZe8mtNIH+F8Qq5PWqaYNyS81KMPnkciVxADx19mI6/PhzaNrsObTwY+dRfc0+mlW2kHIKVayhmH/oYTzNzXJRcWkx5U1bTMUz51FhUR7lFhRRSdnhNGfeXJpTNkf926m8r0cdOyWjiNKyp/Gyv7+Lp8gL8oS8IY+cV+QZeVdIWVAulA9ImVF+AfUST1YmLmKYHR+8Z84ZYikoKuQAEFcbKrO4IIsrV5AhBHwf8et76d8vdfHwgZ1L/4eycnLJ6+un5uptyiV1kDu1gHx9bdTWcoAKSxcoN9JERTMXU0dbPfl7W5WrmkeNdVXkSsrgrv7O9lZasmiuineKWAypyR7q7FKtnu0VlJldpCzNNMpS4pm3ZCmlZRVRZ0c958WdnE09XW0sTFiZjrOfopwvVXDekEe5OW4d/oByoXwoJ8qLcqP8umj0+ok1cRX0ilhwRT1y34BAdLHoTD1TmXkF7hcB9NxKDFO750PyJOfxFV+/bxN5+7up3+chn7dPuZgcqtu3izLzplJqag5VbNtFhYWZlJqSQQ3m1b7p3S2qldWhmuP1tHdPNS0/8QKq3b2ZGusP0rzDV1FR6Qw6dMXZ1NV2kGMWv7+fhdrevJ+XBcmb5NUOvXwoN8pvFU28EFPBwMziBABUTvmiwweJRaxLUJa/a84Y9MIdKer2VNLB+mZKzy2gjtZqqtz8NqVnF1LrwUreXrtrE1VufZ8ycwupR8U5hVOnUvEsFWskpXIHHeCpWsZ6bMd+2B+/w+8Bjofj7qlYz8L0JKvgdsdmJc4e7pOBNQtgyasVsTJARIP6ENGgnuLBLcWNhUHlWDuwQDDrYgd6YhHDvL+lknq7O9il7Nj0Eu3dvZcycmbRzs1vKVG10IbXXzN/oRouFW9R6UwjVkJTXKejuZaSPB7ejv0E/B7HwfFw3HfeeIv83i7VQqqi7RW7qa25mvpVHAUXFil25UR9oF7iibgRjIglYutiAzrautqb2DrgnhBcCtxNTWOvikZ7aVfVLtpfVUX5ecadZ7ipN9ZvpoP7jU43K1vfXEstDQd5+/ubK3h/gN/jODgejvtBVb2KZQbEdnCf2ldZJLioaLBaGWB3EcWSmAmmu2mbOWdYF6D3cA4HxDDorUXH22EnXMiBbk1DF+VmuKi1tYNKVcunu6uTmpqNYQwfbgrtJoDbNXDSZX/8HsfB8XDcmvoeaqypondeXcvbd1eplpGybiNF6kO3Mnq9xYKYWhj4ZQR3VuQqixbEMOitFf740J+ouaWdps1ZoCyFvRXR/9f+qgpzbii4n2QHjtvV76NNG7fw8t79xkmGdRkUw0SBXflRTxLvxZK4cEmjZXYRw7y7tZb2HeyiDuWaAG4BFBXk0b4P3uZlgIDYSqiTIRbJDjnu1i3a7XLFnm3ruPd3NIgntxQTwcCspuUvDjShAcyvPgINoBPrd7d9yVwKj95rCqprGqmlw0/pWXnmmqFU7DNaRcAultm7a485F5ruvoFhDUJPp3EzMxJQTumoFFAf4pakqY16i6VbipugNxK853+TGnI+xvO4rWC9taDz3z++m6enHF1KTbVGc1rHzsqMBFgy4X0VaHMcMwFJGMGIOPIvvSQgGmAVzZcXN/B0WmkBJ8QeH2zdGbhPo9+r0QnWUoqGf66vpAPN/ZwWN79BrU1GL/BEYtwF4+0+wGY1GDDL1uY0zHXP7t08kNr9mdNYNOlzZnPCegFimbnqCrrzR99hd5RtDNqny88+nj5/kfE040iA2GCZkHQBnnRYkXlTVFm2r67m/498ZG5Yw+vCYXW7KL/VPemg/lCPsSBhLMyU1rep6bHHyfeHF/lJga5du6l57Tper+MqXkje2go+gXql+zvqqWZXH23+VxWtuecv3BL520vvUUmuh15784PAyddBsBsq4MXxIEaA/4X/6d/7Nv9/5GMikhCCwcnAVQhxdK5/g8UCy2IVC/DWfkCe4gXm0gC33/sK1e/ZS9vf20zvNzXQr37xOD364FOcgnUQijWReOcHN98fSBAdjofjWsH/Rz4iwS7YjWfiUjB6BWJev/IxJALYieWQr71A+/+Fh9qMIQSCLpbVf99PS/OnmFuI53Hy/Wfcy9YC6bh5swPzWL/ks/fyPoL8HsfDcXVc047AXzMfkYHyWcscr8RUMBiram1KC9arHpUovl5EEwy5umcsMoJjEcsP31ZiMYaxBDi3rpqn1vWC3Xr5DY6H4wL5Xy7NukDAobCzLsGsXbyM7Y25henscXNfAzqn0Ncwf9nAsEmAu7VWKxMKsTIY9CTc/cMzeLpSnRsk8MP13WwpSo3FwHor0fxG/udwrIt1KAPqAfWBekH9oJ7igfjIRYToViZajj/vHHOO6IVaw9LAUpSZ6wRXZlEg6QT7jX5c4K/bztPhWJdEYNwF40mbOqhJWL70VB5RJlYG4OoSqzKcgUR2J+v6L51szhGdXjKd9s9y0XFqXrdnEIk7uzCQdNEE+41+XLD3lfvDisUKyodyirURKyvWBfWDehJQf6jHWJAwFkYENBIr07fpMZ7CWvyueBpdr9LpKmG5v/IlFokOlrEe2P1GjqcTiVjEukh5EomYCMZqZZauvJQ2/ds4MXJvSZB7KNFamQuv+rE5R7TnrWfJ09vMFgMn+dd3/YQ+dv55gWQnFkFE870vXBPY/xPf+gYfB8fDcQX9f0aKWBe7cgPUC+pHiKV1AXFlYXS3ZIdclStWHU9r19xhrg2OfodawEn+zwsOp5uvWx1IQyxLyTLytQ3cvcZ2fX/8XndXeoAdDuQb+Q9nXcQdxRsxE4zVyhx77lcHPbylt5asV1804GTCTex5/SlyNxk3ISEAPdkh+wp2v8E+OC6wE2ek6OWT1hFAfaBehFhbFxBTC2MVDdCvKlyBMlRRwLrX177GpjwSKzMcPrr7dHNudEF+kW/k32pdUE59ndW6xINYQMxdki6aVRd9l68qdFKJlUElwjzrI+gjBccTdCujuxsdWT/j7G8TzVoRcj+xLhLk6v8rUlAeGfyOcop1QflRD3LMeBELGDfBhBrLIqJBQiVZx9ra+XIMR4jWylhFYxWE++D7tPmiB+j9K57mKZZ15DdWsUSCWBe7YRTW8qH8qAepk3gRCxgXwUQylgWVolsb/ZaB9fYBrkYEjcMhIBolBiRdNL7CpTxd9uo9PJVlwEIxfxOtWHTsgl27sopQ4kksYFwEE8lYFgEVdMJ5VwSsDMw05q2iAcOxMoBFo5raSEmtleRuO2AIQgWzyy67gOjq3/IUy7xebcd+8ptoxRLKuqBcKJ8E+ZhH+eNNKMK4CCbSsSzhGGl/jA5OOtJHrz1FvoPbAtamf5Wf+r9VxlOxKtiO/eQ3VkbS/5JojFsME8lYFgFXlzWIDPeIxVPPrzPnoqPwf3MClkNcjp5kW/ZNw3tkJBzWcqHc8WpdwLgJBoQayzJcxC3lt65n0fzz7cgGLgGJobo/aqfZDZcGxKGnWdtOp5kvH0qps6OzbAD5CeWOEpFxFQwIN5ZlJCxcciiVlpawaCKxOMgLYql5O1UTujCHxcECcV3NIsF8w2lL2H3axVvBwP9GwjtlokV+G6+Mu2DGkqw0Y9Q3RIOTFUnle57+CQui+cY7yL1qGcdaXb97jNcB9xXfZ+tiZ2Hqn/gH9bz2Lqf+A42B+bMzMzkhH9Ey65CyiPMeC+Lyxc4AlXXW0YWBVoQEifD51p5SCYRh9pee+XWqb+mkso+qeF2fuiRebOvg+QvPOJGngrikjJXHkn/JHHJt3WW8il616FzFU8i3aXA/DMSlA8FMOcsc3pCarJqDgx9mW/fszwflTZD7YVIebJNOu/akudTV00+V5gN0LY3GoyrWvMeKcbcwet+LHXJl2ZlzqdxQpCURiyX5iCXkmT+H0srn8NUOcNyOez8XSAAuCSIBmPp/chbPAwToSK7rZ9LOFRX04e3nDEpNlb+kll/eTb5dqsnv9RnTCEE57AL5wuxUKsrLoKOXltG8ObPYzYrFiQfG1cJALIgbZGpFhAJTDvdS5FGVqlkYYHcfBleniAlX75VfMyyBnEBvczP1v2d0xqUvxyDtwZ1yoPsTv+Zp2pPX8DyERLd8jPwZhdxassOfUUKtz+2m7HNWk3vhIeRrbCFPv5f8udl0/93f5HyKZUQZdMTKAN3CUPYiJXpjEHt7Vw919ytLpixmTU1tXFibcW8l2YlFtyoQS1FuBuWb7/nXr8Jw1kXHerVDKFaxuDoPBlL6H1azWABPlVgAtvlLIRwjHsEUySo4l9tFSemp5E3yRGxp9PLo5ezuN67hLHW8rHR14aj6QL0gvkGS+ooFMW0lScGlIkQsqCRUlh1nfuHOQK8o0OcFxA7uOcYQAVgXT3GTcYLnrOKTDYuRtONl8lS/NyhhHRiy7YO/kWv2caZYCjlZcbnd1L+7luhAE732wdAnHq15tnvjFOjv6+UE0YhwACxuhulacWHFyk3FrJWEwkrBASpDWjnA+oYCXI1zT/6KuTQ80HPLTyQq4dCKqwYl3xGXUH/5qSwmTLGsb6PuBnKXnWQeaTBJS+cOTKca3zIIB8SATjqr1Uzq3klNHf3KHRnCQdJBPeXmZHOKBTETDJCCy5UjWCtJaO/upfTUpMDzOQG/b4Ovo9P25EE0fAugvmpQ8rlnqQwtJ9/cy3jat8NrrO8e/MoOz9xTyH3IMUY6bDXlf+c75haDpKnGM9ZWZLgGSCk5MWBF7EA5EbdAOIhh0GrCus6ODiOWaW3jJBfbeBIzwaCwUnBUAioDlYLKwVWGMSIYLS9XYPZhn2ELhFZQJLz2r9+ac0Yc4q3LD0yRYElkHgLxrjsmkABaWLxt11oWD5Kv6l9E727nd/K66rsJL4xu/P3gZ5AivREKMUA0x15oCA7lRHlR7jmZNVwfBxqaaHNFFU9FKECsiwTB40nMBCOFDRTeFA5aRtbxrL5DLjDnDHBl4mqVloe1eSotKqGxMpeb2f1t83iK1Oc9ITAPkdz6f9cFki4a7IcpEn7vnV2srJcSy7Qi8tVuIteBA9xZ5/f5uF8GWP8/rIsMP0W+cVFABOJ60HckoNwo/5KprQGB8IWl6kvSno+qeBqL1lLMBINOOb3wSCvL/QGxiHURscBtwR3BRKOSdYLd9fV+uIun+Qvn89SD97mb6PPgzVeM99vJVLD+xq1aQS4VlPurleDbp5B/6lRqrT2gBOOnnJKhNw2teYM7AhBBW3UliwfuB/GZWBkRDeqD9zXFYU2xIKYxjBQc4kGyE4vEOXBHUrmYCviNFQx7xJVc6f6QTyZimb6NW7nFhKl1XtDFArFxUvvp8y68slW5pd6qPdRYtYsKVl/M+7t7+/j/wbrob70Eeh6Rd7heUNuTypYGYF3xiqttRYO60ZmUryyTd7VJ4UUsMlBKxAJgXVChUtFSyQC/CRb46sA6BEvghfqf8lSw2y95cTl5tynhKAsD/K0d1PSrXw7cHrABeUMerVhdccXWLTwVi4p6ENEAqSukUC9kEsL1qA+XmFoYFFySiAXxyIFk46NX7LvNCtUrFesEERiuTPSefvbaIE9FosVklxSehc9RzxPz6Jn7nuHkOfHNIfuhX8fXb3zk0wpuD/hDvHhI8ghE9NI8BnA53AgwXXNl23SuBxGNXk9I4dB71EebmApGR8SCp/yk4qxJKlWQwFc/IaFwZ2YMTUoISMlnbQmkIfvkGifWjua9eyklaxu5MgzBWGMW5A15lCY1BI8WEAj0qWjlEjeNehDRREuwHvXRIC4EY/3oglSanoCIRq5MO4ZTwSFRQS4FsSw66LMBcEGh8sDiN60mhCPWEuUKxnA+SjEWYgHxY2FM6xIKqVTdJQFcwXIzz3qTb8REIBYryIM8DmvND8TPolFJbyEiyYUhiJWJJ2IuGFw9kQStekUjjRboEY40BSO1rIQ7BSNFrKY1BSOS+hkvYi4YVAaakeGsCwhVudYhD0JG3Z+oad2b3CxGExp3kvUUMQdUywxJgeY1N9fDECxPicyYCQZB11g17YTimQP9Hej/WOwyvhhrhzSNuV/FTNJKCospFMC/M0nauZl6kjeYS4MD3qQ1vxjU46vndbSI5s3oo8WoC8a3Yy8XJPPCc3joIwqkP+1oJVQzUfpookUPOvfuqKSi1WdRU4Xx8Qjp5kcKi2ZVgIgllHUZbtAdqqx2dSTiCPdm9NFmVAWDzLqLC8i9bCmPwnefcQYXSLYFAz2j768f/DanSDuodKyDmha2GJ/aA9xtb7EoQ5rP1mQ2uUEkYhkJKKtVNKgTa6+xEM3TpKPJsAQDCwIBSJJl4M9MJ9dpy8lzRDl59xlXNUbchyoIKgsVgwqTFEosCJRh4uv2Gl9bDeeO7IAgIsEa7OK+lNybCseiTFfALSGvyHOoJrKIRhLqJFg9jNbTpNEStWAgDlgQuBwkqBqZxTRj4+M88sx/3KFE++rJfTDyz7+gYvQUDpyAUE3oqTteoh0vvEoLf7beXDNApGLRkRgIwL0hfrGOhSkJ8Y1H5FUEHopo6iGap0lHi6gGgfu//3vyLysn9/Il6pc9KsrLIerzqlKmkC8lme/kCrjd7+roUk69lfrbOqn/zU2UduUnza3DR65QEQuuYNwWOH7ZUfzw/LpXn+NeVV0wGH4gMUs0YmHrosUwQGIhEYz3vT9R5YP3UPnpJ/BbwOsypnDejs9q4v9fu/L8QB6B9PiO5kuaYd3HqqPOSlQWBs/p+PcpH75BBXZepbP6FiI8y3PHY+T60cMsEoCp7z+uI++nv0/er9xFLSs/RR1fH9nboiAUO7EEG9pgZ12GY1l0rGIBnsM/xdNQII/imiTvenlGyniJBQw/6C3KJdpfT96NOzjA9dc1kP/an/INOkwRkAGYy+GA96PAjyPwQ0JFS0LlI+kBobyaA8C6CLj6+q69PWqxWK2LBL14EtL34+A39oK5JeRV8q2XRcqHssq7cQT5H8H+VyyIyiUh4+lXXUqeGSroK88wRPLEusBTgohtXNddTL5v3RcIxPRgN1Ifi4qzGxIAxK9/uGkrzZrt4mYsKn7avPN4fXXlM1Sy/mm2Lsiv/wrjgTXXAw/x1I6MN/5gzg0AwXSf+gXOf9azxjNL7WdfQ+7vDYzjxfFxdSMvoMN8wrKl9p+UW3JKYB5uCB2UekwCgdiB4Qx4e4OdSMbTkgRjWIIBHlgYhf+DvSwcnlci8fziW+yGgC6Y4YglVNAngpGhj0ed+WV657lfBoQz7bM/CIhFyGoaKsL2/MJBYkJ+c3c8z2IRpAy6WATUSfUjN1N2Tg5lFw0025GXBUd+mra/+0dePvbj54cNYkVEdqKJB7GAqFwSMo0H1fkZZCUUL2IYBSyMjrijkRBOLNPmDh43K2B9/o49lPbYf7MQJIUCwoIo0NJDn0ZLufExC52/pw18TNTK/GVLqK21ldrqmwIJfLg1+GeN7bCWWUQSL2IBw3pUVpSPZjVADCMPsru/cgn5fvH4sKwLEAsTiXUBYmHAEpcR0+SfaAzilhgE8QfiGCuSPwFicV1bRr7v/3tQ7BWsHKgHOZnIk52VEWBhQCRWRixMPDIswQjsotRVKRYFlgaddt7/eXjYggGhRPOvZ4yWxTHHGz2wumCOP8l0I5pQAD8lsHFroB8FD5wh77BC3ZcOuBjkN2/VibZigYU5pzud5+XVH/qVL4IRavfXcPwiRCKYeBcLGJFggFgbCAd0l6oW0/otwxZLKMQVJfXv4YrVO+9YLDZCARCLzIPOYz8TCHTljjV+g6AWiCCsYglXFquVgWuSGAaBL3p6w1lPHf/KW8m1/kZzKT4YfrPaBFcZEq5KfgmPamqPlVgQK4hYUPGDxKLASUeS542AVSx2yP0iCAXiQP51sYwEV5rRUYe8Is/Ie6CFdKuKrazJAkQTT4zYwtjxmx9cQyVLTqILLg4/xiUSrJYFFS/N6eMXXTTEogjBxFJdt4vyLriJrQwsDATTVHoCi+Mzu96hP8w5ytyT6P/986/c8eh74Ed81zsUVgsDYGUQ/Pq73w00r6UMtpZGRHOjauGpef+zxvuI48XSjI1gfnU3/edze4a8sSlScAVKZeIkSIBrFcuKUqN73U4oIJxlgWuCJYFlebKugi558iH+DcSTX/Nq4DiIfYYrmqy7/8xTCACP0VpFA3ThSNnXe86llTdfxOviSTRjIhjw8NSl9OljzxiRaHTsxGIVhD6CTtxMKHRLAssiFgmCQWcd5kU0j3/ic2xt5PZAMOHogmGxwFJoBBONkHrOk+Yc0etvvmHOGaz0/s2cix1jJhgEwy/e9dWQY1VDgYpHfwrAcIIDqcaofIjlxLP/i+cF61DLSMQiyG/lN6FEg6A4d/2feD6YcEQwpY+qFpJFLIKIBlhvQnKge7YxtHP9D9bQsdvvo47rH6TsNTfxulgz4qA3GE2vPEQH1j9qLkUHHmqHWGTsicQoVrHgZI9ELMGA5dGDXaslA5I3eQBfQGCuiwUjEK3YfYBDgNsRFyRALG0X3WIuxZYxE8zMwoEXEUYKKp/FogkFqaG4kU04wD0eSfqTiUijIRaIA7EMmtG6dRHRSJ6EIaJB0KqL5d3gL5pGmezuWMezaMZMMCD9vtfo/Hv/ymZaT1aCCQUnSU4UOugCHXM2jGTogi6AUCAQlr4aW9HYieXIRQPL2hRWRu90BPo+dgFuPIhm2IKRDrtQzL7/Z9w/gyaxnja++hZvxzGQrEKRQdpiScS62AGhjHScixURKdCtjBWraELhLjfiEpkKetms+xz7qPH5PhESiLVohiUYnGR01oUSDbrwj1y1gv527bn0t0cG3zyb98U7+bfoHUZCkxUJV69cwaEQkYy2UIJhFY0uKBFN0l9eG2JdOp54k08+li/KH3h/XzgC+8I62bi0WIpmWIIRsej3UnQCYlFCOfezqzmBnukncxKhCLjpJykUwUQyKK4ZRYJZFmAnmmBYrUrUKNHoVgbESjTDdknBxAJq9u4PWBURCRI6yJDgppAw4IoHXRVP4cHMSLj5h7EouhVJSSnjY+mIQHp7jeY27iPZiWk4SMedjp1rEtGkrn1/SBMa1iXz9st53tqnpBPJfSUcyw4cf7xFMyZB76e+eDknQYQi4AE3fr9/XQOP1EOSdcHA3V68f1e3JP3JtZS0P9UQyyi0kKyghzeYKxKs68QdCVhOu/dteqRq4BkprENfjNzBtlqPNd/83dD7SjZWBpZrvEUzJoLRefGOLwVu5Omi4Pf6q8QfgtAGXGEe7grd9iIOpKS+Eq5giEQSi0UxFmKJFPfPHh9iXXTcfzKGOEA0sDRIvVPauCywLhABOuYCKKG0vbeHk/xWJ9aiGVPB6JYGg614vIwki1AiAQLRExhtsVjdkZ0rChXbhCLlhX0sEqS+L/yZT7Lei+t73Pg8YPbhszgNwbRcdqLhY1it0hgwKoKR1lKwVhOGOcinZHjguDkGOBhiZXhcLca4SNKAUEZTLNJjHG44g749nHUBvk+dwgn7uS8Z+IC6iESmgLer/eQ3vnkDF5Q1jrGKhkFexlg0IxaMVSzBRBMtAdFc+p1Bo+JGWyhWZFSdjm5lrD3AodBdje0JtiGwn2lNICJdVNb4KNLjjhajcvNRF0mo1pM8ZhvOwuggzgH6sEkdxEfWFk00wLJwZ6E5hEE/FraJOCEQ9BHJ9mDWhU+gOqmwCClfO5t6736W10uLSQeCGrLeFAR+D6FIbCLzmavN8crA7EUWuPmu9TaPBaN2txqiCSUWMBzBCCIcO0RMds8XhUMXDNCtly4YoMc3doLRrYMIBohoooGFoXXcWQU0SDgmss9YMmbDG4IxEtHo6AJynaxaXhW7uR8nWtFEKhh9uAMIKhjtBGc+eB1bJggGJ5jX3aSa0hnaByzM/a3wviIaYIpQBGHXKhprsYAxb1aPCwXmC6DRt3Pp93h+uEAkwbD2ywRDxAJYLBa3A9chyXXCEYYoLO5FkP2s2yEOaxoPxl0wGIGHFhOa1sPF6p5chw68TQrBcrSiwTNLemAdimCi0a0LQD8SUjj8nd3kykiztzSaSFg0OohVxqEZbWViWBgLIppwwsF21w2/CnQmimisVsbaNwPR9KxayicMQhniigrSDWu38PCBK99iIdDnwv0u5u/clTXkfuZtngpDRGLC7gjuEGmcRRMTwYzEytgFv64ZQx/8gmh04dgl2UdA56KdpbFrhfGd9cef4d5YTupEi1isDDrxHwx9U5brAS0ortjHE8QvEEYgkDaRlpJ1/XgRkWAQqI732xpHCxGFXQoGRBPKnaD5jXtj6CeCaLxvbebkqhj8hilrb60EvjjZYkkCFsUUCmNaI95fNb0hEhFKAGWZcBzcQhhPwgpGxIGhB+P5tkY7gjats4Ze1dEiwy3keXEgwpGEZe6rCTMMA7hnFgXtD0HMgp5c3f0MQRONJAGi46TdVhgvwgoGHWO4GkfzbY01VXvJ/6cfB9xSJCkUfu3jomMJ4hKrWFAX0g+EeTTtw+F/daMR6IqgxLosnEF0z1fIXWC8SoVFI6lg4LuY490y0gkrGNwHGs23NUIsoL62ng78/L9YNJEkFo6NG3E9eSe/iNF13zfMNSNHtzI6QS3ccGlsNUQDoSB98UJzgzoxSjSSrHDQGyMi7rgTFwTLMprPTAOIqKikiEUkU5CWMeBq8raYA6WWzCFXX7+64nLIl55m+yJGf5sxXsa1s5qnvneMZ4iYCnvLCDHogrSzFOK2sJ9VPLiQZDvmYY10t4R4Ay4ko6eZOlPzuG+GxYAXS+pARAK2qWXfu1uM5cYOI7BGbKOmsbAwUfX0QjThuv+Hiy6a0rKhzUnZ7vqU0bqREwYLA9FALHi33mhiFY0IAlhFYycYbPccfRivQ3AKsQARDLAVjQCxNLYQ7VKBrSYWECvBRNWsHiuxAIgkmFh0EPvo1sD/iW+PiVjCoecB6GLCvIhNWlAilgB6R51uVSywoHSxmMFwrIhKMLEGgkKyisZlfhZvuOBYdkkXgR3YRxdNpKCvBgLgprFyN7AicFlDEta/+IYhFlgkJZZgnXnjxbjffBwucElifazuyX3LleS76X7eNtrobimYgJAHiMeKuCmrqOSY6Almq6G1gHQ6fmsM0cQ++uAriCkWTWqQMIIBwUTj+d8bx0wwQE5wKIujiyaYQATdtUuLRzr59I44CW5lXkQTS8EklEsKFt/g7eTh+mqCoff1DPcYQNwTEgSip5R3HuXU9tefDYkDcdKRZOA3XI8kAdtFOLEmIsHE460ACZLRl0MNytdLX02Uyba/RyUduTkZCrEqEI4IA1MIpWF/HadQAT0LR1mZYDGK7aDwGJBQLslKxddX0szyedT7yZ9Qd2cXTf2vn5tbIgcBNIQH9wbg4gAGeel0PPV3W5ekCwVAwBAGXKYQSiiD0IZXwu0gKIZlYdejb3v8hYH140zCCwZfEenszCNPbQW1nnVr4MTrQBAA22ReJ+cfNw75rQhHxxqbABGKCE8Xhx5zRYRFMEPiFLVdYpxYiAUktGCAiKanqpaXceIFEYicNJzAll9cwlbJivxOF5XVUthZMBEKiEocwTDHt0AYsRJFKCaMYICIRoAIIBD9MzjixgA+HyzUL/hywNJYfwN04VgZFaEkCAnVSgoHBKAnCCAY2O7OKw2kou2/DPsbCMMuTSYSXjCwBPiYFr6GBkQAAAKwQ8Ri/agoCPabySaMYEwoCwP8GSUsBBGNHdiG/RyiJ2EF47v6Lk5WXMUL+etskRBqPxwbQ1PjsQ8qliSkYHAS0bmGJi3m511uvAsO+OsqiHatNZciw9dcM8iVAf8S49GVrF/dxMLxb3rSEY8iIQWDEXHolaWPrwx8Ic7VWUuu+/qJbnqbBYAUCdgvSasGEQ0+JOa55pP8OWX8H3xDKdzd68lAQgoGva4fLV9A9NJ6/qA6RCJ4Lj2LXJVHm0sGsBB27gvoYvG/PZP8t++l+Z2fYHF4d5iiU/8Hw1LRcacPhJ+MJGw/DE4cBmTvKs2hMl8yiyjrhmv404KuZUdRf/ofqPvbO3nfwOg387sH6IuZf/HFRHNWBdwXhMIoa4KPoHoffJAFgvHMOngH33C/nzARSCjBwErg7q/1iQWcRMFzuXGXd2NRF7/eFS4Lnxd0r1pGdOnHeRsEM+OlaYGxKv4vzqCuzzxhuDdYresu4ycROq64iTJu/hr5H/wLCwlf+ocY6ROH8nEmIwkjGIgF1mROTSs1nLaEvx8NCwPLwR/20si79bt84gOokw08Xx34Mr/3nj8b4lBxivfXxidqeMCT+Zll/8wk8r2+jUXC8RKwOc5kI2FiGLRaDtmwndwXrKSCh19iqwJrg5M45cEHqODlh3k/TBGwyskVy8Df2taA1UEc5Pvremq87OMsOh7GoETUcPkV1HjqZfybntk5LCQcB7+Rzy9PVhLGwqBJKy7E/ZtvGcuaC8GHSVkkajnS2COci2P3tnw6tZ9nfOPAGgtNRhLGwmBAEk4UxAK4iQu3A5HUG8VwrzBekgxrNOU3twdOPFyX1W0BHAvHrb8ymZd5v29cxWNhYFW8+z5UKnHxQCgkiAVilG8lTEYSslkN+Co3LYrv+eep9bfXU/PMIj7RnnKzA05th2hwokM9fIcAGELBfnNPPYZjFgiEBZnkCTxQh8FRnXddQyXTJ69oElYwAMHn5usuobrvXMIj7gDcFAexM4r4hLt/dJwRg4QAHYGIjyAw78Yd1PXHmweeukweeLISyFfvJysJLRg7EJiC9i/ewhZh3d7sIQOvraAPh4dkKoEhYO7r6KbkzDS2WpRtPAKiP7YLJquVmXCCabn5cuNEr9dexx4GCAovaUR8Uvmrb7O1gmjyS4ybkzJ1SLCOOztwleNqB7oVgIWQb0afdN7gD3GGo7enl5KTk/itEDr8SG6fl+c7e3t4Wr1zN3/ncbKQ8BbmiBOOptr9kd1ojJSU1BRa9/eXWSBCU+1Baj7QSHX7azlBjEgdbR3mHpODCeWSJPAdDWCVRDQQCywWmOyxzISLYUYTiKavrz8Q04hoJjOOYMIA94Q4SEQDJrOVmRCCGYs4RgeWRkQz2ZlwFkZOqliD0cIqmslqZRyXFAXhRDMZcAQTJfOXLAzqniaDlZkwghnrOEaY7A+0ORZmGEzmIHhCCmY8TqSIxoq4JZfLxemYQ4+kz170/8ytiY9jYcaIz6y+lG658Yd03n+cTwsWLmDxTAQS/uajDq5sXOEALRhYGlgBWIOx4l/PvMiBsBXEU8tPHPigBMRz060/pESv7gllYcYr8I0ECHfDuoEXGUIsEE2iWxrHJY2QYLGMHRDNQ/f/PqFF4whmDLFaGfC5Kz+f0JZmwgsG8QXijLEklJWxE00iu6cJK5h46iPRg18BokFLKtFEM6EEo7eSxptgVmba3OAvZP7DE48lnGicGGYMEbFU79zDyQ6IJqHcE/phJgrqauV09NLl6OwIJHVCeN14sPbpF/xKHIH/jXlJep5imceRMGEsDLrg0aP6YcV2c01sWHX+6YMsi46+/Nb7G0gJxFwyYppEYEK5pFnmK8Wee/H5gBtAuvLzV9Cdt93B28YLq1iCoYsmEXBimFFGWW1SbslcGopVSPOVVUTgi5QITEjBxHp0f6S9v3BLCHofWfMopze3vGtuiV8cCzNGRHPLwGlWx5iMlFRzLrYgALaKxq5fJpH6YiaNhcHJizWhOvEShQknGMQFLW1tfHL0hKsYTe/xRprZSAD5wB3rRGXCCQa9prl5uXxi0GSVFCuQH53Tzjqd71gnKhNOMDf84EZyJ3noocce4SarJHTqxRqI2CoWrENLCc3xhID7eycAjfUNfp/Xay4Z9HT38HTrext5+18ef5SXxwtUL7r89SmSsniBpATD6xKFCWNhzjz5NHrkwYfJ12+88AcvBUpNS+XWx5LDj6Bnnn6abrvF/nsD44F0/evuEZYvoayLYsK5pNtuvpVFc8JRK2Iew0AIMlgqlvkYTSacYEBnV/wMnhLR4HETPaZKROsCJqRg4u3VqCIaCERPiSYWMKGeS8IThhje8Ps/3s9xiw5aI7hf4zAyJpRgHMaeCemSHMYORzAOUeEIxiEqHME4RIUjGIeocATjEBWOYByiwhGMQ1Q4gnGIAqL/DxPvXR6sozalAAAAAElFTkSuQmCCLi4uLi4uZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBSE9kSlJFRlVlTnEwZTN0WVZXWGE5MjhkOW9GOVlyTTVLOGhSUVVDZEZLSkVVZk5ZaXFTWm41WlRoSTZOMmV1TTQxUnY2WFhOOWMxVlkyWFdUSjlTbXFHbXBSMTlIVTAwTlowa05JVkNrRk1DY2hRMzV3M3MwOXJyOFAweFBPdGJld09HdmUvM1hCZVhzbGluKzM3dXcrLyszZmVpM0c0M1JyTWtTWUlrU1VPT0RTNmFwbW1SL081eXVlQjBPbUV3R0tEVmFzRnhIR2lhaGlSSnVIang0dDlMU2txZVZxdlZYdmNTQkFGbXM5bjYxRk5QemRKb05GWkpraWhKa2lTS29pQUlBaWlLQXNNd2tDUkpmcFlrU1JRQXI1ZGlHQVl1bDB0K0hzTXdFRVZ4Ukxsb2pISlJGQVdhcHIxK0tJb0NSVkZnV1Zac2FXbEJkM2MzQkVGQWUzdDdlR05qNDUrc1Z1dENsVW9GaG1IZ2REckJjUnc2T2pvZXBtbmFURkdVR1lEOFE5TzBlV0JnSUtHK3ZqNk9aVmxRRkNXcFZDb0FvQzljdUxDL3NMQndTMzE5ZmFETDVSSUhCZ2JnOFhoQVVaVGtxOFRDd2tJME56Zkw3L2RMaThVOUxJcWl2S3lBcG1sWjZ4NlBCNzI5dmRPcnE2dlhsSmVYcitqcjZ3c09DQWpvV0xCZ3dVcVdaVys0M2U3ZjNMNTllMjVYVjFjVXd6QkRkNEttd2ZNOGJ0NjgrWitpS0o3WDZYUS9NUXhUMGRiVzlueEpTVWtPVGRPb3FhbjVZMlJrNVA2WW1KajhzV1BITm1pMVduZzhIcTkzdTNQbkRrSkNRa1l2MDcyNGdDQUlZQmlHYUpZQ0lJbWlTRmRVVkt5dXJxNytYV3RyYTZiYjdhWVloZ0hETU9CNUhqcWRqaGNFb1ovbitRQlJGT1hyZmQySkhPTjVIcUlvUXFQUlNBekQ5QXVDWUNJbUxJb2lSRkdFMld6dUhUZHUzSkdKRXllK0h4MGRYU2FLSWlpS0FzL3pLQ2dvUUZKU0VtSmpZeUdLSW1pYXZxc0xzS1BkZVVFUTBOSFJBWXZGZ2tIL2xTaUtnaWlLMnN1WEwrL3E3T3cwYXpRYUtIMmJaVms0blU0V1FBQk4wMHJsaldoWkxNc1NoVk1jeDVtSW14RkxZeGdHZlgxOTVoOS8vSEZEVDA5UGVtUms1RFJpaWI5bXNiL21Jb3FpcU1GZ0pGQVU1V0lZeHFGV3E4M0V0Slc3cXp4RzRnZ1JTQ200SkVrUVJYR0lpdzFuTFVTWlFVRkJGWU5Cam1JWVJ2ci9xb0RCWUVjRWtnQUlBd01EcUtxcTJ1aHdPQ3lEMXVBbEdBbVdaRmNGUVlEZGJvZkw1WUxiN1liSDQ0RktwUUxMc2xDcjFkQm9OTkJxdFJnTWd1QTRib2p3eW9EYzM5OGYwOUhSTWFtbnA2YzhQRHdjZXIwZURNT01PZ0NPUmdGeW1wRWtDVzF0YmJsMWRYVlVjbkx5SWJ2ZEhuMzE2dFdkTlRVMVM0aWc1RHlhcHFGV3F5RkpFam83TzFGWFY0ZmEybG8wTlRYSndwTmRaQmdHZ2lCQUVBVFFOQTI5WG8rb3FDaU1IejhlY1hGeE1Kdk5vR2thYnJkN2lLdlUxZFhOc0ZxdGhURXhNZHM0anNzM21VejNkM1YxYlJ3WUdOZ3RTZElGSHpuZ216SUJnSEs1WEY3YVVtcGN1WXVWbFpXUG5UcDE2ak5CRU9pb3FLaGJEb2NqeUdxMUd0VnFOY2p1TXd3RGpVWURoOE9CaW9vS1hMNThHVTFOVFFnSUNNQnZmdk1icEthbUlpRWhBZEhSMFFnTURJUldxd1VBT0oxT1dLMVdWRlpXb3JxNkdpVWxKYWlycTRQVDZVUjBkRFJTVTFPUm1KZ0lQejgvdU4zdUllOUlVUlFzRmt0VGIyOXZwTXZsb3N4bWMyOTZldnBqU1VsSjM2cFVLbGFTSkJIQXNKR1FjanFkWGdkNG5wY2ZRTk0wZERvZFdscGE1bjcxMVZkZkRRd01tRlFxRmNuQnNxa1JNM2U3M1NncEtVRmhZU0ZzTmh1V0xGbUNKNTU0QXBtWm1iQllMUGZrbTNsNWVkaTRjYVA4ZTBSRUJCNTg4RUdrcGFXQlpWbHdIT2ZsYmlRVGtJQ3QwV2o2TXpJeW5wdzZkZW9KQUpRMG5DK05wQUJ5STdWYWpmcjYra2xuenB6NXBxK3ZMNHo0c3E4dnNpeUw2dXBxbkR4NUVxMnRyUUNBMDZkUFkrSENoVjduazdSRTNrVVpNNVRSdnJ5OEhQUG16VU43ZTd2c0lrcEZMRnk0RUNrcEtmQjRQTExnNUg1S2hUQU13NldscGYzK2dRY2UySzkwSHlVT0dSSURHSVpCZTNzN2daL2pDd3NMUDdmWmJHR0RxTXpMOUZRcUZWd3VGLzc1ejMvaSsrKy9sd1dhT1hNbU1qSXlaUE5VUm05bDFGZStDTS96Y3JBOGZQZ3cydHZiaDgwQUxTMHR5TS9QUjBaR0JoNTU1QkZvTkJwNFBCN1pYY2t6QnhXbnZuTGxTdjY0Y2VNNm9xS2lUbm84SHZpQ01IYTRDTnZmM3crUHg0UFcxdGFOemMzTkNYNStma1A4enMvUEQxYXJGWjk4OGdrYUd4dGxBZGV2WDQ4MzNuZ0RlcjBlZ2lEQTEycVVPOTdYMTRmaTRtSndISWRGaXhiSnU3OW56NTVoWXhMWklGRVVVVmhZaUphV0ZxeGF0UW9oSVNGRFlnTjVobGFyZGJqZGJtdHJheXRZbGtWUVVKRDNwZ3dUOWFuNCtIZ2tKeWNqTFMzdEk2UFJPTUR6L0JEaGI5MjZoVDE3OXNqQzMzZmZmU2dvS01CNzc3MEhrOGtrNzRKdk1VVWV2bnYzYmt5Yk5nMXo1ODdGKysrL0wrOThibTR1YkRhYmwwdjR1aEZaRFEwTitPQ0REOURVMUNRSFZPV3pCRUhBeElrVGo0U0hoMS9UNlhRSUNnb2kyWXJ5VW9EU0I1VVA1WG5lUTlPMHFEUkZuVTZIdXJvNjdOMjdGOTNkM1VoTVRFUmVYaDZLaW9yUTB0S0MyTmhZWkdWbG9iMjlYWDRKNHNQazNpZFBuc1R6eno4UG1xWVJHeHVMc0xBdzVPVGtZTzNhdFNndUx2Ynk0K0VxVU9XeHJxNHU1T2ZubzZtcFNVNjlTbVRZMTljM1RoUkZPaUFnUUZuQVNWNEtVT3lPeExLc3BGS3BZTGZiY2ZIaXhiZjYrL3RONUVLTlJvUGJ0Mi9qd3c4L0JNZHgyTHg1TXk1ZXZJZ05HelpBcTlVaVBqNGVreWRQUmxOVEU2cXFxcndnYkhGeE1mYnQyNGQvL2V0ZjJMQmhBOExDd3ZEQ0N5K0E1M25zMmJNSEJ3OGVCTWR4VUtsVW93WXg1TjU5ZlgwNGNPQUFPam82b05Gb3ZPSkFUVTNOL01iR3hseGlQVDA5UFJnWUdKQ2Z3U3I5ek9Gd29MZTNWMnMwR3FWYnQyN2xOalkyTGlEWW5tRVk5UGYzSXo4L0h4UkY0WXN2dnNDamp6NHFJenlLb3BDWm1Zbk16RXd2M3lXN1lUUWE4Y1VYWDZDcnF3c3RMUzJZTzNjdUpreVlnUGo0ZUtTa3BLQ2dvRUMrMXdnWmE4UWlqYVpwOVBUMDRQRGh3OWl3WVFOWWxwVXpEc013dUhyMTZnNlZTdlVUei9NM0pFbWlnb0tDWEFhRDRkOEtvUDZ0Q2ttU0pGUlhWLy8reXBVclc5VnFOWnhPWjdqU0pWaVd4ZEdqUjBGUkZLNWN1WUtVbEpRaGVGOHBPQUZHdTNmdmhsYXJ4ZHExYTNINjlHa1VGaFlpSnljSGtaR1J5TXpNUkdKaUlvNGNPZUtWSFliYjVaSElHR1ZNYUc1dXh2SGp4N0ZxMVNvWlJqTU1nOTdlWHZPNWMrZitKUWhDcjA2bmN5MWR1blF1UlZHTmtpU0JKUUo2UEI1VlRVM05wdjcrL2dnbDRVR0NYbEZSRWFxcnExRlFVT0FsL0hBN1F2ejk4T0hES0MwdFJVUkVoUHozcTFldjRwTlBQb0hGWXNGbm4zMkc5OTkvM3l0LzMrMmVSRmdsN1BZdGtuNzQ0UWRNbkRnUlU2Wk1BU24xYVpxR3krWFNBOUQzOVBTZ29hRWhPelEwOUYxSmtrQVRHSHY3OXUyWlZxdDFva3FsZ2txbGtpSHdvQWJ4MVZkZjRibm5uc09DQlF2dWFxSUVIQlVYRitQNDhlTnd1OTM0NUpOUElBZ0N2dnp5Uzd6enpqdllzR0VEbGk5ZmpyVnIxM3FWd0NNdHdnUG9kRHFFaFlWNXBibmgxdGRmZncySHcrRVZERW5kQVFDTmpZM3JQQjZQVHBJazBDVGExdGZYcjFZV0hPUkhyVmJqNHNXTE1KbE0yTHAxNjZqOFVoUkZUSm8wQ1R0MzdvVEZZc0dNR1RQdzRvc3ZZc1dLRldocGFjR1BQLzZJOHZKeURBd015SDVQWGxJcEZQay9pUlVzeStLeHh4N3pndUJLYW81YzA5SFJnZSsrK3c0YWpXYUlwYkFzaTVhV2xrbnQ3ZTJ6TkJvTmFKcW1wWUdCZ2JDNnVycGxTbDhtVWJTN3V4c1hMMTdFSC8vNFI0U0ZoWG5WQ25jalQvMzgvRWhReGVuVHAvSDIyMi9MOTFTV3JNcGdTUUxnbENsVEVCQVFBRW1Tb05WcXNXdlhMc1RGeGFHdnJ3OUhqaHdaVWdqNW9remlhcjI5dmZBbFMwaVpYVlpXOWg5T3A1T21CVUZBVTFQVHNzN096a0JmbUtoU3FYRHQyalVFQkFUZ2Q3LzduZGV1L0ZKcUFvREV4RVMwdGJYaDl1M2JYcGJsRzd5SUZheFpzd1pQUC8wME1qTXpRYUswS0lyNDVwdHY4UHJycnlNNU9Wa21YZzBHQS96OC9PUU01THQ2ZW5wdy9mcDFrR3JWQy82eUxHcHFhaDV1YjI5UHB0dmIyMkV3R0c0RUJRWFZLUkVmUlZGd3U5MG9LaXJDazA4K2lkRFEwQ0dwYlZpYW1hWngvdng1dlBQT083aHc0UUo2ZW5yazQ5SFIwUWdQRDhlT0hUc1FIUjB0NzZBa1NRZ09Ec2J1M2J0eDRNQUJiTjY4R2Z2Mzc4ZTZkZXZnOFhqdzFsdHY0ZGl4WS9qNDQ0OFJFaElDU1pLUWxwYUdjK2ZPSVNvcXlzc1NsRmJ3MDA4L2dlTzRZUlVVRVJGeHptZzB0bE11bHdzc3k2S3RyUzNzMUtsVGx6bzZPdUlaaG9GYXJVWkRRd04yN2RxRjc3NzdEak5tekJoMVhzN096c2FKRXlma1k2dFdyY0x6enorUG9LQWc3TisvSDVXVmxYam1tV2R3Nk5BaEhEdDJUUGJ6SlV1V29MR3hFVTFOVFlTQXdlM2J0eUZKRWtKQ1FsQmNYSXozM25zUDI3ZHZCMFZSZVAzMTF4RWRIWTFWcTFaaEpFWnE4K2JOR0RObWpGdytlendlSkNjbm4xcThlUEVLVVJTZExHRmlMUmFMV3hBRWszSW5LeXNyRVI4Zmo5VFUxRkVERTZ2VmlxS2lJdm4zNWN1WFk4K2VQVENaVE5pN2R5ODJiOTZNOCtmUDQ5MTMzOFdtVFp0dzdOZ3h2UHJxcTBoT1RzYWFOV3RndDl1SFdCUk4wMmh2YjBkYVdwb2NQMFJSeE5hdFc3Rng0MFpNbmp3WjE2OWY5N3BPcjllRDUzbjgvUFBQaUl5TWxBT2xKRW5RYURSMnRWcnRkTGxjRkV2TXVieThmRzV2YjIrSWtyYXVxcXJDL1BuenZRcU4wYXlZbUJnQXdNU0pFL0hCQngvQVpETEp1MncwR3RIUzBvSnAwNlpoOGVMRmVQenh4MkczMnpGaHdnVFFOQTJEd1lDRWhBUlFGSVhpNG1Jdmw3UmFyVjVLNFhrZS8vakhQNkRYNjczb2IwbVNrSnFhS2x2Tm5EbHp2TUJaYTJ2ckEwNm5VNmRTcVJ6c29FYmdjRGhTZVo2WFU0ZmRia2RYVnhmUzA5TkgzVE9nYVJwaFlXSFl1M2N2U2twS0VCUVVoSU1IRCtMbXpadm83dTZHeStYQ0N5KzhnTFMwTkNRbUprS3RWdVBERHo5RVdWa1ordnY3OGNNUFAwQ1NKRFEzTitQT25Udkl5Y2taRXUxSjJpWVlSUlJGTDZzaG0yYzBHakY5K25TY09uVUtUcWRUeGhvTXc4Qm1zNFhkdW5VcklTa3A2U2UycmEwdG9MMjlmV2x0YmUyVEJIS3lMSXVlbmg1d0hJZWtwS1JSN1RwSmE0Y1BIOFpMTDcyRTd1NXVjQnczSk5xdlhic1dXVmxaY3VRM0dvMFlQMzQ4K3Z2N0VSY1hCd0JJU2twQ2ZuNytzT2d2TlRVVkRRME42T3pzbE85cE1wbVFscGFHdXJvNk5EUTB5SUpPbkRnUkhvOEhOcHNOd2NIQmNzYndlRHlxbXpkdnZ1VHY3MS9Mbmo1OStsSlhWMWN5b2IwSmZyYlpiTkJxdFlpS2locTFBcTVkdTRiZi92YTNYbmxaR1pBQVlNZU9IYmg2OVNweWNuSVFGeGVIanovK0dHZlBua1ZtWmlZYUd4dGh0OXRSVTFPRHZMdzgrVDRFQ1FMQWdnVUxzSGJ0V3BTV2xxS2hvUUZhclJaejVzeEJZbUlpZW5wNjhNb3JyMkRQbmoxZ0dBYng4ZkV5OFJJV0Z1WUZ1RzdjdVBHL2J0NjhLYkRkM2QweGltNk1iRVl1bHd0NnZSNStmbjUzeGVmay9McTZPdXpjdVhOWVVLSTgvOUtsUzdoMDZSTHk4dkt3ZlBseUZCVVZvYkt5RWdjUEh2UTYzOS9mSHl6TGd1ZDV1UmlpS0FyYnQyK0hJQWhJU0VoQVFVRUJsaTVkaW5IanhoRm1HSysrK2lxT0hUc0doOE1CazhrRXZWN3ZWZjZTcFZhcndmTjhQOHN3REFkQTV3dGxCVUdBVnF2RmNJMU1YMlJWVUZDQXA1NTZDcDJkblNQMjRud1YwdDNkalgzNzlnM2JkQVdBSjU1NEFpa3BLZGk0Y2FNWG1TcEpFdDU0NHczNXZHdlhyaUU3T3h0NnZSNEFFQlFVaEhYcjF1SE1tVE95RE1PaFY1bnkveVZFZDdkQ2hhSW90TGEyWXRPbVRlanM3SVF2Y1RxYWJ0Tkl5UExiYjcvRmM4ODloNy85N1c5eXNDUDRYN2tzRmd2TVpyTWNpQUZnM2JwMVlCZ0dlL2Z1aGRQcHZPc20wbmQ3T2FmVEtiZWZSOXJSTjk5OEU3VzF0VElKY2JkTzdMMG9wcmEyRm4vNHd4L3c4c3N2WS9YcTFVTmNqcXpWcTFkRHI5ZDc1Zm1ZbUJndll1UnVpcVo1bnZjbkpxSThrWFI0Q0lJYXlaejcrdnBrV2x2SjM5L0wxTWx3clhKUkZQSHV1Kytpc0xBUWI3LzlOdExUMDRmYy85bG5uOFZycjcwbXh3aGxUekFuSndjNU9UbHd1OTB5VGVhclFFbVNhRG8xTmZWUElTRWhsZjl1K1A2L2s0eEdJeHdPaDV4dWhxT2NmZG1nLzhsRmhGbStmRGs2T3p0eDh1UkpoSVdGeVVScFhGd2MvdnJYdnc1ckZVcUdpT000K1B2N2Uxa21RYjhxbFVxZ1o4MmE5ZmNubjN6eXZvaUlpQXJTWUJBRVFZN0NsWldWd3o2QW9palk3WFpjdTNidGYxeDRJaVRMc3VqbzZNRHExYXZCODd5Y1pRZ0ZUeVpCUmlyUHE2cXFvRktwWURLWnZCVGc4WGlRa3BMeStiSmx5K2JTTkUzVEdvMkdHek5tekZma1JvSWd3R1F5UWFmVG9hU2taRVR6dGRsc2FHdHJHM1daUEZ3UXU1c1NTSnV1dExRVUN4WXNRRXBLQ3E1ZnY0Njh2RHg4OU5GSEtDc3I4elhwSWRXZ1hxK0h3V0R3Z3NrcWxVcU1qWTM5KzdoeDQzNmlBVWc4enlNb0tPaWlScU1SeUEwMEdnMmlvNk54K2ZMbElSb21hVEk4UEJ3dnZ2aWluQ251Rm15VVpoMGVIZzQvUDc4Uit4RytzWVpsV1pTWGwyUEpraVU0ZVBBZ25uNzZhYnorK3VzSUNBZ1k4UnBKa25EcDBpVk1tRERCQzBjSWdvRGc0T0Rtc1dQSFh1ZDVIalFaUll1TmpTMHpHQXhPNVlrcEtTa29MUzFGYzNQemlPbHJ5NVl0U0V4TUhOSUh2RnZOOE13enoyREhqaDFEMm0walhTT0tJbGlXUlhOek05NSsrMjM4L1BQUG1EZHZIaUlqSTRlMU1nQ29ycTdHalJzM2tKaVk2UFhPZ2lCZ3pKZ3gzK2oxZXZ0Zy9VSkRraVQyaHg5KytGdHZiNitlQUE1QkVCQVhGd2VQeDROUFAvMTB4SmtlVVJSbHVLeEVraU1KUTFFVVB2cm9JeG5yajZZSFFFeWJsTUlreXQ5dGx2SDQ4ZU9nS0FweGNYRXlFQkpGRVNxVkNuVjFkVXVMaTR1ZjRIbGVSUStPbi8yMnNMQndQY013bExKYmE3RllNSFhxVkd6YnRnMlBQUElJamg0OTZrVXJFWTR2THk4UDJkblpJNlkxWHhhSkVLTy90UHVFbGlQbE9CSGlrVWNld2JKbHkwWWNuM0U2blRoMDZCQ21USmtDbzlFSWo4Y2pQNSttYWRoc3R0QkxseTU5YkxQWnB0SVVSY0ZzTnJlbzFXckpOOVVKZ29ENzc3OGZIbzhIQlFVRldMMTZOVmF1WE9uMThnQXdidHc0ZlBycHAvand3dyt4ZE9sU3BLV2xJU2NuQjFsWldjakp5VUZVVkpSWG4rK1habmlVTGhZY0hJeVZLMWZLSUd2eTVNbll0MjhmZkNkTmxkZWVPWE1HbFpXVm1ENTl1aHhJZlpVVkVCQlFZemFicTFtTzQ1aXdzTEN6VVZGUjM5ZlcxczVRM3Bqak9NVEV4Q0E1T1JrM2J0d0FUZFA0L1BQUE1XSENCRXlkT3RXTDBGU3IxY2pOelVWdWJpN3NkcnVNelFHZ3BxWUdSNDhleGZmZmY0OXo1ODc5b3Rrci8zN256aDFVVkZTQW9pZ1lEQWJrNStjalBEemNpLzd5Wlh4ZmZmVlZUSmd3QVRFeE1WNWpzOHIzVFVsSmVkL1B6ODlHazltWmhJU0V3eU5GNGpsejVuaTFweHdPaDFmRFFsbW9FRHBLZVgxQ1FnTCs4cGUvWU1lT0hYZWRGU1EveEZ3M2JkcUUyYk5ubzdpNEdKSWtZY2VPSFpnMmJacFhyQ0dXUldyOVE0Y09vYVNrQklzWEw1YVJvL0w4UVl6VG01S1NjbVR3V2JSRTB6U0NnNE9QRzQzR0x0L21KTS96aUkrUHh3TVBQQ0FmTHlzckEyR1FsVVhLU0lJcHFXcHkzZDBRSkhsT1NFZ0l1cnU3QVFBWkdSbFl2Mzc5a0ZTbnBMcGFXbHJ3OHNzdkl6MDlIVkZSVVY1anRNcmRUMGhJK0MrRHdXQVZCRUZ1ajFOQlFVRjNFaElTL2ttR21nbkZKVW1TUE1FUkhCd3NWMnFGaFlYM05JOEhRT1lCQ1k0WVNmaEhIMzBVYytiTXdiWnQyMUJhV2dvQW1ERmpCcFNUNDhwbms3SGNEUnMyd09sMFlzbVNKVkJTL0tJb3d1UHh3T1Z5UWFWU1ljcVVLZjlIQm1iRWRFVlJSR1JrNVBibHk1Zi9mdkhpeGM5R1IwZWZKSnk2S0lyUTYvVllzV0tGN0FvdnYvd3lPanM3NzBrQlJxTVJuMzc2S1diTm12V0wvY1hzN0d5dlk0UWVKNVBuWDM3NUpYaWVsOTNsdGRkZXc4bVRKN0ZtelJybzlYcDU5d2VMSkM0MU5mWHZXVmxadjU4M2I5NWpScVB4UnhKRG1HM2J0c21EeG5hN3ZUcytQcjRrT0RpNHhHZzBIbXRyYTF2bGNEZ3NoT1FJQ1FtQlRxZERWVlVWV2xwYXdEQU01cytmZjA4WVg2UFJZTTZjT1RoMjdCaHNOdHV3NTlYWDE2T3FxZ3BxdFJycDZlbTRkZXNXdXJ1N3NYNzllbmc4SGl4YXRBaWhvYUdZT1hNbUFHRGZ2bjNZc21VTHNyT3prWnFhNm1YNkxwY0w2ZW5wZTZaUG43NHBQRHk4aEdHWUtwWmxaZTZDOWpVL01zSTZkdXhZMTZ4WnMvN01zaXhIZ2gzSGNjakl5TUM4ZWZNQUFFZU9ISUhMNWJybmNmdnc4SEFFQmdhT2VKN2I3VVo5ZlQyY1RpZFdyRmdCQUVoT1RvYkg0OEd5WmN2UTB0SWlkNVlQSGp5STlldlhZKzdjdVpnOWU3YlhzTlFnWEcrZE9uWHFYOG1nbHkrL1FRK0gxSWhaalIwNzltdXoyZHlxN045N1BCNHNYcndZRHozMEVCb2JHMlh5Y3JRV1FGRVVlbnA2ME5YVmRWZEZNUXlEZ1lFQnZQTEtLMWk1Y2lVT0hqeUk4K2ZQNCt6WnMzanR0ZGNRRUJDQU45OThFems1T1hqb29ZZVFsWlhseFYwTXNyK1lNbVZLaGIrL3Y5WGxjZzBMMGxnbFNSZ1JFUUdOUmlPL2dNMW11OTltczQzeG5RRGhPQTVaV1ZuUWFyWFlzbVVMcXFxcThOWmJiOEhmMzMvSU5KanZuQ0FBdExlM283R3gwU3YxRGNja2lhS0kzTnhjdVF6KzdMUFBzSHo1Y3N5WU1RTzV1Ym5ZdjM4L2xpeFpncmx6NTRJSXFMUzB3Um1oaEVtVEpnV3dMTnRET0VQQ2ZrdVNCSllNSXR0c05ua09pRURRaG9hR1ZJZkRvZkh0REJGWFdiQmdBVUpDUW5EbzBDRmN2bndaTzNmdXhNS0ZDMldCUmhwemk0bUp3Zno1ODNIMjdObGh5MlBTS2pjWURIanNzY2ZrNDl1M2IwZHBhU2tXTFZxRWhvWUc1T2JtWXRLa1NiTForNElpVVJUaGREcjdKVW1TZzcxeWNoMEFhSS9ISTZjOFpkdEpraVNFaG9aK1BuYnMyQ3RrY01JM3Q3dGNMa3laTWdWLy92T2ZJUWdDSG43NFlheGN1UkxGeGNYRHBraVNiUXdHQTNidDJvV2dvQ0I1SmtCWjB3dUNnS0NnSUh6NzdiZVlQbjA2QUtDb3FBZ3Z2ZlFTVnF4WUFacW04Y0lMTDJEeTVNa3kwdk8xTnJmYmpaQ1FrRnNMRnk1OFZLMVdkdzJIR2ltS0FuVzNvY1RCOFJoTFVWSFJrWXFLaWdWcXRWcW12WW1aS2I4aktDc3J3NGtUSjlEVDA0TkZpeFpoM2JwMW1EMTdOc3htODdDK2Z2ejRjYXhidDg2cnk2TldxL0hnZ3c5aTY5YXR5TWpJd0lrVEozRGd3QUY4ODgwM0NBd01SSFoyTnBLVGs3MDRTR1VEaHNCaHM5bmN1V3pac25rUkVSSFhPWTZqUjV3V0o3QjJwS1hWYXVGMnU4MW56cHc1VUZaV2xxMzhhc3pYY3RScU5UaU9RMFZGQmI3NzdqczBORFFnTkRRVWMrYk13Y3laTTVHZW5vN0l5RWlZVENZNTFwU1hseU12THcrM2I5OUdiR3dzeG80ZEM1WmxVVnBhaWxPblRxR2pvd1BqeG8zRFF3ODloSWtUSjBLbFVzbkJUaG50bFhGRW85RUlpeFl0ZWp3cEtlbllMeEcxby9sb2lnSWdPWjFPellVTEYzYmZ1WE5uZG1abTVuWlJGQTBYTGx6NDM3Mjl2ZjdLZmdCUmhDaUthR3RyUTFWVkZhNWZ2dzZyMVFwQkVCQVFFSUNRa0JBWWpVYXdMQXVkN3Q4OW1kN2VYdGhzTmxpdFZuQWNoOERBUUV5YU5BbVRKMDlHYUdnb2FKb2U4Z1dKSkVsd3VWd1lQMzQ4cGsrZmpycTZPcFNWbGJuUzA5UC8rT0NERCs0WlJJUFVjQjlLM0lzQ1pEOTF1OTIweldZelJVWkc5dHJ0ZGhRWEYwOXBhbXJhWmJWYU13WS9ZdlFxUGNubk1LSW9vcSt2RDExZFhlanM3RVJuWnlmNisvdmw2UTJOUmdPRHdRQ0x4WUxnNEdBRUJ3ZERyOWVEWlZtUUdLVTBjOFh1ODFPblRuMXY1c3laK1ZxdGxwRWtpV3B1Ym5ZR0JBUlUrUG41amZpTndLOVNBRVZSY0RnY0dCZ1l3Smd4WTJDejJkRGIyd3VUeVdUNDhzc3ZhN3U3dTBOSnVoeXUvaVpzampMSURnZVN5R3p4U0lPVHhOUUZRVUJTVXRLQmpJeU1ad0lDQXVTcTBEZmEvM2UvR1JxV2NoSkZFVnF0RmhFUkVlQjUzdVB4ZU5Ta0xQWVZ6bGV3WDlNbFV0NVBpUmRzTnR1WXExZXZJajQrSHRIUjBUS2t2NWY2NUZkOU5pY0lBdXJxNmpENEFZSVFIaDUrMGVsMFpuRWN4NUxCQldVRGdpaEhtV1ovcVNkQS9sVitkVWFPQzRJQW5VN25DZ2tKcVRRYWpXaHJhME5nWUNEOC9mM3ZXWlpmclFBeWQ4T3lMSy9SYUpiNysvdmZ4M0hjMnVibTV1eXVycTRJVXFQSHg4Y2Z0VmdzNVYxZFhaa3VseXVtdTdzN2t1TTR2NUZBa2s2bjY5WHI5WGNzRmt1SnhXSXBxYSt2WDlYYTJuby80U0ZOSmxOZFVsTFNZWTFHY3lRMk5yWW1KQ1JFVnZLdjZVdmVVd3l3MiswWUdCaEFZR0NnL0JrYnk3S29yNjlIZDNjM1ltSmk0Ty92YjI1c2JGeFdWbGIyYkhSMGRGRjZldnFmV0piRndNQUF0Rm90VlZOVDg4U1pNMmNPRDlkcllCaUdlL3p4eHhjR0JnWmVKTk1qSFIwZEVlZlBuLzh2dFZwdGk0Mk4zUk1hR25vcU5EUjBRQlJGdU4xdUdkWXE1NFlvaWhwMXAvcS9yUURDd21xMVd1aDBPbm04aHFJb3ltUXlTWVBYTXpSTml3QWtqdU9vcjcvKytwdmEydHBVNVV1NjNXN2NmLy85YlFzWExwekw4M3pib0xuVEZFV0pvaWdhSkVteXN5d3JEWDRMSkUrNCsrTC9lMVhBL3gwQVR1UTNyNnZrQVpNQUFBQUFTVVZPUks1Q1lJST0=" alt="" /></td></tr></tbody></table><p>代码如下：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$sourcePngFilePath</span> = <span class="string">"C:\Users\Administrator\Pictures\qqshow.png"</span>   <span class="comment"># 宿主PNG文件</span></span><br><span class="line"><span class="variable">$dataFilePath</span> = <span class="string">"C:\Users\Administrator\Pictures\watermark.png"</span>  <span class="comment"># 要隐写的PNG文件</span></span><br><span class="line"><span class="variable">$outputPngFilePath</span> = <span class="string">"C:\Users\Administrator\Pictures\qqshow1.png"</span>  <span class="comment"># 输出的PNG文件</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取数据文件的内容  </span></span><br><span class="line"><span class="variable">$dataContent</span> = [<span class="type">System.IO.File</span>]::ReadAllBytes(<span class="variable">$dataFilePath</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将文件内容转换为 Base64  </span></span><br><span class="line"><span class="variable">$base64Content</span> = [<span class="type">Convert</span>]::ToBase64String(<span class="variable">$dataContent</span>)</span><br><span class="line"><span class="variable">$base64Content</span> = <span class="string">"......data:image/png;base64,<span class="variable">$base64Content</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取源 PNG 文件的内容  </span></span><br><span class="line"><span class="variable">$sourceImageBytes</span> = [<span class="type">System.IO.File</span>]::ReadAllBytes(<span class="variable">$sourcePngFilePath</span>)  </span><br><span class="line"></span><br><span class="line"><span class="comment"># 打开 PNG 文件并获取文件流  </span></span><br><span class="line"><span class="variable">$fileStream</span> = [<span class="type">System.IO.File</span>]::Create(<span class="variable">$outputPngFilePath</span>)  </span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span> &#123;  </span><br><span class="line">    <span class="comment"># 写入源 PNG 文件的字节  </span></span><br><span class="line">    <span class="variable">$fileStream</span>.Write(<span class="variable">$sourceImageBytes</span>, <span class="number">0</span>, <span class="variable">$sourceImageBytes</span>.Length)  </span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将 Base64 内容转换为字节数组  </span></span><br><span class="line">    <span class="variable">$base64Bytes</span> = [<span class="type">System.Text.Encoding</span>]::UTF8.GetBytes(<span class="variable">$base64Content</span>)  </span><br><span class="line"></span><br><span class="line">    <span class="comment"># 写入 Base64 字节  </span></span><br><span class="line">    <span class="variable">$fileStream</span>.Write(<span class="variable">$base64Bytes</span>, <span class="number">0</span>, <span class="variable">$base64Bytes</span>.Length)  </span><br><span class="line">&#125; <span class="keyword">finally</span> &#123;  </span><br><span class="line">    <span class="comment"># 确保在完成后关闭文件  </span></span><br><span class="line">    <span class="variable">$fileStream</span>.Close()  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="built_in">Write-Host</span> <span class="string">"已成功将 <span class="variable">$dataFilePath</span> 的内容以 Base64 形式添加到新的 PNG 文件：<span class="variable">$outputPngFilePath</span>。"</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      此代码的作用是，将一张 PNG 的图像隐藏到另外一个 PNG 文件中，不改变原 PNG 文件的图像的任何地方。大致原理是，通过 PowerShell 向 PNG 文件指定位置添加任意内容，而不破坏 PNG 文件的图像。将要隐藏的 PNG 文件的内容转换为 Base64 字符串，然后将这个 Base64 字符串隐藏到宿主 PNG 文件的指定位置即可。
    
    </summary>
    
    
      <category term="PowerShell" scheme="https://no5972.moe/cms/categories/PowerShell/"/>
    
    
  </entry>
  
  <entry>
    <title>赛博文盲式教学：VC6 解决“打开”命令出现闪退、错误的问题</title>
    <link href="https://no5972.moe/cms/archivers/161.html"/>
    <id>https://no5972.moe/cms/archivers/161.html</id>
    <published>2024-08-21T09:00:00.000Z</published>
    <updated>2024-08-21T09:27:07.918Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>用 VC6 写代码的，默认视为电脑新手，因为大部分使用 VC6 的并不是专业人士，而是学业需要不得不使用 VC6。所以需要这种赛博文盲式的手把手教学来书写此文章。</strong></p><p>VC6 打开命令出现闪退、错误的问题，可使用 <code>filetool</code> 项目来解决。但这个项目网上不好找，需要仔细搜索。可以尝试在搜索引擎搜索“VC6 filetool项目下载”看看能不能找到下载。下载得到的是一个 EXE 格式的 WinZip 的自解压程序， <strong>大小是 51432 字节，MD5 码是 <code>e173fb638e8eab8f9864b3186f09e891</code> ，SHA256 码是 <code>29ba2c16ef888e9bc727a051cc2cddb2fa9ada49f4616eff2e829303cdd5fbbc</code> 。</strong></p><p><img src="https://picx.zhimg.com/v2-c0bd68b390d49dbc63393968dc1e3d32_r.jpg" alt="" /></p><p>使用电脑上任意一款解压缩软件解压这个 EXE 文件，找到里面的 DSW 文件，用您的 VC6 开发环境打开它 <em>（可以直接将 DSW 文件拖进 VC6 的窗口里面）</em> 。点击菜单的组建-批组建，然后点击创建，此时即开始编译该项目。</p><p><img src="https://pic1.zhimg.com/v2-6710b9f27c6434a494b907cad4ad73d9_r.png" alt="" /></p><p><img src="https://picx.zhimg.com/v2-565f7563455655207b1d81d257acba41_r.png" alt="" /></p><p><img src="https://picx.zhimg.com/v2-63384a49f9dbcf004f1c4ad97190012e_r.png" alt="" /></p><p>然后前往该目录下的 <code>Release</code> 目录 <em>（尽量不要用 <code>Debug</code> 目录的那个）</em> ，找到 <code>FileTool.dll</code> 文件，将其复制到您的 VC6 安装目录的 <code>Common\MSDev98\AddIns</code> 路径目录下。然后右键开始按钮，Windows PowerShell （管理员），输入 cd 空格，然后把那个 <code>AddIns</code> 文件夹窗口地址栏的 <code>AddIns</code> 拖到 PowerShell 窗口中回车，这样 <code>cd</code> 到这个 <code>Release</code> 目录，输入</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">regsvr32 FileTool.dll</span><br></pre></td></tr></table></figure><p>并回车，这样将该编译好的 DLL 文件注册。</p><p><img src="https://picx.zhimg.com/v2-356101e89303238caf6155708f13c995_r.png" alt="" /></p><p><img src="https://pic1.zhimg.com/v2-b3d2bb6de87f677dcff38c0335328049_r.png" alt="" /></p><p><img src="https://picx.zhimg.com/v2-52ea4148ae527c2def13203bd9b7c69f_r.png" alt="" /></p><p><img src="https://pic1.zhimg.com/80/v2-03d630fe2376b91babf21504df1110e8_r.png" alt="" /></p><p>关闭并重新打开 VC6。点击工具-定制，附加项和宏文件选项卡，将 <strong>FileTool Developer Studio Add-in</strong> 这一项勾选。</p><p><img src="https://pica.zhimg.com/v2-db2e7c9fc2d526345937d074393a7300_r.png" alt="" /></p><p><img src="https://pica.zhimg.com/v2-366d559c2f2c36a2c470e5dd8abb9cdb_r.png" alt="" /></p><p>此时将出现一个悬浮的工具栏，以后请使用此工具栏上的 O 按钮打开文件，使用此工具栏上的 A 按钮将现有文件添加到项目。或者也可以将这个 O 按钮复制到文件菜单中，具体做法是点击菜单的工具-定制，然后打开菜单的文件，按住 Ctrl，然后将 O 按钮拖放到文件菜单的“打开”旁边。关闭定制对话框。这样文件菜单就多出来了一个 Open 菜单项， <strong>以后就请使用这个 Open 菜单项来打开文件，不要再使用“打开”菜单项来打开了。</strong></p><p><img src="https://pic1.zhimg.com/80/v2-b28329005f4cb89ddfb63154393ffbcd_r.png" alt="" /></p><p><img src="https://picx.zhimg.com/v2-7092807321fe55a011aa0218cf3e347c_r.png" alt="" /></p><p><img src="https://pic1.zhimg.com/80/v2-e448b324e1a156d6904a5de1fc4662a3_r.png" alt="" /></p><p><img src="https://picx.zhimg.com/v2-ac06d747003fa4580d33b940be2fd09c_r.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      VC6 打开命令出现闪退、错误的问题，可使用 filetool 项目来解决。但这个项目网上不好找，需要仔细搜索。可以尝试在搜索引擎搜索“VC6 filetool项目下载”看看能不能找到下载。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：base64字符串转换为十六进制形式表示的二进制数据</title>
    <link href="https://no5972.moe/cms/archivers/160.html"/>
    <id>https://no5972.moe/cms/archivers/160.html</id>
    <published>2024-07-07T04:00:00.000Z</published>
    <updated>2024-07-17T00:48:56.324Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>使用 JavaScript 实现一个函数，参数是一个 base64 的字符串，将这个字符串解析成二进制数据，并将这个二进制数据的每个字节以一个十六进制两位数表示出来，每个字节的十六进制两位数之间空一格，每行 16 个字节，返回整理好的十六进制形式。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">base64ToHex</span>(<span class="params">base64Str</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// 解析 base64 字符串为 Uint8Array 类型的二进制数据</span></span><br><span class="line">  <span class="keyword">const</span> binaryData = <span class="built_in">Uint8Array</span>.from(atob(base64Str), c =&gt; c.charCodeAt(<span class="number">0</span>));</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 将每个字节转换为十六进制格式</span></span><br><span class="line">  <span class="keyword">let</span> hexData = <span class="string">''</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; binaryData.length; i++) &#123;</span><br><span class="line">    hexData += binaryData[i].toString(<span class="number">16</span>).padStart(<span class="number">2</span>, <span class="string">'0'</span>) + <span class="string">' '</span>;</span><br><span class="line">    <span class="keyword">if</span> ((i + <span class="number">1</span>) % <span class="number">16</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      hexData += <span class="string">'\n'</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> hexData.trim();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">输入：eJwFwc8NwWAAh+H3pz6VVpRKI5T4EyQicekBLRdCwjCkQ2hXEAdLuDmYgzks4Hl+BUvWmdIexIwnZRe9UQV5qIXGqI4s5KMaaqAVmqAXTht18Qo4S+Y9tJZZMN1ICZMYhYyONC90UoJIQZ/qAA3xr7IzubmKX8wH+4Z5YO6UtjI7meqQJQtSEk5kOnChR0hMpFz8/hq+FNg=</span></span><br><span class="line"><span class="comment">输出：</span></span><br><span class="line"><span class="comment">78 9c 05 c1 cf 0d c1 60 00 87 e1 f7 a7 3e 95 56 </span></span><br><span class="line"><span class="comment">94 4a 23 94 f8 13 24 22 71 e9 01 2d 17 42 c2 30 </span></span><br><span class="line"><span class="comment">a4 43 68 57 10 07 4b b8 39 98 83 39 2c e0 79 7e </span></span><br><span class="line"><span class="comment">05 4b d6 99 d2 1e c4 8c 27 65 17 bd 51 05 79 a8 </span></span><br><span class="line"><span class="comment">85 c6 a8 8e 2c e4 a3 1a 6a a0 15 9a a0 17 4e 1b </span></span><br><span class="line"><span class="comment">75 f1 0a 38 4b e6 3d b4 96 59 30 dd 48 09 93 18 </span></span><br><span class="line"><span class="comment">85 8c 8e 34 2f 74 52 82 48 41 9f ea 00 0d f1 af </span></span><br><span class="line"><span class="comment">b2 33 b9 b9 8a 5f cc 07 fb 86 79 60 ee 94 b6 32 </span></span><br><span class="line"><span class="comment">3b 99 ea 90 25 0b 52 12 4e 64 3a 70 a1 47 48 4c </span></span><br><span class="line"><span class="comment">a4 5c fc fe 1a be 14 d8</span></span><br><span class="line"><span class="comment">可能是zlib压缩后的数据，使用Nodejs zlib解压出来之后的结果：</span></span><br><span class="line"><span class="comment">f3 02 03 01 03 6e 00 06 45 00 00 01 00 2b 00 b3 </span></span><br><span class="line"><span class="comment">00 08 0b 00 01 be 00 01 0c 00 01 0f 00 01 19 00 </span></span><br><span class="line"><span class="comment">01 25 00 01 11 00 01 03 00 01 12 00 01 10 00 01 </span></span><br><span class="line"><span class="comment">13 00 01 39 00 01 26 00 01 ba 00 0a 1a 00 01 1d </span></span><br><span class="line"><span class="comment">00 0f 02 00 0a 38 00 2e 1f 00 01 3c 01 05 37 00 </span></span><br><span class="line"><span class="comment">29 3d 01 01 3b 00 26 3a 00 01 1b 00 24 49 00 17 </span></span><br><span class="line"><span class="comment">6f 00 1c 71 00 15 33 01 15 20 00 0e 21 00 01 22 </span></span><br><span class="line"><span class="comment">00 12 85 01 07 86 01 0b 87 01 04 d9 00 05 d8 00 </span></span><br><span class="line"><span class="comment">07 98 00 05 9e 00 05 9a 00 06 42 01 05 43 01 05 </span></span><br><span class="line"><span class="comment">0e 22 00 38 00 37 00 71 00 3b 00 4a 00 86 01 46 </span></span><br><span class="line"><span class="comment">00 6f 00 1f 00 1b 00 3a 00 33 01 87 01 00 f3</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      使用 JavaScript 实现一个函数，参数是一个 base64 的字符串，将这个字符串解析成二进制数据，并将这个二进制数据的每个字节以一个十六进制两位数表示出来，每个字节的十六进制两位数之间空一格，每行 16 个字节，返回整理好的十六进制形式。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>计算机扫盲之路：教学还是救赎</title>
    <link href="https://no5972.moe/cms/archivers/159.html"/>
    <id>https://no5972.moe/cms/archivers/159.html</id>
    <published>2024-06-20T10:00:00.000Z</published>
    <updated>2024-06-20T10:05:53.977Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.ygxz.in/collect/4276/" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%88%AB%E4%B8%BA%E9%A6%92%E5%A4%B4-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%89%AB%E7%9B%B2%E4%B9%8B%E8%B7%AF%EF%BC%9A%E6%95%99%E5%AD%A6%E8%BF%98%E6%98%AF%E6%95%91%E8%B5%8E-brightgreen" alt="别为馒头-计算机扫盲之路：教学还是救赎" /></a></p><p>不知道屏幕前的读者有没有一种感觉：现在的「互联网新生代」们，哪怕从小就有利用台式电脑开设的信息技术课程（内容上与旧时代的「微机课」相仿）；哪怕现在连 10 后的小孩都可以早早拥有属于自己的手机，利用移动互联网畅游虚拟世界；在但在网络上，对电脑和互联网近乎「一窍不通」的「电脑盲」却似乎有愈来愈多之势。</p><p>年纪稍长的，经历过 PC 时代的读者，大概对 BT、BBS 之类的名词不陌生。在那个互联网的本质精神还是分享的年代，通过一台连接了互联网的电脑，无论是音乐还是视频，软件还是游戏，电脑这一端的使用者仿佛天生对操作系统和互联网的各种操作和名词烂熟于心。从下载到解压，从解码到转码，从安装到配置，只要发布者留下几句说明，几乎不会有人追问。</p><p>而当时的网络冲浪者们，仿佛也对各种为躲避 “和谐” 审查而出现的免责声明和混淆方法心照不宣。从「仅供学习交流之用」到「仅供网络测试之用」，从「请于 24 小时内删除」到「喜欢请购买正版」；从双层压缩到分卷压缩，从修改后缀名到图片包装文件，当年的资源分发和获取手段，可能才是一堂真正受益终生的信息技术课程。</p><h1 id="初探成因何以致盲"><a class="markdownIt-Anchor" href="#初探成因何以致盲"></a> 初探成因：何以致「盲」？</h1><p>前文刚刚提到，现在连 10 后的小孩都可以早早拥有属于自己的手机，可以创建社交平台账号，获取信息、发表言论，这在 PC 时代简直是想都不敢想的事情。</p><p>根据《全国未成年人互联网使用情况调查报告》，仅是 2018 到 2022 年，未成年人群体的互联网普及率就从 93.7% 增长到 97.2%，未成年网民规模从 1.69 亿增长到 1.93 亿。与之相对的，使用台式电脑上网的比例则从 2018 年的 48.7% 大跌至 2022 年的 33.2%。<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p><p>更早之前的数据本文就无需再列举了，但很大程度上，网民群体正有着年龄层越加广泛的趋势，从曾经的以学生和年轻成年人群体，到现在几乎每一个年龄层都占有相当的比例。</p><p>网上曾经有过这样的说法：如今「伸手党」和「电脑盲」的增多，很大一部分原因是因为我国从台式电脑时代向移动互联网时代的转变过于快速，导致新生代对台式电脑的操作几乎没有任何了解，只是习惯于通过手机 App 完成各种操作。说到底，这就是时代转变带来的「阵痛」。</p><p>这种说法有一定道理，但也不能说明问题的全部。因为尽管在许多人的印象中，未成年人对 PC 天生不熟悉，但「电脑盲」并不是未成年人的代名词，而是一种普遍存在于各年龄层的现象。</p><p>另外一种说法是，如今以手机端 App 为代表的移动端产品，在设计思路上就以简化用户操作为先，这导致应用的设置项越来越少，而「智能化」「一键化」的趋势则大行其道。</p><p>（图片）</p><p>从移动端产品的设计思路出发，「一键化」无可厚非。移动端显示面积有限，设备性能有限，用户耐心有限，每多一步操作、多一个开关，都可能会造成用户的流失，这显然是厂商们不愿意看到的。但是，当替用户料理一切的「一键化」模式被搬上 PC，当用户面对向 Windows 这样更加复杂的操作系统，被「宠溺」的用户就容易感到无所适从了。</p><p>所以？何以致「盲」？</p><p>当我们习惯于在统一的应用商店一键安装应用，就可能会渐渐丧失寻找软件官网、选择正确版本的能力；当我们习惯于手机系统对常见文件逐一适配，甚至出厂预装大量常用软件，就可能会渐渐模糊对解压软视频播放器这类工具软件的认知；当我们习惯于使用手机 App，就可能会对搜索引擎的概念渐渐模糊，最后甚至不知道什么是「浏览器」和「网址」。</p><p>写到这里，本文提出一个「暴论」：如今比比皆是的「手机控」，「电脑盲」，大都是被移动互联网的发展「惯」出来的王子公主。<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></p><h1 id="扫盲之外救赎"><a class="markdownIt-Anchor" href="#扫盲之外救赎"></a> 扫盲之外：救赎</h1><p>上文单单只提到了移动互联网的发展这一单一原因，实际上，「电脑盲」并不是新鲜事物。作为普遍意义上的「高科技产品」，PC 和手机一样，都有着不平等的用户群体。甚至从普遍认知来说，PC 的拥有和使用门槛都要比手机高上不少。</p><p>互联网作为一个开放的世界，只要拥有一台终端，就拥有无限接近于平等的发言和获取信息的权利，无论家庭出身、无论贫富贵贱、无论教育背景。这台「终端」，可以是几百块的二手智能机，也可以是数万元的台式工作站。</p><p>当我们在探讨「互联网扫盲」的时候，其实是在探讨一个关于知识和物质平等化的问题。</p><p>也许互联网上很多博主会对不知道怎么解压压缩包的网民嗤之以鼻，会因为看似无知而愚蠢的电脑问题而感到不耐烦，但这是多方面共同作用的原因，而不应将所谓「伸手党」作为互联网用户素质没落的直接证据。</p><p>换个角度看，移动互联网的发展，推动了互联网的覆盖率，使得我国的网民比例，特别是青少年和老年人群体当中的网民比例大幅提升，这是因为手机大多数时候比电脑更便宜、更方便、更易用。</p><p>移动应用设计得简单直接并不是原罪，它不应该成为「致盲」的替罪羔羊。</p><p>本文在此提出第二个「暴论」：要想「扫盲」，那就救救信息技术课程吧。</p><p>（图片）</p><p>信息技术课程，在如今的义务教育阶段是必修必考的基础课程，教授内容从小学到高中，涵盖计算机打字、常见办公软件使用、编程原理基础、操作系统原理、互联网原理等等，可以说完全够用，甚至应对日常生活绰绰有余。</p><p>但是这门课的待遇又如何呢？</p><p>体育中考尚且有「功能饮料」助力，而如今义务教育阶段的信息技术课程在许多地方已经沦为形式，地位和音乐美术课程无异。</p><p>偷课时、面向答案考试、教学资源有限、设备陈旧、教材版本繁多…… 这每一个信息技术教育面临的现状，无不揭示出，信息技术课程已经名存实亡。</p><p>而这，才是「致盲」的真正原因。</p><h1 id="参考注释"><a class="markdownIt-Anchor" href="#参考注释"></a> 参考&amp;注释</h1><hr class="footnotes-sep" /><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p><a href="https://qnzz.youth.cn/qckc/202312/P020231223672191910610.pdf" target="_blank" rel="noopener">《第 5 次全国未成年人互联网使用情况调查报告》</a>, 2023.12, 中国互联网络信息中心 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>以上部分写作时，参考了 [<a href="https://www.bilibili.com/video/BV11w4m1y7kA" target="_blank" rel="noopener">https://www.bilibili.com/video/BV11w4m1y7kA</a>] 的内容 <a href="#fnref2" class="footnote-backref">↩︎</a></p></li></ol></section><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      不知道屏幕前的读者有没有一种感觉：现在的「互联网新生代」们，哪怕从小就有利用台式电脑开设的信息技术课程（内容上与旧时代的「微机课」相仿）；哪怕现在连 10 后的小孩都可以早早拥有属于自己的手机，利用移动互联网畅游虚拟世界；在但在网络上，对电脑和互联网近乎「一窍不通」的「电脑盲」却似乎有愈来愈多之势。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>解决访问共享打印机提示“用户账户限制，不允许空密码”的问题</title>
    <link href="https://no5972.moe/cms/archivers/158.html"/>
    <id>https://no5972.moe/cms/archivers/158.html</id>
    <published>2024-03-14T09:00:00.000Z</published>
    <updated>2026-04-03T02:26:13.779Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>连接共享打印机时有可能报错“用户账户限制，可能的原因包括不允许空密码，登陆时间限制，或强制的策略限制。”</p><p><img src="https://pic1.zhimg.com/80/v2-14b59bf35d5466808a863a1ec0e9e2d3_r.png" alt="" /></p><p>这种问题需要将组策略的计算机配置-Windows 设置-安全设置-本地策略-安全选项的帐户：使用空密码的本地帐户只能进行控制台登录设为已禁用。</p><p>但是有不少电脑安装的系统是家庭版，家庭版没有组策略，手动添加组策略略微比较费时间。</p><p>这里给出对应的注册表。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa</span><br></pre></td></tr></table></figure><p>将 <code>LimitBlankPasswordUse</code> 设为 0，即可从其他的电脑访问该共享打印机。</p><p><strong>具体操作是在连接打印机欲设置共享的电脑上：</strong></p><p>按 Win + R 打开设置，输入 <code>regedit</code>，定位到</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa</span><br></pre></td></tr></table></figure><p>将右侧 <code>LimitBlankPasswordUse</code> 双击，将数值数据改为 0；</p><p>如果没有 <code>LimitBlankPasswordUse</code> 的话，在右侧空白处右键，新建-DWORD（32位）值，命名为 <code>LimitBlankPasswordUse</code> 。</p><p>这样设置后即可从其他的电脑访问该共享打印机。</p><p><img src="https://picx.zhimg.com/80/v2-c377b884a9ecc0efc105d48621f58ee1_r.png" alt="" /></p><p>或者也可以使用 reg 文件，打开开始菜单，输入 <code>notepad</code> 回车，打开记事本，输入这些内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]</span><br><span class="line">&quot;LimitBlankPasswordUse&quot;&#x3D;dword:00000000</span><br></pre></td></tr></table></figure><p>找一个地方保存，然后到保存的地方双击，确认导入，即可从其他的电脑访问该共享打印机。</p><p><img src="https://picx.zhimg.com/80/v2-4a06136fd8c2a559ec1f466b4830507c_r.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      连接共享打印机时有可能报错“用户账户限制，可能的原因包括不允许空密码，登陆时间限制，或强制的策略限制。”这种问题需要将组策略的计算机配置-Windows 设置-安全设置-本地策略-安全选项的帐户：使用空密码的本地帐户只能进行控制台登录设为已禁用。但是有不少电脑安装的系统是家庭版，家庭版没有组策略，手动添加组策略略微比较费时间。这里给出对应的注册表及其具体操作。
    
    </summary>
    
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：Ventoy 不支持 Windows XP</title>
    <link href="https://no5972.moe/cms/archivers/157.html"/>
    <id>https://no5972.moe/cms/archivers/157.html</id>
    <published>2024-03-05T03:00:00.000Z</published>
    <updated>2024-03-06T03:05:09.404Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>按照 <a href="https://github.com/ventoy/Ventoy/issues/717#issuecomment-765857583" target="_blank" rel="noopener">Github Issue #717</a> 的说法，Ventoy 官方已明确当前仅支持 Windows 7 或以后的。</p><p>如果需要安装 XP，则应使用此电脑支持的一款 PE 系统（实测旧电脑物理机可以在 Ventoy 使用优启通里面的 2003 PE），在 Ventoy 菜单界面中选择该 PE 系统，从该 PE 系统引导，然后使用该 PE 系统的相应的安装工具对相应的 XP 镜像在此电脑执行安装。</p><p><img src="https://picx.zhimg.com/80/v2-6ef0abefeae2d272b233ded023f29d6e_r.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      按照 Github Issue #717 的说法，Ventoy 官方已明确当前仅支持 Windows 7 或以后的。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>赛博灯泡：Win10/11 设置屏幕缩放 500﹪ 的还原方法（全称键盘，不用鼠标）</title>
    <link href="https://no5972.moe/cms/archivers/156.html"/>
    <id>https://no5972.moe/cms/archivers/156.html</id>
    <published>2023-12-11T02:00:00.000Z</published>
    <updated>2026-04-03T02:32:57.230Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>近期注意到因误操作将屏幕缩放设置为 500% 后无法还原的情况，因为网上有人提出此问题，而其他人尝试复现时也无法解决了，这里给出一种可能的解决办法。</p><p><strong>因为不同人的分辨率是不一样的，有些电脑分辨率设置的不高，如果低于 900P 的话有可能界面是显示不完整的，此时无法使用鼠标操作，所以还是要全程使用键盘。</strong></p><p>Win11 系统下按 Win + I 键打开设置。等待出现窗口界面，然后按回车键展开菜单，按一下 Tab 键将焦点定位到搜索框，输入 scale，然后按“下方向键”，再按回车键。在这里按 9 次 Tab 键，将焦点框框住“关闭自定义缩放并注销”然后按回车键。重新登录即可恢复原始的 100% 缩放。</p><p>按键顺序是 Win + I，等待出现设置窗口界面，Enter，Tab，s，c，a，l，e，下方向键，Enter，Tab，Tab，Tab，Tab，Tab，Tab，Tab，Tab，Tab，Enter，然后重新登录。</p><p>此法适用于 Windows 11 23H2 版本。</p><hr /><p>Win10 系统下按 Win + I 键打开设置。等待出现窗口界面，然后直接输入 scale，按两次“下方向键”，再按回车键。在这里按 4 次 Tab 键，将焦点框框住“关闭自定义缩放并注销”然后按回车键。重新登录即可恢复原始的 100% 缩放。</p><p>按键顺序是 Win + I，等待出现设置窗口界面，s，c，a，l，e，下方向键，下方向键，Enter，Tab，Tab，Tab，Tab，Enter，然后重新登录。</p><p>此法适用于 Windows 10 19045.3693 版本。</p><div class="note danger"><p>没有这样设置缩放的电脑就不要轻易这样尝试了，毕竟这影响电脑使用。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      近期注意到因误操作将屏幕缩放设置为 500% 后无法还原的情况，因为网上有人提出此问题，而其他人尝试复现时也无法解决了，这里给出一种可能的解决办法。因为不同人的分辨率是不一样的，有些电脑分辨率设置的不高，如果低于 900P 的话有可能界面是显示不完整的，此时无法使用鼠标操作，所以还是要全程使用键盘。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>搭建本地 Unlimited Waifu2x 动漫立绘图片超分</title>
    <link href="https://no5972.moe/cms/archivers/155.html"/>
    <id>https://no5972.moe/cms/archivers/155.html</id>
    <published>2023-11-16T16:00:00.000Z</published>
    <updated>2025-09-04T09:00:25.873Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Waifu2x 是一个图片超分的网站，某些图片鄙人经对比发现效果比 Stable Diffusion 的附加功能要好。而 Waifu2x 后续上线的 Unlimited Waifu2x 不仅支持 4 倍超分，而且是使用电脑本地的 CPU/GPU 运行的，也就是通过 WASM 的方式运行的。</p><p>但是直接访问 Unlimited Waifu2x 的话，模型和 JS 都是从网络上加载的，速度很慢。这里决定在本地搭建一个 Unlimited Waifu2x，这样就不用每次都从网络上加载了，所有资源都是在本地加载。这里稍微参考了一下 Waifu2x 的 GitHub 说明，但是发现说明里面说的要下载一个上百兆的压缩包，再次劝退。干脆直接从网站加载的网址把需要的最精简的 onnx 模型弄来。</p><p>从浏览器的 F12 开发者工具的网络找到原来网站加载的 onnx 的模型地址，将这几个 onnx 的模型先下载到本地，然后再把网站上的 HTML、JS、CSS 都 down 下来。然后按照他加载的路径整理成对应的文件结构。（具体文件结构看下面的代码片段）</p><p>这样再看一下站点的大小，只有不到 60MB。如果只想尝试某一种模型的话，甚至可以不用下载其余的超分模型，而只需要下载用的那一个模型，和其他的 util 模型就行，这样需要下载的文件还更少。</p><p>网站原来使用的 cdn.jsdelivr 速度也很慢，目前找到了一个 jsdelivr 的反代，可以很好的适用于本场景。把 index.html 里面 11 行的那个 jsdelivr 的网址域名换成反代的域名。</p><p>按照 GitHub 上的说明，这里需要将该目录作为一个静态的 HTTP 服务运行。但是这里查了不少资料都没找到如何在 PowerShell 里面搭建静态服务器。<strong>后来从 ChatGPT 上找到了使用 PowerShell 的方法，</strong> 这样就不需要单独整一个第三方框架来设立静态服务器了。先把整来的文件整理成下面的结构。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">PS E:\Downloads\nginx<span class="literal">-1</span>.<span class="number">25.3</span>\html&gt; tree /f</span><br><span class="line">卷 <span class="keyword">Data</span>2 的文件夹 PATH 列表</span><br><span class="line">卷序列号为 <span class="number">6</span>E72<span class="literal">-D95F</span></span><br><span class="line">E:.</span><br><span class="line">│  blank.png</span><br><span class="line">│  index.html</span><br><span class="line">│  script.js</span><br><span class="line">│  style.css</span><br><span class="line">│</span><br><span class="line">└─models</span><br><span class="line">    ├─cunet</span><br><span class="line">    │  └─art</span><br><span class="line">    │          noise3_scale2x.onnx</span><br><span class="line">    │</span><br><span class="line">    ├─swin_unet</span><br><span class="line">    │  ├─art</span><br><span class="line">    │  │      noise3_scale4x.onnx</span><br><span class="line">    │  │</span><br><span class="line">    │  ├─art_scan</span><br><span class="line">    │  │      noise3_scale4x.onnx</span><br><span class="line">    │  │</span><br><span class="line">    │  └─photo</span><br><span class="line">    │          noise3_scale4x.onnx</span><br><span class="line">    │</span><br><span class="line">    └─utils</span><br><span class="line">            create_seam_blending_filter.onnx</span><br><span class="line">            pad.onnx</span><br></pre></td></tr></table></figure><p>然后随便找一个目录新建一个 <code>startup.cmd</code> 的文件，添加这些程序：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line">powershell -command "<span class="built_in">Set</span>-ExecutionPolicy RemoteSigned"</span><br><span class="line"><span class="built_in">echo</span> $port = <span class="number">8080</span>  # 指定要使用的端口 &gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> $root = "E:\Downloads\nginx-<span class="number">1</span>.<span class="number">25</span>.<span class="number">3</span>\html"  # 改成整理好文件结构的目录的路径 &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> $listener = New-Object System.<span class="built_in">Net</span>.HttpListener &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> $listener.Prefixes.Add("http://localhost:$port/") &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> $listener.<span class="built_in">Start</span>() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> Write-Host "Server is running <span class="built_in">at</span> http://localhost:$port" &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> while ($listener.IsListening) &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     $context = $listener.GetContext() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     $response = $context.Response &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     $filename = $context.Request.Url.LocalPath.TrimStart('/') &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     $filepath = Join-<span class="built_in">Path</span> $root $filename &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     <span class="keyword">if</span> (Test-<span class="built_in">Path</span> $filepath -PathType Leaf) &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         $fileBytes = [System.IO.File]::ReadAllBytes($filepath) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         $response.OutputStream.Write($fileBytes, <span class="number">0</span>, $fileBytes.Length) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     &#125; <span class="keyword">else</span> &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         Write-Host "Request url [$filename]" &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         <span class="keyword">if</span> ($filename -eq '') &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $filepath = Join-<span class="built_in">Path</span> $root 'index.html' &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             <span class="keyword">if</span> (Test-<span class="built_in">Path</span> $filepath -PathType Leaf) &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>                 $fileBytes = [System.IO.File]::ReadAllBytes($filepath) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>                 $response.OutputStream.Write($fileBytes, <span class="number">0</span>, $fileBytes.Length) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             &#125; <span class="keyword">else</span> &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>                 $response.StatusCode = <span class="number">404</span> &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             &#125; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         &#125; elseif ($filename -eq 'shutdown') &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $response.StatusCode = <span class="number">200</span> &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $responseContent = '' &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $responseBytes = [System.Text.Encoding]::UTF8.GetBytes($responseContent) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $response.OutputStream.Write($responseBytes, <span class="number">0</span>, $responseBytes.Length) &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $response.Close() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $listener.Stop() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             <span class="built_in">break</span> &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         &#125; <span class="keyword">else</span> &#123; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>             $response.StatusCode = <span class="number">404</span> &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>         &#125; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     &#125; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>     $response.Close() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> &#125; &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span>. &gt;&gt; tmp-startup-server.ps1</span><br><span class="line"><span class="built_in">echo</span> $listener.Stop() &gt;&gt; tmp-startup-server.ps1</span><br><span class="line">powershell .\tmp-startup-server.ps1</span><br><span class="line">powershell -command "<span class="built_in">Set</span>-ExecutionPolicy Default"</span><br><span class="line"><span class="built_in">del</span> tmp-startup-server.ps1</span><br><span class="line">@<span class="built_in">echo</span> on</span><br></pre></td></tr></table></figure><p>保存后直接双击打开这个 cmd 文件，看到类似于 <code>Server is running at http://localhost:8080</code> 的提示后打开浏览器访问 <code>http://localhost:8080</code> （这里的 8080 为 <code>server.ps1</code> 程序第 3 行指定的端口号，下同。如果指定的是 80 的话就是 <code>http://localhost</code> ），放上去需要使用的图片，选择要使用的模型。</p><ul><li>swin_unet / art 立绘模型</li><li>swin_unet / art scan 扫描的纸质立绘模型</li><li>swin_unet / photo 照片模型</li><li>cunet / art (201811) 另一种立绘模型</li></ul><p>选择降噪程度，选择超分倍率，然后就可以点击开始来执行超分了。用完以后别忘了访问 <code>http://localhost:8080/shutdown</code> 停止服务。</p><p><img src="https://picx.zhimg.com/80/v2-e25c6799f10a84b1d69ce967482b1abd.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Waifu2x 是一个图片超分的网站，某些图片鄙人经对比发现效果比 Stable Diffusion 的附加功能要好。而 Waifu2x 后续上线的 Unlimited Waifu2x 不仅支持 4 倍超分，而且是使用电脑本地的 CPU/GPU 运行的，也就是通过 WASM 的方式运行的。但是直接访问 Unlimited Waifu2x 的话，模型和 JS 都是从网络上加载的，速度很慢。这里决定在本地搭建一个 Unlimited Waifu2x，这样就不用每次都从网络上加载了，所有资源都是在本地加载。
    
    </summary>
    
    
      <category term="PowerShell" scheme="https://no5972.moe/cms/categories/PowerShell/"/>
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：C语言 将结构体以二进制形式写入文件</title>
    <link href="https://no5972.moe/cms/archivers/154.html"/>
    <id>https://no5972.moe/cms/archivers/154.html</id>
    <published>2023-10-11T06:00:00.000Z</published>
    <updated>2023-10-24T05:40:47.278Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>直接以文本文件的方式写入固然也可以，但是如果遇到数据量大的情况，会占用比较多的磁盘空间。这里收集汇总了一下将结构体数据写入二进制文件以及后续读取为结构体的办法。</p><p>写入二进制文件的话，成员变量就可以直接以例如 <code>int</code>、<code>float</code>、<code>double</code> 这样的形式存储到磁盘，而不是转换成字符串，这样不仅节省磁盘空间，也省去了字符串到数值变量的相互转换的程序编写。</p><p>运行写入程序后会在当前目录生成一个 <code>tom.psn</code> 的文件，这是以二进制形式储存的，而不是字符串文本。</p><p>而读取程序则将当前目录的 <code>tom.psn</code> 文件直接转换为相应的结构体实例，并输出需要的成员变量。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 写入文件</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Person</span> &#123;</span></span><br><span class="line"><span class="keyword">char</span> name[<span class="number">20</span>];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line"><span class="keyword">float</span> <span class="built_in">height</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Person</span> <span class="title">pWrite</span>;</span></span><br><span class="line">FILE *fp;</span><br><span class="line"></span><br><span class="line">fp = fopen(<span class="string">"tom.psn"</span>, <span class="string">"wb"</span>);</span><br><span class="line"><span class="built_in">strcpy</span>(pWrite.name, <span class="string">"Tom"</span>);</span><br><span class="line">pWrite.age = <span class="number">20</span>;</span><br><span class="line">pWrite.<span class="built_in">height</span> = <span class="number">1.75</span>;</span><br><span class="line">fwrite(&amp;pWrite, <span class="keyword">sizeof</span>(struct Person), <span class="number">1</span>, fp);</span><br><span class="line">fclose(fp);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 读取文件</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Person</span> &#123;</span></span><br><span class="line"><span class="keyword">char</span> name[<span class="number">20</span>];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line"><span class="keyword">float</span> <span class="built_in">height</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Person</span> <span class="title">pRead</span>;</span></span><br><span class="line">FILE *fp;</span><br><span class="line"></span><br><span class="line">fp = fopen(<span class="string">"tom.psn"</span>, <span class="string">"rb"</span>);</span><br><span class="line">fread(&amp;pRead, <span class="keyword">sizeof</span>(struct Person), <span class="number">1</span>, fp);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Read result:\nName: %s\nAge: %d\nHeight: %.2f\n"</span>, pRead.name, pRead.age, pRead.<span class="built_in">height</span>);</span><br><span class="line">fclose(fp);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 输出：</span></span><br><span class="line"><span class="comment">Read result:</span></span><br><span class="line"><span class="comment">Name: Tom</span></span><br><span class="line"><span class="comment">Age: 20</span></span><br><span class="line"><span class="comment">Height: 1.75</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      直接以文本文件的方式写入固然也可以，但是如果遇到数据量大的情况，会占用比较多的磁盘空间。这里收集汇总了一下将结构体数据写入二进制文件以及后续读取为结构体的办法。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：PowerShell 关闭显示器</title>
    <link href="https://no5972.moe/cms/archivers/153.html"/>
    <id>https://no5972.moe/cms/archivers/153.html</id>
    <published>2023-10-09T10:30:00.000Z</published>
    <updated>2024-09-26T09:52:16.892Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>使用这个命令可以手动关闭显示器，这样就不需要第三方工具甚至自己写C/C++/C#/Python代码了。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(<span class="built_in">Add-Type</span> <span class="string">'[DllImport("user32.dll")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);'</span> <span class="literal">-Name</span> a <span class="literal">-Pas</span>)::SendMessage(<span class="literal">-1</span>,<span class="number">0</span>x0112,<span class="number">0</span>xF170,<span class="number">2</span>)</span><br></pre></td></tr></table></figure><p>也可以写成 CMD 的形式，这样就可以直接放到运行窗口运行或是创建快捷方式了。</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell -command "(Add-<span class="built_in">Type</span> '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-<span class="number">1</span>,<span class="number">0</span>x0112,<span class="number">0</span>xF170,<span class="number">2</span>)"</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      使用这个命令可以手动关闭显示器，这样就不需要第三方工具甚至自己写C/C++/C#/Python代码了。
    
    </summary>
    
    
      <category term="PowerShell" scheme="https://no5972.moe/cms/categories/PowerShell/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：Stable Diffusion 通过 ControlNet 扩展图片 / 扩图</title>
    <link href="https://no5972.moe/cms/archivers/152.html"/>
    <id>https://no5972.moe/cms/archivers/152.html</id>
    <published>2023-09-11T17:30:00.000Z</published>
    <updated>2025-09-04T09:00:17.285Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。</p><p>下载 <code>control_v11p_sd15_inpaint_fp16.safetentors</code>，放到 SD 目录的 <code>\models\ControlNet</code> 目录。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c3176a7e74734f46b777ca9883f3d8d1.png" alt="" /></p><p>在 SD WebUI 里面在 ControlNet <strong>勾选启用</strong>。选择<strong>局部重绘</strong>，然后看一看预处理器是不是 <code>inpaint_only</code>，模型是不是刚才下载的文件，如果不是就改一下。</p><p>下边三个滑块不用管。控制模式选择<strong>优先 ControlNet</strong>，画面缩放模式这里一般选择<strong>缩放并填充</strong>。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/ca979174d2794e1ab1ff870139bf7ece.png" alt="" /></p><p>然后在上面的作图尺寸里面根据想要的长宽比输入需要的尺寸（点击图片右下方最右边的按钮，可以直接将导入的图片的尺寸发送到上面的尺寸处）。当然，如果可能的话，请尽量在提示词里面写好背景方面的提示词。然后开始生成。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/83e29154fc114c9bb3cf55e920da4a25.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/b5701d8683ea44dcbe1f1357aa08b3ed.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d82917bd5ed7418e8cec72e972ce06c3.png" alt="" /></p><p>可以将生成的图继续放到 ControlNet 的图像里面，然后重复步骤 4，继续扩展图片！</p><p>不同的采样方法效果差别有些大，可以尝试更换不同的采样方法来达到更好的效果。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>Civitai 通过 API 下载模型</title>
    <link href="https://no5972.moe/cms/archivers/151.html"/>
    <id>https://no5972.moe/cms/archivers/151.html</id>
    <published>2023-09-07T09:00:00.000Z</published>
    <updated>2025-09-04T09:00:12.363Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="域名和-web-网站的域名一样"><a class="markdownIt-Anchor" href="#域名和-web-网站的域名一样"></a> 域名和 web 网站的域名一样</h1><h1 id="搜索模型get-apiv1models"><a class="markdownIt-Anchor" href="#搜索模型get-apiv1models"></a> 搜索模型：<code>GET /api/v1/models</code></h1><p>常用参数（都是可选）：</p><ul><li><code>tag</code> 标签</li><li><code>query</code> 标题（模糊查询）</li><li><code>page</code> 页数</li><li><code>limit</code> 每页大小</li><li><code>username</code> 作者用户名</li><li><code>types</code> 模型类型 (<code>Checkpoint, TextualInversion, Hypernetwork, AestheticGradient, LORA, Controlnet, Poses</code>) ，默认加载所有类型</li><li><code>sort</code> 排序方式 (<code>Highest%20Rated, Most%20Downloaded, Newest</code>)</li></ul><p>在返回的数据中：</p><ul><li><code>items[a].creator</code> 作者信息</li><li><code>items[a].name</code> 模型标题</li><li><code>items[a].description</code> 模型介绍（HTML格式）</li><li><code>items[a].modelVersions[b].images[c].url</code> 预览图</li><li><code>items[a].modelVersions[b].images[c].meta</code> 预览图的 AI 参数</li><li><code>items[a].modelVersions[b].downloadUrl</code> <strong>下一步</strong> 要下载要用的地址（有跳转，API 不能直接下）</li></ul><h1 id="下载模型get-apidownloadmodelsid"><a class="markdownIt-Anchor" href="#下载模型get-apidownloadmodelsid"></a> 下载模型：<code>GET /api/download/models/{id}</code></h1><p>请求地址里面的 <code>{id}</code> 就是上一步找到的模型 <strong>版本</strong> 的 ID。</p><p>访问后会返回一个 307 响应码。响应头的 <code>location</code> 就是真实下载地址，但是这个地址是临时的，要尽快完成下载，不久后就会失效。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      请求地址里面的 ```{id}``` 就是上一步找到的模型 **版本** 的 ID。访问后会返回一个 307 响应码。响应头的 ``` location``` 就是真实下载地址，但是这个地址是临时的，要尽快完成下载，不久后就会失效。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：JS 一行代码实现同步的延时语句</title>
    <link href="https://no5972.moe/cms/archivers/150.html"/>
    <id>https://no5972.moe/cms/archivers/150.html</id>
    <published>2023-09-02T16:00:00.000Z</published>
    <updated>2023-12-11T02:13:03.861Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="就是这一句代码"><a class="markdownIt-Anchor" href="#就是这一句代码"></a> 就是这一句代码</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">await</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="params">resolve</span> =&gt;</span> setTimeout(resolve, <span class="number">2000</span>));</span><br></pre></td></tr></table></figure><p>最后的数字就是延时时长</p><h1 id="示例"><a class="markdownIt-Anchor" href="#示例"></a> 示例</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">async</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"延时开始"</span>);</span><br><span class="line"><span class="keyword">await</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="params">resolve</span> =&gt;</span> setTimeout(resolve, <span class="number">2000</span>));</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"延时结束"</span>);</span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure><h1 id="效果"><a class="markdownIt-Anchor" href="#效果"></a> 效果</h1><p><img src="https://picx.zhimg.com/80/v2-1f994b7b7acf5f4db5d0ca5ac6f3d93f.gif" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      就是这一句代码 await new Promise(resolve =&gt; setTimeout(resolve, 2000)); 最后的数字就是延时时长
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
    
  </entry>
  
  <entry>
    <title>2023 年 7 月中旬使用各种随身 Wifi 的电脑无法上网的解决方法</title>
    <link href="https://no5972.moe/cms/archivers/149.html"/>
    <id>https://no5972.moe/cms/archivers/149.html</id>
    <published>2023-07-19T03:30:00.000Z</published>
    <updated>2024-09-26T10:02:26.480Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>230725 更新：360 已推出临时补丁来解决此问题，使用 360 Wifi 的用户无需再卸载下文所述的系统更新了。下载“360随身Wi-Fi3_解决win10-11更新异常.zip”，然后复制到随身 Wi-Fi 应用程序安装目录下。随身 Wi-Fi 应用程序的默认安装目录为： <code>C:\Program Files (x86)\360AP</code>或者 <code>C:\Program Files (x86)\360\360AP</code>。解压此压缩包到当前目录（如：<code>C:\Program Files (x86)\360AP</code>），然后重启电脑。电脑完成启动后，插上随身 Wi-Fi 3，稍等片刻会提示“是否安装驱动”，选择“安装驱动”。稍等片刻，随身 Wi-Fi 3 就可以正常工作。</p><p>注意：</p><ol><li>复制文件和解压时，系统会提示“需要管理员权限”，选择“允许”。</li><li>解压文件时，会出现“是否允许覆盖”的提示，选择“全部覆盖”。</li><li>重启后，如果插上随身 Wi-Fi 3 后没有提示“是否安装驱动”，应重新手动启动下随身 Wi-Fi 应用程序。</li><li>若受限于 Windows 当前用户权限，无法在上面的步骤中提升管理员权限，请联系您的系统管理员来处理。</li></ol><hr /><p>微软近日推送了安全更新，在 Win10 下编号为 KB5028166，在 Win11 下编号为 KB5028185。此补丁会导致部分电脑无法上网，<strong>主要是使用了各种品牌的随身 Wifi 的电脑。</strong> 具体症状表现为从控制面板的网络连接（<code>ncpa.cpl</code>）打开详细信息，会发现里面是空白的，如图所示。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/bf34689f1c094af4a56722b067422236.png" alt="" /></p><p>遇到此类问题的请尝试将此补丁卸载。具体操作方法是右键开始按钮，选择运行，输入 <code>appwiz.cpl</code>，然后点击左侧的查看已安装的更新，找到并右键点击括弧为 KB5028166 的补丁，选择卸载，确认卸载，然后根据提示重新启动计算机。这样就可以恢复上网并继续使用随身 Wifi 了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/5a6ed2c945c2475b9ca6ca51c6f5aa0e.png" alt="" /></p><p>重新启动计算机后下载并运行 Show or Hide Updates 工具，选择 Hide Updates，将编号为 KB5028166 补丁选中以屏蔽更新，以防后续还会自动更新此补丁。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/35b58be631b24daa8564c1b28a204a20.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      遇到此类问题的请尝试将此补丁卸载。具体操作方法是右键开始按钮，选择运行，输入 appwiz.cpl，然后点击左侧的查看已安装的更新，找到并右键点击括弧为 KB5028166 的补丁，选择卸载，确认卸载，然后根据提示重新启动计算机。这样就可以恢复上网并继续使用随身 Wifi 了。
    
    </summary>
    
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：Stable Diffusion 获取历史生成图片的 prompt</title>
    <link href="https://no5972.moe/cms/archivers/148.html"/>
    <id>https://no5972.moe/cms/archivers/148.html</id>
    <published>2023-06-20T08:30:00.000Z</published>
    <updated>2025-09-04T09:00:03.832Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>不知怎么搞的，图库浏览器点开图片看不到生成图片的信息了。但是据信这些信息是写在 PNG 数据的某个附加区段的（参考博客文章<a href="https://www.aiuai.cn/aifarm1516.html" target="_blank" rel="noopener">《Python - PNG图掺入隐藏文本信息》</a>）。Stable Diffusion 原生支持读取这些信息。并且除了图库浏览器，还有一个地方可以读取。</p><p>从资源管理器里面 SD 目录的 <code>outputs/txt2img-images</code> 里面找到要读取信息的图片。在 SD WebUI 中切换到“图片信息”选项卡，然后将图片拖进来，即可在右侧看到图片生成时输入的 prompt，以及 negative prompt、CFG、步数、模型信息、种子值、分辨率等。（参考博客文章<a href="https://huke88.com/article/8116.html" target="_blank" rel="noopener">《Stable-Diffusion：图片信息（PNG Info）功能介绍》</a>）</p><p><img src="https://images.weserv.nl/?url=https://pic.huke88.com/article/content/image/2023-06-01/6854BFD9-BC5E-1801-D85E-CD9A93C77982.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      不知怎么搞的，图库浏览器点开图片看不到生成图片的信息了。但是据信这些信息是写在 PNG 数据的某个附加区段的（参考博客文章《Python - PNG图掺入隐藏文本信息》）。Stable Diffusion 原生支持读取这些信息。并且除了图库浏览器，还有一个地方可以读取。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：Stable Diffusion 扩展图片 / 扩图</title>
    <link href="https://no5972.moe/cms/archivers/147.html"/>
    <id>https://no5972.moe/cms/archivers/147.html</id>
    <published>2023-06-05T14:30:00.000Z</published>
    <updated>2025-09-04T08:59:58.446Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>现有的解决方案，包括 Bing 搜出来的，基本上都是要收费的，这些解决方案大多基于 DALL-E。某度也很难搜出来一个图文的介绍。那么就应该研究一下开源的 Stable Diffusion 能不能也实现类似的扩图功能。这里临时记录一下在 Stable Diffusion 怎么操作可以扩展图片。</p><p>这里用的还是秋叶的 v3 整合包。启动 Stable Diffusion 之后，打开图生图，下面就默认的图生图，将一张要扩展的图片拖进来。拉到最下面，脚本选择“ <strong>向外绘制第 X 版</strong> ”。这时候会出现选项，选择向哪个方向扩充。以及输入扩充多少像素。</p><p>和 DALL-E 方式一样，这个扩展同样需要输入提示才能保证正确扩展。在最上面的那两个大输入框输入正向提示和负面提示。然后点击生成。这样就完成了图片的扩展。可以根据需要修改附近的参数来获得更好的效果。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/89f556ef29564c159b675ac5642328c3.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      现有的解决方案，包括 Bing 搜出来的，基本上都是要收费的，这些解决方案大多基于 DALL-E。某度也很难搜出来一个图文的介绍。那么就应该研究一下开源的 Stable Diffusion 能不能也实现类似的扩图功能。这里临时记录一下在 Stable Diffusion 怎么操作可以扩展图片。
    
    </summary>
    
    
      <category term="AIGC" scheme="https://no5972.moe/cms/categories/AIGC/"/>
    
    
  </entry>
  
  <entry>
    <title>天选键盘 设置和使用键盘宏（不使用奥创中心）</title>
    <link href="https://no5972.moe/cms/archivers/146.html"/>
    <id>https://no5972.moe/cms/archivers/146.html</id>
    <published>2023-05-29T09:30:00.000Z</published>
    <updated>2024-09-26T10:02:35.008Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="临时记录一下"><a class="markdownIt-Anchor" href="#临时记录一下"></a> 临时记录一下</h1><ol><li><strong>按 Fn + 左 Alt</strong>，此时左 Alt 键会慢速闪烁，表示现在是录入宏的模式。</li><li>然后就<strong>录入宏指令</strong>，此时按下的键会亮灯，并且按下的键也会在电脑生效。</li><li>录入完毕后<strong>再次按 Fn + 左 Alt，然后都松开</strong>。此时左 Alt 键会快速闪烁，同时 F1 到 F8 键会亮灯，已设置宏的键会亮红灯，没有设置宏的键亮绿色灯。</li><li>根据第二步录入的内容和第三步亮灯的情况：<ul><li>如果第二步录入的有宏指令，此时<strong>按亮绿灯的键</strong>则对该键设置第二步录入的宏指令。</li><li>如果第二步录入的有宏指令，此时<strong>按亮红灯的键</strong>则以第二步录入的宏指令覆盖该键已设置的宏。</li><li>如果第二步没有按任何键，此时<strong>按亮绿灯的键</strong>则直接退出设置宏的模式。</li><li>如果第二步没有按任何键，此时<strong>按亮红灯的键</strong>则删除该键已设置的宏。</li></ul></li><li>已设置宏的键位，<strong>直接按对应键位就会执行宏</strong>。原有的键位功能会失效，所以请尽量找一个平时不会使用的键位来设置。</li></ol><p><img src="https://picx.zhimg.com/v2-bd21849c7c18899312006fcf18b680ff_1440w.jpg" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      已设置宏的键位，直接按对应键位就会执行宏。原有的键位功能会失效，所以请尽量找一个平时不会使用的键位来设置。
    
    </summary>
    
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：Windows 11 通过 PowerShell 打开 IE 浏览器</title>
    <link href="https://no5972.moe/cms/archivers/145.html"/>
    <id>https://no5972.moe/cms/archivers/145.html</id>
    <published>2023-03-15T09:00:00.000Z</published>
    <updated>2024-09-26T09:52:39.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>收到一条传闻，说 Windows 11 在 Dev 的版本 25309 里面移除了 VBS 的支持，此改动预计在正式版 23H2 中实装。这导致原有 VBS 方式打开 IE 浏览器的方法失效。</p><p>去 Microsoft Learn 上查了一下文档，<a href="https://learn.microsoft.com/zh-cn/powershell/scripting/samples/creating-.net-and-com-objects--new-object-?view=powershell-7.2#creating-com-objects-with-new-object" target="_blank" rel="noopener">得知这个 <code>CreateObject</code> 方法在 PowerShell 中也可以使用。</a>那么我们就可以从 PowerShell 中继续使用这个方法来打开 IE 浏览器。<a href="https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_booleans?view=powershell-7.2" target="_blank" rel="noopener">汇总了一下线索</a>之后将语句浓缩成这一行，直接执行就可以了。</p><p>右键开始按钮，运行，输入 <code>powershell</code> 确定。输入这一条语句回车，即可打开 IE 浏览器。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$</span>(<span class="built_in">New-Object</span> <span class="literal">-ComObject</span> InternetExplorer.Application).Visible=<span class="variable">$true</span></span><br></pre></td></tr></table></figure><hr /><p>如果需要创建一键执行文件的话，就这样操作。打开开始菜单，输入 <code>notepad</code>回车，打开记事本。然后输入这条语句：</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell -command "$(New-Object -ComObject InternetExplorer.Application).Visible=$true"</span><br></pre></td></tr></table></figure><p>然后保存文件，保存类型选择所有文件，保存文件名随便起一个，注意文件名后面加上 <code>.cmd</code>后缀。 <strong>特请注意编码选择 ANSI。</strong> 找一个自己以后找得到的地方保存。然后以后直接双击打开该文件就可以打开 IE 浏览器了。</p><p><strong>参考资料：</strong></p><ol><li><a href="https://learn.microsoft.com/zh-cn/powershell/scripting/samples/creating-.net-and-com-objects--new-object-?view=powershell-7.2#creating-com-objects-with-new-object" target="_blank" rel="noopener">使用 New-Object 创建 COM 对象 - 创建 .NET 和 COM 对象 - PowerShell | Microsoft Learn</a></li><li><a href="https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_booleans?view=powershell-7.2" target="_blank" rel="noopener">关于布尔值 - PowerShell | Microsoft Learn</a></li><li><a href="https://superuser.com/questions/1080239/run-powershell-command-from-cmd" target="_blank" rel="noopener">windows - run powershell command from cmd - Super User</a></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      收到一条传闻，说 Windows 11 在 Dev 的版本 25309 里面移除了 VBS 的支持，此改动预计在正式版 23H2 中实装。这导致原有 VBS 方式打开 IE 浏览器的方法失效。去 Microsoft Learn 上查了一下文档，得知这个 CreateObject方法在 PowerShell 中也可以使用。那么我们就可以从 PowerShell 中继续使用这个方法来打开 IE 浏览器。汇总了一下线索之后将语句浓缩成这一行，直接执行就可以了。 
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
      <category term="PowerShell" scheme="https://no5972.moe/cms/categories/PowerShell/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：Windows 10 继续使用 IE 浏览器（针对23年2月14日的系统更新）</title>
    <link href="https://no5972.moe/cms/archivers/144.html"/>
    <id>https://no5972.moe/cms/archivers/144.html</id>
    <published>2023-02-21T01:00:00.000Z</published>
    <updated>2024-02-22T04:05:33.701Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>240222 更新：19041.3989 更新导致了此方法失效。请使用之前的 VBS 或者这个 CMD 命令来打开（复制这一行，右键开始按钮，运行，粘贴并确认）。</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell -command "$(New-Object -ComObject InternetExplorer.Application).Visible=$true"</span><br></pre></td></tr></table></figure><hr /><p>2 月 14 日更新后有部分 Windows 10 的用户反映 IE 浏览器无法使用，打开后变成 Edge 浏览器。由于有少数业内业务仍然必须使用 IE 浏览器，这里稍微研究了一下解决方法。</p><p>打开 IE 浏览器的时候会出现“IE已经合并进Edge浏览器”的提示，<strong>此时千万不要点击继续。</strong></p><p>（看最后面的图）</p><p>将鼠标移动到任务栏上出现的 Edge 图标，然后看看哪一个窗口的缩略图是这个提示，然后小心地移动到这个缩略图上面，不要移出这个缩略图。然后按下鼠标中键也就是滚轮，这样便关闭了这个提示。然后在从任务栏的那个打开的 IE 图标切换为 IE 浏览器，这样就回到 IE 了。</p><p>（看最后面的图）</p><h1 id="当然上面那些不是重点-重点是万一点了继续导致后续就打不开-ie-了怎么办"><a class="markdownIt-Anchor" href="#当然上面那些不是重点-重点是万一点了继续导致后续就打不开-ie-了怎么办"></a> 当然，上面那些不是重点。重点是万一点了继续，导致后续就打不开 IE 了怎么办？</h1><p>这个让 IE 打不开的设置选项就位于 Edge 浏览器设置中的“默认浏览器”里面的“让 Internet Explorer 在 Microsoft Edge 中打开网站”。但是关键在于版本大于或等于 110 的版本已经从界面中移除了这个选项。所以我们需要找一个旧版本也就是小于或等于 109 的 Edge 绿色版来显示这个选项。</p><p>我们这里找的一个绿色版是“<strong>Microsoft Edge绿色增强版下载 v92.0.902.55 官方版(集成chromium内核)</strong>”。这个是可以和系统自带的 Edge 浏览器共存且互不干扰的。下载下来后，解压 <code>Edge.zip</code>，然后从解压的目录里面用解压缩软件再解压 <code>Edge_v92.0.902.55_x64_Stable_v1.5.1.exe</code>，注意是解压这个 EXE 文件。然后进入 <code>Edge_v92.0.902.55_x64_Stable_v1.5.1\Edge\App</code>目录，打开<code>msedge.exe</code>。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/eba63e07e16f47018bef9096fa323240.png" alt="在这里插入图片描述" /><br />然后按照界面提示选择“继续但不登录”，然后点击右上角三个点的按钮，打开设置，在左侧选择默认浏览器。注意了！这里我们就重新让这个选项“让 Internet Explorer 在 Microsoft Edge 中打开网站”回来了！然后把这个选项改为“从不”。然后关闭这个浏览器。然后就可以重新使用前面的任务栏方法打开 IE 浏览器了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/28794938fa374e53905126bd94dde227.png" alt="在这里插入图片描述" /></p><p>再打开 IE 浏览器，此时还是会出现“IE已经合并进Edge浏览器”的提示，<strong>此时千万不要点击继续。</strong></p><p>（看最后面的图）</p><p>将鼠标移动到任务栏上出现的 Edge 图标，然后看看哪一个窗口的缩略图是这个提示，然后小心地移动到这个缩略图上面，不要移出这个缩略图。然后按下鼠标中键也就是滚轮，这样便关闭了这个提示。然后在从任务栏的那个打开的 IE 图标切换为 IE 浏览器，这样就回到 IE 了。</p><hr /><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/93a600389aa34163ac2386719d51f1c9.png" alt="在这里插入图片描述" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c0838b833c9f480594b98c30104615b7.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      2 月 14 日更新后有部分 Windows 10 的用户反映 IE 浏览器无法使用，打开后变成 Edge 浏览器。由于有少数业内业务仍然必须使用 IE 浏览器，这里稍微研究了一下解决方法。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>UOS 在桌面创建网页快捷方式</title>
    <link href="https://no5972.moe/cms/archivers/143.html"/>
    <id>https://no5972.moe/cms/archivers/143.html</id>
    <published>2023-01-13T09:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.583Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>刚刚看到最新一期《电脑报》刊登了某友商操作系统的创建网页快捷方式的方法，这里就在思考我们的 UOS 有没有类似的办法创建网页快捷方式。刚刚稍微搜集了一下资料，并进行实操，终于调试成功。这里将汇总好的操作过程分享一下。</p><p>首先从启动器菜单里面找到大家平时常用的一个浏览器，例如鄙人这里使用的 Firefox ESR。如果此浏览器在桌面上原本就有图标的话，直接在桌面将这个图标 Ctrl + C - Ctrl + V 复制粘贴一份。如果原本没有图标的话，右键这个浏览器，选择发送到桌面。然后会听到一声“巨响”，桌面上就出现了这个浏览器。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/fad39855cb3749cba62ad527cee16f79.png" alt="" /></p><p>接下来，右键桌面的空白处，选择打开终端。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/2ccc6d56820b4d428c36368b92303b34.png" alt="" /></p><p>键入<code>ls</code>，如果是之前就有的就找到带有 <code>(copy)</code> 的 desktop 文件，如果之前没有图标的话就找到浏览器名称的 desktop 文件。鄙人之前没有保留浏览器的图标，所以直接找到浏览器名称的 desktop 文件。使用 <code>vi</code> 打开它，键入 <code>vi 刚刚找到的文件名.desktop</code> 的命令。此时很快便找到了 <code>Exec=</code> 以及后面的 <code>%u</code>。按 I 键进入编辑模式，将 <code>%u</code> 修改为要创建的图标的访问网址。另外，最上面的 <code>Name=</code> 那一行也建议修改为需要的名称，此属性将决定在桌面显示的图标名称。两项都修改完毕后，按 Esc 退出编辑模式，键入 <code>:wq</code> 保存退出。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/180593b2f9bd4aa185c79db9d03b0835.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/a66c949a4dcf4877af7ec49881688780.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/e58ac27d66884af18f8820bb8920016c.png" alt="" /></p><p>此时观察桌面上刚刚添加的图标，看看是不是修改为需要的快捷方式了。然后双击看一看是否能访问相应的网址！</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/2d638f47c209428b913c435e010bf084.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/23183ae3b2af4e9b9cb657e2602c0624.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      刚刚看到最新一期《电脑报》刊登了某友商操作系统的创建网页快捷方式的方法，这里就在思考我们的 UOS 有没有类似的办法创建网页快捷方式。刚刚稍微搜集了一下资料，并进行实操，终于调试成功。这里将汇总好的操作过程分享一下。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>UOS 录制电脑播放的音频 / 内录音频</title>
    <link href="https://no5972.moe/cms/archivers/142.html"/>
    <id>https://no5972.moe/cms/archivers/142.html</id>
    <published>2023-01-10T15:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.583Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Windows 里面有一个“立体声混音”，可以内录电脑播放的音频，而不受到外界噪音的干扰。前段时间接到反馈说 UOS 的设置里面的音频输入里面没有可以选择的设备，这里就稍微探索了一下，发现 UOS 也是可以配置内录的。这里参考了一下这篇文章。<a href="https://blog.csdn.net/lsheevyfg/article/details/116799564" target="_blank" rel="noopener">Linux上用ALSA aloop driver实现录制其他程序播放的声音</a> <strong>本操作过程适用于 Intel CPU 的电脑。</strong></p><p>UOS 通常已经自带了 aloop 驱动，只是默认没有打开。打开终端，输入 <code>sudo modprobe snd-aloop</code>，如果没有报错的话，打开设置-声音-输入，此时就可以看到一个录音设备“Analog Input (Loopback)”。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d066a4cb2beb431a84a7cbfa5d52c0aa.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/1273efa53ab240ed8c6a165a3bd858fa.png" alt="" /></p><p>然后把右下角系统托盘的音量打开，切换到“Speakers (HDA Intel PCH)”（AMD的没见到过实机暂时没法复现），如果本来就是的话就直接继续。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c2623ce7c3824c6e915738f8b9c838bb.png" alt="" /></p><p>从 Firefox 随便找一个在线录音的网站（这里真的只是随便找的），然后打开录音，这时候 Firefox 会提示要允许网站使用您的麦克风吗，<strong>这里注意录音设备选择“Monitor of Built-in Audio Stereo”</strong> ，然后点击允许，然后就开始录音了，这里录制的就是电脑播放的音频。按照网页的界面完成录音，然后试听效果。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/f45c03c781984d80923f8f524994d03a.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/a517e9a8bac34b31a5d5c651c8e1e65f.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/cfdbb6476c3b4dce8f66a6e93fa84c29.png" alt="" /></p><p><strong>这里的这个内录在每次重启之后都是要重新执行最开始的那条命令的。</strong> 如果需要省去这个手动打开的步骤，据说可以配置 <code>~/.asoundrc</code> 这个文件，但是在 UOS 这里在非 root 用户下并没有在这个路径找到这个文件。具体如何操作就尚待后续研究了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Windows 里面有一个“立体声混音”，可以内录电脑播放的音频，而不受到外界噪音的干扰。前段时间接到反馈说 UOS 的设置里面的音频输入里面没有可以选择的设备，这里就稍微探索了一下，发现 UOS 也是可以配置内录的。本操作过程适用于 Intel CPU 的电脑。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：PMXEditor 添加饰品</title>
    <link href="https://no5972.moe/cms/archivers/141.html"/>
    <id>https://no5972.moe/cms/archivers/141.html</id>
    <published>2022-12-05T12:00:00.000Z</published>
    <updated>2024-09-26T09:55:31.989Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>看到现有的绑骨教程往往是晦涩难懂的，的确 PMXEditor 里面添加饰品没有 MMD 那么简单。<a href="https://learnmmd.com/http:/learnmmd.com/attach-an-item-or-accessory-to-a-bone-in-pmdeditor-weighting-in-mmd/" target="_blank" rel="noopener">这里从 LearnMMD 站点上找了一个相对比较简单的教程</a>，这里稍微复述一遍。</p><p>首先在 PMXEditor 打开角色模型。然后点击 File - Import，找到并选中 <code>.x</code> 格式的饰品文件。然后选择“Add”在现有已加载模型的基础上追加导入。右边的选项暂时不管。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/968991f0c2ef4ac68d97992fc8cb070b.png" alt="" /></p><p>这样导入以后，首先调整一下饰品的位置。在模型预览窗口点击右上方的“M”，把饰品以外的所有材质先取消勾选，让其他材质不显示。只剩下饰品之后，框选住所有的顶点。然后再全部勾选。这样就只选中了饰品，然后通过拖动句柄来调整饰品的位置，对齐要对准的部位。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/0d7ee194c9a043679192d1cebff8c483.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/b0fb959e95d34576b0b4f04d03121a0b.png" alt="" /></p><p>然后还是取消勾选饰品以外的所有材质。还是框选住饰品的所有顶点。</p><p>然后在主窗口选择“Bone”选项卡。然后在左侧选择要对齐的部位（如果看不懂的话可以在“M”窗口把其他的材质显示，然后在主窗口依次选择部位，选中的部位将在模型预览窗口将对应顶点变成蓝色）。右边的选项不需要动。</p><p>然后在模型预览窗口点击右上方的“W”，点击 Start，这时会看到饰品出现了黑色的顶点。通过鼠标拖曳的方式将所有这些黑色的点涂成红色。注意不要拖的太快，太快的话有些少数的点可能没有标红。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/17e054daa4924a52bd17928df6b59d7d.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/0f6ea49059d541bc96f62fab576ea3bb.png" alt="" /></p><p>全部标红之后再点击 Start，这时候红色的点应该消失了。好了，现在点击右上方的 T 按钮，试着旋转相关的关节看看饰品会不会跟着动！</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/303addee59b84787a1d68687cf5b6848.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/5ffe2a33a5c245938de2e4d19ef2f95e.png" alt="" /></p><p>本篇使用素材“Angel Wings”来自 <a href="https://hub.vroid.com/en/characters/555104576816800556/models/6086027198880580229" target="_blank" rel="noopener">VRoid Hub</a>，素材作者：<a href="https://hub.vroid.com/en/users/62909993" target="_blank" rel="noopener">Lucy Aldra</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      看到现有的绑骨教程往往是晦涩难懂的，的确 PMXEditor 里面添加饰品没有 MMD 那么简单。这里从 LearnMMD 站点上找了一个相对比较简单的教程，这里稍微复述一遍。
    
    </summary>
    
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>Windows 11 通过 VBS 打开 IE 浏览器</title>
    <link href="https://no5972.moe/cms/archivers/140.html"/>
    <id>https://no5972.moe/cms/archivers/140.html</id>
    <published>2022-11-25T03:30:00.000Z</published>
    <updated>2023-03-15T08:38:28.229Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>Windows 11 在 Dev 25309 里面移除了 VBS 的支持，此改动预计在正式版 23H2 中实装。这导致原有 VBS 方式打开 IE 浏览器的方法失效。这里摸索出来一个使用 PowerShell 方式打开 IE 浏览器的方法，可以参考一下。<a href="145.html">145.html</a></strong></p><hr /><p>Windows 11 已经将 IE 浏览器默认跳转到了 Edge，这导致如果不使用第三方浏览器的话，报名教师资格证变的尤其麻烦。即使是从“运行”输入 <code>iexplore</code> 打开的仍然是 Edge。</p><p>但是我们仍然可以通过 VBS 脚本来打开 IE 浏览器。此法无需替换 <code>ieframe.dll</code> 文件也可以直接使用。</p><p>右键开始按钮，选择“运行”，输入 <code>notepad</code> 回车，打开记事本，输入以下内容：</p><figure class="highlight vb"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CreateObject(<span class="string">"InternetExplorer.Application"</span>).Visible=<span class="literal">true</span></span><br></pre></td></tr></table></figure><p>将其保存为后缀名为 <code>.vbs</code> 的文件，运行就可以在 Windows 11 打开 IE 浏览器了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Windows 11 已经将 IE 浏览器默认跳转到了 Edge，这导致如果不使用第三方浏览器的话，报名教师资格证变的尤其麻烦。即使是从“运行”输入 iexplore 打开的仍然是 Edge。但是我们仍然可以通过 VBS 脚本来打开 IE 浏览器。此法无需替换 ieframe.dll 文件也可以直接使用。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>上个世纪的垃圾佬——《电脑爱好者》1999 年 DIY 大赛入围作品赏析（5）</title>
    <link href="https://no5972.moe/cms/archivers/139.html"/>
    <id>https://no5972.moe/cms/archivers/139.html</id>
    <published>2022-09-16T08:30:00.000Z</published>
    <updated>2024-09-26T10:02:51.740Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：</p><p><img src="https://img.shields.io/badge/%E7%94%B5%E8%84%91%E7%88%B1%E5%A5%BD%E8%80%85-%E8%B4%BE%E7%A8%8B%E5%87%AF-brightgreen" alt="" /></p><table>  <tbody>    <tr>      <td colspan="2">作者：贾程凯</td>      <td colspan="3">攒机记录（台）：15</td>      <td colspan="4">攒机目标：游戏、学习影像制作、娱乐</td>      <td rowspan="6">备注：<br>　　标有“*”的为二手配件或修复件。</td>    </tr>    <tr>      <td>硬件</td>      <td>配置</td>      <td>价格（元）</td>      <td>硬件</td>      <td>配置</td>      <td>价格（元）</td>      <td>硬件</td>      <td>配置</td>      <td>价格（元）</td>    </tr>    <tr>      <td>CPU</td>      <td>AMD K6-2 266 *</td>      <td rowspan="2">1000</td>      <td>内存</td>      <td>32MB SDRAM</td>      <td>370</td>      <td>显示器</td>      <td>SONY 15″ 数控*</td>      <td>1280</td>    </tr>    <tr>      <td>主板</td>      <td>大众 VA503+ *</td>      <td>声卡</td>      <td>中凌 724A</td>      <td>200</td>      <td>音箱</td>      <td>漫步者 R800TC</td>      <td>170</td>    </tr>    <tr>      <td>硬盘</td>      <td>希捷 4.3GB</td>      <td>1280</td>      <td>光驱</td>      <td>源兴 24X</td>      <td>400</td>      <td>机箱</td>      <td>立式 AT*</td>      <td>38</td>    </tr>    <tr>      <td>显示卡</td>      <td>S3Tri 3D + Voodoo *</td>      <td>500</td>      <td>键盘、鼠标</td>      <td>康柏 101 键* / 普通三键*</td>      <td>13</td>      <td colspan="3">共计 5316 元 1998 年 12 月 24 日于中关村</td>    </tr>  </tbody>  <colgroup>    <col>    <col>    <col>    <col>    <col>    <col>    <col>    <col>    <col>    <col>  </colgroup></table><p>作为一个住校的大学生，同时又是无线电和电脑双料发烧友的我。面对不太充实的钱包，却又想拥有一台自己的电脑。无奈之下，只好对大脑和双腿“超频”使用，终于拥有了自己的得意之作。虽然头发“烧”得剩下了一半，还是觉得值！有好东西在下当然不敢隐瞒，拿出来与众多 DIY 友们一同分享。</p><p>这台电脑采用了新旧件搭配的方案。什么，还有旧件！别急嘛，听我慢慢道来。一般来说，旧件分为三类。第一类：退居二线型，指因升级而换下来的二手货，这类旧件虽然经过一段时间的便用，但质量可靠，价格也经济实惠。第二类：改头换面型，指经过维修、翻新后又流入市场的旧件，这种旧件大多都不太稳定，存有故障隐患，不宜购买。第三类：一无是处型，这种旧配件基本上都是坏的或过时的产品，由于是成批处理，价格极为便宜，被笔者戏称为“电子垃圾”。这种“垃圾”在中关村的街头经常可见，小到鼠标、电源线，大至彩显、打印机，种类齐全。如果有一定维修经验，不但能从“垃圾”中淘出“黄金”来，而且还会带来一份好心情，而这种心情只有动手后才能体会得到。</p><p>好了，闲话少说！笔者的得意之作就粉墨登场了！</p><h1 id="cpu-主板"><a class="markdownIt-Anchor" href="#cpu-主板"></a> CPU + 主板</h1><p>随着近来赛扬 300A 的一路狂跌，AMD K6-2 266 也随之掉价不少。许多想升级的朋友，纷纷开始转让手中 Socket7 构架的配件。笔者乘着大好时机从朋友手中坐享“渔翁之利”，用 1000 元的超值价购得一块 AMD K6-2 266 芯片和大众 VA503+ 主板。这两样东西，我想不用多介绍了吧。银盔银甲的 K6-2 266 市场上 Remark 的很少，不会是假的。听朋友说主板使用几个月来，也没出现什么故障。想想超频到 300MHz 还能对付将来大多数软件，足够用了！扫过灰后，看上去就跟新的一样了。（自我安慰哦！）</p><h1 id="显卡"><a class="markdownIt-Anchor" href="#显卡"></a> 显卡</h1><p>面对形形色色的显卡，我选用了最适合学生族的超值组合方案：S3 Tri 3D + Voodoo。耕宇这块采用 S3 Tri 3D 芯片的显卡，具有 128 位图形引攀，4MB SGRAM、AGP 接口，2D 性能十分出色。而 Voodoo 则用它强大的 3D 功能弥补了这块显卡 3D 性能不佳的弱点。组成了一套非常不错的 2D + 3D 游戏平台。这款同维（TW）Voodoo 也是从朋友那儿“趁火打劫”来的，可惜没有散热片。于是，在电子市场买了两块铝质散热片，用 502 胶水贴在了两块有 3Dfx 标志的集成电路上，散热效果大大改善。这回跑“飞车”，钻“古墓”，就放心多了。惹得同寝室几位 GAME FAN 大战几个通宵，直呼过瘾！</p><h1 id="显示器"><a class="markdownIt-Anchor" href="#显示器"></a> 显示器</h1><p>作为大件之一的彩显，选购起来着实让笔者头痛。15″ 数控是必须要保证的硬指标。买新的，价格太高，旧的，又怕它经常“罢工”。没想到，得来全不费工夫，无意之间在中关村发现了一台二手 SONY 彩显。看着屏幕下方贴有能源之星标志的不干胶，虽然很旧，却没有被撕掉，说明使用时间不会太长。一问价格，1280 元，太便宜了，这款 SONY 彩显新的可要 3000 多块呀！买回来打开后盖一看，果然使用时间不长。显像管和电路板上只积了薄薄的一层尘土。用螺丝刀把显像管高压对外面的导电敷层进行放电处理（非维修人员，请勿擅自操作！切记！）。清理过内部的尘土之后，连续烤了两天，图像显示依旧正常，使用高分辨率也没有出现黑屏或变形。看着索尼那漂亮大气的外观，平直的特丽珑显像管，精细的点 25 画面，总有点儿天上掉馅饼的感觉。</p><h1 id="硬盘"><a class="markdownIt-Anchor" href="#硬盘"></a> 硬盘</h1><p>虽然现在市场上的二手硬盘很多，但新旧硬盘差不了多少钱，况且新的还有质保，何乐而不为呢？笔者选用了一款希捷（Seagate）4.3GB 的硬盘。也许在 5400 转的产品中，它不是最优秀的。但对学生来说，它却经济实惠！另外，提限广大 DIY 发烧友，中关村路边的旧硬盘千万别买！硬盘这东西，坏了不光没配件，更没法找超清净的地方打开修。如果坏了，就是 100% 的垃圾了。笔者就亲眼见过许多贪便宜的朋友，买了之后大呼上当。可能许多朋友没见过这些小贩摆摊，他们通常提着麻袋把硬盘“哗啦”朝地上一倒，情形就好像在批发蔬菜。这样折腾，就算是好的硬盘也玩完了 ！</p><h1 id="内存"><a class="markdownIt-Anchor" href="#内存"></a> 内存</h1><p>32MB 的 SDRAM 现在供不应求，当然没那么多的二手货。笔者只好老老实实在中关村买了一条韩国高仕达（LGS）的 32MB 内存。在外频 100MHz 的情况下跑起来，表现也很稳定，批号为 GM72V6684GT7J。</p><h1 id="光驱"><a class="markdownIt-Anchor" href="#光驱"></a> 光驱</h1><p>光驱这东西我可不会买旧的，大多数旧光驱都是激光头老化，读盘能力下降才当二手卖的。还有些不法商贩会调大激光头的功率，这样只会加速其老化。虽然当时买来还不错，但用不了多久它就会“寿终正寝”了。挑来挑去，最后选用了源兴 24 速（散包）光驱。它曾荣获欧洲 CHIP 电脑杂志评比第一名。看标签上有 COMPAQ 字样，估计是给 COMPAQ 做的 OEM 产品。试了试读盘能力，果然名不虚传！许多原先读不出的光盘，在它上面毫不含糊。另外，它的价格也平易近人。</p><h1 id="声卡-音箱"><a class="markdownIt-Anchor" href="#声卡-音箱"></a> 声卡 + 音箱</h1><p>声卡我选用了 PCI 总线的中凌雷公 724A，它采用了雅马哈（YAMAHA）724 的芯片，具有 128 位复音的 XG 硬波表合成器，支持 Direct Sound 3D。由于是在宿舍中使用，就没有必要追求过高档次的音效了，所以，音箱嘛，买了一对漫步者 R800TC 木质防磁音箱。它具有两组信号输入（LINE IN）端口，一组接声卡，另外一组便接在了  Walkman 上。不用电脑时还可以用它来听听音乐和广播，十分实用 ！</p><h1 id="机箱"><a class="markdownIt-Anchor" href="#机箱"></a> 机箱</h1><p>说来好笑，我的立式机箱就算是在“电子垃圾”中淘到的一点点“黄金”。它是从街边地摊上买的，外观没有什么损坏，做工精细，铁皮很厚，内部有一个坏电源（风扇不转），38 元的价格实在让人心动。买回来，换掉电源中的风扇，开机一试，OK！一切正常！在这里，笔者告诉大家一个经验：其实，地摊上的坏电源，许多电路部分都是好的，只是由于风扇长时间旋转发热变形，导致风扇停转了。想买到这种便宜的坏电源其实很简单，只要用东西拔一下风扇，如果感觉阻力很大，十之八九都是这种故障。</p><h1 id="键盘-软驱-鼠标"><a class="markdownIt-Anchor" href="#键盘-软驱-鼠标"></a> 键盘 + 软驱 + 鼠标</h1><p>这三样东西也是从地摊上用低廉的价格买来的。键盘是 COMPAQ 原装的，由于它是 PS/2 接口，所以，插头中的针很易折弯。当我看到这故障的健盘时，毫不犹豫地买下了它，回来把针挑直了，一开机便检测通过。软驱外表锈迹斑斑，内部还霉了一大片，电路板白白的一片。笔者估计是保存不当受潮所致，并非使用损坏。买回来用酒精擦净电路板和磁头，装上试机，竟也读写正常。笔者估计坏鼠标是由于频繁使用，使其连接处的电缆内部折断。试着剪短了一截电缆，再重新焊到电路板上，这小东西立即就恢复了活力，在 WIN95 里上窜下跳的，让笔者不由得再次产生了掉“馅饼”的感觉 ！</p><p>到这儿，我的得意之作就介绍得差不多了，希望能带给一批经济不太宽裕的 DIY 发烧友（尤其是学生族）一点启发。其实，少花钱同样能多办事，就看怎么花了。笔者非常提倡这种连修带装的方式：既能锻炼动手能力，又能增长不少知识。这也许是 DIY（Do it yourself）的另一层含义吧！不过，采购“垃圾”时，最好有一位懂维修的朋友陪同，否则，“垃圾”可能会去掉双引号了！最后，希望本文能起到一个抛砖引玉的作用，引来更多、更新和更好的 DIY 方案，同时，也祝愿所有的电脑爱好者水平更上一层楼！</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      作为一个住校的大学生，同时又是无线电和电脑双料发烧友的我。面对不太充实的钱包，却又想拥有一台自己的电脑。无奈之下，只好对大脑和双腿“超频”使用，终于拥有了自己的得意之作。虽然头发“烧”得剩下了一半，还是觉得值！有好东西在下当然不敢隐瞒，拿出来与众多 DIY 友们一同分享。
    
    </summary>
    
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：Universal Extractor 解包小花仙 Win10 微端</title>
    <link href="https://no5972.moe/cms/archivers/138.html"/>
    <id>https://no5972.moe/cms/archivers/138.html</id>
    <published>2022-09-10T16:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.579Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>临时记录一下：现在的官方 Win10 微端使用 Universal Extractor 时不能使用 LessMSI 了，得使用 MsiX 来解包。解包之后会得到一个 DLL 文件，再用 7-Zip 或者 WinRAR来解压这个 DLL 文件来获得内容。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c69e675b0a7b41ebb38624ae9ccb34e0.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      现在的官方 Win10 微端使用 Universal Extractor 时不能使用 LessMSI 了，得使用 MsiX 来解包。解包之后会得到一个 DLL 文件，再用 7-Zip 或者 WinRAR来解压这个 DLL 文件来获得内容。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>需要用Flash Player又不想安装重橙版？官方原版插件就可以~</title>
    <link href="https://no5972.moe/cms/archivers/137.html"/>
    <id>https://no5972.moe/cms/archivers/137.html</id>
    <published>2022-09-10T16:00:00.000Z</published>
    <updated>2022-09-13T09:10:38.582Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：</p><p><a href="https://bbs.pcbeta.com/viewthread-1933780-1-1.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/lfm09-%E9%9C%80%E8%A6%81%E7%94%A8Flash%20Player%E5%8F%88%E4%B8%8D%E6%83%B3%E5%AE%89%E8%A3%85%E9%87%8D%E6%A9%99%E7%89%88%EF%BC%9F%E5%AE%98%E6%96%B9%E5%8E%9F%E7%89%88%E6%8F%92%E4%BB%B6%E5%B0%B1%E5%8F%AF%E4%BB%A5~-brightgreen" alt="lfm09-需要用Flash Player又不想安装重橙版？官方原版插件就可以~" /></a></p><p>前段时间帮朋友装Flash Player，之前一直用 29．0．0．171，最近开始会提示“版本过旧、需要升级”而用不了。因为实在不想使用重橙版，就花了点时间来测试。（至于为什么不用重橙版就不多说了，不仅仅是广告的原因）</p><p>测试发现 27．0．0．130 及之前的版本无此问题（推荐 26．0．0．151，原因详见<a href="#%E6%8E%A8%E8%8D%90-2600151-%E7%9A%84%E5%8E%9F%E5%9B%A0">推荐26．0．0．151的原因</a>），不但自身没有什么限制，因为没添“料”，也比之后的版本更流畅、更好用。这里是不是有什么特殊的时间点呢？找了一下历史新闻，原来 Adobe 在 2017 年 7 月 26 日就宣布了 Flash Player 将于 2020 年底停止服务，而 26．0．0．151 及 27．0．0．130 正好是分别于 2017 年 7 月和 8 月开发的，（起码 26）很幸运没有受此影响，而在它们之后的版本都增加了暗桩。</p><p><strong>2022.6.12 更新：</strong> 增加 FP 26．0．0．151 全系便捷安装版，以及 Win10 AX 替换安装版，所有 OCX/DLL 文件均为官方原版提取。为方便使用，已作必要的简单设置，相当于懒人包。AX 便捷安装版已整合 Win10 和 Win7 插件，自动识别安装。<em>便捷安装版</em> 支持绝大部分常用的 Win 系统。<em>Win10AX 替换安装版</em> 仅适用于 Win8/10 未打 KB4577586 补丁、且系统预置 AX 保留完整时，替换文件前会先备份原文件（添加&quot;<code>_bak</code>&quot;后缀），可随时手工恢复。安装包基于 423down 脚本制作，在此感谢。</p><p><strong>2022.6.25 更新：</strong> AX/NP 便捷安装版和 Win10AX 替换安装版更新，增加了 OCX/DLL 核心文件的选择，安装时可选择官方原版或修改版 OCX/DLL 文件，后者的唯一区别是文件版本号修改提高为 66．0．0．151，以解决有极个别网站对版本号的限制。一般使用建议选择原版即可。另，PP 版改版本号不用修改 dll，无需更新。</p><h1 id="以下内容对便捷版和替换版不需要"><a class="markdownIt-Anchor" href="#以下内容对便捷版和替换版不需要"></a> 以下内容对便捷版和替换版不需要</h1><p>官方版安装说明：</p><h2 id="一-关于官方安装包"><a class="markdownIt-Anchor" href="#一-关于官方安装包"></a> 一、关于官方安装包</h2><p>文件名带 <code>_win</code> 后缀的是 NPAPI 火狐版插件，<code>_winax</code> 是 Win7 版 IE（ActiveX）插件，<code>_winpep</code> 是 PPAPI 谷歌版插件；KB4034662 补丁是 Win10 1607 的 AX 版FP26．0．0．151，里面的插件仅适合 Win10/8，但该补丁包在其他 Win10 中是无法直接安装的，需要手工解压提取出相关文件来，替换系统 Flash 目录下的原文件即可。<strong>（特别提示：Win10 和 Win7 的 AX 版 FP 是不通用的）</strong></p><h2 id="二-先卸载旧版插件再安装官方版"><a class="markdownIt-Anchor" href="#二-先卸载旧版插件再安装官方版"></a> 二、先卸载旧版插件再安装官方版</h2><p>除 Win10 系统预置 AX 外，其他版本请先正常卸载旧版，然后建议用官方 uninstall 工具再清理一下，重启系统后再安装，安装时选择“从不检查更新”。（注意：PP 版插件除了系统 <code>Flash</code> 目录外，浏览器相关 <code>PepperFlash</code> 目录下可能也有，也要删除或替换）</p><h2 id="三-如果安装时提示不是最新版本"><a class="markdownIt-Anchor" href="#三-如果安装时提示不是最新版本"></a> 三、如果安装时提示不是最新版本</h2><p>定位到以下注册表项，把其中大于 25.0 的键值都删除后再安装：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer\SafeVersions]</span><br><span class="line">[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Macromedia\FlashPlayer\SafeVersions]</span><br></pre></td></tr></table></figure><h2 id="四-官方版安装好后再根据不同的浏览器作简单设置"><a class="markdownIt-Anchor" href="#四-官方版安装好后再根据不同的浏览器作简单设置"></a> 四、官方版安装好后再根据不同的浏览器作简单设置</h2><h3 id="1-ie11旧版-edge"><a class="markdownIt-Anchor" href="#1-ie11旧版-edge"></a> 1、IE11/旧版 Edge</h3><p>编辑文本文件 <code>%LOCALAPPDATA%\Microsoft\Internet Explorer\VersionManager\versionlist.xml</code>，注释掉 <code>Flash</code> 数据段；或者修改组策略解除对控件版本的限制：管理模板 -&gt; Windows 组件 -&gt; Internet Explorer -&gt; 安全功能 -&gt; 加载项管理 -&gt; 关闭 Internet Explorer 的过时 ActiveX 控件的阻止功能，设置为“已启用”。</p><h3 id="2-chrome新版-edge百分浏览器"><a class="markdownIt-Anchor" href="#2-chrome新版-edge百分浏览器"></a> 2、Chrome/新版 Edge/百分浏览器</h3><p>Chrome/Edge 须使用 v87 之前版本，并把插件版本号修改为大于32．0．0．465。PP 版插件的版本号修改很简单，插件所在目录带版本号的就修改目录名，目录不带版本号的就编辑文本文件 <code>manifest.json</code> 。</p><h3 id="3-firefox"><a class="markdownIt-Anchor" href="#3-firefox"></a> 3、Firefox</h3><p>使用 Fx84 之前版本即可，不用作其他修改。</p><p>一般以上设置就可以了，原汁原味、流畅、无暗桩的官方原版，用着放心，也不用频繁更新。</p><h1 id="以下内容没兴趣的话可以不用看"><a class="markdownIt-Anchor" href="#以下内容没兴趣的话可以不用看"></a> 以下内容没兴趣的话可以不用看</h1><p>目前对 Flash 的绞杀、限制几乎是全方位的，包括操作系统、浏览器、插件自身、网站 4 个层面，逼着用户要么放弃 Flash，要么使用重橙版。下面大概说一下有关限制和应对方法：</p><h2 id="一-系统层面"><a class="markdownIt-Anchor" href="#一-系统层面"></a> 一、系统层面</h2><p>Win10 更新补丁 kb4577586 会强制删除系统预置的 Flash 插件，不想安装该补丁的话，可以关闭系统更新，或者使用微软官方工具“<a href="http://download.microsoft.com/download/f/2/2/f22d5fdb-59cd-4275-8c95-1be17bf70b21/wushowhide.diagcab" target="_blank" rel="noopener">Show or hide updates</a>”来屏蔽它。</p><h2 id="二-浏览器层面"><a class="markdownIt-Anchor" href="#二-浏览器层面"></a> 二、浏览器层面</h2><h3 id="1-ie11-和旧版-edge-的限制"><a class="markdownIt-Anchor" href="#1-ie11-和旧版-edge-的限制"></a> 1、IE11 和旧版 Edge 的限制</h3><p>通过版本列表来阻止低版本 Flash 运行，目前版本号小于等于32．0．0．386的都会被阻止运行。</p><p>解决办法有 4 个，哪个都可以：</p><h4 id="a-编辑文件"><a class="markdownIt-Anchor" href="#a-编辑文件"></a> A、编辑文件</h4><p><code>%LOCALAPPDATA%\Microsoft\Internet Explorer\VersionManager\versionlist.xml</code> ，注释掉 <code>Flash</code> 相关数据段。</p><p><img src="https://bbs.pcbeta.com/data/attachment/forum/202206/03/104439xs3e6fnhyn3hb8ef.png" alt="" /></p><h4 id="b-组策略解除对控件版本的限制"><a class="markdownIt-Anchor" href="#b-组策略解除对控件版本的限制"></a> B、组策略解除对控件版本的限制</h4><p>管理模板 -&gt; Windows 组件 -&gt; Internet Explorer -&gt; 安全功能 -&gt; 加载项管理 -&gt; 关闭 Internet Explorer 的过时 ActiveX 控件的阻止功能，设置为“已启用”。</p><h4 id="c-把相关网站加入受信任的站点"><a class="markdownIt-Anchor" href="#c-把相关网站加入受信任的站点"></a> C、把相关网站加入受信任的站点。</h4><h4 id="d-提高-fp-版本号修改-ocx-文件版本号"><a class="markdownIt-Anchor" href="#d-提高-fp-版本号修改-ocx-文件版本号"></a> D、提高 FP 版本号（修改 OCX 文件版本号）。</h4><h3 id="2-firefox-的限制"><a class="markdownIt-Anchor" href="#2-firefox-的限制"></a> 2、Firefox 的限制</h3><p>一是运行 Flash 需手工确认，二是从 Fx85 起不支持 Flash。</p><p>解决办法：使用 Fx84（如果要自动运行 Flash 那还得更早版本的 Fx）。</p><h3 id="3-chrome新版-edge-的限制"><a class="markdownIt-Anchor" href="#3-chrome新版-edge-的限制"></a> 3、Chrome/新版 Edge 的限制</h3><p>一是对 FP 32．0．0．465 及之前的版本直接阻止，无法运行；二是对 FP 版本号大于 32．0．0．465 的也需要手工允许；三是从 v88 起浏览器不支持 Flash。</p><p>解决办法：浏览器使用 v87（如果要自动运行 Flash 那还得更早的版本）、或者使用百分浏览器，并提高 FP 版本号（PPAPI 版修改很简单，插件所在目录的名称带版本号的就修改目录名，目录名不带版本号的就编辑 <code>manifest.json</code> ，比如把其中的 26．0．0．151 修改为 66．0．0．151）。</p><p><img src="https://bbs.pcbeta.com/data/attachment/forum/202206/08/134604klpu1hs9wguzujs4.png" alt="" /></p><h2 id="三-flash-插件自身的限制"><a class="markdownIt-Anchor" href="#三-flash-插件自身的限制"></a> 三、Flash 插件自身的限制</h2><p>一是从 v30 起限制中国区用户不能使用国际版；二是 v32．0．0．387 之后的版本含有时间“炸弹”，2021 年 1 月 12 日起会提示 EOL 生命期终止而无法使用；三是 v27．0．0．159 之后的版本含有限制旧版的暗桩，最近开始会提示“版本过旧、需要升级”而不能使用。</p><p>解决办法：使用 v27．0．0．130 及之前的版本（推荐26．0．0．151）；或使用 v27．0．0．159 ~ v29，并修改 hosts 或 OCX/DLL 文件屏蔽相关域名；或使用 v30 以后版本，需修改 OCX/DLL 文件去除相关限制。</p><h2 id="四-网站层面"><a class="markdownIt-Anchor" href="#四-网站层面"></a> 四、网站层面</h2><p>有些 B 态网站会对 FP 插件版本号有要求，碰到这种就只好修改提高版本号了（通过上面所说的修改  <code>manifest.json</code> 文件、修改插件所在目录的文件夹名称、直接修改 OCX/DLL 等方式）。</p><h1 id="推荐-2600151-的原因"><a class="markdownIt-Anchor" href="#推荐-2600151-的原因"></a> 推荐 26．0．0．151 的原因</h1><p>昨天发现 27．0．0．130 AX 版在 Win7 下有时会出现插件文件无缘无故消失的问题，这也许是使用了官方 uninstall 工具或者“一剑全清”工具清理后没有重启系统就安装新版所导致的。（不确定是否 27．0．0．130 的锅）</p><p>另外，其配置文件 <code>settings.sol</code> 会保存当前版本信息和最新版本信息，说不定什么时候又出妖蛾子，所以还是推荐大家使用 26．0．0．151。推荐 26 还有一个原因，前几年用火狐 + FP 29．0．0．171 浏览某个 Flash 网站会明显卡顿，经测试多个大版本发现只有 26 才正常。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      测试发现 27．0．0．130 及之前的版本无此问题（推荐 26．0．0．151，原因详见推荐26．0．0．151的原因），不但自身没有什么限制，因为没添“料”，也比之后的版本更流畅、更好用。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：UOS 解决 APT 报错处理 com.dongpl.beyond (NewVersion2) 时出错</title>
    <link href="https://no5972.moe/cms/archivers/136.html"/>
    <id>https://no5972.moe/cms/archivers/136.html</id>
    <published>2022-09-05T09:30:00.000Z</published>
    <updated>2022-09-13T09:07:48.702Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>执行 <code>apt search</code> 以及 <code>sudo apt install</code> 时报错如下信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">~$ sudo apt install lm_sensors</span><br><span class="line">正在读取软件包列表... 有错误！</span><br><span class="line">E: Problem parsing Provides line</span><br><span class="line">E: 处理 com.dongpl.beyond (NewVersion2) 时出错</span><br><span class="line">E: Problem with MergeList /var/lib/apt/lists/d.store.deepinos.org.cn_Packages</span><br><span class="line">E: 无法解析或打开软件包的列表或是状态文件。</span><br></pre></td></tr></table></figure><p>使用 <code>sudo vi</code> 打开 <code>/var/lib/apt/lists/d.store.deepinos.org.cn_Packages</code>。使用斜杠搜索 <code>com.dongpl.beyond</code>。找到了一段关于此包名的包。查看文字描述发现是一个文件对比工具的源出了问题。</p><p>将这一段删除（查看模式敲两下 D 然后可以删除当前行），<code>:wq</code> 保存。再试试 <code>apt search gedit</code>，问题解决。</p><p>留意到应用商店里面有一个这个文件对比工具 Beyond Compare，大家如果在安装过此应用之后在 APT 命令出现类似问题的时候可以参考本文章方法来解决。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      留意到应用商店里面有一个这个文件对比工具 Beyond Compare，大家如果在安装过此应用之后在 APT 命令出现类似问题的时候可以参考本文章方法来解决。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：何谓“联机帮助”？</title>
    <link href="https://no5972.moe/cms/archivers/135.html"/>
    <id>https://no5972.moe/cms/archivers/135.html</id>
    <published>2022-08-29T09:30:00.000Z</published>
    <updated>2022-09-05T09:40:58.331Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>很多早期的操作系统和应用软件会强调一个术语“联机帮助”，用于在使用软件的过程中遇到不会的问题或者故障来解决这些问题。</p><p>但是毕竟当年互联网没现在这么发达，突然冒出来的这个“联机帮助”，其实并不是“联网”的帮助。</p><p>这里说的“联机帮助”，指的是可以直接在电脑上查阅的帮助文档。特指按照某种特定文件格式存储的帮助文件，例如 Windows 的 <code>.HLP</code> 和 <code>.CHM</code> 的帮助文件，以及 Linux 的 <code>man</code> 命令打出的帮助信息。</p><p>与之相反的是“脱机帮助”，这个“脱机帮助”是指的是不在电脑上获取的帮助，有些操作系统和应用软件受限于环境的限制没有给出帮助文件，这时候可能就得找一找软件光盘有没有附带类似于说明书之类的资料，有时候甚至要打客服电话或者找其他人帮忙解决，这叫做“脱机帮助”。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      很多早期的操作系统和应用软件会强调一个术语“联机帮助”，用于在使用软件的过程中遇到不会的问题或者故障来解决这些问题。但是毕竟当年互联网没现在这么发达，突然冒出来的这个“联机帮助”，其实并不是“联网”的帮助。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Blender MMD 备忘</title>
    <link href="https://no5972.moe/cms/archivers/134.html"/>
    <id>https://no5972.moe/cms/archivers/134.html</id>
    <published>2022-08-24T02:30:00.000Z</published>
    <updated>2024-09-26T09:55:50.341Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><ol><li><p>如果出现导入PMX模型泛紫的情况：将所有材质的Toon tex fac改成0.</p></li><li><p>将VRM转换带材质的OBJ：使用CATS和VRM ADDON插件，在CATS面板选择Import Model旁边下拉菜单的VRM，导入VRM，然后点击Fix model，再选中模型导出。导出时不选择仅导出选中的物体，勾选OBJ物体、OBJ组、材质组。</p></li><li><p>导入的OBJ如果出现贴图透明部分显示黑色：把Shading的出现黑色的材质的地方的贴图的Alpha接到原理化BSDF的Alpha。此时使用材质预览模式仍然有黑底，但是渲染模式已恢复正常。</p></li><li><p>直接导入PMX和VRM，顶点组太多，建议转换成OBJ格式再导入，这样重新创建顶点组。切换到编辑模式，然后按Ctrl+G创建顶点组。</p></li><li><p>导入VRM后如果不能调整姿态，先选中姿态，然后将左上角物体模式改成姿态模式。</p></li><li><p>导入OBJ可能会丢失贴图。将下划线开头的PNG导入即可恢复。</p></li><li><p>PMD转PMX：使用Blender和CATS插件。导入PMD然后直接导出PMX即可。</p></li><li><p>对透明底发光贴图材质的发光设置：原贴图是针对MME的Autoluminous而使用的透明底贴图，这种情况把图像纹理或者Mmd Base Tex的Alpha拉一根出来放到混合着色器的系数。加一个原理化BSDF，Alpha调到0。加一个自发光（发射），根据需要设置发光参数。把这两个着色器拉到前述混合着色器即可。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/31f17fef124d4b64bcc5a978c8bfe81e.png" alt="" /></p></li><li><p>渲染出现贴图混乱的情况：Cycles对相同物体重叠贴图有问题。Eevee不存在这个问题。如果要用Cycles渲染的话需要合并相同位置的贴图且只保留一个这样的物体。</p></li><li><p>部分格式为VRM的饰品，先用VRM2PMXConverter转换成PMX，再导入PMXEditor，将无关的材质删除，只保留饰品本身。然后点击文件-导出，此时就能看到保存类型为“.x”的选项。如果输入文件名中没有出现“.x” 的后缀可以手动填写后缀“.x”。然后就可以作为饰品导入MMD了。将下拉框选择“镜头/灯光/饰品”，然后点击最右边“饰品”里面的载入，选择刚才导出的.x的文件。然后选择要绑定的角色和要绑定的部位（绑骨）。此时此饰品就会跟着这个角色的这个部位一起移动了，如果还发现位置有偏移的话，可以再显式指定调整位置坐标和旋转角度，甚至可以调整大小和透明度。</p></li><li><p>对透明底服装贴图材质的设置：把图像纹理或者Mmd Base Tex的Alpha拉一根出来放到混合着色器的系数。加一个原理化BSDF，Alpha调到0。加上需要使用的着色器，根据需要设置参数。把这两个着色器拉到前述混合着色器。再加一个混合着色器，把MMDShaderDev拉到第二个混合着色器第一个入口，第一个混合着色器拉到第二个着色器第二个入口。将第二个着色器接到材质输出即可。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/70bdf2978e86445b846202945d9876c3.png" alt="" /></p></li><li><p>将含有MMD模型的<code>.blend</code>工程文件上载到云电脑渲染的时候，可能会出现丢失贴图的问题。欲解决这个问题，需要在保存之前点击菜单的文件-外部数据-全部打包到blend文件，然后再保存一次。这样，所有的贴图就打包进去了。可能会报错找不到toon的文件，那个是卡通纹理，我们blender暂时用不到，可以忽略，不会影响其他的材质贴图。</p></li><li><p>Eevee渲染如果出现阴影不明显的情况，需要将渲染设置的阴影设置中的“高位深”勾选。渲染出现画面太灰的情况，可以在渲染设置最下面的色彩管理勾选使用曲线，然后将C的曲线根据需要来调整。当前调教参数：CX1: 0.145, CY1: 0.068, CX2: 0.405, CY2: 0.256, CX3: 0.657, CY3: 0.468, CX4: 0.912, CY4: 0.737四点曲线。其他R、G、B保持默认。 （感谢《电脑报》2022年34期29版文章《让EEVEE效果更真实：blender渲染设置教学》）</p></li><li><p>调整动画的帧率：如果直接调整帧率的话，动画速度会变。此时需要将时间轴上的所有关键帧选中，然后把播放指针挪到0帧，然后按S键，然后输入各个帧数乘以的倍率。然后再去设置导出视频的帧率。</p></li><li><p>关于角色肤色不正：把皮肤材质的MMD Base Tex的颜色和MMDShaderDev的Base Tex之间的线的位置插入一个颜色-RGB曲线，然后根据需要配置参数。当前调教参数：右上角节点CX0.5，RX0.3，GX0.8，其他保持默认。全部用直线。</p></li><li><p>某些带马尾头发的角色，马尾不会动，此时可以使用MikuMikuMoving将原本的角色动作VMD转换成带有头发摆动数据的VMD。先导入角色，然后导入动作，然后工具栏打开物理-录制。再回到工具栏首页选择导出动作。选中所有复选框。这样即可导出带有头发飘动的VMD，这个可以导入blender。这比在blender烘焙要快得多。但是穿模的问题未能在此得到解决。</p></li><li><p>设置几何节点之后材质无效：参考StackOverflow上“Material Not Showing on Objects Using Geometry Nodes”的答案，将最后的组输出前面插入一个“材质-设置材质”，然后选择需要的材质即可。 <img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/fa21de8420c74c47bed7cd3272bd6691.png" alt="" /></p></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Blender使用MMD模型需要注意的点
    
    </summary>
    
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>UOS ARM 安装安卓手机软件 APK 软件包</title>
    <link href="https://no5972.moe/cms/archivers/133.html"/>
    <id>https://no5972.moe/cms/archivers/133.html</id>
    <published>2022-08-17T03:30:00.000Z</published>
    <updated>2022-09-05T09:40:49.727Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：</p><p><a href="https://www.wanpeng.life/1604.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%B8%87%E4%B8%87%E6%B2%A1%E6%83%B3%E5%88%B0-UOS%E5%AE%89%E8%A3%85%E5%AE%89%E5%8D%93%E6%89%8B%E6%9C%BA%E8%BD%AF%E4%BB%B6%20APK%E8%BD%AF%E4%BB%B6%E5%8C%85-brightgreen" alt="万万没想到-UOS安装安卓手机软件APK软件包" /></a></p><p>统信 UOS 系统现在做的真是越来越好用，个人也是非常的喜欢，在平时的工作中也经常使用 UOS 系统，万万使用的是鲲鹏 920 处理器的机器，ARM 架构，和大部分手机架构一样，所以按理来说是可以直接在 UOS 系统上运行手机软件的，此系统天生与手机的生态有着千丝万缕的联系。</p><div class="note success"><p>今天万万跟大家分享一下鲲鹏 920 架构的统信 UOS 上安装手机软件的方法。</p></div><p>其实我们的 UOS 系统上已经内置好了安卓软件的安装脚本。</p><h1 id="如何安装"><a class="markdownIt-Anchor" href="#如何安装"></a> 如何安装</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/android-appmgr.sh install +软件包名</span><br></pre></td></tr></table></figure><div class="note info"><p>注：软件包可以去各大软件官网下载。</p></div><p>因为 UOS 商店中没有百度网盘，ARM 架构的鲲鹏 920 运行不了 wine 版，这里测试安装了百度网盘手机客户端，事先已在官网下载好软件包 <code>BaiduNetdisk_11.9.2.apk</code> 文件。</p><p>执行 <code>/usr/bin/android-appmgr.sh install BaiduNetdisk_11.9.2.apk</code></p><p><img src="https://obs.wanpeng.life/wp-content/uploads/2021/05/ad.png" alt="" /></p><p style="text-align:center">安装成功</p><div class="note warning"><p>如果没有此脚本，可以在应用商店中安装一个安卓软件（应用名字通常带有“（Android）”后缀），这样会自动安装 kbox，就会生成这个脚本，或者执行命令 <code>apt -y install kbox</code></p></div><p>安装成功后可在 <code>/home/Kbox/desktop</code> 目录下看到已安装软件的启动图标，双击即可启动。</p><p><img src="https://obs.wanpeng.life/wp-content/uploads/2021/05/rj.png" alt="" /></p><p>实测像开心消消乐、百度网盘、抖音、QQ 等都可以安装并正常使用。</p><p>但是像王者荣耀这种大型游戏会因显示问题无法运行。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      统信 UOS 系统现在做的真是越来越好用，个人也是非常的喜欢，在平时的工作中也经常使用 UOS 系统，万万使用的是鲲鹏 920 处理器的机器，ARM 架构，和大部分手机架构一样，所以按理来说是可以直接在 UOS 系统上运行手机软件的，此系统天生与手机的生态有着千丝万缕的联系。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>UOS 虚拟打印到 PDF 文件</title>
    <link href="https://no5972.moe/cms/archivers/132.html"/>
    <id>https://no5972.moe/cms/archivers/132.html</id>
    <published>2022-08-08T09:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.579Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>这里仅仅是一个笔记。Windows 10 自带了虚拟打印 PDF 文件的功能，其虚拟打印机叫做“Microsoft Print to PDF”，但是原始的 UOS 并没有这个功能，需要进行一些配置。</p><p>UOS 自己的 APT 库里面就有这个虚拟打印的组件。但是系统默认不自带，仍然需要开启开发者模式来手动安装。执行这一条命令即可完成安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install -y cups-pdf</span><br></pre></td></tr></table></figure><p>然后打开打印管理器，此时就会发现多出来了一个虚拟打印机“PDF”。</p><p><img src="https://images.weserv.nl/?url=CSDN%E5%BC%80%E5%A7%8B%E5%B0%81%E7%9B%97%E9%93%BE%E4%BA%86https://img-blog.csdnimg.cn/fe73bea534c94dea9b7d8931719cdb82.png" alt="" /><br />在平时用的软件里面执行打印，然后从打印机下拉框选择这个“PDF”，确认开始打印。然后就可以在这个路径的目录下找到输出的 PDF 文件。这个组件无法显式指定要保存的位置，也确实是美中不足。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/PDF/</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=CSDN%E5%BC%80%E5%A7%8B%E5%B0%81%E7%9B%97%E9%93%BE%E4%BA%86https://img-blog.csdnimg.cn/6fb1c2f8637149d2b464fd325324ebb9.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=CSDN%E5%BC%80%E5%A7%8B%E5%B0%81%E7%9B%97%E9%93%BE%E4%BA%86https://img-blog.csdnimg.cn/45884a71c038415a8c9ff1b6cf3c3886.png" alt="" /><br /><img src="https://images.weserv.nl/?url=CSDN%E5%BC%80%E5%A7%8B%E5%B0%81%E7%9B%97%E9%93%BE%E4%BA%86https://img-blog.csdnimg.cn/6787339b131b48648f7fe37d0e93f1c1.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这里仅仅是一个笔记。Windows 10 自带了虚拟打印 PDF 文件的功能，其虚拟打印机叫做“Microsoft Print to PDF”，但是原始的 UOS 并没有这个功能，需要进行一些配置。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>DebreateForUOS 打包 UOS Electron 应用</title>
    <link href="https://no5972.moe/cms/archivers/131.html"/>
    <id>https://no5972.moe/cms/archivers/131.html</id>
    <published>2022-08-04T03:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.579Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>接下来，熟悉如何打包一个 UOS 应用。现在不少新的桌面应用开始使用 Electron 作为 GUI 框架，它允许使用 JavaScript 来实现 GUI 及其交互功能，并且跨平台也比较好，无需用户配置专门的运行环境就可以直接开箱即用。</p><h1 id="获取-debreateforuos"><a class="markdownIt-Anchor" href="#获取-debreateforuos"></a> 获取 DebreateForUOS</h1><p>首先“DebreateForUOS”可以在星火应用商店下载得到。当然这个应用商店也是需要开启开发者模式才能安装的。</p><h1 id="准备好软件的文件"><a class="markdownIt-Anchor" href="#准备好软件的文件"></a> 准备好软件的文件</h1><p>假设这是一个已经写好的 HelloWorld 的 Electron 应用，并且带有完整的 Electron 环境。在项目根目录输入 <code>./electron ./app</code> 可以打开 HelloWorld 的界面。完整的 Electron 环境可以在 UOS 应用商店搜索下载 Electron 然后从 <code>/opt/apps/com.electron/files/electron</code> 拷贝出来目录。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/55af1e9fae0c4a30a2d4ac930abcc526.png" alt="在这里插入图片描述" /></p><h1 id="准备好软件的图标文件"><a class="markdownIt-Anchor" href="#准备好软件的图标文件"></a> 准备好软件的图标文件</h1><p>在程序目录添加一个 512 x 512 的 PNG 图标作为应用的图标。因为 UOS 的任务栏可以缩放，如果不搞这么高分辨率的图片，可能会出现图标模糊的情况。如果没有这样高分辨率的图标，也可以使用 SVG 格式的图标作为图标。随便起个名字，放到 <code>electron</code> 目录。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d833ef13b20841d6b711486768c4071a.png" alt="在这里插入图片描述" /></p><h1 id="打开-debreateforuos从菜单上的页面-control-文件开始"><a class="markdownIt-Anchor" href="#打开-debreateforuos从菜单上的页面-control-文件开始"></a> 打开 DebreateForUOS，从菜单上的页面-Control 文件开始。</h1><ul><li>包名：要求填写域名加点加软件名。</li><li>版本：你自己定义的软件版本号。</li><li>维护者：当然是填自己的网名了。</li><li>电子邮箱：联系邮箱</li><li>分类：根据此应用的用途来选择类型。它将表征为上架应用商店时所属的归类。</li><li>优先级：我们是应用软件，不是系统组件，建议还是选择 optional。</li><li>架构：我们是面向 UOS 家庭版部署的，当然选择 amd64 了。</li><li>短述：它将表征为应用在双击安装包运行时显示的名称。</li><li>详细描述：它将表征为应用商店中显示的应用描述。</li></ul><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/6ec5061665fb4f2abac72ebdd9093131.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-依赖和冲突"><a class="markdownIt-Anchor" href="#菜单的页面-依赖和冲突"></a> 菜单的页面-依赖和冲突：</h1><p>我们是 Electron 应用，如果没有调用系统 API 的话一般不需要处理这里。</p><h1 id="菜单的页面-info-文件"><a class="markdownIt-Anchor" href="#菜单的页面-info-文件"></a> 菜单的页面-info 文件：</h1><p>也是应用的基本信息，先参考前面的 Control 文件来填写。这里还没搞懂作用，也有博客描述过这里的作用，可以参考《linux中dpkg里的info是干嘛的》这篇文章。</p><ul><li>这里建议如实填写应用权限，如果不如实填写的话有可能 Linux 系统底层会限制一些功能，例如是否使用剪贴板，是否使用通知等。</li></ul><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/dd950e23e261483284a5ef1f4201ffeb.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-desktop-文件"><a class="markdownIt-Anchor" href="#菜单的页面-desktop-文件"></a> 菜单的页面-Desktop 文件：</h1><p>这一步很重要，它将影响应用在启动器菜单的加载。</p><ul><li>如果我们的应用软件是手动打开的话（而不是作为系统服务来运行的话），就肯定要勾选创建系统菜单启动器。</li><li>我们的应用是一个应用程序，所以类型肯定是选择 Application。</li><li>我们是基于 Electron 的 GUI 应用，所以不需要勾选“终端”。否则就会多出来一个显示调试信息的小黑板，这作为面向大众用户的 GUI 应用是不合适的。</li><li>基于 Electron 的应用编码印象中都是选择 UTF-8 的。</li><li>启动通知没仔细看，他的描述是“启动时在系统面板显示一个通知”，但是之前曾经打包过的应用，运行时没有发现通知。</li><li>Name 将表征为应用在启动器菜单以及 UOS 应用商店的应用管理显示的名称。</li><li>注释将表征为应用在 UOS 应用商店的应用管理的应用列表的应用名称下面显示的简述，以及鼠标悬停在启动器菜单项时显示的提示信息。</li><li>MIME 类型这里没有给出提示，可以先留空。</li><li>可执行命令或路径：这里试了很久，最后是填绝对路径才解决的。这里的 HelloWorld 应用要填写</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/apps/包名/files/electron /opt/apps/包名/files/应用目录</span><br></pre></td></tr></table></figure><p>，其中包名就是最前面指定 Control 文件时填写的包名，而应用目录就是整理软件文件时的实际应用业务代码存放的目录。这里填写的是</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/apps/moe.no5972.electrondemo/files/electron /opt/apps/moe.no5972.electrondemo/files/app</span><br></pre></td></tr></table></figure><ul><li>图标：也是要填写图标文件的绝对路径。这里填写的是</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/apps/moe.no5972.electrondemo/files/icon.png</span><br></pre></td></tr></table></figure><ul><li>分类：程序的类别决定了程序在系统启动器菜单项中的位置。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/050d18f9bf5f4cbba0ce2affbb794490.png" alt="在这里插入图片描述" /></li></ul><h1 id="菜单的页面-icon-文件"><a class="markdownIt-Anchor" href="#菜单的页面-icon-文件"></a> 菜单的页面-icon 文件：</h1><p>这一步决定了程序在上架时显示的图标。从左侧的树形文件列表找到最开始放进去的图标文件，拖到右边的列表去。然后根据使用图标文件的格式选择文件格式和尺寸。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/8e3fdb3f4c504a238c10ef24164c4d1f.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-file-目录文件"><a class="markdownIt-Anchor" href="#菜单的页面-file-目录文件"></a> 菜单的页面- file 目录文件：</h1><p>这一步也很重要，这决定了软件本体文件以及要放置的目标位置。注意首先将目标目录选择自定义，然后把输入框的“{包名}”改成之前在 Control 文件填写的包名。因为这里可能有 bug，如果选择前面的带有“{包名}”的选项，打包出来的程序安装后并不会安装到实际的包名目录，而是就放在了一个叫“{包名}”的目录。这里强调一下。</p><p>然后在左侧找到整理好的 electron 目录，展开，然后使用 Shift 选中目录下的所有文件，然后注意右键选择 Add to project，不要直接拖，否则他只会拖动鼠标指向的那一个文件，这样就得一个一个的拖了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/8ad69a664acd4e0a9d99e57788ceeee1.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-添加脚本"><a class="markdownIt-Anchor" href="#菜单的页面-添加脚本"></a> 菜单的页面-添加脚本：</h1><p>如果需要在安装或者卸载时执行一些系统命令，那么在这里可以配置。注意有些涉及管理员操作的命令还是要加 <code>sudo</code> 前缀的。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/1315709b90254f2fb6cbed0e9add84af.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-更新日志"><a class="markdownIt-Anchor" href="#菜单的页面-更新日志"></a> 菜单的页面-更新日志：</h1><p>它将表征为软件在应用商店显示的更新信息。紧迫性表示此次更新的重要程度。如果这是同一个软件的新版本，那么就需要认真填写版本号和更新情况。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/07623dca61924801b30d67e56615aa3d.png" alt="在这里插入图片描述" /></p><h1 id="菜单的页面-版权文件"><a class="markdownIt-Anchor" href="#菜单的页面-版权文件"></a> 菜单的页面-版权文件：</h1><p>如果这个软件有许可协议，那么可以在此填写。如果是遵循某种开源协议开源的软件，也可以直接选择现成的开源协议模板。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/12bfbccf6f1c4955b9a17994c9bb6902.png" alt="在这里插入图片描述" /></p><h1 id="开始构建"><a class="markdownIt-Anchor" href="#开始构建"></a> 开始构建</h1><p>然后就可以到菜单的页面-构建来开始打包了。点击中间的图标，指定打包 deb 文件的位置。然后稍等片刻，打包完成！</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/85f84683154f4676aedffc8826439eba.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/ee2cafe74b4a45259c3aefd3b6fa9af3.png" alt="在这里插入图片描述" /></p><h1 id="测试安装"><a class="markdownIt-Anchor" href="#测试安装"></a> 测试安装</h1><p>测试安装打包好的文件，如果启动器的菜单项正常显示，并且可以正常打开，那么打包就是完美的。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d7a5bbe9ceea4b0db77d9592157bead3.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/50178062cb3244e6bc5c576025f80bf5.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/74b62f0c2d2d4083b43b256385aa27bb.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      接下来，熟悉如何打包一个 UOS 应用。现在不少新的桌面应用开始使用 Electron 作为 GUI 框架，它允许使用 JavaScript 来实现 GUI 及其交互功能，并且跨平台也比较好，无需用户配置专门的运行环境就可以直接开箱即用。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>通过 U 盘安装 UOS 家庭版并和原来 Windows 组成双系统</title>
    <link href="https://no5972.moe/cms/archivers/130.html"/>
    <id>https://no5972.moe/cms/archivers/130.html</id>
    <published>2022-07-29T12:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.575Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="本安装记录仅适用于-x86-架构的电脑"><a class="markdownIt-Anchor" href="#本安装记录仅适用于-x86-架构的电脑"></a> 本安装记录仅适用于 x86 架构的电脑。</h1><h1 id="1-腾出要安装系统的分区"><a class="markdownIt-Anchor" href="#1-腾出要安装系统的分区"></a> 1. 腾出要安装系统的分区</h1><p>首先将要安装 UOS 系统的电脑空出来一个分区并随便设置一个卷标，用来装 UOS 系统。这里空出来的分区大小是 200GB。可以把分区保留而不需要删除分区。到时候 UOS 安装程序也可以删除分区。</p><h1 id="2-下载-uos-安装镜像并制作安装盘"><a class="markdownIt-Anchor" href="#2-下载-uos-安装镜像并制作安装盘"></a> 2. 下载 UOS 安装镜像并制作安装盘</h1><p>从 UOS 家庭版官网选择“镜像安装”下载安装的ISO镜像。</p><p>准备一个已制成 Ventoy 启动盘的 U 盘，将下载好的 ISO 镜像拷贝到 U 盘。</p><h1 id="3-设置安装分区并进行安装"><a class="markdownIt-Anchor" href="#3-设置安装分区并进行安装"></a> 3. 设置安装分区并进行安装</h1><p>将 U 盘插入到需要安装的电脑上，进入引导菜单，选择 UEFI 模式的 U 盘进入。看到 Ventoy 的界面后选择 UOS 的安装镜像进入。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/ae68968ef51b43d6ac1cc416e8f8f07d.jpeg" alt="在这里插入图片描述" /></p><p>看到 UOS 的欢迎界面，此时选择自定义设置，然后选择手动安装。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/4bfaa1b45c2147da923193c7df09905d.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/7d07735a523145188f726d66892e12ca.png" alt="在这里插入图片描述" /></p><p>原有的安装系统和存放资料的分区不要动，根据最开始设置的卷标找到事先空出来的分区，将其删除，创建一个略小于空出来的分区大小的分区（一般比原来小 1 - 2GB 左右），格式为 ext4，挂载点注意选择“/”。再创建一个分区，格式选择交换分区，大小为原来小出来的那部分大小。选中刚才创建的 ext4 分区，然后他会显示一个“安装到此”的字样。确认无误后点击下一步确认开始。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/b22a296a3ff347feba918c8daaaff9b3.png" alt="在这里插入图片描述" /></p><p>大约 10 到 15 分钟时间可以完成安装。进度条走完后，点击立即重启，点击后立刻拔下 U 盘。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/359a4752597446bc8d1df09e3be3d86a.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/eada7e130bba42429adc137ee83c4620.png" alt="在这里插入图片描述" /></p><p>稍等片刻即可进入到 OOBE 界面。此时按照提示输入一个新建用户名，并指定开机密码。确认后会显示正在更新系统配置，稍等片刻就可以进入 UOS 桌面了。</p><h1 id="4-激活系统"><a class="markdownIt-Anchor" href="#4-激活系统"></a> 4. 激活系统</h1><p>未激活的情况下只能使用 30 天。可以到 UOS 家庭版官网寻找激活方式。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d8172bd72f8e4b4b94b4b1c5ddbb2768.png" alt="在这里插入图片描述" /></p><p>激活需要登录 Union ID 的账号，没有的话需要注册。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/fe88364197e844fe88b9f721ce51a54a.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/98e010e05f974de18851f1e676c4d6df.png" alt="在这里插入图片描述" /></p><p>此激活是绑定 Union ID 和设备的。如果系统损坏需要重装系统的话，重装系统后无需重新输入激活码，只要重新登录 Union ID 账号即可自动激活。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/0722e9130ef542268ab7c1991cde809c.png" alt="在这里插入图片描述" /></p><h1 id="5-设置双系统引导"><a class="markdownIt-Anchor" href="#5-设置双系统引导"></a> 5. 设置双系统引导</h1><p><strong>特别注意安装后千万不要在 BIOS 设置里面改启动顺序，尤其是 UEFI 方式引导的电脑。否则就会导致 UOS 系统无法引导。这种情况需要重装 UOS 系统才能解决。</strong></p><p>如果想调整启动顺序，务必在 UOS 的系统设置里面的通用 - 启动菜单里面修改。进入该界面后用鼠标直接在右上角的小窗口点击要默认选中的启动项即可，如果要默认选中 Win10/11 的启动项则在这个小窗口里面点选“Windows Boot Manager”即可。如果有多个分区或者多个硬盘都安装了 Windows 的话，这里的“Windows Boot Manager”后面会有括弧标注分区代号（<code>sda</code>，<code>sdb</code>，<code>sdc</code> 等表示硬盘，字母顺序对应硬盘插在主板上的 SATA1 - 4 的或者主从盘 M.2 插口的顺序，<code>sda</code> 等后面的数字表示分区），按照显示的分区代号来确定。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/a1e3713fbf0c4f5ca213e318b71f42c8.png" alt="在这里插入图片描述" /></p><p>如果无法确定的话可以从文件管理器来确认，双击桌面上的“计算机”图标，找到要默认启动的系统所在的分区后右键在终端中打开，输入 <code>pwd</code>回车看一看路径里面的分区代号是什么。</p><p>部分插图来自 UOS 家庭版官方文档。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      首先将要安装 UOS 系统的电脑空出来一个分区并随便设置一个卷标，用来装 UOS 系统。这里空出来的分区大小是 200GB。可以把分区保留而不需要删除分区。到时候 UOS 安装程序也可以删除分区。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>UOS 移植 Flash Player 页游微端</title>
    <link href="https://no5972.moe/cms/archivers/129.html"/>
    <id>https://no5972.moe/cms/archivers/129.html</id>
    <published>2022-07-25T02:30:00.000Z</published>
    <updated>2026-04-03T02:40:01.430Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>目前大家可能仍有需要用到 Flash Player 的情况。这里尝试先将部分页游的微端移植到 UOS 上来。鄙人尽最大可能降低操作的复杂度，不会像那篇《GNASH 移植》那样那么复杂！</p><p>从 UOS 的应用商店下载 Electron，下载好以后从</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/apps/com.electron/files</span><br></pre></td></tr></table></figure><p>目录里面把 <code>electron</code>这个目录拷出来，放在一个自己找得到的地方。</p><p>回到 Windows，到小花仙官网下载 win8/win10 版本的微端。然后用 Universal Extractor 的 LessMSI Extraction 解压这个 MSI 文件。把里面的 <code>Binary/resources/app</code>目录上载到 UOS 的刚才拷出来的 <code>electron</code>目录里面。</p><p>在 UOS 里面，把 <code>app/assets</code>里面的 <code>hua.js</code>修改，第 126，127 行的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="string">'linux'</span>:</span><br><span class="line">pluginName = <span class="string">'libpepflashplayer.so'</span></span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="string">'linux'</span>:</span><br><span class="line">pluginName = <span class="string">'libpepflashplayer.plugin'</span></span><br></pre></td></tr></table></figure><p>之所以这么改，是因为米叔他那个上面的 SWFObject.js 不识别 Linux 系统下的 <code>.so</code>的 Flash Player 组件文件，换一个扩展名才行。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d09152098787499dad9f5ed1856a1862.png" alt="在这里插入图片描述" /></p><p>从一切可以找得到的地方下载版本 31 的 Flash Player Linux PPAPI 64 位的版本。解压出来的文件名通常是 <code>flash_player_ppapi_linux_x86_64.tar.gz</code>。再从这个 gz 里面提取出 <code>libpepflashplayer.so</code>文件，放到刚才的 <code>app/assets</code>目录，重命名为<code>libpepflashplayer.plugin</code>。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c9ad9e776c3146bda859e1467c8c05aa.png" alt="在这里插入图片描述" /></p><p>然后修改 hosts，屏蔽掉检测版本的域名。首次运行前务必屏蔽这些域名，否则就会出现“该版本过旧，不支持运行，请升级后使用”的提示，遇到这个提示的话修改起来很麻烦（具体修改参考后面的附注）。到 UOS 应用商店下载 SwitchHosts 并打开，打开 My Hosts，然后添加这些规则，然后点击开关来打开：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1 geo2.adobe.com</span><br><span class="line">127.0.0.1 fpdownload2.macromedia.com</span><br><span class="line">127.0.0.1 fpdownload.macromedia.com</span><br><span class="line">127.0.0.1 macromedia.com</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/1ef904d0dc2b4397860b61a469f46dc2.png" alt="在这里插入图片描述" /></p><p>在 <code>electron</code>目录新建一个 <code>.sh</code>的任意文件名的文件。添加这些内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./electron ./app</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/28e491801397442d8dc67b9277ad0bec.png" alt="在这里插入图片描述" /></p><p>之后就可以通过双击此 sh 文件选择“运行”来使用了。</p><p>如果想换成赛尔号，则将 <code>app/assets/</code>的 <code>config.json</code>里面的 <code>player_name</code>改成</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;seer.61.com&#x2F;play.shtml?from&#x3D;we_seer</span><br></pre></td></tr></table></figure><p>即可。需要访问其他包含 Flash 内容的网页也可以改成任意网址。</p><div class="note info"><h4 id="附注修复该版本过旧不支持运行请升级后使用"><a class="markdownIt-Anchor" href="#附注修复该版本过旧不支持运行请升级后使用"></a> 附注：修复“该版本过旧，不支持运行，请升级后使用”</h4><p>请删除 <code>/data/home/你的用户名/.config/WeHua/Pepper Data</code>这个目录，然后参照前面的说明修改 hosts，如果已经添加了域名则忽略这个 hosts。</p></div><p>获取 UOS 家庭版欢迎前往 <a href="https://home.uniontech.com" target="_blank" rel="noopener">https://home.uniontech.com</a> 。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      目前大家可能仍有需要用到 Flash Player 的情况。这里尝试先将部分页游的微端移植到 UOS 上来。鄙人尽最大可能降低操作的复杂度，不会像那篇《GNASH 移植》那样那么复杂！
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>Leancloud 绑定自定义域名</title>
    <link href="https://no5972.moe/cms/archivers/128.html"/>
    <id>https://no5972.moe/cms/archivers/128.html</id>
    <published>2022-07-20T07:50:00.000Z</published>
    <updated>2023-03-15T10:29:24.571Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>昨天收到邮件提醒，Leancloud 共享域名将于 8 月 1 日停止服务，需要使用自己的域名。</p><p>由于本站评论系统依赖于 Leancloud 作为后端，这里需要将业务绑定到自己的域名上。按照 Leancloud 的指引来绑定自己的域名。</p><p>打开 Leancloud 的后台，打开自己的业务，选择设置-域名绑定。点击绑定新域名按钮，然后输入自己注册的独立域名的三级域名！第三级域名这里可以随便写，当然，为了便于区分，这里第三级域名就直接用 <code>leancloud</code> 好了。</p><p>其他的选项默认，然后直接点击确定。这时候他会提示需配置 DNS。前往注册域名的 NameServer 中指定的解析后台（这里的是 DNSPod），添加一条记录，主机记录填写刚才写的第三级域名，<strong>记录类型这里注意选择 CNAME</strong>，然后记录值填写他提示的推荐 DNS 配置。点击确定。</p><p>稍等片刻，刷新 Leancloud 的后台，然后就会显示已绑定。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/fe110c03e0044420b2e4f0e09c91d671.png" alt="" /></p><p>前往网站之前配置评论的地方，这里的 hexo 是 <code>themes/next/_config.yml</code>，找到 <code>valine.serverURLs</code> 属性，改成刚才在 Leancloud 后台配置的域名（注意不是 CNAME 的记录值）。然后重新部署页面，再看看评论有没有正常加载。如果正常加载，那么就可以继续使用评论系统了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      昨天收到邮件提醒，Leancloud 共享域名将于 8 月 1 日停止服务，需要使用自己的域名。由于本站评论系统依赖于 Leancloud 作为后端，这里需要将业务绑定到自己的域名上。按照 Leancloud 的指引来绑定自己的域名。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>统信 UOS 连接 Windows 共享打印机</title>
    <link href="https://no5972.moe/cms/archivers/127.html"/>
    <id>https://no5972.moe/cms/archivers/127.html</id>
    <published>2022-07-04T09:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.571Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>系统是统信 UOS 家庭版。由于 VMWare 虚拟机直接连接打印机，主机会蓝屏，所以这里改为采用连接 Windows 共享的打印机来测试 UOS 的系统打印功能。</p><h1 id="在-windows-配置打印机共享"><a class="markdownIt-Anchor" href="#在-windows-配置打印机共享"></a> 在 Windows 配置打印机共享</h1><p>在 Windows 系统的“启用或关闭 Windows 功能”开启 LPD 功能。点击开始按钮，输入“启用或关闭Windows功能”回车即可打开。或者也可以在运行输入特别的命令快速打开：</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,<span class="number">2</span></span><br></pre></td></tr></table></figure><p>打开后展开“打印和文件服务”，勾选“LPD 打印服务”并确定。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/fa50a9881365472e8cfc876c0c75bff4.png" alt="" /></p><p>还是在控制面板，点选“查看设备和打印机”。或者也可以在运行输入特别的命令快速打开：</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">explorer shell:::&#123;A8A91A66-<span class="number">3</span>A7D-<span class="number">4424</span>-<span class="number">8</span>D24-<span class="number">04</span>E180695C7A&#125;</span><br></pre></td></tr></table></figure><p>将已经连接的打印机右键，选择打印机属性，共享选项卡，勾选共享这台打印机，并输入一个不包含空格和特殊字符的名称，确定。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/ce71937fdf594be58e46624984506dc1.png" alt="" /></p><p>这样就完成了 Windows 端的打印机共享。</p><h1 id="在-uos-连接由-windows-共享的打印机"><a class="markdownIt-Anchor" href="#在-uos-连接由-windows-共享的打印机"></a> 在 UOS 连接由 Windows 共享的打印机</h1><p>到打印机厂商的网站下载该型号打印机的 Linux 驱动。这里的 UOS 家庭版默认是 64 位的，所以下载 64 bit 的驱动。</p><p>下载好之后开启开发者模式，在文件管理器中找到 <code>install.sh</code> ，右键空白处在终端中打开，执行<code>sudo ./install.sh</code>，按提示进行驱动安装。</p><p>安装好之后，在启动器菜单会出现配置打印机的选项，点击添加，选择之前打印机的型号，下一步选择“LPD”，主机名或 IP 地址输入之前 Windows 电脑的 IP 地址斜杠共享的打印机名称（可在 Windows 电脑的命令提示符中执行 <code>ipconfig</code> 来查看），此处测试的为</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">192.168.49.1&#x2F;CanonLBP62306240</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/572e4e1178a448649ed1c8fc0082d435.png" alt="" /></p><p>点击注册，这样就完成了打印机的连接和配置。</p><p>如果需要测试效果的话，可以在启动器打开打印管理器，此时会发现多出来了一个打印机，这就是刚才添加的打印机，选中它点击打印测试页，然后就开始打印了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/ab238525f8984600a00587c55b1d288f.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      系统是统信 UOS 家庭版。由于 VMWare 虚拟机直接连接打印机，主机会蓝屏，所以这里改为采用连接 Windows 共享的打印机来测试 UOS 的系统打印功能。
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
    
  </entry>
  
  <entry>
    <title>去除 Windows 11 的“了解此图片”图标</title>
    <link href="https://no5972.moe/cms/archivers/126.html"/>
    <id>https://no5972.moe/cms/archivers/126.html</id>
    <published>2022-06-17T02:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.567Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Windows 11 近期更新在桌面新增了一个“了解此图片”图标。有不少用户对此图标相当反感，希望去掉它。<a href="https://winaero.com/how-to-remove-learn-more-about-this-picture-icon-in-windows-11/" target="_blank" rel="noopener">Winaero 的 Sergey Tkachenko 前两天提出了一个去除此图标的方法</a>，可以参考一下。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/3d45c9d298c296891a42c534fbbfc595.png" alt="" /></p><p>从注册表中添加有关键值。右键开始按钮，运行，输入 regedit 回车。前往</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel</span><br></pre></td></tr></table></figure><p>右键这个 NewStartPanel，选择新建 - DWORD (32位) 值，命名为</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;2cc5ca98-6485-489a-920e-b3e88a6ccce3&#125;</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/f0067f1b4c3e289f5bd1ac5cb0e880a9.png" alt="" /></p><p>双击新建的键值，将值设置为 1。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/76a73b0efe952ee522fc81b6895da428.png" alt="" /></p><p>关闭注册表编辑器，在桌面空白处右键刷新即可去除“了解此图片”图标。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/de517cbf945453a1132be6db6d0fe308.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/9edb9497119c3b9ab747934845f3b597.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Windows 11 近期更新在桌面新增了一个“了解此图片”图标。有不少用户对此图标相当反感，希望去掉它。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>即日起本博客停止在 Gitee 部署</title>
    <link href="https://no5972.moe/cms/archivers/125.html"/>
    <id>https://no5972.moe/cms/archivers/125.html</id>
    <published>2022-06-13T09:00:00.000Z</published>
    <updated>2022-06-13T09:12:12.818Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>鉴于 Gitee 近期大量限制普通用户功能，从即日起本博客停止在 Gitee 部署。请大家从主域名 <a href="https://no5972.moe">https://no5972.moe</a> 访问和浏览本站点。原有的 <a href="https://no5972.gitee.io" target="_blank" rel="noopener">https://no5972.gitee.io</a> 站点及其所有下属子目录页面停止提供，相应域名取消。由此带来不便，还请谅解。</p><p>wujiuqier</p><p>2022-06-13</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      鉴于 Gitee 近期大量限制普通用户功能，从即日起本博客停止在 Gitee 部署。请大家从主域名访问和浏览本站点。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>Windows 11 破解新安装系统必须联网的步骤</title>
    <link href="https://no5972.moe/cms/archivers/124.html"/>
    <id>https://no5972.moe/cms/archivers/124.html</id>
    <published>2022-06-13T03:00:00.000Z</published>
    <updated>2025-05-29T03:28:22.214Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>250529 更新：<code>bypassnro</code> 方法可能也已经失效。这里给出另外一个办法。按照原来的步骤到命令提示符的界面时使用</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">start</span> ms-cxh:localonly</span><br></pre></td></tr></table></figure><p>此时将弹出一个旧版的创建用户的窗口，这个也是用来创建本地账户的，密码不写的话就是不创建密码。点击下一步，就直接到“此操作可能需要几分钟”的界面了。</p><p>此方法来源：<a href="https://www.bilibili.com/video/BV1SXZcYzEuh?p=2" target="_blank" rel="noopener">B站@世界隐性</a></p><p><img src="https://images.weserv.nl/?url=https://img2024.cnblogs.com/blog/2259503/202505/2259503-20250529112152543-1115582199.png" alt="" /></p><hr /><p>231009 更新：此法现在可能已经失效。目前通行的做法是按照原来的步骤到命令提示符的界面时使用</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">oobe\bypassnro</span><br></pre></td></tr></table></figure><p>来跳过联网的步骤。</p><hr /><p>新机器的新更新的 Windows 11 系统增设了必须要联网才能通过配置的步骤，也就是那个 OOBE。通过执行命令可以跳过此联网步骤直接到下一步。(图片来自AskVG)</p><p>在看到“您需要连接到 Internet 才能继续您的设置”这一屏的时候，按下 Shift + F10，此时会弹出命令提示符的界面。输入这个命令回车，就可以跳过此联网步骤直接到下一步，而无需连接网络。此后将创建本地账户。<code>taskkill /F /IM oobenetworkconnectionflow.exe</code></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/4dc3d61a03a84a9a934f28649c27b1b9.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      新机器的新更新的 Windows 11 系统增设了必须要联网才能通过配置的步骤，也就是那个 OOBE。通过执行命令可以跳过此联网步骤直接到下一步。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>传新版支持光追的 MikuMikuDance 正由另一人研发——MikuMikuDance 2 Project</title>
    <link href="https://no5972.moe/cms/archivers/123.html"/>
    <id>https://no5972.moe/cms/archivers/123.html</id>
    <published>2022-02-15T09:00:00.000Z</published>
    <updated>2024-09-26T09:56:05.996Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.tamafutoshi.net/mmd2.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MikuMikuDance%202%20Project-brightgreen" alt="MikuMikuDance 2 Project" /></a></p><h1 id="项目介绍"><a class="markdownIt-Anchor" href="#项目介绍"></a> 项目介绍</h1><p>最近更新：2022/01/09</p><p>欢迎来到下一代 MMD 项目：为每个人准备的新的 3D 操场。MMD2 是完全从头开始构建的，这充分表明我们拥有完整的软件底层控制。我们想要什么功能就可以创建什么功能。<br />不需要计算机图形学的专业知识，到时候会有专门的教程。您可以创建自己的渲染资源或使用每个人共享的资源。渲染资源可以是任意内容，从图像、音乐文件，到模型、着色器或者舞台……</p><h1 id="重要通知"><a class="markdownIt-Anchor" href="#重要通知"></a> 重要通知</h1><p>我们这个 MMD2 并不是原来 MMD 的官方升级。这个软件后续可能会改名。</p><p>这是一个另外的项目，作者并没有原来 MMD 的源代码。模型和动作数据由社区分享。</p><h1 id="最新进展油管视频"><a class="markdownIt-Anchor" href="#最新进展油管视频"></a> 最新进展（油管视频）</h1><p><a href="https://www.youtube.com/embed/49Vz_WRWYow" target="_blank" rel="noopener">https://www.youtube.com/embed/49Vz_WRWYow</a></p><h1 id="软件预览"><a class="markdownIt-Anchor" href="#软件预览"></a> 软件预览</h1><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/032b3788da5e4b377f07af5ab990cca1.png" alt="" /><br /><img src="https://www.tamafutoshi.net/mmd2/img/mmd2-apho2-bronya-1920x1080.jpg" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/1f14c6893034108bfac9e9937be74c58.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/a56a9752721105650890afa6f581aecb.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/85877c256439876eb8f12e32e73dce25.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/d53d67a4bce70e7ca27c0001eee23f72.png" alt="" /></p><table><tbody><tr><td>  <video controls src="https://www.tamafutoshi.net/mmd2/video/mmd2-tda-mikuv4-1080p.mp4"></video><br>初音模型 快速浏览</td><td>  <video controls src="https://www.tamafutoshi.net/mmd2/video/mmd2-tda-kizuna-ai-1080p.mp4"></video><br>爱酱模型 快速浏览</td></tr></table></table><h1 id="构架"><a class="markdownIt-Anchor" href="#构架"></a> 构架</h1><table><thead><tr><td>名称</td><td>说明</td></thead><tbody><tr><td>编程语言</td><td>C++</td></tr><tr><td>3D API</td><td> <a href="https://docs.microsoft.com/en-us/windows/win32/direct3d12/directx-12-programming-guide" target="_blank" rel="noopener">DirectX 12</a> <br>用于 3D 渲染操作</td></tr><tr><td>2D API</td><td><a href="https://docs.microsoft.com/en-us/windows/win32/direct2d/direct2d-portal" target="_blank" rel="noopener">Direct2D</a><br>用于 2D 渲染操作，例如渲染软件界面</td></tr><tr><td>多线程</td><td>支持！<br>多线程允许我们分解复杂的场景，并利用高 CPU 内核数获得更高的 FPS。</td></tr><tr><td>物理 API</td><td><a href="https://developer.nvidia.com/gameworks-physx-overview" target="_blank" rel="noopener">NVIDIA PhysX</a> <br>用于模型的物理计算，例如刚体和衣服</td></tr><tr><td>最低系统要求</td><td>Windows 10，以及兼容 DirectX 12 的 GPU</td></tr></tbody></table><h1 id="当前项目状态"><a class="markdownIt-Anchor" href="#当前项目状态"></a> 当前项目状态</h1><ul><li>加载模型：已做</li><li>镜头：已做</li><li>着色器材质：已做</li><li>骨骼控制器：已做</li><li>变形：只做了顶点变形</li><li>PhysX 和刚体：已做</li><li>IK 解算：已做</li><li>动画系统：已做</li><li>待完成：投影映射，更多种类的变形支持，界面，光线追踪，引擎核心升级……</li></ul><h1 id="功能"><a class="markdownIt-Anchor" href="#功能"></a> 功能</h1><p>原来 MMD 核心功能（加载模型/动画/音频等）到时候在 MMD2 都有。也会根据社区反映情况再添加新的功能。<br /><span style="color:red;">着色器：</span>可以在“运行时”中编译着色器，或者也可以使用其他贡献者提供的编译好的着色器。<br /><a href="https://baike.baidu.com/item/%E5%85%89%E7%BA%BF%E8%BF%BD%E8%B8%AA/3334993" target="_blank" rel="noopener">光线追踪</a>会上。需要 Windows 10 2018 年 10 月更新（版本 1809），以及支持光追的 GPU。</p><h1 id="和原来版本的变化"><a class="markdownIt-Anchor" href="#和原来版本的变化"></a> 和原来版本的变化</h1><p><span style="color:red;">Truevision TGA（.tga）贴图：</span>不支持这种贴图格式了。要适应 MMD2，需要将这种贴图转换为 .png 或者 .dds 格式。可以网上搜索在线转换 TGA 到 PNG 的工具，或者也可以等作者的教程。<br /><span style="color:red;">刚体和关联（joint）数据：</span>刚体和关联数据可以在 MMD 很好的使用，但是在 MMD2 不能用。需要通过 PhysX 规范为 MMD2 更正它们。</p><h1 id="开发历史"><a class="markdownIt-Anchor" href="#开发历史"></a> 开发历史</h1><p><span style="color:red;">2022/01</span>：添加了边缘着色器和一些照明计算。</p><p><span style="color:red;">2021/10</span>：IK 解算算法已修复。效果很好。</p><p><span style="color:red;">2021/09</span>：添加动画控制器和反向运动学（IK）解算器。</p><p>作者自己实现了动画和关键帧。IK 解算器很难，因为不知道这是如何在 MMD 中设置的。目前看来不稳定。</p><p>关于刚体关节设置。必须将约束值乘以/除以某个数值才能使关节运动。例如，位置弹簧为 10000，而旋转弹簧仅为 10 。</p><p>作者认为 TDA 大佬正试图通过 Bullet Physics 来稳定。一些关节值也丢失了，所以必须为 PhysX 设置一个合适的数值。</p><p><span style="color:red;">2021/07</span>：添加刚体关节和基本骨骼控制器。</p><p>检查了 TDA 大佬模型刚体/关节数据，发现所有值都是正确的。但在最初的 MMD 程序中，它看起来并不稳定。也许是 Bullet Physics 的原因？</p><p><span style="color:red;">2021/04</span>：增加了用于物理计算的刚体。</p><p><span style="color:red;">2021/02</span>：增加了 VMD 读取功能。</p><p><span style="color:red;">2021/01</span>：新增 NVIDIA PhysX 4.0。所有物理计算/模拟都将使用 PhysX 。</p><p><span style="color:red;">2020/12</span>：增加了镜头和抗锯齿功能。抗锯齿是使用多采样抗锯齿（MSAA）。</p><p><span style="color:red;">2020/11/29</span>：项目信息首次发布。</p><p><span style="color:red;">2020/11</span>：DirectX 11 的支持被取消，因为它使得开发时间翻了一番，而 DirectX 12 具备了此项目需要的所有功能。所以继续使用DirectX 12。</p><p><span style="color:red;">2020/08</span>：开始用 DirectX 11 和 DirectX 12 为 MMD2 制作框架。</p><p><span style="color:red;">2019/11</span>：作者有了制作 MMD2 的想法。作者开始学习 DirectX 11 的 C++ 和图形编程。当时作者认为这个 MMD2 应同时支持 DirectX 11 和 DirectX 12。</p><h1 id="其他信息"><a class="markdownIt-Anchor" href="#其他信息"></a> 其他信息</h1><p>关于原来的 MMD 应用，作者不知道原来的 Higuchi 大佬会不会继续开发。他可能还会再发布原来 MMD 程序的更新。原来的 MMD 软件相关的信息大家可以自行上网查找。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      欢迎来到下一代 MMD 项目：为每个人准备的新的 3D 操场。MMD2 是完全从头开始构建的，这充分表明我们拥有完整的软件底层控制。我们想要什么功能就可以创建什么功能。不需要计算机图形学的专业知识，到时候会有专门的教程。您可以创建自己的渲染资源或使用每个人共享的资源。渲染资源可以是任意内容，从图像、音乐文件，到模型、着色器或者舞台……
    
    </summary>
    
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>冷饭热炒：手机 QQ 手动领取超级 QQ 秀内测资格</title>
    <link href="https://no5972.moe/cms/archivers/122.html"/>
    <id>https://no5972.moe/cms/archivers/122.html</id>
    <published>2022-02-10T09:00:00.000Z</published>
    <updated>2022-02-10T09:07:08.813Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>这是截至 2 月 10 日可以使用的一个手动领取超级 QQ 秀内测资格的操作过程。2022 年 2 月 10 日，老马宣布上线了超级 QQ 秀。如果想玩但是又看不到入口的可以尝试通过此法手动领取内测资格。</p><p>首先将手机 QQ 更新到最新版。点击右下角的“动态”，选择“小世界”。点击右上角的放大镜按钮，然后就可以看到一个“超级 QQ 秀”的选项。这个可能很快就会消失，如果确实消失了看不到了可以使用备用链接进入。备用链接后续看情况要不要贴上去。</p><p>备用链接（请使用手机 QQ 来访问）：<a href="https://show.qq.com/cp/web202201xnxz/index.html" target="_blank" rel="noopener">https://show.qq.com/cp/web202201xnxz/index.html</a></p><p>点击后会出现一个横幅“点击查看活动详情”，点开后拉到下边就能看到一个“抢体验资格”按钮。点击后跳转下一个页面，还是往下拉，会看到第二个按钮“抢先体验”。然后，看到“恭喜你获得超级 QQ 秀限量测试资格”字样的时候就成功领取了内测资格。</p><p>接下来，点击“关注公众号”，点击“领取福利”按钮。点击按钮下载资源包，再然后点击“去装扮”。稍等加载，就可以进入超级 QQ 秀的界面了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这是截至 2 月 10 日可以使用的一个手动领取超级 QQ 秀内测资格的操作过程。如果想玩但是又看不到入口的可以尝试通过此法手动领取内测资格。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>不用修改注册表和组策略也能在 Win11 报名教师资格证</title>
    <link href="https://no5972.moe/cms/archivers/121.html"/>
    <id>https://no5972.moe/cms/archivers/121.html</id>
    <published>2022-02-05T15:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.563Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>看了另一个大佬 <a href="https://space.bilibili.com/451475014" target="_blank" rel="noopener">@STR-BSOD</a> 的 B 站视频 <a href="https://www.bilibili.com/video/BV1Dg411G7w6" target="_blank" rel="noopener">BV1Dg411G7w6</a> ，鄙人根据视频中的一个点整出了一个更简单的方法。首先在大家平时用的浏览器里面正常打开报名系统，到了选择你的省区市然后出现“点击登录”按钮的时候，右击这个按钮，选择复制链接。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/a02dd588c69d436f926372a8560a7996.png" alt="" /></p><p>右键开始按钮，选择“Windows 终端”。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/d9c038a8d0194c2cb62bf181612beef1.png" alt="" /></p><p>然后输入该命令然后回车。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hh.exe 刚才你复制的地址</span><br></pre></td></tr></table></figure><p>例如，鄙人的湖北省的就是</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hh.exe http://ntcebm2.neea.edu.cn/apply</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/bb226446bd23484b86de11a791f91d45.png" alt="" /></p><p>稍等片刻，右上角会弹出一个浏览器窗口，大家就可以在这里面报名教师资格证了，这个就是 IE 浏览器的内核。如果嫌小了可以把窗口拉大。 <strong>此法无需设置 IE 兼容性视图设置</strong> ，鄙人查了 UA 了，内核貌似是 IE7。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/514d540e3a5449cc8d71e361f8bce79a.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      看了另一个大佬 @STR-BSOD 的 B 站视频 BV1Dg411G7w6 ，鄙人根据视频中的一个点整出了一个更简单的方法。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>杀人的网络暴力不整治不行了</title>
    <link href="https://no5972.moe/cms/archivers/120.html"/>
    <id>https://no5972.moe/cms/archivers/120.html</id>
    <published>2022-01-26T01:00:00.000Z</published>
    <updated>2022-01-26T00:52:08.511Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://baijiahao.baidu.com/s?id=1722920372968427694" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%8C%97%E4%BA%AC%E6%97%A5%E6%8A%A5%E5%AE%A2%E6%88%B7%E7%AB%AF-brightgreen" alt="北京日报客户端" /></a></p><p>《生来即轻，还时亦净》—— 1 月 24 日，“寻亲男孩”刘学州在发布 7000 字绝笔长文后，离开了这个世界。一个不满 18 岁的少年，做出如此悲怆的选择，让人分外唏嘘。</p><p>从刘学州的自述中，大致可以勾勒出其异常坎坷的生命轨迹：出生时被父母“卖掉”，4 岁养父母双亡，曾是校园霸凌受害者，在寻亲成功后被“二次遗弃”，更因在网上公开自己被生母拉黑的截图以及“要求父母买房子”之类传言，遭遇网暴谩骂。如今，人不在了，很多事实真相难以追索。但可以肯定的是，只凭他刚认亲不久、已分别组建家庭的亲生父母单方面发声，就跑到刘学州社交平台上大肆谩骂、乱扣帽子、宣泄情绪，已经构成了典型的网络暴力。</p><p>网暴如一把“消音的枪”，杀人伤人于无形。从浙江女子取个快递被造谣出轨，到成都女孩流调轨迹泄露被人肉，再到某网红记者所谓“私人信息”曝光后被攻击……在多起事件中，总有一些网民听风是雨，事情尚未厘清，便喊打喊杀；争议观点偏听一方，便启动“无脑喷”模式；信息来源不知何处，就大肆跟风起哄……飞短流长、恶意汹涌，轻则违背公序良俗，重则击穿法律底线，时常搅得舆论场乌烟瘴气，更成为当事人“不能承受之重”。</p><p>细观这些“网暴”狂欢事件，往往都有搬弄是非、强带节奏、掀起舆论风暴的“节点人物”。在“人人都有麦克风”的年代，借助网络扩音器的加持，每一种声音的杀伤力都可能被放大成千上万倍，这更提醒我们：发言需谨慎，表达有边界。尤其对于那些本就拥有大量粉丝，功能等同于媒体的大 V 来说，更要管好自己，绝不能为了逞口舌之快，或是为仨瓜俩枣的流量，就丢掉了良知。</p><p>“雪崩时，没有一片雪花能够幸免”。网络空间的环境生态如何，深度影响每一个人，更依靠着每一个人。如今的互联网上，多的是吐槽题材，多的是情绪诱导，多的是流量生意，每个人在冲浪之时，都必须擦亮眼睛、理性表达，不因主观情绪先行而不负责任轻易置评，不因“法难责众”而口无遮拦喊打喊杀，决不当谣言传声筒、暴力扩散器。人人坚守底线，明白表达的责任、自由的边界，通过切实言行修复网络生态，受益的也将是我们所有人。</p><p>为期 1 个月的“清朗 · 2022 年春节网络环境整治”专项行动正在开展，集中整治网络暴力、散播谣言等问题，正是重点之一。我们相信，随着相关法律的日益健全以及治理重拳的不断祭出，更多人会认识到网暴的可怕之处，也会意识到网络发言的边界之所在。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这更提醒我们：发言需谨慎，表达有边界。尤其对于那些本就拥有大量粉丝，功能等同于媒体的大V来说，更要管好自己，绝不能为了逞口舌之快，或是为仨瓜俩枣的流量，就丢掉了良知。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>将 Python Django 的 Web 项目部署到 Vercel</title>
    <link href="https://no5972.moe/cms/archivers/119.html"/>
    <id>https://no5972.moe/cms/archivers/119.html</id>
    <published>2022-01-07T09:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.563Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>又是一个国内没有资料的操作。这个要是实现了，那些不太大的 Python 项目就全部免了购买云服务器的成本！这次要做的事情是，把 Django 框架的 Python 项目也部署到 Vercel 上去！当然，并发量和流量都不能太大，免费版对这些都有不少限制，流量太大了搞不好会被 Vercel 封禁（之前看某乎评论有人反映项目被 Vercel 封禁），所以别部署太大的项目！另外，这个部署到 Vercel 是不能用数据库的，他们说是云端编译会出错。</p><ol><li><p>我们还是在 Replit 上创建项目。项目类型我们选择 Django App Template 而不是 Python，也省点事。然后把 urls 和 views 都写好。写好了以后就开始着手配置 Vercel！下列步骤的 2、3、4、5 可以不分先后顺序。</p></li><li><p>首先，我们还是把 Vercel 的控制台端整来。直接切换到 Shell，保证在项目目录，然后执行</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install vercel</span><br></pre></td></tr></table></figure><ol start="3"><li>然后配置项目的依赖。打开 <code>pyproject.toml</code>，看一下 <code>tool.poetry.dependencies</code> 里面都有什么。然后按照 Python 的依赖格式，在项目目录撰写依赖清单文件 <code>requirements.txt</code>。</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">django&#x3D;&#x3D;3.0</span><br></pre></td></tr></table></figure><ol start="4"><li>配置 Vercel 的配置文件。按照 Replit 的模板来配置这个配置文件。在项目目录撰写 Vercel 配置文件 <code>vercel.json</code>。如果没有修改 App 名字的话他默认就是 <code>mysite</code>，这样的话就可以直接使用下面的文件。</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="attr">"builds"</span>: [&#123;</span><br><span class="line">        <span class="attr">"src"</span>: <span class="string">"mysite/wsgi.py"</span>,</span><br><span class="line">        <span class="attr">"use"</span>: <span class="string">"@ardnt/vercel-python-wsgi"</span>,</span><br><span class="line">        <span class="attr">"config"</span>: &#123; <span class="attr">"maxLambdaSize"</span>: <span class="string">"15mb"</span> &#125;</span><br><span class="line">    &#125;],</span><br><span class="line">    <span class="attr">"routes"</span>: [</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">"src"</span>: <span class="string">"/(.*)"</span>,</span><br><span class="line">            <span class="attr">"dest"</span>: <span class="string">"mysite/wsgi.py"</span></span><br><span class="line">        &#125;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="5"><li>把 <code>mysite/settings.py</code> 做一下修改。数据库那个不能要。</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DATABASES = &#123;&#125;</span><br></pre></td></tr></table></figure><ol start="6"><li>然后就可以往 Vercel 部署了。切换到 Shell，确保是在项目目录，然后执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./node_modules/.bin/vercel login</span><br></pre></td></tr></table></figure><p>根据情况选择登录方式并登录。没有账号的需要注册账号。注册过程可以参考之前的文章<a href="90.html">《尽可能简单的搭建Hexo博客并部署到Vercel》</a>。</p><ol start="7"><li>登录上去以后执行</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./node_modules/.bin/vercel --prod</span><br></pre></td></tr></table></figure><p>还是和刚才提及的那篇文章一样，回答他提出的问题。然后看一看最终完成后输出的访问地址，看看能不能访问了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/591f2a79901b4a8fba6063088a534329.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      又是一个国内没有资料的操作。这个要是实现了，那些不太大的 Python 项目就全部免了购买云服务器的成本！这次要做的事情是，把 Django 框架的 Python 项目也部署到 Vercel 上去！当然，并发量和流量都不能太大，免费版对这些都有不少限制，流量太大了搞不好会被 Vercel 封禁（之前看某乎评论有人反映项目被 Vercel 封禁），所以别部署太大的项目！另外，这个部署到 Vercel 是不能用数据库的，他们说是云端编译会出错。
    
    </summary>
    
    
      <category term="Python" scheme="https://no5972.moe/cms/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>Python 手动实现 Base64 编码</title>
    <link href="https://no5972.moe/cms/archivers/118.html"/>
    <id>https://no5972.moe/cms/archivers/118.html</id>
    <published>2021-12-30T05:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.559Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>前段时间看了某篇报纸文章，讲解在 Python 中编码 Base64 的程序。然而那片文章完全只是调用 <code>base64</code> 这个包。Python 调包是相当方便，但是这样除了调包还是调包，根本达不到锻炼编码能力的效果。用人单位招人面试可不看你怎么调包，很多都是自己要手撕实现的。现在的 IT 开发岗位就是这么卷。</p><p>这里研究一下在 Python 怎么手动实现 Base 编码。</p><p>要求：使用 Python 语言实现一个函数 <code>base64(src)</code> ，参数是一个字符串，返回的也是一个字符串，是参数中的字符串经过 Base64 编码得到的编码后的字符串。禁止使用 <code>import</code> 。</p><ol><li>Base64 是一种编码方式（不是加密方式），将二进制编码为 64 字符串组成的字符码，因此需要先将 ASCII 码（表示 0 - 127 数值范围）先转为二进制数字，再对二进制编码</li><li>Base64 表示了从 0 ～ 63 数值，有 64 个字符（2 的 6 次方是 64，所以是 64 个字符），由 A - Z，a - z，0 - 9，+， / 这 64 个字符组成的（还有一个表示后缀的字符<code>=</code>）</li><li>Base64 把每三个 8 Bit 的字节转换为四个 6 Bit 的字节（8 和 6 的最小公倍数是 24），也就是说，转换后的字符串理论上将要比原来的长 1 / 3，转换前的 ASCII 码字符长度如果不是 3 的倍数，需要将转换二进制数字末尾补 0<br />示例：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/6691a9a9e0fc4ceaaf9a3e2b30432a74.png" alt="" /></li><li>解码的过程：去掉 Base64 字符末尾的<code>=</code>。剩下的 Base64 字符，转为二进制数字，每 8 个 bit 组成一个字节，最后剩余不足 8 位的丢弃即可</li><li>Base64 字符对应表</li></ol><table><thead><tr><th>索引</th><th>对应字符</th><th>索引</th><th>对应字符</th><th>索引</th><th>对应字符</th><th>索引</th><th>对应字符</th><th>索引</th><th>对应字符</th><th>索引</th><th>对应字符</th></tr></thead><tbody><tr><td>0</td><td>A</td><td>10</td><td>K</td><td>20</td><td>U</td><td>30</td><td>e</td><td>40</td><td>o</td><td>50</td><td>y</td></tr><tr><td>1</td><td>B</td><td>11</td><td>L</td><td>21</td><td>V</td><td>31</td><td>f</td><td>41</td><td>p</td><td>51</td><td>z</td></tr><tr><td>2</td><td>C</td><td>12</td><td>M</td><td>22</td><td>W</td><td>32</td><td>g</td><td>42</td><td>q</td><td>52</td><td>0</td></tr><tr><td>3</td><td>D</td><td>13</td><td>N</td><td>23</td><td>X</td><td>33</td><td>h</td><td>43</td><td>r</td><td>53</td><td>1</td></tr><tr><td>4</td><td>E</td><td>14</td><td>O</td><td>24</td><td>Y</td><td>34</td><td>i</td><td>44</td><td>s</td><td>54</td><td>2</td></tr><tr><td>5</td><td>F</td><td>15</td><td>P</td><td>25</td><td>Z</td><td>35</td><td>j</td><td>45</td><td>t</td><td>55</td><td>3</td></tr><tr><td>6</td><td>G</td><td>16</td><td>Q</td><td>26</td><td>a</td><td>36</td><td>k</td><td>46</td><td>u</td><td>56</td><td>4</td></tr><tr><td>7</td><td>H</td><td>17</td><td>R</td><td>27</td><td>b</td><td>37</td><td>l</td><td>47</td><td>v</td><td>57</td><td>5</td></tr><tr><td>8</td><td>I</td><td>18</td><td>S</td><td>28</td><td>c</td><td>38</td><td>m</td><td>48</td><td>w</td><td>58</td><td>6</td></tr><tr><td>9</td><td>J</td><td>19</td><td>T</td><td>29</td><td>d</td><td>39</td><td>n</td><td>49</td><td>x</td><td>59</td><td>7</td></tr><tr><td>60</td><td>8</td><td>61</td><td>9</td><td>62</td><td>+</td><td>63</td><td>/</td><td></td><td></td><td></td><td></td></tr></tbody></table><p>程序：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">base64</span><span class="params">(src)</span>:</span></span><br><span class="line">    alphabet = <span class="string">b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</span></span><br><span class="line">    ret = bytearray()</span><br><span class="line">    length = len(src)</span><br><span class="line">    <span class="comment"># r记录补0的个数</span></span><br><span class="line">    r = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> offset <span class="keyword">in</span> range(<span class="number">0</span>, length,<span class="number">3</span>):</span><br><span class="line">        <span class="keyword">if</span> offset + <span class="number">3</span> &lt;= length:</span><br><span class="line">            triple = src[offset:offset + <span class="number">3</span>]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            triple = src[offset:]</span><br><span class="line">            r = <span class="number">3</span> - len(triple)</span><br><span class="line">            triple = triple + <span class="string">'\x00'</span> * r</span><br><span class="line">        </span><br><span class="line">        b = int.from_bytes(triple.encode(), <span class="string">'big'</span>)</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">18</span>, <span class="number">-1</span>, <span class="number">-6</span>):</span><br><span class="line">            <span class="keyword">if</span> i == <span class="number">18</span>:</span><br><span class="line">                index = b &gt;&gt; i</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                index = b &gt;&gt; i &amp; <span class="number">0x3F</span></span><br><span class="line">            ret.append(alphabet[index])</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>, r + <span class="number">1</span>):</span><br><span class="line">            ret[-i] = <span class="number">0x3D</span></span><br><span class="line">    <span class="keyword">return</span> ret.decode(<span class="string">'utf-8'</span>)</span><br></pre></td></tr></table></figure><p>测试：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(base64(<span class="string">'abcde'</span>)) <span class="comment"># 输出：YWJjZGU=</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      前段时间看了某篇报纸文章，讲解在 Python 中编码 Base64 的程序。然而那片文章完全只是调用 base64 这个包。Python 调包是相当方便，但是这样除了调包还是调包，根本达不到锻炼编码能力的效果。用人单位招人面试可不看你怎么调包，很多都是自己要手撕实现的。现在的 IT 开发岗位就是这么卷。这里研究一下在 Python 怎么手动实现 Base 编码。
    
    </summary>
    
    
      <category term="Python" scheme="https://no5972.moe/cms/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>Win11  在 Edge 浏览器中报名教师资格证</title>
    <link href="https://no5972.moe/cms/archivers/117.html"/>
    <id>https://no5972.moe/cms/archivers/117.html</id>
    <published>2021-12-14T07:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.559Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>刚才试了一下，现在的 Edge 浏览器已经可以手动添加以 IE 模式打开 URL 地址了。打开 Edge 的设置，在左侧选择“默认浏览器”，拉到最下面，先把“让 Internet Explorer 在 Microsoft Edge 中打开网站”改成“始终”，然后把“允许在 Internet Explorer 模式下重新加载网站”改成“允许”，然后点击下面的添加，把下面这些教师资格证考试报名页面的地址添加进去（根据所在地区查看对应的网址，怕麻烦的话就全都添加进去），就可以在 Edge 浏览器报名教师资格证考试了。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">http:&#x2F;&#x2F;ntcebm1.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm2.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm3.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm4.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm5.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm6.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br><span class="line">http:&#x2F;&#x2F;ntcebm7.neea.edu.cn&#x2F;apply&#x2F;memapp&#x2F;memLogin</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/c3c594727ba14421a4167e210357dfe0.png" alt="" /></p><p>如果在 Edge 浏览器打开之后还是这个“请使用 IE 系列浏览器”提示的话，需要修改兼容性视图设置。但是在 Win11 已经打不开 IE 浏览器了。此时需要修改注册表。</p><p>但是刚才查了一下注册表的位置，发现这个兼容性视图的设置的注册表的键值居然是二进制数据！换了一个能打开 IE 浏览器的 Win10 的电脑，把这个地址 <a href="http://neea.edu.cn" target="_blank" rel="noopener">neea.edu.cn</a> 加到那个列表里面去，然后打开注册表编辑器，找到刚才找到的注册表路径：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\BrowserEmulation\ClearableListData\UserFilter</span><br></pre></td></tr></table></figure><p>选中这个二进制值，然后点击文件-导出。这样我们就得到了注册表的 reg 文件。 <strong>好吧，这一段对于非计算机专业而是纯粹来考教师资格证的完全是废话了。接下来是需要大家做的事情了。</strong></p><p>将这个内容输入到记事本保存为一个 <code>.reg</code> 的文件。点击文件-另存为，将保存类型选择所有文件，然后文件名后面加上<code>.reg</code> 后缀。编码选择“UTF-16 LE”。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Windows Registry Editor Version 5.00</span><br><span class="line"></span><br><span class="line">[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\BrowserEmulation\ClearableListData]</span><br><span class="line">&quot;UserFilter&quot;&#x3D;hex:41,1f,00,00,53,08,ad,ba,01,00,00,00,34,00,00,00,01,00,00,00,\</span><br><span class="line">  01,00,00,00,0c,00,00,00,20,7c,0c,ac,b8,f0,d7,01,01,00,00,00,0b,00,6e,00,65,\</span><br><span class="line">  00,65,00,61,00,2e,00,65,00,64,00,75,00,2e,00,63,00,6e,00</span><br></pre></td></tr></table></figure><p>双击这个保存的文件，确认导入。然后再到 Edge 重新访问这个页面。看看能不能打开报名页面了。如果还不能访问，请关闭已经打开的报名页面标签页，然后再访问它。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/014e0d3c49dd4a4db471da6d2a52f885.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      刚才试了一下，现在的 Edge 浏览器已经可以手动添加以 IE 模式打开 URL 地址了。打开 Edge 的设置，搜索 Internet Explorer，拉到最下面，先把“让 Internet Explorer 在 Microsoft Edge 中打开网站”改成“始终”，然后把“允许在 Internet Explorer 模式下重新加载网站”改成“允许”，然后点击下面的添加，把教师资格证考试报名页面的地址添加进去，就可以在 Edge 浏览器报名教师资格证考试了。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：IrfanView 修改快捷键</title>
    <link href="https://no5972.moe/cms/archivers/116.html"/>
    <id>https://no5972.moe/cms/archivers/116.html</id>
    <published>2021-12-02T10:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.559Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>IrfanView 其实从 2020 年 10 月 21 日的 4.56 版本就已经提供了自定义快捷键的功能，但是没有单独的菜单选项或者窗口按钮来对应这个修改快捷键的功能。</p><p>经过前往官方论坛询问得知，快捷键要在菜单项右键，然后就会弹出一个右键菜单，只有一个菜单项，修改快捷键。</p><p>打开“编辑”，然后 <strong>右击</strong> “插入水印”，然后就可以看到修改快捷键的右键菜单。选择之，然后在弹出的窗口指定一个快捷键，点击“设置”，如果没有冲突的快捷键就可以直接确定了，如果有冲突的快捷键会提示有哪个功能冲突了，请先将已有的菜单项右键修改快捷键，然后在输入框中按退格清除掉快捷键，然后点设置。再回到原来的菜单项右键修改快捷键，输入要指定的快捷键，确定设置即可。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/7055ca6ffc624ed8929aef39cbd00fcd.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/e42113de295440d0b956d2b9481a3287.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      IrfanView 其实已经提供了自定义快捷键的功能，但是没有单独的菜单选项或者窗口按钮来对应这个修改快捷键的功能。经过前往官方论坛询问得知，快捷键要在菜单项右键，然后就会弹出一个右键菜单，只有一个菜单项，修改快捷键。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>修改 Windows 11 右键菜单为旧版样式</title>
    <link href="https://no5972.moe/cms/archivers/115.html"/>
    <id>https://no5972.moe/cms/archivers/115.html</id>
    <published>2021-11-30T01:30:00.000Z</published>
    <updated>2021-11-30T01:53:34.079Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>其实我们一直提倡尽量适应新操作系统的新特性的，尽管现阶段的 Windows 11 右键菜单仍然很不稳定，经常出现一按右键 “explorer” 进程就挂掉的情况。但是总有些小白不喜欢新的特性，执意要用回旧版的特性。</p><p>通过修改注册表可以将 Windows 11 的右键菜单修改为旧版右键菜单。</p><p>（办公室电脑没装 Win11，暂且先用 Win10 截图示范了）</p><p>打开注册表编辑器，HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID，右键右边的空白处，新建-项，命名为<code>{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}</code>。</p><p><img src="https://pic2.zhimg.com/v2-e78013186e81a5d1cf8a1b028dcb9923_r.jpg" alt="" /></p><p><img src="https://pic2.zhimg.com/v2-76f5d3282d13ebf0c40bc83bae9fdea4_r.jpg" alt="" /></p><p>在左侧选中这个新建的项，再右键右边的空白处，新建-项，命名为<code>InprocServer32</code>。</p><p><img src="https://pic3.zhimg.com/v2-733e3f990f91c1966f5484952b1d1f56_r.jpg" alt="" /></p><p><img src="https://pica.zhimg.com/v2-cf802fce8cc607d10fbb26f5c8e3b71a_r.jpg" alt="" /></p><p>在左侧选中这个新建的项，双击右侧的“(默认)”，数值数据留空，然后确定。</p><p><img src="https://pic3.zhimg.com/v2-1396932d2998d28d8a1ea0b8882e918e_r.jpg" alt="" /></p><p>关闭注册表编辑器然后重启电脑。右键菜单就变成旧版的了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      其实我们一直提倡尽量适应新操作系统的新特性的，尽管现阶段的 Windows 11 右键菜单仍然很不稳定，经常出现一按右键 “explorer” 进程就挂掉的情况。但是总有些小白不喜欢新的特性，执意要用回旧版的特性。通过修改注册表可以将 Windows 11 的右键菜单修改为旧版右键菜单。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Hexo 博客  添加 3D 看板娘  替换原来的 Live2D</title>
    <link href="https://no5972.moe/cms/archivers/114.html"/>
    <id>https://no5972.moe/cms/archivers/114.html</id>
    <published>2021-11-17T16:30:00.000Z</published>
    <updated>2024-09-26T09:56:20.361Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="0前言"><a class="markdownIt-Anchor" href="#0前言"></a> 0.前言</h1><p>前两天用 VRoid Studio 捏了一个 3D 的 loli ，后来想想能不能把这个 3D 形象替换到那个博客站点的原来的 Live2D 看板娘那边去。花了一上午时间在 GitHub 上找相关的 Demo，又花一下午带一晚上反复调试，终于把这个 3D 看板娘调通了。</p><p>手机端暂时还没有实现出来效果，主要是尺寸对不上，不过也就是在那个 JS 里面调一下尺寸的事情。晚点再来研究研究。</p><p>我们找的这个 GitHub 代码是 <a href="https://github.com/Momijinn/SampleWebMMD" target="_blank" rel="noopener">Momijinn/SampleWebMMD</a> ，他实现了在网页上加载 PMX 格式的 MMD 模型、 VMD 格式的动作，以及相应的音频档案，调用的是 Three.js 这个库，以及 MMDLoader 这个插件，这个库鄙人也没有研究过，只是之前没跳槽之前看产品经理在业务群里面发过这个库的演示页面，鄙人稍微瞅了一眼，毕竟鄙人不是前端。。。</p><h1 id="1修改-samplewebmmd"><a class="markdownIt-Anchor" href="#1修改-samplewebmmd"></a> 1.修改 SampleWebMMD</h1><p>把他的代码拉下来，然后做一些必要的修改。</p><p><code>index.html</code>里面原来的几个手动切换动作的按钮去掉，不要。</p><p>把捏好并转换好的 <code>.pmx</code>的模型连同相应的相对路径的贴图文件丢进<code>pmx</code>目录，最好<code>pmx</code>里面再建一个子目录再丢。</p><p>把做好的<code>.vmd</code>的动作文件丢进<code>vmd</code>目录。</p><p>然后修改 JS。</p><p><strong>原来的模型太亮了，去掉全局光，改成点光。</strong> 原来的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">Init = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  scene = <span class="keyword">new</span> THREE.Scene();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> ambient = <span class="keyword">new</span> THREE.AmbientLight(<span class="number">0xeeeeee</span>);</span><br><span class="line">  scene.add(ambient);</span><br><span class="line"></span><br><span class="line">  renderer = <span class="keyword">new</span> THREE.WebGLRenderer(&#123; <span class="attr">alpha</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">  renderer.setPixelRatio(<span class="built_in">window</span>.devicePixelRatio);</span><br><span class="line">  renderer.setSize(<span class="built_in">window</span>.innerWidth, <span class="built_in">window</span>.innerHeight);</span><br><span class="line">  renderer.setClearColor(<span class="number">0xcccccc</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// documentにMMDをセットする</span></span><br><span class="line">  <span class="built_in">document</span>.body.appendChild(renderer.domElement);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//cameraの作成</span></span><br><span class="line">  camera = <span class="keyword">new</span> THREE.PerspectiveCamera(<span class="number">40</span>, windowWidth / windowHeight, <span class="number">1</span>, <span class="number">1000</span>);</span><br><span class="line">  camera.position.set(<span class="number">0</span>, <span class="number">18</span>, <span class="number">10</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">Init = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  scene = <span class="keyword">new</span> THREE.Scene();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> ambient = <span class="keyword">new</span> THREE.AmbientLight(<span class="number">0xcccccc</span>);</span><br><span class="line">  <span class="comment">// scene.add(ambient);</span></span><br><span class="line"></span><br><span class="line">  spotLight = <span class="keyword">new</span> THREE.SpotLight();</span><br><span class="line">  spotLight.color = <span class="keyword">new</span> THREE.Color(<span class="number">0xffffff</span>);</span><br><span class="line"></span><br><span class="line">  spotLight.castShadow = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">  spotLight.position.set(<span class="number">0</span>, <span class="number">-10</span>, <span class="number">60</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 光的强度 默认值为1</span></span><br><span class="line">  spotLight.intensity = <span class="number">1</span>;</span><br><span class="line">  <span class="comment">// 从发光点发出的距离，光的亮度，会随着距离的远近线性衰减</span></span><br><span class="line">  spotLight.distance = <span class="number">350</span>;</span><br><span class="line">  <span class="comment">// 光色散角度，默认是 Math.PI * 2</span></span><br><span class="line">  spotLight.angle = <span class="number">0.4</span>;</span><br><span class="line">  <span class="comment">// 光影的减弱程度，默认值为0， 取值范围 0 -- 1之间</span></span><br><span class="line">  spotLight.penumbra = <span class="number">0.1</span>;</span><br><span class="line">  <span class="comment">// 光在距离上的量值, 和光的强度类似（衰减指数）</span></span><br><span class="line">  spotLight.decay = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 设置阴影分辨率</span></span><br><span class="line">  spotLight.shadow.mapSize.width = <span class="number">1024</span>;</span><br><span class="line">  spotLight.shadow.mapSize.height = <span class="number">1024</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 投影近点 --&gt; 从距离光源的哪一才产生阴影</span></span><br><span class="line">  spotLight.shadow.camera.near = <span class="number">0.1</span>;</span><br><span class="line">  <span class="comment">// 投影原点 --&gt; 到光源的哪一点位置不产生阴影</span></span><br><span class="line">  spotLight.shadow.camera.far = <span class="number">300</span>;</span><br><span class="line">  <span class="comment">// 投影视场</span></span><br><span class="line">  spotLight.shadow.camera.fov = <span class="number">40</span>;</span><br><span class="line"></span><br><span class="line">  scene.add(spotLight);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  renderer = <span class="keyword">new</span> THREE.WebGLRenderer(&#123; <span class="attr">alpha</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">  effect = <span class="keyword">new</span> THREE.OutlineEffect( renderer, &#123;</span><br><span class="line">    defaultThickness: <span class="number">0.01</span>,</span><br><span class="line">    defaultColor: [ <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span> ],</span><br><span class="line">    defaultAlpha: <span class="number">0.8</span>,</span><br><span class="line">    defaultKeepAlive: <span class="literal">true</span> <span class="comment">// keeps outline material in cache even if material is removed from scene</span></span><br><span class="line">  &#125; );</span><br><span class="line">  renderer.setPixelRatio(<span class="built_in">window</span>.devicePixelRatio);</span><br><span class="line">  <span class="comment">// renderer.setSize(window.innerWidth, window.innerHeight);</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="built_in">window</span>.innerWidth &lt; <span class="built_in">window</span>.innerHeight) <span class="built_in">document</span>.body.remove(); <span class="comment">// 手机端暂不展示</span></span><br><span class="line">  renderer.setSize(<span class="number">480</span> * <span class="built_in">window</span>.innerWidth / <span class="built_in">window</span>.innerHeight, <span class="number">480</span>);</span><br><span class="line">  renderer.setClearColor(<span class="number">0xcccccc</span>, <span class="number">0</span>);</span><br><span class="line">  renderer.domElement.style.pointerEvents = <span class="string">'none'</span>;</span><br><span class="line">  <span class="comment">// documentにMMDをセットする</span></span><br><span class="line">  <span class="built_in">document</span>.body.appendChild(renderer.domElement);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//cameraの作成</span></span><br><span class="line">  camera = <span class="keyword">new</span> THREE.PerspectiveCamera(<span class="number">40</span>, windowWidth / windowHeight, <span class="number">1</span>, <span class="number">1000</span>);</span><br><span class="line">  camera.position.set(<span class="number">0</span>, <span class="number">18</span>, <span class="number">52</span>);</span><br><span class="line">  effect.render( scene, camera );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>每次动作执行完还要停两秒才循环下一次，去掉这个停顿。</strong> 原来的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">helper = <span class="keyword">new</span> THREE.MMDAnimationHelper(&#123; <span class="attr">afterglow</span>: <span class="number">2.0</span>, <span class="attr">resetPhysicsOnLoop</span>: <span class="literal">true</span> &#125;);</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">helper = <span class="keyword">new</span> THREE.MMDAnimationHelper(&#123; <span class="attr">afterglow</span>: <span class="number">0.0</span>, <span class="attr">resetPhysicsOnLoop</span>: <span class="literal">true</span> &#125;);</span><br></pre></td></tr></table></figure><p><strong>把他加载的模型改成我们自己的模型</strong> ，原来的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> Pmx = <span class="string">"./pmx/pronama/プロ生ちゃん.pmx"</span>;</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> Pmx = <span class="string">"./pmx/mlj/mlj.pmx"</span>; <span class="comment">// 这里改成你准备好的 pmx 文件的路径</span></span><br></pre></td></tr></table></figure><p><strong>把他加载的动作改成我们自己的动作。</strong> 原来的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> MotionObjects = [</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"loop"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">false</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"kei_voice_009_1"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">true</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"kei_voice_010_2"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">true</span> &#125;,</span><br><span class="line">];</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> MotionObjects = [</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"float_with_rotate"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">false</span> &#125;, <span class="comment">// 改成你的 vmd 文件名，不要后缀</span></span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"kei_voice_009_1"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">false</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"kei_voice_010_2"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">false</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">"loop"</span>, <span class="attr">VmdClip</span>: <span class="literal">null</span>, <span class="attr">AudioClip</span>: <span class="literal">false</span> &#125;,</span><br><span class="line">];</span><br></pre></td></tr></table></figure><p>原来的</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Set VMD on Mesh</span></span><br><span class="line">VmdControl(<span class="string">"loop"</span>, <span class="literal">true</span>);</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Set VMD on Mesh</span></span><br><span class="line">VmdControl(<span class="string">"float_with_rotate"</span>, <span class="literal">true</span>); <span class="comment">// 改成你的 vmd 文件名，不要后缀</span></span><br></pre></td></tr></table></figure><h1 id="2部署到对象存储"><a class="markdownIt-Anchor" href="#2部署到对象存储"></a> 2.部署到对象存储</h1><p>然后把改好的整个仓库的文件上传到一个网络空间。因为贴图有十几兆大小，国外的空间速度肯定慢，还是找一个阿里云或者别的什么云的对象存储或者CDN丢上去，得要那种文件名不变且可以带有子路径的那种。鄙人用的是百度智能云。但是这样的话流量就是个问题，如果网站流量比较大的话就要考虑其他方式了，因为对象存储是按流量计费的。</p><h1 id="3修改-live2d-wrapper"><a class="markdownIt-Anchor" href="#3修改-live2d-wrapper"></a> 3.修改 Live2D Wrapper</h1><p>之前我们用的是 <a href="https://github.com/galnetwen" target="_blank" rel="noopener">galnetwen</a> 做的 <a href="https://github.com/galnetwen/Live2D" target="_blank" rel="noopener">Live2D Wrapper</a>，我们就直接在他的基础上修改相关的 NJK 文件。我们之前已经把引用的 JS 放进了单独的 NJK 文件，然后用布局 NJK 连接的。将 <code>themes/next/layout/_third-party/live2d/live2d.njk</code>中的</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span></span><br><span class="line"><span class="actionscript">    <span class="keyword">var</span> message_Path = <span class="string">'/live2d/'</span></span></span><br><span class="line"><span class="actionscript">    <span class="keyword">var</span> home_Path = <span class="string">'https://haremu.com/'</span>  <span class="comment">//此处修改为你的域名，必须带斜杠</span></span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/live2d/js/live2d.js"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/live2d/js/message.js"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span></span><br><span class="line"><span class="actionscript">    loadlive2d(<span class="string">"live2d"</span>, <span class="string">"/live2d/model/tia/model.json"</span>);</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>直接去掉，或者注释掉。</p><p>然后再把前面的</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"landlord"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"message"</span> <span class="attr">style</span>=<span class="string">"opacity:0"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">canvas</span> <span class="attr">id</span>=<span class="string">"live2d"</span> <span class="attr">width</span>=<span class="string">"280"</span> <span class="attr">height</span>=<span class="string">"250"</span> <span class="attr">class</span>=<span class="string">"live2d"</span>&gt;</span><span class="tag">&lt;/<span class="name">canvas</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"hide-button"</span>&gt;</span>隐藏<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>改为</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"landlord"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"message"</span> <span class="attr">style</span>=<span class="string">"opacity:0"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &lt;canvas id="live2d" width="280" height="550" class="live2d"&gt;&lt;/canvas&gt; --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">iframe</span> <span class="attr">src</span>=<span class="string">"放置显示 3D 模型的 HTML 页面 URL"</span> <span class="attr">frameborder</span>=<span class="string">"no"</span> <span class="attr">style</span>=<span class="string">"pointer-events: none; width: 100%; height: 100%"</span>&gt;</span><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"hide-button"</span>&gt;</span>隐藏<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其中的 <code>iframe</code>需要改为第二大块你放在 CDN 或者对象存储的HTML文件地址。</p><p>然后通过 CSS 控制模型展示的大小，还有不能影响鼠标点击网页元素了。鄙人写的是</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="css">  <span class="selector-id">#landlord</span> &#123;</span></span><br><span class="line">    bottom: -50px;</span><br><span class="line">    width: 1000px;</span><br><span class="line">    height: 550px;</span><br><span class="line">    left: -300px;</span><br><span class="line">    pointer-events: none;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line"><span class="css">  <span class="selector-id">#live2d</span> &#123;</span></span><br><span class="line">    display: block;</span><br><span class="line">    height: 100%;</span><br><span class="line">    width: 100%;</span><br><span class="line">  &#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p>如果之前没有用过这个 Live2D 的话，还要在 <code>head</code>里面加一个 CSS 文件。在<code>themes\next\layout\_partials\head\head.njk</code>中添加</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"/live2d/css/live2d.css"</span> /&gt;</span></span><br></pre></td></tr></table></figure><p>此外，鄙人是单独把原来 Live2D 的 Wrapper 放到单独的 NJK 里面了。布局的 NJK <code>themes\next\layout\_third-party\index.njk</code>是这样的。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">&#123;% include &#39;baidu-push.njk&#39; %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% include &#39;rating.njk&#39; %&#125;</span><br><span class="line"></span><br><span class="line">&#123;%- if theme.algolia_search.enable %&#125;</span><br><span class="line">  &#123;% include &#39;search&#x2F;algolia-search.njk&#39; %&#125;</span><br><span class="line">&#123;% elif theme.swiftype_key %&#125;</span><br><span class="line">  &#123;% include &#39;search&#x2F;swiftype.njk&#39; %&#125;</span><br><span class="line">&#123;% elif theme.local_search.enable %&#125;</span><br><span class="line">  &#123;% include &#39;search&#x2F;localsearch.njk&#39; %&#125;</span><br><span class="line">&#123;%- endif %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% include &#39;live2d&#x2F;live2d.njk&#39; %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% include &#39;chat&#x2F;chatra.njk&#39; %&#125;</span><br><span class="line">&#123;% include &#39;chat&#x2F;tidio.njk&#39; %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% include &#39;tags&#x2F;pdf.njk&#39; %&#125;</span><br><span class="line">&#123;% include &#39;tags&#x2F;mermaid.njk&#39; %&#125;</span><br></pre></td></tr></table></figure><h1 id="4效果"><a class="markdownIt-Anchor" href="#4效果"></a> 4.效果</h1><p>这样就基本完成了修改。效果是这样的。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/bde89345178a499bae8296077698f125.gif" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      前两天用 VRoid Studio 捏了一个 3D 的 loli ，后来想想能不能把这个 3D 形象替换到那个博客站点的原来的 Live2D 看板娘那边去。花了一上午时间在 GitHub 上找相关的 Demo，又花一下午带一晚上反复调试，终于把这个 3D 看板娘调通了。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：PMX Editor 修改贴图材质</title>
    <link href="https://no5972.moe/cms/archivers/112.html"/>
    <id>https://no5972.moe/cms/archivers/112.html</id>
    <published>2021-11-12T08:30:00.000Z</published>
    <updated>2024-09-26T09:56:33.206Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://blog.sina.com.cn/s/blog_15fe57f4d0102xt4l.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%96%B0%E6%B5%AA%E5%8D%9A%E5%AE%A2-%E5%8A%A8%E7%94%BB%E5%B7%A5%E4%BD%9C%E5%AE%A4Official-brightgreen" alt="新浪博客-动画工作室Official" /></a></p><p>关于材质的网上并没有标准的定义，顶点、面、贴图、透明度、反射度、法线贴图、高光贴图、Toon贴图<br />所有这些基础的材料组成的东西就叫材质。反过来删除材质就代表你把顶点、面、贴图。。。。<br />全部一并删除。我们所说的金属材质，木材材质只是对原始材料参数进行重新设定。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/25b081289157e8807f390cac6d8ff41d.png" alt="" /></p><p><strong>编号1</strong>：PMX2.0材质默认设置为（扩展色=1，反射色=0，环境色=0.5 ）修改材质色跟渲染的品质关联，<br />一般不建议修改，你要改的是你渲染包中对应的材质参数<br />（外来导入的游戏服装，胖次都要重新设置材质）</p><p><strong>编号2</strong>： <strong>【非透过度】</strong> 就是设置材质的透明度（0=不显示，1=显示 0.5=半透明）一般像小姐姐<br />跳着跳着衣服就没了就是把衣服设置成透明的🤔</p><p>接着我们来说说 <strong>【反射强度】</strong> 设置，反射强度设定值越高亮度也就越高【AutoLuminous4】这个灯光<br />插件载入后，只要把你需要的材质设置成100以上的参数，任何材质都会发光，当然了你<br />也可以设置材质色让发光的材质发出不同的颜色的灯光。</p><p><strong>编号3</strong>：很多人说模型没有影子就是因为 <strong>【地面影】</strong> 没有√，セルフ影都是自动设置阴影的意思两个打上√。<br />而像腿、身体、衣服这些双面材质需要在 <strong>【两面描画】</strong> 前打，而脸、眼睛、瞳就不用设定。<br /><strong>【顶点色】</strong> 就是顶点着色用顶点的颜色覆盖材质贴图，一般用不到。</p><p><strong>编号4</strong>：轮廓线不需要设置，因为我们在使用MMD软件时在 <strong>【显示-&gt;轮廓线大小】</strong> 中设置0就可以关闭，<br />轮廓线只是在2D或手绘渲染时才会用到，3D渲染不需要轮廓线的。</p><p><strong>编号5</strong>： <strong>【Tex】</strong> 这里设置的就是贴图图片，乱码变成白模就是因为定位不到贴图的文件位置（文件名乱码）</p><p><strong>编号6</strong>： <strong>【Sph高光贴图】</strong> 高光贴图主要应用在（G渲、P渲）中，他的作用就是叠加在<br />材质表面生成高光，而G渲P渲只有用高光贴图后才能更好的渲染出头发、身体、金属材质的不同光泽，<br />网上也有一份这种高光贴图包。为了便于理解我们给眼睛贴上sph贴图演示一下。高光贴图应用非常广泛<br />很多游戏盔甲就是用的高光贴图来让金属泛光。。。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e870b5ba5b380a3f162832cac16019d5.png" alt="" /></p><p><img src="https://pic1.zhimg.com/80/v2-0c0a6c802ecec5ae27a91333ed6cfb6d.gif" alt="" /></p><p>ray渲N渲IK渲本身就自带高光贴图设置，这也就是为什么N渲的作者在演示时让你删除Sph的原因，<br />你可以在N渲的文件夹中找到这类贴图文件。当然了这里也不需要设置什么法线贴图，<br />在N/IK/Ray渲染材质中设置，</p><p><strong>编号7</strong>：Toon就是模型本影贴图。你可以试着删除贴图看看效果，删除toon贴图后模型没有影子<br />但有些渲染是自带影子机能的，PmxEditor系统自带10张Toon贴图（按本影的明度排列）。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      关于材质的网上并没有标准的定义，顶点、面、贴图、透明度、反射度、法线贴图、高光贴图、Toon贴图，所有这些基础的材料组成的东西就叫材质。反过来删除材质就代表你把顶点、面、贴图等全部一并删除。我们所说的金属材质，木材材质只是对原始材料参数进行重新设定。
    
    </summary>
    
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>SpringBoot 集成 WebSocket</title>
    <link href="https://no5972.moe/cms/archivers/111.html"/>
    <id>https://no5972.moe/cms/archivers/111.html</id>
    <published>2021-11-03T08:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.551Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.cnblogs.com/xuwenjin/p/12664650.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%8D%9A%E5%AE%A2%E5%9B%AD-%E4%BB%85%E6%AD%A4%E8%80%8C%E5%B7%B2%E2%80%94%E8%BF%9C%E6%96%B9-brightgreen" alt="博客园-仅此而已-远方" /></a></p><h1 id="前言"><a class="markdownIt-Anchor" href="#前言"></a> 前言</h1><p>WebSocket 是一种在单个 <a href="https://baike.baidu.com/item/TCP" target="_blank" rel="noopener">TCP</a> 连接上进行<a href="https://baike.baidu.com/item/%E5%85%A8%E5%8F%8C%E5%B7%A5" target="_blank" rel="noopener">全双工</a>通信的协议。WebSocket 通信协议于 2011 年被 <a href="https://baike.baidu.com/item/IETF" target="_blank" rel="noopener">IETF</a> 定为标准 RFC 6455，并由 RFC 7936 补充规范。WebSocket <a href="https://baike.baidu.com/item/API" target="_blank" rel="noopener">API</a> 也被 <a href="https://baike.baidu.com/item/W3C" target="_blank" rel="noopener">W3C</a> 定为标准。WebSocket 使得客户端和服务器之间的数据交换变得更加简单，允许服务端主动向客户端推送数据。在 WebSocket API 中，浏览器和服务器只需要完成一次握手，两者之间就直接可以创建持久性的连接，并进行双向数据传输。</p><h1 id="说明"><a class="markdownIt-Anchor" href="#说明"></a> 说明</h1><p>本篇主要介绍在 SpringBoot 框架下，WebSocket 基于注解使用的 3 种场景：</p><ol><li>自己给自己发消息</li><li>自己给所有客户端发送消息（不包括自己）</li><li>自己给另一个客户端发送消息</li></ol><h1 id="代码示例"><a class="markdownIt-Anchor" href="#代码示例"></a> 代码示例</h1><p>代码结构如下：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/098d112678c4ce3a6069d712283728b5.png" alt="" /></p><p>POM 文件中的依赖：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- websocket --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-websocket<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- fastjson --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.alibaba<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>fastjson<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.2.47<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><p><code>application.yml</code> 文件：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">18092</span></span><br></pre></td></tr></table></figure><p>WebSocket 配置文件：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebSocketConfig</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 注入一个 ServerEndpointExporter，该 Bean 会自动注册使用 <span class="doctag">@ServerEndpoint</span> 注解申明的 WebSocket Endpoint</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> ServerEndpointExporter <span class="title">serverEndpointExporter</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> ServerEndpointExporter();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在 <code>resources</code> 目录中创建一个 <code>static</code> 文件夹，然后新建一个 <code>index.html</code> 页面：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">HTML</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>My WebSocket<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">id</span>=<span class="string">"text"</span> <span class="attr">type</span>=<span class="string">"text"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">"send()"</span>&gt;</span>Send<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">"closeWebSocket()"</span>&gt;</span>Close<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"message"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span></span><br><span class="line"><span class="actionscript">    <span class="keyword">var</span> websocket = <span class="literal">null</span>;</span></span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 判断当前浏览器是否支持 WebSocket，主要此处要更换为自己的地址</span></span></span><br><span class="line"><span class="javascript">    <span class="keyword">if</span> (<span class="string">'WebSocket'</span> <span class="keyword">in</span> <span class="built_in">window</span>) &#123;</span></span><br><span class="line"><span class="actionscript">        websocket = <span class="keyword">new</span> WebSocket(<span class="string">"ws://localhost:18092/test/one"</span>);</span></span><br><span class="line"><span class="actionscript">    &#125; <span class="keyword">else</span> &#123;</span></span><br><span class="line"><span class="actionscript">        alert(<span class="string">'Not support websocket'</span>)</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 连接发生错误的回调方法</span></span></span><br><span class="line"><span class="actionscript">    websocket.onerror = <span class="function"><span class="keyword">function</span><span class="params">()</span> </span>&#123;</span></span><br><span class="line"><span class="actionscript">        setMessageInnerHTML(<span class="string">"error"</span>);</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 连接成功建立的回调方法</span></span></span><br><span class="line"><span class="actionscript">    websocket.onopen = <span class="function"><span class="keyword">function</span><span class="params">(event)</span> </span>&#123;</span></span><br><span class="line"><span class="actionscript">        <span class="comment">//setMessageInnerHTML("open");</span></span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 接收到消息的回调方法</span></span></span><br><span class="line"><span class="actionscript">    websocket.onmessage = <span class="function"><span class="keyword">function</span><span class="params">(event)</span> </span>&#123;</span></span><br><span class="line">        setMessageInnerHTML(event.data);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 连接关闭的回调方法</span></span></span><br><span class="line"><span class="actionscript">    websocket.onclose = <span class="function"><span class="keyword">function</span><span class="params">()</span> </span>&#123;</span></span><br><span class="line"><span class="actionscript">        setMessageInnerHTML(<span class="string">"close"</span>);</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 监听窗口关闭事件，当窗口关闭时，主动去关闭 WebSocket 连接，防止连接还没断开就关闭窗口，服务端会抛异常。</span></span></span><br><span class="line"><span class="javascript">    <span class="built_in">window</span>.onbeforeunload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span></span><br><span class="line">        websocket.close();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 将消息显示在网页上</span></span></span><br><span class="line"><span class="actionscript">    <span class="function"><span class="keyword">function</span> <span class="title">setMessageInnerHTML</span><span class="params">(innerHTML)</span> </span>&#123;</span></span><br><span class="line"><span class="javascript">        <span class="built_in">document</span>.getElementById(<span class="string">'message'</span>).innerHTML += innerHTML + <span class="string">'&lt;br/&gt;'</span>;</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 关闭连接</span></span></span><br><span class="line"><span class="actionscript">    <span class="function"><span class="keyword">function</span> <span class="title">closeWebSocket</span><span class="params">()</span> </span>&#123;</span></span><br><span class="line">        websocket.close();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="actionscript">    <span class="comment">// 发送消息</span></span></span><br><span class="line"><span class="actionscript">    <span class="function"><span class="keyword">function</span> <span class="title">send</span><span class="params">()</span> </span>&#123;</span></span><br><span class="line"><span class="javascript">        <span class="keyword">var</span> message = <span class="built_in">document</span>.getElementById(<span class="string">'text'</span>).value;</span></span><br><span class="line">        websocket.send(message);</span><br><span class="line">    &#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>对应上面的 3 种场景，分别给出代码：</p><h2 id="1-自己给自己发消息"><a class="markdownIt-Anchor" href="#1-自己给自己发消息"></a> 1、自己给自己发消息</h2><p>创建一个 <code>OneWebSocket</code> 类，用来服务端与客户端进行交互：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 前后端交互的类实现消息的接收推送（自己发送给自己）</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@ServerEndpoint</span>(value = "/test/one") 前端通过此 URI 和后端交互，建立连接</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf</span>4j</span><br><span class="line"><span class="meta">@ServerEndpoint</span>(value = <span class="string">"/test/one"</span>)</span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OneWebSocket</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 记录当前在线连接数 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> AtomicInteger onlineCount = <span class="keyword">new</span> AtomicInteger(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接建立成功调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnOpen</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onOpen</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.incrementAndGet(); <span class="comment">// 在线数加 1</span></span><br><span class="line">        log.info(<span class="string">"有新连接加入：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接关闭调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnClose</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClose</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.decrementAndGet(); <span class="comment">// 在线数减 1</span></span><br><span class="line">        log.info(<span class="string">"有一连接关闭：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 收到客户端消息后调用的方法</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> message</span></span><br><span class="line"><span class="comment">     *            客户端发送过来的消息</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnMessage</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onMessage</span><span class="params">(String message, Session session)</span> </span>&#123;</span><br><span class="line">        log.info(<span class="string">"服务端收到客户端[&#123;&#125;]的消息:&#123;&#125;"</span>, session.getId(), message);</span><br><span class="line">        <span class="keyword">this</span>.sendMessage(<span class="string">"Hello, "</span> + message, session);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@OnError</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onError</span><span class="params">(Session session, Throwable error)</span> </span>&#123;</span><br><span class="line">        log.error(<span class="string">"发生错误"</span>);</span><br><span class="line">        error.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 服务端发送消息给客户端</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendMessage</span><span class="params">(String message, Session toSession)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            log.info(<span class="string">"服务端给客户端[&#123;&#125;]发送消息&#123;&#125;"</span>, toSession.getId(), message);</span><br><span class="line">            toSession.getBasicRemote().sendText(message);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            log.error(<span class="string">"服务端发送消息给客户端失败：&#123;&#125;"</span>, e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>其中 <code>@ServerEndpoint</code> 注解是服务端与客户端交互的关键，其值 (<code>/test/one</code>) 得与 <code>index</code> 页面中的请求路径对应。</p><p>启动服务，在浏览器请求 <code>http://localhost:18092/index.html</code> ，如下所示：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/0125aadcb2910b4ca22a82e254851683.png" alt="" /></p><p>请求一发出，立马就会建立服务端与客户端的连接。服务端打印日志如下：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/f55a76be4c8c650bc8121533f5344d95.png" alt="" /></p><p>在文本框中输入内容：“你好”，然后点击 Send 按钮，浏览器效果：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/0a0150c3ba89ca87ffde6ddd0e83d166.png" alt="" /></p><p>服务端日志：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/b794905998c2bc232406d4da30fb85f5.png" alt="" /></p><p>（备注：服务端关闭或者浏览器关闭的效果，都会导致连接断开，这里不演示）</p><h2 id="2-自己给所有客户端发送消息不包括自己"><a class="markdownIt-Anchor" href="#2-自己给所有客户端发送消息不包括自己"></a> 2、自己给所有客户端发送消息（不包括自己）</h2><p>创建一个 <code>OneToManyWebSocket</code> 类，用来服务端与客户端进行交互：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * 前后端交互的类实现消息的接收推送（自己发送给所有人（不包括自己））</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@ServerEndpoint</span>(value = "/test/oneToMany") 前端通过此 URI 和后端交互，建立连接</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf</span>4j</span><br><span class="line"><span class="meta">@ServerEndpoint</span>(value = <span class="string">"/test/oneToMany"</span>)</span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OneToManyWebSocket</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 记录当前在线连接数 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> AtomicInteger onlineCount = <span class="keyword">new</span> AtomicInteger(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 存放所有在线的客户端 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Map&lt;String, Session&gt; clients = <span class="keyword">new</span> ConcurrentHashMap&lt;&gt;();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接建立成功调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnOpen</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onOpen</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.incrementAndGet(); <span class="comment">// 在线数加 1</span></span><br><span class="line">        clients.put(session.getId(), session);</span><br><span class="line">        log.info(<span class="string">"有新连接加入：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接关闭调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnClose</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClose</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.decrementAndGet(); <span class="comment">// 在线数减 1</span></span><br><span class="line">        clients.remove(session.getId());</span><br><span class="line">        log.info(<span class="string">"有一连接关闭：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 收到客户端消息后调用的方法</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> message</span></span><br><span class="line"><span class="comment">     *            客户端发送过来的消息</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnMessage</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onMessage</span><span class="params">(String message, Session session)</span> </span>&#123;</span><br><span class="line">        log.info(<span class="string">"服务端收到客户端[&#123;&#125;]的消息:&#123;&#125;"</span>, session.getId(), message);</span><br><span class="line">        <span class="keyword">this</span>.sendMessage(message, session);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@OnError</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onError</span><span class="params">(Session session, Throwable error)</span> </span>&#123;</span><br><span class="line">        log.error(<span class="string">"发生错误"</span>);</span><br><span class="line">        error.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 群发消息</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> message</span></span><br><span class="line"><span class="comment">     *            消息内容</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendMessage</span><span class="params">(String message, Session fromSession)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (Map.Entry&lt;String, Session&gt; sessionEntry : clients.entrySet()) &#123;</span><br><span class="line">            Session toSession = sessionEntry.getValue();</span><br><span class="line">            <span class="comment">// 排除掉自己</span></span><br><span class="line">            <span class="keyword">if</span> (!fromSession.getId().equals(toSession.getId())) &#123;</span><br><span class="line">                log.info(<span class="string">"服务端给客户端[&#123;&#125;]发送消息&#123;&#125;"</span>, toSession.getId(), message);</span><br><span class="line">                toSession.getAsyncRemote().sendText(message);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将 <code>index.html</code> 页面的路径改为 <code>/test/oneToMany</code>。重启服务，在浏览器开多个页面。服务端日志如下：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/d74ca599ca01c20ad653f1f8da7ce0b4.png" alt="" /></p><p>在浏览器第一个页面中输入内容：“你好”，会发现其它页面都收到了消息“你好”。服务端日志如下：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/2bcc0eedc3e6230a9022f6c16c1839f6.png" alt="" /></p><h2 id="3-自己给另一个客户端发送消息"><a class="markdownIt-Anchor" href="#3-自己给另一个客户端发送消息"></a> 3、自己给另一个客户端发送消息</h2><p>创建一个 <code>OneToOneWebSocket</code> 类，用来服务端与客户端进行交互：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 前后端交互的类实现消息的接收推送（自己发送给另一个人）</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@ServerEndpoint</span>(value = "/test/oneToOne") 前端通过此 URI 和后端交互，建立连接</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf</span>4j</span><br><span class="line"><span class="meta">@ServerEndpoint</span>(value = <span class="string">"/test/oneToOne"</span>)</span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OneToOneWebSocket</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 记录当前在线连接数 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> AtomicInteger onlineCount = <span class="keyword">new</span> AtomicInteger(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/** </span></span><br><span class="line"><span class="comment">     * 存放所有在线的客户端 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Map&lt;String, Session&gt; clients = <span class="keyword">new</span> ConcurrentHashMap&lt;&gt;();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接建立成功调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnOpen</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onOpen</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.incrementAndGet(); <span class="comment">// 在线数加 1</span></span><br><span class="line">        clients.put(session.getId(), session);</span><br><span class="line">        log.info(<span class="string">"有新连接加入：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 连接关闭调用的方法</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnClose</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClose</span><span class="params">(Session session)</span> </span>&#123;</span><br><span class="line">        onlineCount.decrementAndGet(); <span class="comment">// 在线数减 1</span></span><br><span class="line">        clients.remove(session.getId());</span><br><span class="line">        log.info(<span class="string">"有一连接关闭：&#123;&#125;，当前在线人数为：&#123;&#125;"</span>, session.getId(), onlineCount.get());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 收到客户端消息后调用的方法</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> message</span></span><br><span class="line"><span class="comment">     *            客户端发送过来的消息</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@OnMessage</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onMessage</span><span class="params">(String message, Session session)</span> </span>&#123;</span><br><span class="line">        log.info(<span class="string">"服务端收到客户端[&#123;&#125;]的消息[&#123;&#125;]"</span>, session.getId(), message);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            MyMessage myMessage = JSON.parseObject(message, MyMessage<span class="class">.<span class="keyword">class</span>)</span>;</span><br><span class="line">            <span class="keyword">if</span> (myMessage != <span class="keyword">null</span>) &#123;</span><br><span class="line">                Session toSession = clients.get(myMessage.getUserId());</span><br><span class="line">                <span class="keyword">if</span> (toSession != <span class="keyword">null</span>) &#123;</span><br><span class="line">                    <span class="keyword">this</span>.sendMessage(myMessage.getMessage(), toSession);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            log.error(<span class="string">"解析失败：&#123;&#125;"</span>, e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@OnError</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onError</span><span class="params">(Session session, Throwable error)</span> </span>&#123;</span><br><span class="line">        log.error(<span class="string">"发生错误"</span>);</span><br><span class="line">        error.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 服务端发送消息给客户端</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendMessage</span><span class="params">(String message, Session toSession)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            log.info(<span class="string">"服务端给客户端[&#123;&#125;]发送消息[&#123;&#125;]"</span>, toSession.getId(), message);</span><br><span class="line">            toSession.getBasicRemote().sendText(message);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            log.error(<span class="string">"服务端发送消息给客户端失败：&#123;&#125;"</span>, e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将 <code>index.html</code> 页面的路径改为 <code>/test/oneToOne</code>。重启服务，在浏览器打开两个页面。</p><p>由于服务端是解析的 JSON 字符串，这里为了简单起见，直接在浏览器输入 JSON 字符串：<code>{&quot;message&quot;:&quot;你好&quot;, &quot;userId&quot;:1}</code>。另一个页面收到了消息：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e81a0282a2ac02eb9862e75eef75741a.png" alt="" /></p><p>服务端日志：<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/2adde634315c6569543a5b54af720a0a.png" alt="" /></p><p>至此，所有场景演示完毕。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      网上有很多关于 WebSocket 用法的文章，但是有一些内容错误或者代码不全的，这里来个全的，方便自己记忆。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>Windows 11 运行安卓应用 资料汇总</title>
    <link href="https://no5972.moe/cms/archivers/110.html"/>
    <id>https://no5972.moe/cms/archivers/110.html</id>
    <published>2021-10-21T02:30:00.000Z</published>
    <updated>2021-10-22T02:32:12.973Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<br /><a href="https://www.zhihu.com/question/493437149/answer/2181471282" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%9F%A5%E4%B9%8E-%E6%96%B0%E4%BC%9A%E5%B1%95-brightgreen" alt="知乎-新会展" /></a><br /><a href="https://zhuanlan.zhihu.com/p/424276686" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%AE%85%E5%8F%94-WINDOWS%2011%20WSA%20%E5%AE%89%E5%8D%93%E5%AD%90%E7%B3%BB%E7%BB%9F%20%E5%B8%A6GPU%203D%E5%8A%A0%E9%80%9F%20%E5%AE%89%E8%A3%85%20%E5%82%BB%E7%93%9C%E5%BF%AB%E9%80%9F%E6%95%99%E7%A8%8B-brightgreen" alt="宅叔-WINDOWS 11 WSA 安卓子系统 带GPU 3D加速 安装 傻瓜快速教程" /></a><br /><a href="https://bbs.pcbeta.com/viewthread-1908324-1-1.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/A%E6%A2%A6%E6%98%9F%E8%BE%B0-Android%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8GPU%E5%8A%A0%E9%80%9F%E7%9A%84%E6%96%B9%E6%B3%95-brightgreen" alt="A梦星辰-Android子系统使用GPU加速的方法" /></a></p><p>Windows 11 已于昨日开始支持运行安卓应用，但是截至发稿时只给 Beta 渠道开放了安卓应用支持。这里将搜集到的正式版运行安装应用的相关资料在此处做一个汇总，供大家参考。</p><h1 id="正式版安装步骤"><a class="markdownIt-Anchor" href="#正式版安装步骤"></a> 正式版安装步骤</h1><ol><li><p>打开 WSA 微软商店链接：<a href="https://www.microsoft.com/store/productId/9P3395VX91NR" target="_blank" rel="noopener">https://www.microsoft.com/store/productId/9P3395VX91NR</a></p></li><li><p>复制打开后的的链接，到安装包抓包网址: <a href="https://store.rg-adguard.net/" target="_blank" rel="noopener">https://store.rg-adguard.net/</a> 在这里输入上述商店链接，右边要选择 Slow 通道。 <strong>slow slow slow</strong></p></li><li><p>找到最下面名为<code>MicrosoftCorporationII.WindowsSubsystemForAndroid_1.7.32815.0_neutral_~_8wekyb3d8bbwe.msixbundle”</code>的包进行下载，即可获取最新的 Beta 版本的抓包。抓包链接：<a href="http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/433b1665-c732-486a-99ee-e2c610cd10d4?P1=1634814272&amp;P2=404&amp;P3=2&amp;P4=FZkT1wLbbDSXByJfjPFHas0rRvhnOBOPD3EZeqfmb38C2ZCsyIxb8boql%2fSvqRRc5lS7FJ62h6zD6IR81ctXEw%3d%3d" target="_blank" rel="noopener">http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/433b1665-c732-486a-99ee-e2c610cd10d4?P1=1634814272&amp;P2=404&amp;P3=2&amp;P4=FZkT1wLbbDSXByJfjPFHas0rRvhnOBOPD3EZeqfmb38C2ZCsyIxb8boql%2fSvqRRc5lS7FJ62h6zD6IR81ctXEw%3d%3d</a></p></li><li><p>打开下载文件后所在目录，Shift + 鼠标右键打开 PowerShell，使用 App Installer 安装，在 PowerShell 里面手动执行命令进行安装。<br />1.使用管理员身份运行 PowerShell，输入命令<code>add-appxpackage</code>，把刚下载的文件直接拖到这里，回车执行。</p></li><li><p>如果安装有问题，说缺少框架，在抓包页里搜索<code>Microsoft.UI.Xaml.2.6_8wekyb3d8bbwe</code>，然后下载其中的<code>Microsoft.UI.Xaml.2.6_2.62108.18004.0_x64__8wekyb3d8bbwe.BlockMap</code>，进行命令行安装。</p></li><li><p>如果打开弹出白色弹窗，<a href="https://m.php.cn/faq/476405.html" target="_blank" rel="noopener">BIOS 里开应用虚拟化</a>，或者打开控制面板-程序-启用或关闭 Windows 功能 点进去勾选“Hyper-V”确定，然后等待一会儿完成后重启。</p><ol><li>首先需要打开控制面板，点“开始”，选择“所有应用”，打开“Windows 系统”，然后打开“控制面板”如果桌面上有快捷方式可以直接打开；</li><li>打开以后查看方式选择“大图标”打开“程序和功能”；</li><li>打开左边的“启用或关闭 Windows 功能”；</li><li>然后勾选“Hyper-V”确定，（子文件管理工具还有平台自动勾选）；</li><li>完成后需要稍等一段时间，然后重启电脑</li></ol></li><li><p>可以打开新版的 Windows Subsystem for Android 进行体验了</p></li></ol><h1 id="app-安装步骤"><a class="markdownIt-Anchor" href="#app-安装步骤"></a> APP 安装步骤</h1><ol><li>下载 ADB 工具包（请务必通过谷歌官网下载，三方网站下载容易被捆绑其他应用）。打开网址<a href="https://developer.android.google.cn/studio/releases/platform-tools" target="_blank" rel="noopener">https://developer.android.google.cn/studio/releases/platform-tools</a></li></ol><p><img src="https://pic2.zhimg.com/v2-e4ea1035662edb2119f5edef34b688a9_r.jpg" alt="" /></p><ol start="2"><li>选择“下载适用于 Windows 的 SDK Platform-Tools”。</li></ol><p><img src="https://pic2.zhimg.com/80/v2-e5d3850d727e1602ddd72521c81b7735_720w.jpg" alt="" /></p><ol start="3"><li><p>同意条款后，点击绿色按钮下载 platform-tools_r31.0.3-windows。</p></li><li><p>下载安卓应用市场，这里推荐 酷安或豌豆荚。<br /><a href="https://www.wandoujia.com/" target="_blank" rel="noopener">https://www.wandoujia.com/</a><br /><a href="https://www.coolapk.com/" target="_blank" rel="noopener">https://www.coolapk.com/</a><br />官网点击下载应用市场 APK 即可。</p></li></ol><p>以上完成全部准备工作。</p><ol start="5"><li>点击开始-Windows Subsystem for Android 开启安卓子系统设置。</li></ol><p><img src="https://pic2.zhimg.com/80/v2-5e508c0515888125f1929dd9bd84ab15_720w.jpg" alt="" /></p><ol start="6"><li>首先点击文件，打开安卓子系统的文件管理，然后返回设置页面。</li></ol><p><img src="https://pic4.zhimg.com/80/v2-c8907ea081e72c9e9050660c2a8cbdb7_720w.jpg" alt="" /><br /><img src="https://pic4.zhimg.com/80/v2-efdf4a3486edc85f6b01e5fca691be07_720w.jpg" alt="" /></p><ol start="7"><li>然后选择开启开发人员模式，注意此时请记录显示在屏幕上的 IP 和端口，默认为 <code>127.0.0.1:58526</code>，然后解压 <code>platform-tools_r31.0.3-windows.zip</code> 到磁盘根目录 这里释放 ADB 工具。</li></ol><p><img src="https://pic4.zhimg.com/80/v2-f71963481d48d92c70b761a9d041f81b_720w.jpg" alt="" /></p><ol start="8"><li>找到刚才解压的工具目录，在地址栏输入 CMD 打开命令行。</li></ol><p><img src="https://pic1.zhimg.com/80/v2-1fb0c00dbb8eb6b205540ff4a335b7ac_720w.jpg" alt="" /></p><ol start="9"><li>输入 <code>adb connect 127.0.0.1:58526</code> 这里为设置 IP 和端口。</li></ol><p><img src="https://pic2.zhimg.com/80/v2-11e4291908aaca84ea7a5256acb33e85_720w.jpg" alt="" /></p><ol start="10"><li>使用 <code>adb devices</code> 看列表中是否连接成功设备，连接成功后会显示连结的 IP 和端口。</li></ol><p><img src="https://pic4.zhimg.com/80/v2-7b199a5ba3a8895a0c4a078626dd347b_720w.jpg" alt="" /></p><ol start="11"><li>输入 <code>adb install</code> 空格拖拽刚才下载的 APK（CMD 中拖拽文件会自动补入地址）回车执行。</li></ol><p><img src="https://pic1.zhimg.com/80/v2-bbc67181e4354e50a5d0325771bfa964_720w.png" alt="" /></p><ol start="12"><li>执行后点击开始菜单，推荐项目中将显示刚才添加的 APK 安装文件，点击即可运行安卓应用。注意应用市场下载应用会提示阻止安装，请按照提示解除即可安装。</li></ol><p><img src="https://pic1.zhimg.com/80/v2-1ccf45a7b675102ec05a951b4dbc2788_720w.jpg" alt="" /></p><ol start="13"><li>点击 Microsoft Store 开启微软市场。</li></ol><p><img src="https://pic1.zhimg.com/80/v2-1bea481e229e6258d7fa437f0003527c_720w.jpg" alt="" /></p><ol start="14"><li>搜索 <code>OpenCL</code> 安装 OpenCL 和 OpenGL 兼容包，获取安装后，重启计算机。</li></ol><p><img src="https://pic2.zhimg.com/80/v2-ba9f9d3c0cf0cf1d8aa82d03c6f1b569_720w.jpg" alt="" /></p><ol start="15"><li>开启安卓应用市场，下载安卓测试软件，如鲁大师，开启成功后，GPU 将显示分数，硬件加速打开，在使用 3D 应用时，安卓子系统进程在任务管理器 GPU 占用中，将显示占用率，注意因为转译与测试原因，目前显卡占用率不高，但 3D 加速以正常。</li></ol><p><img src="https://pic4.zhimg.com/80/v2-3e8f7382560ebc2c3368c255f73a306b_720w.jpg" alt="" /></p><h1 id="调用-gpu-说明"><a class="markdownIt-Anchor" href="#调用-gpu-说明"></a> 调用 GPU 说明</h1><p>由于 Android 子系统使用了和 WSL2 相同的技术，所以GPU加速需要“<strong>WDDM &gt;= 2.9 且支持 WSL 加速</strong>”的显卡驱动、以及运行环境 <strong>支持 OpenCL、OpenGL</strong>，所以别说子系统 GPU 支持有问题了（但确实有 bug ，表现为 GPU 调用不积极，但不是不支持。</p><p><strong>编注：查看当前支持 WDDM 版本：运行输入<code>dxdiag</code>，打开 DirectX 诊断工具，显示选项卡，在右侧驱动程序可查看当前显卡支持 WDDM 的版本。</strong></p><p>以下链接来自 Microsoft Docs，均保证可用性。</p><p>如果依旧不能 GPU 加速，可以考虑换机了，因为 <strong>绝大部分老显卡是不支持 WDDM 2.9 / WDDM 3.0 的，就算装上预览版驱动，也救不了；同样的部分老显卡不支持 Dx12，装了 OpenGL 也没用。</strong>（Windows 上 OpenGL 依赖于 Dx12）</p><p>Intel WSL 驱动链接：<br /><a href="https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html" target="_blank" rel="noopener">https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html</a></p><p>Nvidia WSL 驱动链接：<br /><a href="https://developer.nvidia.com/cuda/wsl/download" target="_blank" rel="noopener">https://developer.nvidia.com/cuda/wsl/download</a></p><p>AMD WSL 驱动链接：<br /><a href="https://www.amd.com/en/support/kb/release-notes/rn-rad-win-wsl-support" target="_blank" rel="noopener">https://www.amd.com/en/support/kb/release-notes/rn-rad-win-wsl-support</a></p><p>由于大部分 PC 显卡驱动不带 OpenCL 和 OpenGL，还需要去商店安装 OpenCL 和 OpenGL 扩展包：<a href="https://www.microsoft.com/store/productId/9NQPSL29BFFF" target="_blank" rel="noopener">https://www.microsoft.com/store/productId/9NQPSL29BFFF</a></p><p><strong>注意：关于 GPU 跑分。</strong></p><p>以上操作能解决 <strong>大部分</strong> GPU 加速不可用的问题，但是依旧有小部分电脑的 GPU 是 0 分</p><p>这种情况建议到商店下载 Windows Subsystem for Linux Preview， 用命令行看是否开了 GPU 加速，因为目前无法排除 Windows Subsystem for Android 有 bug，或者还需要配置啥。</p><p>官方文档目前没提及 WSA 关于 GPU 的部分，我列的只是根据 WSL2 文档的一些信息，讲白了只是必要条件，不是充分条件；因为 WSL2 是 WSA 的技术基础，WSL2 都不支持，WSA 就更免谈了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Windows 11 已于昨日开始支持运行安卓应用，但是截至发稿时只给 Beta 渠道开放了安卓应用支持。这里将搜集到的正式版运行安装应用的相关资料在此处做一个汇总，供大家参考。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>冷饭热炒：让 Win10/11 也能用上 3D 窗口切换效果</title>
    <link href="https://no5972.moe/cms/archivers/109.html"/>
    <id>https://no5972.moe/cms/archivers/109.html</id>
    <published>2021-10-18T02:45:00.000Z</published>
    <updated>2023-03-15T10:29:24.523Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>用过 Win7 或 Vista 的应该都曾经被 3D 的窗口切换效果所惊艳，这种 3D 窗口切换的效果名为“Flip 3D”。然而从 Win8 开始，这种 3D 的窗口切换效果就被换掉了，变成了 2D 平铺的样式。那么有没有办法让 Win10、Win11 系统也能呈现出3D的窗口切换效果呢？</p><p>2007 年前后有不少文章提到过这样一个工具：WinFlip。这个工具起初设计出来就是给 XP 系统实现模仿 Vista 的 Flip 3D 效果。但实际上我们现在的 Win10、Win11 也可以使用，也能实现出 3D 的窗口切换效果。</p><p>但是我们要做一下特别配置，默认的 Win + Tab 快捷键和 Win10 自带的窗口切换有冲突，不仅会被 Win10 的窗口切换界面覆盖，而且也容易让 WinFlip 崩溃，所以要把快捷键改成 Alt + Tab ，这个不会和 Win10 的切换窗口界面冲突，Win10 自带的窗口切换不会显示，而是显示 WinFlip 的 3D 切换界面。在系统托盘 WinFlip 图标右键选项，把“切换窗口并翻转”的下拉框选择“ALT”。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/eb764777e5124c25a184534dd6da8685.png" alt="" /><br />这样我们只要按下 Alt + Tab 键就可以实现出 3D 的切换效果了。但是仍然有一个小问题，原本的 Alt + Tab 按一下就可以切换到上一个窗口，但是这个必须得按两下才能切换到上一个窗口，只按一下仍然是在当前的窗口。这个仍然有待改善，虽然这工具很可能已经很久前就停止维护了，但是还是稍微提一下，如果大家有兴趣也可以自行开发类似的、更易于使用的工具。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/bfe7d159cbfc432da03d15b2528233b6.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      用过 Win7 或 Vista 的应该都曾经被 3D 的窗口切换效果所惊艳，这种 3D 窗口切换的效果名为“Flip 3D”。然而从 Win8 开始，这种 3D 的窗口切换效果就被换掉了，变成了 2D 平铺的样式。那么有没有办法让 Win10、Win11 系统也能呈现出3D的窗口切换效果呢？
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Flash CS6 导出 H5 格式的插件面板 ToolKit for CreateJS 的绿色安装方法</title>
    <link href="https://no5972.moe/cms/archivers/108.html"/>
    <id>https://no5972.moe/cms/archivers/108.html</id>
    <published>2021-10-11T16:30:00.000Z</published>
    <updated>2024-09-26T09:57:26.340Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Flash安装插件的时候，需要Adobe Extension Manager ，但是安装Adobe Extension Manager 是一个很繁琐的过程，不一定成功，有时候还需要重新安装Flash，甚至这个Adobe Extension Manager 还不一定能用。所以就有了此文，手动安装插件面板。</p><p>此方法可以免去安装 Adobe Extension Manager 的前提。</p><p>此方法在Flash CS6 环境下测试有效。</p><p>打开 Flash ，不要新建默认类型的文档，而是新建一个 Flash JavaScript  文件，输入<code>fl.trace(fl.configURI);</code>，然后点播放按钮，查看输出面板（也就是按 F2 会出现的面板），会看到类似如下的信息：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file:&#x2F;&#x2F;&#x2F;C|&#x2F;Documents%20and%20Settings&#x2F;Administrator&#x2F;Local%20Settings&#x2F;Application%20Data&#x2F;Adobe&#x2F;Flash%20CS6&#x2F;zh_CN&#x2F;Configuration&#x2F;</span><br></pre></td></tr></table></figure><p>根据上面的信息，找到相应的目录（前提是你的系统要能查看到隐藏目录）。</p><p>ToolKit for CreateJS 这个插件的文件结构是比较复杂的。我们用 7-Zip 打开这个 .zxp 的文件。里面有若干目录，但是首先注意到根目录有一个 .mxi 的文件，强行用文本编辑器打开，发现是一个 XML 格式的文件。经过一番查找后发现在文件下方记载了插件包各个文件需要放置的路径。<code>destination</code>的<code>$Flash</code>应该就是前者出现的目录路径。前往这个目录的路径，然后在 7-Zip 中将对应的文件放入指定的目录。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/426a2eb40e7f4f88a96e5d0ce87fbe16.png" alt="" /></p><p>这样在<code>Configuration</code>目录中释放好的文件结构应该是这样子的。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Users\Admin\AppData\Local\Adobe\Flash CS6\zh_CN\Configuration&gt; tree /F ./CreateJS</span><br><span class="line">&gt;&gt;  tree /F .\WindowSWF\ | <span class="built_in">Select-String</span> <span class="literal">-pattern</span> <span class="string">"(CreateJS|WindowSWF)"</span></span><br><span class="line">&gt;&gt;  tree /F .\Commands\ | <span class="built_in">Select-String</span> <span class="literal">-pattern</span> <span class="string">"(CreateJS|Commands)"</span></span><br><span class="line">卷 Windows<span class="literal">-SSD</span> 的文件夹 PATH 列表</span><br><span class="line">卷序列号为 AEBC<span class="literal">-8FC1</span></span><br><span class="line">C:\USERS\ADMIN\APPDATA\LOCAL\ADOBE\FLASH CS6\ZH_CN\CONFIGURATION\CREATEJS</span><br><span class="line">├─jsfl</span><br><span class="line">│      BitmapSymbol.jsfl</span><br><span class="line">│      ContainerSymbol.jsfl</span><br><span class="line">│      Exporter.jsfl</span><br><span class="line">│      exportUtils.jsfl</span><br><span class="line">│      FileChangeManager.jsfl</span><br><span class="line">│      LayerObj.jsfl</span><br><span class="line">│      Locale.jsfl</span><br><span class="line">│      Log.jsfl</span><br><span class="line">│      main.jsfl</span><br><span class="line">│      Matrix2D.jsfl</span><br><span class="line">│      ShapeInst.jsfl</span><br><span class="line">│      SoundSymbol.jsfl</span><br><span class="line">│      StateObj.jsfl</span><br><span class="line">│      SymbolInst.jsfl</span><br><span class="line">│      TextInst.jsfl</span><br><span class="line">│      utils.jsfl</span><br><span class="line">│</span><br><span class="line">├─libs</span><br><span class="line">│      Ease.js</span><br><span class="line">│      easel.js</span><br><span class="line">│      MovieClip.js</span><br><span class="line">│      preload.js</span><br><span class="line">│      sound.js</span><br><span class="line">│      Timeline.js</span><br><span class="line">│      Tween.js</span><br><span class="line">│</span><br><span class="line">└─locale</span><br><span class="line">    ├─en_US</span><br><span class="line">    │      strings.xml</span><br><span class="line">    │</span><br><span class="line">    └─ja_JP</span><br><span class="line">            strings.xml</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">C:\USERS\ADMIN\APPDATA\LOCAL\ADOBE\FLASH CS6\ZH_CN\CONFIGURATION\WINDOWSWF</span><br><span class="line">    Toolkit <span class="keyword">for</span> CreateJS.swf</span><br><span class="line">    </span><br><span class="line">C:\USERS\ADMIN\APPDATA\LOCAL\ADOBE\FLASH CS6\ZH_CN\CONFIGURATION\COMMANDS</span><br><span class="line">    Publish <span class="keyword">for</span> CreateJS.jsfl</span><br></pre></td></tr></table></figure><p>按照上面的结构布置好文件以后，打开 Flash ，打开或者新建 FLA 文档，然后点击菜单栏的窗口-其他面板，就可以看到 ToolKit for CreateJS 这个选项了，然后就可以按照其他文章的做法来导出 HTML5 的动画了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/72aaab3b4e734a5cb7dc0c1371470b32.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Flash安装插件的时候，需要Adobe Extension Manager ，但是安装Adobe Extension Manager 是一个很繁琐的过程，不一定成功，有时候还需要重新安装Flash，甚至这个Adobe Extension Manager 还不一定能用。所以就有了此文，手动安装插件面板。此方法可以免去安装 Adobe Extension Manager 的前提。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
      <category term="Animation" scheme="https://no5972.moe/cms/categories/Animation/"/>
    
    
  </entry>
  
  <entry>
    <title>LaTeX 书写递等式</title>
    <link href="https://no5972.moe/cms/archivers/107.html"/>
    <id>https://no5972.moe/cms/archivers/107.html</id>
    <published>2021-10-09T02:30:00.000Z</published>
    <updated>2023-09-01T01:27:23.989Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>主要是用到矩阵的<code>\begin{aligned}</code>和<code>\end{aligned}</code>来实现等号的对齐。</p><p>示例：小学五年级算术：用递等式计算：</p><p>(1) 600-(4.06+6.4)×0.5</p><p>LaTeX表示：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">\begin&#123;aligned&#125;</span><br><span class="line">&#123;&#125; &amp; 600 - (4.06 + 6.4) \times 0.5 &amp; \\</span><br><span class="line">&#x3D; &amp; 600 - 10.46 \times 0.5 &amp; \\</span><br><span class="line">&#x3D; &amp; 600 - 5.23 &amp; \\</span><br><span class="line">&#x3D; &amp; 594.77.</span><br><span class="line">\end&#123;aligned&#125;</span><br></pre></td></tr></table></figure><p>输出：</p><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left right" columnspacing="0em 1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>600</mn><mo>−</mo><mo stretchy="false">(</mo><mn>4.06</mn><mo>+</mo><mn>6.4</mn><mo stretchy="false">)</mo><mo>×</mo><mn>0.5</mn></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>600</mn><mo>−</mo><mn>10.46</mn><mo>×</mo><mn>0.5</mn></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>600</mn><mo>−</mo><mn>5.23</mn></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>594.77.</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}{} &amp; 600 - (4.06 + 6.4) \times 0.5 &amp; \\= &amp; 600 - 10.46 \times 0.5 &amp; \\= &amp; 600 - 5.23 &amp; \\= &amp; 594.77.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6em;vertical-align:-2.7500000000000004em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-2.4099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-0.9099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.7500000000000004em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">6</span><span class="mord">0</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mord">.</span><span class="mord">0</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">6</span><span class="mord">.</span><span class="mord">4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">5</span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">6</span><span class="mord">0</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">.</span><span class="mord">4</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">5</span></span></span><span style="top:-2.4099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">6</span><span class="mord">0</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">5</span><span class="mord">.</span><span class="mord">2</span><span class="mord">3</span></span></span><span style="top:-0.9099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">5</span><span class="mord">9</span><span class="mord">4</span><span class="mord">.</span><span class="mord">7</span><span class="mord">7</span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.7500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.25em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-3.75em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-2.249999999999999em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000007em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>(2) 30.8÷[12.1-(9.96+1.04)]</p><p>LaTeX表示：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">\begin&#123;aligned&#125;</span><br><span class="line">&#123;&#125; &amp; 30.8 \div [12.1 - (9.96 + 1.04)] &amp; \\</span><br><span class="line">&#x3D; &amp; 30.8 \div (12.1 - 11) &amp; \\</span><br><span class="line">&#x3D; &amp; 30.8 \div 1.1 &amp; \\</span><br><span class="line">&#x3D; &amp; 28.</span><br><span class="line">\end&#123;aligned&#125;</span><br></pre></td></tr></table></figure><p>输出：</p><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left right" columnspacing="0em 1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>30.8</mn><mo>÷</mo><mo stretchy="false">[</mo><mn>12.1</mn><mo>−</mo><mo stretchy="false">(</mo><mn>9.96</mn><mo>+</mo><mn>1.04</mn><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>30.8</mn><mo>÷</mo><mo stretchy="false">(</mo><mn>12.1</mn><mo>−</mo><mn>11</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>30.8</mn><mo>÷</mo><mn>1.1</mn></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo>=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mn>28.</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}{} &amp; 30.8 \div [12.1 - (9.96 + 1.04)] &amp; \\= &amp; 30.8 \div (12.1 - 11) &amp; \\= &amp; 30.8 \div 1.1 &amp; \\= &amp; 28.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6em;vertical-align:-2.7500000000000004em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-2.4099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-0.9099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.7500000000000004em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">3</span><span class="mord">0</span><span class="mord">.</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">[</span><span class="mord">1</span><span class="mord">2</span><span class="mord">.</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mord">.</span><span class="mord">9</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord">0</span><span class="mord">4</span><span class="mclose">)</span><span class="mclose">]</span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">3</span><span class="mord">0</span><span class="mord">.</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mord">2</span><span class="mord">.</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">1</span><span class="mclose">)</span></span></span><span style="top:-2.4099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">3</span><span class="mord">0</span><span class="mord">.</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord">1</span></span></span><span style="top:-0.9099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord">2</span><span class="mord">8</span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.7500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.25em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-3.75em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span><span style="top:-2.249999999999999em;"><span class="pstrut" style="height:2.84em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2500000000000007em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><hr /><p>再给出另一种书写递等式的方式，适用于初中的数学公式。直接使用“矩阵”来表示相应的计算过程。</p><p>示例：初二算术：计算：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mi>a</mi><msup><mi>b</mi><mn>2</mn></msup><mi>c</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>⋅</mo><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><mi>a</mi><mi>b</mi><msup><mi>c</mi><mn>2</mn></msup><msup><mo stretchy="false">)</mo><mn>3</mn></msup><mo>⋅</mo><mn>12</mn><msup><mi>a</mi><mn>3</mn></msup><mi>b</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">(- \frac {1}{2} ab^{2}c)^{2} \cdot (- \frac {1}{3} abc^{2})^{3} \cdot 12a^{3}b.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">c</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mord">.</span></span></span></span></p><p>LaTeX表示：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">\begin &#123;aligned&#125; &#123;&#125; 原式 &amp; &#x3D; \frac &#123;1&#125;&#123;4&#125; a^&#123;2&#125;b^&#123;4&#125;c^&#123;2&#125; \cdot (- \frac &#123;1&#125;&#123;27&#125; a^&#123;3&#125;b^&#123;3&#125;c^&#123;6&#125;) \cdot 12a^&#123;3&#125;b \\  </span><br><span class="line">&amp; &#x3D; [\frac &#123;1&#125;&#123;4&#125; \times (- \frac &#123;1&#125;&#123;27&#125;) \times 12](a^&#123;2&#125;a^&#123;3&#125;a^&#123;3&#125;)(b^&#123;4&#125;b^&#123;3&#125;b)(c^&#123;2&#125;c^&#123;6&#125;) \\</span><br><span class="line">&amp; &#x3D; - \frac &#123;1&#125;&#123;9&#125;a^&#123;8&#125;b^&#123;8&#125;c^&#123;8&#125;.</span><br><span class="line">\end &#123;aligned&#125;</span><br></pre></td></tr></table></figure><p>输出：</p><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi mathvariant="normal">原</mi><mi mathvariant="normal">式</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mn>1</mn><mn>4</mn></mfrac><msup><mi>a</mi><mn>2</mn></msup><msup><mi>b</mi><mn>4</mn></msup><msup><mi>c</mi><mn>2</mn></msup><mo>⋅</mo><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mn>27</mn></mfrac><msup><mi>a</mi><mn>3</mn></msup><msup><mi>b</mi><mn>3</mn></msup><msup><mi>c</mi><mn>6</mn></msup><mo stretchy="false">)</mo><mo>⋅</mo><mn>12</mn><msup><mi>a</mi><mn>3</mn></msup><mi>b</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">[</mo><mfrac><mn>1</mn><mn>4</mn></mfrac><mo>×</mo><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mn>27</mn></mfrac><mo stretchy="false">)</mo><mo>×</mo><mn>12</mn><mo stretchy="false">]</mo><mo stretchy="false">(</mo><msup><mi>a</mi><mn>2</mn></msup><msup><mi>a</mi><mn>3</mn></msup><msup><mi>a</mi><mn>3</mn></msup><mo stretchy="false">)</mo><mo stretchy="false">(</mo><msup><mi>b</mi><mn>4</mn></msup><msup><mi>b</mi><mn>3</mn></msup><mi>b</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><msup><mi>c</mi><mn>2</mn></msup><msup><mi>c</mi><mn>6</mn></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo>−</mo><mfrac><mn>1</mn><mn>9</mn></mfrac><msup><mi>a</mi><mn>8</mn></msup><msup><mi>b</mi><mn>8</mn></msup><msup><mi>c</mi><mn>8</mn></msup><mi mathvariant="normal">.</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin {aligned} {} 原式 &amp; = \frac {1}{4} a^{2}b^{4}c^{2} \cdot (- \frac {1}{27} a^{3}b^{3}c^{6}) \cdot 12a^{3}b \\  &amp; = [\frac {1}{4} \times (- \frac {1}{27}) \times 12](a^{2}a^{3}a^{3})(b^{4}b^{3}b)(c^{2}c^{6}) \\&amp; = - \frac {1}{9}a^{8}b^{8}c^{8}.\end {aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.922320000000001em;vertical-align:-3.2111600000000005em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.71116em;"><span style="top:-5.71116em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">式</span></span></span><span style="top:-3.40372em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"></span></span><span style="top:-1.0962799999999997em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2111600000000005em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.71116em;"><span style="top:-5.71116em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">7</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span></span></span><span style="top:-3.40372em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mopen">[</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">7</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mclose">]</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-1.0962799999999997em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2111600000000005em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      主要是用到begin aligned和end aligned来实现等号的对齐，以及;控制缩进。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>解决Flash Player过期的问题——谷歌浏览器Chrome 87.0.4270.0绿色免安装增强版</title>
    <link href="https://no5972.moe/cms/archivers/106.html"/>
    <id>https://no5972.moe/cms/archivers/106.html</id>
    <published>2021-10-08T01:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.523Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://www.epinv.com/post/7888.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%BA%BF%E5%93%81%E5%85%83%E7%B4%A0-%E8%B0%B7%E6%AD%8C%E6%B5%8F%E8%A7%88%E5%99%A8Chrome%2087.0.4270.0%E7%BB%BF%E8%89%B2%E5%85%8D%E5%AE%89%E8%A3%85%E5%A2%9E%E5%BC%BA%E7%89%88-brightgreen" alt="亿品元素-谷歌浏览器Chrome 87.0.4270.0绿色免安装增强版" /></a></p><p><strong>更新为Chrome 87.0.4270.0绿色免安装版</strong>。谷歌浏览器，又称Google浏览器、Chrome浏览器，是谷歌Google推出的一款强大好用的基于Chromium内核的网页浏览器。Google Chrome 的诞生离不开 Chromium 开源项目以及其他开源软件。<strong>注：</strong> 目前国内大部分浏览器甚至微软的Edge浏览器都是基于Chromium 开源项目，由此可见Chromium内核之强大！</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/cadedaf9e4f853827de40ab45f89181f.png" alt="" /><br />今天给大家分享的是谷歌浏览器Chrome绿色免安装便携版，解压即可使用，也可以随时拷贝到U盘便携使用。</p><h1 id="chrome绿色免安装增强版说明"><a class="markdownIt-Anchor" href="#chrome绿色免安装增强版说明"></a> Chrome绿色免安装增强版说明</h1><ol><li>采用MyChrome 3.8绿化程序基于Chrome最新版制作；</li><li>集成强大的脚本管理插件Tampermonkey(油猴)，以便大家在 GreasyFork 上安装各种Tampermonkey脚本插件；</li><li>用户可以安装离线版扩展插件（<a href="http://www.epinv.com/post/10002.html" target="_blank" rel="noopener">CRX离线版插件下载及安装方法</a>），并且不会弹出“请停用以开发者模式运行的扩展程序”的烦人提示（<a href="http://www.epinv.com/post/12721.html" target="_blank" rel="noopener">实现该功能的补丁说明</a>）；</li><li><strong>集成Flash特别版，解决Flash提示地区不相容的问题；浏览器不会自动更新，即使是点开“关于”也不会自动更新（因为一更新就不支持Flash了）；</strong></li><li>集成Chrome绿色版备份程序，可以备份你的扩展插件和收藏夹等；</li><li>集成Chrome优化设置工具:SpeedyFox汉化版，让你的浏览器一键提速（<a href="http://www.epinv.com/post/13186.html" target="_blank" rel="noopener">SpeedyFox用法</a>）；</li><li>绿色免安装，可以拷贝到任意位置使用；</li><li>未改主页，可自由更换，随心所欲；</li><li>自带Chrome绿化制作程序，自己可随时将chrome浏览器更新为最新版本。</li></ol><p>相对于网上很多其他版本的Chrome绿色版，此便携版最大的特点在于你可以自己随时更新为Chrome 最新版，再也不用绿化作者更新一个版本，你就要重新下载一次。</p><p><strong>并且自己制作的Chrome绿色版，还能保证干净安全。</strong></p><h1 id="google-chrome绿色便携版用法说明"><a class="markdownIt-Anchor" href="#google-chrome绿色便携版用法说明"></a> Google Chrome绿色便携版用法说明</h1><ol><li><p>解压到任意目录，直接运行<code>MyChrome.exe</code>即可。</p></li><li><p>个人设置在目录下的<code>User Data</code>中，只要保护好这个文件夹，你的个人设置，收藏夹都不会丢失！</p></li><li><p>同时集成MyChrome更新工具，如果你需要更新你的Chrome浏览器，只要运行<code>MyChrome.vbs</code>，然后选择你需要的版本更新即可，方便快捷，即使电脑小白也可以打造属于自己的Chrome绿色版。</p></li></ol><p>Chrome浏览器程序文件来源默认是Google，如果Google查询不到更新，还可以选择国内的<code>sina.com.cn</code>。如果是32位系统，你可以勾选“只下载32位浏览器”。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/08ce8dd562334fc8bc2086413b4ae430.png" alt="" /></p><ol start="4"><li>运行<code>!备份设置.bat</code>即可备份你的Chrome绿色版设置，包括收藏夹以及扩展插件等（备份位置：<code>\User Data-bak</code>）。当你想恢复设置，只要将旧的<code>User Data</code>删除，然后将<code>User Data-bak</code>重命名为<code>User Data</code>即可，你的扩展插件和收藏夹都会得到保留；</li></ol><p>注：如果你以前使用的就是基于“MyChrome”制作的绿色版Chrome，现在只是想升级，那么你可以</p><ol><li>先在旧版中运行<code>!备份设置.bat</code>，备份你的Chrome插件及收藏夹；</li><li>解压新Chrome绿色版；</li><li>删除新Chrome绿色版中的<code>User Data</code>文件夹；</li><li>将你刚才备份<code>User Data-bak</code>重命名为<code>User Data</code>，并复制到新Chrome绿色版中，这样就可以在保留你的个人设置、收藏夹、扩展插件的基础上完美升级。</li></ol><h1 id="google-chrome浏览器简介"><a class="markdownIt-Anchor" href="#google-chrome浏览器简介"></a> Google Chrome浏览器简介</h1><p>Google Chrome，又称Google浏览器，是个由Google（谷歌）公司开发的网页浏览器。该浏览器是基于Chromium开源软件所撰写，包括WebKit，目标是提升稳定性、速度和安全性，并创造出简单且有效率的界面。Google Chrome浏览器，追求速度、简约安全的必备浏览器。</p><h1 id="google浏览器绿色版下载地址"><a class="markdownIt-Anchor" href="#google浏览器绿色版下载地址"></a> Google浏览器绿色版下载地址</h1><p>网盘下载：<a href="https://software8.ctfile.com/dir/19093-30072964-bbcaf0/" target="_blank" rel="noopener">https://software8.ctfile.com/dir/19093-30072964-bbcaf0/</a></p><p>网盘下载：<a href="https://pan.baidu.com/s/1cFGPIk9sOJF6IBBLDMEstg" target="_blank" rel="noopener">https://pan.baidu.com/s/1cFGPIk9sOJF6IBBLDMEstg</a>  提取码: <code>k8jy</code></p><p>网盘下载：<a href="https://www.lanzoui.com/b394191/" target="_blank" rel="noopener">https://www.lanzoui.com/b394191/</a> 提取码: <code>78i0</code></p><p>默认解压密码为：<code>www.epinv.com</code></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      集成Flash特别版，解决Flash提示地区不相容的问题；浏览器不会自动更新，即使是点开“关于”也不会自动更新（因为一更新就不支持Flash了）
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>在 Windows 11 的“此电脑”窗口添加“控制面板”图标</title>
    <link href="https://no5972.moe/cms/archivers/105.html"/>
    <id>https://no5972.moe/cms/archivers/105.html</id>
    <published>2021-10-05T11:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.519Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>今天，Windows 11 正式发布了。但是紧接着就有人吐槽，“控制面板”不见了。鄙人记得在注册表里面有个地方是可以在“此电脑”窗口中随便自定义图标的。我们研究一下能不能通过修改注册表的方式向“此电脑”窗口添加“控制面板”图标。</p><p>经过一番查找我们得知“控制面板”的 CLSID 为：<code>{26EE0668-A00A-44D7-9371-BEB064C98683}</code>，而“控制面板”的图标显示模式的 CLSID 为：<code>{21EC2020-3AEA-1069-A2DD-08002B30309D}</code>。这样我们只需要将其中一个 CLSID 放到那个地方就行了。</p><p>打开注册表编辑器，定位到<code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\</code>。在左边这个项处右键选择“新建-项”。将项命名为上面两个 CLSID 中的一个。确认新建，然后重新打开“此电脑”，就可以看到“控制面板”图标了。双击它就可以打开控制面板了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/f4eebdac2a39482f978f8f75c975677d.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/bb866093a01d476da6deef4a63e20b66.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/9d447fe4cd5c4929b670e3b7a8b01e24.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      今天，Windows 11 正式发布了。但是紧接着就有人吐槽，“控制面板”不见了。鄙人记得在注册表里面有个地方是可以在“此电脑”窗口中随便自定义图标的。我们研究一下能不能通过修改注册表的方式向“此电脑”窗口添加“控制面板”图标。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>本站已更换域名到 no5972.moe</title>
    <link href="https://no5972.moe/cms/archivers/104.html"/>
    <id>https://no5972.moe/cms/archivers/104.html</id>
    <published>2021-09-23T10:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.519Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>发生了很不巧的一个事情。原来的某域名，白嫖的，突然到期了，<strong>没有任何征兆。</strong></p><h1 id="为什么没有任何征兆"><a class="markdownIt-Anchor" href="#为什么没有任何征兆"></a> 为什么没有任何征兆？</h1><p>就在域名到期的两个星期前，那个用来提醒域名到期并自动续期的 <a href="https://github.com/luolongfei/next-freenom#%E6%B3%A8%E6%84%8F%E7%94%B1%E4%BA%8E%E6%88%91%E5%89%8D%E4%BB%93%E5%BA%93-httpsgithubcomluolongfeifreenom-%E4%B8%8D%E6%98%8E%E5%8E%9F%E5%9B%A0%E8%A2%AB%E5%B0%81%E4%BC%B0%E8%AE%A1%E6%98%AF%E4%B8%8E%E6%97%A9%E5%89%8D%E7%9A%84-github-action-%E4%BA%8B%E4%BB%B6%E6%9C%89%E5%85%B3%E6%95%85%E5%B0%86%E5%8E%9F%E9%A1%B9%E7%9B%AE%E8%BF%81%E7%A7%BB%E8%87%B3%E6%AD%A4%E6%8E%A5%E4%B8%8B%E6%9D%A5%E7%9A%84%E5%BC%80%E5%8F%91%E4%B8%8E%E7%BB%B4%E6%8A%A4%E5%B0%86%E5%9C%A8%E6%AD%A4%E4%BB%93%E5%BA%93%E8%BF%9B%E8%A1%8Cdocker-%E4%BB%93%E5%BA%93-httpshubdockercomrluolongfeifreenom-%E4%B8%8D%E5%8F%97%E5%BD%B1%E5%93%8D%E6%8E%A8%E8%8D%90%E9%80%9A%E8%BF%87-docker-%E9%83%A8%E7%BD%B2%E6%88%96%E8%80%85%E5%8F%82%E8%80%83%E4%B8%8B%E6%96%B9%E6%96%87%E6%A1%A3%E7%9B%B4%E6%8E%A5%E6%90%AC%E8%BF%90%E5%88%B0%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E9%83%A8%E7%BD%B2%E6%9C%AC%E9%A1%B9%E7%9B%AE%E4%BE%9D%E7%84%B6%E9%95%BF%E6%9C%9F%E7%BB%B4%E6%8A%A4" target="_blank" rel="noopener">Github Action 突然就被 Github 单方面停封了</a>。正好鄙人原来那个域名在这两个星期后到期。这个被停封我们这里也没有收到提醒什么的，转存来的仓库突然就从仓库列表中消失了。导致没有能够收到域名即将到期的提醒，结果刚好这个时候域名到期了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/1ac4508bcaf94ca99d781fd6f7c28c34.png" alt="在这里插入图片描述" /></p><p>这是原来 Action 作者的原话：</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/a33d18ac2eaf449c93afffd4d06b8c79.png" alt="在这里插入图片描述" /></p><h1 id="新的域名no5972moe"><a class="markdownIt-Anchor" href="#新的域名no5972moe"></a> 新的域名：no5972.moe</h1><p><strong>我们现已迁移到新的域名：<a href="https://no5972.moe">https://no5972.moe</a> ，也希望大家记住这个新的网址。</strong> 这可是鄙人自掏腰包买来的域名，可不便宜！一年也得一两百！</p><p>至于为什么选了“.moe”，这个嘛。。。dddd ^_^</p><p>目前正在清理相关的旧链接，并替换为新的链接。这个过程可能可能相当麻烦，也很可能变成一个长期的工作。也感谢大家一直以来的支持和关注。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      就在域名到期的两个星期前，那个用来提醒域名到期并自动续期的 Github Action 突然就被 Github 单方面停封了。正好鄙人原来那个域名在这两个星期后到期。这个被停封我们这里也没有收到提醒什么的，转存来的仓库突然就从仓库列表中消失了。导致没有能够收到域名即将到期的提醒，结果刚好这个时候域名到期了。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>【未经测试】原神2.1 官服与B服互转的方法</title>
    <link href="https://no5972.moe/cms/archivers/103.html"/>
    <id>https://no5972.moe/cms/archivers/103.html</id>
    <published>2021-09-01T07:30:00.000Z</published>
    <updated>2021-11-23T09:31:54.805Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>根据在B站收集到的线索，现整理出针对2.1版本的原神官服和B服互转的方法。此方法未经测试，不保证有效。</p><p>2.1版本在B服需要另外一个文件才可以运行，不然会报错。<code>PCGameSDK.dll</code></p><p><s>此文件已上传阿里云盘。截至发表此文时链接为：<a href="https://www.aliyundrive.com/s/VAQ18qqFtff" target="_blank" rel="noopener">https://www.aliyundrive.com/s/VAQ18qqFtff</a></s></p><p>阿里云盘已经不能直接下载了，这里传了一份分流在蓝奏云：<a href="https://wujiuqier.lanzoui.com/iNnd9wt9tmb" target="_blank" rel="noopener">https://wujiuqier.lanzoui.com/iNnd9wt9tmb</a></p><p>两个方面需要完成。可以不分先后。</p><ol><li>官服转B服需要准备<code>PCGameSDK.dll</code>文件。获取方式见上。放到<code>Genshin Impact\Game\Yuanshen_Data\Plugins</code>目录。</li><li>修改<code>Genshin Impact\config.ini</code>和<code>Genshin Impact\Game\config.ini</code>。后者目录不固定，但是一定是有两个<code>config.ini</code>需要修改。修改3处。<ul><li>将<code>cps=xxxxxx</code>修改，官服为<code>cps=mihoyo</code>，B服为<code>cps=bilibili</code>。</li><li>将<code>channel=x</code>修改，官服为<code>channel=1</code>，B服为<code>channel=14</code>。</li><li>将<code>sub_channel=x</code>修改，官服为<code>sub_channel=1</code>，B服为<code>sub_channel=0</code>。</li></ul></li></ol><p>第2条修改保存时有可能会出现你没有权限打开该文件的情况，请参考之前<a href="63.html">《Edge、Chrome 1月12日之后继续使用Flash的方法（超级专业，高能预警）》</a>的方法获取管理员权限。右键无法修改保存的<code>config.ini</code>文件，属性，安全选项卡，高级，把所有者改成Administrators，点击应用，然后确定重新加载权限窗口，然后点添加，选择主体Administrators，然后选中完全控制。然后一直确定。</p><p>完成这两方面即可实现官服与B服互转。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      根据在B站收集到的线索，现整理出针对2.1版本的原神官服和B服互转的方法。此方法未经测试，不保证有效。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>网上十大经典黑客软件大曝光</title>
    <link href="https://no5972.moe/cms/archivers/102.html"/>
    <id>https://no5972.moe/cms/archivers/102.html</id>
    <published>2021-08-16T03:30:00.000Z</published>
    <updated>2021-08-16T03:32:37.308Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><p>互联网上的黑客网站多如牛毛，黑客软件也越来越多、越来越黑。笔者现将这些黑客软件分门别类地曝一曝光，并提出相应的解决方案，以防患于未然。</p><h1 id="一-古老的winnuke"><a class="markdownIt-Anchor" href="#一-古老的winnuke"></a> 一、古老的WinNuke</h1><p><strong>平台</strong>：Windows 95(包括OSR2版)</p><p><strong>原理</strong>：利用Windows 95系统的漏洞，通过TCP/IP协议向远程机器发送一段信息，导致一个OOB错误，使之崩溃。</p><p><strong>现象</strong>：电脑屏幕上出现一个蓝底白字的提示：“系统出现异常错误”，按ESC键后又回到原来的状态，或者死机。</p><p><strong>危害</strong>：影响正常工作。</p><p><strong>对策</strong>：用写字板或其它的编辑软件建立一个文本文件，文件名为<code>OOBFIX.REG</code>，内容如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">REGEDIT4</span><br><span class="line">[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP]</span><br><span class="line">&quot;BSDUrgent&quot;&#x3D;&quot;0&quot;</span><br></pre></td></tr></table></figure><p>启动资源管理器，双击该文件即可。</p><h1 id="二-网络精灵netspy"><a class="markdownIt-Anchor" href="#二-网络精灵netspy"></a> 二、网络精灵NetSpy</h1><p><strong>平台</strong>：Windows 95/Windows 98/Windows NT/Windows 2000</p><p><strong>原理</strong>：NetSpy是一个基于TCP/IP的简单文件传送软件，实际上你可以将它看作一个没有权限控制的增强型FTP服务器。通过它，黑客可以神不知鬼不觉地下传和上载目标机器上的任意文件，并可以执行一些特殊的操作。</p><p><strong>现象</strong>：屏幕上奇怪地出现一个标题为“信使服务”的对话框，其内容是黑客在其监控端上指定的；正常执行的程序（游戏、浏览器、NetTerm、AutoCAD、WORD等等）“在无声中”关闭；突然关机了；机器异常执行了一些程序；按Ctrl＋Alt＋Del键，在出现的任务栏中会清楚地看到<code>NetSpy</code>这个进程。</p><p><strong>危害</strong>：机器上的数据安全受到威协。系统中的系统进程和用户进程，可被随意的创建(Create)和终止(Kill)。屏幕受到黑客的监视。</p><p><strong>对策</strong>：到注册表中，删除<code>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunService</code>或<code>Run</code>中的<code>NetSpy.EXE</code>的键值。</p><h1 id="三-超级黑客bo2000"><a class="markdownIt-Anchor" href="#三-超级黑客bo2000"></a> 三、超级黑客BO2000</h1><p><strong>平台</strong>：Windows 95/Windows 98/Windows 2000</p><p><strong>原理</strong>：BO2000(BackOrifice)是功能最全的TCP/IP构架的黑客工具。它除了具有NetSpy 2.0的全部功能外，还支持修改客户端的电脑的注册表。支持多媒体操作。数据采用加密形式的UDP包，原理与NetSpy V2.0大同小异（实际上NetSpy是BO2000的一个汉化后的用Visual C++重新编译的简装版）。</p><p><strong>现象</strong>：一切都是在“无声中”进行。硬盘总是奇怪地在响。</p><p><strong>危害</strong>：机器完全在别人的控制之下，黑客成了超级用户。连你的所有操作，都可由BO2000自带的“秘密摄像机”录制成“录像带”。非MSDOS的一切窗口中的键盘的按键也会分门别类地记录下来。</p><p><strong>对策</strong>：到注册表中，删除<code>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunService</code>或<code>Run</code>中的<code>BOGUI.EXE</code>和<code>BOClient</code>键值。</p><h1 id="四-垃圾王hdfill"><a class="markdownIt-Anchor" href="#四-垃圾王hdfill"></a> 四、垃圾王HDFILL</h1><p><strong>平台</strong>：Windows 95/Windows 98/Windows NT/Windows 2000</p><p><strong>原理</strong>：电脑爱好者总喜欢执行<code>SETUP.EXE</code>或<code>INSTALL.EXE</code>看看是什么软件,HDFILL就是一个“特洛伊木马”，表面上看像个安装程序，实际上在“安装”过程中产生999999999个不定长度的文件，直到把你的硬盘“灌”满为止。</p><p><strong>现象</strong>：可爱的安装画面，等你发现时，硬盘中的垃圾太多了。</p><p><strong>危害</strong>：999999999个文件的清除工作量实在太大，不然只有动用<code>format</code>来格式化硬盘。</p><p><strong>对策</strong>：用HackerScan V0.69对来历不明的软件扫描。</p><h1 id="五-键盘幽灵keyboardghost"><a class="markdownIt-Anchor" href="#五-键盘幽灵keyboardghost"></a> 五、键盘幽灵KeyboardGhost</h1><p><strong>平台</strong>：Windows 95/Windows 98/Windows NT/Windows 2000</p><p><strong>原理</strong>：Windows系统是一个以消息循环(Message Loop)为基础的操作系统。系统的核心区保留了一定的字节作为键盘输入的缓冲区，其数据结构形式是队列。键盘幽灵正是通过直接访问这一队列，使键盘上输入的密码（显示在屏幕上的是星号）得以记录。</p><p><strong>现象</strong>：在系统根目录下生成一文件名为<code>KG.DAT</code>的隐含文件。</p><p><strong>危害</strong>：你的电子邮箱、戴笠的账号、密码会被记录下来。总之，一切涉及以星号形式显示出来的密码窗口的所有符号都会被记录下来。</p><p><strong>对策</strong>：在注册表中将<code>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunService→KG.EXE</code>这一键值删除，并将文件<code>KG.EXE</code>从<code>Windows\System</code>目录下删除。还有<code>C:\KG.DAT</code>文件也要删除。</p><h1 id="六-火眼金睛的viewpwd"><a class="markdownIt-Anchor" href="#六-火眼金睛的viewpwd"></a> 六、火眼金睛的ViewPwd</h1><p><strong>平台</strong>：Windows 3.x/Windows 95/Windows 98/Windows NT/Windows 2000</p><p><strong>原理</strong>：通过访问窗口中的私有数据获取信息，使屏幕上加密的星号密码现出“庐山真面目”。</p><p><strong>现象</strong>：无。</p><p><strong>危害</strong>：泄露个人信息，可能会蒙受经济损失。</p><p><strong>对策</strong>：及时清除Foxmail、快车之类的软件中的星号。</p><h1 id="七-天行刺客"><a class="markdownIt-Anchor" href="#七-天行刺客"></a> 七、天行刺客</h1><p><strong>平台</strong>：Windows 95/Windows 98</p><p><strong>原理</strong>：通过从路由器中窃取未加密的信息，对指定的机器进行监控。水平极高。</p><p><strong>现象</strong>：无</p><p><strong>危害</strong>：你的E-mail中的用户名和密码会被黑客窃取，你的FTP、论坛登录的用户名和密码同样也会被窃取。</p><p><strong>对策</strong>：尽量少用MSDOS下的<code>ftp</code>命令和Windows下的<code>telnet</code>命令，使用Foxmail和快车、Dlexpert、网络蚂蚁时小心你的戴笠密码被截取。尽量采用IE或Netscape这样的浏览器上站，因为它们将你的重要数据进行了加密。</p><h1 id="八-小偷proxythief"><a class="markdownIt-Anchor" href="#八-小偷proxythief"></a> 八、小偷ProxyThief</h1><p><strong>平台</strong>：Windows 95/Windows 98/Windows NT</p><p><strong>原理</strong>：通过将你的计算机设置成戴笠服务器，让你缴纳网费，用你的IP连入Internet干坏事，结果你成了“替罪羊”。前提是，黑客必须直接在你的机器上执行ProxyThief，或通过NetSpy或BO2000远程执行它。ProxyThief的安装是在后台进行的，你觉察不到。</p><p><strong>现象</strong>：偶尔机器上网速度变慢。空机不执行任何程序，硬盘也会无故狂转；用NetInspect V1.0(网络监视)对机器从0到9999端口进行扫描，会找出Free Proxy!端口，一般经验不足的黑客不会修改其缺省值8080。如果你的机器不是网关或戴笠，那你的端口已经被黑客盗用。</p><p><strong>危害</strong>：蒙受经济损失，隐藏了黑客。</p><p><strong>对策</strong>：启动注册表编辑器，查找关键字“ProxyThief”，将所有与之相关的键和键值删除。</p><h1 id="九-寄生虫exebind"><a class="markdownIt-Anchor" href="#九-寄生虫exebind"></a> 九、寄生虫ExeBind</h1><p><strong>平台</strong>：Windows 3.x/Windows 95/Windows 98/Windows NT/Windows 2000</p><p><strong>原理</strong>：该小程序将指定的黑客程序捆绑到任何一个广为传播的热门软件上，使宿主程序执行时，寄生程序（黑客程序）也在后台被执行。而且支持多重捆绑。实际上是通过多次分割文件，多次从父进程中调用子进程来实现的。</p><p><strong>现象</strong>：几乎无。</p><p><strong>危害</strong>：NetSpy、HDFILL、BO2000常通过这种形式在网络上寄生传播。</p><p><strong>对策</strong>：用HackerScan V0.69进行扫描，查出被捆程序，并删除。</p><h1 id="十-端口猎手porthunter"><a class="markdownIt-Anchor" href="#十-端口猎手porthunter"></a> 十、端口猎手PortHunter</h1><p><strong>平台</strong>：Windows 95/Windows 98</p><p><strong>原理</strong>：该软件占用大量的Socks进行端口搜索，降低局域网传输的效率，危害网络安全。利用系统管理人员的疏忽，盗用SMTP端口发E-mail(119)、盗用没有密码的戴笠端口(8080)、盗用内部使用的FTP端口(25)。</p><p><strong>现象</strong>：局域网变慢，浏览器上不了网，论坛掉线。</p><p><strong>危害</strong>：自己机器的端口被黑客盗用，甚至在一些个人主页上的“免费戴笠”栏目中出现。这会使一大帮“网虫”一起来用你的端口上Internet、发匿名E-mail、在FTP上“灌水”、使用“邮箱炸弹”、打网上传呼。到那时，你不仅上不了网，连游戏都玩不了。</p><p><strong>对策</strong>：对于Novell网为框架的局域网，我们可以限制指定程序的运行，如：ProxyHunter、Xhunter、SocksHunter、PortScanner、PortHunter。对于其它框架的局域网的用户，也可以在服务器中设定禁止一些黑客程序的运行。但这只是骗骗小孩的把戏，因为只要将<code>ProxyHunter.EXE</code>更名为<code>123abc.EXE</code>就又可以照“黑”不误了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      互联网上的黑客网站多如牛毛，黑客软件也越来越多、越来越黑。笔者现将这些黑客软件分门别类地曝一曝光，并提出相应的解决方案，以防患于未然。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>中国人比美国、日本人富吗？——中文Win98 1998元定价的背后</title>
    <link href="https://no5972.moe/cms/archivers/101.html"/>
    <id>https://no5972.moe/cms/archivers/101.html</id>
    <published>2021-07-28T00:30:00.000Z</published>
    <updated>2021-07-28T00:30:46.452Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://cache.baiducontent.com/c?m=M2KTAEBlMGv12vHgSjtNu9tv2tF-_M32X0mnkMwM-QzSng4apAZ2inLW9r-SahHTRMpliLFBsbpRGF6WuOg9jZ6fumpixR80tYudTUyqiNm5QRw4AXW48tRGlNL5OgdRyIO68T_dwbeUyZy3x-jqza&amp;p=882a970a92904ead4eaf8a3e59&amp;newp=c678d516d9c100ff57efca221553d8304a02c70e3fc3864e1290c408d23f061d4862e8bf21251b05d2ce776303a8495de9f4357723454df6cc8a871d81edd3&amp;s=d645920e395fedad&amp;user=baidu&amp;fm=sc&amp;query=win98%CA%DB%BC%DB1998%D4%AA&amp;qid=9ca9672f001b4075&amp;p1=1" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%94%B5%E8%84%91%E6%8A%A5-%E6%AD%AA%E6%AD%AA-brightgreen" alt="电脑报-歪歪" /></a></p><p>微软以1998元的售价向中国大陆销售Windows 98中文版！其实，这一点都不奇怪。世界上本没有免费的午餐，为了开拓市场，获得最大的利润，微软可谓是无所不用其极。 从定价为97元的Word97的学习版，到现在售价1998元的中文Windows98。这种别有用心的价格定位，其用心已经很明显了：那就是打垮一切已存在的和可能对他们构成威胁的国内外竞争对手，垄断软件市场。微软对自己在操作系统方面占据全世界范围内的霸主地位感到非常满意，所以价格可以由他们自己定，而其它软件如字处理软件，在中国有像WPS这样拥有广泛用户群的知名软件与之抗衡使微软无法进行垄断销售，于是就采用其它更为阴险的手段来对付WPS。去年微软赶在金山公司WPS97上市之前匆匆忙忙推出一个学习版的Word97，定价97元，意图置新生的WPS97于死地。当这一招失灵之后，又匆忙推出498元人民币的正式版本，妄图一举打跨WPS97。这是为了压制竞争对手，微软一贯采用的伎俩。</p><p>当前，中国软件市场日趋规范化，正规化，国人购买软件的正版意识加强，国家有关部门加大对盗版的打击力度，此时，微软却将中文Windows98定了个歧视性的高价，显然蓄谋已久。他们也清楚以目前中国人的消费水平，能够买得起Windows98的个人用户少得可以忽略，中国国内有能力，而且必须购买正版软件的是PC品牌商，软件开发商，政府机关部门。故在定价上放弃了个人用户，而是一心要从那些必须购买他们软件的人手中狠捞一把。大家都记得，Windows95中文版在中国发行时，定价不到1000元。这和其它语言版本的Windows95价格是差不多的。而这次，据了解，Windows98发行了34个语言版本，在美国($109)，日本(人民币600元～1200元)，台湾(人民币1200元)，香港(HK1600元)等地的销售价格都较中国大陆低。是不是中国经济发展速度已经使国人的购买力超过了这些国家和地区呢？当然不是，微软之所以制订这样的价格战略，基于以下理由：中国的IT市场发展迅速，盗版现象受到一定程度的扼制，PC品牌商，正规企业和国家部门大批量购买正版软件，这个市场不容忽视。</p><h1 id="1998元歧视性价格的背后是垄断"><a class="markdownIt-Anchor" href="#1998元歧视性价格的背后是垄断"></a> 1998元歧视性价格的背后是垄断!</h1><p>在中国，由于PC市场基本上是Wintel的天下，正版用户若要购买操作系统，除了Windows98，基本上没有别的选择，所以微软才有恃无恐地规定了一个Windows98的垄断性价格，意在趁中国软件市场初步成熟，正版？ 需求量增大之际，不失时机地把钱赚足捞够。而不久前，比尔·盖茨还声称微软愿为中国的信息化贡献力量，愿意与中国的软件企业和广大用户共同进步。</p><p>对此，我们的态度应该是：应该发展我们自己的软件和微软相抗衡。微软的秘密是垄断，我们就要打破微软的垄断。金山公司的WPS97便是一个很好的例子，它一经推出便深受国内众多用户的好评，而Word便一下跌到了498元的价位，但金山公司与微软这个巨无霸的较量远没结束。据悉与联想结合的金山公司于今年10月份就要推出的与Office抗衡的WPS98 ，据金山公司求伯君说价格会比Office97低很多。</p><p>当然，对付像微软这样世界级的软件公司，中国国内IT企业联合起来，通过合作一起来对付微软的垄断，作用会更大一些。效果更好一些。如最近金山和联想公司的合作，用友与联想的合作等。微软的手伸得再长，总有它不足的一面，中国人开发自己使用的软件，毕竟更有优势一些。 众所周知，即使是在美国，微软搞垄断也是不得人心的，何况是在中国？</p><h1 id="中国穷人要图强"><a class="markdownIt-Anchor" href="#中国穷人要图强"></a> 中国“穷人”要图强</h1><p>从某种意义上说，Windows98的歧视性价格对我们也是一个很好的警醒：振兴民族软件业已经迫在眉睫，刻不容缓。目前我们所看到唯一的正面交锋是金山和微软在字处理软件方面，但我们需要有更多的金山出来，开发出能够让国人从操作系统到应用软件全都能够使用的软件，这才是我们广大中国用户多年来梦寐以求的事情。</p><p>民族软件业这些年来经历了多少风风雨雨，承受了多少沉重压力，是局外人士难以体会到的。一方面是外国大公司向中国大举进攻，把他们已经赚够了的软件花不多的成本汉化后倾销到中国市场，搞垄断经营。而更重要的是国内用户大量使用盗版软件，使中国软件企业失去了生存的土壤。这两面夹击使中国的软件业进退维谷，面对不容乐观的形势，中国的软件企业最有力的反击武器就是不断推出更新更好的软件来回报我们这些多年来一直关心和支持中国软件业的广大用户。同时一句图强并不只是软件企业的事，更是千千万万中国PC用户的事，只有我们尽量使用正版软件，我们的民族软件业才有希望的曙光。歪歪坚信，只要我们坚持下去，没有克服不了的困难，最终的胜利者必定属于我们中国人。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      从某种意义上说，Windows98的歧视性价格对我们也是一个很好的警醒：振兴民族软件业已经迫在眉睫，刻不容缓。目前我们所看到唯一的正面交锋是金山和微软在字处理软件方面，但我们需要有更多的金山出来，开发出能够让国人从操作系统到应用软件全都能够使用的软件，这才是我们广大中国用户多年来梦寐以求的事情。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>更新“武器库”，运作假舆情！新型网络暴力有组织、有策划，形成一门黑产生意</title>
    <link href="https://no5972.moe/cms/archivers/100.html"/>
    <id>https://no5972.moe/cms/archivers/100.html</id>
    <published>2021-07-23T02:30:00.000Z</published>
    <updated>2021-07-23T02:14:02.576Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://www.xinhuanet.com/politics/2020-07/21/c_1126263679.htm" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%96%B0%E5%8D%8E%E7%BD%91-%E5%8D%8A%E6%9C%88%E8%B0%88-brightgreen" alt="新华网-半月谈" /></a></p><p>随着互联网对现实社会的介入和冲击，类黑社会型暴力顺势渗透倒灌网络，并呈现出爆发态势。作为不正当竞争的手段，升级版新型网暴日益呈现出组织化、群体化、利益化、产业化、规模化等苗头，不仅网暴时间大幅拉长，而且已很难“网络事网络毕”。</p><p>被网暴者不仅个人遭受难以估量的心理和权利损害，其亲友乃至无关路人亦会被无辜牵连。施暴及策划者的目的常常也不是简单的情绪发泄，而是有着各种利益诉求。他们以网暴制造舆情，诱导甚至绑架相关部门采取对其有利的应对措施。</p><p>当下，网暴施行者往往不能受到应有制裁，气焰日趋嚣张傲慢，不仅导致网络戾气蔓延，更给青少年群体带来严重不良示范，对旁观网民“三观”造成巨大冲击。</p><h1 id="文-图-弹幕-视频武器库日益充实"><a class="markdownIt-Anchor" href="#文-图-弹幕-视频武器库日益充实"></a> 文、图、弹幕、视频，“武器库”日益充实</h1><p>半月谈记者调查发现，依托新的媒介平台和传播方式，新型网络暴力花样翻新，已从过去狭义的语言暴力，发展为文、图、视频等全方位攻击，危害日益严重。</p><h2 id="弹幕刷屏"><a class="markdownIt-Anchor" href="#弹幕刷屏"></a> 弹幕刷屏</h2><p>“出殡”“暴毙而亡”“赶紧糊”“你全家死了”……在一些视频网站上，常常能看到大面积带有辱骂字眼的弹幕将整个视频画面填得满满当当，发布者不堪其扰，普通观众观感极差。</p><p>弹幕本是视频网站用以增加用户参与度的工具，但当弹幕缺失管理时，弹幕的“想说就说”就变成了“啥都能说”，没有底线的脏话和攻击性话语抢占“弹幕”，使其变成新的网暴阵地。</p><h2 id="视觉冲击"><a class="markdownIt-Anchor" href="#视觉冲击"></a> 视觉冲击</h2><p>施暴者在社交平台上给网暴受害者P遗照，某些画作甚至以肢解当事人躯体、给当事人抬棺为主题，内容极度暴虐血腥。不少网友表示“不敢看”“恶心”“留下很大心理阴影”。还有团体将此类图片印成卡片，通过邮寄方式实施线下恐吓。制作恐怖、血腥画作正成为新型网络暴力方式。</p><h2 id="恶意剪辑"><a class="markdownIt-Anchor" href="#恶意剪辑"></a> 恶意剪辑</h2><p>打篮球的人被篮球暴打，正常的人被比拟为“鸡”、小丑、骷髅……随着“鬼畜”视频日渐“出圈”，不少视频制作者已脱离了善意娱乐的范畴，表现出显著的人身攻击、恶意丑化、传谣抹黑趋向。</p><h2 id="恶意锤人"><a class="markdownIt-Anchor" href="#恶意锤人"></a> 恶意“锤人”</h2><p>前不久，“B站”清理“锤人视频”引发关注。所谓“锤人视频”，即视频创作者发布针对某个特定知名博主的声讨，向公众展示其“失德或违背法律”等相关行为。由于缺乏监管，锤人视频往往内容夸张，煽动性强，充斥着对他人的道德、法律指控，且真实性存疑。部分声讨者为流量制造争议，让视频内容戾气十足。被“误伤”的当事人往往很难消除负面影响，继而长期蒙受不白之冤。</p><h2 id="词条侮辱"><a class="markdownIt-Anchor" href="#词条侮辱"></a> 词条侮辱</h2><p>社交媒体评论区向来是网络暴力重灾区，但近来评论暴力亦有“升级加码”趋势。过去，“一言不合就骂人”的“喷子”式评论暴力往往只出现在相关话题或当事人的主页之下。而如今，一些故意带节奏的网暴者会大量在与当事人或事件毫不相关的热门话题下带“被黑者”出场，借此败坏“被黑者”网络风评。</p><p>此外，提前给“被黑者”预设创建谐音或带有侮辱义的“词条”或“话题”的行为亦呈蔓延趋势。如“爱紫病”“乳现癌”等类似污蔑性词汇会被集中大量转发跟进……</p><h2 id="私信轰炸"><a class="markdownIt-Anchor" href="#私信轰炸"></a> 私信轰炸</h2><p>由于在公开平台发布辱骂或中伤言论可能被取缔账号乃至招致其他网民围攻，一些网暴者会通过私信形式谩骂、骚扰他人。</p><p>据一位B站UP主介绍，他曾公开称赞某影视作品并发表个人意见，随后就收到大量带有辱骂、侮辱内容的私信。“他们通过关联账号找到我的微博账号，并通过技术手段搜寻到我上网的IP地址，警告我如果再做点评，就将‘加大力度’骚扰我。”该UP主说，网络暴力已经持续了数月，导致其正常的工作生活受到很大影响。</p><h1 id="有组织-有策划网暴形成产业链"><a class="markdownIt-Anchor" href="#有组织-有策划网暴形成产业链"></a> 有组织、有策划，网暴形成产业链</h1><p>过去的网络暴力大多事发偶然，多数集中于社会领域。但近年来，网络暴力正被越来越多地应用于商业竞争领域，呈现出了有组织、有策划、有产业链条的倾向。</p><h2 id="利益化网暴成为不公平竞争新手段"><a class="markdownIt-Anchor" href="#利益化网暴成为不公平竞争新手段"></a> 利益化，网暴成为不公平竞争新手段</h2><p>小到饭圈内斗、网红互殴，大到网站之间互黑下架，大企业恶性竞争，互联网时代的商业竞争中，“黑公关”被经常提及。这种擅长操纵舆论、绑架民意的职业化黑手，越来越多地通过网络制造假舆情，绑架真民意，达到抹黑竞争对手、抹黑名人及特定群体的目的，以替雇佣者占据竞争优势，实现商业获利。</p><p>一位品牌公关介绍，在社交媒体时代，不少网络暴力事件看似偶发，其实背后都有人为操纵。类似小红书和LOFTER下架整顿，疑似在一些特殊敏感时间节点，被对手恶性灌入大量违规信息。</p><h2 id="职业化心病做引定向引爆跟风黑"><a class="markdownIt-Anchor" href="#职业化心病做引定向引爆跟风黑"></a> 职业化，“心病”做引，定向引爆“跟风黑”</h2><p>由于网络暴力作为谋求个体利益的手段收效日益显著，越来越多人利用其便利性开始左右网络舆情，误导民意。业内专家分析，频发的“跟风黑”背后，有组织的职业团队是幕后真凶。例如，利用高考等特殊时间节点，刻意指责某些被选定的“被黑者”学历或工作履历问题，逼迫其通过信息泄露进行自证，如泄露就可组织大规模人肉，如选择保全个人信息则会被指责刻意造假。</p><p>此外，多起亚文化圈的内斗背后，也都不乏深谙传播学规律的专业人士身影。这些“职黑团队”利用小众文化圈的“心病”做引子，提前数月“测敏”埋线、左右“下套”、布局“挖坑”，舆情多重走向全在其预案掌控中。在恶意策划煽动下，圈层内的“小火星”会发酵、点燃、引爆至圈外，最初的小争议、小谣言也能轻易被激化为网暴大事件。</p><h2 id="组织化分工明确效率高"><a class="markdownIt-Anchor" href="#组织化分工明确效率高"></a> 组织化，分工明确效率高</h2><p>一些有影响力的大V通过QQ群、豆瓣小组、百度贴吧、微博社区、微信群、知乎圈子、B站动态等将粉丝聚集起来，抛出挑唆性语言乃至仇恨言论，更使网暴得以迅速发酵。粉丝群或水军的存在让大V有能力通过后台动员鼓动普通信徒做急先锋，而策划者则会提前制作各种煽动性和冲击性极强的文案进行分发。</p><p>“围绕一个或者数个目的，结成看似松散，实则分工明确、很有效率的网暴群体。这样有组织的网暴，影响力、辐射范围大大强化。”中国艺术研究院副研究员孙佳山说。</p><h2 id="连坐化污名从个人上升至群体"><a class="markdownIt-Anchor" href="#连坐化污名从个人上升至群体"></a> 连坐化，污名从个人上升至群体</h2><p>过去的网暴往往针对个体，但近期半月谈记者发现，通过“扒坟”“披皮”和刻意上纲上线等手段，新型网暴有扫射泛化制造群体对立的趋势，个体的言行会被无限度连坐上升，教师、记者、医护、警察等群体纷纷成为受害者。</p><p>与此同时，施暴者会包装美化其目的，如反对资本、寻求创作自由等，将网络暴力“崇高化”，进而把毫无社会经验的青少年绑上网络暴力的战车，凭借毫无权威性可言的截图，歪曲事实、虚构罪名、污名化特定群体，兴风作浪进而达到其目的。</p><h1 id="打击为黑而黑网暴亟待精准治理"><a class="markdownIt-Anchor" href="#打击为黑而黑网暴亟待精准治理"></a> 打击为黑而黑，网暴亟待精准治理</h1><p>拥有2万粉丝的博主惊讶地发现，去年11月他开通了微博上的创作者广告收益共享计划后，将近半年时间一共收入七八百元，其中一半来自一场网络骂战。“我的经验是骂得越狠、吵得越凶、流量越大，因为广告共享计划是按照互动量、阅读量两个维度加权计算的结果。”导演毕志飞曾经晒过自己的争议微博收益截图，几条微博获得2亿阅读量，收入3万元人民币。</p><p>有关专家认为，一些平台“流量为王”的利益机制很大程度上让网络暴力进一步肆虐。孙佳山认为，互联网的流量逻辑使得“互黑互撕”成为平台喜闻乐见的现象，以致平台漠视甚至纵容“网暴”群体的所作所为。</p><p>而有的利益方不仅乐见网暴发生，甚至亲自推波助澜，通过大数据推送、设置引战话题、限流谣言澄清等手段掩盖真相，进而挑拨不同群体不断参战、相互施暴。</p><p>客观来看，网络暴力日渐泛滥，网络平台难辞其咎。不过，平台确实背不动网暴所有的“锅”。法律专家表示，到底哪些不当互联网行为属于网络暴力，到现在也没有明确的法律法规界定。这一方面让网暴者有恃无恐，另一方面也助长了网络不良风气，形成集体无意识。</p><p>网暴屡禁不止，且新变种不断，凸显法治建设跟上互联网发展的紧迫性。今年全国两会上，全国政协委员、明宇集团董事长张建明提交了《关于加强网络暴力防控和惩治，营造健康网络生态》的提案，他认为平台方、监管部门除了要利用现代信息技术加以监控，还要尽快完善相关法律法规，对网络暴力违法行为给出具体的惩治依据和条例，并向受害群体提供清晰明确的维权路径。</p><p>此外，近年来舆情处置“按闹分配”倾向也在加剧网暴。半月谈记者调查发现，一些主管部门常常畏惧舆情出现，遇事不是调查事实，据实处置，而是谁闹得凶就按谁的诉求迅速“灭火”“减压”。</p><p>这种心理和机制上的“软肋”已被利益群体所广泛利用，动辄调动网络水军和自媒体联动，制造虚假舆情，倒逼主管部门出手压制，施暴者实际上是借相关政府部门之手得到参与治理的权力并获益，而被网暴者则成为各方利益压迫下的受害者。</p><p>有关人士建议，“按闹分配”与构建法治社会的现代治理原则南辕北辙，是一种掩耳盗铃式的低效治理模式。在互联网时代，越来越多的“闹访”和“舆情”都从线下转到线上，这要求相关部门在面对网络暴力时要敢担当、不缺位、不畏难，要及时发声，公开调查结果，精确治理，而不能“一约了之”。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      有关人士建议，“按闹分配”与构建法治社会的现代治理原则南辕北辙，是一种掩耳盗铃式的低效治理模式。在互联网时代，越来越多的“闹访”和“舆情”都从线下转到线上，这要求相关部门在面对网络暴力时要敢担当、不缺位、不畏难，要及时发声，公开调查结果，精确治理，而不能“一约了之”。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Windows 11 跳过启动显示配置偏好设置页面</title>
    <link href="https://no5972.moe/cms/archivers/99.html"/>
    <id>https://no5972.moe/cms/archivers/99.html</id>
    <published>2021-07-12T00:30:00.000Z</published>
    <updated>2021-07-12T00:36:11.641Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>如果一直使用本地账户登录的话，隔一段时间就会在启动的时候出现配置偏好设置页面，但是这个页面又必须登录微软账号才能继续使用。某些公用电脑当然是不能登录微软账号的，所以得想办法将其跳过。</p><p>在出现这样的页面的时候按Ctrl + Alt + Del，在选项菜单中选择“注销”。然后再点登录即可回到桌面。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      如果一直使用本地账户登录的话，隔一段时间就会在启动的时候出现配置偏好设置页面，但是这个页面又必须登录微软账号才能继续使用。某些公用电脑当然是不能登录微软账号的，所以得想办法将其跳过。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Edge 92 关闭自动切换到HTTPS</title>
    <link href="https://no5972.moe/cms/archivers/98.html"/>
    <id>https://no5972.moe/cms/archivers/98.html</id>
    <published>2021-07-10T03:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.519Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Edge Beta最近更新了92版本，此版本新增了自动切换到HTTPS的特性。这导致在贴吧的帖子页面点击图像查看大图的时候，显示重定向次数过多。</p><p>因此需要将自动HTTPS的功能关闭。国内仍然有不少的网站特别是ZF、事业、国企等网站仍然还在使用HTTP，因为HTTPS需要数字证书才可以使用。</p><p>打开Edge的设置，搜索HTTPS，将“使用自动 HTTPS 自动切换到更安全的连接”的开关关闭即可。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210710104447120.jpeg" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Edge Beta最近更新了92版本，此版本新增了自动切换到HTTPS的特性。这导致在贴吧的帖子页面点击图像查看大图的时候，显示重定向次数过多。因此需要将自动HTTPS的功能关闭。国内仍然有不少的网站特别是ZF、事业、国企等网站仍然还在使用HTTP，因为HTTPS需要数字证书才可以使用。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>文章仿写：拥抱Windows11</title>
    <link href="https://no5972.moe/cms/archivers/97.html"/>
    <id>https://no5972.moe/cms/archivers/97.html</id>
    <published>2021-07-07T17:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.519Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本文为<a href="https://x.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&amp;filename=DNAH199906004&amp;dbname=CJFDLASN2019" target="_blank" rel="noopener">电脑爱好者杂志文章《拥抱Windows 2000》</a>的仿写，无商业用，自娱自乐，如有冒犯，还望海涵。如有不足，还请指出。</p><hr /><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210708010049706.png" alt="" /></p><p>与Win10“蜜月”未满，微软又育出了Windows 11。它到底有何妙处？这不，“瞒着”Win10，忍不住诱惑和Win11热乎了一番。冒着被Win10当机的危险，经历了一个晚上的“做工作”，Win10和Win11和平共处了，一机并存两个重量级选手，而我也一睹了Win11的芳容！滋味真是……</p><p>我用的Win11为22000.51版。当我在启动引导Win11 ISO镜像的时候，不由得倒吸了一口冷气——画面半天静止没反应！可见其安装程序体积之大。要知道，我的KNoteX Pro跑起Win10来速度可是挺爽的（8GB内存）。第一次运行安装程序，它告诉我硬盘应有21880MB以上的剩余空间！安装Win11后占据了25GB的硬盘空间，还不包括许多的服务选项。这也难怪，硬件日新月异，软件不巨大，怎么称得上Wintel联盟呢？</p><p>在Win11 ISO引导下进行安装，安装文件被拷贝到新的分区上（存储128GB）。安装速度不容乐观，通通搞定整整花了35分钟。还好，安装过程中检测系统时没有出现错误。Win11基本的“陪嫁”要求是“8代英特尔，2GB内存，TPM2.0”，要“嫁”的是领导潮流的新硬件，才能运行爽快！落户到吾等“平民窟”，安装时不挑挑拣拣闹点小别扭也就算是不错了（在本机启动过程为45秒，不是很慢）。</p><p>第一感觉是安装界面的改变（相较于Win10）。整体风格变成了拟物化的彩色图案，边框也已经变成了圆角的边框。嗯，有意思！我按实际情况进行选择，经历了三次重新启动，没想到一帆风顺一次便安装成功。不过，设置界面的触控时出现的鬼点倒着实把我吓了一下，我还以为出现啥故障了呢！</p><p>第一次运行Win11，心里总有点不踏实。之前听说很多寨板重装系统时驱动各种出问题。还好，网卡可以直接识别。不过，也有点小意外，声卡未能识别，还有就是刚刚提到的鬼点问题。回到原来的Win10，使用Dism++将正常运行的驱动导出，再导入到新安装的Win11。这样也能解决声卡和触控的问题。</p><p>且看看多媒体效果如何？哇，电影和电视升级了，还带有回归的Movie Maker。看来微软对Win11是“认真”了。无意中打开系统托盘的“声音”图标，哈哈，Win11把“网络”和“音量”合在一起了！</p><p>Win7中的硬件配置令一般人很犯难，不知Win11有无改进？抱着不信任的态度，右击开始按钮，选择“Device Manager”。哇，“设备管理”和“系统资源”均躺在那儿听候调遣呢！在此，对有冲突的设备随意地修改资源（指占用空的资源），一样地方便。Win11同样提供了对多显示器的支持。</p><p>令人高兴的是资源管理器中的文件操作功能增强了，顶部工具栏重新设计为小图标无文字标注的样式，右键菜单也重新设计了，但是一些解压缩或是提取工具的右键菜单就看不到了，只能是“可远观而不可提取焉”！只有点选最后一项“Show more options”或者按键盘上的菜单键才能显示出原先的旧版菜单。</p><p>安装Win11后，虽然是中英文混写的界面，但是可以手动切换成全英语的界面。不用装任何中文平台，浏览中文网页，使用中文软件一切正常。Flash Player独立播放器，B站UWP版客户端等亦运行良好。</p><p>总的感觉，Win11像是个“杂烩菜”，瑕不掩玉，反正一经使用，我就被“她”迷住了。这不，Win11已占据了我的D盘，只是有点小遗憾，就是其太“肥”了。对了，忘了Win11的浏览器了，Chromium Edge可是我等网迷孜孜以求的！有何改进？——稍候，午夜了，止不住手痒，我得先用之上网享受享受再说。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      与Win10“蜜月”未满，微软又育出了Windows 11。它到底有何妙处？这不，“瞒着”Win10，忍不住诱惑和Win11热乎了一番。冒着被Win10当机的危险，经历了一个晚上的“做工作”，Win10和Win11和平共处了，一机并存两个重量级选手，而我也一睹了Win11的芳容！滋味真是……
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>平板KNoteX Pro 安装Windows 11 记录</title>
    <link href="https://no5972.moe/cms/archivers/96.html"/>
    <id>https://no5972.moe/cms/archivers/96.html</id>
    <published>2021-07-07T16:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>酷比魔方的平板，型号是KNoteX Pro，CPU是N4120。最近新出了Windows 11系统，鄙人把平时上班用的电脑维护U盘偷偷拿回来试一试安装🤣，前几天已经拷进去了22000.51版本预览版的Windows 11系统ISO镜像，更早时候也已经制成了Ventoy启动盘。</p><p>直接把U盘插在平板的USB接口，接上磁吸键盘。</p><p>寨板一般都是开机时不停的击键Del进入BIOS设置，指定启动设备的启动菜单也在BIOS设置里面。切换到Save &amp; Exit选项卡，最下边的列表就是选择启动设备的启动菜单。选择UEFI模式的U盘。熟悉的Ventoy菜单赫然显示在平板上！</p><p>直接整个双系统吧，万一翻车了还能复原，不好用了也可以直接格掉合并回去。先进优启通的PE系统，果然这个PE不能用触控，所以为什么得整一个磁吸键盘。打开DG磁盘分区，把原来只有一个分区一掰两半，也就是两个60G。选中原来的系统盘，再打开菜单栏的分区-拆分分区，输入第二个系统盘分区的大小，比如说60G，就可以直接一掰两半了。</p><p>重新启动，还是从U盘UEFI启动。这次直接选择那个Windows 11的镜像。很顺利，直接就到了选择安装分区的界面。也没啥检测之类的（之前在原来Windows 10运行过健康状况检查，这台平板直接显示的是可以运行Windows 11😁）。选择刚刚在PE分出来的新分区。接下来就等待释放系统文件。</p><p>看到提示重启了之后重启，再从U盘引导，这次还是选择优启通PE系统。打开开始-系统安装-UEFI引导修复。同时打开DG磁盘分区，看一下硬盘哪个分区是放EFI的，然后在UEFI引导修复选择这个放EFI的分区，点选开始修复。这步千万不能出错。</p><p>再次重启，他默认还是引导原来的Windows 10分区，但是这次就多出来了一个菜单。因为还没正式发布，所以菜单上显示了两个“Windows 10”。选择所在卷编号较大的那个，那个就是Windows 11了。这个如果看着碍眼的话可以后续用EasyBCD来修改菜单显示名称。又一次重启，然后就显示启动服务、安装设备等字样。然后自动重启，还是出现两个“Windows 10”的菜单，还是选择后一个。然后就看到黑底的“海内存知己，天涯若比邻”的字样了！剩下的步骤就和虚拟机安装Windows 11的过程一样了！</p><p>剩下的自动配置过程都很顺利。到选择国别的界面的时候，看一下触控好不好使，触控确实能用，但是在按下移动的时候会出现鬼点的问题。果然寨板的驱动适配是不完整的。连接网络界面也能直接看到Wifi热点的名称，说明网卡直接适配成功！</p><p>但是进入桌面后注意到音量图标打了个叉。也无法调整音量。长按开始按钮，选择设备管理器，展开“系统设备”，果然看到一个音频控制器显示黄色惊叹号。所以主要是两个处的驱动没有适配好，一个是触控，另一个是声卡。</p><p>此前已了解到，Windows 10的驱动在Windows 11基本都可以直接用。回到原来的Windows 10系统，打开Dism++。把原来的驱动都导出出来（内置驱动可以不用导出）。记住导出驱动的目录。在Dism++中切换到安装的Windows 11，打开会话，再把导出的驱动导入到这里面来。重启到Windows 11，鬼点和无声的问题都自行解决了！</p><p>稍微試了两个应用。一个是Flash独立播放器运行小花仙页游，和Windows 10体验基本没差。另一个是B站的UWP客户端播放1080P视频，视频很流畅，但是弹幕滚屏有些跳帧！性能果然不太够。。。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      酷比魔方的平板，型号是KNoteX Pro，CPU是N4120。最近新出了Windows 11系统，鄙人把平时上班用的电脑维护U盘偷偷拿回来试一试安装🤣，前几天已经拷进去了22000.51版本预览版的Windows 11系统ISO镜像，更早时候也已经制成了Ventoy启动盘。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>C语言的发展和特点</title>
    <link href="https://no5972.moe/cms/archivers/95.html"/>
    <id>https://no5972.moe/cms/archivers/95.html</id>
    <published>2021-07-07T08:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>祝贺本站文章总数达到 100 篇，感谢各位访客的支持！</p><p>来源：<a href="https://x.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&amp;filename=DNAH199924010&amp;dbname=CJFDLASN2019" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%94%B5%E8%84%91%E7%88%B1%E5%A5%BD%E8%80%85%E3%80%8A%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E4%BD%A0%E9%80%89%E5%93%AA%E4%B8%80%E4%B8%AA%E3%80%8B-%E6%AF%9B%E6%AF%9B%E7%86%8A%EF%BC%88MMX%EF%BC%89-brightgreen" alt="电脑爱好者《编程语言你选哪一个》-毛毛熊（MMX）" /></a></p><p>C 语言的发展颇为有趣。它的原型是 ALGOL60 语言。1963 年，剑桥大学将 ALGOL60 语言发展成为 CPL （Combined Programming Language）语言。1967 年，剑桥大学的 Matin Richards 对 CPL 语言进行了简化，于是产生了 BCPL 语言。1970 年，美国贝尔实验室的 <a href="https://baike.baidu.com/item/%E8%82%AF%C2%B7%E6%B1%A4%E6%99%AE%E6%A3%AE/50235682" target="_blank" rel="noopener">Ken Thompson</a> 将 BCPL 进行了修改，并为它起了一个有趣的名字“ B 语言 ”。意思是将 CPL 语言煮干，提炼出它的精华（Boiling CPL down to its basic good features）。并且他用 B 语言写了第一个 UNIX 操作系统。而在 1973 年，B 语言也给人“煮”了一下。美国贝尔实验室的 <a href="https://baike.baidu.com/item/%E4%B8%B9%E5%B0%BC%E6%96%AF%C2%B7%E9%87%8C%E5%A5%87/7267171" target="_blank" rel="noopener">D.M.Ritchie</a> 在 B 语言的基础上最终设计出一种新的语言，他取了 BCPL 的第二个字母作为这种语言的名字，这就是大名鼎鼎的 C 语言。</p><p>最初的 C 语言只是一种在 UNIX 操作系统上的工作语言。1978 年以后，C 语言被移植到了各种机型上。由于它作为系统描述语言，既可以用来写系统软件，又可以用来写应用软件，所以一下子受到了大家的喜爱。许多程序员纷纷从别的编程语言转向 C 语言编程。从而使 C 语言在当时的软件开发中几乎一统天下。</p><p>C 语言有许多优点，它灵活性好、效率高、适用性强，而且对硬件的控制能力很强。人们常把 C 语言称作中级语言，意指它是一门介于高级语言和汇编语言之间的语言。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最初的 C 语言只是一种在 UNIX 操作系统上的工作语言。1978 年以后，C 语言被移植到了各种机型上。由于它作为系统描述语言，既可以用来写系统软件，又可以用来写应用软件，所以一下子受到了大家的喜爱。许多程序员纷纷从别的编程语言转向 C 语言编程。从而使 C 语言在当时的软件开发中几乎一统天下。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>Windows 11 ISO引导安装提示此电脑不符合安装此版本Windows的最低要求的解决方法</title>
    <link href="https://no5972.moe/cms/archivers/94.html"/>
    <id>https://no5972.moe/cms/archivers/94.html</id>
    <published>2021-07-06T07:30:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>微软近期推出了Windows 11操作系统。但是很多同志在切换到Dev渠道的时候遇到了“你的电脑不满足Windows 11的最低硬件要求”的提示。于是尝试直接从ISO启动引导安装，结果又遇到“此电脑不符合安装此版本Windows的最低要求”。这种情况主要还是因为安全启动和TPM没有打开。但是TPM也不是说开就能开的。</p><p><img src="https://www.windowslatest.com/wp-content/uploads/2021/06/Bypass-Windows-11-TPM-2.0.jpg" alt="" /></p><p>好在 Windows Latest 的 Mayank Parmar 提供了一个ISO引导安装无视这两项检测的方法。</p><p>遇到此画面的时候，按快捷键Shift + F10打开命令提示符。输入<code>regedit</code>打开注册表编辑器。定位到<code>HKEY_LOCAL_MACHINE\SYSTEM\Setup</code>。在这个键下面创建一个键<code>LabConfig</code>，选中这个<code>LabConfig</code>，再创建两个“DWORD (32位)”键值<code>BypassTPMCheck</code>和<code>BypassSecureBootCheck</code>，值都是<code>1</code></p><p><img src="https://dingyue.ws.126.net/2021/0702/a682570cj00qvkufq009hc000jg00elc.jpg" alt="" /></p><p>关掉注册表编辑器和命令提示符。如果还是这个提示的话，点击安装窗口左上角的左箭头按钮。回到条款界面，选择“自定义：仅安装 Windows (高级)”。如果看到选择安装分区的界面就可以按照原来的方式来安装Windows 11了。</p><div class="note info"><p>如果需要保留原来的个人文件的话，在选择分区界面不要把原来系统盘格式化，而是直接选择原系统盘来覆盖安装。这样原系统盘<code>Users</code>目录下的个人文件在覆盖安装后将被集中到系统盘根目录的<code>Windows.old</code>目录。但是无法保留其他的文件。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      微软近期推出了Windows 11操作系统。但是很多同志在切换到Dev渠道的时候遇到了“你的电脑不满足Windows 11的最低硬件要求”的提示。于是尝试直接从ISO启动引导安装，结果又遇到“此电脑不符合安装此版本Windows的最低要求”。这种情况主要还是因为安全启动和TPM没有打开。但是TPM也不是说开就能开的。好在 Windows Latest 的 Mayank Parmar 提供了一个ISO引导安装无视这两项检测的方法。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>仅做笔记用：C语言 Linux控制PC蜂鸣器，相对简单一点的代码</title>
    <link href="https://no5972.moe/cms/archivers/93.html"/>
    <id>https://no5972.moe/cms/archivers/93.html</id>
    <published>2021-06-09T18:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>原型代码来自<a href="https://stackoverflow.com/questions/4447166/how-to-use-pc-speaker-in-linux" target="_blank" rel="noopener">https://stackoverflow.com/questions/4447166/how-to-use-pc-speaker-in-linux</a> ，以及<a href="https://luv.asn.au/overheads/linux_sound/pcspkr.html" target="_blank" rel="noopener">https://luv.asn.au/overheads/linux_sound/pcspkr.html</a></p><p>答主liorda提供的代码，依次发出“C D E F G A B &gt;C”的音调，可以直接运行。</p><p>TinyCore下面建议使用TCC来编译。不能直接用GCC编译，有些头文件缺失，需要手动修复。物理机器需要主板SPEAKER插槽接了PC喇叭才能听到响。VMware虚拟机是直接通过物理机声卡模拟PC喇叭的声音，不需要考虑主板是否安装了PC喇叭。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sys/ioctl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;linux/kd.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> freq[] = &#123; <span class="comment">/* C   D    E    F    G    A    B    C */</span></span><br><span class="line">                    <span class="number">523</span>, <span class="number">587</span>, <span class="number">659</span>, <span class="number">698</span>, <span class="number">784</span>, <span class="number">880</span>, <span class="number">988</span>, <span class="number">1046</span> &#125;;</span><br><span class="line">    <span class="keyword">int</span> i;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (i=<span class="number">0</span>; i&lt;<span class="number">8</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">            ioctl(STDOUT_FILENO, KIOCSOUND, <span class="number">1193180</span>/freq[i]);</span><br><span class="line">            usleep(<span class="number">500000</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    ioctl(STDOUT_FILENO, KIOCSOUND, <span class="number">0</span>); <span class="comment">/*Stop silly sound*/</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>转换成使用Python生成曲谱的代码则为：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* *************************</span></span><br><span class="line"><span class="comment"> * Use TCC to compile instead</span></span><br><span class="line"><span class="comment"> * of GCC.</span></span><br><span class="line"><span class="comment"> * Copy the Python outputs </span></span><br><span class="line"><span class="comment"> * and save as "TMP.H" at</span></span><br><span class="line"><span class="comment"> * the same directory of </span></span><br><span class="line"><span class="comment"> * this CPP file.</span></span><br><span class="line"><span class="comment"> * *************************/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sys/ioctl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;linux/kd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"tmp.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i=<span class="number">0</span>; i&lt;=NOTESCONUT; i++) &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d "</span>, k[i][<span class="number">0</span>]);</span><br><span class="line">ioctl(STDOUT_FILENO, KIOCSOUND, k[i][<span class="number">0</span>] == <span class="number">0</span> ? <span class="number">0</span> : <span class="number">1193180</span>/k[i][<span class="number">0</span>]);</span><br><span class="line">usleep(k[i][<span class="number">1</span>] * <span class="number">1000</span>);</span><br><span class="line">ioctl(STDOUT_FILENO, KIOCSOUND, <span class="number">0</span>);</span><br><span class="line">usleep(<span class="number">10000</span>);</span><br><span class="line">&#125;</span><br><span class="line">ioctl(STDOUT_FILENO, KIOCSOUND, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>那个<code>tmp.h</code>还是通过<a href="https://github.com/No5972/mml2beep_for_Turbo_C_or_CPP_or_Linux/blob/linux/mml2beep.py" target="_blank" rel="noopener">鄙人修改后的“炒鸡嗨客协管徐”大佬的Python代码</a>来导入MML曲谱生成。</p><p>例如某大佬编配的《千本樱》的MML转换后的<code>tmp.h</code>为：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> NOTESCONUT 1310</span></span><br><span class="line"><span class="keyword">int</span> k[NOTESCONUT][<span class="number">2</span>] = &#123;</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">429</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2794</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2794</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">2093</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">429</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">1178</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">429</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2794</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2794</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2093</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1175</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">321</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">429</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">1178</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1865</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1397</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">932</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">262</span>, <span class="number">107</span>&#125;, &#123;<span class="number">330</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">554</span>, <span class="number">429</span>&#125;, &#123;<span class="number">277</span>, <span class="number">107</span>&#125;, &#123;<span class="number">349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">415</span>, <span class="number">107</span>&#125;, &#123;<span class="number">554</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">330</span>, <span class="number">107</span>&#125;, &#123;<span class="number">349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">294</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">294</span>, <span class="number">214</span>&#125;, &#123;<span class="number">330</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">349</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">294</span>, <span class="number">214</span>&#125;, &#123;<span class="number">262</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">349</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">466</span>, <span class="number">107</span>&#125;, &#123;<span class="number">349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">466</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">392</span>, <span class="number">107</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">831</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">831</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">392</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">440</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">429</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">392</span>, <span class="number">214</span>&#125;, &#123;<span class="number">440</span>, <span class="number">429</span>&#125;, &#123;<span class="number">440</span>, <span class="number">214</span>&#125;, &#123;<span class="number">523</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">1178</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">321</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">784</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">698</span>, <span class="number">214</span>&#125;, &#123;<span class="number">932</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">698</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">536</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">880</span>, <span class="number">321</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">536</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1047</span>, <span class="number">429</span>&#125;, &#123;<span class="number">988</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">429</span>&#125;, &#123;<span class="number">784</span>, <span class="number">429</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">429</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">740</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">988</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">740</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">587</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">214</span>&#125;, &#123;<span class="number">587</span>, <span class="number">107</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">214</span>&#125;, &#123;<span class="number">659</span>, <span class="number">107</span>&#125;, &#123;<span class="number">784</span>, <span class="number">107</span>&#125;, &#123;<span class="number">880</span>, <span class="number">214</span>&#125;, &#123;<span class="number">880</span>, <span class="number">107</span>&#125;, &#123;<span class="number">988</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">988</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">429</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">3136</span>, <span class="number">214</span>&#125;, &#123;<span class="number">2960</span>, <span class="number">107</span>&#125;, &#123;<span class="number">3136</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2960</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1480</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2637</span>, <span class="number">107</span>&#125;, &#123;<span class="number">2349</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1976</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1568</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1760</span>, <span class="number">214</span>&#125;</span><br><span class="line">,</span><br><span class="line">&#123;<span class="number">1976</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">750</span>&#125;, &#123;<span class="number">0</span>, <span class="number">107</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">321</span>&#125;, &#123;<span class="number">1175</span>, <span class="number">214</span>&#125;, &#123;<span class="number">1319</span>, <span class="number">750</span>&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      仅做笔记用：C语言 Linux控制PC蜂鸣器，相对简单一点的代码
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>0.999...=1 分别用小学，初中，高中，大学证法证明</title>
    <link href="https://no5972.moe/cms/archivers/92.html"/>
    <id>https://no5972.moe/cms/archivers/92.html</id>
    <published>2021-05-28T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="小学"><a class="markdownIt-Anchor" href="#小学"></a> 小学</h1><p>因为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mn>3</mn></mfrac><mo>=</mo><mn>0.333</mn><mo>⋯</mo></mrow><annotation encoding="application/x-tex">\frac{1}{3} = 0.333 \cdots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">3</span><span class="mord">3</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span></span></span></span>，依据等式的基本性质， <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mn>3</mn></mfrac><mo>×</mo><mn>3</mn><mo>=</mo><mn>0.333</mn><mo>⋯</mo><mo>×</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">\frac{1}{3} \times 3 = 0.333 \cdots \times 3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">3</span><span class="mord">3</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span> ， <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mn>3</mn></mfrac><mo>×</mo><mn>3</mn><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\frac{1}{3} \times 3=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，0.333… × 3 = 0.999…，所以0.999… = 1。</p><h1 id="初中"><a class="markdownIt-Anchor" href="#初中"></a> 初中</h1><p>令 <em>x</em> = 0.999…，则 10<em>x</em> = 9.999…，后者减去前者，得到 10<em>x</em> - <em>x</em> = 9，即 9<em>x</em> = 9，所以 <em>x</em> = 1。</p><h1 id="高中"><a class="markdownIt-Anchor" href="#高中"></a> 高中</h1><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mn>0.999</mn><mo>⋯</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mn>0.9</mn><mo>+</mo><mn>0.09</mn><mo>+</mo><mo>⋯</mo><mo>+</mo><munder><mo><munder><mrow><mn>0.00</mn><mo>⋯</mo><mn>0</mn></mrow><mo stretchy="true">⏟</mo></munder></mo><mi mathvariant="normal">∞</mi></munder><mn>9</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><munder><mo><munder><mrow><mn>9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mn>9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mn>2</mn></mrow></msup><mo>+</mo><mo>⋯</mo><mo>+</mo><mn>9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mi>n</mi></mrow></msup></mrow><mo stretchy="true">⏟</mo></munder></mo><mi mathvariant="normal">∞</mi></munder></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi mathvariant="normal">∞</mi></munderover><mn>9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mi>i</mi></mrow></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><munder><mo><mi>lim</mi><mo>⁡</mo></mo><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mfrac><mrow><mn>9</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mi>n</mi></mrow></msup><mo stretchy="false">)</mo></mrow><mrow><mn>1</mn><mo>−</mo><mn>1</mn><msup><mn>0</mn><mrow><mo>−</mo><mn>1</mn></mrow></msup></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mn>1.</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}0.999\cdots &amp;= 0.9 + 0.09 + \cdots + \underset{\infty }{\underbrace{0.00 \cdots 0}}9 \\ &amp;= \underset{\infty }{\underbrace{9 \times 10^{-1} + 9 \times 10^{-2} + \cdots + 9 \times 10^{-n}}} \\ &amp;= \sum_{i=1}^{\infty } 9 \times 10^{-i} \\ &amp;= \lim \limits_{n \to \infty}\frac{9 \times 10 ^ {-1}(1 - 10^{-n})}{1 - 10^{-1}}\\  &amp;= 1.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:12.372942000000002em;vertical-align:-5.936471000000002em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:6.436471000000001em;"><span style="top:-9.247868000000002em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord">0</span><span class="mord">.</span><span class="mord">9</span><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span></span></span><span style="top:-6.73576em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"></span></span><span style="top:-3.353032999999999em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"></span></span><span style="top:-0.2842559999999994em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"></span></span><span style="top:1.6250740000000015em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5.936471000000002em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:6.436471000000001em;"><span style="top:-9.247868000000002em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6444400000000002em;"><span style="top:-1.7520000000000002em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∞</span></span></span></span><span style="top:-3.0000000000000004em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop"><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.64444em;"><span class="svg-align" style="top:-2.352em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z'/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.648em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3479999999999999em;"><span></span></span></span></span></span></span><span class="mord">9</span></span></span><span style="top:-6.73576em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641080000000001em;"><span style="top:-1.66867em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∞</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop"><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.864108em;"><span class="svg-align" style="top:-2.26867em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z'/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.864108em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.864108em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.821331em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.73133em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.43133em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.353032999999999em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.874664em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathdefault mtight">i</span></span></span></span></span></span></span></span></span></span></span><span style="top:-0.2842559999999994em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.1em;margin-left:0em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.491108em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.771331em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:1.6250740000000015em;"><span class="pstrut" style="height:3.6513970000000002em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">1</span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5.936471000000002em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><h1 id="大学"><a class="markdownIt-Anchor" href="#大学"></a> 大学</h1><p>因为对于所有的正整数 <em>n</em> ，有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>999</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>&lt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{999 \cdots 9}} - 1 \right | &lt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，故 ∀ <em>ε</em> &gt; 0，不妨设 <em>ε</em> &lt; 1，要使 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><msup><mn>0</mn><mi>n</mi></msup></mrow></mfrac><mo>&lt;</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{99 \cdots 9}} - 1 \right | = \frac{1}{10^{n}} &lt; \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight"><span class="mord mtight">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5935428571428571em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span> ，只要 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>&gt;</mo><mfrac><mrow><mo>−</mo><mi>ln</mi><mo>⁡</mo><mi>ε</mi></mrow><mrow><mi>ln</mi><mo>⁡</mo><mn>10</mn></mrow></mfrac></mrow><annotation encoding="application/x-tex">n &gt; \frac{-\ln \varepsilon }{\ln 10}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801079999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mtight">1</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mathdefault mtight">ε</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，取<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>N</mi><mo>=</mo><mrow><mo fence="true">[</mo><mfrac><mrow><mo>−</mo><mi>ln</mi><mo>⁡</mo><mi>ε</mi></mrow><mrow><mi>ln</mi><mo>⁡</mo><mn>10</mn></mrow></mfrac><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">N = \left [ \frac{-\ln \varepsilon }{\ln 10} \right ]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2301179999999998em;vertical-align:-0.35001em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">[</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801079999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mtight">1</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mathdefault mtight">ε</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">]</span></span></span></span></span></span> ，则当 <em>n</em> &gt; <em>N</em> 时，恒有 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>&lt;</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{99 \cdots 9}} - 1 \right | &lt; \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，故 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo><mi>lim</mi><mo>⁡</mo></mo><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>=</mo><mn>1.</mn></mrow><annotation encoding="application/x-tex">\lim \limits_{n \to \infty} 0.\overset{n个}{\overbrace{ 99 \cdots 9 } } = 1.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.593832em;vertical-align:-0.7em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.1em;margin-left:0em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">.</span></span></span></span></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      0.999...=1 分别用小学，初中，高中，大学证法证明
    
    </summary>
    
    
      <category term="Mathematics" scheme="https://no5972.moe/cms/categories/Mathematics/"/>
    
    
  </entry>
  
  <entry>
    <title>不用计算器计算下列常数的近似值：三次根号8.1，ln0.99，arctan1.02 《高等数学》复旦版黄立宏第四版</title>
    <link href="https://no5972.moe/cms/archivers/91.html"/>
    <id>https://no5972.moe/cms/archivers/91.html</id>
    <published>2021-05-25T09:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>不用计算器计算下列常数的近似值：<br />(1) <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mroot><mn>8.1</mn><mn>3</mn></mroot></mrow><annotation encoding="application/x-tex">\sqrt[3]{8.1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.13278em;"></span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7868839999999999em;"><span style="top:-2.964664em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.90722em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">8</span><span class="mord">.</span><span class="mord">1</span></span></span><span style="top:-2.86722em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.13278em;"><span></span></span></span></span></span></span></span></span> ,<br />(2) ln 0.99,<br />(3) arctan 1.02.</p><p>解：(1) 利用近似公式 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mroot><mrow><mn>1</mn><mo>+</mo><mi>x</mi></mrow><mn>3</mn></mroot><mo>≈</mo><mn>1</mn><mo>+</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><mi>x</mi></mrow><annotation encoding="application/x-tex">\sqrt[3]{1+x} \approx 1 + \frac{1}{3} x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.17444499999999996em;"></span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.736886em;"><span style="top:-2.914666em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8655550000000001em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span></span></span><span style="top:-2.825555em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.17444499999999996em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathdefault">x</span></span></span></span>，有<br /><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mroot><mn>8.1</mn><mn>3</mn></mroot><mo>=</mo><mroot><mrow><mn>8</mn><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mn>1</mn><mn>80</mn></mfrac><mo stretchy="false">)</mo></mrow><mn>3</mn></mroot><mo>=</mo><mn>2</mn><mroot><mrow><mn>1</mn><mo>+</mo><mfrac><mn>1</mn><mn>80</mn></mfrac></mrow><mn>3</mn></mroot><mo>≈</mo><mn>2</mn><mo>⋅</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>80</mn></mfrac><mo stretchy="false">)</mo><mo>=</mo><mn>2.0083.</mn></mrow><annotation encoding="application/x-tex">\sqrt[3]{8.1} = \sqrt[3]{8(1+\frac{1}{80})} = 2 \sqrt[3]{1+\frac{1}{80}} \approx 2 \cdot (1+\frac{1}{3} \times \frac{1}{80}) = 2.0083.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.13278em;"></span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7868839999999999em;"><span style="top:-2.964664em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.90722em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord">8</span><span class="mord">.</span><span class="mord">1</span></span></span><span style="top:-2.86722em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.13278em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.84em;vertical-align:-0.604946em;"></span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7002848em;"><span style="top:-2.8780648em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.235054em;"><span class="svg-align" style="top:-3.8em;"><span class="pstrut" style="height:3.8em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">8</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span></span></span><span style="top:-3.195054em;"><span class="pstrut" style="height:3.8em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.8800000000000001em;"><svg width='400em' height='1.8800000000000001em' viewBox='0 0 400000 1944' preserveAspectRatio='xMinYMin slice'><path d='M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10zM1001 80H400000v40H1013z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.604946em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.84em;vertical-align:-0.604946em;"></span><span class="mord">2</span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7002848em;"><span style="top:-2.8780648em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.235054em;"><span class="svg-align" style="top:-3.8em;"><span class="pstrut" style="height:3.8em;"></span><span class="mord" style="padding-left:1em;"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.195054em;"><span class="pstrut" style="height:3.8em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.8800000000000001em;"><svg width='400em' height='1.8800000000000001em' viewBox='0 0 400000 1944' preserveAspectRatio='xMinYMin slice'><path d='M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10zM1001 80H400000v40H1013z'/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.604946em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">8</span><span class="mord">3</span><span class="mord">.</span></span></span></span></p><p>(2) 利用近似公式 ln(1+<em>x</em>) ≈ <em>x</em>，有<br />ln 0.99 = ln(1-0.01) ≈ -0.0100.</p><p>(3) 取<em>f</em>(<em>x</em>) = arctan <em>x</em>，令<em>x</em><sub>0</sub> = 1，Δ<em>x</em> = 0.02，<br />而<em>f</em>ˊ(<em>x</em>) = <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mi>x</mi><mn>2</mn></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{1+x^2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2484389999999999em;vertical-align:-0.403331em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463142857142857em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.403331em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，则</p><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>arctan</mi><mo>⁡</mo><mn>1.02</mn></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≈</mo><mi>arctan</mi><mo>⁡</mo><mn>1</mn><mo>+</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>+</mo><msup><mn>1</mn><mn>2</mn></msup></mrow></mfrac><mo>×</mo><mn>0.02</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mn>0.7954.</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\arctan 1.02 &amp;\approx \arctan 1 + \frac{1}{1+1^2} \times 0.02\\  &amp;= 0.7954.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.89077em;vertical-align:-1.695385em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.195385em;"><span style="top:-4.195385em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mop">arctan</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord">0</span><span class="mord">2</span></span></span><span style="top:-2.286055em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.695385em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.195385em;"><span style="top:-4.195385em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mop">arctan</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord">1</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">2</span></span></span><span style="top:-2.286055em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">7</span><span class="mord">9</span><span class="mord">5</span><span class="mord">4</span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.695385em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      不用计算器计算下列常数的近似值：三次根号8.1，ln0.99，arctan1.02 《高等数学》复旦版黄立宏第四版
    
    </summary>
    
    
      <category term="Mathematics" scheme="https://no5972.moe/cms/categories/Mathematics/"/>
    
    
  </entry>
  
  <entry>
    <title>尽可能简单的搭建Hexo博客并部署到Vercel</title>
    <link href="https://no5972.moe/cms/archivers/90.html"/>
    <id>https://no5972.moe/cms/archivers/90.html</id>
    <published>2021-05-13T09:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.507Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>HEXO是一款非常优秀、易用、美观的开源博客框架。提供非常丰富的，可以随意修改的主题供你使用。这里研究一下如何尽可能简化搭建Hexo博客的步骤。</p></blockquote><p>我们这里还是使用Repl.it和Vercel来搭建Hexo博客。这次不需要弄GitHub，毕竟近期GitHub国内访问困难。</p><p>大致的步骤是这样的：</p><ol><li><a href="#11-%E6%B3%A8%E5%86%8Creplit">注册Repl.it</a></li><li><a href="#12-%E6%B3%A8%E5%86%8Cvercel">注册Vercel</a></li><li><a href="#21-%E5%9C%A8replit%E5%88%9B%E5%BB%BArepl">创建Bash语言的Repl</a></li><li><a href="#22-%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%88%9D%E5%A7%8B%E5%8C%96hexo">初始化Hexo</a></li><li><a href="#31-%E5%AE%89%E8%A3%85vercel">安装Vercel</a></li><li><a href="#32-%E7%99%BB%E9%99%86vercel">登陆Vercel</a></li><li><a href="#33-%E9%83%A8%E7%BD%B2%E5%88%B0vercel">部署到Vercel</a></li></ol><h1 id="1-注册账号"><a class="markdownIt-Anchor" href="#1-注册账号"></a> 1. 注册账号</h1><h2 id="11-注册replit"><a class="markdownIt-Anchor" href="#11-注册replit"></a> 1.1 <a href="http://xn--Repl-9x8f526l.it" target="_blank" rel="noopener">注册Repl.it</a></h2><p>现在的网站变成<a href="https://replit.com" target="_blank" rel="noopener">replit.com</a>了。进去之后点击右上角的Sign Up，Username取一个用户名，Email输入注册邮箱（QQ邮箱也可以），Password输入创建密码。下面那个复选框是如果是教师就勾选，但是似乎作用不大，除非是组织学生使用replit来学习。点击Sign Up之后到填写的邮箱查收验证邮件，并点击里面的验证按钮确认验证。点击之后如果还显示需要验证邮箱就刷新一下。这样注册就完成了。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513152605365.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513152752180.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513152953190.png" alt="" /></p><h2 id="12-注册vercel"><a class="markdownIt-Anchor" href="#12-注册vercel"></a> 1.2 注册Vercel</h2><p>打开<a href="https://vercel.com/" target="_blank" rel="noopener">vercel.com</a>，还是点击右上角的Sign Up，然后点击右侧下方的Continue With Email。输入邮箱（也可以使用QQ邮箱），再点击Continue With Email。然后会提示验证邮箱。这时候前往注册邮箱查收验证右键，点击验证按钮，注册就完成了。</p><div class="group-picture"><div class="group-picture-row"><div class="group-picture-column" style="width: 100%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210511121841353.jpeg" alt="" /></div></div><div class="group-picture-row"><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513153337342.png" alt="" /></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513153509427.png" alt="" /></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513153737338.png" alt="" /></div></div></div><h1 id="2-初始化hexo"><a class="markdownIt-Anchor" href="#2-初始化hexo"></a> 2. 初始化Hexo</h1><h2 id="21-在replit创建repl"><a class="markdownIt-Anchor" href="#21-在replit创建repl"></a> 2.1 在Replit创建Repl</h2><p>到Repl的页面，点击左上方的“ + New Repl”，创建一个Bash语言的Repl。如果候选列表看不到Bash也可以输入bash，然后就看到了。给Repl起一个名字。然后点击Create repl，然后就自动跳转到写代码的页面了。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513154116948.png" alt="" /></p><h2 id="22-一句话初始化hexo"><a class="markdownIt-Anchor" href="#22-一句话初始化hexo"></a> 2.2 一句话初始化Hexo</h2><p><a href="https://vercel.com/guides/deploying-hexo-with-vercel" target="_blank" rel="noopener">Vercel官网给了一条命令</a>，这一条命令就可以把Hexo初始化了。这里的Repl本身就是一台位于美国的Linux云服务器，所以不需要考虑网速不够的问题，也就不需要配置什么镜像源。</p><p>在Replit页面把右边敲命令的黑框点一下，然后直接输入Linux命令。Replit自带了Node.js，也不用安装了，可以直接输入Node.js 的命令。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx hexo init my-hexo-blog &amp;&amp; <span class="built_in">cd</span> my-hexo-blog</span><br></pre></td></tr></table></figure><p>这样就完成了Hexo的初始化。当然，这样的话<code>hexo</code>命令是不会加载到<code>PATH</code>环境变量的。这样执行之后<code>hexo</code>命令位于<code>/my-hexo-blog/node_modules/.bin</code>中，要把这个<code>hexo</code>加到环境变量里面。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:~/<span class="variable">$REPL_SLUG</span>/my-hexo-blog/node_modules/.bin</span><br></pre></td></tr></table></figure><p>然后<code>cd</code>到<code>my-hexo-blog</code>，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s</span><br></pre></td></tr></table></figure><p>就可以看到右上角出现网页了。也可以点击第二个按钮新开一个标签查看。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513155633407.png" alt="" /></p><h1 id="3-部署到vercel"><a class="markdownIt-Anchor" href="#3-部署到vercel"></a> 3. 部署到Vercel</h1><h2 id="31-安装vercel"><a class="markdownIt-Anchor" href="#31-安装vercel"></a> 3.1 安装Vercel</h2><p>我们使用<code>npm</code>安装Vercel控制台客户端。<code>cd</code>到<code>my-hexo-blog</code>，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install vercel</span><br></pre></td></tr></table></figure><p>由于这里把Vercel客户端直接安装在博客目录，所以之前配置的环境变量可以直接使用。但是以后重新打开Repl IDE页面的时候需要在右边的shell中重新执行一下设置环境变量，具体操作参考后面的<a href="#33-%E9%83%A8%E7%BD%B2%E5%88%B0vercel">部署到Vercel</a>。</p><h2 id="32-登陆vercel"><a class="markdownIt-Anchor" href="#32-登陆vercel"></a> 3.2 登陆Vercel</h2><p>首次运行Vercel提示你登录。输入你注册Vercel账号的邮箱地址，然后Vercel会给这个邮箱发一封邮件，控制台程序也会等待验证完成，打开这个邮件点击验证（VERIFY）按钮，点击之后就显示验证完成，控制台程序也会提示登录成功。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513160536475.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513160536489.png" alt="" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210513160536481.png" alt="" /></p><h2 id="33-部署到vercel"><a class="markdownIt-Anchor" href="#33-部署到vercel"></a> 3.3 部署到Vercel</h2><p>登陆上去之后就可以部署了。我们需要把Hexo生成静态站点，然后到生成的站点目录去执行部署到Vercel。</p><p><code>cd</code>到<code>my-hexo-blog</code>，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br></pre></td></tr></table></figure><p>然后<code>cd</code>到<code>public</code>目录，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel --prod --confirm</span><br></pre></td></tr></table></figure><p>，然后显示</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">✅ Production : https://xxxxxx.vercel.app [copied to clipboard] [10s]</span><br></pre></td></tr></table></figure><p>的时候就部署到Vercel上了，其中<code>xxxxxx</code>是项目名称。这个域名就是部署好的域名，从这个网址进去就可以访问博客了。</p><p>以后需要更新博客的话，就可以直接打开Replit，打开这个Repl，在<code>source/_posts</code>目录添加<code>.md</code>格式的博文，然后执行下列操作：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> my-hexo-blog</span><br><span class="line">npm install vercel</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:~/<span class="variable">$REPL_SLUG</span>/my-hexo-blog/node_modules/.bin</span><br><span class="line">vercel</span><br><span class="line"><span class="comment"># 到邮箱查收邮件，验证你的邮箱</span></span><br><span class="line">hexo cl &amp;&amp; hexo g &amp;&amp; <span class="built_in">cd</span> public &amp;&amp; vercel --prod --confirm &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><div class="note info"><p>后续还可以安装新的主题，在博客站点的<code>themes</code>文件夹<code>git clone</code>想要的主题，然后修改博客的<code>_config.yml</code>文件的<code>theme</code>属性到对应的主题目录，就可以切换新的主题了。也可以在拉取下来的主题修改任意文件设计自己需要的自定义样式。关于主题配置这方面，其他博客写的很详细，这里就不再赘述了。</p></div><div class="note info"><p>后续还可以从Vercel网页端的Settings里面绑定自己注册的独立域名，然后在自己的域名解析里面设置解析到<code>76.76.21.21</code>，这样就可以通过独立域名来访问了。</p><blockquote><p>在Vercel网页端登陆账号，进入这个项目，选择Settings，Domains，添加之前注册的独立域名。添加以后这时候Vercel的界面会提示你需要添加域名的解析。到这个域名解析的后台，添加一个类型为<code>A</code>，主机记录为<code>@</code>的解析记录，如果之前有这个记录则直接修改。记录值按照Vercel的界面提示填写<code>76.76.21.21</code>。其他选项保持默认即可。</p></blockquote><blockquote><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218100218514.png" alt="" /></p></blockquote><blockquote><p>稍等片刻，再访问这个域名，即可以更快的速度显示页面了。</p></blockquote></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      EXO是一款非常优秀、易用、美观的开源博客框架。提供非常丰富的，可以随意修改的主题供你使用。这里研究一下如何尽可能简化搭建Hexo博客的步骤。我们这里还是使用Repl.it和Vercel来搭建Hexo博客。这次不需要弄GitHub，毕竟近期GitHub国内访问困难。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>将Hexo博客直接部署到Vercel，不经过Github</title>
    <link href="https://no5972.moe/cms/archivers/89.html"/>
    <id>https://no5972.moe/cms/archivers/89.html</id>
    <published>2021-05-11T07:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.507Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>近期，Github国内访问困难，想更新下博客都不行。而网上的博客清一色的写着需要将Vercel接入Github仓库来部署。这里研究一下能不能直接把Hexo博客部署到Vercel而不需要经过Github。</p><p>首先当然是需要准备一个Vercel账号的。没有的需要注册，<s>注册过程网上博客写的很齐全，这里不再赘述。</s> 居然还有博客写的必须使用Github，这里纠正一下，邮箱就可以注册了，Github访问困难的情况下没有必要弄Github第三方登录！在注册页面右侧点击最下面那个不太显眼的Continue with Email就可以了！有博客说QQ邮箱不能用，这里也实测了，其实也是可以用的。就是那种类似于<code>123456789@qq.com</code>的邮箱就行！</p><p><strong>编辑：后来发现邮箱注册是Vercel前两个月（2月28日——4月21日之间）才新增的注册方式，之前还是只允许使用Github、Gitlab、Bitbucket第三方登陆的。</strong></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210511121841353.jpeg" alt="在这里插入图片描述" /></p><p>既然已经有Hexo博客了，那么肯定是有Node.js了。如果没有Hexo博客的话需要搭建一个，具体过程其他博客写的都有，这里就不再重复了，要能在博客根目录执行<code>hexo s</code>并能通过HTTP访问博客页面为准。</p><p>我们使用<code>npm</code>安装Vercel控制台客户端。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g vercel</span><br></pre></td></tr></table></figure><p>Hexo自带了一个生成静态站点的功能，我们只需把Hexo博客生成静态站点然后就可以直接部署到Vercel。Vercel是可以自动识别根目录和子目录的<code>index.html</code>文件的。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br></pre></td></tr></table></figure><p>然后<code>cd</code>到博客的<code>public</code>目录。执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel</span><br></pre></td></tr></table></figure><p>第一次会提示你登录。输入你注册Vercel账号的邮箱地址，然后Vercel会给这个邮箱发一封邮件，控制台程序也会等待验证完成，打开这个邮件点击验证（VERIFY）按钮，点击之后就显示验证完成，控制台程序也会提示登录成功。</p><p>这时候再执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel --prod</span><br></pre></td></tr></table></figure><p>然后出现这些提示，按照提示操作！</p><div class="note info"><p>如果需要自动化集成（也就是不用回答下列问题）的话，前面的命令也可以使用<code>vercel --prod --confirm</code>，但是这样的话项目名称会自动使用缺省值，如果需要指定项目名称的话就需要在博客的<code>source</code>目录添加<code>vercel.json</code>文件，配置<code>name</code>属性：<code>{ name&quot;: &quot;my-hexo-blog&quot; }</code></p></div><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">? Set up and deploy “/home/runner/no5972tk/my-hexo-blog”? [Y/n] </span><br><span class="line"><span class="comment"># 选择发布到的位置 -&gt; 直接回车</span></span><br><span class="line"><span class="comment"># 默认就是账户名，显示在提示下面</span></span><br><span class="line"><span class="comment"># 可以在官网登录后访问这个地址查看：https://vercel.com/dashboard</span></span><br><span class="line">Which scope <span class="keyword">do</span> you want to deploy to?</span><br><span class="line">·[username]</span><br><span class="line"><span class="comment"># 是否链接到一个存在的项目 -&gt; n</span></span><br><span class="line">? Link to existing project? [y/N]</span><br><span class="line"><span class="comment"># 为项目命名，这里输入的项目名会反映在域名上</span></span><br><span class="line">? What’s your project’s name? (my-hexo-blog)</span><br><span class="line"><span class="comment"># 选择代码的位置，当前代码位置就是根目录 -&gt; 直接回车</span></span><br><span class="line">? In <span class="built_in">which</span> directory is your code located? ./</span><br></pre></td></tr></table></figure><p>最后显示</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">✅ Production : https://xxxxxx.vercel.app [copied to clipboard] [10s]</span><br></pre></td></tr></table></figure><p>的时候就部署到Vercel上了，其中<code>xxxxxx</code>是项目名称。这个域名就是部署好的域名，从这个网址进去就可以访问博客了。</p><p>以后需要更新博客的话执行下列操作：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo cl &amp;&amp; hexo g &amp;&amp; <span class="built_in">cd</span> public &amp;&amp; vercel --prod --confirm &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><div class="note info"><p>后续还可以从Vercel网页端的Settings里面绑定自己注册的独立域名，然后在自己的域名解析里面设置解析到<code>76.76.21.21</code>，这样就可以通过独立域名来访问了。</p><blockquote><p>进入这个项目，选择Settings，Domains，添加之前注册的独立域名。添加以后这时候Vercel的界面会提示你需要添加域名的解析。到这个域名解析的后台，添加一个类型为<code>A</code>，主机记录为<code>@</code>的解析记录，如果之前有这个记录则直接修改。记录值按照Vercel的界面提示填写<code>76.76.21.21</code>。其他选项保持默认即可。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218100218514.png" alt="" /></p><p>稍等片刻，再访问这个域名，即可以更快的速度显示页面了。</p></blockquote></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      近期，Github国内访问困难，想更新下博客都不行。而网上的博客清一色的写着需要将Vercel接入Github仓库来部署。这里研究一下能不能直接把Hexo博客部署到Vercel而不需要经过Github。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>黑白棋中的AI</title>
    <link href="https://no5972.moe/cms/archivers/88.html"/>
    <id>https://no5972.moe/cms/archivers/88.html</id>
    <published>2021-05-11T03:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.515Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.dreamwings.cn/reversi/3013.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%8D%83%E5%8D%83-%E9%BB%91%E7%99%BD%E6%A3%8B%E4%B8%AD%E7%9A%84AI-brightgreen" alt="千千-黑白棋中的AI" /></a></p><p>到了考试周了佯，可是偏偏这个时候迎来了很多很多的课程设计，幸好教授把C语言的课程设计提前发出了，不然都在最后几周，加上数据结构的课程设计就没有时间做这个啦~</p><p>刚开始打算做成UWP应用的，可是网上的教程都是C#，并且用C++做的话某些功能和C#不一样，所以就这样拖了好多周，省赛前一点儿也没有开始做，等到省赛结束之后，别人都差不多完成啦！而我才开始准备查找资料……</p><p>然而一周过去了，进度还是<strong>0%</strong>。噫，<strong>1%</strong> 吧！</p><p>眼看就要开始验收了，算了，还是用最简单的 <strong>EasyX</strong> 做吧！以后的 C# 课程设计再考虑 UWP。</p><p>周一开始敲代码，整整一周的课余时间，都在努力做这个，现在想起来，那个时候真的好累唉，居然没有感觉到~😔</p><p>最初做这个游戏是因为想起来 <strong>秦时明月</strong> 中的 <strong>墨攻棋阵</strong> ，也就是黑白棋，努力还原动漫中的场景，周末的时候终于完成了。</p><p>先附图：</p><div class="group-picture"><div class="group-picture-row"><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e68ddd6129e8cf8925f3cc4f6c0203ba.png" alt="" /></div><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/a449b3c02b8c8373811cd85312aa289e.png" alt="" /></div></div><div class="group-picture-row"><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/8ced59a2995f4d4edc191720a05b2bb3.png" alt="" /></div><div class="group-picture-column" style="width: 50%;"><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/dccebe68103a2c973ac8e7c92407b8dc.png" alt="" /></div></div></div><p>怎么说千千也都是新手呢！感觉做的还算满意吧！</p><p>人机对战中有三种模式哦！</p><p><strong>简单、中等、困难</strong></p><p>那么，接下来，我们一起来看看黑白棋中的AI是如何实现的。</p><p>对于我们来说，下棋的时候总是想着如何才能对自己最有利，当前最优？还是全局最优？</p><p>如果我们往后几步考虑的话，那便是全局最优啦！那当我们只看眼下哪一个位置的落子对自己最有利，这样便是当前最优，也是局部最优。</p><p>在黑白棋中，我们同样可以采用这样的思想。</p><h1 id="首先来看看简单ai"><a class="markdownIt-Anchor" href="#首先来看看简单ai"></a> 首先来看看简单AI</h1><p><strong>因为简单呗，所以它返回的仅仅只是当前的最优解，再怎么说也不能让它随机返回坐标对吧！</strong></p><p>那局部最优解又是以什么为评测标准的呢？</p><p>嗯，我们采用的是<strong>能够转换对方棋子最多</strong>的位置，这个可不是行动力哦！</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">POINT2 <span class="title">Easy</span><span class="params">()</span><span class="comment">//人机对战简单AI</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    POINT2 MAX;<span class="comment">//定义以及初始化最优解</span></span><br><span class="line">    MAX.INIT(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="keyword">int</span> maxx = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; SIZE; ++i)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; SIZE; ++j)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (expect[i][j] &gt;= maxx)<span class="comment">//寻找可以转化棋子最多的点作为最优解</span></span><br><span class="line">            &#123;</span><br><span class="line">                maxx = expect[i][j];</span><br><span class="line">                MAX.INIT(i, j);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">if</span> (ESCEXIT)gameStart();</span><br><span class="line">    Sleep(<span class="number">800</span>);<span class="comment">//间歇</span></span><br><span class="line">    <span class="keyword">return</span> MAX;<span class="comment">//返回最优解</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>呐，<code>expect</code>中便是每个点可以转换对方棋子的个数，这个 AI 简单吧！😄</p><h1 id="其他难度-ai"><a class="markdownIt-Anchor" href="#其他难度-ai"></a> 其他难度 AI</h1><p>既然是简单以上的难度，就不能再像那样简单啦！不然一个中等AI被简单AI击败多没意思，O(∩_∩)O哈哈~</p><p>首先，我们应该知道一个估值表的问题，在黑白棋中，不同位置都有不同位置的估值，虽然这样的估值表的用处并不是很大，但却在某些细节中表现出至关重要的作用。</p><p>黑白棋的棋盘默认是8*8的，总共64格。</p><p>从游戏规则我们可以看出来，角上的子很重要，因为这里不会被对方转换，角边上的点很危险，它给了对方直接进角的机会。</p><p>边上中间的四个点比较重要，只能从一个方向被翻转……等等。</p><p>根据这样的经验，我们大致可以得到以下的<strong>估值表</strong>：</p><table style="height: 519px;" border="0" width="584" cellspacing="0" cellpadding="0"><tbody><tr><td><p align="center"><span lang="EN-US" xml:lang="EN-US"> <wbr></span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">A</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">B</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">C</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">D</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">E</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">F</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">G</span></p></td><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">H</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">90</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">90</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">2</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-80</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-80</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">3</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">4</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">6</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">1</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">7</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-80</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">5</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-80</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td></tr><tr><td><p align="center"><span lang="EN-US" style="color: #3366ff;" xml:lang="EN-US">8</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">90</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">10</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">-60</span></p></td><td><p align="center"><span lang="EN-US" xml:lang="EN-US">90</span></p></td></tr></tbody></table><p>有了这张表，AI 进行估值的时候就很简单了，不过<strong>仅凭这一点可不行哦</strong>！</p><p>黑白棋的AI中，我们要考虑的除了估值表，还有稳定子。</p><p><strong>稳定子</strong>，即不能被转换的棋子，稳定子的数量在游戏中是变化的，比如，一方占据整整一条边，那么这一条边上的所有棋子都是稳定子。</p><p><strong>行动力</strong>，某方当前可走位置的个数，因为在黑白棋的游戏规则中，每一步的走棋都要形成转换，否则不能走棋，既然这样的话，我们在AI中便要尽可能让自己的行动力最大，而对方行动力最小，也就是尽可能让双方行动力差最大，这样的话，很容易AI便可以把玩家逼上绝路，玩笑而已……</p><p>除了这两个还有<strong>余裕手</strong>和<strong>潜在行动力</strong>，虽然并不懂~</p><p>对电脑AI设定中，我们的原则是能走角就走角，不到万不得已的情况下不要走邻角点。</p><p>对其他情况下采用<strong>极大极小博弈树搜索</strong>：</p><p>这里假设AI的对手都是最聪明的，会选择最优解，即会选择对AI最不利的选择。</p><p>搜出来的结果集是AI方的结果，那么要选择<strong>最终得分最高的那个位置</strong></p><p>搜出来的结果集是玩家方的结果，那么要选择<strong>最终得分最低的那个位置</strong>。</p><p>如下图</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/8d59fd3fff3c11be84c2087c5efcf2c6.png" alt="" /></p><p>假设圆形代表的是AI节点，方形代表玩家节点。</p><p>对于A2和A3这两种选择，AI显然是选择A2得10分。对于A4和A4这两种选择，AI显然是选择A4得20分。</p><p>但是对于B1，B2来说，玩家如果下B2，使得AI可以得20分，下B1，使得AI只能得10分，那么玩家显然是下B1。</p><p>所以最终A1这一步，AI只能得10分。这就是极大极小算法。</p><p>然后就是α-β剪枝：</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/36fbdcd9379659b8fdd9a4801028b3af.png" alt="" /></p><p>现在A2，A3已经选出最大值10，B1的得分是10分。</p><p>而对于B1，B2来说是要选最小值，既然B1的得分是10分，则B1，B2之间的最终结果是&lt;=10的。</p><p>而A4的得分是20分，对于A4，A5来说是选择最大值得，即A4，A5之间的最终结果是&gt;=20的，说明B2的最终结果是&gt;=20的。</p><p>那么这种情况下肯定是选B1了，对于还没有搜索的A5节点来说，已经影响不到最终的选择结果了，所以就可以不用考虑了。</p><h1 id="然后得分的计算"><a class="markdownIt-Anchor" href="#然后得分的计算"></a> 然后得分的计算</h1><p>这里每一步的得分，都是相对于AI来说的得分。</p><p>AI自己落子某一个位置，得一个正分，之后对手落子某一个位置，所得的分数对于AI来说就是一个负分（即玩家取得的优势，对于AI来说就是劣势）。</p><p>对于已经搜到最大深度的节点来说，它的得分就是这个位置的本身得分（因为后面已经不搜了）。</p><p>而对于中途节点来说，它的得分应该是这个位置的本身得分，加上下一步对方的选择结果的得分。这里不能只以最后一步的结果逆推的。</p><p>举个例子：</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e79d22dbd0503187e045c0a0b9f72897.png" alt="" /></p><p>如上图的左右两种情况。</p><p>假设圆形代表的是<em>AI</em>节点，方形代表<em>玩家</em>节点。</p><p>其中分值表示的是节点自身落子该位置所获得的在估值表中的得分，玩家节点取负分。</p><p>如果只是用最深层的节点的得分，来计算最上层的节点的得分，那么按照上面极大极小算法，<strong>AI最后的得分：左边是10分，右边是5分。</strong> 那么AI选择左边的10分这种情况。</p><p>但是却造成了中间过程中，玩家可以得到50分的这样一个相对来说是比较好的分值。</p><p>而AI应该不让玩家取得这样一个比较好的优势。</p><p>所以要综合前后对方的落子位置以及得分来考虑最终得分：</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/4f9eaa4ae65c0613bd01228885c2862f.png" alt="" /></p><p><strong>AI最后的得分：左边是-30分，右边是-15分。</strong> 最终选择为右边，而不是左边。</p><p>极大极小搜索就是这样了，难度的抉择取决于搜索的深度，不过要保证的是不要超时哦！</p><p>接下来附上我的 墨攻棋阵 中的AI算法，估计只有一点点的沾边吧！</p><p>还有很多需要优化的地方惹😭</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">difai</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y,<span class="keyword">int</span> mapnow[SIZE][SIZE],<span class="keyword">int</span> expectnow[SIZE][SIZE],<span class="keyword">int</span> depin,<span class="keyword">int</span> depinmax)</span><span class="comment">//极大极小搜索</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (depin &gt;= depinmax)<span class="keyword">return</span> <span class="number">0</span>;<span class="comment">//递归出口</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> maxx = <span class="number">-10005</span>;<span class="comment">//最大权值</span></span><br><span class="line">    POINT2 NOW;</span><br><span class="line">    <span class="keyword">int</span> expectnow2[SIZE][SIZE] , mapnow2[SIZE][SIZE],mapnext[SIZE][SIZE],expectlast[SIZE][SIZE];<span class="comment">//定义临时数组</span></span><br><span class="line"></span><br><span class="line">    copymap(mapnow2, mapnow);<span class="comment">//复制当前棋盘</span></span><br><span class="line"></span><br><span class="line">    mapnow2[x][y] = NOWCOLOR ? <span class="number">1</span> : <span class="number">-1</span>;<span class="comment">//模拟在当前棋盘上下棋</span></span><br><span class="line">    <span class="keyword">int</span> ME = MAPPOINTCOUNT[x][y] + expectnow[x][y];<span class="comment">//当前棋子权</span></span><br><span class="line">    NOW.INIT(x,y);</span><br><span class="line"></span><br><span class="line">    Change(NOW, mapnow2, <span class="literal">false</span>);<span class="comment">//改变棋盘AI结束</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> MAXEXPECT = <span class="number">0</span>, LINEEXPECT = <span class="number">0</span>, COUNT = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; SIZE; ++i)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; SIZE; ++j)</span><br><span class="line">        &#123;</span><br><span class="line">            expectnow2[i][j] = Judge(i, j, !NOWCOLOR, mapnow2);<span class="comment">//预判对方是否可以走棋</span></span><br><span class="line">            <span class="keyword">if</span> (expectnow2[i][j])</span><br><span class="line">            &#123;</span><br><span class="line">                ++MAXEXPECT;</span><br><span class="line">                <span class="keyword">if</span> ((i == <span class="number">0</span> &amp;&amp; j == <span class="number">0</span>) || (i == <span class="number">0</span> &amp;&amp; j == SIZE - <span class="number">1</span>) || (i == SIZE - <span class="number">1</span> &amp;&amp; j == SIZE - <span class="number">1</span>) || (i == SIZE - <span class="number">1</span> &amp;&amp; j == <span class="number">0</span>))<span class="keyword">return</span> <span class="number">-1800</span>;<span class="comment">//如果对方有占角的可能</span></span><br><span class="line">                <span class="keyword">if</span> ((i &lt; <span class="number">2</span> &amp;&amp; j &lt; <span class="number">2</span>) || (i &lt; <span class="number">2</span> &amp;&amp; SIZE - j - <span class="number">1</span> &lt; <span class="number">2</span>) || (SIZE - <span class="number">1</span> - i &lt; <span class="number">2</span> &amp;&amp; j &lt; <span class="number">2</span>) || (SIZE - <span class="number">1</span> - i &lt; <span class="number">2</span> &amp;&amp; SIZE - <span class="number">1</span> - j &lt; <span class="number">2</span>))++LINEEXPECT;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">if</span> (LINEEXPECT * <span class="number">10</span> &gt; MAXEXPECT * <span class="number">7</span>)<span class="keyword">return</span> <span class="number">1400</span>;<span class="comment">//如果对方走到坏点状态较多 剪枝</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; SIZE; i++)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; SIZE; j++)</span><br><span class="line">            <span class="keyword">if</span> (expectnow2[i][j])<span class="comment">//如果对方可以走棋</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">int</span> YOU = MAPPOINTCOUNT[i][j] + expectnow2[i][j];<span class="comment">//当前权值</span></span><br><span class="line">                copymap(mapnext, mapnow2);<span class="comment">//拷贝地图</span></span><br><span class="line">                mapnext[i][j] = (!NOWCOLOR) ? <span class="number">1</span> : <span class="number">-1</span>;<span class="comment">//模拟对方走棋</span></span><br><span class="line">                NOW.INIT(i, j);</span><br><span class="line">                Change(NOW, mapnext, <span class="literal">false</span>);<span class="comment">//改变棋盘</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k &lt; SIZE; k++)</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">int</span> l = <span class="number">0</span>; l &lt; SIZE; l++)</span><br><span class="line">                        expectlast[k][l] = Judge(k, l, NOWCOLOR, mapnext);<span class="comment">//寻找AI可行点</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k &lt; SIZE; k++)</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">int</span> l = <span class="number">0</span>; l &lt; SIZE;l++)</span><br><span class="line">                        <span class="keyword">if</span> (expectlast[k][l])</span><br><span class="line">                        &#123;</span><br><span class="line">                            <span class="keyword">int</span> nowm = ME - YOU + difai(k, l, mapnext, expectlast, depin + <span class="number">1</span>, depinmax);</span><br><span class="line">                            maxx = maxx &lt; nowm ? nowm : maxx;</span><br><span class="line">                        &#125;</span><br><span class="line">            &#125;</span><br><span class="line">    <span class="keyword">return</span> maxx;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>有关黑白棋AI极大极小搜索的算法也就这些了，希望本文能对你有一点帮助。</p><p>另外，墨攻棋阵的项目源码在我的 <a href="https://github.com/im0qianqian/" target="_blank" rel="noopener">GitHub</a> 里面，欢迎大家 Fork ，发现 Bug 后不要忘记给我留言哦！😝</p><p><strong>墨攻棋阵源码：<a href="https://github.com/im0qianqian/Reversi" target="_blank" rel="noopener">https://github.com/im0qianqian/Reversi</a></strong></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最初做这个游戏是因为想起来 秦时明月 中的 墨攻棋阵 ，也就是黑白棋，努力还原动漫中的场景，周末的时候终于完成了。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>将Hexo环境迁移到Repl</title>
    <link href="https://no5972.moe/cms/archivers/87.html"/>
    <id>https://no5972.moe/cms/archivers/87.html</id>
    <published>2021-04-26T06:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>拟准备跳槽开溜，故将原来电脑的Hexo环境移除，改为放到Repl云IDE上。Repl上面还是需要折腾一番才能把Hexo调通的，毕竟这个博客需要连接3个Github的仓库才能运作。</p><p>我们还是使用Bash语言的Repl来搭建，Bash简直是万金油，凡是调用较多Linux命令的基本上都得用Bash的Repl。</p><p>主要需要解决这些问题：</p><ul><li>Repl每次会自动清空<code>.ssh</code>的密钥信息</li><li>Repl自带了NPM却没有提供Hexo</li></ul><p>先通过<code>git clone</code>把源码仓库<code>cms_source</code>拉过来，再把主题仓库<code>hexo_next_source</code>拉过来，把后者仓库全部文件移到<code>cms_source</code>仓库的<code>/themes/next/</code>目录下面去。</p><div class="note warning"><p>拉Github代码有可能会报Permission Denied，遇到此问题需要先配置用户名和邮箱。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">"No5972"</span></span><br><span class="line">git config --global user.email <span class="string">"wujiuqier@foxmail.com"</span></span><br></pre></td></tr></table></figure></div><p>进到源码仓库<code>cms_source</code>里面，安装Hexo。执行：<code>npm install hexo-cli</code>。</p><p>需要手动设置一下环境变量<code>PATH</code>添加Hexo可执行文件的路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:/home/runner/Repl名字/cms_source/node_modules/hexo/bin:/home/runner/bin</span><br></pre></td></tr></table></figure><p>这样就解决了Hexo环境搭建。</p><hr /><p>然后SSH登录的问题，Repl刚刚上线了新的功能，这明显也是参照了Github Action的密匙功能，可以在Repl配置密匙。点击左侧的锁头图标，添加公钥、私钥、已知主机的文件内容。</p><p>然后就可以编写<code>main.sh</code>来手动添加SSH密钥信息的文件了。注意私钥<code>id_rsa</code>要设置<code>700</code>权限，不然会因为权限过于开放而被忽略，进而导致SSH登录失败。</p><p>下面那个<code>netrc</code>以及下载Perl程序是配置HTTPS方式登录的，但是Github通知了说8月13号之后会停止使用控制台输入密码的方式登录，所以也用不上了，我们这里还是使用SSH方式登录。</p><p>这里需要配置<code>GITHUB_USERNAME</code>, <code>GITHUB_PASSWORD</code>, <code>GITHUB_PRIVATE</code>, <code>GITHUB_PUBLIC</code>, <code>KNOWN_HOSTS</code>一共4个环境变量。如果Gitee的登录用户名和密码不一样，也需要单独配置，脚本对应的地方也要做相应修改。</p><div class="note warning"><p>注意最后那个<code>PATH</code>环境变量并不会生效，运行完成之后还需要手动执行一次。</p></div><div class="note danger"><p>2021.07.06更新：Repl在用户根目录自己新增了一个<code>.ssh</code>的链接过去到<code>~/Repl名/.config/ssh</code>的目录，这导致原脚本无法创建<code>.ssh</code>目录，进而导致无法操作Github和Gitee。因此需要将原有的<code>.ssh</code>链接删除。故脚本需要修改。本文章的脚本已经订正。</p></div><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># PLEASE RUN THIS SCRIPT BEFORE EDITING THE BLOG!!!!!</span></span><br><span class="line"><span class="comment"># PLEASE ADD GITHUB_USERNAME, GITHUB_PASSWORD, GITHUB_PRIVATE, GITHUB_PUBLIC, KNOWN_HOSTS ENVIRONMENT VARIABLES BEFORE RUNNING THIS SCRIPT!!!!!</span></span><br><span class="line"><span class="built_in">echo</span> \&gt;\&gt;\&gt;GitHub Repo Login Initialize\&lt;\&lt;\&lt;</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> ~</span><br><span class="line">rm .netrc</span><br><span class="line">cat&gt;&gt;.netrc&lt;&lt;-EOF</span><br><span class="line">machine github.com</span><br><span class="line">login <span class="variable">$GITHUB_USERNAME</span></span><br><span class="line">password <span class="variable">$GITHUB_PASSWORD</span></span><br><span class="line">machine gitee.com</span><br><span class="line">login <span class="variable">$GITHUB_USERNAME</span></span><br><span class="line">password <span class="variable">$GITHUB_PASSWORD</span></span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">rm -rf <span class="string">".ssh"</span></span><br><span class="line">mkdir <span class="string">".ssh"</span></span><br><span class="line"><span class="built_in">cd</span> <span class="string">".ssh"</span></span><br><span class="line">cat&gt;&gt;id_rsa&lt;&lt;-EOF</span><br><span class="line"><span class="variable">$GITHUB_PRIVATE</span></span><br><span class="line">EOF</span><br><span class="line">cat&gt;&gt;id_rsa.pub&lt;&lt;-EOF</span><br><span class="line"><span class="variable">$GITHUB_PUBLIC</span></span><br><span class="line">EOF</span><br><span class="line">cat&gt;&gt;known_hosts&lt;&lt;-EOF</span><br><span class="line"><span class="variable">$KNOWN_HOSTS</span></span><br><span class="line">EOF</span><br><span class="line">chmod 700 id_rsa</span><br><span class="line"><span class="built_in">cd</span> ~</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$PATH</span></span><br><span class="line">mkdir ~/bin</span><br><span class="line"><span class="built_in">cd</span> ~/bin</span><br><span class="line">wget https://github.com/git/git/raw/e67fbf927dfdf13d0b21dc6ea15dc3c7ef448ea0/contrib/credential/netrc/git-credential-netrc.perl</span><br><span class="line">git config --global credential.helper <span class="string">"netrc -d -v"</span></span><br><span class="line">git config --global user.name <span class="string">"No5972"</span></span><br><span class="line">git config --global user.email <span class="string">"wujiuqier@foxmail.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># PLEASE MANUALLY RUN THIS COMMAND AFTER RUNNING THIS SCRIPT!!!!!</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:/home/runner/no5972tk/cms_source/node_modules/hexo/bin:/home/runner/bin</span><br></pre></td></tr></table></figure><p>配置好这个脚本之后，以后要编辑博客的时候，先运行一次（点击上面的Run），然后运行这个最后一行命令，然后编辑博客，注意最后在Repl运行要输入<code>sh ./deployEx.cmd</code>，也就是前面加一个<code>sh</code>，因为Linux并不能识别<code>.cmd</code>后缀的脚本格式文件。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      拟准备跳槽开溜，故将原来电脑的Hexo环境移除，改为放到Repl云IDE上。Repl上面还是需要折腾一番才能把Hexo调通的，毕竟这个博客需要连接3个Github的仓库才能运作。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>Java POI WPS另存为的XLSX Excel报错Package should contain a content type part [M1.13]</title>
    <link href="https://no5972.moe/cms/archivers/86.html"/>
    <id>https://no5972.moe/cms/archivers/86.html</id>
    <published>2021-04-09T03:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.503Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>最近在写项目的时候，使用到了POI对表格的处理，在通过文件流创建工作簿的时候，出现异常，异常信息是：<code>Package should contain a content type part [M1.13]</code>。在这里，记录下这个信息，也供大家参考。</p><hr /><h1 id="问题描述"><a class="markdownIt-Anchor" href="#问题描述"></a> 问题描述：</h1><p>先看我的测试代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">String templatePath = <span class="keyword">this</span>.getClass().getResource(<span class="string">"/"</span>).getPath()+<span class="string">"/static"</span>;</span><br><span class="line">FileInputStream excelFileInputStream = <span class="keyword">new</span> FileInputStream(templatePath + <span class="string">"/测试模板.xlsx"</span>);</span><br><span class="line">Workbook workbook = WorkbookFactory.create(excelFileInputStream);</span><br><span class="line">excelFileInputStream.close();</span><br><span class="line">Sheet sheet = workbook.getSheetAt(<span class="number">0</span>);</span><br><span class="line">Row xssfRow = sheet.getRow(<span class="number">5</span>); Cell xssfCell = xssfRow.getCell(<span class="number">0</span>); xssfCell.setCellValue(<span class="string">"交货状态："</span> + map.get(<span class="string">"status"</span>).toString());</span><br><span class="line">xssfRow = sheet.getRow(<span class="number">5</span>); xssfCell = xssfRow.getCell(<span class="number">15</span>); xssfCell.setCellValue(map.get(<span class="string">"machineNo"</span>).toString());</span><br><span class="line"><span class="comment">// 省去其他填充字段</span></span><br><span class="line">FileOutputStream excelFileOutPutStream = <span class="keyword">new</span> FileOutputStream(<span class="string">"C:/测试模板-"</span> + key + <span class="string">".xlsx"</span>);</span><br><span class="line">workbook.write(excelFileOutPutStream);</span><br><span class="line">excelFileOutPutStream.flush();</span><br><span class="line">excelFileOutPutStream.close();</span><br></pre></td></tr></table></figure><p>这段代码运行，抛POI异常：<code>Package should contain a content type part [M1.13]</code>这个异常的原因可能有多种，查找资料发现，大多数回答都是该异常是由于 Excel 2003和2007之间的区别导致的，或者就是说文件是直接改后缀名得到（改后缀名也是会导致异常）。 Excel 2003和2007之间的区别：</p><blockquote><p>HSSF － 提供读写Microsoft Excel格式档案的功能。<br />XSSF － 提供读写Microsoft Excel OOXML格式档案的功能。</p></blockquote><hr /><h1 id="原因分析"><a class="markdownIt-Anchor" href="#原因分析"></a> 原因分析：</h1><p>Excel 的版本，我使用的是WPS 2019 个人版的，也就是后缀为<code>.xlsx</code>，按理说没什么问题的。<br />而且模板文件也是新建的，不存在是通过改后缀名得到的（后缀名由<code>.xls</code>改为<code>.xlsx</code>也是不能识别的）。<br /><strong>此XLSX文件是通过《WPS 2019 个人版》将一个XLS文件另存为XLSX的。可能使用WPS导出的时候有些关键的XLSX文件头没有加入进去导致POI无法识别这是一个2007的XLSX文件。</strong></p><hr /><h1 id="解决方案"><a class="markdownIt-Anchor" href="#解决方案"></a> 解决方案：</h1><p>使用必应搜索<code>online convert</code>，打开<a href="https://www.online-convert.com" target="_blank" rel="noopener">https://www.online-convert.com</a>，在Document Converter的下拉框中选择Convert to XLSX，然后将WPS另存为的XLSX文件上传，再转换一次XLSX。将这个再转换的XLSX导入进Java的程序。问题解决。</p><div class="note warning"><p>此网站转换后生成的文档有些字体发生了变化，如果对格式有严格要求，需要再进行调整。转换后的XLSX文件使用WPS编辑保存后也可以在Java POI程序中使用。</p></div><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210409103800710.png" alt="20210409103800710.png" /></p><p>参考：<a href="https://blog.csdn.net/weixin_42833423/article/details/112391440" target="_blank" rel="noopener">POI异常信息：Package should contain a content type part [M1.13]</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最近在写项目的时候，使用到了POI对表格的处理，在通过文件流创建工作簿的时候，出现异常，异常信息是：Package should contain a content type part [M1.13]。在这里，记录下这个信息，也供大家参考。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>无聊之作——《随机组句》</title>
    <link href="https://no5972.moe/cms/archivers/85.html"/>
    <id>https://no5972.moe/cms/archivers/85.html</id>
    <published>2021-04-01T10:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.503Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://blog.csdn.net/yahreso/article/details/6489065" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/yahreso-%E6%97%A0%E8%81%8A%E4%B9%8B%E4%BD%9C%E3%80%82%E3%80%82%E9%9A%8F%E6%9C%BA%E7%BB%84%E5%8F%A5%E3%80%82%E3%80%82-brightgreen" alt="yahreso@CSDN-无聊之作。。随机组句。。" /></a></p><p>《大象》的第一章里作者提到了一个小游戏：小的时候，每个人各填一张纸条，丢进代表主体、地点、动作、客体的箱子中，再在里面分别抽一张组成一句完 整的话。</p><p>因为很无聊，于是就写写看~</p><p>功能很简单，就是可以输入主体、地点、动作、客体（也可以从文件导入，或是导出）。随机在列表中组成一句话。</p><p>嗯，单击结果会自动复制到剪贴板。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210401175912649.png" alt="在这里插入图片描述" /></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.Dimension;</span><br><span class="line"><span class="keyword">import</span> java.awt.FlowLayout;</span><br><span class="line"><span class="keyword">import</span> java.awt.GridLayout;</span><br><span class="line"><span class="keyword">import</span> java.awt.Toolkit;</span><br><span class="line"><span class="keyword">import</span> java.awt.datatransfer.StringSelection;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.ActionEvent;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.ActionListener;</span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileReader;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.PrintWriter;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"><span class="keyword">import</span> java.util.Vector;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.swing.JButton;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JFileChooser;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JFrame;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JLabel;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JList;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JPanel;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JScrollPane;</span><br><span class="line"><span class="keyword">import</span> javax.swing.JTextField;</span><br><span class="line"><span class="keyword">import</span> javax.swing.ListSelectionModel;</span><br><span class="line"><span class="keyword">import</span> javax.swing.event.ListSelectionEvent;</span><br><span class="line"><span class="keyword">import</span> javax.swing.event.ListSelectionListener;</span><br><span class="line"><span class="keyword">import</span> javax.swing.filechooser.FileFilter;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> YOYO</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SuppressWarnings</span>(<span class="string">"serial"</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">RandomGame</span> <span class="keyword">extends</span> <span class="title">JFrame</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Labels' String</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> String[] title = <span class="keyword">new</span> String[] &#123; <span class="string">"主体："</span>, <span class="string">"地点："</span>, <span class="string">"动作："</span>, <span class="string">"客体："</span> &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Text Field</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> JTextField[] field = <span class="keyword">new</span> JTextField[<span class="number">4</span>];</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Buttons</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> JButton[] addBtn = <span class="keyword">new</span> JButton[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> JButton[] delBtn = <span class="keyword">new</span> JButton[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> JButton[] importBtn = <span class="keyword">new</span> JButton[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> JButton[] exportBtn = <span class="keyword">new</span> JButton[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> JButton generateBtn = <span class="keyword">new</span> JButton(<span class="string">"Generate"</span>);</span><br><span class="line">    <span class="keyword">private</span> JButton exportResultBtn = <span class="keyword">new</span> JButton(<span class="string">"Export Result"</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Data Vector</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@SuppressWarnings</span>(<span class="string">"unchecked"</span>)</span><br><span class="line">    <span class="keyword">private</span> Vector[] data = <span class="keyword">new</span> Vector[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> Vector&lt;String&gt; history = <span class="keyword">new</span> Vector&lt;String&gt;();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * JList</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> JList[] list = <span class="keyword">new</span> JList[<span class="number">4</span>];</span><br><span class="line">    <span class="keyword">private</span> JList historyList = <span class="keyword">new</span> JList();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Result Field</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> JTextField result = <span class="keyword">new</span> JTextField(<span class="number">30</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Randomer</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> Random randomer = <span class="keyword">new</span> Random();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">RandomGame</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.setTitle(<span class="string">"Random Game"</span>);</span><br><span class="line">        <span class="keyword">this</span>.setSize(<span class="number">630</span>, <span class="number">560</span>);</span><br><span class="line">        <span class="keyword">this</span>.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</span><br><span class="line"></span><br><span class="line">        Toolkit tools = Toolkit.getDefaultToolkit();</span><br><span class="line">        <span class="keyword">int</span> screenWidth = tools.getScreenSize().width;</span><br><span class="line">        <span class="keyword">int</span> screenHeight = tools.getScreenSize().height;</span><br><span class="line">        <span class="keyword">this</span>.setLocation((screenWidth - <span class="keyword">this</span>.getWidth()) / <span class="number">2</span>,</span><br><span class="line">                (screenHeight - <span class="keyword">this</span>.getHeight()) / <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">this</span>.fillComponents();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">this</span>.setVisible(<span class="keyword">true</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">fillComponents</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.setLayout(<span class="keyword">new</span> FlowLayout(FlowLayout.CENTER));</span><br><span class="line"></span><br><span class="line">        <span class="comment">// input Panel</span></span><br><span class="line">        <span class="keyword">this</span>.add(<span class="keyword">new</span> JPanel() &#123;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">this</span>.setPreferredSize(<span class="keyword">new</span> Dimension(<span class="number">630</span>, <span class="number">270</span>));</span><br><span class="line"></span><br><span class="line">                <span class="keyword">this</span>.setLayout(<span class="keyword">new</span> GridLayout(<span class="number">1</span>, <span class="number">4</span>));</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; ++i) &#123;</span><br><span class="line">                    <span class="keyword">final</span> <span class="keyword">int</span> j = i;</span><br><span class="line">                    <span class="keyword">this</span>.add(<span class="keyword">new</span> JPanel() &#123;</span><br><span class="line">                        &#123;</span><br><span class="line">                            <span class="keyword">this</span>.add(<span class="keyword">new</span> JLabel(title[j]));</span><br><span class="line"></span><br><span class="line">                            addBtn[j] = <span class="keyword">new</span> JButton(<span class="string">"+"</span>);</span><br><span class="line">                            <span class="keyword">this</span>.add(addBtn[j]);</span><br><span class="line"></span><br><span class="line">                            delBtn[j] = <span class="keyword">new</span> JButton(<span class="string">"-"</span>);</span><br><span class="line">                            <span class="keyword">this</span>.add(delBtn[j]);</span><br><span class="line"></span><br><span class="line">                            field[j] = <span class="keyword">new</span> JTextField(<span class="number">12</span>);</span><br><span class="line">                            <span class="keyword">this</span>.add(field[j]);</span><br><span class="line"></span><br><span class="line">                            data[j] = <span class="keyword">new</span> Vector&lt;String&gt;();</span><br><span class="line"></span><br><span class="line">                            addBtn[j].addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                                <span class="meta">@Override</span></span><br><span class="line">                                <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(ActionEvent arg0)</span> </span>&#123;</span><br><span class="line">                                    String text = field[j].getText().trim();</span><br><span class="line">                                    importData(j, text);</span><br><span class="line">                                &#125;</span><br><span class="line"></span><br><span class="line">                            &#125;);</span><br><span class="line"></span><br><span class="line">                            delBtn[j].addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                                <span class="meta">@Override</span></span><br><span class="line">                                <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(ActionEvent arg0)</span> </span>&#123;</span><br><span class="line">                                    String text = field[j].getText().trim();</span><br><span class="line">                                    <span class="keyword">if</span> (!text.isEmpty()</span><br><span class="line">                                            &amp;&amp; data[j].contains(text)) &#123;</span><br><span class="line">                                        data[j].remove(text);</span><br><span class="line">                                        list[j].setListData(data[j]);</span><br><span class="line">                                        field[j].setText(<span class="string">""</span>);</span><br><span class="line">                                        field[j].requestFocus();</span><br><span class="line">                                    &#125;</span><br><span class="line">                                &#125;</span><br><span class="line"></span><br><span class="line">                            &#125;);</span><br><span class="line"></span><br><span class="line">                            list[j] = <span class="keyword">new</span> JList();</span><br><span class="line">                            list[j]</span><br><span class="line">                                    .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);</span><br><span class="line">                            list[j].setFixedCellWidth(<span class="number">130</span>);</span><br><span class="line">                            list[j].setFixedCellHeight(<span class="number">20</span>);</span><br><span class="line">                            list[j]</span><br><span class="line">                                    .addListSelectionListener(<span class="keyword">new</span> ListSelectionListener() &#123;</span><br><span class="line"></span><br><span class="line">                                        <span class="meta">@Override</span></span><br><span class="line">                                        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">valueChanged</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params">                                                ListSelectionEvent e)</span> </span>&#123;</span><br><span class="line">                                            field[j].setText((String) list[j]</span><br><span class="line">                                                    .getSelectedValue());</span><br><span class="line">                                        &#125;</span><br><span class="line"></span><br><span class="line">                                    &#125;);</span><br><span class="line"></span><br><span class="line">                            JScrollPane pane = <span class="keyword">new</span> JScrollPane(list[j]);</span><br><span class="line">                            pane</span><br><span class="line">                                    .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);</span><br><span class="line">                            pane</span><br><span class="line">                                    .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);</span><br><span class="line">                            <span class="keyword">this</span>.add(pane);</span><br><span class="line"></span><br><span class="line">                            importBtn[j] = <span class="keyword">new</span> JButton(<span class="string">"Import"</span>);</span><br><span class="line">                            <span class="keyword">this</span>.add(importBtn[j]);</span><br><span class="line"></span><br><span class="line">                            exportBtn[j] = <span class="keyword">new</span> JButton(<span class="string">"Export"</span>);</span><br><span class="line">                            <span class="keyword">this</span>.add(exportBtn[j]);</span><br><span class="line"></span><br><span class="line">                            importBtn[j]</span><br><span class="line">                                    .addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                                        <span class="meta">@Override</span></span><br><span class="line">                                        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params">                                                ActionEvent e)</span> </span>&#123;</span><br><span class="line">                                            JFileChooser chooser = <span class="keyword">new</span> JFileChooser();</span><br><span class="line">                                            chooser.removeChoosableFileFilter(chooser.getFileFilter());</span><br><span class="line">                                            chooser.addChoosableFileFilter(<span class="keyword">new</span> FileFilter() &#123;</span><br><span class="line"></span><br><span class="line">                                                <span class="meta">@Override</span></span><br><span class="line">                                                <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">accept</span><span class="params">(File file)</span> </span>&#123;</span><br><span class="line">                                                    <span class="keyword">if</span> (file.isDirectory()) <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">                                                    <span class="keyword">return</span> file.getName().endsWith(<span class="string">".txt"</span>);</span><br><span class="line">                                                &#125;</span><br><span class="line"></span><br><span class="line">                                                <span class="meta">@Override</span></span><br><span class="line">                                                <span class="function"><span class="keyword">public</span> String <span class="title">getDescription</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                                                    <span class="keyword">return</span> <span class="string">".txt"</span>;</span><br><span class="line">                                                &#125;</span><br><span class="line"></span><br><span class="line">                                            &#125;);</span><br><span class="line">                                            <span class="keyword">int</span> returnVal = chooser</span><br><span class="line">                                                    .showOpenDialog(RandomGame.<span class="keyword">this</span>);</span><br><span class="line">                                            <span class="keyword">if</span> (returnVal == JFileChooser.APPROVE_OPTION) &#123;</span><br><span class="line">                                                File file = chooser</span><br><span class="line">                                                        .getSelectedFile();</span><br><span class="line">                                                BufferedReader reader = <span class="keyword">null</span>;</span><br><span class="line">                                                <span class="keyword">try</span> &#123;</span><br><span class="line">                                                    reader = <span class="keyword">new</span> BufferedReader(</span><br><span class="line">                                                            <span class="keyword">new</span> FileReader(file));</span><br><span class="line">                                                    String line;</span><br><span class="line">                                                    <span class="keyword">while</span> ((line = reader</span><br><span class="line">                                                            .readLine()) != <span class="keyword">null</span>) &#123;</span><br><span class="line">                                                        importData(j, line);</span><br><span class="line">                                                    &#125;</span><br><span class="line">                                                &#125; <span class="keyword">catch</span> (FileNotFoundException e1) &#123;</span><br><span class="line">                                                    e1.printStackTrace();</span><br><span class="line">                                                &#125; <span class="keyword">catch</span> (IOException e2) &#123;</span><br><span class="line">                                                    e2.printStackTrace();</span><br><span class="line">                                                &#125;</span><br><span class="line">                                                <span class="keyword">try</span> &#123;</span><br><span class="line">                                                    reader.close();</span><br><span class="line">                                                &#125; <span class="keyword">catch</span> (IOException e1) &#123;</span><br><span class="line">                                                    e1.printStackTrace();</span><br><span class="line">                                                &#125;</span><br><span class="line">                                            &#125;</span><br><span class="line">                                        &#125;</span><br><span class="line"></span><br><span class="line">                                    &#125;);</span><br><span class="line"></span><br><span class="line">                            exportBtn[j]</span><br><span class="line">                                    .addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                                        <span class="meta">@Override</span></span><br><span class="line">                                        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(</span></span></span><br><span class="line"><span class="function"><span class="params">                                                ActionEvent e)</span> </span>&#123;</span><br><span class="line">                                            saveFile(data[j]);</span><br><span class="line">                                        &#125;</span><br><span class="line">                                    &#125;);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// result Panel</span></span><br><span class="line">        <span class="keyword">this</span>.add(<span class="keyword">new</span> JPanel() &#123;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">this</span>.setPreferredSize(<span class="keyword">new</span> Dimension(<span class="number">600</span>, <span class="number">80</span>));</span><br><span class="line">                <span class="keyword">this</span>.setLayout(<span class="keyword">new</span> GridLayout(<span class="number">2</span>, <span class="number">1</span>));</span><br><span class="line">                <span class="keyword">this</span>.add(<span class="keyword">new</span> JPanel() &#123;</span><br><span class="line">                    &#123;</span><br><span class="line">                        <span class="keyword">this</span>.add(generateBtn);</span><br><span class="line">                        <span class="keyword">this</span>.add(exportResultBtn);</span><br><span class="line"></span><br><span class="line">                        generateBtn.addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                            <span class="meta">@Override</span></span><br><span class="line">                            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(ActionEvent e)</span> </span>&#123;</span><br><span class="line">                                <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; ++i) &#123;</span><br><span class="line">                                    <span class="keyword">if</span> (data[i].size() &lt; <span class="number">1</span>) &#123;</span><br><span class="line">                                        result.setText(<span class="string">"请先填入内容"</span>);</span><br><span class="line">                                        <span class="keyword">return</span>;</span><br><span class="line">                                    &#125;</span><br><span class="line">                                &#125;</span><br><span class="line">                                String person = (String) data[<span class="number">0</span>].get(randomer</span><br><span class="line">                                        .nextInt(data[<span class="number">0</span>].size()));</span><br><span class="line">                                String address = (String) data[<span class="number">1</span>].get(randomer</span><br><span class="line">                                        .nextInt(data[<span class="number">1</span>].size()));</span><br><span class="line">                                String dosth = (String) data[<span class="number">2</span>].get(randomer</span><br><span class="line">                                        .nextInt(data[<span class="number">2</span>].size()));</span><br><span class="line">                                String object = (String) data[<span class="number">3</span>].get(randomer</span><br><span class="line">                                        .nextInt(data[<span class="number">3</span>].size()));</span><br><span class="line"></span><br><span class="line">                                result.setText(person + <span class="string">"在"</span> + address + dosth</span><br><span class="line">                                        + object);</span><br><span class="line"></span><br><span class="line">                                history.add(result.getText());</span><br><span class="line">                                historyList.setListData(history);</span><br><span class="line">                                <span class="keyword">int</span> rowIndex = history.size() - <span class="number">1</span>;</span><br><span class="line">                                historyList.scrollRectToVisible(historyList.getCellBounds(rowIndex,</span><br><span class="line">                                        rowIndex));</span><br><span class="line">                            &#125;</span><br><span class="line"></span><br><span class="line">                        &#125;);</span><br><span class="line"></span><br><span class="line">                        exportResultBtn.addActionListener(<span class="keyword">new</span> ActionListener() &#123;</span><br><span class="line"></span><br><span class="line">                            <span class="meta">@Override</span></span><br><span class="line">                            <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">actionPerformed</span><span class="params">(ActionEvent e)</span> </span>&#123;</span><br><span class="line">                                saveFile(history);</span><br><span class="line">                            &#125;</span><br><span class="line"></span><br><span class="line">                        &#125;);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line"></span><br><span class="line">                result.setEditable(<span class="keyword">false</span>);</span><br><span class="line">                <span class="keyword">this</span>.add(result);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">this</span>.add(<span class="keyword">new</span> JPanel() &#123;</span><br><span class="line">            &#123;</span><br><span class="line">                historyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);</span><br><span class="line">                historyList.setFixedCellWidth(<span class="number">600</span>);</span><br><span class="line">                historyList.setFixedCellHeight(<span class="number">18</span>);</span><br><span class="line"></span><br><span class="line">                historyList.addListSelectionListener(<span class="keyword">new</span> ListSelectionListener() &#123;</span><br><span class="line"></span><br><span class="line">                    <span class="meta">@Override</span></span><br><span class="line">                    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">valueChanged</span><span class="params">(ListSelectionEvent e)</span> </span>&#123;</span><br><span class="line">                        StringSelection stsel = <span class="keyword">new</span> StringSelection((String) historyList.getSelectedValue());</span><br><span class="line">                        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                &#125;);</span><br><span class="line"></span><br><span class="line">                JScrollPane pane = <span class="keyword">new</span> JScrollPane(historyList);</span><br><span class="line">                pane</span><br><span class="line">                        .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);</span><br><span class="line">                pane</span><br><span class="line">                        .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);</span><br><span class="line">                <span class="keyword">this</span>.add(pane);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@SuppressWarnings</span>(<span class="string">"unchecked"</span>)</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">importData</span><span class="params">(<span class="keyword">int</span> index, String text)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!text.isEmpty() &amp;&amp; !data[index].contains(text)) &#123;</span><br><span class="line">            data[index].add(text);</span><br><span class="line">            list[index].setListData(data[index]);</span><br><span class="line">            <span class="keyword">int</span> rowIndex = data[index].size() - <span class="number">1</span>;</span><br><span class="line">            list[index].scrollRectToVisible(list[index].getCellBounds(rowIndex,</span><br><span class="line">                    rowIndex));</span><br><span class="line">            field[index].setText(<span class="string">""</span>);</span><br><span class="line">            field[index].requestFocus();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@SuppressWarnings</span>(<span class="string">"unchecked"</span>)</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">saveFile</span><span class="params">(Vector content)</span> </span>&#123;</span><br><span class="line">        JFileChooser chooser = <span class="keyword">new</span> JFileChooser();</span><br><span class="line">        chooser.removeChoosableFileFilter(chooser.getFileFilter());</span><br><span class="line">        chooser.addChoosableFileFilter(<span class="keyword">new</span> FileFilter() &#123;</span><br><span class="line"></span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">accept</span><span class="params">(File file)</span> </span>&#123;</span><br><span class="line">                <span class="keyword">if</span> (file.isDirectory()) <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">                <span class="keyword">return</span> file.getName().endsWith(<span class="string">".txt"</span>);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="function"><span class="keyword">public</span> String <span class="title">getDescription</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="string">".txt"</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="keyword">int</span> returnVal = chooser.showSaveDialog(RandomGame.<span class="keyword">this</span>);</span><br><span class="line">        <span class="keyword">if</span> (returnVal == JFileChooser.APPROVE_OPTION) &#123;</span><br><span class="line">            File file = chooser.getSelectedFile();</span><br><span class="line">            PrintWriter writer = <span class="keyword">null</span>;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                String ext = <span class="string">""</span>;</span><br><span class="line">                <span class="keyword">if</span> (!file.getName().endsWith(<span class="string">".txt"</span>)) &#123;</span><br><span class="line">                    ext = <span class="string">".txt"</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                writer = <span class="keyword">new</span> PrintWriter(file.getPath() + ext);</span><br><span class="line">                <span class="keyword">for</span> (Object line : content) &#123;</span><br><span class="line">                    writer.write(line + <span class="string">"\r\n"</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                writer.flush();</span><br><span class="line">                writer.close();</span><br><span class="line">            &#125; <span class="keyword">catch</span> (FileNotFoundException e1) &#123;</span><br><span class="line">                e1.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> args</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">new</span> RandomGame();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>附几个txt：</p><p>主体</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">博丽灵梦</span><br><span class="line">雾雨魔理沙</span><br><span class="line">露米娅</span><br><span class="line">琪露诺</span><br><span class="line">红美铃</span><br><span class="line">帕秋莉诺蕾姬</span><br><span class="line">十六夜咲夜</span><br><span class="line">蕾米莉亚</span><br><span class="line">芙兰朵露</span><br></pre></td></tr></table></figure><p>地点</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">教室</span><br><span class="line">图书馆</span><br><span class="line">宿舍</span><br><span class="line">食堂</span><br><span class="line">实验室</span><br><span class="line">篮球场</span><br><span class="line">学生街</span><br><span class="line">健身房</span><br></pre></td></tr></table></figure><p>动作</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">吃</span><br><span class="line">喝</span><br><span class="line">玩</span><br><span class="line">打</span><br><span class="line">听</span><br><span class="line">说</span><br><span class="line">读</span><br><span class="line">写</span><br><span class="line">唱</span><br><span class="line">爬</span><br><span class="line">跑</span><br><span class="line">跳</span><br><span class="line">看</span><br><span class="line">养</span><br></pre></td></tr></table></figure><p>客体</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">房子</span><br><span class="line">小毛驴</span><br><span class="line">兔子</span><br><span class="line">游戏</span><br><span class="line">电脑</span><br><span class="line">牛排</span><br><span class="line">奶茶</span><br><span class="line">咖啡</span><br><span class="line">豆浆</span><br><span class="line">怪味豆</span><br><span class="line">苏打绿</span><br><span class="line">电视</span><br><span class="line">仓鼠</span><br><span class="line">课本</span><br><span class="line">MP3</span><br><span class="line">楼梯</span><br><span class="line">山</span><br><span class="line">程序</span><br><span class="line">论文</span><br><span class="line">CET6词汇</span><br><span class="line">PSP</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      《大象》的第一章里作者提到了一个小游戏：小的时候，每个人各填一张纸条，丢进代表主体、地点、动作、客体的箱子中，再在里面分别抽一张组成一句完 整的话。因为很无聊，于是就写写看~ 功能很简单，就是可以输入主体、地点、动作、客体（也可以从文件导入，或是导出）。随机在列表中组成一句话。嗯，单击结果会自动复制到剪贴板。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>Node.js 将MEGA网盘的指定目录下载并打包成ZIP</title>
    <link href="https://no5972.moe/cms/archivers/84.html"/>
    <id>https://no5972.moe/cms/archivers/84.html</id>
    <published>2021-03-31T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Node.js也很适合编写自动化脚本。Node.js的在编写自动化脚本这方面生态不比Python差多少。并且据说相同的代码，Node.js的执行效率要高于Python。Node.js和Python的运行库体积也相差无几。MEGA在PIP和NPM都有现成的封装好的MEGA网盘API。但是经过实测发现Node.js的API相对来说更好使一些。我們把写好的代码放到ReplIt上运行就可以直接下载打包好的ZIP文件了。</p><p>我們把生成和运行JS的过程都集中到一个Bash里面，这样方便调用Linux的命令。Node.js调用系统命令比Python要复杂不少，并且有些命令并不能达到想要的效果，例如<code>clear</code>命令。</p><p>首先需要从NPM下载安装两个依赖，<code>megajs</code>即为Node.js的MEGA网盘API，<code>compress</code>用来将下载好的文件打成ZIP包。</p><p>然后使用<code>cat</code>命令生成这个JS文件，然后使用<code>node</code>命令执行它。</p><div class="note warning"><p>注意在ReplIt上执行完成之后，<strong>如果想要下载得到打包好的ZIP文件，要先把打包好的ZIP文件随便重命名一下</strong>，从shell里面运行生成、删除、重命名的文件变化虽然会反映到左侧的文件列表中，但是执行文件列表菜单中的“Download as ZIP”之后下载得到的文件是没有这个变化的。</p><p><strong>同理，要删除文件的时候，也不宜在脚本中直接删除之前生成的ZIP文件，应该从文件列表中鼠标移到要删除的文件，然后点击右侧三个点的按钮，在菜单中选择Delete来删除。</strong> 否则以后下载整个ZIP文件时会发现之前从脚本删除的文件仍然还在。这种情况需要从文件列表中创建这个文件名的文件然后从文件列表中删除之才能去掉。</p><p><a href="https://replit.com/talk/ask/Download-as-zip-didnt-download-my-output-files/81622" target="_blank" rel="noopener">这已经是在ReplIt上提出了数个月的BUG了。</a></p></div><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br></pre></td><td class="code"><pre><span class="line">npm install megajs compressing</span><br><span class="line">rm -f run.js || <span class="literal">true</span></span><br><span class="line"># rm -f pixiv*.zip || true</span><br><span class="line">rm -rf pixiv || <span class="literal">true</span></span><br><span class="line">mkdir pixiv</span><br><span class="line">cat&gt;&gt;run.js&lt;&lt;-EOF</span><br><span class="line"><span class="keyword">const</span> readline = <span class="built_in">require</span>(<span class="string">'readline'</span>);</span><br><span class="line"><span class="keyword">const</span> mega = <span class="built_in">require</span>(<span class="string">"megajs"</span>);</span><br><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">"fs"</span>);</span><br><span class="line"><span class="keyword">const</span> compressing = <span class="built_in">require</span>(<span class="string">"compressing"</span>);</span><br><span class="line"><span class="keyword">var</span> y, z = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">var</span> email = <span class="string">""</span>, password = <span class="string">""</span>;</span><br><span class="line"><span class="keyword">var</span> folderToDownload = <span class="string">"Pixiv"</span>; <span class="comment">// 改成你需要下载的目录名称。暂时只支持根目录下的一级目录</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"+-----------------------------------------------------------+"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"|                                                           |"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"|   Download Specific Folder From Mega And Pack Up to Zip   |"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"|                                                           |"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"+-----------------------------------------------------------+"</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"ATTENTION: Password will be shown - Do not let any others see"</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">Date</span>.prototype.format = <span class="function"><span class="keyword">function</span> (<span class="params">fmt</span>) </span>&#123; <span class="comment">//type : 类型 0:时间为秒  1:时间为毫秒</span></span><br><span class="line">  <span class="keyword">var</span> date = <span class="keyword">this</span>;</span><br><span class="line">  <span class="keyword">var</span> o = &#123;</span><br><span class="line">    <span class="string">"M+"</span>: date.getMonth() + <span class="number">1</span>, <span class="comment">//月份</span></span><br><span class="line">    <span class="string">"d+"</span>: date.getDate(), <span class="comment">//日</span></span><br><span class="line">    <span class="string">"h+"</span>: date.getHours(), <span class="comment">//小时</span></span><br><span class="line">    <span class="string">"m+"</span>: date.getMinutes(), <span class="comment">//分</span></span><br><span class="line">    <span class="string">"s+"</span>: date.getSeconds(), <span class="comment">//秒</span></span><br><span class="line">    <span class="string">"q+"</span>: <span class="built_in">Math</span>.floor((date.getMonth() + <span class="number">3</span>) / <span class="number">3</span>), <span class="comment">//季度</span></span><br><span class="line">    <span class="string">"S"</span>: date.getMilliseconds() <span class="comment">//毫秒</span></span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">if</span> (<span class="regexp">/(y+)/</span>.test(fmt)) fmt = fmt.replace(<span class="built_in">RegExp</span>.\$<span class="number">1</span>, (date.getFullYear() + <span class="string">""</span>).substr(<span class="number">4</span> - <span class="built_in">RegExp</span>.\$<span class="number">1.</span>length));</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> k <span class="keyword">in</span> o)</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">new</span> <span class="built_in">RegExp</span>(<span class="string">"("</span> + k + <span class="string">")"</span>).test(fmt)) fmt = fmt.replace(<span class="built_in">RegExp</span>.\$<span class="number">1</span>, (<span class="built_in">RegExp</span>.\$<span class="number">1.</span>length == <span class="number">1</span>) ? (o[k]) : ((<span class="string">"00"</span> + o[k]).substr((<span class="string">""</span> + o[k]).length)));</span><br><span class="line">  <span class="keyword">return</span> fmt;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"Input email: "</span>); </span><br><span class="line"></span><br><span class="line"><span class="comment">// 运行到这里的时候输入邮箱</span></span><br><span class="line"><span class="keyword">var</span> rl = readline.createInterface(&#123;</span><br><span class="line">  input: process.stdin,</span><br><span class="line">  output: process.stdout</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123; </span><br><span class="line">  rl.on(<span class="string">'line'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">line</span>)</span>&#123;</span><br><span class="line">    email = line;</span><br><span class="line">    rl.close();</span><br><span class="line">    resolve();</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;).then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"Input password: "</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 运行到这里的时候输入密码</span></span><br><span class="line"><span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">var</span> rl2 = readline.createInterface(&#123;</span><br><span class="line">    input: process.stdin,</span><br><span class="line">    output: process.stdout</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//-----将显示输入的密码替换为星号-----//</span></span><br><span class="line">  rl2.stdoutMuted = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">  rl2._writeToOutput = <span class="function"><span class="keyword">function</span> <span class="title">_writeToOutput</span>(<span class="params">stringToWrite</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (rl2.stdoutMuted)</span><br><span class="line">      rl2.output.write(<span class="string">"*"</span>);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">      rl2.output.write(stringToWrite);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">//----------------------------------//</span></span><br><span class="line"> </span><br><span class="line">  rl2.on(<span class="string">'line'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">line</span>)</span>&#123;</span><br><span class="line">    password = line;</span><br><span class="line">    rl2.close();</span><br><span class="line">    resolve();</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;).then(<span class="keyword">async</span> () =&gt; &#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.clear();</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> storage;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"Logging "</span> + email + <span class="string">" in ..."</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">  storage = mega(&#123;<span class="attr">email</span>: email, <span class="attr">password</span>: password&#125;, () =&gt; &#123; resolve(); &#125;);</span><br><span class="line">&#125;).then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> folder = storage.root.children.find(<span class="function"><span class="params">x</span> =&gt;</span> x.name == folderToDownload);</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"To Download "</span> + folderToDownload);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"Total Files: "</span> + folder.children.length);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> x <span class="keyword">in</span> folder.children) &#123; </span><br><span class="line">  folder.children[x].download(&#123;&#125;, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="built_in">console</span>.log((<span class="built_in">Number</span>(z) + <span class="number">1</span>) + <span class="string">"/"</span> + folder.children.length  + <span class="string">" finished"</span>);</span><br><span class="line">    z++;</span><br><span class="line">    <span class="keyword">if</span> (z &gt;= folder.children.length) &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(<span class="string">"begin packing"</span>);</span><br><span class="line">      compressing.zip.compressDir(<span class="string">'pixiv'</span>, <span class="string">'pixiv'</span> + <span class="keyword">new</span> <span class="built_in">Date</span>().format(<span class="string">"yyyyMMddhhmmss"</span>) + <span class="string">'.zip'</span>).then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'Packing complete!!!'</span>);</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'NOTE: If you want to download from "Download as Zip" in the upper right menu, you must rename this zip file to something else, in the menu next to the zip file, in the file list on the left hand side. Otherwise the zip wont contain the zip you want. This is a ReplIt bug months ago.'</span>);</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'Zip file wont be deleted by the nodejs script. As the downloaded zip would preserve the zip file just deleted. The previous zip file is strongly suggested to delete manually in the file list on the left hand side.'</span>);</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'Program ends'</span>);</span><br><span class="line">        process.exit();</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(<span class="function"><span class="params">err</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">console</span>.error(err);</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;).pipe(fs.createWriteStream(<span class="string">"./pixiv/"</span> + folder.children[x].name)); </span><br><span class="line">  <span class="built_in">console</span>.log((<span class="built_in">Number</span>(x) + <span class="number">1</span>) + <span class="string">"/"</span> + folder.children.length  + <span class="string">" started"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">EOF</span><br><span class="line">clear</span><br><span class="line">node run.js</span><br><span class="line">rm -f run.js</span><br><span class="line">rm -rf pixiv</span><br></pre></td></tr></table></figure><p>代码写好以后，保存为<code>.sh</code>的文件，在Linux控制台输入<code>sh ./保存的bash脚本文件名.sh</code>即可运行，网盘登录邮箱和密码需要自行输入。</p><div class="note danger"><p><s>注意密码输入没做隐藏，后续还要改进。密码输入完成后会自动清屏。输入的时候谨防被他人看到，导致网盘账号被盗。</s></p><p>代码已经更正，已经将显示输入的密码改为星号，但不影响回车之后提交的密码内容。但是网络数据包里面的密码仍然是明文，要提防数据包被窃取导致的密码泄露。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Node.js也很适合编写自动化脚本。Node.js的在编写自动化脚本这方面生态不比Python差多少。并且据说相同的代码，Node.js的执行效率要高于Python。Node.js和Python的运行库体积也相差无几。MEGA在PIP和NPM都有现成的封装好的MEGA网盘API。但是经过实测发现Node.js的API相对来说更好使一些。我們把写好的代码放到ReplIt上运行就可以直接下载打包好的ZIP文件了。
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>微云不限速下载方法 + 免费扩容</title>
    <link href="https://no5972.moe/cms/archivers/83.html"/>
    <id>https://no5972.moe/cms/archivers/83.html</id>
    <published>2021-03-31T09:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://funletu.com/free-expansion-of-weiyun-unlimited-speed-download-method/" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Funletu-%E5%BE%AE%E4%BA%91%E4%B8%8D%E9%99%90%E9%80%9F%E4%B8%8B%E8%BD%BD%E6%96%B9%E6%B3%95+%E5%85%8D%E8%B4%B9%E6%89%A9%E5%AE%B9-brightgreen" alt="Funletu-微云不限速下载方法+免费扩容" /></a></p><p>腾讯微云相比较于百度网盘会更加稳定，因为微云是腾讯不可割舍的业务，但是微云的下载限速也是非常严重，只有几十KB/秒，幸好，网上破解的方法很多，下面介绍一下不限速的下载方法。</p><h1 id="一-qq群大法"><a class="markdownIt-Anchor" href="#一-qq群大法"></a> 一、QQ群大法</h1><p>QQ和TIM都可以，利用QQ传输微云文件，首先把需要下载的文件保存到微云，如下图：</p><p><a href="https://imgtu.com/i/cASq1I" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASq1I.jpg" alt="cASq1I.jpg" /></a></p><p>然后打开QQ面版，点击微云：</p><p><a href="https://imgtu.com/i/cASLct" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASLct.jpg" alt="cASLct.jpg" /></a></p><p><a href="https://imgtu.com/i/cASOjP" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASOjP.jpg" alt="cASOjP.jpg" /></a></p><p>添加QQ面版之后打开微云，随便找一个好友，最好是小号，把需要的文件拖入聊天框，如图所示：</p><p><a href="https://imgtu.com/i/cASb9A" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASb9A.jpg" alt="cASb9A.jpg" /></a></p><p>点击发送之后就可以下载了。</p><p><a href="https://imgtu.com/i/cAS7hd" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cAS7hd.jpg" alt="cAS7hd.jpg" /></a></p><p><a href="https://imgtu.com/i/cASjnf" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASjnf.jpg" alt="cASjnf.jpg" /></a></p><p>同理，你可以发文件到自己的小号，同样可以不限速下载。</p><p>记住，QQ群不要在短时间内下载大量文件，否则也会被限速，需要过一段时间才会解除限制（一般不超过1天）。</p><h1 id="二-微云网页端调用idm"><a class="markdownIt-Anchor" href="#二-微云网页端调用idm"></a> 二、微云网页端调用IDM</h1><p>如果你会使用IDM，则网页端下载时，可以通过调用IDM来实现不限速下载。</p><p>IDM的安装教程，可以参照一下《下载神器IDM 中文破解版》。</p><p><a href="https://imgtu.com/i/cASvB8" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASvB8.jpg" alt="cASvB8.jpg" /></a></p><div class="note warning"><p>缺点是腾讯似乎对分享链接网页端直接下载有限制：当一个分享链接被下载超过30G流量后，似乎就不能通过网页端下载了。</p></div><h1 id="三-qq空间"><a class="markdownIt-Anchor" href="#三-qq空间"></a> 三、QQ空间</h1><p>登录QQ群空间：<a href="https://qun.qzone.qq.com/" target="_blank" rel="noopener">qun.qzone.qq.com/</a> ：</p><p><a href="https://imgtu.com/i/cApP9s" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cApP9s.png" alt="cApP9s.png" /></a></p><p>找到你想下载的群文件，就能调用IDM等下载器来不限速下载了：</p><p><a href="https://imgtu.com/i/cASxHS" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cASxHS.png" alt="cASxHS.png" /></a></p><h2 id="qq群空间优势"><a class="markdownIt-Anchor" href="#qq群空间优势"></a> QQ群空间优势</h2><p>每个群空间为10G，而且是永久保存的，所以，多建几个群尤为重要。我们可以建多少个群见下图（当然，你如果开了QQ会员，那会更多）：</p><p><a href="https://imgtu.com/i/cAppNQ" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cAppNQ.png" alt="cAppNQ.png" /></a></p><div class="note info"><p>如果你新建的群，空间是2G，那么上传一点文件之后刷新一下，一般会变为10G。</p></div><p>所以，尽管腾讯现在把微云的免费帐号空间降到了10G，但实际上：你可以通过把微云的文件转存到QQ群文件后，再删除微云的文件，来变相实现微云空间的增加。</p><h1 id="四-土豪大法"><a class="markdownIt-Anchor" href="#四-土豪大法"></a> 四、土豪大法</h1><p>充值腾讯微云会员每月最低9元起，相比较百度网盘10元每月普通会员没有加速效果要良心不少。</p><p>会员特权：</p><p><strong>享3TB存储空间，每日极速上传20GB ，视频极速加载等优享特权。</strong></p><p>目前腾讯为了推广超级会员付费，普通会员充值入口被隐藏了，可以通过下方链接进入：</p><p>腾讯充值中心：<a href="https://pay.qq.com/" target="_blank" rel="noopener">pay.qq.com/</a></p><p>找到「服务开通」——「微云会员」：</p><p><a href="https://imgtu.com/i/cAp9hj" target="_blank" rel="noopener"><img src="https://z3.ax1x.com/2021/03/31/cAp9hj.png" alt="cAp9hj.png" /></a></p><p>你也可以关注微信公众号：腾讯充值。</p><p>点击菜单栏「账户充值」——「包月开通」，里面也能找到微云普通会员的开通通道。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      腾讯微云相比较于百度网盘会更加稳定，因为微云是腾讯不可割舍的业务，但是微云的下载限速也是非常严重，只有几十KB/秒，幸好，网上破解的方法很多，下面介绍一下不限速的下载方法。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>HTML JS 输入拼音的打字机效果</title>
    <link href="https://no5972.moe/cms/archivers/82.html"/>
    <id>https://no5972.moe/cms/archivers/82.html</id>
    <published>2021-03-29T09:00:00.000Z</published>
    <updated>2023-09-06T08:38:05.655Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>我們需要调用一个大佬整理的<code>pinyin-util</code>（<a href="https://www.jsdelivr.com/package/npm/pinyin-util" target="_blank" rel="noopener">点击查看</a>）这个JS库来获取各个汉字的汉语拼音。</p><div class="note warning"><p>目前暂时只做了单字输入拼音的打字效果。输入词组的效果需要借助分词及其词典，但是网上看的一个词典都有动辄数十兆，并不适合网页加载。所以暂时不做词组拼音输入。</p></div><div class="note warning"><p>暂时没做中英文混输，中英文混输可能会出现错位。</p></div><div class="note success"><p>可以使用标点符号。</p></div><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.jsdelivr.net/npm/pinyin-util@1.2.3/dist/pinyin-util.min.js"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">"begin()"</span>&gt;</span>开始<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">"test"</span>&gt;</span><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="actionscript"><span class="keyword">var</span> str = <span class="string">"鄙人一直在竭力简化小花仙高清截图的操作步骤。这次再来尝试使用原生的远程调试来操作指令。"</span>;</span></span><br><span class="line"><span class="actionscript"><span class="keyword">var</span> x = pinyinUtil.getPinyin(str, <span class="string">' '</span>).split(<span class="string">' '</span>);</span></span><br><span class="line"><span class="javascript"><span class="keyword">var</span> p = <span class="built_in">document</span>.getElementById(<span class="string">'test'</span>);</span></span><br><span class="line"><span class="actionscript"><span class="keyword">var</span> z = <span class="number">0</span>;</span></span><br><span class="line"></span><br><span class="line"><span class="actionscript"><span class="function"><span class="keyword">function</span> <span class="title">sleep</span> <span class="params">(time)</span> </span>&#123;</span></span><br><span class="line"><span class="javascript">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve</span>) =&gt;</span> setTimeout(resolve, time));</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="javascript"><span class="keyword">async</span> <span class="function"><span class="keyword">function</span> <span class="title">begin</span>(<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="actionscript">  <span class="keyword">for</span> (<span class="keyword">var</span> i <span class="keyword">in</span> x) &#123;</span></span><br><span class="line"><span class="actionscript">  <span class="keyword">var</span> pyLength = x[i].length;</span></span><br><span class="line"><span class="actionscript">    <span class="keyword">for</span> (<span class="keyword">var</span> y <span class="keyword">in</span> x[i]) &#123;</span></span><br><span class="line">      p.innerText += x[i][y];</span><br><span class="line"><span class="javascript">      <span class="keyword">await</span>(sleep(<span class="number">50</span>));</span></span><br><span class="line">    &#125;</span><br><span class="line"><span class="javascript">    <span class="keyword">await</span>(sleep(<span class="number">50</span>));</span></span><br><span class="line">    p.innerText = p.innerText.substring(0, p.innerText.length - pyLength);</span><br><span class="line">    p.innerText += str[i];</span><br><span class="line"><span class="javascript">    <span class="keyword">await</span>(sleep(<span class="number">50</span>));</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">"demo"</span>&gt;</span><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>效果：<br /><img src="https://pic1.zhimg.com/80/v2-2b080d43f83aa23f79d500512c5ffa61.gif" alt="在这里插入图片描述" /></p><div class="note info"><p>类似的方式还可以做出五笔打字的打字机效果，只要能弄到所有五笔输入码即可。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      我們需要调用一个大佬整理的pinyin-util这个JS库来获取各个汉字的汉语拼音。目前暂时只做了单字输入拼音的打字效果。输入词组的效果需要借助分词及其词典，但是网上看的一个词典都有动辄数十兆，并不适合网页加载。所以暂时不做词组拼音输入。暂时没做中英文混输，中英文混输可能会出现错位。可以使用标点符号。
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
    
  </entry>
  
  <entry>
    <title>B站 URL转16进制防止评论贴URL被屏蔽</title>
    <link href="https://no5972.moe/cms/archivers/81.html"/>
    <id>https://no5972.moe/cms/archivers/81.html</id>
    <published>2021-03-23T03:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>封装了一个JS函数，只要运行这个JS函数就可以把URL转换成16进制，浏览器可以直接访问，防止评论直接贴URL被屏蔽的问题。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">stringToHex</span>(<span class="params">str</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">var</span> protocol = str.lastIndexOf(<span class="string">"https://"</span>) != <span class="number">-1</span> ? <span class="string">"https://"</span> : (str.lastIndexOf(<span class="string">"http://"</span>) != <span class="number">-1</span> ? <span class="string">"http://"</span> : (str.lastIndexOf(<span class="string">"ftp://"</span>) != <span class="number">-1</span> ? <span class="string">"ftp://"</span> : <span class="string">""</span>));</span><br><span class="line">    <span class="keyword">var</span> strRemovingProtocol = <span class="built_in">encodeURI</span>(str.substring(protocol.length))</span><br><span class="line">    <span class="keyword">var</span> val= <span class="string">""</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; strRemovingProtocol.length; i++)&#123;</span><br><span class="line">        <span class="keyword">if</span> (strRemovingProtocol.charAt(i) == <span class="string">'/'</span>) &#123; <span class="comment">// 忽略正斜杠</span></span><br><span class="line">            val += <span class="string">"/"</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            val += <span class="string">"%"</span> + strRemovingProtocol.charCodeAt(i).toString( <span class="number">16</span>).toUpperCase();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> protocol + val;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输入：<code>stringToHex(&quot;https://wujiuqier.lanzous.com/ifKbHmsg5sj&quot;)</code><br />输出：<code>https://%77%75%6A%69%75%71%69%65%72%2E%6C%61%6E%7A%6F%75%73%2E%63%6F%6D/%69%66%4B%62%48%6D%73%67%35%73%6A</code><br />参考资料：<a href="https://blog.csdn.net/qmdweb/article/details/80898791" target="_blank" rel="noopener">https://blog.csdn.net/qmdweb/article/details/80898791</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      封装了一个JS函数，只要运行这个JS函数就可以把URL转换成16进制，浏览器可以直接访问，防止评论直接贴URL被屏蔽的问题。
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
    
  </entry>
  
  <entry>
    <title>小花仙 通过远程Chrome远程调试来高清截图</title>
    <link href="https://no5972.moe/cms/archivers/80.html"/>
    <id>https://no5972.moe/cms/archivers/80.html</id>
    <published>2021-03-18T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>鄙人一直在竭力简化小花仙高清截图的操作步骤。这次再来尝试使用原生的Chrome远程调试来操作CDP的指令。<br />参考之前的文章<a href="54.html">python selenium chrome 控制devtools 一些线索</a>将一个可以使用Flash的浏览器添加一个启动参数<code>--remote-debugging-port=9222</code>，然后访问<code>http://hua.61.com/Client.swf</code>，登录账号，然后打开要截图的玩家面板。<br />再开一个浏览器，访问<code>http://localhost:9222</code>，按F12打开开发者工具，切换到Console。粘贴下列代码，按照注释修改开头的那几个参数并回车（这里写的参数是截图玩家面板的形象，如果是截取这个形象的就可以不用修改直接回车）。稍等片刻即可从第二个打开的浏览器看到下载文件的提示。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> shotWidth = <span class="number">4320</span>; <span class="comment">// 截图宽</span></span><br><span class="line"><span class="keyword">var</span> shotHeight = <span class="number">7680</span>; <span class="comment">// 截图高</span></span><br><span class="line"><span class="keyword">var</span> scale = <span class="number">25</span>; <span class="comment">// 100除以缩放倍率的商，例如缩放4.0倍就是100/4.0=25</span></span><br><span class="line"><span class="keyword">var</span> panX = <span class="number">-4500</span>; <span class="comment">// Flash缩放后的移动视野X</span></span><br><span class="line"><span class="keyword">var</span> panY = <span class="number">-2000</span>; <span class="comment">// Flash缩放后的移动视野Y</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">downloadFile</span>(<span class="params">fileName, content</span>) </span>&#123; <span class="comment">//下载base64图片</span></span><br><span class="line">    <span class="keyword">var</span> base64ToBlob = <span class="function"><span class="keyword">function</span>(<span class="params">code</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">let</span> raw = <span class="built_in">window</span>.atob(code);</span><br><span class="line">        <span class="keyword">let</span> rawLength = raw.length;</span><br><span class="line">        <span class="keyword">let</span> uInt8Array = <span class="keyword">new</span> <span class="built_in">Uint8Array</span>(rawLength);</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; rawLength; ++i) &#123;</span><br><span class="line">            uInt8Array[i] = raw.charCodeAt(i);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> Blob([uInt8Array], &#123;</span><br><span class="line">            type: <span class="string">"image/png"</span></span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">let</span> aLink = <span class="built_in">document</span>.createElement(<span class="string">'a'</span>);</span><br><span class="line">    <span class="keyword">let</span> blob = base64ToBlob(content); <span class="comment">//new Blob([content]);</span></span><br><span class="line">    <span class="keyword">let</span> evt = <span class="built_in">document</span>.createEvent(<span class="string">"HTMLEvents"</span>);</span><br><span class="line">    evt.initEvent(<span class="string">"click"</span>, <span class="literal">true</span>, <span class="literal">true</span>); <span class="comment">//initEvent 不加后两个参数在FF下会报错  事件类型，是否冒泡，是否阻止浏览器的默认行为</span></span><br><span class="line">    aLink.download = fileName;</span><br><span class="line">    aLink.href = URL.createObjectURL(blob);</span><br><span class="line">    aLink.click();</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> fileBase64 = <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> sleep = <span class="function">(<span class="params">time</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="params">resolve</span> =&gt;</span> setTimeout(resolve, time))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> xmlhttp;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">window</span>.XMLHttpRequest)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">//  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码</span></span><br><span class="line">    xmlhttp=<span class="keyword">new</span> XMLHttpRequest();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// IE6, IE5 浏览器执行代码</span></span><br><span class="line">    xmlhttp=<span class="keyword">new</span> ActiveXObject(<span class="string">"Microsoft.XMLHTTP"</span>);</span><br><span class="line">&#125;</span><br><span class="line">xmlhttp.onreadystatechange=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (xmlhttp.readyState==<span class="number">4</span> &amp;&amp; xmlhttp.status==<span class="number">200</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">let</span> responseJSON = <span class="built_in">JSON</span>.parse(xmlhttp.responseText);</span><br><span class="line">        <span class="keyword">let</span> wsURL = <span class="string">""</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> x <span class="keyword">in</span> responseJSON) &#123;</span><br><span class="line">            <span class="keyword">if</span> (responseJSON[x].url.lastIndexOf(<span class="string">"http://hua.61.com/Client.swf"</span>) != <span class="number">-1</span>) &#123;</span><br><span class="line">                wsURL = responseJSON[x].webSocketDebuggerUrl;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">let</span> ws = <span class="keyword">new</span> WebSocket(wsURL);</span><br><span class="line"></span><br><span class="line">        ws.onopen = <span class="keyword">async</span> <span class="function"><span class="keyword">function</span> (<span class="params">d</span>) </span>&#123;</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">'chrome remote debugger connected'</span>);</span><br><span class="line">            </span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Emulation.clearDeviceMetricsOverride", "params": &#123;&#125;&#125;`</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Emulation.setDeviceMetricsOverride", "params": &#123;"mobile":false, "width":`</span> + shotWidth + <span class="string">`, "height":`</span> + shotHeight + <span class="string">`, "deviceScaleFactor": 1&#125;&#125;`</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Page.navigate", "params": &#123;"url": "javascript:document.getElementsByTagName('embed')[0].Zoom(500);"&#125;&#125;`</span>);</span><br><span class="line">            <span class="keyword">await</span> sleep(<span class="number">2000</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Page.navigate", "params": &#123;"url": "javascript:document.getElementsByTagName('embed')[0].Zoom(`</span> + scale + <span class="string">`);"&#125;&#125;`</span>);</span><br><span class="line">            <span class="keyword">await</span> sleep(<span class="number">5000</span>);</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">"flash zoomed"</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Page.navigate", "params": &#123;"url": "javascript:document.getElementsByTagName('embed')[0].Pan(`</span> + panX + <span class="string">`,`</span> + panY + <span class="string">`,0);"&#125;&#125;`</span>);</span><br><span class="line">            <span class="keyword">await</span> sleep(<span class="number">5000</span>);</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">"flash view moved"</span>);</span><br><span class="line">            <span class="keyword">await</span> sleep(<span class="number">5000</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 155, "method": "Page.captureScreenshot", "params": &#123;"fromSurface":true&#125;&#125;`</span>);</span><br><span class="line">            <span class="keyword">await</span> sleep(<span class="number">5000</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Emulation.clearDeviceMetricsOverride", "params": &#123;&#125;&#125;`</span>);</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">"cleared emulation"</span>);</span><br><span class="line">            ws.send(<span class="string">`&#123;"id": 1, "method": "Page.navigate", "params": &#123;"url": "javascript:document.getElementsByTagName('embed')[0].Zoom(500);"&#125;&#125;`</span>);</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">"flash zoom reset"</span>);</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        ws.onmessage = <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">JSON</span>.parse(d.data)[<span class="string">'id'</span>] == <span class="string">'155'</span>) &#123;</span><br><span class="line">                <span class="built_in">console</span>.log(<span class="string">'screenshot captured'</span>);</span><br><span class="line">                <span class="built_in">console</span>.log(<span class="string">'png base64 length: '</span> + <span class="built_in">JSON</span>.parse(d.data)[<span class="string">'result'</span>][<span class="string">'data'</span>].length);</span><br><span class="line">                fileBase64 = <span class="built_in">JSON</span>.parse(d.data)[<span class="string">'result'</span>][<span class="string">'data'</span>];</span><br><span class="line">                downloadFile(<span class="string">'output.png'</span>, fileBase64);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">xmlhttp.open(<span class="string">"GET"</span>,<span class="string">"http://localhost:9222/json"</span>,<span class="literal">true</span>);</span><br><span class="line">xmlhttp.send();</span><br></pre></td></tr></table></figure><p>参考资料：<a href="http://fex.baidu.com/blog/2014/06/remote-debugging-protocol/" target="_blank" rel="noopener">http://fex.baidu.com/blog/2014/06/remote-debugging-protocol/</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      鄙人一直在竭力简化小花仙高清截图的操作步骤。这次再来尝试使用原生的Chrome远程调试来操作CDP的指令。
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>Python Selenium Firefox 控制Devtools 一些线索</title>
    <link href="https://no5972.moe/cms/archivers/79.html"/>
    <id>https://no5972.moe/cms/archivers/79.html</id>
    <published>2021-03-15T07:45:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>版本55或以上的Firefox不支持Flash自动播放。<br />建议使用<a href="http://ftp.mozilla.org/pub/firefox/releases/52.9.0esr/win64/zh-CN/" target="_blank" rel="noopener">Firefox 52.9.0 延长支持版</a>。<br />此版本需要使用<a href="https://npm.taobao.org/mirrors/geckodriver/v0.18.0/" target="_blank" rel="noopener">Gecko Driver 0.18.0</a>才能正常使用。但是不支持 <code>set_window_size</code>（会报错<code>selenium.common.exceptions.WebDriverException: Message: setWindowRect</code>），<s>所以必须手动调整视口尺寸。</s> 应该使用<code>find_element_by_id(element_id).screenshot(output_file_name)</code>的方法来截长图，或者也可以用<code>find_elements_by_tag_name('body')[0].screenshot(output_file_name)</code>的方法来截整页长图。<br />自动播放Flash的设置（参考<a href="https://blog.csdn.net/STL_CC/article/details/104968669" target="_blank" rel="noopener">https://blog.csdn.net/STL_CC/article/details/104968669</a>）：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">fp = webdriver.FirefoxProfile()</span><br><span class="line">fp.set_preference(<span class="string">"plugin.state.flash"</span>, <span class="number">2</span>)</span><br><span class="line">fp.set_preference(<span class="string">"security.insecure_field_warning.contextual.enabled"</span>, <span class="literal">False</span>)</span><br><span class="line">driver = webdriver.Firefox(firefox_profile = fp)</span><br></pre></td></tr></table></figure><p>此版本还没有移除GCLI开发者工具栏，可以通过快捷键 <code>Shift + F2</code>呼出。<br />调整视口尺寸的GCLI命令是<code>resize to 4320 7680</code>。第一个参数是宽，第二个参数是高。<br />截图的命令是</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">driver.get_screenshot_as_file(<span class="string">'baidu.png'</span>)</span><br></pre></td></tr></table></figure><p>既然不能控制视口，那就直接控制外层<code>div</code>的样式，然后执行元素节点截图。直接用<code>execute_script</code>即可。<br />综上，截取小花仙人物面板形象的操作有：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line">fp = webdriver.FirefoxProfile()</span><br><span class="line">fp.set_preference(<span class="string">"plugin.state.flash"</span>, <span class="number">2</span>)</span><br><span class="line">fp.set_preference(<span class="string">"security.insecure_field_warning.contextual.enabled"</span>, <span class="literal">False</span>)</span><br><span class="line">driver = webdriver.Firefox(firefox_profile = fp)</span><br><span class="line">driver.get(<span class="string">"http://hua.61.com/play.shtml"</span>)</span><br><span class="line">driver.execute_script(<span class="string">"document.getElementById('flashContent').innerHTML=\"&lt;embed src='http://hua.61.com/Client.swf' width='100%' height='100%'&gt;&lt;/embed&gt;\""</span>)</span><br><span class="line"><span class="comment"># 打开玩家面板</span></span><br><span class="line">driver.execute_script(<span class="string">"document.getElementById('flashContent').style.width='4320px';document.getElementById('flashContent').style.height='7680px';"</span>)</span><br><span class="line">sleep(<span class="number">5</span>)</span><br><span class="line">driver.execute_script(<span class="string">"document.getElementsByTagName('embed')[0].Zoom(500)"</span>)</span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Zoom(20)'</span>)</span><br><span class="line">sleep(<span class="number">5</span>)</span><br><span class="line"><span class="comment"># Flash缩放后的视野位置微调，还需要完善</span></span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Pan(-4500,-2000,0)'</span>) </span><br><span class="line">sleep(<span class="number">5</span>)</span><br><span class="line">driver.find_element_by_id(<span class="string">'flashContent'</span>).screenshot(<span class="string">'output.png'</span>)</span><br><span class="line">driver.execute_script(<span class="string">"document.getElementsByTagName('embed')[0].Zoom(500)"</span>)</span><br><span class="line">driver.execute_script(<span class="string">"document.getElementById('flashContent').style.height='100%';document.getElementById('flashContent').style.width='100%';"</span>)</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      版本55或以上的Firefox不支持Flash自动播放。建议使用Firefox 52.9.0 延长支持版。此版本需要使用Gecko Driver 0.18.0才能正常使用。但是不支持 set_window_size（会报错selenium.common.exceptions.WebDriverException: Message: setWindowRect），所以必须手动调整视口尺寸。
    
    </summary>
    
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
      <category term="Python" scheme="https://no5972.moe/cms/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：Linux 获取小花仙当前游戏封面图像</title>
    <link href="https://no5972.moe/cms/archivers/78.html"/>
    <id>https://no5972.moe/cms/archivers/78.html</id>
    <published>2021-03-15T01:00:00.000Z</published>
    <updated>2022-09-05T09:41:47.111Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">rm -rf ffdec</span><br><span class="line">wget https://github.com/jindrapetrik/jpexs-decompiler/releases/download/version14.2.1/ffdec_14.2.1.zip</span><br><span class="line">mkdir ffdec ; mv ffdec_14.2.1.zip ./ffdec/</span><br><span class="line"><span class="built_in">cd</span> ffdec</span><br><span class="line">unzip ffdec_14.2.1.zip</span><br><span class="line">wget http://hua.61.com/resource/baseUI/fisrtPage.swf</span><br><span class="line">java -Xmx3550m -jar ./ffdec.jar -<span class="built_in">export</span> image ./xhxCover/ ./fisrtPage.swf</span><br></pre></td></tr></table></figure><p>部署到GitHub Action，每周五早上六点自动运行:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">"Fetch FF Cover Every Week"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">'0 22 * * 4'</span></span><br><span class="line">    </span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_1:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">Fetch</span> <span class="string">FF</span> <span class="string">Cover</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    </span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Fetch</span> <span class="string">FF</span> <span class="string">Cover</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">        <span class="string">rm</span> <span class="string">-rf</span> <span class="string">ffdec</span></span><br><span class="line">        <span class="string">wget</span> <span class="string">https://github.com/jindrapetrik/jpexs-decompiler/releases/download/version14.2.1/ffdec_14.2.1.zip</span></span><br><span class="line">        <span class="string">mkdir</span> <span class="string">ffdec</span> <span class="string">;</span> <span class="string">mv</span> <span class="string">ffdec_14.2.1.zip</span> <span class="string">./ffdec/</span></span><br><span class="line">        <span class="string">cd</span> <span class="string">ffdec</span></span><br><span class="line">        <span class="string">unzip</span> <span class="string">ffdec_14.2.1.zip</span></span><br><span class="line">        <span class="string">wget</span> <span class="string">http://hua.61.com/resource/baseUI/fisrtPage.swf</span></span><br><span class="line">        <span class="string">java</span> <span class="string">-Xmx3550m</span> <span class="string">-jar</span> <span class="string">./ffdec.jar</span> <span class="string">-export</span> <span class="string">image</span> <span class="string">./xhxCover/</span> <span class="string">./fisrtPage.swf</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">to</span> <span class="string">this</span> <span class="string">repo</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">        <span class="string">mkdir</span> <span class="string">xhxCover</span></span><br><span class="line">        <span class="string">cd</span> <span class="string">ffdec/xhxCover</span></span><br><span class="line">        <span class="string">mv</span> <span class="string">*.png</span> <span class="string">../../xhxCover/cover.png</span></span><br><span class="line">        <span class="string">cd</span> <span class="string">../..</span></span><br><span class="line">        <span class="string">rm</span> <span class="string">-rf</span> <span class="string">ffdec</span></span><br><span class="line">        <span class="string">cd</span> <span class="string">xhxCover</span></span><br><span class="line">        <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.name</span> <span class="string">"No5972"</span> <span class="comment"># Change to your GitHub user name</span></span><br><span class="line">        <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.email</span> <span class="string">"wujiuqier@foxmail.com"</span> <span class="comment"># Change to your GitHub email address</span></span><br><span class="line">        <span class="string">git</span> <span class="string">add</span> <span class="string">"*.png"</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Added"</span> <span class="comment"># Guess if there are any other types of pictures - Ref: https://stackoverflow.com/questions/25083290/git-add-error-unknown-switch</span></span><br><span class="line">        <span class="string">git</span> <span class="string">commit</span> <span class="string">-m</span> <span class="string">'Fetch FF Cover'</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Committed"</span></span><br><span class="line">        <span class="string">git</span> <span class="string">push</span> <span class="string">-u</span> <span class="string">origin</span> <span class="string">master</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Pushed Origin"</span> <span class="comment"># Change to your branch to place crawled pictures</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      部署到GitHub Action，每周五早上六点自动更新
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>DNF 傻子与女孩的故事</title>
    <link href="https://no5972.moe/cms/archivers/77.html"/>
    <id>https://no5972.moe/cms/archivers/77.html</id>
    <published>2021-03-04T08:15:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/dnf%E9%98%BF%E4%BF%AE%E7%BD%97%E5%90%A7-%E4%BD%9C%E8%80%85%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><p>傻子很少去网吧也从来没有玩过网络游戏，在网吧里看见很多人玩地下城与勇士，于是他也加入其中。傻子选了个神枪手的职业，因为他觉得很帅。 就这样开始了DNF之旅，傻子进游戏后不知道怎么开枪，陪哥布林玩了好久捉迷藏，终于通关后救出赛丽亚MM。NPC赛丽亚习惯的说谢谢你了勇士，傻子还傻傻的打字说不用谢。</p><p>傻子很笨花了几个小时才进了赫尔马顿城镇。一路上很多NPC和他打招呼，他很开心。他很高兴认识这么多新朋友。 过了几天傻子慢慢的16级了，学会了去凯丽师傅那学技能，还很认真的帮大家完成任务。每当完成任务回来NPC送他一些装备他都会高兴的不得了。<br />这天他正要进图，忽然看见一个小个子MM在那喊：有哪位哥哥能带带我啊？我才3级。。喊了半天没人理他。傻子觉得她很可怜走过去说：我带你吧。就这样傻子带她刷猛毒雷鸣废墟，因为傻子16级了打这的怪很轻松，傻子叫MM站远会伤到你的。MM说傻子真体贴。傻子呵呵的笑了。傻子说你小心点，走着也会摔倒，真是个孩子。MM说那你就叫我孩子吧。我喜欢听你叫我孩子。孩子说喜欢树上打下来的草莓，傻子说那我摘给你。孩子说你真好。孩子傻子心里感觉很开心。</p><p>就这样他们边打怪边聊天孩子告诉傻子很多游戏里的知识：在西海岸的那一边有着一座美丽的天空之城，在天帷巨兽遗迹里住着一位邪恶的教主控制着善良的GBL，在白雪岂岂的万年雪山有一位迷失心智的冰心少年，在暗黑城堡有着一位昔日讨伐恶魔，而战死无法得到安息的无头骑士很多很多…傻子认真的听着，原来DNF的世界是那么大，傻子说以后的路我们一起走吧。嗯孩子轻轻的说。孩子还告诉傻子自己有个50多级的大号，等你级高点了送你点装备，傻子眼眶湿湿的，第一次有人对他这么好。</p><p>这时傻子17级，孩子15级了。。孩子说我们去杀僵尸吧这里没经验了，傻子呵呵大笑说没问题，于是进图傻子操作很菜技能也不懂的怎么用，挂了出来。孩子说你真笨，傻子不好意思的对孩子说对不起，再来一次吧。第二次也虚弱了出来，孩子嘟着嘴说我18级的时候能过王者级别的了。傻子红着脸不说话了。他认为现在还不能保护好孩子决定等练厉害了在来找她，于是傻子对孩子说等我。把身上仅有的4万金币交易给了孩子，她没说话转身走了。。</p><p>傻子望着孩子柔弱的背影消失后转身也进了暗黑雷鸣废墟… 因为没钱买药傻子不知道自己虚弱了多少次，一次次的冲进去副本里，开始从普通到冒险。傻子到18级的时候毅然选择了转漫游，因为他知道孩子的大号也是漫游，转职任务上傻子花了一天时间终于自己完成了。傻子认为只要自己努力没什么完不成的。</p><p>这时傻子17级，孩子15级了。。孩子说我们去杀僵尸吧这里没经验了，傻子呵呵大笑说没问题，于是进图傻子操作很菜技能也不懂的怎么用，挂了出来。孩子说你真笨，傻子不好意思的对孩子说对不起，再来一次吧。第二次也虚弱了出来，孩子嘟着嘴说我18级的时候能过王者级别的了。傻子红着脸不说话了。他认为现在还不能保护好孩子决定等练厉害了在来找她，于是傻子对孩子说等我。把身上仅有的4万金币交易给了孩子，她没说话转身走了。。</p><p>傻子望着孩子柔弱的背影消失后转身也进了暗黑雷鸣废墟… 因为没钱买药傻子不知道自己虚弱了多少次，一次次的冲进去副本里，开始从普通到冒险。傻子到18级的时候毅然选择了转漫游，因为他知道孩子的大号也是漫游，转职任务上傻子花了一天时间终于自己完成了。傻子认为只要自己努力没什么完不成的。</p><p>慢慢的…傻子打勇士级的僵尸图了还是很吃力。在路上边采集树上的草莓，既使自己快挂了也舍不得吃草莓，因为他还没忘记孩子喜欢草莓，他要送给她。 过了两天当傻子到19级的时候他已经能轻松的过JS王者了。傻子认为现在能找孩子能保护她了，发消息过去没不用回复。。一连几天傻子都没见孩子上线，发了好多邮件，,也去空间留了好多言，傻子没心情打怪去哪儿都虚弱回来。那时，孩子是傻子的一切。就这样傻子还是每天等孩子。过了几天傻子看见孩子上线了，傻子跑过去找孩子，远远的看见孩子身边有一位高等级时装的大将军，他们正一起走向西海岸的天空之城…傻子想跑过去叫孩子，可是脚步却停住了。傻子心里酸酸的第一次感受到吃醋的味道。。</p><p>第二天傻子见到孩子，问她怎么这些天没上线。孩子说玩大号去了。傻子傻傻地说：走，孩子我现在能通JS王了可以保护你了。孩子对傻子说你自己去吧`我要去天空之城了有一个朋友在西海岸等她，并在交易栏里放了把20级紫色的左轮枪。转身要走。傻子知道是昨天那个人在等她，忽然间好像明白了什么，他怕失去她怕再也见不到她了。在赫尔马顿大街上傻子用这生从未有过的勇气大喊：等等，孩子我一直喜欢你。</p><p>孩子愣了愣对傻子说道：我不会喜欢一个低级的穷傻子，当初只是为了让你带我练级才和你在一起而已… 傻子哀求的说：给我一次机会吧。 孩子讽刺的说：等你有枪神的称号在来找我吧。孩子想让傻子知难而退，她认为傻子那么笨是不可能完成的。因为她知道枪神之路是多少艰难。一个人，一把枪。</p><p>傻子知道枪神是漫游48级转职的称号，傻子交易她放上去99颗草莓和余下的金币，傻子只说了句等我。转身就走了。孩子看着草莓心里感到有点内疚… 没有孩子的陪伴，傻子有点孤单，当傻子到20级时拿着孩子送的武器心里暖暖的，这一天傻子正要去完成诺顿大叔交给他最后一次消灭僵尸王的任务。在进图的时候看见一个小个子魔法师喊着找人带JS王，看着她傻子不由想起孩子，密她说我带你去。那女孩说你能行吗，多少钱？傻子说不要钱。傻子心肠总是热心的几盘下来帮那女孩任务都做了。傻子PL用完了，对女孩说要下了再见。女孩感到惊讶现在游戏里还有这种人不是傻子吧。傻子被加了好友，成了女孩的第一个好友…</p><p>第二天傻子上线向赫尔城镇的朋友们告别踏上去西海岸天空之城的路，面对新的副本傻子很努力，一个人从普通到王者因为他不想再让孩子说他笨。 女孩转的是召唤师因为她觉得这个职业很安逸，宝宝一出来自己可以不用打怪。时间长了女孩一个人练级也会觉得无聊，于是想找人组队一起练，可是别人见她是召唤都不愿意组女孩，说她招宝宝会卡，女孩觉得委屈。。 一天，女孩翻了下好友名单看见傻子在线想起了是他， 发了个消息过去：你好！ 傻子见有个窗口密他，傻子不记得女孩了只好发说了句你好。 女孩以为傻子记得自己，很高兴就对傻子说一起组队练级吧。 傻子很意外，还没有谁组过自己呢，都说漫游刷图垃圾。就对女孩说好。 女孩迈着大步过去找傻子，傻子23级.女孩21级. 傻子说女孩你怎么养这么多怪物，女孩嚷着说是自己的宝宝，不是怪物= =。傻子知道了女孩是召唤师。女孩这一天很开心，傻子没嫌弃自己卡，还帮自己完成任务，就这样傻子和女孩重新认识了。</p><p>傻子在路上打到一个学者护腕，女孩羡慕的说那个值很多钱，以后自己有钱也想买一个。傻子说那送你吧。女孩看着一身垃圾装备的傻子说你还是卖了自己买装备吧。傻子说以后还可以打的到。女孩不好意思的接过护腕说以后有钱了还你。傻子呵呵大笑。女孩心里想原来他真的是个傻子。。。 以后女孩每天上线就找傻子一起练级。觉得和傻子在一起很塌实。女孩对傻子说做我师傅吧。傻子说我没什么本领教给你，女孩说你能带我练级帮我过任务，虽然女孩一个人也能完成。傻子第一次感觉被人需要，于是女孩成了傻子的徒弟。 傻子和女孩成功登上最后的悬空城后，女孩说真是座美丽的天空之城，傻子想起了孩子的话，原本他们约好一起走，可是现在却不在他身边，傻子有点伤心。</p><p>女孩问傻子说师傅你怎么玩一个难练的漫游，傻子说为了一个孩子，他喜欢的人，还说她在等他。女孩听了傻子讲他和她的故事，觉得傻子好傻也很感动，就对傻子说如果有人对我这么好，我马上嫁给他。傻子笑笑说你会遇见喜欢你的人的。女孩决定帮师傅快点到48级。 来到天帏巨兽,他们一起穿过丛林越过炼欲翻过第一山脊，傻子觉得很轻松，女孩说师傅你真厉害。傻子笑笑说谁叫我是你师傅，傻子只是不知道，因为有女孩在。在打怪的时候女孩心疼的拿着皮鞭抽她的宝宝，叫他们打快点。。这时傻子35级.女孩34级. 傻子这天上班还没来，女孩在逛街时看见一把很精美的35左轮，虽然有点贵，女孩还是买下来了，并把它加到7。傻子上线的时候女孩把左轮交到傻子手里说送师傅的。傻子说不用了，我有武器。女孩知道傻子舍不得孩子送的那把武器，女孩生气了说师傅心里没有她这个徒弟。傻子见女孩生气不知道怎么办只好换上她送的武器，把孩子送他的左轮小心的装进背包。女孩这才笑了。 女孩对傻子说想看看你师傅长什么样。傻子只把女孩当徒弟所以接了视频，女孩看到的是一个瘦瘦很清秀的男孩，女孩觉得自己脸有点红。</p><p>傻子对女孩说徒弟你真可爱。 女孩说只是可爱吗，难道我不漂亮？ 傻子说也漂亮。女孩说了句笨蛋。 女孩是很漂亮，甚至比孩子还漂亮。 女孩对傻子说以后不许在找其他徒弟了，傻子问为什么。女孩说如果你有10个徒弟了就没什么时间陪我练级了。 傻子说谁会找我这个又穷等级又低的人做师傅，也只有你这个傻徒弟了，女孩笑了。 女孩心里喜欢上傻子了，可是她知道傻子心里只有孩子。</p><p>斯顿雪域，傻子救出查理班图族长给予傻子勇士称号。时间过的很快，转眼傻子到45级了，傻子很高兴离枪神是那么近了，女孩更加珍惜和傻子在一起的时间。- 女孩问傻子说：师傅以后如果你和孩子在一起了，还会陪我练级么。 傻子说：傻徒弟你不能老跟着师傅呀，你以后也会有喜欢的人和喜欢你的人。 女孩喃喃说：他有喜欢的人了， 傻子说你这么好，谁不喜欢是他的损失。女孩：… 傻子快到48级的时候，女孩为了祝贺傻子成为枪神决定给傻子一份礼物，她要亲手给傻子强化一把+11的速射左轮，女孩从来舍不得给自己买装备，虽然很便宜。女孩用她存来的金币买了武器，可是强化11不是那么简单，失败了几次后女孩包里的金币所剩无几，她只好把仓库辛苦攒来的材料晶体什么的都卖了，最后一次成功了，女孩很欣慰。 今天傻子升级到48级，满心欢喜的去找凯丽师傅觉醒枪神，可是凯丽对傻子说虽然你已经获得勇士证明，可是对于枪神来说远远不够，等你打倒对手获得1000胜点在来吧。傻子从来没有去过PK场，单纯的傻子怎么打的赢那些钩心斗角的人，只能一点一点的赚胜点，女孩为了让傻子早点完成帮傻子刷胜点，整整一个通宵傻子终于觉醒了，女孩却感冒病倒了。下的时候对傻子说师傅恭喜你成为枪神，徒弟送你的礼物祝你和喜欢的人幸福。傻子走了去找孩子了。。女孩望着傻子…</p><p>傻子已经三个多月没见到孩子，傻子找到孩子再次见到她的时候孩子已经50多级了，穿着一身漂亮的时装的元素法师。傻子说好久不见，我完成约定来找你了。 孩子见到傻子很惊讶，甚至有点忘记他了，孩子想不到傻子能成为枪神还会来找自己，孩子看着傻子一身垃圾装备，却有一把好武器，她不知道傻子是怎么过来的。，孩子默默不语。傻子说孩子以后我们一起吧。孩子认为傻子只是凑巧罢了，成为枪神只要有耐性谁都可以，傻子只有傻劲。孩子扔下冰冷冷的一句话：等你有墨竹手镯，贤哲戒指，尼玛神兽项链在来找我吧。孩子认为这次傻子该知道什么意思了吧… 傻子只是个单纯的人，傻子对女孩说这3样东西哪里打，女孩听了傻子的话告诉傻子说那孩子根本不喜欢你。傻子说没有，她在等我。女孩说你别傻了，你知道这3样东西多珍贵吗，她只是个骗子。傻子第一次对女孩生气说不许说孩子坏话，并解除了师徒关系。女孩哭了。 好几天傻子和女孩都没有说话，女孩很想傻子，主动找到傻子说师傅我错了。傻子也说了句对不起。于是又重新拜了师。傻子很穷连一个墨竹的钱也没，更别谈其他的了，女孩说买不起我们自己打，他们查了资料悬空出墨竹手镯，于是刷悬空，第七天出了墨竹。</p><p>网上说禁地出贤哲戒指图，于是又去刷禁地，一星期，二星期，很幸运第20天出了图纸。 傻子高兴的对女孩说，只要努力没什么做不到的。女孩说也许是吧… 最后一个是尼玛项链，傻子和孩子刷过蜘蛛山脊墓地，一个月.两个月. 傻子还是相信只要努力没什么做不到。 有的东西就算在怎么努力也是没结果，就像我和你有缘无份，女孩心里说道。 女孩去网上花几百元买了一条，在刷图的时候趁傻子不注意把项链扔到地上。女孩对傻子说哇`师傅打到项链了。傻子笑呵呵的拣起项链对女孩说：终于打到了，明天可以去找孩子，谢谢你徒弟陪我打这么久。女孩心里祝福傻子。这时傻子和女孩都50级了。( 傻子再一次找到孩子，这时候她已经60级了，傻子把3样首饰交到她手里，孩子吃惊的看着傻子，感到愧疚原来傻子是真的喜欢自己，可是孩子有老公了那个大将军他们很久以前就在一起了。 孩子不想在骗傻子了就对他说：你找个好女孩吧，我只是个坏孩子。并把东西还给傻子。 傻子说：我只要和你在一起，没有谁能代替你。</p><p>女孩说：我已经有老公了，对不起.你走吧. 傻子说是我做的不好还是什么？只要你说的我一定做的到。 女孩狠了狠心对傻子说：如果你能收集到99999颗草莓，我就答应嫁给你。 傻子还是傻傻的说了句等我，就转身走了。孩子望着傻子只说了句忘记我吧。 以后的日子，在格兰之森总是有着一个50多级的傻子在喊着收草莓，有些人看见傻子每天在喊着收草莓故意把草莓卖的很贵，即便如此傻子还是买了，很快以前存的金币用完了。 女孩知道了这事以后没说什么，只是默默的陪在傻子身边，如果能早点遇见傻子该多好。 傻子在刷草莓的时候也会带那些新人，只是要求把掉落的草莓给他，也会无私的把打到的一些低级装备和金币送给他们 可是99999个草莓是那么遥遥无期，可是傻子还是一如既往的坚持着，望着仓库里慢慢堆起来的草莓，傻子相信努力的话没什么做不到。新手们问傻子为什么收集草莓？ 傻子呵呵的说有个女孩在等他，等他娶她。因为他们约定好了，他们都说你好傻，傻子笑笑。日子久了大家也会把拣到的草莓送给傻子。</p><p>不知过了多久，傻子依然收着草莓，有一天，格兰这来了两个很高级的人-一个元素和一个大将军。在那喊着公会收人，傻子呆呆着望着那个元素，那个元素也望着傻子回忆着什么。公会老大指着傻子说老婆你看那个傻子，不知道干什么的每天带人不收钱只要草莓真是傻子哈哈。那个元素对他说不许叫他傻子。男人和她吵。他火了，叫了会里几个人来刷频骂傻子。傻子傻傻的站那被一群人骂，不知道怎么办好。女孩跑过去和一群男人评理。那些人连骂女孩一起骂。就在这时，不知道谁发了个喇叭，说傻子和女孩在10频道被人欺负了，不多久，格兰这来了好多人，有十多级的新手，也有五六十级的高级号还有一些名气很大的工会老大都来了，原来他们都是新人时期受到过傻子和女孩帮助过的人，傻子一直把他们带到格兰毕业，对他们来说傻子和女孩就是他们的师傅一样。好多人指责那个骂傻子的工会老大，服务器喇叭也一直没停过，有的人刷频的骂那工会老大，有的喊谁欺负傻子和女孩他就别想在这服混下去，有的提议说把那人拉黑。不一会刚才欺负傻子的那群人头顶上出现全民公敌的称号，灰溜溜的下线了。</p><p>漫骂声结束后，大家又说了很多鼓励傻子的话，祝福傻子能找日和孩子在一起祝他们幸福······ 傻子沉默了很久，买了个喇叭只写了句谢谢大家```然后下线了。 女孩找到孩子问为什么对这么对傻子，如果不喜欢可以直接说出来没必要老欺骗他的感情。孩子说没有，只是他没理解我话的意思而已。 女孩说傻子哪里不好了。 孩子说他很好，可惜他级不高，带不了我升级，也不会给我买漂亮的时装。女孩气愤的说傻子很努力的升级，可是你为什么都不等等他，他给你冲的QB都可以买好几套时装了，你还不知足。 孩子说。。。。QB？我不知道。 女孩说傻子每个月都有给你冲，都是他辛苦工作赚来的。自己都舍不得买时装都给你了。 孩子查询了下qq帐户，吃惊的望着上面的1080个QB… 女孩哭着说还她的师傅，还她的傻子。 很长时间傻子再也没有上过线，女孩也走了，没有了傻子游戏对她来说也没意义。 她终于明白了那句话：世界上最遥远的距离不是生与死，而是我站在你面前,你却不知道我喜欢你… 孩子依旧在游戏，她在等傻子，等他娶她。为什么失去才懂的珍惜？只是她明白的是不是晚了点。</p><p>很多人都说傻子对孩子彻底失望了，离开了游戏。 也有人传言说傻子的号给盗了，据盗号的说清楚的看到满仓库的草莓.99998个 谁知道呢，傻子也许是累了.对游戏…对爱情… 只是傻子不知道一直陪在他身边的是女孩… 也许若干年后.傻子回忆过往.想起女孩…会明白至尊宝对紫霞仙子说过的那段话： 曾经有一份真诚的爱情摆在我面前，我没有珍惜，等失去的时候，才后悔莫及。人世间最痛苦的事莫过于此。如果上天能给我一个再来一次的机会，我会对那个女孩说三个字：我爱你······</p><p>不知道为什么，傻子的突然消失令赫顿玛尔的大街小巷变的灰暗冷清起来。此时穿梭在洛兰之森与赫顿玛尔大陆的勇士们总觉得少了点什么。人总是这样，一件事物或人物当它存在的时候你觉的它很平常，时间久了你也许会对他的存在感到厌烦，就像昔日一个傻傻的憨憨的枪手一样，有多少人在他存在的时候感觉到了他的存在。当然，孩子也是一样！没有人会想到就是因为傻子的存在，不知不觉中为赫顿玛尔大陆缔造了一条奇怪的风景线。一个愿望一句承诺，一个放弃了游戏宗旨而去为自己不可思议的爱情做努力的傻子.99999朵草莓的承诺使他放弃了去西海岸追求更高等级和荣誉！因为傻子知道，盛产草莓的地方只有赫顿玛尔的洛兰之森，所以傻子选择了留下，为了承诺留下，为了孩子留下，更是为了爱情留下！</p><p>女孩看到傻子灰色的头像很伤心、她知道他被孩子这次伤透了心，他很想告诉傻子，其实她也很爱他；她也很想告诉傻子她当初为他所做的一切，也都是因为她爱他； 于是 ，他给傻子发了一份邮件：师傅，其实在拜你做我师傅的第一天，我就在憧憬着我们会不会有一天在一起 ，每次看到你为孩子去做那些傻事的时候，我都很伤心，很失落 ，我就知道我的憧憬是一种奢望 ，是我真的希望你可以开心 ， 所以自己心里再痛我也会告诉自己一定要帮你做完， 可是 ，到最后 我发现我错了 ， 我应该早点告诉你孩子是故意在骗你 ，我应该早点告诉你他已经有一位大将军，他不再会需要你了，我应该早点告诉你，你想要的爱情，孩子是给不了你的， 可是现在说出来也许已经晚了 ，你不在，谁陪我练级了，你回来好吗？不是为了别人，可以为了我再回来吗？</p><p>在关掉游戏的一刹那，好像以前发生的种种美好都浮现出来。多么可爱的孩子，我知道你是善良的而并不是骗子。</p><p>只是，我已经累了。拖着疲惫的身躯我回到了家里，空荡荡的只剩下寂寞。</p><p>Dnf给我带来了朋友，让我在这个世界有了点意义。也让我感觉到爱情是甜的，也是酸的。痛苦之中我没有办法在待下去，虽然那里是我一直向往的地方。</p><p>我每天忙碌在工作中，骑着一辆三轮车满大街的送水。虽然累，但是我还是很开心，因为每当我把水送到每户人家的时候他们都很客气。还经常送我点什么的（零食啊，水果啊）。我很开心，又一次感觉到做事情有了意义。就好像第一次我跨进DNF的时候赛莉娅和我问好。阿拉德大陆的朋友和我打招呼。每当帮他们完成一些任务他们都很客气的送我装备。这一切，为什么到现在还忘记不了。在心里，我只有默默的流泪。还有孩子，你现在过的还好吗.</p><p>故事回到孩子那边，话说孩子每次做的事情就是在到处寻找傻子的踪迹，她坚信，傻子还在DNF，终于有一天，她终于看到了傻子的踪迹，那天，是傻子和女孩结为游戏夫妻的日子，凡是认识他们的，都为他们祝福，因为傻子和女孩每天都有一半的PL是用来带新手的，所以出现了无数频道喇叭为他们祝福，孩子看到了之后，哭了，因为有些事情，错过了，就再也回不来了，包括······</p><p>但是，好景不长，女孩得了绝症，女孩知道了自己的病后，没有告诉傻子，因为怕他为她担忧，直到一天，傻子正在带新手的时候，坐在旁边的一边看女孩倒下了，杏口一张想说话的时候，喉咙一甜，吐了一口鲜血，傻子惊呆了，赶紧抱住了孩子，孩子已经昏迷了过去，傻子哭了，抱起了孩子往医院狂奔，但最终抢救无效，无情的病魔夺走了她那年轻的生命，傻子抱着头蹲在角落哭了。。</p><p>在整理孩子的遗物时，傻子发现了女孩的日记，写着每天与傻子在一起的那些快乐的日子，傻子一边看，眼泪一滴一滴的落下了，日记最后写着：&quot;我知道自己活不久了，和他（指傻子）在一起的真的很快乐，但我好舍不得，好舍不得他，如果有机会，我会告诉他，我爱他，但我不能这么做，因为这会让他更痛苦，因为我快要离开他了，因为······如果有来世，我希望还能遇见他，那时，我会完成这辈子无法完成的事——做他妻子！！！”</p><p>傻子沉默了，没有再出现过在DNF，有的人说因为他女朋友逝去之后跟她一起走了，也有人说傻子离开了这个地方，至于去哪，没人知道······</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      傻子很少去网吧也从来没有玩过网络游戏，在网吧里看见很多人玩地下城与勇士，于是他也加入其中。傻子选了个神枪手的职业，因为他觉得很帅。 就这样开始了DNF之旅，傻子进游戏后不知道怎么开枪，陪哥布林玩了好久捉迷藏，终于通关后救出赛丽亚MM。NPC赛丽亚习惯的说谢谢你了勇士，傻子还傻傻的打字说不用谢。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>仅作笔记用：C# MiniBlink 初始化并实现JS调用C#代码</title>
    <link href="https://no5972.moe/cms/archivers/76.html"/>
    <id>https://no5972.moe/cms/archivers/76.html</id>
    <published>2021-03-02T08:00:00.000Z</published>
    <updated>2023-03-24T09:14:18.171Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>创建WinForm项目，打开“工具-NuGet包管理器-管理解决方案的NuGet包”。搜索“Miniblink”，选择MiniBlinkNet进行安装。<br />在项目的<code>Resources</code>目录添加设计的HTML文件作为显示界面。例如<code>mainPage.html</code>。在解决方案浏览器选中这个文件，在属性窗口的生成操作选择“嵌入的资源”。<br />初始化的代码要点：</p><ul><li>在C#中读取资源内容。</li><li>定义全局变量<code>WebView</code>和<code>Panel</code>。</li><li>在C#代码中绑定JS函数名。</li><li>C#在同一个类下实现该方法。</li><li>在网页内使用JS调用之前绑定的函数名。</li></ul><p>代码如下。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 省去开头的其他using</span></span><br><span class="line"><span class="keyword">using</span> Kyozy.MiniblinkNet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">dotnet5demo</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">Form1</span> : <span class="title">Form</span></span><br><span class="line">    &#123;</span><br><span class="line">        WebView browser;</span><br><span class="line">        Panel p;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">Form1</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>        &#123;</span><br><span class="line">            browser = <span class="keyword">new</span> WebView();</span><br><span class="line">            InitializeComponent();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">Form1_Load</span>(<span class="params"><span class="keyword">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"><span class="function"></span>        &#123;</span><br><span class="line"></span><br><span class="line">            Assembly assembly = Assembly.GetExecutingAssembly();</span><br><span class="line">            <span class="comment">// 指定资源名称</span></span><br><span class="line">            System.IO.Stream stream = assembly.GetManifestResourceStream(Assembly.GetEntryAssembly().GetName().Name + <span class="string">".Resources.mainPage.html"</span>);</span><br><span class="line">            <span class="comment">// 储存网页HTML的字符串对象</span></span><br><span class="line">            <span class="keyword">string</span> mainPage = <span class="keyword">new</span> StreamReader(stream).ReadToEnd();</span><br><span class="line">            </span><br><span class="line">            p = <span class="keyword">new</span> Panel();</span><br><span class="line">            p.AutoSize = <span class="literal">false</span>;</span><br><span class="line">            p.Dock = DockStyle.Fill;</span><br><span class="line">            <span class="keyword">this</span>.Controls.Add(p);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!browser.Bind(p)) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">            browser.SetDeviceParameter(<span class="string">"screen.width"</span>, <span class="keyword">string</span>.Empty, <span class="number">1440</span>);</span><br><span class="line">            browser.NavigationToNewWindowEnable = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">            browser.LoadHTML(mainPage);</span><br><span class="line">            JsValue.BindFunction(<span class="string">"click"</span>, <span class="keyword">new</span> wkeJsNativeFunction(csClick), <span class="number">0</span>); </span><br><span class="line">            <span class="comment">// 最后一个参数是原生函数形参数量。若需要在C#代码获取JS传过来的参数，则调用表达式JsValue.Arg(es, 0).ToString(es)即可，第二个参数0是参数序号。</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">private</span> <span class="keyword">long</span> <span class="title">csClick</span>(<span class="params">IntPtr es, IntPtr param</span>)</span></span><br><span class="line"><span class="function"></span>        &#123;</span><br><span class="line">            MessageBox.Show(<span class="string">"Hello, World!"</span>, <span class="string">"MiniBlinkDemo"</span>, MessageBoxButtons.OK, MessageBoxIcon.Information);</span><br><span class="line">            Application.Exit();</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0L</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>mainPage.html</code>代码如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/layui/2.4.3/css/layui.css"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>Hello, World!<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"layui-btn layui-btn"</span> <span class="attr">id</span>=<span class="string">"btn"</span>&gt;</span>Button<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="javascript">        <span class="built_in">document</span>.getElementById(<span class="string">"btn"</span>).onclick = click;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这样，点击按钮就可以执行对应的C#代码了。如果报错无法加载 DLL“node.dll”，就从<code>%USERPROFILE%\.nuget\packages\miniblinknet\版本号\build</code> 里面拷一个 <code>node.dll</code> 出来放到程序目录里面就可以了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210302163028593.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      创建WinForm项目，打开“工具-NuGet包管理器-管理解决方案的NuGet包”。搜索“Miniblink”，选择MiniBlinkNet进行安装。 在项目的Resources目录添加设计的HTML文件作为显示界面。例如mainPage.html。在解决方案浏览器选中这个文件，在属性窗口的生成操作选择“嵌入的资源”。
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
    
  </entry>
  
  <entry>
    <title>GitHub 的用法与礼仪</title>
    <link href="https://no5972.moe/cms/archivers/75.html"/>
    <id>https://no5972.moe/cms/archivers/75.html</id>
    <published>2021-02-26T09:15:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://blog.ralph.wang/articles/a154c53c_GitHub_%E7%9A%84%E7%94%A8%E6%B3%95%E4%B8%8E%E7%A4%BC%E4%BB%AA/" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%B1%AA%E5%BF%97%E6%88%90-GitHub%20%E7%9A%84%E7%94%A8%E6%B3%95%E4%B8%8E%E7%A4%BC%E4%BB%AA-brightgreen" alt="汪志成 - GitHub 的用法与礼仪？" /></a></p><p>前一阵国内用户滥用 Issue 的事件已逐渐平息，风波过后，留给我们一些思考：我们该如何参与并回馈这类全球开源社区？</p><p>作为一个在 GitHub 浪迹多年的人，我来谈谈自己的心得体会，希望能帮你避免再次踩坑。</p><h1 id="作为游客"><a class="markdownIt-Anchor" href="#作为游客"></a> 作为游客</h1><p>当你访问一个仓库的时候，会遇到三个按钮：Watch（关注） / Star（星标） / Fork（分叉）。</p><p>Watch 表示你对这个仓库中发生的事件感兴趣，比如出现了新的 issue 等。当这些事件发生时 GitHub 就会自动给你一个页面通知，并往你的注册邮箱发送一封邮件，当然，你也可以在 通知设置 界面禁止这些通知。当你 watch 很多仓库的时候，通知邮件可能会把你的邮箱塞满，这时候，除了在自己的邮箱设置规则之外，也可以来这里禁用通知。</p><p>Star 表示特别标记这个仓库，这和邮箱中的 Star 是一样的。严格意义上，它只是你个人需要经常访问它而进行的快捷标注，这样你就能通过 Your stars 页面（比如我 Star 过的项目）来快速找到这些项目了。它经常被用做表达支持的投票，官方也提倡如此，不过我很少会这么做。</p><p>Fork 有两种用途：一种是你要参与它，为它提交代码，这部分我会在稍后的<a href="#%E4%BD%9C%E4%B8%BA%E8%B4%A1%E7%8C%AE%E8%80%85">作为贡献者</a>部分细讲；另一种是觉得这个仓库可能会被原作者删掉，因此 Fork 出来一份，这样即使作者删掉了，我这里也有一个 Fork 那个时间点的版本的快照。不过要注意，Fork 出来的版本是不会随着原始仓库而自动更新的。理想情况下，后一种情况该算误用，因为已经开源出来的代码原作者是不应该删除的，但是确实有过被删除的情况。所以有时候我会把 Fork 但不打算发 PR 的行为看作是对库作者的不信任投票。当然，大多数的仓库作者可能不会这么想。</p><h1 id="作为贡献者"><a class="markdownIt-Anchor" href="#作为贡献者"></a> 作为贡献者</h1><p>贡献的形式有两种：提 issue 和 提 pull request，这两者有一些共同的要求，包括：</p><p>认真看并遵循对方给出的 issue 模板 / PR 模板。 及时跟进，当对方有回复时应该尽早给出足够明确的回答。如果觉得对方的答复已经解决了你的问题，或者这个确实不是问题，就及时关闭，不要等作者动手。 大多数仓库都要用英语提，但专门面向中文用户的仓库是例外。其实这一点并没有想象中的那么难，现在的谷歌翻译已经非常强大了，而且 <a href="https://translate.google.cn" target="_blank" rel="noopener">https://translate.google.cn</a> 不用也能访问，只要写好中文，然后在里面翻译成英文，再修正一下英文翻译就可以了。 接下来我再分别细说一下它们。</p><p>提 issue 也就是提问题，可以再细分为两种：提 BUG 和 提需求（Feature Request / Proposal）。</p><p>提 BUG 的基本要求是确认它是问题并把问题说清楚。</p><p>开源作者都很忙，大多数人都不会有时间跟你来回沟通，不愿意花很长时间却只是为了把问题问清楚。如果最后经过很长时间的尝试之后发现根本不是问题，那作者是会非常失望的 —— 如果不是愤怒的话。</p><p>所以，如果你发现了一个问题，请先在心里告诉自己这是“疑似问题”，然后用不同的项目甚至不同的环境来尝试重现它，这些过程你都要记录下来。等你确认了它真的是问题之后，再去提 issue，并且把你的这些尝试过程及其结果和你期待的结果都包含进去。同时，最好把这些尝试过程中的创建项目都上传到 GitHub 上的个人空间，让作者可以直接拿它重现你的问题，而不用自己重建环境。这些工作对作者关注你这个问题并解决它是非常重要的。</p><p>另外，如果你只是单纯的不会用，而不是发现了代码本身的 BUG，那么请不要提 issue。因为 issue 并不是用来请教作者的直通车，你应该去 StackOverflow 之类的专业问答网站提问。很多开源仓库的作者也同时活跃在 StackOverflow 等问答网站，所以不用担心得不到专业的答复。</p><p>提需求的基本要求是要能坦然接受别人的拒绝。</p><p>每个开源软件都有自己的发展计划，对于比较火的项目，你提出的特性请求能有 1% 的概率被接受就不错了。你要做的是要尽可能在第一帖中就把这个请求的来龙去脉说清楚，如果发现作者对你的需求有误解，那么可以回帖解释，但不要胡搅蛮缠、强词夺理。如果觉得对方拒绝得有理，请表示感谢并主动关闭你的特性请求。</p><p>提 Pull Request（简称 PR）也就是申请往主库中合并代码，是个技术含量较高的工作。</p><p>提 PR 的前提是先 Fork 对方的仓库，而不要 clone 下来然后上传到自己的仓库，那样的话 GitHub 没法知道这俩库是同源的。</p><p>Fork 之后，你的个人仓库中就有了一个分支仓库，你可以往这个分支仓库中提交代码，觉得达到了 PR 的预定目标之后，就推送它，并回到 GitHub 页面中发起 PR（GitHub 会在页面上主动提示可以发 PR，跟着走就行）。</p><p>提 PR 的基本要求是达到对方的代码质量标准。如果对方的仓库单元测试覆盖率很高，那么你也要确保自己提交的代码有足够的测试覆盖率。如果对方要求在代码中使用内联注释来生成文档，那么你也要写好相应的文档注释。如果对方对代码格式的要求很严格，那么你也应该遵循它。当然，较好的开源仓库通常都会有相应的工具进行检查，如果通不过就会标记出来。</p><p>如果你这个 PR 已经过时了，那么可以有两种选择：如果对方的新版本已经解决了这个问题，请主动关闭你自己这个；如果仍然有这个问题，请在本地把你的仓库 Rebase 到对方的最新版本，解决了冲突，然后再推送到自己的仓库，你推送完之后，对方的 PR 流中就会自动反应这些更改，而不用你关闭 PR 再重新提起（我提第一个 PR 时就曾干过这样的傻事）。</p><p>如果对方回复了你的 PR，要求你做某些修改，如果觉得合理，那就照着修改，觉得不合理，可以继续讨论，阐明你的观点。但通常来说对方比你经验丰富，水平也可能更高，请先仔细思考一下其合理性再回复。</p><h1 id="作为作者"><a class="markdownIt-Anchor" href="#作为作者"></a> 作为作者</h1><p>作为仓库的作者，首先要在仓库中包含一个明确的 LICENSE 文件。</p><p>通常代码类的仓库会选择 MIT 等比较开放的协议，如果你是开源狂热者，也可以选择 GPL 等比较激进的协议，但是要注意原则上 GitHub 不允许开放仓库中的代码使用私有/纯商业授权协议。是否法律上不允许我没仔细分析过，不过至少道德上是不允许的。同时，已经用 MIT 等开源协议开源的既有代码在法律上是不允许再闭源的，也就是不能溯及既往。比如你的 1.0 是 MIT 协议，那么别人就可以永远按照 MIT 来使用 1.0 版本的代码，但是你可以把 2.0 改成别的协议甚至退出开源（GPL是例外，一旦开放永不关闭）。不过即使如此，别人也仍然可以按照 MIT 来随意使用 1.0 的代码。</p><p>文档类的仓库通常会选择 CC 或 CC-BY-NC 协议，两者的区别是前者允许商用，后者不允许商用或商用时需单独授权。</p><p>其次，要提供 <code>CONTRIBUTING.md</code> 贡献指南等辅助文件，指导开发者如何做出贡献。如果你要为 issue 和 PR 提供模板，可以在仓库中包含一个 <code>.github/ISSUE_TEMPLATE.md</code> 和 <code>.github/PULL_REQUEST_TEMPLATE.md</code> 文件，这样别人要参与时就会先看到这个模板中的内容，避免他们误用。</p><p>最后，如果已经对外宣传或者有很多人关注了，就不要轻易弃坑，要坚持下去，如果实在坚持不下去了，请移交给别人。这是开源作者的责任。当然，没有推广过的尝试性项目不必受此限制。不过，除非万不得已（比如安全问题），否则不要删除你已经开源的仓库，那样做很不礼貌，必要时你可以废弃它，并写一个 README 来告诉读者去哪里找搬家后的版本。</p><h1 id="结语"><a class="markdownIt-Anchor" href="#结语"></a> 结语</h1><p>记住：开源是一种信仰，而不是应聘的敲门砖或者赚 KPI 的工具。非要那么做固然也不是不可以，但请别忘了初心，一旦有条件了，就要用各种形式回馈开源社区，这才是开源社区繁荣的根本。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      前一阵国内用户滥用 Issue 的事件已逐渐平息，风波过后，留给我们一些思考：我们该如何参与并回馈这类全球开源社区？作为一个在 GitHub 浪迹多年的人，我来谈谈自己的心得体会，希望能帮你避免再次踩坑。
    
    </summary>
    
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>如何删除Github上的Commit历史记录？</title>
    <link href="https://no5972.moe/cms/archivers/74.html"/>
    <id>https://no5972.moe/cms/archivers/74.html</id>
    <published>2021-02-25T03:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://lestatzhang.blog.csdn.net/article/details/90607229" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Lestat.Z.-%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4Github%E4%B8%8A%E7%9A%84Commit%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%EF%BC%9F-brightgreen" alt="Lestat.Z. - 如何删除Github上的Commit历史记录？" /></a></p><h1 id="前言"><a class="markdownIt-Anchor" href="#前言"></a> 前言</h1><p>之前在做测试的时候提交了很多无用的记录，现在准备将这些无用的垃圾commit记录删除。</p><h1 id="解决方法"><a class="markdownIt-Anchor" href="#解决方法"></a> 解决方法</h1><p>具体步骤如下。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Clone your git repo</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/lestatzhang/lestatzhang.github.io.git</span><br><span class="line"><span class="comment"># Entre your local repo</span></span><br><span class="line"><span class="built_in">cd</span> lestatzhang.github.io</span><br><span class="line"><span class="comment">#Checkout</span></span><br><span class="line">git checkout --orphan latest_branch</span><br><span class="line"><span class="comment"># Add all the files</span></span><br><span class="line">git add -A</span><br><span class="line"><span class="comment"># Commit the changes</span></span><br><span class="line">git commit -am <span class="string">"Reinitialize"</span></span><br><span class="line"><span class="comment"># Delete the branch</span></span><br><span class="line">git branch -D master</span><br><span class="line"><span class="comment"># Rename the current branch to master</span></span><br><span class="line">git branch -m master</span><br><span class="line"><span class="comment"># Finally, force update your repository</span></span><br><span class="line">git push -f origin master</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      之前在做测试的时候提交了很多无用的记录，现在准备将这些无用的垃圾commit记录删除。具体步骤如下。
    
    </summary>
    
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>利用GitHub Actions每天自动从Pixiv爬虫日推图片并存放到仓库</title>
    <link href="https://no5972.moe/cms/archivers/73.html"/>
    <id>https://no5972.moe/cms/archivers/73.html</id>
    <published>2021-02-20T07:15:00.000Z</published>
    <updated>2023-03-15T10:29:24.495Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>近期注意到有很多使用Python语言编写的爬虫，用来获取Pixiv日推的图片。这里也找了一个大佬开发的这个爬虫：<a href="https://blog.csdn.net/weixin_45826022/article/details/109406389" target="_blank" rel="noopener">https://blog.csdn.net/weixin_45826022/article/details/109406389 </a>，今天拿来放到Repl.it上跑了一下，效果还不错。</p><p>很快联想到GitHub的Actions，如果能把这个爬虫部署到GitHub Actions上，就可以每天自动跑了，还能直接就把图片放到仓库上，直接拿美国GitHub的服务器来跑，也不用考虑网络连接的问题了。但是这个配置Actions的过程还是稍微有点复杂的，要分两个分支，一个用来展示代码，另一个用来存放爬取的图片。</p><p>创建仓库以后，先创建一个分支，专门用来存放爬取的图片，这里假定命名为<code>runner</code>。然后在<code>main</code>分支把这个大佬写的爬虫文件添加，代码就不放了，就在开头那个链接里面的最后面，假定这里命名为<code>pa.py</code>。当然，受限于GitHub，当然不能像原文一样一下子搞500张图，这样对谁都不好，建议只取50张图为要。所以第32行</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">10</span> + <span class="number">1</span>):</span><br></pre></td></tr></table></figure><p>应该改成</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">2</span>):</span><br></pre></td></tr></table></figure><p>当然，考虑到各位画师的辛苦工作，起码把作品的ID也带过来吧，也是对各位画师的一个尊重。所以，从第18行</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name = name.group(<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p>后面继续添加语句（第一行还是原来的）：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">name = name.group(<span class="number">1</span>)</span><br><span class="line">illust_id = re.search(<span class="string">'"illustId":"(.+?)"'</span>, response.text)</span><br><span class="line">illust_id = illust_id.group(<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p>原来的第28行</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">f = open(path + <span class="string">'%s.%s'</span> % (name, picture.group(<span class="number">1</span>)[<span class="number">-3</span>:]), <span class="string">'wb'</span>)</span><br></pre></td></tr></table></figure><p>改成</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">f = open(path + <span class="string">'%s_%s.%s'</span> % (illust_id, name, picture.group(<span class="number">1</span>)[<span class="number">-3</span>:]), <span class="string">'wb'</span>)</span><br></pre></td></tr></table></figure><p>将这个<code>pa.py</code>文件在<code>runner</code>分支也添加。</p><p>还是在<code>main</code>分支，创建<code>.github/workflows/xxx.yml</code>，随便起名一个YML文件。配置如下内容。注意把<code>with: ref:</code>配置要放图片的单独分支，<code>user.name</code>配置GitHub账号用户名，<code>user.email</code>配置GitHub登录邮箱，<code>git push -u origin runner</code>也配置成要放图片的单独分支。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">"Pixiv Crawler"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">'0 6 * * *'</span>  </span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">  </span><br><span class="line"><span class="attr">env:</span></span><br><span class="line">  <span class="attr">ACTIONS_ALLOW_UNSECURE_COMMANDS:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">job_1:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">Python</span> <span class="string">Crawler</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">ref:</span> <span class="string">runner</span> <span class="comment"># 改成存放图片的分支</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Clear</span> <span class="string">Previous</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">        <span class="string">rm</span> <span class="string">-f</span> <span class="string">--</span> <span class="string">*.jpg</span></span><br><span class="line">        <span class="string">rm</span> <span class="string">-f</span> <span class="string">--</span> <span class="string">*.png</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Python</span> <span class="string">environment</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">actions/setup-python@v1.1.1</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Dependence</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">pip</span> <span class="string">install</span> <span class="string">requests</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">pa.py</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">python</span> <span class="string">pa.py</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">list</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">ls</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">to</span> <span class="string">this</span> <span class="string">repo</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">        <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.name</span> <span class="string">"No5972"</span> <span class="comment"># 改成Github账号用户名</span></span><br><span class="line">        <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.email</span> <span class="string">"wujiuqier@foxmail.com"</span> <span class="comment"># 改成GitHub账号的邮箱</span></span><br><span class="line">        <span class="string">git</span> <span class="string">add</span> <span class="string">"*.jpg"</span> <span class="string">"*.png"</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Added"</span> <span class="comment"># 参考: https://stackoverflow.com/questions/25083290/git-add-error-unknown-switch</span></span><br><span class="line">        <span class="string">git</span> <span class="string">commit</span> <span class="string">-m</span> <span class="string">'upload pa result'</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Committed"</span></span><br><span class="line">        <span class="string">git</span> <span class="string">push</span> <span class="string">-u</span> <span class="string">origin</span> <span class="string">runner</span> <span class="string">&amp;&amp;</span> <span class="string">echo</span> <span class="string">"Git Pushed Origin"</span> <span class="comment"># runner改成存放图片的分支</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Failure</span> <span class="string">test</span></span><br><span class="line">      <span class="attr">if:</span> <span class="string">failure()</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span> </span><br><span class="line">        <span class="string">ls</span></span><br><span class="line">        <span class="string">echo</span> <span class="string">"Error on running!"</span></span><br></pre></td></tr></table></figure><p>这样配置好以后，每天下午两点，或者只要<code>main</code>分支有提交的内容，GitHub就会自动爬取一次Pixiv日推并存放到放置图片的分支去。之后就可以前往该分支查看了。那个CRON表达式也可以根据需要修改成其他的定时。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210221224507720.png" alt="在这里插入图片描述" /></p><p>代码可以前往 <a href="https://github.com/No5972/pixiv-github-action" target="_blank" rel="noopener">https://github.com/No5972/pixiv-github-action</a> 进行参考。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      很快联想到GitHub的Actions，如果能把这个爬虫部署到GitHub Actions上，就可以每天自动跑了，还能直接就把图片放到仓库上，直接拿美国GitHub的服务器来跑，也不用考虑网络连接的问题了。但是这个配置Actions的过程还是稍微有点复杂的，要分两个分支，一个用来展示代码，另一个用来存放爬取的图片。
    
    </summary>
    
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>树上有十只鸟，开枪打死一只，还剩几只？</title>
    <link href="https://no5972.moe/cms/archivers/72.html"/>
    <id>https://no5972.moe/cms/archivers/72.html</id>
    <published>2021-02-18T09:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><p>有人问数学家一个问题：</p><p>树上有十只鸟，开枪打死一只，还剩几只？</p><p>数学家反问：是无声手枪或别的无声的枪吗？</p><p>不是。</p><p>枪声有多大？</p><p>会震得耳朵疼。</p><p>那就是说有80～100分贝？</p><p>是。</p><p>在这个城市里打鸟犯不犯法？</p><p>不犯。</p><p>您确定那只鸟真的被打死啦？</p><p>“确定。”提问的人已经不耐烦了，“拜托，你告诉我还剩几只就行了，OK？”</p><p>OK，树上的鸟中有没有聋子？</p><p>没有。</p><p>有没有关在笼子里的？</p><p>没有。</p><p>边上还有没有其他的树，树上还有没有其他的鸟？</p><p>没有。</p><p>有没有残疾或饿得飞不动的鸟？</p><p>没有。</p><p>算不算还在肚子里和孵在鸟窝里的？</p><p>不算。</p><p>打鸟的人眼有没有花？保证是十只？</p><p>没有花，就十只。</p><p>提问的人已经满脑门是汗。</p><p>但数学家继续问：有没有傻得不怕死的？</p><p>都怕死。</p><p>会不会一枪打死两只？</p><p>不会。</p><p>所有的鸟都可以自由活动吗？</p><p>完全可以。</p><p>“如果您的回答没有骗人，”数学家满怀信心地说，“打死的鸟要是挂在树上没有掉下来，那么就剩一只，如果掉下就一只不剩。”</p><p>提问的人当即晕倒！</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      有人问数学家一个问题：树上有十只鸟，开枪打死一只，还剩几只？
    
    </summary>
    
    
      <category term="Mathematics" scheme="https://no5972.moe/cms/categories/Mathematics/"/>
    
    
  </entry>
  
  <entry>
    <title>将多个仓库组成的GitHub站点部署到Vercel并绑定独立域名</title>
    <link href="https://no5972.moe/cms/archivers/71.html"/>
    <id>https://no5972.moe/cms/archivers/71.html</id>
    <published>2021-02-16T19:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.495Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>鄙人这个站点主页是一个仓库，而博客又是一个仓库。但是直接使用GitHub访问速度很慢，即使是电信网有时候也得半分钟以上，移动联通就更难说了。如果能使用Vercel作为镜像来访问就能快不少，但是Vercel目前还没有发展到能把多个仓库部署到同一个项目的不同目录下，所以这里又要劳驾GitHub Actions了。</p><h1 id="配置提交时自动拷贝到另一个仓库"><a class="markdownIt-Anchor" href="#配置提交时自动拷贝到另一个仓库"></a> 配置提交时自动拷贝到另一个仓库</h1><p>GitHub有一个可以在不同仓库之间拷贝文件或目录的动作：<a href="https://github.com/andstor/copycat-action" target="_blank" rel="noopener">Copycat</a>。我们通过这个动作把各个非主页仓库的所有文件拷贝到主页仓库中对应的子文件夹下。</p><p>把非主页仓库按照这个动作的说明书添加<code>.github/workflows/xxx.yml</code>文件（<code>xxx.yml</code>文件名可以随便起，后缀保证是<code>.yml</code>就行）。如果是Hexo生成的博客，则应参考此前的文章<a href="70.html">《Hexo Gitee Pages 自动部署站点》</a>来进行特别配置。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Copy</span></span><br><span class="line"><span class="attr">on:</span> <span class="string">push</span></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">copy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Copycat</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">andstor/copycat-action@v3</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">personal_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.PERSONAL_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">src_path:</span> <span class="string">改成来源仓库的要拷贝的路径，根目录则填/.</span></span><br><span class="line">        <span class="attr">dst_path:</span> <span class="string">改成目标仓库的拷贝位置，以斜杠结尾。这里需要填写斜杠非主页仓库名斜杠</span></span><br><span class="line">        <span class="attr">dst_owner:</span> <span class="string">改成目标仓库所在的用户名</span></span><br><span class="line">        <span class="attr">dst_repo_name:</span> <span class="string">改成目标仓库名（也就是用户名点github点io）</span></span><br><span class="line">        <span class="attr">dst_branch:</span> <span class="string">改成目标仓库的分支名</span></span><br><span class="line">        <span class="attr">src_branch:</span> <span class="string">改成来源仓库的分支名</span></span><br><span class="line">        <span class="attr">clean:</span> <span class="literal">true</span> <span class="comment"># 这里要保证目标目录先清空，否则非主页仓库若有删除文件就不会同步到主页仓库</span></span><br><span class="line">        <span class="attr">username:</span> <span class="string">改成操作的用户名</span></span><br><span class="line">        <span class="attr">email:</span> <span class="string">改成操作用户的邮箱</span></span><br></pre></td></tr></table></figure><p>前往GitHub网站，进入账号设置，Developer Settings，Personal access tokens，然后点击Generate new token。Note处随便起个名字，Select scopes里面把Repo勾选。点击最下边的Generate token。把显示出来的令牌复制出来，这个只会显示一次，之后将永远不再显示， 所以需要暂时先复制出来。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/2021021809573984.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218095738971.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/2021021809573951.png" alt="" /></p><p>在非主页仓库后台设置的Settings里面打开Secrets，添加一个密钥<code>PERSONAL_TOKEN</code>，取值就是刚才复制的令牌，注意不要带空格。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218100015625.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218100015582.png" alt="" /></p><p>这样就可以在提交此非主页仓库时自动把此仓库所有文件拷贝到主页仓库下了。</p><hr /><h1 id="部署到vercel并绑定独立域名"><a class="markdownIt-Anchor" href="#部署到vercel并绑定独立域名"></a> 部署到Vercel并绑定独立域名</h1><p>参考其他的博文配置好Vercel和GitHub的链接（包括绑定账号和Github的安装Vercel）。</p><p>在Vercel的主页点击右上方的New Project，在左边Import Git Repository里面搜索找到主页仓库用户名点github点io那个。点击右边Import。然后找到绑定的账号点击右边的Select。然后直接点击Continue。下一步直接点击Deploy。</p><p>进入这个项目，选择Settings，Domains，添加之前注册的独立域名。添加以后这时候Vercel的界面会提示你需要添加域名的解析。到这个域名解析的后台，添加一个类型为<code>A</code>，主机记录为<code>@</code>的解析记录，如果之前有这个记录则直接修改。记录值按照Vercel的界面提示填写<code>76.76.21.21</code>。其他选项保持默认即可。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210218100218514.png" alt="" /></p><p>稍等片刻，再访问这个域名，即可以更快的速度显示页面了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      鄙人这个站点主页是一个仓库，而博客又是一个仓库。但是直接使用GitHub访问速度很慢，即使是电信网有时候也得半分钟以上，移动联通就更难说了。如果能使用Vercel作为镜像来访问就能快不少，但是Vercel目前还没有发展到能把多个仓库部署到同一个项目的不同目录下，所以这里又要劳驾GitHub Actions了。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>Hexo Gitee Pages 自动部署站点</title>
    <link href="https://no5972.moe/cms/archivers/70.html"/>
    <id>https://no5972.moe/cms/archivers/70.html</id>
    <published>2021-02-08T16:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>此博客站点使用了Github作为主站，又使用了Gitee作为镜像站。但是Gitee免费账户是不支持提交后自动部署的，所以有大佬开发了在Github上使用的动作：<code>gitee-pages-action</code>（<a href="https://github.com/yanglbme/gitee-pages-action" target="_blank" rel="noopener">点击查看</a>）。只要在某个仓库配置好这个动作就能在往这个仓库提交任何内容时自动让Gitee部署Gitee里面指定仓库的内容。</p><p>我们按照这个仓库的文档往Hexo站点的<code>source</code>目录添加<code>.github\workflows\sync.yml</code>这个文件，并在这个文件里面配置要使用的Gitee站点仓库和用户名。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Sync</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">Gitee</span> <span class="string">Pages</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">yanglbme/gitee-pages-action@main</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="comment"># 注意替换为你的 Gitee 用户名</span></span><br><span class="line">          <span class="attr">gitee-username:</span> <span class="string">改成你的Gitee用户名</span></span><br><span class="line">          <span class="comment"># 注意在 Settings-&gt;Secrets 配置 GITEE_PASSWORD</span></span><br><span class="line">          <span class="attr">gitee-password:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITEE_PASSWORD</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="comment"># 注意替换为你的 Gitee 仓库，仓库名严格区分大小写，请准确填写，否则会出错</span></span><br><span class="line">          <span class="attr">gitee-repo:</span> <span class="string">改成你的Gitee仓库（用户名斜杠仓库名）</span></span><br><span class="line">          <span class="comment"># 要部署的分支，默认是 master，若是其他分支，则需要指定（指定的分支必须存在）</span></span><br><span class="line">          <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>但是一个比较严重的问题是鄙人要让Github这边部署站点的仓库更新时触发这个动作，鄙人用的是Hexo，如果鄙人在<code>source</code>目录配置了<code>.github</code>目录时使用Hexo的<code>generate</code>命令是不会向Github提交这个动作的配置的。国内也没有一个比较好的解决方案，只好去查Hexo的文档。</p><p>经过查阅<a href="https://hexo.io/zh-cn/docs/configuration" target="_blank" rel="noopener">Hexo文档</a>发现，Hexo默认会忽略隐藏文件和文件夹（包括名称以下划线和 <strong><code>.</code>开头的文件和文件夹</strong>，Hexo的<code>_posts</code>和<code>_data</code>等目录除外）。因此需要在后台仓库的<code>_config.yml</code>文件添加这样的配置才能把<code>.github</code>的目录也给带进来。可能已经预留了<code>include</code>属性，建议先搜索这个属性，然后直接往这里面添加。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">include:</span> </span><br><span class="line">  <span class="bullet">-</span> <span class="string">".github/**/*"</span></span><br></pre></td></tr></table></figure><p>但是这样即使配置了添加这些文件，他默认也会把这个源文件也给渲染，所以我们还需要设置忽略这个文件的渲染。继续在<code>_config.yml</code>文件查找<code>skip_render</code>属性，添加这个文件名。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">skip_render:</span> </span><br><span class="line">  <span class="bullet">-</span> <span class="string">".github/**/*"</span></span><br></pre></td></tr></table></figure><p>还有一处也需要修改，往远程仓库部署时要设置不能跳过隐藏的文件，因为Git Bash是按Linux设计的，默认会将<code>.</code>开头的文件和文件夹视为隐藏文件。所以要继续在<code>_config.yml</code>文件查找<code>deploy</code>属性，设置里面<code>ignore_hidden</code>为<code>false</code>。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">ignore_hidden:</span> <span class="literal">false</span> <span class="comment"># 添加这个属性值为false</span></span><br><span class="line">  <span class="attr">repo:</span> </span><br><span class="line">    <span class="attr">gitee:</span> <span class="string">git@gitee.com:你的Gitee仓库.git,要使用的分支名</span></span><br><span class="line">    <span class="attr">github:</span> <span class="string">git@github.com:你的Github仓库.git,要使用的分支名</span></span><br><span class="line">    <span class="comment"># 可以先提交Gitee然后再提交Github，也就是把这个Gitee的地址放在前面。这样保证Gitee的站点内容能在Github开始动作之前完成提交。</span></span><br></pre></td></tr></table></figure><p>注意Github的部署仓库后台的Settings里面也要按照最上面那个仓库说明中那样配置Secrets（<code>GITEE_RSA_PRIVATE_KEY</code>和<code>GITEE_PASSWORD</code>的两个密钥。其中：<code>GITEE_RSA_PRIVATE_KEY</code>存放<code>id_rsa</code>私钥；<code>GITEE_PASSWORD</code>存放Gitee帐号的密码），这一步不要忘记了。</p><p>这样设置之后就可以在Github完成部署仓库提交之后通过配置的动作自动使Gitee也部署站点。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      经过查阅Hexo文档发现，Hexo默认会忽略隐藏文件和文件夹（包括名称以下划线和 .开头的文件和文件夹，Hexo的_posts和_data等目录除外）。因此需要在后台仓库的_config.yml文件添加这样的配置才能把.github的目录也给带进来。可能已经预留了include属性，建议先搜索这个属性，然后直接往这里面添加。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>Github 添加一个实时显示StackOverflow分数Reputation的徽章</title>
    <link href="https://no5972.moe/cms/archivers/69.html"/>
    <id>https://no5972.moe/cms/archivers/69.html</id>
    <published>2021-02-04T08:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.519Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>21.07.12更新：有一个class改了，原来的XPath已经不能直接用了。把<code>grid--cell</code>改成<code>flex--item</code>就可以了。</p><hr /><p>我們采用XPath强行解析StackOverflow用户主页的HTML节点来获取用户的Reputation数字。<br />Shields.io提供了后端XPath解析网络上XML内容并输出到徽章的接口：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;dynamic&#x2F;xml?url&#x3D;&lt;URL&gt;&amp;label&#x3D;&lt;LABEL&gt;&amp;query&#x3D;&lt;&#x2F;&#x2F;data&#x2F;subdata&gt;&amp;color&#x3D;&lt;COLOR&gt;&amp;prefix&#x3D;&lt;PREFIX&gt;&amp;suffix&#x3D;&lt;SUFFIX&gt;</span><br></pre></td></tr></table></figure><p>经过反复调试，最终找出了获取StackOverflow用户的分数Reputation的XPath：<code>/html/body//div[@class='grid--cell fs-title fc-dark']</code>。将这个XPath拼接到Shields.io的URL里面，就可以获取指定用户的分数了。</p><p>这段URL可以根据需要使用指定的样式来显示需要的内容。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;img.shields.io&#x2F;badge&#x2F;dynamic&#x2F;xml?label&#x3D;StackOverflow%20%28Inactive%29&amp;query&#x3D;%2Fhtml%2Fbody%2F%2Fdiv%5B%40class%3D%27grid--cell%20fs-title%20fc-dark%27%5D&amp;url&#x3D;改成StackOverflow用户主页的网址注意转义一次&amp;longCache&#x3D;true&amp;style&#x3D;选择显示的样式&amp;suffix&#x3D;改成数字后面需要显示的后缀&amp;logo&#x3D;stackoverflow&amp;labelColor&#x3D;改成左侧背景的颜色&amp;logoColor&#x3D;改成LOGO图案的颜色&amp;color&#x3D;改成右侧背景的颜色</span><br></pre></td></tr></table></figure><p>可以选择的样式有：<code>plastic</code>, <code>flat</code>, <code>flat-square</code>, <code>for-the-badge</code>, <code>social</code>。</p><p>用MarkDown表示出来就是</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">![</span>](<span class="link">https://img.shields.io/badge/dynamic/xml?label=StackOverflow%20%28Inactive%29&amp;query=%2Fhtml%2Fbody%2F%2Fdiv%5B%40class%3D%27grid--cell%20fs-title%20fc-dark%27%5D&amp;url=改成StackOverflow用户主页的网址注意转义一次&amp;longCache=true&amp;style=选择显示的样式&amp;suffix=改成数字后面需要显示的后缀&amp;logo=stackoverflow&amp;labelColor=改成左侧背景的颜色&amp;logoColor=改成LOGO图案的颜色&amp;color=改成右侧背景的颜色</span>)](<span class="link">要链接的StackOverflow用户主页的地址</span>)</span><br></pre></td></tr></table></figure><p>例如，本示例的写法是</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">![</span>](<span class="link">https://img.shields.io/badge/dynamic/xml?label=StackOverflow%20%28Inactive%29&amp;query=%2Fhtml%2Fbody%2F%2Fdiv%5B%40class%3D%27grid--cell%20fs-title%20fc-dark%27%5D&amp;url=https%3A%2F%2Fstackoverflow.com%2Fusers%2F14547429%2Fno-5972&amp;longCache=true&amp;style=flat-square&amp;suffix=%20Reputations&amp;logo=stackoverflow&amp;labelColor=f48024&amp;logoColor=white&amp;color=F7A05B</span>)](<span class="link">https://stackoverflow.com/users/14547429/no-5972</span>)</span><br></pre></td></tr></table></figure><p>写到Github Profile的效果如图所示。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210204162052911.jpeg" alt="在这里插入图片描述" /></p><p>类似的，其他不能使用JSON方式获取数字的平台也可以通过这种XPath的方式来读取用户或项目主页的DOM节点来获取需要显示的动态内容。这里就不再赘述了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      我們采用XPath强行解析StackOverflow用户主页的HTML节点来获取用户的Reputation数字。
    
    </summary>
    
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>根据之前文章整理的在2021年继续使用Flash Player的方法【22.5.10重新整理】</title>
    <link href="https://no5972.moe/cms/archivers/68.html"/>
    <id>https://no5972.moe/cms/archivers/68.html</id>
    <published>2021-01-30T18:00:00.000Z</published>
    <updated>2022-05-10T06:42:57.308Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"><a class="markdownIt-Anchor" href="#flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"></a> Flash已经停止维护了，大家能不用Flash就尽量不要用Flash，停止维护之后此组件会非常不安全！</h1><hr /><p>目前针对国内2021年继续使用Flash Player的方法也已经基本成熟。这里重新做一个汇总。</p><ol><li>Edge、Chrome浏览器提示“Adobe Flash Player已不再受支持”，或者“不支持此插件”：Edge和Chrome的正式版都已经更新到88版本以上，已经原生不支持Flash了。如果仍然有需要使用Flash的特殊需求 <strong>应换用绿色便携版的Edge或Chrome——网传已经有绿色版的Edge出现了，但是Edge和Chrome绿色版都是一定要使用版本小于不等于88的。或者也可以换用国产浏览器——国产浏览器大都集成Flash Player。</strong></li><li>Chrome浏览器、部分页游微端提示“该版本过旧，不支持运行，请升级后使用”：据官网通知，2022年3月1日起，将不再对34.0.0.192版本之前的Adobe Flash Player（以下简称“旧版本”) 进行技术支持，届时旧版本可能出现无法正常运行的情况。<strong>请将电脑上所有的“Shockwave Flash”目录删除（注意删除前确保各个Shockwave Flash目录下没有重要文件），然后从hosts文件屏蔽这些域名：<code>geo2.adobe.com, fpdownload2.macromedia.com, fpdownload.macromedia.com, macromedia.com</code>。</strong> 这样可以继续使用该版本的Flash Player。</li><li>一些客户端程序显示了一个“fi”图标：Flash已经在1月12日自毁了，32.0.0.371是最后一个没有加定时自毁的版本。<strong>需要将<code>C:\Windows\System32\Macromed\Flash\Flash.ocx</code>以及<code>C:\Windows\SysWOW64\Macromed\Flash\Flash.ocx</code>这两个文件里面的十六进制内容<code>3E6F7742</code>的最后的<code>42</code>改成更大的数值，例如<code>72</code>或者<code>7F</code>。可以使用Ultra Edit或者WinHex来修改，但是需要注意必须先把这两个文件的权限改掉。 详细操作可以参考<a href="63.html">Edge、Chrome 1月12日之后继续使用Flash的方法（超级专业，高能预警）</a>。</strong></li><li>一些客户端无法打开，或者加载到Flash就闪退或提示停止工作：这是因为电脑已经安装了“移除Flash Player的系统更新”（若为手动安装则补丁编号为KB4577586），导致Flash组件已经不在电脑上。 <strong><a href="https://www.cr173.com/soft/1311482.html" target="_blank" rel="noopener">西西软件园已将吾爱破解论坛上的Flash破解补丁整合打包</a>，其中的“Flash恢复包”正是针对此系统更新来恢复Flash组件的。注意那个BAT应该右键以管理员身份运行。</strong> 里面的OCX控件是32.0.0.445版本的，并且已经修改掉了自毁的定时器（也是通过最后的<code>42</code>字节改成<code>72</code>），<strong>注意此恢复包仅适用于安装了“移除Flash的系统更新”的机器，未安装此更新的机器不要安装，否则会出现无法恢复的异常情况。</strong><ul><li>检查是否已经安装的方法：20H2或以下的版本根据读者使用系统的版本下载<a href="https://www.catalog.update.microsoft.com/Search.aspx?q=KB4577586" target="_blank" rel="noopener">KB4577586独立更新包</a>，执行，若显示​这台计算机上已安装了Windows更新程序(KB4577586)则说明已经安装，可以安装此恢复包；如果显示确认安装的界面则说明没有安装，请不要直接安装此恢复包，请先安装这个系统更新补丁再安装此恢复包。21H1以及更高版本包括Windows 11等已经不再集成此Flash Player，原有的升级系统前的Flash Player在升级系统后也会自动移除，可以直接安装此恢复包。</li></ul></li><li>Firefox看不到Flash内容：Firefox已经更新到85版本以上，已经完全停止支持Flash了。若有需要使用Flash则<strong>需要使用旧版Firefox来使用Flash内容。Firefox也会自动更新，建议使用延长支持版来操作。注意安装后在设置里面的Firefox更新选择“检查更新，但由您决定是否安装”，并去掉勾选“使用一项系统服务以静默安装更新”。</strong></li><li>IE浏览器的Flash内容看不到：这是因为电脑已经安装了“移除Flash Player的系统更新”（若为手动安装则补丁编号为KB4577586），导致Flash组件已经不在电脑上。<strong>参考第三条。</strong></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      目前针对国内2021年继续使用Flash Player的方法也已经基本成熟。这里重新做一个汇总。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>证明0.999...=1 《高等数学》复旦版黄立宏第四版</title>
    <link href="https://no5972.moe/cms/archivers/67.html"/>
    <id>https://no5972.moe/cms/archivers/67.html</id>
    <published>2021-01-29T03:30:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>根据数列极限的定义证明：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo><mi>lim</mi><mo>⁡</mo></mo><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>=</mo><mn>1.</mn></mrow><annotation encoding="application/x-tex">\lim \limits_{n \to \infty} 0.\overset{n个}{\overbrace{ 99 \cdots 9 } } = 1.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.593832em;vertical-align:-0.7em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.1em;margin-left:0em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">.</span></span></span></span></p><!-- gitee test 1 --><p>证明：因为对于所有的正整数 <em>n</em> ，有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>999</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>&lt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{999 \cdots 9}} - 1 \right | &lt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，故 ∀ <em>ε</em> &gt; 0，不妨设 <em>ε</em> &lt; 1，要使 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><msup><mn>0</mn><mi>n</mi></msup></mrow></mfrac><mo>&lt;</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{99 \cdots 9}} - 1 \right | = \frac{1}{10^{n}} &lt; \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight"><span class="mord mtight">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5935428571428571em;"><span style="top:-2.786em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span> ，只要 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>&gt;</mo><mfrac><mrow><mo>−</mo><mi>ln</mi><mo>⁡</mo><mi>ε</mi></mrow><mrow><mi>ln</mi><mo>⁡</mo><mn>10</mn></mrow></mfrac></mrow><annotation encoding="application/x-tex">n &gt; \frac{-\ln \varepsilon }{\ln 10}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801079999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mtight">1</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mathdefault mtight">ε</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，取<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>N</mi><mo>=</mo><mrow><mo fence="true">[</mo><mfrac><mrow><mo>−</mo><mi>ln</mi><mo>⁡</mo><mi>ε</mi></mrow><mrow><mi>ln</mi><mo>⁡</mo><mn>10</mn></mrow></mfrac><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">N = \left [ \frac{-\ln \varepsilon }{\ln 10} \right ]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2301179999999998em;vertical-align:-0.35001em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">[</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801079999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mtight">1</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mop mtight">ln</span><span class="mspace mtight" style="margin-right:0.19516666666666668em;"></span><span class="mord mathdefault mtight">ε</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">]</span></span></span></span></span></span> ，则当 <em>n</em> &gt; <em>N</em> 时，恒有 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">∣</mo><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>−</mo><mn>1</mn><mo fence="true">∣</mo></mrow><mo>&lt;</mo><mi>ε</mi></mrow><annotation encoding="application/x-tex">\left | 0.\overset{n个}{\overbrace{99 \cdots 9}} - 1 \right | &lt; \varepsilon</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.143857em;vertical-align:-1.250025em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7799749999999999em;"><span style="top:-1.355975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-1.9619749999999998em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-2.5679749999999997em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.173975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span><span style="top:-3.779975em;"><span class="pstrut" style="height:2.606em;"></span><span class="delimsizinginner delim-size1"><span>∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.250025em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">ε</span></span></span></span>，故 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo><mi>lim</mi><mo>⁡</mo></mo><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mn>0.</mn><mover><mo><mover><mrow><mn>99</mn><mo>⋯</mo><mn>9</mn></mrow><mo stretchy="true">⏞</mo></mover></mo><mrow><mi>n</mi><mi mathvariant="normal">个</mi></mrow></mover><mo>=</mo><mn>1.</mn></mrow><annotation encoding="application/x-tex">\lim \limits_{n \to \infty} 0.\overset{n个}{\overbrace{ 99 \cdots 9 } } = 1.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.593832em;vertical-align:-0.7em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.1em;margin-left:0em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.8938320000000002em;"><span style="top:-3.29244em;"><span class="pstrut" style="height:3.29244em;"></span><span><span class="mop"><span class="mord mover"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.29244em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span><span class="mord">9</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span></span></span><span class="svg-align" style="top:-3.74444em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z'/></svg></span></span></span></span></span></span></span></span></span></span><span style="top:-4.78488em;margin-left:0em;"><span class="pstrut" style="height:3.29244em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord cjk_fallback mtight">个</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">.</span></span></span></span></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      证明0.999...=1 《高等数学》复旦版黄立宏第四版
    
    </summary>
    
    
      <category term="Mathematics" scheme="https://no5972.moe/cms/categories/Mathematics/"/>
    
    
  </entry>
  
  <entry>
    <title>Github 个人Profile 自动实时获取最新博客博文日志并生成链接</title>
    <link href="https://no5972.moe/cms/archivers/66.html"/>
    <id>https://no5972.moe/cms/archivers/66.html</id>
    <published>2021-01-23T03:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.515Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>很多文章详细阐述了个性化个人Profile说明的方法，却鲜有提到如何实时更新最新博客博文并生成链接的方法。<br />其实不需要本地配置任何东西，只需要在仓库加上特定的文件，Github就会自动读取这个文件并转换成相应的动作（Action）。<br />方法参考自<a href="https://rahuldkjain.github.io/gh-profile-readme-generator/addons" target="_blank" rel="noopener">GitHub Profile README Generator - Dynamic Latest Blog Posts</a><br />首先配置好博客网站的订阅，以RSS格式或者Atom格式输出，要能从互联网HTTP方式或HTTPS方式访问得到。<br />在个人说明仓库（和用户名同名）添加<code>.github</code>目录，再从<code>.github</code>目录添加<code>workflows</code>目录，再从<code>.github/workflows</code>目录添加<code>blog-post-workflow.yml</code>这个文件。<br />文件内容如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Latest</span> <span class="string">blog</span> <span class="string">post</span> <span class="string">workflow</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="comment"># 每个小时自动获取一次</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">"0 * * * *"</span></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">update-readme-with-blog:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">Update</span> <span class="string">this</span> <span class="string">repo's</span> <span class="string">README</span> <span class="string">with</span> <span class="string">latest</span> <span class="string">blog</span> <span class="string">posts</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">gautamkrishnar/blog-post-workflow@master</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">max_post_count:</span> <span class="string">"5"</span> <span class="comment"># 获取几条链接</span></span><br><span class="line">          <span class="attr">feed_list:</span> <span class="string">"https://no5972.moe/cms/feed.xml"</span> <span class="comment"># 改成博客订阅的地址，以RSS格式或者Atom格式输出的</span></span><br></pre></td></tr></table></figure><p>编辑自己的说明文件<code>README.md</code>，在需要生成链接的地方添加如下内容。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="xml"><span class="comment">&lt;!-- BLOG-POST-LIST:START --&gt;</span></span></span><br><span class="line"><span class="xml"><span class="comment">&lt;!-- BLOG-POST-LIST:END --&gt;</span></span></span><br></pre></td></tr></table></figure><p>过几个小时再看看自己的Profile页面，看看相应内容是不是已经出现了博文的链接？<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210123111754169.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      很多文章详细阐述了个性化个人Profile说明的方法，却鲜有提到如何实时更新最新博客博文并生成链接的方法。其实不需要本地配置任何东西，只需要在仓库加上特定的文件，Github就会自动读取这个文件并转换成相应的动作（Action）。
    
    </summary>
    
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>AX版Flash 1月12日之后继续使用Flash的方法</title>
    <link href="https://no5972.moe/cms/archivers/65.html"/>
    <id>https://no5972.moe/cms/archivers/65.html</id>
    <published>2021-01-15T07:30:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"><a class="markdownIt-Anchor" href="#flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"></a> Flash已经停止维护了，大家能不用Flash就尽量不要用Flash，停止维护之后此组件会非常不安全！</h1><p>稍微简化了一下，整了一个BAT加Node.js的脚本。需要把BAT、<code>demo32.js</code>、<code>demo64.js</code>、和<code>node.exe</code>（Node.js的可执行文件）放进同一目录。然后右键BAT文件以管理员身份运行。</p><h1 id="bat文件"><a class="markdownIt-Anchor" href="#bat文件"></a> BAT文件：</h1><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line"></span><br><span class="line"><span class="built_in">net</span>.exe session <span class="number">1</span>&gt;<span class="built_in">NUL</span> <span class="number">2</span>&gt;<span class="built_in">NUL</span> &amp;&amp; (</span><br><span class="line">    <span class="keyword">goto</span> as_admin</span><br><span class="line">) || (</span><br><span class="line">    <span class="keyword">goto</span> not_admin</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">:as_admin</span><br><span class="line"><span class="built_in">title</span> 一键解决Flash <span class="number">1</span>月<span class="number">12</span>日定时自毁的问题 - AX版</span><br><span class="line"><span class="built_in">color</span> <span class="number">09</span></span><br><span class="line"><span class="built_in">echo</span> ====================================================</span><br><span class="line"><span class="built_in">echo</span>      一键解决Flash <span class="number">1</span>月<span class="number">12</span>日定时自毁的问题 - AX版</span><br><span class="line"><span class="built_in">echo</span>                       作者：佚名</span><br><span class="line"><span class="built_in">echo</span> ====================================================</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span>                    按任意键开始修改！</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">pause</span></span><br><span class="line"><span class="built_in">echo</span> 开始修改Flash.ocx所有者到Administrators</span><br><span class="line">TAKEOWN /F <span class="variable">%SystemRoot%</span>\system32\Macromed\Flash\Flash.ocx /a</span><br><span class="line">TAKEOWN /F <span class="variable">%SystemRoot%</span>\sysWOW64\Macromed\Flash\Flash.ocx /a</span><br><span class="line"><span class="built_in">echo</span> 开始修改Flash.ocx权限</span><br><span class="line">ICACLS <span class="variable">%SystemRoot%</span>\system32\Macromed\Flash\Flash.ocx /grant Administrators:F</span><br><span class="line">ICACLS <span class="variable">%SystemRoot%</span>\sysWOW64\Macromed\Flash\Flash.ocx /grant Administrators:F</span><br><span class="line">%~dp0\node.exe %~dp0\demo32.js</span><br><span class="line">%~dp0\node.exe %~dp0\demo64.js</span><br><span class="line"><span class="built_in">echo</span> 程序结束</span><br><span class="line"><span class="keyword">goto</span> end</span><br><span class="line"></span><br><span class="line">:not_admin</span><br><span class="line"><span class="built_in">title</span> 一键解决Flash <span class="number">1</span>月<span class="number">12</span>日定时自毁的问题 - AX版</span><br><span class="line"><span class="built_in">color</span> <span class="number">09</span></span><br><span class="line"><span class="built_in">echo</span> ====================================================</span><br><span class="line"><span class="built_in">echo</span>      一键解决Flash <span class="number">1</span>月<span class="number">12</span>日定时自毁的问题 - AX版</span><br><span class="line"><span class="built_in">echo</span>                       作者：佚名</span><br><span class="line"><span class="built_in">echo</span> ====================================================</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span>    错误：未得到管理员权限，请右键以管理员身份运行！</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"></span><br><span class="line">:end</span><br><span class="line"><span class="built_in">pause</span></span><br><span class="line">@<span class="built_in">echo</span> on</span><br></pre></td></tr></table></figure><h1 id="demo32js文件"><a class="markdownIt-Anchor" href="#demo32js文件"></a> <code>demo32.js</code>文件：</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">'use strict'</span>;</span><br><span class="line"><span class="keyword">var</span> exec = <span class="built_in">require</span>(<span class="string">'child_process'</span>).exec;</span><br><span class="line"><span class="keyword">var</span> path = <span class="built_in">require</span>(<span class="string">"path"</span>) ;</span><br><span class="line"><span class="keyword">var</span> fs = <span class="built_in">require</span>(<span class="string">"fs"</span>) ;</span><br><span class="line"><span class="keyword">var</span> filePath = path.resolve(<span class="string">"C:/Windows/System32/Macromed/Flash/Flash.ocx"</span>);</span><br><span class="line"></span><br><span class="line">fs.open(filePath, <span class="string">'r'</span>, <span class="function"><span class="keyword">function</span> (<span class="params">error, fd</span>) </span>&#123;</span><br><span class="line"><span class="keyword">var</span> i = <span class="number">0</span>, j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (error) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[31m打开文件错误！没有找到文件或者没有权限，可能已经安装了移除Flash的系统更新\u001b[0m"</span>);</span><br><span class="line"></span><br><span class="line">process.exit();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> size = fs.statSync(filePath).size;</span><br><span class="line"><span class="keyword">let</span> buf = Buffer.alloc(size);</span><br><span class="line">fs.read(fd, buf, <span class="number">0</span>, size, <span class="number">0</span>, <span class="function"><span class="keyword">function</span> (<span class="params">error, data, buffer</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m文件路径："</span> + filePath + <span class="string">"\u001b[0m"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m文件长度："</span> + buffer.length + <span class="string">"\u001b[0m"</span>) ;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> sourceBytes = [<span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x40</span>, <span class="number">0x46</span>, <span class="number">0x3E</span>, <span class="number">0x6F</span>, <span class="number">0x77</span>, <span class="number">0x42</span>];</span><br><span class="line"><span class="keyword">var</span> isFound = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; buffer.length - <span class="number">8</span> &amp;&amp; !isFound; i++) &#123;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; sourceBytes.length; j++) &#123;</span><br><span class="line"><span class="keyword">if</span> (buffer[i+j] != sourceBytes[j]) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">if</span> (buffer[i+j] == sourceBytes[j] &amp;&amp; j == sourceBytes.length - <span class="number">1</span>) isFound = <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"越界！位置："</span> + (i+j));</span><br><span class="line"><span class="keyword">throw</span>(err);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (i == size - <span class="number">8</span>) &#123;</span><br><span class="line"><span class="built_in">console</span>.error(<span class="string">"\u001b[31m文件找到了，但是没找到定时自毁的代码！或者已经修改过！\u001b[0m"</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m已找到定时自毁的代码："</span> + (--i) + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">buffer[i+<span class="number">7</span>] = <span class="number">0x72</span>;</span><br><span class="line">fs.close(fd, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">fs.writeFile(filePath, buffer, &#123;<span class="attr">encoding</span>: <span class="string">"ascii"</span>&#125;, <span class="function"><span class="keyword">function</span> (<span class="params">err</span>) </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (err) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[31m写入失败！错误信息："</span> + err + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[32m"</span> + <span class="string">"写入成功！已去除自毁定时器，现在可以使用AX版Flash了。"</span> + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h1 id="demo64js文件"><a class="markdownIt-Anchor" href="#demo64js文件"></a> <code>demo64.js</code>文件：</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">'use strict'</span>;</span><br><span class="line"><span class="keyword">var</span> exec = <span class="built_in">require</span>(<span class="string">'child_process'</span>).exec;</span><br><span class="line"><span class="keyword">var</span> path = <span class="built_in">require</span>(<span class="string">"path"</span>) ;</span><br><span class="line"><span class="keyword">var</span> fs = <span class="built_in">require</span>(<span class="string">"fs"</span>) ;</span><br><span class="line"><span class="keyword">var</span> filePath = path.resolve(<span class="string">"C:/Windows/SysWOW64/Macromed/Flash/Flash.ocx"</span>);</span><br><span class="line"></span><br><span class="line">fs.open(filePath, <span class="string">'r'</span>, <span class="function"><span class="keyword">function</span> (<span class="params">error, fd</span>) </span>&#123;</span><br><span class="line"><span class="keyword">var</span> i = <span class="number">0</span>, j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (error) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[31m打开文件错误！没有找到文件或者没有权限，可能已经安装了移除Flash的系统更新\u001b[0m"</span>);</span><br><span class="line"></span><br><span class="line">process.exit();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> size = fs.statSync(filePath).size;</span><br><span class="line"><span class="keyword">let</span> buf = Buffer.alloc(size);</span><br><span class="line">fs.read(fd, buf, <span class="number">0</span>, size, <span class="number">0</span>, <span class="function"><span class="keyword">function</span> (<span class="params">error, data, buffer</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m文件路径："</span> + filePath + <span class="string">"\u001b[0m"</span>);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m文件长度："</span> + buffer.length + <span class="string">"\u001b[0m"</span>) ;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> sourceBytes = [<span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x40</span>, <span class="number">0x46</span>, <span class="number">0x3E</span>, <span class="number">0x6F</span>, <span class="number">0x77</span>, <span class="number">0x42</span>];</span><br><span class="line"><span class="keyword">var</span> isFound = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; buffer.length - <span class="number">8</span> &amp;&amp; !isFound; i++) &#123;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; sourceBytes.length; j++) &#123;</span><br><span class="line"><span class="keyword">if</span> (buffer[i+j] != sourceBytes[j]) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">if</span> (buffer[i+j] == sourceBytes[j] &amp;&amp; j == sourceBytes.length - <span class="number">1</span>) isFound = <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"越界！位置："</span> + (i+j));</span><br><span class="line"><span class="keyword">throw</span>(err);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (i == size - <span class="number">8</span>) &#123;</span><br><span class="line"><span class="built_in">console</span>.error(<span class="string">"\u001b[31m文件找到了，但是没找到定时自毁的代码！或者已经修改过！\u001b[0m"</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[37m已找到定时自毁的代码："</span> + (--i) + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">buffer[i+<span class="number">7</span>] = <span class="number">0x72</span>;</span><br><span class="line">fs.close(fd, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">fs.writeFile(filePath, buffer, &#123;<span class="attr">encoding</span>: <span class="string">"ascii"</span>&#125;, <span class="function"><span class="keyword">function</span> (<span class="params">err</span>) </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (err) &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[31m写入失败！错误信息："</span> + err + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"\u001b[32m"</span> + <span class="string">"写入成功！已去除自毁定时器，现在可以使用AX版Flash了。"</span> + <span class="string">"\u001b[0m"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      稍微简化了一下，整了一个BAT加Node.js的脚本。需要把BAT、demo32.js、demo64.js、和node.exe（Node.js的可执行文件）放进同一目录。然后右键BAT文件以管理员身份运行。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>Github 个人Profile Readme 常用语言卡片 控制比例</title>
    <link href="https://no5972.moe/cms/archivers/64.html"/>
    <id>https://no5972.moe/cms/archivers/64.html</id>
    <published>2021-01-13T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>和之前的控制仓库语言的原理是一样的，这个功能也是通过统计代码量来统计常用语言的占比。所以我們仍然需要使用各个仓库的<code>.gitattributes</code>文件的<code>linguist-language=XXX</code>以及<code>linguist-vendored</code>（后者特别注意）。<br />前者大家都熟悉了，把指定路径的文件视为XXX语言，可以使用星号通配符。<br />主要是后者，这个国内很多地方都没说，统计时忽略指定路径的文件的语言，一般用于引入的现有的第三方提供商JS等代码。</p><p>例如：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">*.bat linguist-language&#x3D;csharp</span><br><span class="line">miniprogram&#x2F;pages&#x2F;index&#x2F;UPNG.js linguist-vendored</span><br><span class="line">miniprogram&#x2F;pages&#x2F;index&#x2F;gifuct-js.js linguist-vendored</span><br><span class="line">miniprogram&#x2F;pages&#x2F;index&#x2F;pako.min.js linguist-vendored</span><br><span class="line">miniprogram&#x2F;pages&#x2F;index&#x2F;jquery*.js linguist-vendored</span><br></pre></td></tr></table></figure><p>通过这两个设置不仅能控制仓库的代码统计，<strong>也可以控制个人Profile Readme 常用语言卡片的语言占比</strong>。</p><hr /><p>此外，Hexo的生成博客仓库可能提交不了<code>.gitattributes</code>文件，这里需要修改两个设置，一个是在<code>source</code>目录的根目录添加<code>.gitattributes</code>文件，另一个是在Hexo的配置文件<code>_config.yml</code>中的<code>deploy</code>设置添加<code>ignore_hidden: false</code>，因为Git Bash会将只有后缀名没有文件名的文件默认视为隐藏文件，这里要把隐藏文件也提交至Github仓库。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">ignore_hidden:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">repo:</span> </span><br><span class="line">    <span class="attr">github:</span> <span class="string">git@github.com:XXX/YYY.git,master</span></span><br><span class="line">    <span class="attr">gitee:</span> <span class="string">git@gitee.com:XXX/YYY.git,master</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      和之前的控制仓库语言的原理是一样的，这个功能也是通过统计代码量来统计常用语言的占比。所以我們仍然需要使用各个仓库的.gitattributes文件的linguist-language=XXX以及linguist-vendored（后者特别注意）。
    
    </summary>
    
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>Edge、Chrome 1月12日之后继续使用Flash的方法（超级专业，高能预警）</title>
    <link href="https://no5972.moe/cms/archivers/63.html"/>
    <id>https://no5972.moe/cms/archivers/63.html</id>
    <published>2021-01-12T18:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.495Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"><a class="markdownIt-Anchor" href="#flash已经停止维护了大家能不用flash就尽量不要用flash停止维护之后此组件会非常不安全"></a> Flash已经停止维护了，大家能不用Flash就尽量不要用Flash，停止维护之后此组件会非常不安全！</h1><p>更新：原来赛尔号吧大佬给的线索是针对AX版Flash的，如果说有需要对AX版Flash（也就是那个OCX）也希望1月12日之后继续使用的话也是用WinHex用相同的方法来修改，打开的不是DLL了，而是打开<code>C:\Windows\System32\Macromed\Flash\Flash.ocx</code>。但是一个比较严重的问题是<code>System32</code>目录下面的文件普遍设置的有文件权限，这个权限是不好修改的。<br />右键<code>Flash.ocx</code>，属性，安全选项卡，高级，把所有者改成<code>Administrators</code>，点击应用，然后重新加载权限窗口，然后点添加，选择主体<code>Administrators</code>，然后选中完全控制。然后一直确定。<br />实在怕改权限麻烦的话可以参考鄙人下一篇文章<a href="65.html">AX版Flash 1月12日之后继续使用Flash的方法</a>把那个批处理和两个Node.js脚本连同Node.js的可执行文件放一起然后右键BAT以管理员身份运行。<strong>注意这个链接是针对AX版的，而不是给Edge、Chrome用的。给Edge、Chrome用的请看下文内容。</strong></p><hr /><p>贴吧赛尔号吧一个大佬提供了一个线索：<a href="https://tieba.baidu.com/p/7189040657?fid=2173925&amp;pid=137447324456#137447324456" target="_blank" rel="noopener">在Flash组件文件的二进制数据里面有明文存储Flash自毁定时器的时间戳。</a>鄙人厚着脸皮找这个大佬问到了这个时间戳在文件里面的16进制数据：<code>00 00 40 46 3E 6F 77 42</code>。</p><p>注意，修改之前请先这个文件备好份，万一改错了还能还原！</p><p><s>因为1月21日更新之后Edge就不再支持Flash了，改好之后的文件和附带的那个<code>manifest.json</code>最好也备个份，到时候可以拷贝到别的浏览器里面继续使用！</s> 22号Edge已经更新了88版本，已经不再支持Flash了。请大家下载绿色版Chrome来使用Flash，有不少绿色版Chrome内置了旧版的Flash Player。</p><p>我们用WinHex打开Edge浏览器里面的<code>pepflashplayer.dll</code>，搜索，查找十六进制数值，把刚才那个十六进制码输入进去（不要空格）。果不其然，在PPAPI的DLL里面也发现了这个十六进制码！<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210113015442928.png" alt="在这里插入图片描述" /><br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210113015704386.png" alt="在这里插入图片描述" /></p><p>目前Edge浏览器的Flash版本是32.0.0.465。在版本32.0.0.465的PPAPI的DLL里面，这个时间戳的位置是<code>015F6C68</code>。</p><p>先别管那么多，根据计算机常识，数据通常是小端存储，二进制的最高位通常是符号位。我们就把这一串的最后那个字节<code>42</code>想个什么办法改大一点，但是也不要超过<code>80</code>，不然可能就变成负数了。所以我们就暂且先把他改成<code>72</code>。保存之，替换到Edge的原来文件。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/2021011301592869.png" alt="在这里插入图片描述" /></p><p>再打开一个Flash的网页，可以加载Flash了！<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210113015344268.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      先别管那么多，根据计算机常识，数据通常是小端存储，二进制的最高位通常是符号位。我们就把这一串的最后那个字节42想个什么办法改大一点，但是也不要超过80，不然可能就变成负数了。所以我们就暂且先把他改成72。保存之，替换到Edge的原来文件。再打开一个Flash的网页，可以加载Flash了！
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>百分浏览器继续使用Flash Player的临时解决方案！</title>
    <link href="https://no5972.moe/cms/archivers/62.html"/>
    <id>https://no5972.moe/cms/archivers/62.html</id>
    <published>2021-01-12T01:45:00.000Z</published>
    <updated>2023-03-15T10:29:24.491Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>21.01.13更新：百分浏览器已经将自动下载的Flash改成了下载32.0.0.371的版本，据浏览器论坛超版回应，这个是最后一个没加定时自毁的版本。大家可以不用替换文件和屏蔽域名了。</strong></p><hr /><p>百分浏览器会自动下载版本32的Flash Player放进浏览器的安装目录，这样的话即使是手动替换了Flash Player组件文件也会被新版的Flash Player覆盖掉，<strong>而新版Flash Player今天已经自毁了，无法使用！</strong> 所以我们得想办法阻止覆盖！</p><p>没有这个浏览器的用户如果要使用这个浏览器，应该下载32位便携版的百分浏览器。</p><p>已经猜测出浏览器自动下载Flash Player的域名：<code>static.centbrowser.cn</code>。</p><p>大家需要手动将29版本的Flash Player组件文件放进浏览器的<code>User Data\PepperFlash</code>目录！如果有原来的文件则需要覆盖！通常是两个文件：<code>pepflashplayer.dll</code>和<code>manifest.json</code>。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20210112094602630.png" alt="在这里插入图片描述" /><br />然后在运行之前从hosts屏蔽这个域名！</p><p>打开<code>C:\Windows\System32\drivers\etc\hosts</code>这个文件，添加一行这样的内容以屏蔽这个域名。注意IP和域名之间有一个空格。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1 static.centbrowser.cn</span><br></pre></td></tr></table></figure><div class="note warning"><p>但是这样的话就不能再从官网重新下载浏览器了，官网这个下载链接也是来自这个域名的。如果需要从官网重新下载浏览器， 则需要将hosts的这个域名解除屏蔽。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      百分浏览器会自动下载版本32的Flash Player放进浏览器的安装目录，这样的话即使是手动替换了Flash Player组件文件也会被新版的Flash Player覆盖掉，而新版Flash Player今天已经自毁了，无法使用！ 所以我们得想办法阻止覆盖！
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>手把手教学：使用油猴脚本对CCTV央视网启用HTML5播放器</title>
    <link href="https://no5972.moe/cms/archivers/61.html"/>
    <id>https://no5972.moe/cms/archivers/61.html</id>
    <published>2021-01-11T01:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.491Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Flash Player明天就会阻止加载Flash内容。但是CCTV也仅仅是把新出的视频启用了H5播放器，之前的视频仍然需要Flash插件才能播放。很多人说装一个油猴脚本，可是问题是，不是所有人都玩得转这个油猴脚本的。这里提供一个比较详细的说明来阐释安装过程。</p><ol><li>打开平时用的网页浏览器，打开扩展商店。<ul><li>Edge浏览器是右上角三个点的按钮，扩展，获取Microsoft Edge扩展。</li><li>Chrome浏览器是右上角的三个点的按钮，更多工具，扩展程序，获取更多扩展程序。</li><li>360极速浏览器是点击搜索框右侧的扩展中心图标。</li><li>360安全浏览器是点击恢复关闭标签页左侧的扩展中心图标。</li><li>搜狗浏览器是右键单击地址栏下方的空白处会出现一个下拉列表，选择扩展栏。地址栏右侧会出现目前拥有的扩展项目，点击最右侧的按钮。选择右下角的“管理”。界面显示的是目前使用的扩展应用，点击右上角的“获取更多扩展”。</li><li>猎豹浏览器是点击左上角图标，猎豹应用市场。</li><li>QQ浏览器是点击右上角的三条横线的按钮，应用中心。</li><li>2345浏览器是点击搜索框右侧的应用推荐按钮，获取更多应用。</li></ul></li><li>搜索TamperMonkey，找到这个图标的插件，点击添加/立即添加/添加到浏览器/安装/立即安装/安装到浏览器。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/0b8e131b7908ff7dfbd5933f8fa4caab.png" alt="" /></li><li>在确认安装的对话框点击确认。</li><li>然后打开<a href="https://greasyfork.org" target="_blank" rel="noopener">https://greasyfork.org</a> ，在搜索框中输入<code>HTML5 on CCTV</code>，如果显示No scripts found的话点击 Show results for all languages. 此时会看到一个搜索结果，点开。</li><li>点击安装此脚本，然后会跳转到油猴的确认添加界面，在这个界面点击确认。</li><li>此时再打开央视网，点开要看的视频，视频应该可以播放了。之前打开的央视网视频需要刷新一下。</li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Flash Player明天就会阻止加载Flash内容。但是CCTV也仅仅是把新出的视频启用了H5播放器，之前的视频仍然需要Flash插件才能播放。很多人说装一个油猴脚本，可是问题是，不是所有人都玩得转这个油猴脚本的。这里提供一个比较详细的说明来阐释安装过程。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>B站 屏蔽空格弹幕</title>
    <link href="https://no5972.moe/cms/archivers/60.html"/>
    <id>https://no5972.moe/cms/archivers/60.html</id>
    <published>2021-01-10T06:15:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>每次视频一点开顶部一堆空格分隔的弹幕，与视频毫不相干。恨死了，鄙人今天非把这些弹幕屏蔽了。😒<br />手机端：全屏播放，弹幕设置图标，屏蔽管理，然后输入<code>/\x20/</code>然后添加即可。<br />电脑端：展开弹幕列表，点击三个点的按钮，选择屏蔽设定，然后输入<code>/\x20/</code>然后添加即可。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      每次视频一点开顶部一堆空格分隔的弹幕，与视频毫不相干。恨死了，鄙人今天非把这些弹幕屏蔽了。😒
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>CMD命令行Chrome自动网页截图到文件，截图完后自动退出浏览器</title>
    <link href="https://no5972.moe/cms/archivers/59.html"/>
    <id>https://no5972.moe/cms/archivers/59.html</id>
    <published>2021-01-08T04:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>英文内容来自：<a href="https://developers.google.com/web/updates/2017/04/headless-chrome?hl=en#screenshots" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Eric%20Bidelman-Getting%20Started%20with%20Headless%20Chrome-brightgreen" alt="Eric Bidelman-Getting Started with Headless Chrome" /></a></p><h1 id="taking-screenshots-截图"><a class="markdownIt-Anchor" href="#taking-screenshots-截图"></a> Taking screenshots 截图</h1><p>To capture a screenshot of a page, use the <code>--screenshot</code>flag:<br />要对页面截图，只需使用<code>--screenshot</code>参数即可：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">chrome --headless --<span class="built_in">disable</span>-gpu --screenshot https://www.baidu.com/</span><br><span class="line"></span><br><span class="line"><span class="comment"># Size of a standard letterhead. 标准的信件比例</span></span><br><span class="line">chrome --headless --<span class="built_in">disable</span>-gpu --screenshot --window-size=1280,1696 https://www.baidu.com/</span><br><span class="line"></span><br><span class="line"><span class="comment"># Nexus 5x</span></span><br><span class="line">chrome --headless --<span class="built_in">disable</span>-gpu --screenshot --window-size=412,732 https://www.baidu.com/</span><br></pre></td></tr></table></figure><p>Running with <code>--screenshot</code>will produce a file named <code>screenshot.png</code>in the current working directory. If you’re looking for full page screenshots, things are a tad more involved. There’s a great blog post from David Schnurr that has you covered. Check out <a href="https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a" target="_blank" rel="noopener">Using headless Chrome as an automated screenshot tool</a>.<br />使用<code>--screenshot</code>参数会在当前目录生成一个名为<code>screenshot.png</code>的文件（编注：截图完成后浏览器会自动退出）。如果需要对整个页面截图的话还需要再加点东西。这里有一个David Schnurr写的博文<a href="https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a" target="_blank" rel="noopener">《使用无界面Chrome作为自动截图工具》</a>可以参考一下。</p><hr /><p>编注：把鄙人之前那篇文章 <a href="https://blog.csdn.net/qq_35977139/article/details/111552903" target="_blank" rel="noopener">提供一个在Selenium截网页长图的实现</a> 稍微改动一下就可以了，之前那篇文章是接入现有浏览器，只需要改成无界面模式（headless）并且改成启动新的浏览器（<code>chrome_options</code>里面不设置<code>debugger_address</code>），网页截图完成后加一个<code>driver.quit()</code>就可以自动关闭浏览器。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line"><span class="keyword">from</span> base64 <span class="keyword">import</span> b64decode</span><br><span class="line"><span class="keyword">from</span> sys <span class="keyword">import</span> argv</span><br><span class="line"></span><br><span class="line"><span class="comment"># 改成启动新的浏览器，使用headless无界面浏览器模式</span></span><br><span class="line">options = webdriver.ChromeOptions() </span><br><span class="line"><span class="comment"># 增加无界面选项</span></span><br><span class="line">chrome_options.add_argument(<span class="string">'--headless'</span>) </span><br><span class="line"><span class="comment"># 如果不加这个选项，有时定位会出现问题</span></span><br><span class="line">chrome_options.add_argument(<span class="string">'--disable-gpu'</span>) </span><br><span class="line"><span class="comment"># 启动浏览器</span></span><br><span class="line">driver = webdriver.Chrome(options=options)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 访问页面，这里可以改成获取启动参数 argv[1]</span></span><br><span class="line">driver.get(<span class="string">"https://www.baidu.com"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 取出页面的宽度和高度</span></span><br><span class="line">page_width = driver.execute_script(<span class="string">"return document.body.scrollWidth"</span>)</span><br><span class="line">page_height = driver.execute_script(<span class="string">"return document.body.scrollHeight"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 直接开启设备模拟，不要再手动开devtools了，否则截图截的是devtools的界面！</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.setDeviceMetricsOverride'</span>, &#123;<span class="string">'mobile'</span>:<span class="literal">False</span>, <span class="string">'width'</span>:page_width, <span class="string">'height'</span>:page_height, <span class="string">'deviceScaleFactor'</span>: <span class="number">1</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行截图</span></span><br><span class="line">res = driver.execute_cdp_cmd(<span class="string">'Page.captureScreenshot'</span>, &#123; <span class="string">'fromSurface'</span>: <span class="literal">True</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 返回的base64内容写入PNG文件</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'screenshot.png'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    img = b64decode(res[<span class="string">'data'</span>])</span><br><span class="line">    f.write(img)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 等待截图完成</span></span><br><span class="line">sleep(<span class="number">15</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭设备模拟</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.clearDeviceMetricsOverride'</span>, &#123;&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭浏览器</span></span><br><span class="line">driver.quit()</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      https://github.com/search?l=&amp;q=filename%3Apepflashplayer.dll&amp;type=code，点开看一下分支名字，看下有没有Releases，如果有的话访问https://cdn.jsdelivr.net/gh/用户名或组织名/仓库名@分支名/路径/pepflashplayer.dll就可以下载了。如果有需要manifest.json的话试着把最后的文件名改成这个，可能会报“Couldn&#39;t find the requested file”。如果报的话就再换一个搜索结果看看。
    
    </summary>
    
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>【绝对机密】github上面有些零散的PPAPI Flash Player的DLL文件下载</title>
    <link href="https://no5972.moe/cms/archivers/58.html"/>
    <id>https://no5972.moe/cms/archivers/58.html</id>
    <published>2020-12-30T03:30:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="https://github.com/search?l=&amp;q=filename%3Apepflashplayer.dll&amp;type=code" target="_blank" rel="noopener">https://github.com/search?l=&amp;q=filename%3Apepflashplayer.dll&amp;type=code</a><br />点开看一下分支名字，看下有没有Releases，如果有的话访问</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;gh&#x2F;用户名或组织名&#x2F;仓库名@分支名&#x2F;路径&#x2F;pepflashplayer.dll</span><br></pre></td></tr></table></figure><p>就可以下载了。<br />如果有需要<code>manifest.json</code>的话试着把最后的文件名改成这个，可能会报“Couldn’t find the requested file”。如果报的话就再换一个搜索结果看看。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      https://github.com/search?l=&amp;q=filename%3Apepflashplayer.dll&amp;type=code，点开看一下分支名字，看下有没有Releases，如果有的话访问https://cdn.jsdelivr.net/gh/用户名或组织名/仓库名@分支名/路径/pepflashplayer.dll就可以下载了。如果有需要manifest.json的话试着把最后的文件名改成这个，可能会报“Couldn&#39;t find the requested file”。如果报的话就再换一个搜索结果看看。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>如何不用递归遍历二叉树</title>
    <link href="https://no5972.moe/cms/archivers/57.html"/>
    <id>https://no5972.moe/cms/archivers/57.html</id>
    <published>2020-12-29T01:30:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://zhuanlan.zhihu.com/p/260494484" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%BB%A3%E7%A0%81%E9%9A%8F%E6%83%B3%E5%BD%95-%E4%BA%8C%E5%8F%89%E6%A0%91%EF%BC%9A%E5%90%AC%E8%AF%B4%E9%80%92%E5%BD%92%E8%83%BD%E5%81%9A%E7%9A%84%EF%BC%8C%E6%A0%88%E4%B9%9F%E8%83%BD%E5%81%9A%EF%BC%81-brightgreen" alt="知乎专栏-代码随想录" /></a></p><blockquote><p>其实递归的底层实现就是栈</p></blockquote><p>看完本篇大家可以使用迭代法，再重新解决如下三道leetcode上的题目：</p><ul><li><ol start="144"><li>二叉树的前序遍历</li></ol></li><li><ol start="94"><li>二叉树的中序遍历</li></ol></li><li><ol start="145"><li>二叉树的后序遍历</li></ol></li></ul><p>为什么可以用迭代法（非递归的方式）来实现二叉树的前后中序遍历呢？</p><p>我们在<a href="https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&amp;mid=2247484545&amp;idx=1&amp;sn=1011751367be8e3fbc60d12669d70b53&amp;scene=21#wechat_redirect" target="_blank" rel="noopener">栈与队列：匹配问题都是栈的强项</a>中提到了，<strong>「递归的实现就是：每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中」</strong> ，然后递归返回的时候，从栈顶弹出上一次递归的各项参数，所以这就是递归为什么可以返回上一层位置的原因。</p><p>此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。</p><h1 id="前序遍历迭代法"><a class="markdownIt-Anchor" href="#前序遍历迭代法"></a> 前序遍历（迭代法）</h1><p>我们先看一下前序遍历。</p><p>前序遍历是中左右，每次先处理的是中间节点，那么先将跟节点放入栈中，然后将右孩子加入栈，再加入左孩子。</p><p>为什么要先加入 右孩子，再加入左孩子呢？因为这样出栈的时候才是中左右的顺序。</p><p>动画如下：</p><p><a href="https://imgchr.com/i/r7L7v9" target="_blank" rel="noopener"><img src="https://s3.ax1x.com/2020/12/29/r7L7v9.gif" alt="r7L7v9.gif" /></a></p><p>不难写出如下代码:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">preorderTraversal</span><span class="params">(TreeNode* root)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">stack</span>&lt;TreeNode*&gt; st;</span><br><span class="line">        <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; result;</span><br><span class="line">        st.push(root);</span><br><span class="line">        <span class="keyword">while</span> (!st.empty()) &#123;</span><br><span class="line">            TreeNode* node = st.top();                      <span class="comment">// 中</span></span><br><span class="line">            st.pop();</span><br><span class="line">            <span class="keyword">if</span> (node != <span class="literal">NULL</span>) result.push_back(node-&gt;val);</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">continue</span>;</span><br><span class="line">            st.push(node-&gt;right);                           <span class="comment">// 右</span></span><br><span class="line">            st.push(node-&gt;left);                            <span class="comment">// 左</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>此时会发现貌似使用迭代法写出前序遍历并不难，确实不难。</p><p><strong>「此时是不是想改一点前序遍历代码顺序就把中序遍历搞出来了？」</strong></p><p>其实还真不行！</p><p>但接下来，<strong>「再用迭代法写中序遍历的时候，会发现套路又不一样了，目前的前序遍历的逻辑无法直接应用到中序遍历上。」</strong></p><h1 id="中序遍历迭代法"><a class="markdownIt-Anchor" href="#中序遍历迭代法"></a> 中序遍历（迭代法）</h1><p>为了解释清楚，我说明一下 刚刚在迭代的过程中，其实我们有两个操作：</p><ol><li><strong>「处理：将元素放进<code>result</code>数组中」</strong></li><li><strong>「访问：遍历节点」</strong><br />分析一下为什么刚刚写的前序遍历的代码，不能和中序遍历通用呢，因为前序遍历的顺序是中左右，先访问的元素是中间节点，要处理的元素也是中间节点，所以刚刚才能写出相对简洁的代码，<strong>「因为要访问的元素和要处理的元素顺序是一致的，都是中间节点。」</strong></li></ol><p>那么再看看中序遍历，中序遍历是左中右，先访问的是二叉树顶部的节点，然后一层一层向下访问，直到到达树左面的最底部，再开始处理节点（也就是在把节点的数值放进<code>result</code>数组中），这就造成了**「处理顺序和访问顺序是不一致的。」**</p><p>那么**「在使用迭代法写中序遍历，就需要借用指针的遍历来帮助访问节点，栈则用来处理节点上的元素。」**</p><p>动画如下：</p><p><a href="https://imgchr.com/i/r7LbuR" target="_blank" rel="noopener"><img src="https://s3.ax1x.com/2020/12/29/r7LbuR.gif" alt="r7LbuR.gif" /></a></p><p><strong>「中序遍历，可以写出如下代码：」</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">inorderTraversal</span><span class="params">(TreeNode* root)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; result;</span><br><span class="line">        <span class="built_in">stack</span>&lt;TreeNode*&gt; st;</span><br><span class="line">        TreeNode* cur = root;</span><br><span class="line">        <span class="keyword">while</span> (cur != <span class="literal">NULL</span> || !st.empty()) &#123;</span><br><span class="line">            <span class="keyword">if</span> (cur != <span class="literal">NULL</span>) &#123; <span class="comment">// 指针来访问节点，访问到最底层</span></span><br><span class="line">                st.push(cur); <span class="comment">// 讲访问的节点放进栈</span></span><br><span class="line">                cur = cur-&gt;left;                <span class="comment">// 左</span></span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                cur = st.top(); <span class="comment">// 从栈里弹出的数据，就是要处理的数据（放进result数组里的数据）</span></span><br><span class="line">                st.pop();</span><br><span class="line">                result.push_back(cur-&gt;val);     <span class="comment">// 中</span></span><br><span class="line">                cur = cur-&gt;right;               <span class="comment">// 右</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h1 id="后序遍历迭代法"><a class="markdownIt-Anchor" href="#后序遍历迭代法"></a> 后序遍历（迭代法）</h1><p>再来看后序遍历，先序遍历是中左右，后续遍历是左右中，那么我们只需要调整一下先序遍历的代码顺序，就变成中右左的遍历顺序，然后在反转<code>result</code>数组，输出的结果顺序就是左右中了，如下图：</p><p><a href="https://imgchr.com/i/r7LTgJ" target="_blank" rel="noopener"><img src="https://s3.ax1x.com/2020/12/29/r7LTgJ.png" alt="r7LTgJ.png" /></a></p><p><strong>「所以后序遍历只需要前序遍历的代码稍作修改就可以了，代码如下：」</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">postorderTraversal</span><span class="params">(TreeNode* root)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">stack</span>&lt;TreeNode*&gt; st;</span><br><span class="line">        <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; result;</span><br><span class="line">        st.push(root);</span><br><span class="line">        <span class="keyword">while</span> (!st.empty()) &#123;</span><br><span class="line">            TreeNode* node = st.top();</span><br><span class="line">            st.pop();</span><br><span class="line">            <span class="keyword">if</span> (node != <span class="literal">NULL</span>) result.push_back(node-&gt;val);</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">continue</span>;</span><br><span class="line">            st.push(node-&gt;left); <span class="comment">// 相对于前序遍历，这更改一下入栈顺序</span></span><br><span class="line">            st.push(node-&gt;right);</span><br><span class="line">        &#125;</span><br><span class="line">        reverse(result.<span class="built_in">begin</span>(), result.<span class="built_in">end</span>()); <span class="comment">// 将结果反转之后就是左右中的顺序了</span></span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h1 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h1><p>此时我们用迭代法写出了二叉树的前后中序遍历，大家可以看出前序和中序是完全两种代码风格，并不想递归写法那样代码稍做调整，就可以实现前后中序。</p><p><strong>「这是因为前序遍历中访问节点（遍历节点）和处理节点（将元素放进<code>result</code>数组中）可以同步处理，但是中序就无法做到同步！」</strong></p><p>上面这句话，可能一些同学不太理解，建议自己亲手用迭代法，先写出来前序，再试试能不能写出中序，就能理解了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      此时我们用迭代法写出了二叉树的前后中序遍历，大家可以看出前序和中序是完全两种代码风格，并不想递归写法那样代码稍做调整，就可以实现前后中序。这是因为前序遍历中访问节点（遍历节点）和处理节点（将元素放进result数组中）可以同步处理，但是中序就无法做到同步！
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>提供一个Java SE程序打单个EXE包部署到不带JRE电脑运行的实现（有点复杂）</title>
    <link href="https://no5972.moe/cms/archivers/56.html"/>
    <id>https://no5972.moe/cms/archivers/56.html</id>
    <published>2020-12-28T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>详细步骤：</p><ol><li>在IDE中打一个Runnable JAR。<ul><li>Eclipse右键整个项目-Export-Java-Runnable JAR File，Library Handling前两个都可以，第三个比较麻烦不建议用。</li><li>IDEA点击File-Project Structure-Artifacts，点击加号，JAR，From Modules and Dependencies，选中启动的那个模块，选择启动主类，选择Extract to the target JAR。然后点击Build-Build Artifacts，然后选中刚才添加的JAR即可。</li></ul></li><li>将JRE目录拷贝一份出来，重命名为<code>jre</code>。</li><li>使用exe4j把JAR包转换成EXE。<ul><li>Project Type选择&quot;JAR in EXE mode&quot;</li><li>Application Info是EXE属性附加信息的内容，以及生成EXE文件的位置。</li><li>Executable Info的Executable Name是生成EXE文件的名字，Icon File可以用来指定生成EXE文件的图标。其他保持默认。</li><li>Java Invocation里面的列表要添加第一步生成的JAR文件。</li><li>JRE那一步的Search Sequence里面别的都不要，只设置一个Directory里面填<code>.\jre</code>。</li><li>Splash Screen用来指定刚运行EXE时显示的Logo界面，可以不指定。</li><li>Messages用来指定如果环境出错显示什么样的错误信息。默认是英文的提示，可以改成中文但是翻译量是比较大的。</li></ul></li><li>把EXE文件和<code>jre</code>目录放在同一个目录。</li><li>使用《单文件软件封装工具》（标题栏有QQ号，右下角状态栏显示压缩率的那个）把存放EXE和<code>jre</code>的目录打包成单个EXE文件。<ul><li>选择程序目录，选择这个存放EXE和<code>jre</code>的目录。</li><li>选择执行程序，选择这个EXE文件。</li><li>选择保存路径，选择要导出单个EXE文件的位置。</li><li>选择文件图标，可以指定单独的ICO图标，如果在exe4j中设置了图标也可以指定EXE文件。</li><li>附加信息是EXE属性附加信息的内容，可以选择性设置。</li><li>使用7z模式打包出来的EXE启动稍微快一些。</li></ul></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      在IDE中打一个Runnable JAR。将JRE目录拷贝一份出来，重命名为jre。使用exe4j把JAR包转换成EXE。把EXE文件和jre目录放在同一个目录。使用《单文件软件封装工具》（标题栏有QQ号，右下角状态栏显示压缩率的那个）把存放EXE和jre的目录打包成单个EXE文件。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>提供一个在Selenium截网页长图的实现</title>
    <link href="https://no5972.moe/cms/archivers/55.html"/>
    <id>https://no5972.moe/cms/archivers/55.html</id>
    <published>2020-12-22T07:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.491Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>最近研究控制Chrome API来进行自动截图的方法。然后就看到了博客园的文章<a href="https://www.cnblogs.com/superhin/archive/2004/01/13/11481910.html" target="_blank" rel="noopener">https://www.cnblogs.com/superhin/archive/2004/01/13/11481910.html</a> 。文章说Selenium并不支持对整个页面截图，原因是Chrome虽然在开发者工具中提供了“Capture full size screenshot”的Run Command，但是在CDP中并没有提供<code>executeCdpCommand</code>的命令。<br />为了解决这个问题，鄙人把Chromium的源代码扒了出来，然后看到这个“Capture full size screenshot”实际上走的是先设置了一个设备模拟把高度调成和页面高度一样，然后再截当前屏幕截图。<br />鄙人也留意了一下国外的编程社区，发现国外基本上也是这么干的，临时设置了一个设备模拟，然后截当前屏幕的截图，截好图了再把设备模拟关闭。<br />这样的话使用Python语言操作如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="comment"># 接入既有的浏览器进程</span></span><br><span class="line">options = webdriver.ChromeOptions()</span><br><span class="line">options.debugger_address = <span class="string">"127.0.0.1:9222"</span></span><br><span class="line">driver = webdriver.Chrome(options=options)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 取出页面的宽度和高度</span></span><br><span class="line">page_width = driver.execute_script(<span class="string">"return document.body.scrollWidth"</span>)</span><br><span class="line">page_height = driver.execute_script(<span class="string">"return document.body.scrollHeight"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 直接开启设备模拟，不要再手动开devtools了，否则截图截的是devtools的界面！</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.setDeviceMetricsOverride'</span>, &#123;<span class="string">'mobile'</span>:<span class="literal">False</span>, <span class="string">'width'</span>:page_width, <span class="string">'height'</span>:page_height, <span class="string">'deviceScaleFactor'</span>: <span class="number">1</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行截图</span></span><br><span class="line">res = driver.execute_cdp_cmd(<span class="string">'Page.captureScreenshot'</span>, &#123; <span class="string">'fromSurface'</span>: <span class="literal">True</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 返回的base64内容写入PNG文件</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'hao123.png'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    img = base64.b64decode(res[<span class="string">'data'</span>])</span><br><span class="line">    f.write(img)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 等待截图完成</span></span><br><span class="line">sleep(<span class="number">15</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭设备模拟</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.clearDeviceMetricsOverride'</span>, &#123;&#125;)</span><br></pre></td></tr></table></figure><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20201222151946455.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最近研究控制Chrome API来进行自动截图的方法。然后就看到了博客园的文章。文章说Selenium并不支持对整个页面截图，原因是Chrome虽然在开发者工具中提供了“Capture full size screenshot”的Run Command，但是在CDP中并没有提供executeCdpCommand的命令。鄙人也留意了一下国外的编程社区，发现国外基本上也是这么干的，临时设置了一个设备模拟，然后截当前屏幕的截图，截好图了再把设备模拟关闭。
    
    </summary>
    
    
      <category term="Python" scheme="https://no5972.moe/cms/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>Python Selenium Chrome 控制Devtools 一些线索</title>
    <link href="https://no5972.moe/cms/archivers/54.html"/>
    <id>https://no5972.moe/cms/archivers/54.html</id>
    <published>2020-12-19T03:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><ol><li>Chrome WebDriver下载地址：<a href="http://chromedriver.storage.googleapis.com/index.html" target="_blank" rel="noopener">http://chromedriver.storage.googleapis.com/index.html</a><br /><s>注意和国产浏览器的内核版本对应（星愿浏览器80.0.3987.163内核可以使用80.0.3987.106的webdriver）</s><br />只要浏览器的内核版本不低于WebDriver的版本即可。Nuget上的最低版本是71的，所以QQ浏览器无法使用C#控制，QQ只有版本70的内核。</li><li>如果要先开浏览器再用Selenium控制的话，需要给浏览器添加启动参数：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">twinkstar.exe --remote-debugging-port=9222</span><br></pre></td></tr></table></figure><ol start="3"><li>Python调用现有星愿浏览器的初始化</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line">options = webdriver.ChromeOptions()</span><br><span class="line">options.debugger_address = <span class="string">"127.0.0.1:9222"</span></span><br><span class="line">driver = webdriver.Chrome(options=options)</span><br></pre></td></tr></table></figure><ol start="4"><li>使用Devtools内建的截图功能！（内核59开始支持，详见<a href="https://developers.google.com/web/updates/2017/04/devtools-release-notes" target="_blank" rel="noopener">https://developers.google.com/web/updates/2017/04/devtools-release-notes</a>）</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line">res = driver.execute_cdp_cmd(<span class="string">'Page.captureScreenshot'</span>, &#123;&#125;)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'hao123.png'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    img = base64.b64decode(res[<span class="string">'data'</span>])</span><br><span class="line">    f.write(img)</span><br></pre></td></tr></table></figure><ol start="5"><li>Flash缩放的JS原生方法是<code>Zoom(percentage)</code>，其中<code>percentage</code>是放大倍率的倒数乘以100，例如放大4倍就是1/4*100=25。</li><li>Flash缩放之后，移动视野的JS原生方法是<code>Pan(x_position,y_position,mode)</code>。</li></ol><ul><li><code>x_position</code>参数是移动横坐标数，可以给负值</li><li><code>y_position</code>参数是移动纵坐标数，可以给负值</li><li><code>mode</code><s>参数暂时不清楚，先填1</s> 表示表示坐标的单位，但其值为“0”时,以象数为单位，为“1”时，以百分比为单位。</li></ul><ol start="7"><li>设置模拟设备的CDP命令是</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'Emulation.setDeviceMetricsOverride'</span>, &#123;</span><br><span class="line">  mobile: <span class="literal">true</span>,</span><br><span class="line">  width: <span class="number">412</span>,</span><br><span class="line">  height: <span class="number">732</span>,</span><br><span class="line">  deviceScaleFactor: <span class="number">2.625</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="8"><li>Python Selenium指定截取区域的命令是</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">clip = driver.execute_script(<span class="string">'return &#123;x: 0, y: 0, width: 4320, height: 7680, scale: 1&#125;;'</span>, <span class="string">''</span>) <span class="comment"># 模拟的是竖屏</span></span><br><span class="line">res = driver.execute_cdp_cmd(<span class="string">'Page.captureScreenshot'</span>, &#123;<span class="string">'clip'</span>: clip&#125;)</span><br></pre></td></tr></table></figure><ol start="9"><li>综上，Python需要执行的操作有（截小花仙页游选人界面的高清图（正中间那个））</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="comment"># 接入既有的浏览器进程</span></span><br><span class="line">options = webdriver.ChromeOptions()</span><br><span class="line">options.debugger_address = <span class="string">"127.0.0.1:9222"</span></span><br><span class="line">driver = webdriver.Chrome(options=options)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 直接开启设备模拟，不要再手动开devtools了，否则截图截的是devtools的界面！</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.setDeviceMetricsOverride'</span>, &#123;<span class="string">'mobile'</span>:<span class="literal">False</span>, <span class="string">'width'</span>:<span class="number">4320</span>, <span class="string">'height'</span>:<span class="number">7680</span>, <span class="string">'deviceScaleFactor'</span>: <span class="number">1</span>&#125;)</span><br><span class="line"><span class="comment"># 缩放Flash</span></span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Zoom(100)'</span>)</span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Zoom(25)'</span>)</span><br><span class="line"><span class="comment"># Flash缩放后的视野位置微调，还需要完善</span></span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Pan(0,-300,0)'</span>) </span><br><span class="line"><span class="comment"># 执行截图</span></span><br><span class="line">res = driver.execute_cdp_cmd(<span class="string">'Page.captureScreenshot'</span>, &#123; <span class="string">'fromSurface'</span>: <span class="literal">True</span>&#125;)</span><br><span class="line"><span class="comment"># 返回的base64内容写入PNG文件</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'hao123.png'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    img = base64.b64decode(res[<span class="string">'data'</span>])</span><br><span class="line">    f.write(img)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭设备模拟</span></span><br><span class="line">driver.execute_cdp_cmd(<span class="string">'Emulation.clearDeviceMetricsOverride'</span>, &#123;&#125;)</span><br><span class="line"><span class="comment"># Flash缩放复原</span></span><br><span class="line">driver.execute_script(<span class="string">'document.getElementsByTagName("embed")[0].Zoom(500)'</span>)</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      只要浏览器的内核版本不低于webdriver的版本即可。Nuget上的最低版本是71的，所以QQ浏览器无法使用C#控制，QQ只有版本70的内核。
    
    </summary>
    
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
      <category term="Python" scheme="https://no5972.moe/cms/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>西一爱服 小花仙登录器下载地址和项目代码</title>
    <link href="https://no5972.moe/cms/archivers/52.html"/>
    <id>https://no5972.moe/cms/archivers/52.html</id>
    <published>2020-12-18T02:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>下载地址：<a href="https://www.lanzous.com/iivU9jgdclg" target="_blank" rel="noopener">https://www.lanzous.com/iivU9jgdclg</a><br />项目地址：<a href="https://github.com/No5972/CEFHuaClient" target="_blank" rel="noopener">https://github.com/No5972/CEFHuaClient</a></p><p>这个是UP主自制的一个小花仙的登录器，用C#编写的，如果不放心可以用软件反编译查看源代码。<br />怕一些杀软查杀，弄了一个数字签名，但是有没有用就不知道了。<br />登录器后续会开源到Github，基于BSD-3-Clause协议开源，禁止商用。如有商用，欢迎举报。<br />体积有点大，打包之后的zip有80多M，解压后将近200M，这是因为登录器使用CEF来作为Flash的渲染容器，也就是说登录器内嵌了一个谷歌浏览器Chromium！单一个CEF库就有100多M。<br />目前主要解决3个问题<br />一个是Flash即将停止支持，这个登录器实现了在没有Flash组件的电脑上也能正常使用。但是不排除后续会移除，改为由玩家自行选择Flash组件文件的位置。<br />第二个是广大小花仙玩家希望要的一个功能，将游戏画面缩放到较高的分辨率尺寸。本登录器已经实现了缩放到4K、8K级别的高清分辨率，并且即使是超出屏幕分辨率也能完整加载。就是窗口尺寸已经超出了屏幕的显示范围，如果要查看画面的其他部分的话需要多次拖动标题栏。<br />第三个就是截图功能，通常配合第二个缩放画面的功能使用。即使是缩放画面超出了屏幕的显示，或者被其他的窗口挡住了，这个截图功能也能截取到完整的游戏画面。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这个是UP主自制的一个小花仙的登录器，用C#编写的，如果不放心可以用软件反编译查看源代码。怕一些杀软查杀，弄了一个数字签名，但是有没有用就不知道了。登录器后续会开源到Github，基于BSD-3-Clause协议开源，禁止商用。如有商用，欢迎举报。
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
    
  </entry>
  
  <entry>
    <title>C# CEF 使用内置devtools对整个网页截图</title>
    <link href="https://no5972.moe/cms/archivers/51.html"/>
    <id>https://no5972.moe/cms/archivers/51.html</id>
    <published>2020-12-17T10:00:00.000Z</published>
    <updated>2022-01-19T02:24:29.558Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>22.01.19 更新：刚刚发现这个并不是整页截图。这个 <code>CaptureScreenshotAsync</code> 如果不事先设置的话确实默认只能截取当前视口范围内显示的图像，如果要整页截图的话得先调用  <code>CefSharp.DevTools.Emulation.EmulationClient.SetDeviceMetricsOverrideAsync</code> 开启设备模拟，把模拟设备分辨率的高度改成和页面高度一致，然后再执行前者方法来截图。截图完了再调用  <code>CefSharp.DevTools.Emulation.EmulationClient.ClearDeviceMetricsOverrideAsync</code> 关闭设备模拟。手头没有 C# 的开发环境，代码暂时先不贴了。</p><hr /><p>21.01.18更新：<a href="https://bbs.csdn.net/topics/398544662" target="_blank" rel="noopener">CSDN论坛的大佬给出了一个解决方案</a>，可以多次调用截图了。这里也贴出来供参考。<br />这里改成了用全局变量的<code>PageClient</code>来暂存页面对象。因为如果把这个定义语句放在方法里面的话还是会报错“Generated MessageID 100002 doesn’t match returned Message Id 100001”，所以要放在全局变量里面才行。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">CefSharp.DevTools.Page.PageClient pageClien= <span class="literal">null</span>;</span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">async</span> <span class="keyword">void</span> <span class="title">invokeCapture</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(pageClien==<span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        pageClien =  webBrowser.GetBrowser().GetDevToolsClient().Page;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> result = <span class="keyword">await</span> pageClien.CaptureScreenshotAsync();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (result.Data != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line">        MemoryStream ms = <span class="keyword">new</span> MemoryStream(result.Data);</span><br><span class="line">        ms.Write(result.Data, <span class="number">0</span>, result.Data.Length);</span><br><span class="line"></span><br><span class="line">        SaveFileDialog dialog = <span class="keyword">new</span> SaveFileDialog();</span><br><span class="line">        dialog.Filter = <span class="string">"PNG图片 (*.PNG)|*.PNG"</span>;</span><br><span class="line">        DialogResult dresult = dialog.ShowDialog();</span><br><span class="line">        <span class="keyword">if</span> (dresult == DialogResult.OK)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">string</span> path = dialog.FileName;</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                File.WriteAllBytes(path, result.Data);</span><br><span class="line">                MessageBox.Show(path + <span class="string">"保存成功。"</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span> (Exception e)</span><br><span class="line">            &#123;</span><br><span class="line">                MessageBox.Show(path + <span class="string">"保存失败！错误信息："</span> + e.Message);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr /><p>这样做的一个好处是不需要再调用Win32底层API。直接走CEF组件的方法就可以截图，也不需要专门整个<code>OffScreen</code>的组件，毕竟还要复制和继承，并且也占内存。而且即使是CEF视窗超出屏幕，或者被其他窗口挡住，甚至使用特殊手段把窗口调大到大于屏幕的分辨率，此方法也可以截取得到。<br />但是这个办法还只能截一次图，不能截多次，必须退出重开才能继续截图。第二次截图会报错“Generated MessageID 100002 doesn’t match returned Message Id 100001”。网上尚无解决方案，包括外国社区。<a href="https://stackoverflow.com/questions/65334430/message-id-went-wrong-when-using-cef-devtools-executedevtoolsmethodasync-and-page-capturescreenshot" target="_blank" rel="noopener">鄙人就此问题已在StackOverflow提问。</a><br />把Github上面那个代码<a href="https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs" target="_blank" rel="noopener">https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Example/DevTools/DevToolsExtensions.cs</a>拷过来，放到项目里面，改一下命名空间。然后就可以对CEF控件直接调用了。这里用的是WinForm显示的GUI。然后在代码里面这样写方法就可以调用了。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">async</span> <span class="keyword">void</span> <span class="title">invokeCapture</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">try</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">byte</span>[] result = <span class="keyword">await</span> CefSharp.Example.DevTools.DevToolsExtensions.CaptureScreenShotAsPng(browser); <span class="comment">// browser是CEF控件实例</span></span><br><span class="line">        SaveFileDialog dialog = <span class="keyword">new</span> SaveFileDialog();</span><br><span class="line">        dialog.Filter = <span class="string">"PNG图片 (*.PNG)|*.PNG"</span>;</span><br><span class="line">        DialogResult dresult = dialog.ShowDialog();</span><br><span class="line">        <span class="keyword">if</span> (dresult == DialogResult.OK)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">string</span> path = dialog.FileName;</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                File.WriteAllBytes(path, result);</span><br><span class="line">                MessageBox.Show(path + <span class="string">"保存成功。"</span>);</span><br><span class="line">                </span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e)</span><br><span class="line">            &#123;</span><br><span class="line">                MessageBox.Show(path + <span class="string">"保存失败！错误信息："</span> + e.Message);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">catch</span> (Exception ee)</span><br><span class="line">    &#123;</span><br><span class="line">        MessageBox.Show(<span class="string">"目前暂时只支持截一次图，暂时不支持截更多次数的图片，如果要继续截图得退出程序重开。作者确实没法解决这个问题了，谁有好的想法也欢迎提出来，具体详情请关注https://stackoverflow.com/questions/65334430/message-id-went-wrong-when-using-cef-devtools-executedevtoolsmethodasync-and-pag 。相关技术细节："</span> + ee.Message, <span class="string">"暂不支持的操作"</span>, MessageBoxButtons.OK, MessageBoxIcon.Error);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这样做的一个好处是不需要再调用Win32底层API。直接走CEF组件的方法就可以截图，也不需要专门整个OffScreen的组件，毕竟还要复制和继承，并且也占内存。而且即使是CEF视窗超出屏幕，或者被其他窗口挡住，甚至使用特殊手段把窗口调大到大于屏幕的分辨率，此方法也可以截取得到。
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>【小花仙】提供一个比较复杂但是可以截全身的截高清图的方法（重新整理）</title>
    <link href="https://no5972.moe/cms/archivers/53.html"/>
    <id>https://no5972.moe/cms/archivers/53.html</id>
    <published>2020-12-15T03:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.491Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>高能预警：此法需要一定的JavaScript基础！不会的建议先恶补点JS基础知识再来阅读。这方法如果掌握好了比浏览器缩放要方便的多。</p><p>这是鄙人又摸索出来的一套解决方案，通过Chrome或Chromium的F12工具来截取高清截图。正如鄙人此前在CSDN发布的笔记一样，Chrome在62版本之后就已经原生支持了截取指定HTML节点的截图以及截取实际像素的截图，国产浏览器只要不是太老的版本应该都是可以支持的。之前那个通过RDP远程桌面截图的方式实在太过于麻烦，鄙人现在这一套方法比使用远程桌面要简单不少。</p><p>2020年底之后Chrome和Chromium浏览器将停止对Flash的支持，但是不排除一些国产浏览器会继续支持Flash，所以可能还是需要使用国产浏览器来进行操作。国产浏览器启用Flash方法请看鄙人前段时间在本吧发的那个关于Flash停止支持的解决方案。</p><p>前往<code>http://hua.61.com/Client.swf?t=4561654354</code>（随便输入一串数字，空格换成点）。国产浏览器大都能直接显示，但是Edge和Chrome不能直接打开，他会变成文件下载。鄙人曾经开发过一个扩展可以让浏览器直接播放本地SWF或远程的SWF的URL。但是在试图向微软的浏览器扩展商店投稿时被审核退回了。。。所以建议大家使用国产浏览器来操作。</p><p>把F12开发人员工具打开，不同的浏览器操作方式可能不一样，鄙人的星愿浏览器是顶部菜单按钮-更多工具-开发人员工具。建议先切换成拆分窗口的模式，在出现的侧边栏右上角点击三个点的按钮，然后第一行的显示模式Dock Side点击第一个按钮，就变成拆分窗口的模式了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/5f497a72c874747eaef62c91774a14bb.png" alt="" /></p><p>然后点击左上角第二个图标打开设备模式。点击网页上边选择设备的下拉框选编辑（Edit）。点击添加自定义设备（Add custom device）。先添加一个稍微低一点的分辨率设备，比例确保是一致的，例如360 640（9:16的宽高比）。设备名称（Device Name）随便输入，然后尺寸我们用360 640。设备像素比（Device pixel ratio）不用管，用户戴笠字符串（User agent string）也不用管，设备类型选桌面（Desktop）。点击添加（Add）。此举是为了在放大画面的时候减少卡顿，因为如果直接使用高分辨率的话整个操作会变的异常卡顿。然后再添加一个高分辨率的设备。设备名称（Device Name）随便输入，然后尺寸我们用3840 2160。当然你也可以尝试8K的7680 4320，但是8K分辨率在放大到400%或以上的倍率的时候有可能会出现贴图显示不完整的问题，所以使用8K分辨率的时候建议不要达到400%。设备像素比、用户戴笠字符串、设备类型和前一个设备一样。然后在网页上边的选择设备的下拉框选择我们刚刚添加的较低分辨率的设备。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/3e02389cd5da55944e94761e461d6d00.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/c7dcdf26de8fb78b00dca8d881a4f154.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e4e0b2854324e7ccfee6f23ab36fc875.png" alt="" /></p><p>刷新一下页面（F5可能是失效的，因为此时输入焦点可能在Flash里面，建议使用鼠标点击浏览器的刷新按钮来刷新）。然后登录账号，把你要截图的画面或者玩家面板打开。这个时候就开始敲JS代码了！</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e4e0b2854324e7ccfee6f23ab36fc875.png" alt="" /></p><p>使用形如<code>document.getElementsByTagName(&quot;embed&quot;)[0].Zoom(25)</code>这样的语句就可以直接让游戏画面缩放到指定的倍率（<code>Zoom</code>是Flash组件的原生方法，相当于右键菜单的放大和缩小，但是这个可以指定任意的倍率），其中最后的参数填写放大倍率的倒数乘以100，例如放大4倍就填25，1/4*100=25。</p><p>切回开发人员工具，在开发人员工具里面打开Console，然后输入这个JS语句回车。可以按上方向键重新打出这个语句然后调整倍率再回车（注意这个之后输入的倍率是按照前一次缩放之后的倍率来指定的相对的倍率），直到倍率满意为止。然后右键菜单，设置，直接点击关闭，鼠标不要动，此时鼠标光标会变成拖动手形的图案，按住左键来拖动视野对准要截图的区域。区域对准好了之后，在网页上边的选择设备的下拉框选择我们之后添加的较高分辨率的设备。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/0d1a8a239f64e6cf02a3fc5299d41ca6.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/094efe59a7f0d31a1890fc799e3e6c31.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/dee3d97cd10900fc7af666791fb56475.png" alt="" /></p><p>回到开发人员工具。点击右上角三个点的按钮，选择运行命令（Run Command），或者也可以按快捷键Ctrl+Shift+P，然后就会呼出一个神秘菜单。我们在这个菜单输入&quot;Capture screenshot&quot;，当然不需要全部输入他自己就能显示出来。看到这个选项之后用鼠标或者用键盘移动光标回车选择这个选项，一张全身的高清截图就出来了。</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/a6b64230f72e2881dad7a3f3da5fe27f.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/18a3e43b21ee37e8f1c916667431ea88.png" alt="" /></p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/533ec9af8e89608a7d98faeea048393c.png" alt="" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这是鄙人又摸索出来的一套解决方案，通过Chrome或Chromium的F12工具来截取高清截图。正如鄙人此前在CSDN发布的笔记一样，Chrome在62版本之后就已经原生支持了截取指定HTML节点的截图以及截取实际像素的截图，国产浏览器只要不是太老的版本应该都是可以支持的。之前那个通过RDP远程桌面截图的方式实在太过于麻烦，鄙人现在这一套方法比使用远程桌面要简单不少。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>Linux系统 运行小花仙游戏（针对2021年Flash停止维护的情况）</title>
    <link href="https://no5972.moe/cms/archivers/50.html"/>
    <id>https://no5972.moe/cms/archivers/50.html</id>
    <published>2020-12-07T10:00:00.000Z</published>
    <updated>2023-03-15T10:29:24.491Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>1月5日更新：Flash.cn官网公告，2021年1月12日， Flash Player将进行版本更新。由于技术支持原因，本次及后续更新版本的Flash Player在Windows7以下（不包含Windows7）、Linux、Mac操作系统中不再支持视频格式内容的播放功能。届时Linux系统使用32或以上版本的Flash可能会阻止加载内容。</p><p>在某些网站可能还能找到Linux专用的版本29的PPAPI Flash（可能也很难下载得到，可尝试百度搜索<code>flash player linux</code>，注意是32位还是64位）。如果出现了阻止加载的情况，需要将此旧版本的Flash解压然后替换到<code>/usr/lib64/flash-plugin</code>目录的同名文件（<code>libpepflashplayer.so</code>和<code>manifest.json</code>）。注意还要修改文件权限才能恢复使用。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">tar -zxvf flash_player_ppapi_linux.x86_64.tar.gz</span><br><span class="line">sudo rm -rf /usr/lib64/flash-plugin/*</span><br><span class="line">sudo cp ~/&#123;libpepflashplayer.so,manifest.json&#125; .</span><br><span class="line">sudo chmod 777 /usr/lib64/flash-plugin/*</span><br></pre></td></tr></table></figure><hr /><p>12月9日更新：TinyCore运行小花仙已经成功。</p><p>需要安装的软件：<br />chromium-browser 谷歌内核浏览器23<br />notocjk-regular-fonts-ttc 思源黑体字体<br />pcre, pcre2 运行库<br />getFlash_beta, getFlash 页游Flash（NPAPI，装完后看的版本是32，不知道23的Chromium支不支持PPAPI）</p><p>不用重启，不用加控件参数，直接<code>chromium-browser</code>就可以用了。<br /><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20201209084255158.png" alt="在这里插入图片描述" /></p><hr /><p>百度云服务器CentOS运行小花仙页游已经成功，但是云服务器选的配置不好，加之用网页VNC链接的，效果不是很好，<strong>但是如果是直接物理机Linux操作就好很多了。</strong></p><p>命令清单：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装GUI （如果有图形界面就不用再安装了）</span></span><br><span class="line">yum groupinstall -y <span class="string">"Server with GUI"</span></span><br><span class="line"><span class="comment"># 安装谷歌内核浏览器 （留意一下版本不要超过或等于88，可以先用yum search看一下版本）</span></span><br><span class="line">yum install -y chromium</span><br><span class="line"><span class="comment"># 下载国内特供版Flash （Linux版本不包含涉及隐私的服务，已从service --status-all确认）</span></span><br><span class="line">wget https://www.flash.cn/cdm//latest/flash-player-ppapi-release.x86_64.rpm</span><br><span class="line"><span class="comment"># 安装Flash</span></span><br><span class="line">rpm -ivh flash-player-ppapi-release.x86_64.rpm</span><br><span class="line"><span class="comment"># 进图形界面 （如果有图形界面就不用再手动进入了）</span></span><br><span class="line">init 5</span><br><span class="line"><span class="comment"># 手动指定Flash控件文件的路径来启动谷歌内核浏览器</span></span><br><span class="line">chromium-browser --no-sandbox --ppapi-flash-path=/usr/lib/adobe-flashplugin/libpepflashplayer.so --ppapi-flash-version=33.0.0.417</span><br></pre></td></tr></table></figure><p>进<a href="http://hua.61.com" target="_blank" rel="noopener">http://hua.61.com</a>，点击进行游戏需要Flash Player，然后点击地址栏左边的Not secure，然后Flash选Allow，然后刷新即可运行。<img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20201207173342548.png" alt="在这里插入图片描述" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      百度云服务器CentOS运行小花仙页游已经成功，但是云服务器选的配置不好，加之用网页VNC链接的，效果不是很好，但是如果是直接物理机Linux操作就好很多了。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>根据线索整理的一套在2021年继续使用Flash Player的方法（20.12.29更新）</title>
    <link href="https://no5972.moe/cms/archivers/49.html"/>
    <id>https://no5972.moe/cms/archivers/49.html</id>
    <published>2020-11-26T10:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>12月29日更新：</p><p>刚刚接到的消息：Adobe那边又有动静，说1月12日开始将阻止Flash内容在Flash Player中加载，并且是几个月前就已经添加了定时器代码，如果属实，之前的从Edge导入的Flash组件文件也将无法使用Flash，这种情况得换版本29的Flash（网上很难下载到）。</p><p>如果能搜索下载得到29版本的Flash，在安装时千万不要勾选自动更新，安装好以后到<code>C:\Windows\System32\Macromed\Flash</code>或者<code>C:\Windows\SysWOW64\Macromed\Flash</code>目录下找到<code>manifest.json</code>和<code>pepflashplayer32_**_*_*_***.dll</code>这两个文件，拷出来。把DLL文件重命名为<code>pepflashplayer.dll</code>。然后就还是在国产浏览器安装目录的<code>User Data</code>目录下新建文件夹<code>PepperFlash</code>，把这两个文件拷过来。</p><hr /><p>根据上次收集到的<a href="48.html">关于Flash Player的线索</a>，这里整理了一套在2021年继续使用Flash Player的方法。<br /><a href="https://blog.csdn.net/qq_35977139/article/details/109997917" target="_blank" rel="noopener">Edge正式版将于1月21日更新88版本，此版本开始将原生不支持Flash</a>。大家应当在这个日期之前备份好自带的Flash。目录是<code>C:\Users\用户名\AppData\Local\Microsoft\Edge\User Data\PepperFlash</code>。把里面的<code>manifest.json</code>和<code>pepflashplayer.dll</code>两个文件拷出来准备好。到时候安装一个国产浏览器，例如百分浏览器，星愿浏览器 <s>（星愿浏览器好像还不行，直接拷过来还是显示此插件不受支持，解决方案研究中</s> 解决方案研究好了，需要手动添加启动参数指定PPAPI Flash的位置。具体见下） 等 。在国产浏览器安装目录的<code>User Data</code>目录下新建文件夹<code>PepperFlash</code>，然后把那两个文件拷过来，即可继续使用Flash。</p><p>星愿浏览器需要手动添加启动参数来指定PPAPI Flash的位置。那两个文件位置可以随便放，但是路径最好不要带空格，不然启动参数设置会比较麻烦。假设这里把那两个文件放到了<code>D:\FLASH_BACKUP\PepperFlash\</code>的话，启动参数就这样写：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">twinkstar.exe --ppapi-flash-path&#x3D;D:\FLASH_BACKUP\PepperFlash\pepflashplayer.dll --ppapi-flash-version&#x3D;32.0.0.453</span><br></pre></td></tr></table></figure><p>后面那个版本号也可以随便写，别太低就行。具体方法是找到安装出来的启动程序<code>twinkstar.exe</code>，按住Alt键鼠标随便拖拉一下，得到一个快捷方式，然后右键属性，目标那个处从<code>.exe</code>后面开始参照上面的写法在后面添加启动参数。以后如果想使用Flash的话就可以从这个创建的快捷方式进入就可以了。<br />但是这样操作之后在国产浏览器运行会提示“此Flash Player与您的地区不相容”。<a href="https://www.centbrowser.net/zh-cn/forum.php?mod=viewthread&amp;tid=6719" target="_blank" rel="noopener">此时需要通过hosts屏蔽一些特定域名保证其使用。</a>用文本编辑器打开<code>C:\Windows\System32\drivers\etc\hosts</code>，另起一行添加这些内容。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1 geo2.adobe.com</span><br><span class="line">127.0.0.1 fpdownload2.macromedia.com</span><br><span class="line">127.0.0.1 fpdownload.macromedia.com</span><br><span class="line">127.0.0.1 macromedia.com</span><br></pre></td></tr></table></figure><p>亲测在安装<a href="https://www.catalog.update.microsoft.com/Search.aspx?q=KB4577586" target="_blank" rel="noopener">移除Flash的系统更新</a>之后可以通过此法在国产浏览器继续使用Flash。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      根据上次收集到的关于Flash Player的线索，这里整理了一套在2021年继续使用Flash Player的方法。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>探讨关于Flash Player的更多线索（22.09.04更新）</title>
    <link href="https://no5972.moe/cms/archivers/48.html"/>
    <id>https://no5972.moe/cms/archivers/48.html</id>
    <published>2020-11-24T08:45:00.000Z</published>
    <updated>2022-09-07T09:04:40.894Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Flash即将在2020年底停止支持。如果仍然有一些业内业务需要Flash我們应该如何应对，这里找到了更多的线索。</p><ol><li><p>22.09.04更新：看到最后一个没有加“该版本过旧”检测的Flash Player的版本是27.0.0.130。但是版本29以前的Flash Player都没有64位版本，需要用到大内存Flash内容的用32位版本可能会不稳定（2022年6月3日文章<a href="https://www.zxstd.cn/jishu/diannao/2022-06-03/1955.html" target="_blank" rel="noopener">《要用Adobe Flash Player但又不想装重橙版的解决办法》</a>）。</p></li><li><p>21.11.13更新：360推出了360极速浏览器X的211113版。此版本为95版本的内核，并且实现了支持Flash Player。这可能是国内第一个高于88版本内核且支持Flash Player的浏览器。</p></li><li><p>21.05.08更新：Leaning科技早在去年9月份就推出了一套利用WASM的解决方案，专门解决在HTML5的页面中加载Flash内容而无需安装Flash——<a href="https://leaningtech.com/announcing-cheerpx-for-flash-a-solution-to-extend-the-life-of-flash-applications-post-2020/" target="_blank" rel="noopener">CheerpX for Flash</a>。公告称此解决方案很容易和<code>&lt;embed&gt;</code>标签、<code>&lt;object&gt;</code>标签或者<code>swfobject.js</code>集成，并且已经在数量庞大的AS2、AS3的Flash应用以及Flex、Spark、OpenLaszlo应用通过测试。但是这是一套企业解决方案，需要专门联系付费购买。<br /><img src="https://img-blog.csdnimg.cn/20210508102642402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1OTc3MTM5,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述" /></p></li><li><p>21.02.18更新：微软已经正式推送移除Flash的系统更新KB4577586。此更新将在Win10 2004、20H2版本自动更新，并且无法还原，除非重装系统。此次移除Flash仅针对系统自带的AX版Flash，一些浏览器和应用软件内置的PPAPI、NPAPI 的Flash组件不受此更新影响。</p><ul><li>若有需要恢复AX版Flash的情况，请参考<a href="https://blog.csdn.net/qq_35977139/article/details/113449802" target="_blank" rel="noopener">《根据之前文章整理的在2021年继续使用Flash Player的方法【重新整理】》</a>的第三条下载安装“Flash恢复包”，此恢复包针对此系统更新进行恢复，但是<strong>仅适用于安装了此更新的机器，未安装此更新的机器不要安装，否则会出现无法恢复的异常情况</strong> 。</li></ul></li><li><p>21.01.28更新：网传已有Edge的绿色版出现，经测试，版本小于88的Edge绿色版也可以通过手动导入Flash的方式来使用Flash。</p></li><li><p>21.01.22更新：Edge今天已经更新了88版本。Flash已经无法使用。请大家下载绿色版Chrome来继续使用Flash。有不少绿色版Chrome内置旧版Flash Player。</p></li><li><p>21.01.20更新：Chrome今天已经正式更新了88版本，Flash已经无法再继续使用。Chrome的网上应用店出现了一款可以使用H5替代方案播放Flash内容的扩展<a href="https://chrome.google.com/webstore/detail/flashplayer-swf-to-html/nodnmpgjlnclahkmgjiinfjklgbbgecg/" target="_blank" rel="noopener">《FlashPlayer - SWF to HTML》</a>。此扩展会检测当前网页有无Flash对象，若有，则可以点击工具栏上的该扩展图标，即可以H5形式来播放Flash内容。</p><ul><li>该扩展整合了当前两种常用的开源替代方案来播放Flash内容。<a href="https://ruffle.rs/" target="_blank" rel="noopener">Ruffle</a>和<a href="https://swf2js.com/" target="_blank" rel="noopener">SWF2JS</a>。使用过程中可通过右击工具栏上该扩展图标来切换渲染方式。</li><li>由于Ruffle目前尚未支持Action Script 3.0，所以使用AS3的Flash内容可能无法正常运作。</li><li>SWF2JS的免费版尚未提供对AS3的支持；收费版则支持了90%的AS3，并且也提供了Stage3D、Socket、FLV、MP4的支持。</li></ul></li><li><p>21.01.19更新：淘米已经更新了<a href="http://dl.61.com/hua/WeHua.msi" target="_blank" rel="noopener">新的小花仙微端</a>。经过实测已经可以在移除了Flash 的机器使用。</p><ul><li>但此微端体积较大，安装后占用约250MB磁盘空间。</li><li>此微端使用Electron开发，目前暂时还没有实现画面缩放和截图功能。</li><li>集成的也是版本27的Flash，为PPAPI版本，无弹窗广告和隐私服务。</li></ul></li><li><p>21.01.18更新：淘米已经更新了<a href="http://dl.61.com/seer/Seer.msi" target="_blank" rel="noopener">新的赛尔号微端</a>，经过实测已经可以在移除了Flash的机器使用。微端集成的是版本27的Flash，无弹窗广告和隐私服务。</p><ul><li>大致看了一下文件结构，技术细节应该是走的内嵌Mozilla浏览器（也就是<code>GeckoWebBrowser</code>）加载NPAPI Flash。博客园那边也有不少相关文章讨论这方面内容。<a href="https://www.cnblogs.com/chengzi/p/4497692.html" target="_blank" rel="noopener">.net winform程序下使用firefox作为Web浏览器</a>、<a href="https://www.cnblogs.com/deali/p/6426593.html" target="_blank" rel="noopener">C#使用Gecko实现浏览器</a></li></ul></li><li><p>21.01.18更新：<a href="https://www.cr173.com/soft/1311482.html" target="_blank" rel="noopener">西西软件园已将吾爱破解论坛上的Flash破解补丁整合打包</a>，有出现Flash无法使用的用户可以尝试使用，<a href="https://www.52pojie.cn/thread-1350285-1-1.html" target="_blank" rel="noopener">注意一定要先看说明。</a></p><ul><li>此补丁中的Flash恢复包的OCX控件是32.0.0.445版本的，并且已经修改掉了自毁的定时器（也是通过最后的<code>42</code>字节改成<code>72</code>），注意此恢复包仅适用于安装了KB4577586“移除Flash的系统更新”的机器，未安装此更新的机器不要安装，否则会出现无法恢复的异常情况。</li></ul></li><li><p>21.01.13更新：百分浏览器论坛官方<a href="https://www.centbrowser.net/zh-cn/forum.php?mod=viewthread&amp;tid=6719&amp;extra=page%3D1" target="_blank" rel="noopener">推荐使用32.0.0.371版本</a>。猜测此版本也没有自毁。论坛超版回应：<a href="https://www.centbrowser.net/zh-cn/forum.php?mod=redirect&amp;goto=findpost&amp;ptid=8423&amp;pid=49387" target="_blank" rel="noopener">看到有大佬实测最后一个能用的国际版版本是 32.0.0.371</a>。</p></li><li><p>21.01.12更新：Flash 32.0.0.303没有自毁，仍然可以使用。</p></li><li><p>21.01.12更新：今天开始已经无法在版本32以及以上的Flash Player中加载Flash内容。请大家使用国产浏览器来解决Flash停止支持的情况。</p></li><li><p>21.01.08更新：淘米页游再次更新了浏览器不支持Flash时的提示信息。左上方出现了“安装Flash插件”的“点击下载”的按钮。此链接指向的是所谓的“特供版Flash”，此版本Flash本方从未承认过，请大家不要从该按钮指向的页面下载任何工具。我們呼吁淘米不要推荐所谓的“特供版Flash”。</p></li><li><p>21.01.01更新：搜狗浏览器技术支持工程师回应：<a href="http://ie.sogou.com/bbs/forum.php?mod=redirect&amp;goto=findpost&amp;ptid=2747473&amp;pid=8433589" target="_blank" rel="noopener">搜狗浏览器会一直支持flash插件的</a>。</p></li><li><p>21.01.01更新：4399推荐使用360安全浏览器来游玩小游戏。4399已在1月1日更新了所有小游戏游玩页面，如果浏览器不支持Flash则显示“当前浏览器无法运行Flash。继续游戏，可使用以下第三方浏览器：360浏览器极速模式”，4399页面上的下载链接指向的是4399提供的360安全浏览器10。</p><ul><li>未经过测试，但是在云电脑上测试了360官方提供的360安全浏览器12，安装界面和安装过程无捆绑，但是在安装之后使用期间会有弹窗推送建议安装360安全卫士，这一点需注意。</li><li>此外7k7k也更新了小游戏游玩页面，7k7k推荐使用360浏览器和搜狗浏览器，链接指向的分别是360安全浏览器的官网和搜狗浏览器的官网。</li></ul></li><li><p>21.01.01更新：淘米旗下所有Flash页游（包括赛尔号、摩尔庄园、小花仙等）更新了如果浏览器不支持Flash时的提示信息。淘米推荐使用猎豹浏览器、360安全浏览器、360极速浏览器、搜狗浏览器，此外还针对Mac系统推荐360极速浏览器。所有这些浏览器的链接指向的都是淘米提供的浏览器安装包。</p></li><li><p>20.12.29更新：ZDNet消息：但是，跳过此最新的Flash更新不会删除此“定时炸弹”在以前的版本中，几个月前已添加了killswitch代码，而此最后的Flash更新仅修改了提示用户使用该应用程序的提示中使用的语言。</p></li><li><p>20.12.29更新：Adobe那边又有动静，说1月12日开始将阻止Flash内容在Flash Player中加载，如果属实，之前的从Edge导入的Flash组件文件也将无法使用Flash，这种情况得换版本29的Flash（网上很难下载到）。对此的对策还在研究中！</p></li><li><p>20.11.12更新：360极速浏览器产品答疑师“fly颖”回应：<a href="https://bbs.360.cn/forum.php?mod=viewthread&amp;tid=15933600&amp;page=1#pid118058892" target="_blank" rel="noopener">360浏览器会继续支持Flash的</a>。</p></li><li><p>从<a href="https://blog.csdn.net/qq_35977139/article/details/109255750" target="_blank" rel="noopener">Chromium官方的消息</a>来看，预计将于2021年1月更新的88版本的内核将原生不支持Flash。即使国内继续支持也将无法在88版本以上内核的浏览器使用（这其中包括Win10 20H2开始自带的新版Edge浏览器）。</p></li><li><p>Edge 88的Beta版预计将于12月7日上线，<a href="https://dy.163.com/article/FP68QH4Q0511MVC3.html" target="_blank" rel="noopener">微软官方明确此版本开始不再包含Flash</a>。而稳定版将于1月21日上线。而<a href="https://blog.csdn.net/qq_35977139/article/details/109255750#t10" target="_blank" rel="noopener">88版本开始Chromium将原生不支持Flash</a>，这意味着无论如何魔改也不会让使用这种内核的浏览器再去支持Flash。（已在版本89的Chromium中实测，将Edge的PepperFlash文件夹手动拷贝到Chromium的User Data文件夹下，运行Chromium时Chromium会自动删除PepperFlash文件夹。Chromium浏览器加载Flash会显示Adobe Flash Player已不再受支持，如图所示）（当然，这里的魔改是建立在不动源代码的前提下。因为Chromium本身是开源的，如果能魔改源代码使其能支持Flash也不是不可以）<br /><img src="https://img-blog.csdnimg.cn/20201124155808679.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1OTc3MTM5,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述" /></p></li><li><p>据外媒报道，Chrome 88版本将于1月19日正式发布。</p></li><li><p>目前一些浏览器诸如百分浏览器、星愿浏览器均因某些不可描述的原因移除了集成的Flash。需要手动拷贝文件并从hosts屏蔽一些域名。</p></li><li><p>从已经掌握的各个CVE漏洞（未修复的和已修复的）复现步骤来看，大部分Flash漏洞引起的黑客攻击是因为调用了恶意的SWF或者FLV文件，包含但不限于打开了内嵌恶意Flash的Office文档，以及打开了内嵌恶意Flash URL的网址页面。</p></li><li><p>谷歌的Chromium内核的浏览器默认使用PPAPI的Flash，这种Flash运行在Chromium的一个沙箱之中，有效减少Flash利用漏洞的黑客攻击。但有些国产浏览器考虑到PPAPI Flash占用运行内存比较大，刻意将其替换为较不安全的NPAPI Flash。</p></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Flash即将在2020年底停止支持。如果仍然有一些业内业务需要Flash我們应该如何应对，这里找到了更多的线索。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>NexT主题 Group Pictures添加超链接</title>
    <link href="https://no5972.moe/cms/archivers/47.html"/>
    <id>https://no5972.moe/cms/archivers/47.html</id>
    <published>2020-11-20T07:00:00.000Z</published>
    <updated>2021-07-10T02:51:47.651Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>鄙人向NexT主题提交的<a href="https://github.com/next-theme/hexo-theme-next/pull/143" target="_blank" rel="noopener">PR</a>已经得到合并，大家可以在下一个版本的NexT尝试。</strong></p><p>NexT主题在博文中插入图片时，一张图片会单独占满一行。如果想要将多个尺寸较小的图片放在同一行就比较麻烦。好在NexT主题集成了一个扩展标签<a href="https://theme-next.js.org/docs/tag-plugins/group-pictures.html" target="_blank" rel="noopener">Group Pictures</a>，允许在同一行放多张图片（最多3张）。</p><p>但是遇到我們这种非常特殊的需求，要在关于页面的同一行放置多个徽章并且还要能点击跳转。这就需要将图片设置超链接。Group Pictures并不支持超链接。如果直接使用Markdown图片超链接标签，则超链接效果包括<code>&lt;a&gt;</code>标签都会被吞掉。</p><p>经过反复的查找相关JS代码包括编译站点的NodeJS代码，最终在<code>group-pictures.js</code>文件找到了问题所在。获取图片DOM的代码是通过正则表达式判断的，他会先把Hexo那边包裹在特定标签的内容生成出来的HTML代码取出来，然后通过正则表达式来找图片HTML标签。但是这个标签是按<code>&lt;img&gt;</code>标签去找的。这样会把包裹在<code>&lt;img&gt;</code>标签外面的<code>&lt;a&gt;</code>标签忽略，导致超链接无法生成。</p><p>我們需要将这里的正则表达式改成既找<code>&lt;img&gt;</code>标签也找<code>&lt;a&gt;</code>标签。打开<code>group-pictures.js</code>，将下边的<code>groupPicture</code>函数的正则表达式修改。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">groupPicture</span>(<span class="params">args, content</span>) </span>&#123;</span><br><span class="line">  args = args[<span class="number">0</span>].split(<span class="string">'-'</span>);</span><br><span class="line">  <span class="keyword">const</span> group = <span class="built_in">parseInt</span>(args[<span class="number">0</span>], <span class="number">10</span>);</span><br><span class="line">  <span class="keyword">const</span> layout = <span class="built_in">parseInt</span>(args[<span class="number">1</span>], <span class="number">10</span>);</span><br><span class="line"></span><br><span class="line">  content = hexo.render.renderSync(&#123;<span class="attr">text</span>: content, <span class="attr">engine</span>: <span class="string">'markdown'</span>&#125;);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// const pictures = content.match(/&lt;img[\s\S]*?&gt;/g);</span></span><br><span class="line">  <span class="keyword">const</span> pictures = content.match(<span class="regexp">/(&lt;a[^&gt;]*&gt;((?!&lt;\/a)(.|\n))+&lt;\/a&gt;)|(&lt;img[^&gt;]+&gt;)/g</span>); <span class="comment">// 这一行改成这样</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`&lt;div class="group-picture"&gt;<span class="subst">$&#123;templates.dispatch(pictures, group, layout)&#125;</span>&lt;/div&gt;`</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样再使用Group Pictures的时候就可以直接放图片超链接了。例如：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;% grouppicture 3-1 %&#125;</span><br><span class="line">  [<span class="string">![</span>](<span class="link">/images/docs/next.svg</span>)](<span class="link">https://theme-next.js.org/</span>)</span><br><span class="line">  ![](/images/docs/next.svg)</span><br><span class="line">  [<span class="string">![</span>](<span class="link">/images/docs/next.svg</span>)](<span class="link">https://theme-next.js.org/</span>)</span><br><span class="line">&#123;% endgrouppicture %&#125;</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      经过反复的查找相关JS代码包括编译站点的NodeJS代码，最终在group-pictures.js文件找到了问题所在。获取图片DOM的代码是通过正则表达式判断的，他会先把包裹在特定标签的内容生成出来的HTML代码取出来，然后通过正则表达式来找图片HTML标签。但是这个标签是按&amp;lt;img&amp;gt;标签去找的。这样会把包裹在&amp;lt;img&amp;gt;标签外面的&amp;lt;a&amp;gt;标签忽略，导致超链接无法生成。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>微软答应2021年再给Flash续命几个月</title>
    <link href="https://no5972.moe/cms/archivers/46.html"/>
    <id>https://no5972.moe/cms/archivers/46.html</id>
    <published>2020-11-12T01:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://blogs.windows.com/msedgedev/2020/09/04/update-adobe-flash-end-support/" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Windows%20Blogs-Update%20on%20Adobe%20Flash%20Player%20End%20of%20Support-brightgreen" alt="Windows Blogs-Update on Adobe Flash Player End of Support" /></a></p><h1 id="options-for-continued-support-for-enterprise-customers-针对企业用户的继续支持flash的方式"><a class="markdownIt-Anchor" href="#options-for-continued-support-for-enterprise-customers-针对企业用户的继续支持flash的方式"></a> Options for continued support for enterprise customers 针对企业用户的继续支持（Flash）的方式</h1><p>For enterprises seeking assistance with moving away from Adobe Flash Player or needing continued support for line of business applications that may be dependent on it after 2020, Adobe is providing some support options. For more details, please visit the <a href="https://theblog.adobe.com/update-for-enterprise-adobe-flash-player/" target="_blank" rel="noopener">blog posted by Adobe</a>.<br />对于那些在2020年后需要协助脱离Adobe Flash Player或需要继续支持可能依赖它的业内业务应用的企业用户，Adobe提供了一些方式。更多详情请访问<a href="https://theblog.adobe.com/update-for-enterprise-adobe-flash-player/" target="_blank" rel="noopener">Adobe发布的博客</a>。</p><p>To aid such customers, Microsoft Edge will allow Adobe Flash Player to load as a plug-in via <a href="https://docs.microsoft.com/en-us/deployedge/edge-ie-mode" target="_blank" rel="noopener">the Internet Explorer mode feature</a>. Inherently, Internet Explorer 11 will also allow this. Once you make the switch from Microsoft provided Adobe Flash Player, it will be treated as any other third-party plug-in and will not receive Customer Support from Microsoft.<br />为了协助此类用户，Microsoft Edge将允许通过<a href="https://docs.microsoft.com/zh-CN/deployedge/edge-ie-mode" target="_blank" rel="noopener">IE模式功能</a>将Adobe Flash Player作为插件来加载，IE11原生也接受这种要求。如果打开微软提供的Adobe Flash Player，它将被视同其他第三方插件来对待，不会受到微软的客户支持。</p><p>…</p><p><strong>In Summer of 2021, all the APIs, group polices and user interfaces that specifically govern the behavior of Adobe Flash Player will be removed from Microsoft Edge (legacy) and Internet Explorer 11 via the latest “Cumulative Update” on Windows 10 platforms and via “Cumulative Update for Internet Explorer 11” or “Monthly Rollup” on Windows 8.1, Windows Server 2012 and Windows Embedded 8 Standard. Also, the “Update for Removal of Adobe Flash Player” will be included as part of the “Cumulative Update” and “Monthly Rollup” this point forward.</strong> If you are working with Adobe for continued support, you should not be impacted by these changes.<br /><strong>在2021年夏季，所有专门管理Adobe Flash Player行为的API、组策略和用户界面将通过Windows 10平台上最新的“累计更新”和Windows 8.1、Windows Server 2012和Windows Embedded 8 Standard上的“Internet Explorer 11的累计更新”或“每月汇总”，从旧版Microsoft Edge和Internet Explorer 11中删除。“删除Adobe Flash Player的更新”也将作为“累计更新”和“每月汇总”的一部分。</strong> 如果您还需要使用Adobe那边（其它）的东西获得持续的支持，那么您应该不会受到这些更改的影响。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      为了协助此类用户，Microsoft Edge将允许通过IE模式功能将Adobe Flash Player作为插件来加载，IE11原生也接受这种要求。如果打开微软提供的Adobe Flash Player，它将被视同其他第三方插件来对待，不会受到微软的客户支持。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>关于Flash停止支持后Chrome如何启用过期插件</title>
    <link href="https://no5972.moe/cms/archivers/45.html"/>
    <id>https://no5972.moe/cms/archivers/45.html</id>
    <published>2020-11-05T00:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>根据前段时间翻译的<a href="41.html#Flash-Player-blocked-as-%E2%80%9Cout-of-date%E2%80%9D-Target-All-Chrome-versions-Jan-2021-%E4%BB%A5%E2%80%9C%E8%BF%87%E6%9C%9F%E2%80%9D%E5%8E%9F%E5%9B%A0%E7%A6%81%E7%94%A8Flash-2021-1%EF%BC%8C%E6%89%80%E6%9C%89%E7%89%88%E6%9C%AC">Chrome/Chromium停止支持Flash的详细事宜</a>中提到的，2021年以后新版Chrome将直接不支持Flash，而旧版Chrome也会将Flash插件视为过期插件。届时即使是使用旧版的Chrome也会出现“Adobe Flash Player因过期而遭到阻止”的提示，每次都需要点击旁边的运行一次才能使用。</p><p>如果仍然有需要依赖Flash的业务，应该提前关闭Chrome的自动更新，然后对旧版的Chrome主程序添加启动参数来手动启用过期的插件。启动参数如下：</p><figure class="highlight bat"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chrome.exe --allow-outdated-plugins</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      根据前段时间翻译的Chrome/Chromium停止支持Flash的详细事宜中提到的，2021年以后新版Chrome将直接不支持Flash，而旧版Chrome也会将Flash插件视为过期插件。届时即使是使用旧版的Chrome也会出现“Adobe Flash Player因过期而遭到阻止”的提示，每次都需要点击旁边的运行一次才能使用。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>某一线大厂IT开发岗位简历筛选标准</title>
    <link href="https://no5972.moe/cms/archivers/44.html"/>
    <id>https://no5972.moe/cms/archivers/44.html</id>
    <published>2020-11-02T06:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><p>上周发了一个内推的帖子，没想到短时间内就收到了成百上千封简历。<br />我仔仔细细地看了每一封简历，附带有Github地址的我也点进去仔细看了代码。<br />最终我留下了30%的简历，而且这30%中只有10%的本科生。<br />所有通过内推初步筛选的小伙伴会在8月30号收到邮件通知。</p><h1 id="筛选标准"><a class="markdownIt-Anchor" href="#筛选标准"></a> 筛选标准</h1><p>满足以下条件中的任何一个，直接通过筛选：</p><ul><li>ACM, Topcoder, Google Code Jam、Yahoo! Hack Day等重量级竞赛的获奖经历</li><li>Google, Microsoft, Hulu, Yahoo!, Amazon, IBM，Baidu, Tencent等顶级公司的靠谱实习经历</li><li>Github, StackOverflow、Archlinux等高水平技术社区的活跃人士，贡献过高质量的开源代码</li><li>Common Lisp, Scheme, Haskell, Scala等函数式语言的钻研经历</li><li>黑客行为</li></ul><p>满足以下条件中的任何一个，增大通过筛选的可能性：</p><ul><li>保送硕士</li><li>Top级别的专业成绩</li><li>丰富的国家级重点实验室项目经历</li><li>发表过高水平的学术论文</li><li>Markdown/Latex生成的PDF简历</li><li>高质量的技术博客</li><li>技能栏中写着熟练使用Vim/Emacs，以Mac OS X/Linux为日常操作系统</li><li>百度之星、腾讯之星、数学建模等同级别竞赛的获奖经历</li><li>新浪、网易、搜狐、360、人人、小米、优酷等同级别公司的实习经历</li></ul><p>满足以下条件中的任何一个，直接淘汰：</p><ul><li>空空的邮件正文</li><li>简历中贴着一张光膀子的照片</li><li>求职产品职位却在简历中充斥着大量技术经历</li><li>有类似China Great Wall的项目经历</li><li>丑陋、混乱的简历排版</li><li>过于空洞或过于啰嗦的项目描述</li><li>自我评价中含有愚蠢、幼稚、带有强烈感情色彩的词句</li><li>发件人名字或邮件中含有火星文等非主流词句。</li><li>所有的编程经验只是在学校中</li><li>计算机培训学校的经历</li><li>技能栏中，写着精通C/C++/Java/Word/Excel</li><li>技能栏中，把Visual Basic列在第一的位置</li><li>简历中的缩进同时使用了空格和Tab键</li></ul><h1 id="一些感悟"><a class="markdownIt-Anchor" href="#一些感悟"></a> 一些感悟</h1><h2 id="本科生的处境"><a class="markdownIt-Anchor" href="#本科生的处境"></a> 本科生的处境</h2><p>本科生的处境很艰难。</p><p>我本人是本科生，按理说会对本科生心软一些，而且说实话我确实很想给这批本科生内推机会。但这批简历中95%本科生的实力显得过于单薄，根本不够看，完全无法与茫茫多的大硕抗衡。</p><p>有人会说，学历不重要，硕士中也有水平菜的。</p><p>没错，但是请注意，硕士中也有强悍的，而且数量不少，光这帮强悍的硕士就能抢光所有的好Offer。</p><p>因此，本科生，除非你有ACM级别的奖牌或者BAT级别的靠谱实习经历并且已经做好了和茫茫多大硕血拼到底的准备，否则请乖乖去读研。</p><p>你们TMD还能不能打，本科生？</p><h2 id="内推的实质"><a class="markdownIt-Anchor" href="#内推的实质"></a> 内推的实质</h2><p>公司推出内推策略，是为了提前把人才抢到手，而不是给非人才一次额外的尝试机会。</p><p>请不要再问我内推失败会不会对正式校招造成影响。</p><h2 id="态度与能力"><a class="markdownIt-Anchor" href="#态度与能力"></a> 态度与能力</h2><p>一些小伙伴虽然实力不够，但附上了长长的求职信，而且写得像情书一样，声俱泪下，感人肺腑，把自己对公司的向往之情表达得淋漓尽致。</p><p>抱歉，上百行催人泪下的表达不如几行高质量的代码更有力量。</p><p>这是竞争。</p><p>态度不能替代能力。</p><h2 id="offer收割机"><a class="markdownIt-Anchor" href="#offer收割机"></a> Offer收割机</h2><p>Offer收割机不是在校招开始后出现的，而是在校招开始之前。</p><p>读着一些大牛的简历，能明显感觉到处处透露着的凶狠杀气。</p><p>这些人其实已经是Offer收割机了，他们蓄势待发，静静等待着校招的来临，以检验他们长期苦练的效果。</p><p>校招来临，爆发的时候到了。</p><p>看到他们的苦练得到回报，是一件很带劲的事情。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      上周发了一个内推的帖子，没想到短时间内就收到了成百上千封简历。我仔仔细细地看了每一封简历，附带有Github地址的我也点进去仔细看了代码。最终我留下了30%的简历，而且这30%中只有10%的本科生。所有通过内推初步筛选的小伙伴会在8月30号收到邮件通知。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>360浏览器官方回应Chromium停止支持Flash</title>
    <link href="https://no5972.moe/cms/archivers/43.html"/>
    <id>https://no5972.moe/cms/archivers/43.html</id>
    <published>2020-10-30T00:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://bbs.360.cn/forum-141-1.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/360%E5%AE%89%E5%85%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E5%AE%98%E6%96%B9%E8%AE%BA%E5%9D%9B-Spirit_%E6%82%94%E7%81%AD-brightgreen" alt="360安全浏览器官方论坛-Spirit_悔灭" /></a></p><p><strong>11月12日更新：360极速浏览器产品答疑师“fly颖”回应：<a href="https://bbs.360.cn/forum.php?mod=viewthread&amp;tid=15933600&amp;page=1#pid118058892" target="_blank" rel="noopener">“360浏览器会继续支持Flash的”</a></strong></p><p>鉴于Chrome和Chromium即将在年底停止对Flash的支持，有不少用户关心使用Chromium内核的国产浏览器是否也会相应地移除Flash的支持。对此360安全浏览器官方版主“Spirit_悔灭”做出回应。</p><blockquote><p>安全浏览器会根据Flash插件的安全性和需求量评估是否保留内置的Flash插件。另外国外是禁止了内容通过Flash插件加载才会有很长一段时间（2017年发布2020年停止支持）的预先警告，既使安全浏览器不再内置Flash插件，国内仍有其他方式提供Flash插件支持的方法，所以您描述的缓冲期应该询问Flash插件官方客服“什么时候会停止支持插件维护”。安全浏览器只是一种提供支持的客户端，如果不再内置Flash插件会在版本发布时进行公告，您可以留意论坛消息。旧版本不再更新维护，不会变化。</p></blockquote><p>360方面还在评估Flash的<strong>安全性和需求量</strong>，据此猜测，在最终讨论结果确认下来之前，360浏览器仍然将继续提供对Flash的支持。<br />此外，版主也提到兼容模式可以继续调用ActiveX版的Flash（可能需要国产版Flash）。</p><blockquote><p>安全浏览器兼容模式调用系统IE浏览器内核，与IE浏览器表现一致。您可以到Flash插件官网手动安装flash插件。</p></blockquote><p>此外，版主还提供了针对360浏览器使用Flash的解决方案。</p><blockquote><p>最近论坛上大家经常反馈视频网站或者网页游戏提示Flash未启用、经常提示Shockwave Flash崩溃。然后就会百度寻找各种Flash插件问题的解决方法，无一例外的都会写到重新安装Flash,但这是一个通用的方法。<em>下面就说明一下Flash插件在安全浏览器的具体情况以及解决办法</em>。</p><ul><li>先说下Flash插件现况。由于Flash插件经常被发现漏洞引发安全问题，Adobe公司发公告2020年会停止提供Flash插件更新和运行，微软公司也公告2020年12月前会逐步删除自带浏览器的Flash插件。 谷歌浏览器默认阻止Flash插件运行。</li></ul><p>安全浏览器新安装的时候是不会内置Flash。访问有需要Flash插件网页的时候，浏览器会自动下载解压我们预置的Flash插件，路径是<code>%appdata%\360se6\Application\components\npflash</code>和<code>%appdata%\360se6\Application\components\ppflash</code>。<br />所以使用安全浏览器，您不需要单独的去安装flash插件，<strong>当提示您Flash版本低或安装Flash版本时，您只要重新启动浏览器就可以正常浏览网页了。</strong> 如果您不单独安装，不管您安装在什么位置，chrome://plugins插件管理页面中Flash插件是不会出现多个版本的。<br />需要注意：我们预置的Flash插件只是极速模式下使用的，兼容模式下我们会调用IE浏览器自带的Flash插件<br />启用IE浏览器Flash插件的办法：</p><ol><li>您可以使用快捷键Win+R运行<code>inetcpl.cpl</code>打开Internet属性</li><li>选择程序选项卡中的管理加载项</li><li>在弹出的窗口中找到Flash启用即可</li></ol><ul><li>您已经手动安装了Flash并且经常提示Shockwave Flash崩溃。麻烦您按照以下方法操作，看看是否还会出现。</li></ul><ol><li>如果能够从其他地方获得谷歌浏览器使用的Flash插件，可以直接在<code>%appdata%\360se6\Application\components</code>路径下<code>ppflash</code>和<code>npflash</code>文件夹替换已有文件</li><li>直接删除<code>%appdata%\360se6\Application\components</code>路径下<code>ppflash</code>和<code>npflash</code>文件夹</li><li>如果前两种方法都不能正常，打开浏览器在地址栏输入<code>chrome://plugins</code>点击详细信息,停用您安装的版本，只留一个Shockwave Flash 29.0 PPAPI。</li></ol></blockquote><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      鉴于Chrome和Chromium即将在年底停止对Flash的支持，有不少用户关心使用Chromium内核的国产浏览器是否也会相应地移除Flash的支持。对此360安全浏览器官方版主“Spirit_悔灭”做出回应。
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>淘米小花仙官方回应Flash停止支持</title>
    <link href="https://no5972.moe/cms/archivers/42.html"/>
    <id>https://no5972.moe/cms/archivers/42.html</id>
    <published>2020-10-29T10:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://hua.61.com/news/18717.shtml" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%B0%8F%E8%8A%B1%E4%BB%99-%E5%85%B3%E4%BA%8E%E5%B0%8F%E8%8A%B1%E4%BB%99%E9%A1%B5%E6%B8%B8%E5%8D%81%E5%91%A8%E5%B9%B4-brightgreen" alt="小花仙-关于小花仙页游十周年" /></a> <a href="http://hua.61.com/news/19003.shtml" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%B0%8F%E8%8A%B1%E4%BB%99-%E5%B0%8F%E8%8A%B1%E4%BB%99%E5%BE%AE%E7%AB%AF%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E9%80%9A%E7%9F%A5-brightgreen" alt="小花仙-小花仙微端版本更新通知" /></a></p><h1 id="关于微端-h5-2020-08-07-1211"><a class="markdownIt-Anchor" href="#关于微端-h5-2020-08-07-1211"></a> 关于微端、H5 / 2020-08-07 12:11</h1><p>对于大家担心的2020年Flash停止更新及下架是否会对小花仙页游有影响，我们想说的是，我们和大家一样，对这方面的消息非常关心，一直在关注着。</p><p>在得知此消息之后，我们已经在对现有的微端做优化，来应对Flash的停更。优化微端为当前临时解决方法，我们也在尝试其他方式。我们一直在收集大家对现有微端的问题及建议，对于大家关心的现有版本的微端不适配笔记本、Macbook无法使用微端、微端无法放大缩小、微端无法打开充值页面、微端卡顿等问题，我们都在沟通解决中，以保证大家的正常体验。</p><p>对于大家反馈的转成H5的情况，我们也一直在讨论。想和大家说一下现阶段我们优先考虑完善微端的原因。小花仙页游的服装均为Flash制作，是矢量图，将游戏转成H5需要将所有服装为转成位图。我们了解到大家都喜欢放大服装查看细节、搭配展示。H5后游戏将无法放大到现有水平，且位图放大无法呈现高清显示。考虑到这一层原因，我们决定优先优化微端，而对于H5，我们也正在攻关服装展示及特效展示等问题。</p><h1 id="微端版本更新通知-2020-09-25-1001"><a class="markdownIt-Anchor" href="#微端版本更新通知-2020-09-25-1001"></a> 微端版本更新通知 / 2020-09-25 10:01</h1><p>小花仙9月25日版本将更新当前的微端版本。具体下载途径如下：</p><p><img src="https://img.2125.com/20200806/img/h02/h64/img202009251001400.png" alt="" /></p><p><img src="https://img.2125.com/20200806/img/h001/h31/img20200925100025fb3330.png" alt="" /></p><p>当前版本已修复目前已收集的Windows系统下的问题。</p><p>（由于Mac系统对于Flash的支持比较复杂，我们正在进行研究，会想办法尽量解决该问题。）</p><p>（编注：新的微端已经集成了Flash控件，并且是直接在窗体中加载Flash，不再通过内嵌浏览器控件加载Flash，无需再单独下载安装Flash了。这个集成的Flash控件经过我们的专业测试，绝无包含窃取隐私的服务和广告弹窗程序。我们希望这个微端能保证在2020年底Flash停止支持之后可以继续访问小花仙游戏。）</p><p><img src="https://img.2125.com/20200806/img/h02/h64/img202009251001402.png" alt="" /></p><p>考虑到大家对于放大服装的需求，我们新增了缩放的选项菜单。小花仙们在体验新版本的微端后，根据体验如有其它比例的缩放需求，可以联系露露提出建议。</p><p><img src="https://img.2125.com/20200806/img/h02/h64/img202009251001403.png" alt="" /></p><p>当前微端版本下载后可以与前一版本的小花仙同时存在，如需卸载旧版本的小花仙微端，可以前往控制面板搜索卸载。</p><p><img src="https://img.2125.com/20200806/img/h001/h31/img20200925100124821780.png" alt="" /></p><p><img src="https://img.2125.com/20200806/img/h001/h31/img20200925100125f12470.png" alt="" /></p><p>如果使用过程当中，还有遇到其它问题，还请联系露露予以反馈哦~</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      对于大家担心的2020年Flash停止更新及下架是否会对小花仙页游有影响，我们想说的是，我们和大家一样，对这方面的消息非常关心，一直在关注着。（新的微端已经集成了Flash控件，并且是直接在窗体中加载Flash，不再通过内嵌浏览器控件加载Flash，无需再单独下载安装Flash了。这个集成的Flash控件经过我们的专业测试，绝无包含窃取隐私的服务和广告弹窗程序）
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>Chrome/Chromium即将停止支持Flash的详细事宜</title>
    <link href="https://no5972.moe/cms/archivers/41.html"/>
    <id>https://no5972.moe/cms/archivers/41.html</id>
    <published>2020-10-27T09:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.chromium.org/flash-roadmap" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Chromium-Flash%20Roadmap-brightgreen" alt="Chromium-Flash Roadmap" /></a></p><h1 id="upcoming-changes-即将实装"><a class="markdownIt-Anchor" href="#upcoming-changes-即将实装"></a> Upcoming Changes 即将实装</h1><h2 id="removing-support-for-hostname-wildcards-for-pluginsallowedforurls-target-chrome-85-aug-2020br移除启用flash的网站域名白名单通配符的支持-20208版本85"><a class="markdownIt-Anchor" href="#removing-support-for-hostname-wildcards-for-pluginsallowedforurls-target-chrome-85-aug-2020br移除启用flash的网站域名白名单通配符的支持-20208版本85"></a> Removing Support for Hostname Wildcards for PluginsAllowedForUrls (Target: Chrome 85 - Aug 2020)<br>移除启用Flash的网站域名白名单通配符的支持 - 2020.8，版本85</h2><h3 id="summary-概要"><a class="markdownIt-Anchor" href="#summary-概要"></a> Summary 概要</h3><p>Remove the ability to define Flash Player content settings that use wildcards in the hostname (e.g., <code>https://*</code>or <code>https://[*.]mysite.foo</code>).<br />移除启用Flash的网站域名白名单通配符的支持。（例如<code>https://</code>或<code>https://[*.]mysite.foo</code>）</p><h3 id="rationale-原理"><a class="markdownIt-Anchor" href="#rationale-原理"></a> Rationale 原理</h3><p>The change requires that administrators to audit their Flash usage and explicitly add urls that they want to automatically enable Flash Player support for.<br />此变更要求管理员确认其使用Flash的用途并明确添加需要自动启用Flash支持的URL。</p><h2 id="removing-the-ability-for-extensions-to-inject-flash-content-settings-target-chrome-86-oct-2020br移除开发扩展时访问flash内容的支持-202010版本86"><a class="markdownIt-Anchor" href="#removing-the-ability-for-extensions-to-inject-flash-content-settings-target-chrome-86-oct-2020br移除开发扩展时访问flash内容的支持-202010版本86"></a> Removing the Ability for Extensions to Inject Flash Content Settings (Target: Chrome 86 - Oct 2020)<br>移除开发扩展时访问Flash内容的支持 - 2020.10，版本86</h2><h3 id="summary-概要-2"><a class="markdownIt-Anchor" href="#summary-概要-2"></a> Summary 概要</h3><p>Remove the ability for extensions to inject Flash Player content settings.<br />移除开发扩展时访问Flash内容的支持</p><h3 id="rationale-原理-2"><a class="markdownIt-Anchor" href="#rationale-原理-2"></a> Rationale 原理</h3><p>Ensure that all non-policy enabled Flash content requires per session activation, which coupled with the warning in the activation prompt should help to increase awareness of the impending change in support.<br />确保所有未启用策略的Flash内容都需要按会话激活，再加上激活提示中的警告应有助于提高对即将发生的支持更改的认识。</p><h2 id="flash-player-blocked-as-out-of-date-target-all-chrome-versions-jan-2021br以过期原因禁用flash-20211所有版本"><a class="markdownIt-Anchor" href="#flash-player-blocked-as-out-of-date-target-all-chrome-versions-jan-2021br以过期原因禁用flash-20211所有版本"></a> Flash Player blocked as “out of date” (Target: All Chrome versions/ - Jan 2021)<br>以“过期”原因禁用Flash - 2021.1，所有版本</h2><h3 id="summary-概要-3"><a class="markdownIt-Anchor" href="#summary-概要-3"></a> Summary 概要</h3><p>Flash Player will be marked as out of date and will be blocked from loading.<br />Flash Player将被标记为过期，试图加载时将被禁用。</p><h3 id="rationale-原理-3"><a class="markdownIt-Anchor" href="#rationale-原理-3"></a> Rationale 原理</h3><p>Align with Adobe’s announced plan to end support.<br />和Adobe宣布停止支持Flash的计划同步。</p><h2 id="flash-support-removed-from-chromium-target-chrome-88-jan-2021br从chromium移除对flash的支持-20211版本88及以上"><a class="markdownIt-Anchor" href="#flash-support-removed-from-chromium-target-chrome-88-jan-2021br从chromium移除对flash的支持-20211版本88及以上"></a> Flash Support Removed from Chromium (Target: Chrome 88+ - Jan 2021)<br>从Chromium移除对Flash的支持 - 2021.1，版本88及以上</h2><h3 id="summary-概要-4"><a class="markdownIt-Anchor" href="#summary-概要-4"></a> Summary 概要</h3><p>Flash support/ capability will be removed from Chromium.<br />从Chromium移除Flash的支持和兼容！</p><h3 id="rationale-原理-4"><a class="markdownIt-Anchor" href="#rationale-原理-4"></a> Rationale 原理</h3><p>Align with Adobe’s announced plan to end support.<br />和Adobe宣布停止支持Flash的计划同步。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      2021.1：从Chromium移除对Flash的支持！
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>文科生如何成为高级程序员</title>
    <link href="https://no5972.moe/cms/archivers/40.html"/>
    <id>https://no5972.moe/cms/archivers/40.html</id>
    <published>2020-10-19T09:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://www.exam8.com/computer/djks/xinde/200503/8400.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%B8%AD%E5%9B%BD%E7%94%B5%E8%84%91%E6%95%99%E8%82%B2%E6%8A%A5%20%C2%B7%20%E5%88%98%E5%AE%97%E5%87%A1-%E7%94%B1%E2%80%9C%E7%94%B5%E8%84%91%E7%9B%B2%E2%80%9D%E6%88%90%E4%B8%BA%E9%AB%98%E7%BA%A7%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E8%AF%AD%E6%96%87%E6%95%99%E5%B8%88-brightgreen" alt="中国电脑教育报 · 刘宗凡-由“电脑盲”成为高级程序员的语文教师" /></a></p><p>在半路出家的程序员队伍里，我的经历应该比较有代表性：先在一所师范专科学校接受了三年中文教育，毕业后开始在一个小镇教书，后来通过三年的自学，由一个计算机知识为零的“电脑盲”，拿到了软件水平考试中的高级程序员级别证书，并通过了全国计算机四级考试（成绩优秀）。其中的经验教训有很多，写下来供大家参考。</p><h1 id="关于学习"><a class="markdownIt-Anchor" href="#关于学习"></a> 关于学习</h1><h2 id="坚定的信心"><a class="markdownIt-Anchor" href="#坚定的信心"></a> 坚定的信心</h2><p>自学计算机是需要一定的条件的，现在回想起来，我当时的条件不算好：第一，没有基础。大专学的是中文，而且完全没有接触过电脑，对计算机没有一点感性认识，甚至不知道学电脑要学些什么……第二，环境很闭塞。第三，缺少硬件条件。开始的半年我没有电脑，只能纸上编程；一边工作一边学习，而且总感觉时间不够。尽管困难重重，但我确信一条：计算机知识是一门技术学科，不是一门艺术；可能有人终其一生，也不能成为一名艺术家，但每个人通过努力，都是可以掌握好一门技术的。正是因为有这样坚定的信心，我才能够在三年的时间里，克服了常人难以想像的困难，终于达到了自己的目标。</p><h2 id="选好教材"><a class="markdownIt-Anchor" href="#选好教材"></a> 选好教材</h2><p>没人指导自己学习，选一些好的教材就显得非常重要了。开始我也不知道什么书好，见什么买什么。后来发现一些大学教材内容很系统，而且也有一定的权威性。我后来选的就是清华大学计算机系的教材。学完教材后，我开始研究三本软件水平考试的统编教材，如果一开始就看统编教材，会觉得书里结论大多没有详细的阐述，很难理解和记忆，但先系统学完教材后，你会发现统编教材起了一个很好的综合作用。</p><h2 id="学会不求甚解"><a class="markdownIt-Anchor" href="#学会不求甚解"></a> 学会“不求甚解”</h2><p>我这里说的“不求甚解”并不是指不认真学习。自学电脑最怕钻牛角尖：看书时一个问题不明白，就在那里卡住，非解决它不可——这样的方法我是不赞成的。首先，它会严重打击你的自信心，使你丧失继续学习下去的兴趣；其次，这样浪费了许多时间。因此学习时要给自己留一些“不懂”的余地。例如第一遍读书时要允许自己似懂非懂，用规定的时间(例如两个星期)把它看完，然后开始第二遍学习。开始时许多不明白的东西，这次就容易理解多了。</p><h2 id="重点突破"><a class="markdownIt-Anchor" href="#重点突破"></a> 重点突破</h2><p>计算机的专业课程很多，如果要通过软件水平考试，我认为一定要抓住《数据结构》这门核心课程。软件水平考试最难通过的部分是下午试题，其中很多内容涉及数据结构中的知识，大部分试题都是数据结构的演化。只有对线性表、栈和队列、树、查找、排序等问题非常精通，编程的难题才能迎刃而解。在1997年参加程序员考试时，最后一道题目整体上我看得不是很懂，但由于我对数据结构比较熟悉，我把需要填空的上下两句仔细看了看，就知道是实现一个链表的问题，而链表的操作我十分熟练，我自信地填上了正确答案。数据结构应该学到什么程度呢？我认为，基本上能用高级语言来实现各种数据结构就差不多了。</p><p>重点突破的另一个含义是扬长避短：一个非计算机专业的考生，很难做到知识十分全面。特别是对一个文科生来说，数学是心头永远的痛，而我的英语也丢了多年。是花费巨大的精力去补数学和英语，还是把精力集中在其他科目？经过权衡，我选择了后者。在程序员和高程考试中，上午试题的前十一道，我基本上得了满分，数学和英语对我的影响并不大。我的顺利过关，就是舍车保帅策略的成功运用。当然这只是针对应试而言，如果你现在还有机会学习数学和英语，还是应当尽量把它们学好。</p><h2 id="多上机"><a class="markdownIt-Anchor" href="#多上机"></a> 多上机</h2><p>虽然软件水平考试下午试题只要填上程序所缺的语句，不用上机调试，但要想做对，就离不开平时多上机练习了。有时你看书时觉得懂了，但上机时却会发现一个简单的程序也容易漏洞百出。我把统编教材《程序设计》中的程序上机调试了两次：第一次基本上是照书打字，边打边想；第二次是先看题自己做，实在不会时才对照一下教材，看自己为什么做不出来。调试程序的过程中会发现C语言中的许多精妙的地方，一些考试时容易忽略的细节问题也都暴露出来，对考试十分有利，下午试题考的就是你的思维是否严密。</p><h2 id="多做试题"><a class="markdownIt-Anchor" href="#多做试题"></a> 多做试题</h2><p>我不提倡多做模拟题，因为模拟题的难度很难把握——不是太难就是太易，对考试帮助不是很大。但一定要把近几年的正式试题找来做，最好能做十份左右。虽然每年的考题都不同，但你一定能够在历年的考题中发现一些有规律的东西——它要考核你什么样的能力？它考一些什么知识点？这样，你在复习时就能做到有的放矢。</p><h1 id="关于四级考试"><a class="markdownIt-Anchor" href="#关于四级考试"></a> 关于四级考试</h1><p>四级考试难度相当大，据说几年通过的人数寥寥无几。据我看，四级的上机考试题相对程序员考试下午试题来说还是容易的，关键在于笔试有120道题，所以考到的内容十分广泛、细致，并且有三分之一的题目是用英语出的。这要求你在学习时一定要注意每一个细节问题，对计算机的专业术语的英语表达方式要熟悉。笔试还有一道论述题，其内容并不完全出自书本，需要你有比较流畅的表达方式，还要对计算机的最新发展动向有一定了解，才能圆满地解决论述题。</p><p>我在三年努力下，从初级程序员考试到高级程序员考试，从二级、三级（B）到四级，一年一个台阶，顺利通过了软件水平考试和等级考试中的最高级别的部分。希望我的这些经验能帮助那些刚起步的朋友顺利迈入计算机的殿堂。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      在半路出家的程序员队伍里，我的经历应该比较有代表性：先在一所师范专科学校接受了三年中文教育，毕业后开始在一个小镇教书，后来通过三年的自学，由一个计算机知识为零的“电脑盲”，拿到了软件水平考试中的高级程序员级别证书，并通过了全国计算机四级考试（成绩优秀）。其中的经验教训有很多，写下来供大家参考。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>一个程序员给初学编程人的建议</title>
    <link href="https://no5972.moe/cms/archivers/39.html"/>
    <id>https://no5972.moe/cms/archivers/39.html</id>
    <published>2020-10-19T09:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.cnblogs.com/clinging/articles/925852.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-%E4%B8%80%E4%B8%AA%E7%A8%8B%E5%BA%8F%E5%91%98%E7%BB%99%E5%88%9D%E5%AD%A6%E7%BC%96%E7%A8%8B%E4%BA%BA%E7%9A%84%E5%BB%BA%E8%AE%AE-brightgreen" alt="未知-一个程序员给初学编程人的建议" /></a></p><p>本篇文章是作者多年来的一些感受，主要写给那些想学习程序设计而又很迷惘的朋友，希望可以带来一点帮助。</p><p>我第一次接触电脑是在小学二年级的时候。那时纯粹是因为喜欢打电子游戏，听别人说电脑上的游戏十分好玩，于是就漫漫开始与之接触了。在三年级时父母出于我对计算机浓厚的兴趣送我去了一个BASIC编程学习班，从那时起我才真正开始走上编程这条不归之路。虽然说现在程序设计这门专业在社会上很热，竞争十分激烈，但是这只是学习编程的人比较多而已。真正能够掌握以至于精通的人实际上很少，毕竟中国的软件业才刚刚起步不久。现在社会对优秀的程序设计人员的需求量还是相当大的，但是前提是必须要优秀。我自己虽然也谈不上优秀，但多少还是有些感触。在这里想讲述自己对于一般程序员和优秀程序员之间在技术上的一些认识（什么敬业精神生活态度我就不多说了）：</p><h1 id="首先作为一个优秀的程序员数学是十分重要的"><a class="markdownIt-Anchor" href="#首先作为一个优秀的程序员数学是十分重要的"></a> 首先作为一个优秀的程序员，数学是十分重要的。</h1><p>数学是自然科学的基础，计算机科学实际上是数学的一个分支。数学主要能让人懂得一种分析问题的方法，然后再通过编程去实现它。计算机内部的许多原理也都牵涉到比较复杂的数学知识。它是我们用来解决现实问题的最高效的工具。很多学习编程的朋友对数学觉得不屑一顾，觉得对于编程没有什么关系。实际上优秀程序员和一般程序员拉开档次很大一个程度上就是取决于对数学的能力。一些项目有时需要很复杂的数学建模和利用数学对于系统效率进行分析，而这些项目对于一般的程序员是很困难的。正确应用数学知识有时候能使你的程序的效率产生质的飞跃。现在的程序员在数学上普遍是薄弱环节，这点是大家应该引起足够重视的。当别人对于这些项目感到无从下手，而你却能够完成，这个时候你的价值也就表现出来了。真正优秀的程序员是能够最基本的一点就是要能够通过自己的知识来解决一般程序员所无法完成的问题。而数学能力就是一个很重要的环节。</p><h1 id="其次就是要对数据结构引起足够的重视"><a class="markdownIt-Anchor" href="#其次就是要对数据结构引起足够的重视"></a> 其次就是要对数据结构引起足够的重视。</h1><p>如果说计算机专业的学生与非计算机专业的最根本的差别绝对是数据结构（数学大家都一样学了，主要看你自己学得好坏）。对数据结构的掌握与运用能力是衡量你编程能力的一个很重要的指标。有的人对于看了链表，栈，树，广义表这些东西就头痛。然而这些东西往往能使你的程序的效率比别人高出百倍。由于一直搞信息学竞赛，到了大学又搞ACM，所以我对数学和数据结构都掌握得相对较好。这使我在应聘与工作中明显感到胜人一酬。记得自己大学时去一家公司应聘的经历，当时去应凭的还有3个人，有2个大学毕业，有个也工作了一段时间了。他们几个都在大讲自己的能力如何之强，会使用的语言及编程工具如何之多，经验如何之丰富。按理说我应该是资质最浅的。当时也是初生牛X不怕虎，也就硬着头皮去了。当时面试的题目是一个公司的资金管理项目的一个问题，要求每个人都在思考后给出自己的设计方案。其中比较核心的一个问题就是要计算一个资金最小波动值的问题，给出的数据量相当大，对效率要求很高。对于整个程序的面向对象化的分析我们几个都是差不多的，毕竟这些东西在学校里是很重视的，而且不是真正的难点。然而到了最关键的问题时其余的人都卡壳了，有两个是用简单的双重循环，时间复杂度(<em>N</em><sup>2</sup>)，惨不忍睹。还有一个在冥思苦想了好一阵以后说用树，具体技术细节又讲不清楚，效率分析也很马虎。只有我当时很快就给出了采取AVL树的方案，并且利用高等数学推导作出了很详细的效率分析和时空换算，并提出了引入汇编的方法。很自然的我得到了这份工作。在这里大家显然可以看到数学和数据结构对于一个优秀程序员是多么重要，它们是和一般的程序员打开档次的最关键的地方。这样向“枣子”碰到的那种情况应该很轻松的就可以想到。</p><p>如果你是一位想学习编程的朋友，我经过多年的学习总结出来了一个学习的线路希望对你有所帮助。要学习编程是要有很大恒心和毅力的，首先你要明确自己的目标，想好自己编程是为了干什么。如果你学习仅仅只是一时想编出QUAKE和成为比尔盖茨的冲动，那么我劝你还是应该还是不要开始学习，应为这样的目标很难支持你日后大量的学习。而且你的年龄不能太大（最好是中学或者大学生）。如果你想好目标并决定开始奋斗，那就让我们开始吧。如果你一开始对电脑一无所知，那么你应该先熟悉一些电脑的一些最基本的原理和操作，这个不需要特别细致的学习，只要大概知道二进制和一些基本操作就可以了。接下来你应该先学习BASIC语言，这个语言并不会耽误你太多的时间，学习它完全是为了入门，让你对电脑编程有一个比较初步的认识。这时候你应该多编一些小的程序，知道一些最基本每条语句的功能，搞清楚一些基本的数据结构（尤其是数组）对于一些其余用途的函数最好不要做任何学习，因为这样只会分散你的注意力。当你能够可以熟练的运用BASIC编出猴子选大王，以及电脑出题考试之类的程序时，你就可以开始后面的学习了。接下来如果觉得自己接受能力强的话就可以开始学C了（注意不是C++），如果感觉有困难也可以先学Pascal过度一下。还有很重要的一点就是千万不要一开始就学VB，Delphi，VC之类的东西，这些东西在一开始学会对你造成很坏的影响。有可能会把你引入另外一个错误的学习方向而忽略了真正应该掌握的东西。学C主要是学过程话的程序设计，学会把自己的程序分成许多的函数（或过程），养成良好的编程习惯。这时可以多看一下高人的程序，不一定要懂意思，主要是学会别人程序的格式（比如变量如何起名，怎么划分函数）。除开掌握基本的控制流语句外，应该学习一些很简单的I/O函数和数学函数。</p><p>C的学习主要是你舍弃原来BASIC程序那种把所有语句积成一大堆的风格，要学会使用函数，提高代码重用性。对于指针之类的东西如果实在看不懂可以先不去管，到后面会有办法。当你能够比较自如的用C编写一些小的计算程序时，你就可以开始你的数据结构的学习了（数学的学习主要是在学校，自己要多用心）。数据结构你可以一点一点漫漫看，并不需要专门空出一段时间来专门研究，这样的目的是让你能够很好的掌握它，要学会用数据结构的知识来规范自己的程序设计和提高程序的效率。学完C我认为接着最好学习汇编。这个或许有许多人都会反对，然而我个人认为这样是很好的。从最基本的DOS汇编开始，买本《IBM PC汇编程序设计》（清华黄皮）一定要一点一点吃透，实在看不懂就跳，反复的严读是一定可以看懂的。汇编是一定要掌握的，因为它涉及到很多最基本的知识。掌握了汇编和对I/O有了个很彻底的认识后，应该去学编译原理。这个东西并不要精通，但是一定要知道，在大脑里要有一个这样的概念，这对你对程序语言的控制能力都有很大的帮助。这样最基本的学习就算完成了。一般智力正常的人前一段东西应该都是可以掌握的。接着后面的学习就要看你自身的造化了。这个时候你应该研究一下数据结构，不要分散自己学习的注意力，要知道数据结构是异常重要的（相信我，绝对没错）如果你觉得自己已经对于树，连表，堆栈之类的东西和排序，递归之类的算法已经十分清楚，就可以开始学习C++了。学习前一定要有个正确的认识，那就是C和C++是两个不同的东西。学习C++是为了学习面向对象的程序设计，这个时候你对于指针应该也能够掌握了（有汇编的基础），主要抓住C++和C相比的一些新特性，对于多态之类的特性要注意理解掌握，如果没有搞懂就坚决不要往下学习。一些基本的概念掌握以后可以看一些别人设计的程序，学习别人怎么利用面向对象的方法来设计程序的。这个东西也是人之间拉开档次的一个环节，可以和数据结构放在同等重要的地位。我就见过有的人都大学毕业了还搞不懂<code>virtual</code>到底是怎么一回事情。其实我认为学到这里你已经为你成为一个优秀的程序员打下了很好的基础，你已经能够应用C++，懂得面向对象程序设计，对数据结构掌握很好，掌握汇编和编译原理。接下来的学习就是基于操作平台的了，一般是先学Windows（Microsoft毕竟是老大），先学Win32 API，搞请Windows基本消息机制和原理，有汇编基础基本上不会碰到什么困难。其实只要会了API，其余什么MFC，VCL都是囊中之物了，都不过是对于API的封装而已。VC，C++Builder都可轻松拿下，这只是开发工具的问题。以后的OLE(ActiveX)，.NET，数据库就要看自己的发展方向而定了。我在这里强调的是前面的基本能力的学习，后面操作平台虽然知识体系庞大，然而毕竟比较死，更好掌握。最后编程能力的高低主要还是有以下几点决定：1. 编程的习惯 2. 数学能力（包括逻辑思维，分析问题的能力） 3. 对数据结构的认识能力 4. 经验的多少（包括多使用语言的掌握能力）</p><p>以上只是本人一些愚见，希望大家指出不正确的地方并与我多多交流。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      本篇文章是作者多年来的一些感受，主要写给那些想学习程序设计而又很迷惘的朋友，希望可以带来一点帮助。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>小花仙 对Flash页游截取4K级别高清图的方法</title>
    <link href="https://no5972.moe/cms/archivers/38.html"/>
    <id>https://no5972.moe/cms/archivers/38.html</id>
    <published>2020-10-11T01:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>这是鄙人又摸索出来的一套解决方案，通过Chrome或Chromium的F12工具来截取高清截图。正如<a href="https://blog.csdn.net/qq_35977139/article/details/108988838" target="_blank" rel="noopener">鄙人此前在CSDN发布的笔记</a>一样，Chrome在62版本之后就已经原生支持了截取指定HTML节点的截图，国产浏览器只要不是太老的版本应该都是可以支持的。之前那个通过RDP远程桌面截图的方式实在太过于麻烦，鄙人现在这一套方法比使用远程桌面要简单不少。</p><div class="note warning"><p><strong>2020年底之后Chrome和Chromium浏览器将停止对Flash的支持，但是不排除一些国产浏览器会继续支持Flash，所以可能还是需要使用国产浏览器来进行操作。</strong></p></div><p>前往http://hua.61.com/Client.swf?t=4561654354 （随便输入一串数字）。国产浏览器大都能直接显示，但是Edge和Chrome不能直接打开，他会变成文件下载。鄙人曾经开发过一个扩展可以让浏览器直接播放本地SWF或远程的SWF的URL。但是在试图向微软的浏览器扩展商店投稿时被审核退回了。。。</p><p>把F12开发人员工具打开，不同的浏览器操作方式可能不一样，鄙人的Edge浏览器是菜单按钮-更多工具-开发人员工具。然后点击左上角第二个图标打开设备模式。点击网页上边选择设备的下拉框选编辑（Edit）。点击添加自定义设备（Add custom device），设备名称（Device Name）随便输入，然后尺寸我们用3840 2160当然你也可以尝试8K的7680 4320，但是鄙人发现8K竖屏放大到大约4倍的时候就不能再放大了。设备像素比（Device pixel ratio）不用管，用户戴笠字符串（User agent string）也不用管，设备类型选桌面（Desktop）。点击添加（Add）。然后在网页上边的选择设备的下拉框选择我们刚刚添加的设备。</p><p>刷新一下页面（F5可能是失效的，因为此时输入焦点可能在Flash里面，建议使用鼠标点击浏览器的刷新按钮来刷新）。按照原来使用右键设置麦克风的方法把画面改成显示全部。大概是右键设置麦克风选项卡展开那个下拉框然后鼠标不要动直接右键单击就可以出来缩放画面的菜单了，这个不是一定能成功的得多试几次。使用高分辨率的模拟设备的时候界面有点小，可能会不好点，需要一定的眼力来控制好鼠标的位置。</p><p>然后进到你要截图的画面，回到开发人员工具。到元素（Elements）标签，选中那个<code>embed</code>标签。然后我们要按一个快捷键<code>Ctrl+Shift+P</code>，然后就会呼出一个神秘菜单。我们在这个菜单输入&quot;Capture node screenshot&quot;，当然不需要全部输入他自己就能显示出来。<strong>看到这个选项之后用鼠标或者用键盘移动光标回车选择这个选项，一张4K截图就出来了。</strong></p><div class="note info"><p>当然你也可以继续使用原来右键设置麦克风的方法继续放大画面再回到F12执行&quot;Capture node screenshot&quot;，从而截图更细节的图像。</p></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这是鄙人又摸索出来的一套解决方案，通过Chrome或Chromium的F12工具来截取高清截图。正如[鄙人此前在CSDN发布的笔记](https://blog.csdn.net/qq_35977139/article/details/108988838)一样，Chrome在62版本之后就已经原生支持了截取指定HTML节点的截图，国产浏览器只要不是太老的版本应该都是可以支持的。之前那个通过RDP远程桌面截图的方式实在太过于麻烦，鄙人现在这一套方法比使用远程桌面要简单不少。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>【小花仙】笔记：Chrome 62 新增了对指定HTML元素截图的功能</title>
    <link href="https://no5972.moe/cms/archivers/37.html"/>
    <id>https://no5972.moe/cms/archivers/37.html</id>
    <published>2020-10-10T15:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://developers.google.com/web/updates/2017/08/devtools-release-notes" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/Kayce%20Basques-What's%20New%20In%20DevTools%20(Chrome%2062)-brightgreen" alt="Kayce Basques-What's New In DevTools )" /></a></p><p>New features and changes coming to DevTools in Chrome 62:</p><ul><li>Support for top-level <code>await</code> operators in the <strong>Console</strong>.</li><li><strong>Screenshots of a portion of the viewport, and screenshots of specific HTML nodes.</strong></li><li>CSS Grid highlighting.</li><li>A new <strong>Console</strong> API for querying objects.</li><li>Negative filters and URL filters in the <strong>Console</strong>.</li><li>HAR imports in the <strong>Network</strong> panel.</li><li>Previewable cache resources.</li><li>More predictable cache debugging.</li><li>Block-level code coverage.</li></ul><p>Chrome 62在开发人员工具添加了新的功能和变动：</p><ul><li>支持<strong>控制台</strong>顶级<code>await</code>关键字。</li><li><strong>对屏幕指定区域的截图，以及对指定HTML节点的截图！</strong></li><li>CSS栅格的高亮。</li><li>关于查询对象的新的<strong>控制台</strong>API。</li><li><strong>控制台</strong>的负过滤器和URL过滤器。</li><li><strong>网络请求</strong>界面导入HAR。</li><li>可以预览的缓存资源。</li><li>可以更好预测的缓存调试。</li><li>块级作用域。</li></ul><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Chrome 62在开发人员工具添加了新的功能和变动：
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>重读《由C#风潮想起的－给初学编程者的忠告》有感</title>
    <link href="https://no5972.moe/cms/archivers/36.html"/>
    <id>https://no5972.moe/cms/archivers/36.html</id>
    <published>2020-10-08T09:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://www.cnblogs.com/XmNotes/archive/2009/12/27/1633448.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%B0%8F%E5%9F%8E%E6%95%85%E4%BA%8B-%E9%87%8D%E8%AF%BB%E3%80%8A%E7%94%B1C%EF%BC%83%E9%A3%8E%E6%BD%AE%E6%83%B3%E8%B5%B7%E7%9A%84%EF%BC%8D%E7%BB%99%E5%88%9D%E5%AD%A6%E7%BC%96%E7%A8%8B%E8%80%85%E7%9A%84%E5%BF%A0%E5%91%8A%E3%80%8B%E6%9C%89%E6%84%9F-brightgreen" alt="小城故事-重读《由C#风潮想起的－给初学编程者的忠告》有感" /></a></p><p>我大约刚开始学编程时就看到<a href="34.html">这篇文章</a>了（下面简称《C#风潮》），这是一篇被转载了上万次的名文，可参见这里<a href="https://www.google.com.hk/search?newwindow=1&amp;safe=strict&amp;hl=zh-CN&amp;ei=w91-X5jBAZH4hwO4rIX4Aw&amp;q=%E6%88%91%E5%A7%8B%E7%BB%88%E8%AE%A4%E4%B8%BA%EF%BC%8C%E5%AF%B9%E4%B8%80%E4%B8%AA%E5%88%9D%E5%AD%A6%E8%80%85%E6%9D%A5%E8%AF%B4%EF%BC%8CIT%E7%95%8C%E7%9A%84%E6%8A%80%E6%9C%AF%E9%A3%8E%E6%BD%AE%E6%98%AF%E4%B8%8D%E5%8F%AF%E4%BB%A5%E8%BF%BD%E8%B5%B6%E7%9A%84%EF%BC%8C%E8%80%8C%E4%B8%94%E4%B9%9F%E6%B2%A1%E6%9C%89%E8%83%BD%E5%8A%9B%E5%8E%BB%E8%BF%BD%E8%B5%B6%E3%80%82%E6%88%91%E6%97%B6%E5%B8%B8%E7%9C%8B+%E8%A7%81%E8%87%AA%E5%B7%B1%E7%9A%84DDMM%E4%BB%AC%E6%8A%8A%E8%AF%BE%E6%9C%AC%E6%89%94%E4%BA%86%EF%BC%8C%E5%8E%BB&amp;oq=%E6%88%91%E5%A7%8B%E7%BB%88%E8%AE%A4%E4%B8%BA%EF%BC%8C%E5%AF%B9%E4%B8%80%E4%B8%AA%E5%88%9D%E5%AD%A6%E8%80%85%E6%9D%A5%E8%AF%B4%EF%BC%8CIT%E7%95%8C%E7%9A%84%E6%8A%80%E6%9C%AF%E9%A3%8E%E6%BD%AE%E6%98%AF%E4%B8%8D%E5%8F%AF%E4%BB%A5%E8%BF%BD%E8%B5%B6%E7%9A%84%EF%BC%8C%E8%80%8C%E4%B8%94%E4%B9%9F%E6%B2%A1%E6%9C%89%E8%83%BD%E5%8A%9B%E5%8E%BB%E8%BF%BD%E8%B5%B6%E3%80%82%E6%88%91%E6%97%B6%E5%B8%B8%E7%9C%8B+%E8%A7%81%E8%87%AA%E5%B7%B1%E7%9A%84DDMM%E4%BB%AC%E6%8A%8A%E8%AF%BE%E6%9C%AC%E6%89%94%E4%BA%86%EF%BC%8C%E5%8E%BB&amp;gs_lcp=CgZwc3ktYWIQA1DDTFjDTGDhTmgAcAB4AIABowGIAdUEkgEDMS40mAEAoAEBqgEHZ3dzLXdpesABAQ&amp;sclient=psy-ab&amp;ved=0ahUKEwjYrsSa2aTsAhUR_GEKHThWAT8Q4dUDCA0&amp;uact=5" target="_blank" rel="noopener">文章搜索</a>。今天无意间又看到它，《C#风潮》显然是很不错的文章，作者列举学习中的实例包括自己的经历，将自己对技术学习的深刻理解，清晰地展示给我们，并指出了学习的方向。又一年就要过去了，现在重读，联想这几年的经历和认识的发展，我觉得有一些新的体会。</p><p>文章的第一句话是：“我始终认为，对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。”</p><p>作者没有直接解释原因。为什么呢，现在我有点明白了。很显然，如果你能比别人更早地认识到一项新技术的潜力，你就比别人有更好的发展机会，获得更大的收获。作者的想法是，作为初学者，他不太可能具备判断技术前景的能力。其实这种能力其实在真正的技术人员中，也只有少数人具备。</p><p>接着，作者对大学的师弟师妹们忽视基础课程，学习C#等“先进”语言感到痛心。可是，为什么同学们会把课本扔了呢？我来解释吧，乏味的课程、过时的教材、水平低下的师资、脱离实践的教学让大学生们失去了方向。作者是非常有才华的，他在大学的成功是个别案例。说实话，中国的大学教育让每个有识之士都痛心。</p><p>最近常在看李开复等大家的博客，开始体会到一点学习的本质，就是忘掉你学到的知识和技能后剩下来的东西。不管是大学生也好，初学编程者也好，如果没有面临眼前的生活压力，就请追随自己的激情和兴趣，选你最喜欢的技术吧，不用管那些科班的教授专家怎么说。你可能走得不是他们指定的阳关大道，但关键是，要去学，有目的地学，不管是C#也好还是汇编也好，都可以找到共通的学习方法。</p><p>如果你对新技术感兴趣，完全可以勇敢地去追。当然也不能为了赶流行风潮，看到别人追我也追，而是为了它的学习价值。确实有绝大多数新技术是昙花一现，但有旺盛生命力的技术也在不断扎根发芽。现在早已证明了，当年涌现C#语言及其所在的.Net平台不是一阵风，而是一场革命。即使某项技术失败了，也未必就是技术本身的问题，比如可能是过于超前了，但其中蕴含的思想却可能非常可贵。将思想和方法学到手，会让人终身受用。</p><p>接下来作者讲了几个初学者的误区。第一个是“认为计算机技术等于编程技术”，这个说不上什么误区，人的认识是随着对事物了解的逐渐深入而提升的，这是一个持续无止境的过程。很多人开始连网络和服务器都搞不清，自然不会对计算机技术有多全面的认识。不过我认为，对于初学者来说，只要能像作者后面说的“日三省乎己”，时常想想自己学了些什么，还有些什么相关的东西需要掌握，自己对什么最感兴趣之类问题，对计算机技术认识自然会丰富并立体起来。</p><p>第二个误区是“咬文嚼字的孔已己作风”，双手赞成，这显然是应试教育的恶果。有个作者的师弟跟他说：“C++ 太难了，学了这里忘了那里，学了继承忘了模板。”作者的回答道：“你不去学就容易了”。作者说，“死抠C++的语法就和孔已己炫耀茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。”编程是创造性思维的结晶，不像马哲那样可以靠死记硬背，而要结合实践加以理解贯通。而如果你对这个技术点的应用有相当的心得，让你再描述一下这个知识点，你说得会比国内绝大多数技术书籍上那些专家写得还要好。</p><p>联想到前几个月，园子上有个热门文章<a href="http://www.cnblogs.com/MichaelTao/archive/2009/08/04/1536983.html" target="_blank" rel="noopener">关于最近面试的一点感想</a>，讲面试时询问对方“<code>delegate</code><a href="http://xn--3ds.net" target="_blank" rel="noopener">在.net</a> framework1.1,2.0,3.5各可以怎么写”的问题。老赵为此连作三篇文章（<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/08/05/from-delegate-to-others.html" target="_blank" rel="noopener">从.NET中委托写法的演变谈开去</a>）详述了对<code>delegate</code>这个技术点的心得，事实充分，论证严密，证明这确实是一个能够检验面试技术人员水平的好问题。这才是真正地学懂了、学会了！不过好问题也是有条件的，这个问题将来会在网上广泛传播，要是再有面试官出这样的题目，就值得商榷了，有可能会真的招到像孔已己一般的牛人。不过时下的环境各种浮躁，从那篇文章的评论中，可以看到山间竹笋和墙上芦苇盛行，连孔已己都不多见了。</p><p>第三个误区点到《C#风潮》文的核心，“不顾基础，盲目追赶时髦技术”。作者举了自己的亲身经历，并与同学对比，看上去很有说服力。综合看这篇文章，作者不经意泄露了他的潜意识，即从汇编到C++到VC的道路才是编程的武学正宗，其他都是“歪门邪道”。作者下面对各个编程相关课程的描述也证明了这一点。</p><p>首先，编程语言没有高低之分，编程开发者的水平，当然也包括他的报酬，和他用语言没有关系。C++程序员能拿到的薪水，C#或VB程序员一样能达到，并且未必就得比C++程序员付出的努力多。只是由于C#是更容易入门的语言，所以菜鸟程序员要多得多，显得好像不如C++“高贵”，其实这反倒是它先进的体现。</p><p>至于说数据结构和操作系统原理是学习编程的基础，前者还算可以，可以使你更好地理解性能、存储、算法的概念。至于操作系统原理，如果你有志于参加个Windows 8开发（微软总部已经在招聘了），当然是必须学好的。但对于一般地C/S、B/S以及嵌入式开发，我实在是想不明白了解操作系统原理有什么必要性。当然了解了更好，但是可能还不如花半小时研究一个性能测试工具的使用更有意义。</p><p>其实，并不是先学HTML和VB导致作者的同学在毕业时输给了作者，而是那位同学不够努力和专注。他没有在Web开发上，达到与作者相同的高度。我认为初学者真正的第三个误区是（如果第一个算的话），不明白成功源自努力和专注。开始作者说，师弟师妹们把课本扔了花钱买C#、ASP的书看，但据我所知，绝大多数人花钱买了书，看不几页也丢到一边了。大学新生，只要去将毕业的师兄师姐物品处理摊拉，肯定能淘到好多新书。同样，很多人买了电脑，开始是想练编程，过不多久就成了网游用机。</p><p>这也不能怪这些初学者。国内出版的技术书籍水平实在不敢恭维，近两三年还好了些，翻译的书多了，也有个别不错的国内作者，但对初学者一开始就看出某本书的价值还是困难了点。再就是应试教育环境下长大，大家自学能力和意识普遍很差，大学里又没有人指引，实践机会也少，遇到一些困难和困惑，结果自然就是放弃了。</p><p>作者还以课程描述的形式，设计了他理想中的Windows程序员技术学习路线。我想他认为这条路线适应于所有想成为程序员的人，但还是保留了一下。我觉得《操作系统原理》、《计算机体系结构》大致了解一下就行，不了解也没太大关系。《数据结构》还是比较重要的，尤其是其中的思路和方法。英语的重要性就不用说了，至于《大学英语》就算了，那不是我们需要的，多看原版技术书籍和文章吧。软件工程也非常重要，作者的学习方法非常值得称道：“不要花太多的时间 去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获”。许多开发人员甚至技术管理人员，都完全没有软件工程的概念和意识，你如果有，哪怕是一点，也是将对未来你的发展弥足珍贵。</p><p>这些课程中，作者相当推崇《Windows 程序设计》，现在情况也不一样了。作普通windows程序设计，.Net平台下开发效率要远超过C++平台。就是在C++平台中，VC++也属于较难上手的，C++ Builder则容易得多。我们有很多的选择，每个人的情况都不一样，适合自己的才是最好的。</p><p>最后，作者谆谆提出了对初学者的忠告：为你的将来着想，把最多的时间花在学习上。只要去学，只要不是学害人的东西，学什么都要比把时间荒废要好得多。环境也许无法改变，但你可以改变自己。</p><p>纵观全文，不可否认，《C#风潮》是有部分保守的观点。 但多年之后重读此文，在到处是浮躁的大学，浮躁的业界，浮躁的社会中，这篇文章依然能闪光。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      我大约刚开始学编程时就看到这篇文章了（下面简称《C#风潮》），这是一篇被转载了上万次的名文，可参见这里 文章搜索。今天无意间又看到它，《C#风潮》显然是很不错的文章，作者列举学习中的实例包括自己的经历，将自己对技术学习的深刻理解，清晰地展示给我们，并指出了学习的方向。又一年就要过去了，现在重读，联想这几年的经历和认识的发展，我觉得有一些新的体会。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>（已恢复）Valine评论失效 由于LeanCloud国际版通用域名失效</title>
    <link href="https://no5972.moe/cms/archivers/35.html"/>
    <id>https://no5972.moe/cms/archivers/35.html</id>
    <published>2020-09-24T02:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><div class="note info"><p><strong>9月27日更新：通用域名已经恢复，但是仍然不建议使用通用域名，仍然建议更换为自定义URL。</strong></p></div><p>昨天开始，国内大量使用国际版LeanCloud后端的博客的Valine评论一齐失效。</p><p>通过<a href="https://github.com/xCss/Valine/issues/340" target="_blank" rel="noopener">Valine的Github的Issue</a>得知，早在5月份LeanCloud官方就低调表示us.avoscloud.com域名将于不久后下线。</p><p>现在如果使用国际版LeanCloud作为Valine评论的后端的话则必须指定自定义服务器URL才能正常使用了。</p><p>自定义服务器的URL需要到LeanCloud后台查看。打开后台之后进入Settings - App Keys，找到Domain whitelist，里面的Request domain里面的那个xxxxxxxx.api.lncldglobal.com就是你需要指定的服务器URL。其中xxxxxxxx就是各位的AppID的前8位字符。</p><p>NexT主题需要在主题的<code>_config.yml</code>找到<code>valine</code>的<code>serverURLs</code>，设置为：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">serverURLs:</span> <span class="string">https://xxxxxxxx.api.lncldglobal.com</span> <span class="comment"># 把xxxxxxxx替换成你自己AppID的前8位字符</span></span><br></pre></td></tr></table></figure><p>这时候再重新部署应该就可以恢复了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      现在如果使用国际版LeanCloud作为Valine评论的后端的话则必须指定自定义服务器URL才能正常使用了。自定义服务器的URL需要到LeanCloud后台查看。打开后台之后进入Settings - App Keys，找到Domain whitelist，里面的Request domain里面的那个xxxxxxxx.api.lncldglobal.com就是你需要指定的服务器URL。其中xxxxxxxx就是各位的AppID的前8位字符。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>初学编程者的良言警句</title>
    <link href="https://no5972.moe/cms/archivers/34.html"/>
    <id>https://no5972.moe/cms/archivers/34.html</id>
    <published>2020-09-22T04:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://blog.csdn.net/FlyHope2005/article/details/184527" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E5%88%98%E5%B7%8D-%E7%94%B1C%EF%BC%83%E9%A3%8E%E6%BD%AE%E6%83%B3%E8%B5%B7%E7%9A%84%E2%80%94%E2%80%94%E7%BB%99%E5%88%9D%E5%AD%A6%E7%BC%96%E7%A8%8B%E8%80%85%E7%9A%84%E5%BF%A0%E5%91%8A-brightgreen" alt="刘巍-由C#风潮想起的——给初学编程者的忠告" /></a></p><p>我始终认为，对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。我时常看 见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, <a href="http://VB.Net" target="_blank" rel="noopener">VB.Net</a> 这样的大部头，这让我感到非常痛心。</p><p>而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C++就象当年的ASP一样，“忽如一夜春风来，千树万树梨花开”，结果许多学校的信息学院成了“Web 学院”。</p><p>96,97级的不少大学生都去做Web了。当然我没有任何歧视某一行业的意识。我只是觉得如 果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。</p><h1 id="几个误区"><a class="markdownIt-Anchor" href="#几个误区"></a> 几个误区</h1><p>初学者对C++风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这 些现象，你可以按部就班的看看自己是不是属于其中的一种或者几种：</p><h2 id="认为计算机技术等于编程技术"><a class="markdownIt-Anchor" href="#认为计算机技术等于编程技术"></a> 认为计算机技术等于编程技术:</h2><p>有些人即使没有这个想法，在潜意识中也有这样的冲动。让我奇怪的是，许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业，与编程无关的，或者不太相关的课程他统统都不管，极端的学生只要书上没带“编程”两个字他就不看。</p><p>其实编程只是计算机技术应用过程中一种复杂性最低的劳动，这就是为什么IT业最底层的人是程序员（ CODER）。计算机技术包括了多媒体，计算机网络，人工智能，模式识别，管理信息系统等等这些方面。</p><p>编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是，不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白，自己这些东西，学的时候并不比其它专业难，所以自然也不会高档到哪里去。</p><h2 id="咬文嚼字的孔乙己作风"><a class="markdownIt-Anchor" href="#咬文嚼字的孔乙己作风"></a> 咬文嚼字的孔乙己作风:</h2><p>我见过一本女生的《计算机网络原理》教材，这个女生象小学生一样在书上划满了横杠杠，笔记做得满满的，打印出来一定比教材还厚。我不明白的是，象计算机网络原理这样的课程有必要做笔记？我们的应试教育的确害了不少学生，在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。</p><p>这乃是我见过的最愚蠢的行为。所谓《原理》，即是需要掌握它为什么这样做，学习why，而不是how（怎样做）。极端认真的学生背下以太网的网线最大长度，数据帧的长度，每个字段的意义，IP报头的格式等等，但是忘了路由的原则，忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。</p><p>在学习编程的时候这些学生也是这样，他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》（确实是好书），《Inside C++》，《C++ reference》，this C++,thatC++……，然后是网上各种各样的关于C++语法的奇闻逸事，然后发现自己又忘了C++的一些语法，最后回头继续恶补…。有个师弟就跟我说：“C++ 太难了，学了这里忘了那里，学了继承忘了模板。”我的回答道：“你不去学就容易了”。我并没有教坏他，只是告诉他，死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。我有个结论就是，实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic（我以前从没有学过它）写一个小程序的时候，只花了半个小时看了看语法，然后再用半个小时完成了程序，而一个小时后我又完全忘记了Basic 的所有关键字。</p><h2 id="不顾基础盲目追赶时髦技术"><a class="markdownIt-Anchor" href="#不顾基础盲目追赶时髦技术"></a> 不顾基础，盲目追赶时髦技术：</h2><p>终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来，变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的，而且IT技术进步是如此的快，不跟进就是失业。但是对于初学者来说（尤其是时间充裕的大中专在校生），这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西，学习why 而不是how。时髦的技术往往容易掌握，而且越来越容易掌握，这是商业利益的驱使，为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样，越容易掌握的东西，学习的人越多，而且淘汰得越快。每一次新的技术出来，都有许多初学者跟进，这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间，而等他学会了，这种技术也快淘汰了。基础的课程，比方数据结构，操作系统原理等等虽然不能让你立马就实现一个linux（这是许多人嘲笑理论课程无用的原因），但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术（比方Win32 SDK 程序的设计，DDK的编程）来说甚至是不可或缺的。</p><p>一个活生生的例子是我和我的一个同学，在大一时我还找不到开机按纽，他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编，计算机体系结构，数据结构，操作系统原理等等这些课程的学习上，而他则开始学习HTML和VB，并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理，学习SDK编程，时间是漫长的，这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已，但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方：假设学习VB编程需要4个月，学习基础课程和VC的程序设计需要1年。那么如果你先学VB，再来学习后者，时间不会减少，还是1年，而反过来，如果先学习后者，再来学VB，也许你只需要1个星期就能学得非常熟练。</p><h1 id="几个重要的基础课程"><a class="markdownIt-Anchor" href="#几个重要的基础课程"></a> 几个重要的基础课程</h1><p>如果你是学生，或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目，这些书应该都还可以在书店买到。说实在的，我在读其他人的文章时最大的心愿就是希望作者列出一个书单。</p><ul><li><p><strong>大学英语</strong>－不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来，而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材，开始会看不懂，用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。</p></li><li><p><strong>计算机体系结构和汇编语言</strong>－关于体系结构的书遍地都是，而且也大同小异，倒是汇编有一本非常好的书。《80x86汇编语言程序设计教程》（清华大学出版社，黑色封面，杨季文著）。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。</p></li><li><p><strong>计算机操作系统原理</strong>－我们的开发总是在特定的操作系统上进行，如果不是，只有一种可能：你在自己实现一个操作系统。无论如何，操作系统原理是必读的。这就象我们为一个芯片制作外围设备时，芯片基本的工作时序是必需了解的。这一类书也很多，我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社，我看的是E文版的，中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性，ZDNET上的另一篇文章已经有过论述。</p></li><li><p><strong>数据结构和算法</strong>－这门课程能够决定一个人程序设计水平的高低，是一门核心课程。我首选的是清华版的（朱战立，刘天时）。很多人喜欢买C++版的，但我觉得没有必要。C++的语法让算法实现过程变得复杂多了，而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。</p></li><li><p><strong>软件工程</strong>－这门课程是越到后来就越发现它的重要，虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》（黄色，清华）。不要花太多的时间去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获。</p></li><li><p><strong>Windows 程序设计</strong>－《北京大学出版社，Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。</p></li></ul><ul><li>在这本书中，没有C++，没有GUI，没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在 学完了它以后，你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC，你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。</li></ul><p>上面的几门课程我认为是必学的重要课程（如果你想做Windows 程序员）。</p><p>对于其它的课程有这样简单的选择方法：如果你是计算机系的，请学好你所有的专业基础课。如果不是，请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了，请翻到书的最后，看看它的参考文献，找到它们并学习它们，再回头看这本书。如果一本书的书名中带有“原理”两个字，你一定不要去记忆它其中的细节，你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。</p><p>你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。</p><h1 id="日三省乎己"><a class="markdownIt-Anchor" href="#日三省乎己"></a> 日三省乎己</h1><p>每天读的书太多，容易让人迷失方向。一定要在每天晚上想想自己学了些什么，还有些什么相关的东西需要掌握，自己对什么最感兴趣，在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用，这样能够让你不是追赶技术潮流而是引领技术潮流。同时，努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。</p><h1 id="把最多的时间花在学习上"><a class="markdownIt-Anchor" href="#把最多的时间花在学习上"></a> 把最多的时间花在学习上</h1><p>这是对初学者最后的忠告。把每个星期玩SC或者CS的时间压缩到最少，不玩它们是最好的。同时，如果你的ASP技术已经能够来钱，甚至有公司请你兼职的话，这就证明你的天份能够保证你在努力的学习之后取得更好的收益，你应该去做更复杂的东西。眼光放长远一些，这无论是对谁都是适用的。</p><p>相信你已经能够决定是否学习C＃或者什么时候去学它了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      我始终认为，对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。我时常看 见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, VB.Net 这样的大部头，这让我感到非常痛心。
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>博客推广及搜索引擎优化</title>
    <link href="https://no5972.moe/cms/archivers/33.html"/>
    <id>https://no5972.moe/cms/archivers/33.html</id>
    <published>2020-09-18T09:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://io-oi.me/tech/hexo-next-optimization/#%E5%8D%9A%E5%AE%A2%E6%8E%A8%E5%B9%BF" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/reuixiy-%E6%89%93%E9%80%A0%E4%B8%AA%E6%80%A7%E8%B6%85%E8%B5%9E%E5%8D%9A%E5%AE%A2%20Hexo%20+%20NexT%20+%20GitHub%20Pages%20%E7%9A%84%E8%B6%85%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%8C%96-brightgreen" alt="reuixiy-打造个性超赞博客 Hexo + NexT + GitHub Pages 的超深度优化" /></a></p><p>想自己写的文章被别人看到？希望得到别人的评论肯定？渴望用自己写的文章照亮他人，给整个文明光能？那么这个就不可或缺了。你能看到这篇文章，很大程度上也是因为这个😏。</p><h1 id="博客推广"><a class="markdownIt-Anchor" href="#博客推广"></a> 博客推广</h1><p>博客推广第一步，手动推广。你可以多浏览别人的博客并留下你的爪印（博客地址），比如评论；你可以去 <a href="https://github.com/iissnan/hexo-theme-next#live-preview" target="_blank" rel="noopener">README.md</a> 中提到的这个 <a href="https://github.com/iissnan/hexo-theme-next/issues/119" target="_blank" rel="noopener">issue</a> 留下你的爪印；你可以去 <a href="https://github.com/iissnan/hexo-theme-next/issues" target="_blank" rel="noopener">Issues</a>（<a href="https://github.com/theme-next/hexo-theme-next/issues" target="_blank" rel="noopener">最新版</a>）页面试着回答下大家的问题并留下你的爪印。</p><h1 id="搜索引擎"><a class="markdownIt-Anchor" href="#搜索引擎"></a> 搜索引擎</h1><p>博客推广第二步，<a href="https://baike.baidu.com/item/SEO" target="_blank" rel="noopener">SEO</a>（Search Engine Optimization）。搜索引擎是互联网上寻找资源的重要手段，而要让别人能够在搜索结果中看到自己的博客文章链接，就必须让搜索引擎收录，怎么操作呢？</p><p>直接参考<a href="http://www.ehcoo.com/seo.html" target="_blank" rel="noopener">这篇文章</a>，学会使用站长工具抓取自己的网页，然后请求搜索引擎收录。博主也是刚接触不久，不太懂，但推荐提交次数尽量多，而且每天尽量都提交一次。我没有弄百度的，只弄了 Google 的，但是前几天百度 <code>hexo next 优化</code> （其它关键字没试），发现第一页就有自己文章，而且文章图片也在上面，很显眼，让我非常惊喜😆！</p><p><img src="https://io-oi.me/images/hexo-next-optimization-3.jpg" alt="" /></p><p>看到<a href="https://segmentfault.com/p/1210000011450995" target="_blank" rel="noopener">链接</a>是 SegmentFault 的，恍然大悟，原来是这个大佬推荐的，不仅帮我把此文推到了掘金，还有 SegmentFault，在此再次感谢大佬！这也给了一个启示，除了直接向搜索引擎提交自己的链接，还可以通过这种途径优化博客的 SEO。</p><h1 id="间接影响"><a class="markdownIt-Anchor" href="#间接影响"></a> 间接影响</h1><p>另外，SEO 固然重要，但不要小看另一种影响，相比搜索引擎，这种可以称之为间接影响。这篇文章是一篇技术性的文章，而技术人员经常会用 Google，所以对这篇文章的浏览量，搜索引擎的功劳较大。但是，如果是其他的文章，比如一首诗，那么直接通过 Google 访问的读者几乎没有，那读者哪来？从其它文章上的读者「流」过来的。因为读者浏览着的不是一篇文章，而是一个博客。</p><p>而想让博客上的几乎不可能被 Google 的一首诗被浏览，就要这样间接拉读者了，可以称之「引流」。首先对博客上的每篇文章来说，肯定是读者花在自己博客的时间越长，被读到的可能性越大。这就意味着你要尽可能把用户留在自己的博客上，怎么留？</p><ol><li>博客要装饰好</li><li>文章质量要高</li></ol><p>读者的第二印象是博客的界面，如果界面够特别，也许马上就被加入了书签。第三印象是文章内容，这其实更加重要，如果文章质量很高，那么读者肯定不会让这么好的一篇文章消失在自己的记忆中，即使界面不咋地。第一印象？加载速度，试想点开半天还是空白，那么肯定马上关了。</p><p>如果做到上面三点，那么就算好不容易「骗」到一个 Google 浏览量，但是这个读者马上被博客和文章惊呆了，看完文章后，这读者心里美滋滋，认为这么好的文章（博客）必须分享啊（如上面的大佬推荐🌚），于是可能马上来了一大批满怀期待的读者，然后这批读者又……这时文章的读者数（博客的访问量）就不是简单的加法了～</p><h1 id="知识平台"><a class="markdownIt-Anchor" href="#知识平台"></a> 知识平台</h1><p>直接或间接因为 Google 这样的搜索引擎而来的读者，绝大部分都是技术人员，而他们只希望尽快解决自己的技术问题，这也是他们的目的，这就意味着博客上的一首诗还是很难被欣赏。而要想照亮他人，他人必须要能懂自己的文章，这样也才可能有更强的交互——评论。所以为了不浪费自己的光能，能把自己的光能完完整整地贡献给文明，那就必须也让一首诗也有评论，怎么做呢？让读者的类型多样化，不限于技术人员。还好现在大部分读者也不用搜索引擎了，谁在吞食搜索引擎的用户？移动端。智能手机的迅速普及导致搜索引擎已经不是人们获取知识的主要途径，大部分人已经将手机 APP 上的知识平台作为自己获取知识的主要途径，比如：知乎、简书、微信订阅号……所以，你还可以将自己的文章发布在这些知识平台上的相应分类上，然后留个博客链接，吸引更多类型的读者😄～</p><h1 id="谷歌分析"><a class="markdownIt-Anchor" href="#谷歌分析"></a> 谷歌分析</h1><p>你怎么知道自己推广的效果？你怎么知道有没有人看了自己的博客？哪篇文章最受欢迎？此时有没有人正浏览着自己的博客？自己的文章有没有被引用？这时最常用的就是强大免费的 <a href="https://analytics.google.com/" target="_blank" rel="noopener">Google Analytics</a>，推荐博客建好后，就立即使用。</p><p>如何使用？请务必自备查看 <a href="https://analytics.google.com/analytics/academy/course/6" target="_blank" rel="noopener">Google 官方的教程</a>，开始使用后一定要按照里面的设置，先添加多份 view（数据视图）。</p><p>ATTENTION：虽然有个复制 view 选项，但由 Google Analytics（分析）帮助中的具体复制内容再加上我的实践，发现（用我这个外行人的话来说）：复制 view 时只会复制它的相关配置，不会复制数据！所以请使用后立即按照官方教程中的方式添加 view！</p><p><img src="https://io-oi.me/images/google-analytics-filter.png" alt="仅包含有效主机名" /></p><center>◎ 仅包含有效主机名</center><p>我们写文章，会在本地调试，这时 Google Analytics 也是会收集数据的，会影响数据分析，所以必须添加一个 filter（过滤器）。</p><p><img src="https://io-oi.me/images/google-analytics.png" alt="filter" /></p><center>◎ filter</center><p>ATTENTION：由 Google Analytics（分析）的<a href="https://support.google.com/analytics/answer/6383007" target="_blank" rel="noopener">工作原理</a>可知，filter 是在数据处理时生效的（如上图），也就是说添加 filter 后只能过滤添加它之后的数据，而无法过滤添加它之前的数据（处理后），而 view 是利用处理后的数据生成的，所以要想去除自己在本地调试时的影响（在 view 中看不到自己在本地调试时的访问），请添加 view 之后就立即添加 filter！</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      想自己写的文章被别人看到？希望得到别人的评论肯定？渴望用自己写的文章照亮他人，给整个文明光能？那么这个就不可或缺了。你能看到这篇文章，很大程度上也是因为这个😏。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>小花仙 - 美丽童年，美妙花仙</title>
    <link href="https://no5972.moe/cms/archivers/32.html"/>
    <id>https://no5972.moe/cms/archivers/32.html</id>
    <published>2020-09-14T03:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://hua.61.com/main" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%B7%98%E7%B1%B3%E7%BD%91-%E5%B0%8F%E8%8A%B1%E4%BB%99-brightgreen" alt="淘米网-小花仙" /></a></p><p>小花仙展现了一个梦幻的仙境，每个小女孩化身成挥舞着翅膀飞翔的小花仙，将美丽、智慧、爱心传递到整个花仙世界……</p><p>为了儿童健康、快乐地成长，淘米立志为中国6-14岁儿童打造一个安全、绿色、纯净、美好的环境……</p><p>在神奇的拉贝尔大陆上会发生什么事呢？小花仙每天都过着新鲜的日子，生活原来是那么甜蜜……</p><h1 id="关于小花仙"><a class="markdownIt-Anchor" href="#关于小花仙"></a> 关于小花仙</h1><h2 id="小花仙"><a class="markdownIt-Anchor" href="#小花仙"></a> 小花仙：</h2><p>花朵具有生命，并散发着无形的灵气。</p><p>花的灵气与自然界的灵气融合在一起，产生了美丽的小花仙。</p><p>小花仙的体内蕴含着丰富的魔法能量，但还没有被她们自己所发现。</p><p>小花仙是美的化身，天生具有将世界装扮得更加美丽的使命。</p><p>每一个新生的小花仙都会来到花神普普拉的世界，表现出自己的特质。</p><h2 id="探索"><a class="markdownIt-Anchor" href="#探索"></a> 探索：</h2><p>飞翔在拉贝尔大陆上，小仙女可以去探索这片大陆，这片神奇的大陆肯定隐藏着什么特别的秘密。也可能会有很多神秘的地方等待着你去探索，一些仙子会告诉你一个个的小故事，带领着你去探秘小花仙的世界。</p><h2 id="完美小花仙"><a class="markdownIt-Anchor" href="#完美小花仙"></a> 完美小花仙：</h2><p>每个小花仙都可以定义你自己独特的小花仙，从你的翅膀到你的身体各个部位，你都可以有自己独特的装扮去装饰自己！你都可以穿上最新的时尚服饰，而且还可以用家具和漂亮的装饰品去装饰你的小屋。你还可以拥有多个小屋，把每一个小屋都装扮成不同的风格。</p><h2 id="培育花朵"><a class="markdownIt-Anchor" href="#培育花朵"></a> 培育花朵：</h2><p>美丽的小花仙在拉贝尔大陆培育一朵朵美丽的花朵，他们在小花仙的世界里寻找各种奇异的种子，并且寻找种植鲜花的真谛。鲜花也可以用来在其他仙子那兑换美丽的衣服和各式各样的家具。</p><h2 id="抚育花宝"><a class="markdownIt-Anchor" href="#抚育花宝"></a> 抚育花宝：</h2><p>花宝是一些奇特的鲜花孕育出来的小家伙，他们非常的可爱。如果你细心的照顾她们的话，她们会慢慢的成长，变得更加可爱。而且还能为你找寻各种各样的材料，用于制作。她可能不时的给你出出难题，让你帮助她们解决，也会通过信件的方式把她现在的心情告诉你。</p><h1 id="拉贝尔大陆"><a class="markdownIt-Anchor" href="#拉贝尔大陆"></a> 拉贝尔大陆</h1><p>很久很久以前，传说普普拉花神最大的骄傲就是她的三个女儿。这三个仙女爱好和平，聪明善良，她们从小共同的信念就是寻找最美丽的花种，带给人们幸福。有一天，她们飞到了梦幻的拉贝尔大陆，立刻爱上了这里，三个好姐妹决定留下来，在这片美丽的鲜花世界定居。她们创建了不同的国家，也交到了很多好朋友，小仙女们在一起种植花草，为培养更美丽的花朵而努力。</p><p>大仙女叫露娜，她有着绿宝石般的眼睛，闪耀着自然界的智慧。她创建的国家叫智慧国。二仙女叫露莎，她有着金黄色的卷发，白晰的皮肤，蓝色的眼珠，是人们称之最美丽的仙女。她的国家叫美丽国。小仙女叫露露，她是最有爱心的仙女，她心地善良，最爱与可爱的宠物打交道。她的国家叫爱心国。</p><p>最早的拉贝尔大陆，一片荒芜，了无人烟。三仙女带着她的小花仙们，为寻找最美的花种，找寻花的真谛，来到拉贝尔大陆。露娜仙女在拉贝尔大陆的仙藤树上建造了智慧国。露莎仙女在拉贝尔大陆的美丽湖畔建造了美丽国。露露仙女在拉贝尔大陆的蘑菇地里建造了爱心国。小花仙们用鲜花装点着拉贝尔大陆，要将它变成花的国度。</p><h1 id="更好玩的事"><a class="markdownIt-Anchor" href="#更好玩的事"></a> 更好玩的事</h1><h2 id="叶子报纸"><a class="markdownIt-Anchor" href="#叶子报纸"></a> 叶子报纸</h2><p>叶子报纸给大家提供小花仙世界里的最重要的信息。同时记录着小花仙世界里的每一段故事，每一个故事都是小花仙们一起编写出来的，编写自己的小花仙编年史。小花仙们通过投稿分享自己的回忆，自己在小花仙世界里的美好感受。</p><h2 id="采集"><a class="markdownIt-Anchor" href="#采集"></a> 采集</h2><p>当小花宝跟随着你的时候，你会发现原来小花仙的世界里有很多各种各样的材料，并且随着小花宝的成长，你可以看到更多更神秘的材料，并且利用这些材料就可以制作出你想要的东西。</p><h2 id="制作"><a class="markdownIt-Anchor" href="#制作"></a> 制作</h2><p>你可以在小花仙里学习到各种各样的制作技能，比如你可以为自己制作一件漂亮的衣服，也可以给自己的小花宝制作一个爱心食品等等。用自己的双手为自己制作东西吧！</p><h2 id="小游戏"><a class="markdownIt-Anchor" href="#小游戏"></a> 小游戏</h2><p>在小花仙的世界里，你可以玩到很多仙女游戏，神奇的占卜让你看到自己的命运，各种制作小游戏让你体验你的每一样东西在你手中被制作出来的过程。</p><h1 id="仙女的约定"><a class="markdownIt-Anchor" href="#仙女的约定"></a> 仙女的约定</h1><p>每一名小花仙必须无条件遵守以下守则：</p><h2 id="尊重他人"><a class="markdownIt-Anchor" href="#尊重他人"></a> 尊重他人</h2><p>小花仙里不接受骂人、欺负人等任何不文明不礼貌的行为。以上行为将直接受到惩罚。</p><h2 id="保护自己"><a class="markdownIt-Anchor" href="#保护自己"></a> 保护自己</h2><p>安全上网的最佳方式是绝不告诉他人真实姓名、电话号码、家庭住址、电子邮件及米米号密码。</p><h2 id="严禁词语"><a class="markdownIt-Anchor" href="#严禁词语"></a> 严禁词语</h2><p>关于烟草、酒精、色情、暴力及其它不适合的词语在小花仙全面禁止。</p><h2 id="远离外挂"><a class="markdownIt-Anchor" href="#远离外挂"></a> 远离外挂</h2><p>禁止使用任何第三方的外挂程序。一经发现，从小花仙永久驱逐。</p><h1 id="小花仙产品介绍"><a class="markdownIt-Anchor" href="#小花仙产品介绍"></a> 小花仙产品介绍</h1><p>小花仙是专为中国6-14岁儿童设计的梦幻世界，每个儿童化身美丽的小花仙，成为这个虚拟世界的主人，为了种出最美丽的花朵，探索各种神奇的国度。产品融合鲜花种植、花宝养成、随机事件、自我培养等等。</p><p>小花仙作为一个儿童网上绿色虚拟社区，任何不良信息和破坏行为都被我们挡在门外，无论小伙伴在真实世界相隔多远，在小花仙的世界里大家可以一起种植美丽的花朵，一起穿上最美丽的衣服，一起装扮自己的小屋，带领着小花宝一起玩耍。在小花仙世界里的每一个小花仙都不会感觉到孤单，因为会有成千上万的小花仙在她身边一起玩耍。</p><h1 id="小花仙产品安全"><a class="markdownIt-Anchor" href="#小花仙产品安全"></a> 小花仙产品安全</h1><h2 id="专为儿童定制的限时开放策略"><a class="markdownIt-Anchor" href="#专为儿童定制的限时开放策略"></a> 专为儿童定制的限时开放策略</h2><p>小花仙作为专为中国儿童设计的互联网服务，为了培养儿童的自控能力，小花仙采取限时开放的策略，小花仙仅在儿童适合上网的时间段开放，其余时间将直接禁止用户登录。</p><h2 id="强大信息过滤器阻拦不良信息"><a class="markdownIt-Anchor" href="#强大信息过滤器阻拦不良信息"></a> 强大信息过滤器阻拦不良信息</h2><p>小花仙社区中具有强大的信息过滤器，有效拦截广告以及不适合儿童的信息。小花仙世界实施实时监控，保证为儿童提供纯洁、安全、健康、适合身心成长的网络环境。</p><h2 id="开设禁言服务专区"><a class="markdownIt-Anchor" href="#开设禁言服务专区"></a> 开设禁言服务专区</h2><p>小花仙专门为儿童定制了禁言服务专区。在该专区小花仙们相互之间的沟通将只能通过小花仙预设快捷语言进行。不输入文字的交流，从根本上避免不良信息的传播。</p><h2 id="严格的实时监控机制"><a class="markdownIt-Anchor" href="#严格的实时监控机制"></a> 严格的实时监控机制</h2><p>小花仙会受到小花仙管理处严格的实时监控。发布不良信息、广告信息、使用第三方程序（外挂）行为及任何方式影响其它儿童小花仙世界生活的成员将被永久驱逐出小花仙。</p><h2 id="便捷的举报投诉措施"><a class="markdownIt-Anchor" href="#便捷的举报投诉措施"></a> 便捷的举报投诉措施</h2><p>孩子在小花仙世界里活动时，随时可以对干扰自己正常活动的信息和行为进行举报投诉，这种操作非常方便，而且符合儿童的使用习惯。小花仙保证对所有举报投诉进行快速认真地处理，保护小花仙的绿色、安全。</p><h1 id="关注孩子的小花仙"><a class="markdownIt-Anchor" href="#关注孩子的小花仙"></a> 关注孩子的小花仙</h1><h2 id="小花仙是什么"><a class="markdownIt-Anchor" href="#小花仙是什么"></a> 小花仙是什么？</h2><p>小花仙是专为中国6－14岁儿童设计的梦幻世界，每个儿童化身美丽的小花仙，成为这个虚拟世界的主人，为了种出最美丽的花朵，探索各种神奇的国度。产品融合鲜花种植、花宝养成、随机事件、自我培养等等。</p><h2 id="小花仙的主人是谁"><a class="markdownIt-Anchor" href="#小花仙的主人是谁"></a> 小花仙的主人是谁？</h2><p>小花仙专为中国6-14岁儿童设计，但是对所有年龄的孩子开放。我们有严格的会员审核机制和举报机制，确保小花仙是个好孩子的梦幻乐园。</p><h2 id="我们为什么设计了小花仙"><a class="markdownIt-Anchor" href="#我们为什么设计了小花仙"></a> 我们为什么设计了小花仙？</h2><p>获取知识、聊天、游戏是孩子们最喜欢的网上活动，但是大多数网站更适合青年或成人。淘米公司希望为年龄更小的儿童创造一个安全、绿色的网络虚拟世界。它不仅让孩子喜欢、更让家长感到放心。</p><h2 id="小花仙安全吗"><a class="markdownIt-Anchor" href="#小花仙安全吗"></a> 小花仙安全吗？</h2><p>小花仙非常重视儿童使用互联网的信息安全和隐私安全。我们有非常严密科学的信息监测机制和强大的信息过滤器来阻挡不良信息。我们有非常便捷的举报投诉措施，最大限度的为孩子们提供一个安全、健康、适合儿童身心成长的网络环境。</p><h1 id="小花仙产品特色"><a class="markdownIt-Anchor" href="#小花仙产品特色"></a> 小花仙产品特色</h1><h2 id="飞行效果"><a class="markdownIt-Anchor" href="#飞行效果"></a> 飞行效果</h2><p>作为中国第一款专为儿童打造的飞行模式的互联网社区，飞行的感觉和效果是小花仙的一大亮点。各种美丽的场景，可爱的宠物，拥有多个独具特色的小屋等等，你可以一边飞行一边去装饰你的小屋，你的花园。穿越过湖水、树梢、蘑菇林，你会感觉到你已经真正化身成为一个小花仙生活在这个世界里。</p><h2 id="花宝养成"><a class="markdownIt-Anchor" href="#花宝养成"></a> 花宝养成</h2><p>花宝将是你最忠诚的伙伴，她会陪着你在空中飞翔，一起探索这片神奇的大陆。她经常会产生很多奇怪的想法，或者告诉你她和鲜花的对话。她会写信和你交流，你要付出你的爱心去照顾她，让她在你的照顾下不断的成长，从而也培养孩子的责任感和零压力的情感牵挂。</p><h2 id="鲜花种植"><a class="markdownIt-Anchor" href="#鲜花种植"></a> 鲜花种植</h2><p>各种神奇而美丽的鲜花会在你辛勤的浇灌下慢慢成长，然后影响它的因素会有很多，可能一开始你就会拿到一个不太健康的花种，他们需要你细心的培育。各种天气都会影响你鲜花的成长，一定要把握每朵花的特性，照顾你的鲜花健康成长。</p><h2 id="收集和荣誉"><a class="markdownIt-Anchor" href="#收集和荣誉"></a> 收集和荣誉</h2><p>在小花仙的世界里有各种物品等着你去收集，一套套美丽的服饰，整套的家具，各种小屋，每朵花的样本，各种高级的徽章。每一种物品的积累都是你荣誉和不断努力的表现。</p><h2 id="探索神秘"><a class="markdownIt-Anchor" href="#探索神秘"></a> 探索神秘</h2><p>拉贝尔大陆还有很多神奇而又隐蔽的区域等着你去发现，而且听说拉贝尔大陆的外面会有很多奇特的神秘地方，你觉得都会有些什么奇妙的地方呢？让我们拭目以待吧。</p><h1 id="小花仙绿色宣言"><a class="markdownIt-Anchor" href="#小花仙绿色宣言"></a> 小花仙绿色宣言</h1><p>为了给与我们的儿童一个良好绿色的成长环境。我们承诺：</p><h2 id="保障儿童信息安全"><a class="markdownIt-Anchor" href="#保障儿童信息安全"></a> 保障儿童信息安全</h2><p>我们采取强大的安全措施保障儿童及其家庭的隐私安全，不泄漏儿童及其家庭的任何信息。</p><h2 id="防止儿童网络沉迷"><a class="markdownIt-Anchor" href="#防止儿童网络沉迷"></a> 防止儿童网络沉迷</h2><p>我们提倡健康的网络习惯，全方位引导儿童健康上网，防止儿童网络沉迷。</p><h2 id="不忽视任何一个孩子"><a class="markdownIt-Anchor" href="#不忽视任何一个孩子"></a> 不忽视任何一个孩子</h2><p>我们坚信孩子生来平等，拥有同等的尊严与权利，我们会用心感受每一个儿童的感受，让儿童在健康上网同时培养独立、自信的优良品德。</p><h2 id="给予儿童优先权"><a class="markdownIt-Anchor" href="#给予儿童优先权"></a> 给予儿童优先权</h2><p>我们将在当今互联网环境中给予儿童优先的全新网络服务。我们积极响应全社会倡导的青少年健康上网的号召，努力保障儿童青少年及其家庭的权益，为世界儿童的健康成长贡献力量。</p><h2 id="倾听儿童的心声"><a class="markdownIt-Anchor" href="#倾听儿童的心声"></a> 倾听儿童的心声</h2><p>我们尊重儿童表达自己心声和参与事关自身利益的决定的权利，遵循他们的发展规律，我们认真倾听并且有针对性的采取行动。</p><h2 id="为儿童聚集更多网络内容"><a class="markdownIt-Anchor" href="#为儿童聚集更多网络内容"></a> 为儿童聚集更多网络内容</h2><p>我们将通过儿童网站间的相互合作与自律监督，确保儿童网站的纯洁与安全。我们将与有利于儿童成长的相关机构（包括报纸、杂志、广播、电视、网络、教育机构及其他儿童产品供应商）展开合作。</p><h2 id="关心儿童的身心健康"><a class="markdownIt-Anchor" href="#关心儿童的身心健康"></a> 关心儿童的身心健康</h2><p>我们提倡全社会来共同关注儿童身心健康，关注儿童网络安全，呼吁社会、学校、家庭一起来为孩子们创造美好的现实与网络生活环境。</p><h1 id="小花仙配置要求"><a class="markdownIt-Anchor" href="#小花仙配置要求"></a> 小花仙配置要求</h1><h2 id="小花仙对硬件和软件的要求"><a class="markdownIt-Anchor" href="#小花仙对硬件和软件的要求"></a> 小花仙对硬件和软件的要求</h2><ol><li>如果你使用的 PC 机玩 “ 小花仙 ”，它的配置要求：</li></ol><ul><li>处理器： 奔腾 III</li><li>CPU ： 500 MHz 的</li><li>调制解调器速度： 56K 或更好</li><li>操作系统： Windows 98 ， NT ， 2000 ， ME ， XP 或 Vista</li><li>Web 浏览器： IE6.0,IE7.0 ，或 Firefox 1</li><li>Flash 播放器： Adobe Flash Player 9</li><li>带宽：56KB以上，建议使用宽带</li><li>PC 的操作系统每个的电脑配置查看方式都是不同的。你可能需要爸爸妈妈帮忙教你查看。如果你使用的是 WINDOWS XP 系统的话，你可以在桌面上选择 “ 我的电脑 ” 图标，点击右键在弹出菜单中选择属性。这时你就可以看到电脑配置的基本信息了。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVIbQ.jpg" alt="wRVIbQ.jpg" /></li></ul><ol start="2"><li>如果你使用的 MAC （苹果）机玩 “ 小花仙 ”，它的配置要求：</li></ol><ul><li>处理器： PowerPC G3, G4, G5, or Intel core</li><li>内存： 256MHz 或者更好</li><li>调制解调器速度： 56K 或更好</li><li>操作系统： Mac OS X 10.3</li><li>Web 浏览器： Firefox 1.0.3 或者更好 Safari 2.0.4</li><li>Flash 播放器： Adobe Flash Player 9</li><li>带宽：56KB以上，建议使用宽带</li></ul><h1 id="注册登录小花仙"><a class="markdownIt-Anchor" href="#注册登录小花仙"></a> 注册登录小花仙</h1><h2 id="注册小花仙"><a class="markdownIt-Anchor" href="#注册小花仙"></a> 注册小花仙</h2><ol><li>用户登录hua.61.com来到小花仙首页后，点击“申请米米号，变成小花仙”按钮进入米米号注册界面。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVijS.jpg" alt="wRVijS.jpg" /></li><li>如果用户已经有米米号，可以直接用自己的米米号和密码登录小花仙，无需再次申请。</li></ol><h2 id="登录小花仙"><a class="markdownIt-Anchor" href="#登录小花仙"></a> 登录小花仙</h2><ol><li>用户在小花仙首页登录框中，输入自己的米米号或Email还有密码后，点击“登录”按钮即可进入选择服务器界面。如果勾选了“记住米米号”和“记住密码”选项后，下次登录时无需再填写就能方便登录。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVABQ.jpg" alt="wRVABQ.jpg" /></li><li>小花仙为用户提供了方便的选择服务器设定，系统会推荐用户上次登录的服务器和好友在线的服务器供用户优先选择。也可以点击“查看全部服务器”按钮，显示小花仙所有的服务器列表。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVE7j.jpg" alt="wRVE7j.jpg" /></li><li>选择服务器界面图示说明：<br /><img src="https://s1.ax1x.com/2020/09/17/wRVK3V.jpg" alt="wRVK3V.jpg" /></li></ol><h2 id="登录小花仙时提示用户名或密码错误"><a class="markdownIt-Anchor" href="#登录小花仙时提示用户名或密码错误"></a> 登录小花仙时提示用户名或密码错误</h2><ol><li>“大小写锁定键”是否按下了</li></ol><ul><li>如果你不能登录，请检查你的“大小写锁定键”是否按下了。你可以尝试按下一个字母键来查看。如果输出的是大写字母。你需要按下“大小写锁定”键，解除大写锁定。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVkng.jpg" alt="wRVkng.jpg" /></li></ul><ol start="2"><li>设置一个<a href="https://account.61.com/change" target="_blank" rel="noopener">新的密码</a></li><li>网络链接速度太慢或者已经掉线了</li></ol><h1 id="小花仙显示问题"><a class="markdownIt-Anchor" href="#小花仙显示问题"></a> 小花仙显示问题</h1><h2 id="小花仙的画面不能完整显示在屏幕上"><a class="markdownIt-Anchor" href="#小花仙的画面不能完整显示在屏幕上"></a> 小花仙的画面不能完整显示在屏幕上</h2><h3 id="原因一屏幕分辨率低"><a class="markdownIt-Anchor" href="#原因一屏幕分辨率低"></a> 原因一：屏幕分辨率低。</h3><ol><li>退出“小花仙”，回到你的桌面。</li><li>右键单击你的鼠标，会弹出一个属性对话框。<br /><img src="https://s1.ax1x.com/2020/09/17/wRV8HJ.jpg" alt="wRV8HJ.jpg" /></li><li>点选页面上方的的设置选项。找到“屏幕分辨率”设置区域。移动下面的滚动条调整分辨率。将分辩率调整至 1024*768 或更高。最后点击确定，关闭对话框。<br /><img src="https://s1.ax1x.com/2020/09/17/wRVJE9.gif" alt="wRVJE9.gif" /></li><li>重新登录“小花仙”</li></ol><h3 id="原因二-flash-播放器版本"><a class="markdownIt-Anchor" href="#原因二-flash-播放器版本"></a> 原因二： FLASH 播放器版本</h3><p>你可能没有安装正确版本的 FLASH 播放器运行“小花仙”游戏，你需要下载一个最新版本的 FLASH 播放器来解决这个问题。你可以尝试用以下的方法：</p><ol><li>当你打开“小花仙”游戏页面的时候，你可能会收到一条提示信息。内容是“您需要下载最新版本的 FLASH 播放器”，不要跳过它，点击“确定”按照提示，一步一步安装最新版本的 FLASH 播放器。</li><li>点此：<a href="#">下载最新版本的 FLASH 播放器</a></li></ol><h1 id="小花仙常见网络问题"><a class="markdownIt-Anchor" href="#小花仙常见网络问题"></a> 小花仙常见网络问题</h1><h2 id="小花仙加载速度很慢"><a class="markdownIt-Anchor" href="#小花仙加载速度很慢"></a> 小花仙加载速度很慢</h2><h3 id="原因一你选用了较慢的互联网连接方式"><a class="markdownIt-Anchor" href="#原因一你选用了较慢的互联网连接方式"></a> 原因一：你选用了较慢的互联网连接方式</h3><p>现在主要有三种互联网接入方式：1、拨号上网 2、有线通 3、ADSL 。如果你用的是拨号上网，就是最慢的一种互联网接入方式。可以尝试用以下方法来改善网络连接速度。</p><ol><li>选用更快的互联网连接方式</li><li>确保你的电话线状态良好。老旧的电话线容易产生杂乱信号，导致网络速度变慢。</li></ol><h3 id="原因二你的电脑存在一些硬件或者软件方面的故障"><a class="markdownIt-Anchor" href="#原因二你的电脑存在一些硬件或者软件方面的故障"></a> 原因二：你的电脑存在一些硬件或者软件方面的故障</h3><ol><li>打开了太多的网页或者运行了太多的程序，请先关闭它们。</li><li>磁盘空间低，你的电脑上可能安装了太多的应用程序，而占用大量的系统资源。尽管这些程序未在运行，但它们仍然可能使速度变慢。请删除一些你从不使用的应用程序以腾出部分磁盘空间。</li><li>电脑没有足够的内存，先关闭部分网页页或程序，释放更多内存，或者升级你的电脑内存。</li><li>你的电脑可能感染了木马软件，你可以用相应的工具软件将其彻底清除。</li><li>你的电脑感染了病毒，你可以用杀毒软件将病毒清除掉。</li></ol><h2 id="连不上小花仙服务器"><a class="markdownIt-Anchor" href="#连不上小花仙服务器"></a> 连不上小花仙服务器</h2><p>如果你连接不到服务器。这可能主要是因为以下原因导致的。</p><ol><li>服务器维护<br />可能是因为“小花仙”游戏服务器的原因导致你无法连接。</li><li>FLASH 播放器版本<br />检查下你的 FLASH 播放器是否为最新版本的播放器。 如果不是最新版本，可点击下载最新版本的 FLASH 播放器</li><li>系统缓存<br />你可能需要清空你的浏览器缓存。<br /><img src="https://s1.ax1x.com/2020/09/17/wRZ0Gq.jpg" alt="wRZ0Gq.jpg" /></li><li>咨询互联网服务提供商（ ISP ）。<br />你也可以咨询你的互联网服务提供商（ ISP ），他们设置的防火墙关闭了游戏需要使用的端口。<br /><img src="https://s1.ax1x.com/2020/09/17/wRZwin.jpg" alt="wRZwin.jpg" /></li><li>防火墙设置问题<br />你的计算机可能是安装了防火墙。如在 XP ， VISTA，MAC OSX 版的系统中，系统都会带由保护你系统安全的防火墙。其中的一些设置会阻止你登录到“小花仙”。你可以请爸爸妈妈帮助你对防火墙进行相关的设置。<br /><img src="https://s1.ax1x.com/2020/09/17/wRZaIs.jpg" alt="wRZaIs.jpg" /></li></ol><h1 id="小花仙服务热线021-61130888"><a class="markdownIt-Anchor" href="#小花仙服务热线021-61130888"></a> 小花仙服务热线：021-61130888</h1><p>我们以孩子的眼睛塑造了一个仙女的世界，在这个世界里我们着力发掘孩子们的美丽、智慧、爱心，小花仙以养成为重点，让小朋友去养花、抚养精灵，并且玩烹饪、设计服装、冒险并且享受这个世界发生的一切奇遇。小花仙是属于孩子们的，小朋友有任何建议意见都可以告诉我们。只要你觉得问题存在，大胆开口吧。任何奇思妙想都可以告诉我们，哪怕别人说你是空想，我们不会!</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      小花仙展现了一个梦幻的仙境，每个小女孩化身成挥舞着翅膀飞翔的小花仙，将美丽、智慧、爱心传递到整个花仙世界。为了儿童健康、快乐地成长，淘米立志为中国6-14岁儿童打造一个安全、绿色、纯净、美好的环境。在神奇的拉贝尔大陆上会发生什么事呢？小花仙每天都过着新鲜的日子，生活原来是那么甜蜜……
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>【编程C语言学习资料】百度贴吧 · C语言吧旧版索引</title>
    <link href="https://no5972.moe/cms/archivers/31.html"/>
    <id>https://no5972.moe/cms/archivers/31.html</id>
    <published>2020-09-10T04:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://tieba.github.io/cpl/index.html#others" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7-C%E8%AF%AD%E8%A8%80%E5%90%A7-brightgreen" alt="C语言吧" /></a></p><h1 id="本吧吧规"><a class="markdownIt-Anchor" href="#本吧吧规"></a> 本吧吧规</h1><h2 id="总则"><a class="markdownIt-Anchor" href="#总则"></a> 总则</h2><p>0.0 本吧规根据<a href="http://tieba.baidu.com/tb/system.html#cnt08" target="_blank" rel="noopener">《百度贴吧吧主制度》</a>而制定<br />0.1 本吧管理组保留吧规的修改与解释权<br />0.2 请自觉遵守<a href="http://tieba.baidu.com/tb/eula.html" target="_blank" rel="noopener">《百度贴吧协议》</a><br />0.3 本吧规适用于<strong>百度C语言吧（以下称“本吧”）</strong>，自公布即日起施行。<br />0.4 注意言行，尊重他人就是善待自己。(所有辱骂均视为永久封紧的对象)<br />0.5 切勿打击新手，明白强者二字的真正含义。<br />0.6 伸手党/脑残党/IP党无人权。<br />0.7 吧务允许以个人意愿&quot;合理&quot;的使用他/她所有的权利。<br />*.* 以下内容作为总则的补充，原则上与总则相同</p><h2 id="发帖提示"><a class="markdownIt-Anchor" href="#发帖提示"></a> 发帖提示</h2><ul><li><strong>请不要发任何谭书/二级考试相关内容</strong><sub>(要发也请不要加上‘二级’这两个字)</sub></li><li>把本文看完+看一遍<a href="https://tieba.github.io/common/howtoask.html" target="_blank" rel="noopener">提问的智慧</a></li><li>请不要在帖子的标题上加任何的无效词(ie.大神,跪,求,急,标题要长,新手,帮忙)</li><li>在提问贴中说明自己做出的努力(不需要长,把自己的代码或者思路写下来(具体或者大致的都行))</li><li>尽量在标题中说明具体的问题/错误(ie.无法打开文件，出现乱码…)</li><li>发代码者请注意自己的代码格式，并且给出足够的诊断信息/截图</li><li>贴代码的地方:<a href="http://gist.github.com/" target="_blank" rel="noopener">Gist</a> |<a href="http://codepad.org/" target="_blank" rel="noopener">Codepad</a> |<a href="http://ideone.com/" target="_blank" rel="noopener">Ideone</a> |<a href="http://pastebin.com/" target="_blank" rel="noopener">Pastebin</a>|<a href="http://pastebin.mozilla.org/" target="_blank" rel="noopener">Mozilla</a></li></ul><h2 id="其他提示"><a class="markdownIt-Anchor" href="#其他提示"></a> 其他提示</h2><ul><li>本吧IRC(聊天室): <a href="http://tieba.baidu.com/p/1941867601" target="_blank" rel="noopener">介绍</a>, <a href="https://webchat.freenode.net/" target="_blank" rel="noopener">WebChat</a>[Channels: #c_lang_cn]</li><li>多用搜索引擎和专业的论坛(google,<a href="http://stackoverflow.com/" target="_blank" rel="noopener">stackoverflow</a>…)</li><li>那些Win7/8用VC6的去装VC2012 Express去(或者Code::Block/CodeLite)</li><li>为课业所迫必须用VC6的可以用<a href="https://www.virtualbox.org/wiki/Downloads" target="_blank" rel="noopener">VirtualBox</a>装一个xp虚拟机然后在上面装VC6</li></ul><h2 id="吧务管理"><a class="markdownIt-Anchor" href="#吧务管理"></a> 吧务管理</h2><p>1.1 <em>吧务</em>（吧主和小吧主）按<a href="http://tieba.baidu.com/tb/system.html#cnt08" target="_blank" rel="noopener">《百度贴吧吧主制度》</a>和本吧规行使管理本吧的职权。本吧也欢迎其他吧友协助吧务进行管理，共同维护良好的讨论秩序。<br />2.2 <em>违规</em>行为包括违反中华人民共和国法律法规、百度贴吧协议和本吧规其它条款明令禁止的事项。<br />2.3 吧务在有合理的理由和符合本吧规规定的前提下拥有以个人观点管理本吧的权利。合理的理由包括但不限于对违规行为的处理。<br />2.4 吧务管理本吧的操作包括警告、删贴（删除主题和/或回复）、封禁（ID或IP）等。<br />2.5 吧务应删除构成违规行为的内容；或在存在充分理由时，指出违规后予以暂时保留。<br />2.6 对于初次违规的吧友，吧务应进行警告。无视警告再犯者和屡教不改者应考虑封禁。故意违规、破坏吧务管理者封禁并加入黑名单。<br />2.7 吧务在管理本吧、涉及对被管理者的操作时可以不提前通知<a href="http://baike.baidu.com/view/2410019.htm" target="_blank" rel="noopener"><em>相对人</em></a>，但有义务回答吧友关于操作的询问，包括执行管理操作的理由。<br />2.8 吧务人员的共识代表吧务的整体意见。吧务人员意见有分歧时，首先以本吧规的明文规定为准，协商解决。<br />2.9 对吧规或管理有疑问、查询操作记录或请求对贴子进行删除、恢复和加精等事宜，请私信或at吧务。</p><h2 id="讨论形式"><a class="markdownIt-Anchor" href="#讨论形式"></a> 讨论形式</h2><ul><li>提问请先看：<a href="https://tieba.github.io/common/howtoask.html" target="_blank" rel="noopener">提问的艺术</a>。<br />3.1 本吧主题为C语言及其它程序设计、软件开发、计算机科学和基础学科的一般话题，包括但不限于疑问求助、技术讨论、书籍评论、成果展示、行业新闻等。<br />3.2 为维护讨论秩序，本吧贴子列表首页的内容一般应主要为近期活跃的和本吧主题相关的讨论内容。对此造成不利影响的行为视为<em>影响版面</em>。影响版面的贴子由吧务定性，视情况予以保留或删除，但不得以此为由封禁。<br />3.3 <em>吧务贴</em>是吧务人员、管理操作和吧规制定及解释直接相关的讨论。<br />3.4 除非能证明吧务管理存在过错，公开质询吧务的吧务贴被视为影响版面。<br />3.5 讨论内容不属于本吧主题及相关内容，没有构成违规行为，也不是吧务贴的贴子为<em>水贴</em>。<br />3.6 本吧不禁止水贴，但请注意节制，保持适当有意义的内容。不要过于频繁发<em>水贴</em>。<br />3.7 通过回复、点“赞”等方式使贴子出现在首页上方的行为为<em>顶贴</em>。<br />3.8 主题或最后回复在一个自然月前的贴子为坟贴。对坟贴的顶贴为<em>挖坟</em>。<br />3.9 重复发相同内容的帖子，吧务应视情况保留其一。<br />3.10 本吧内贴子删除功能应仅用于维护正常讨论秩序，即删除明显的违规、重复或另有约定的内容，不得用于在吧规许可的范围外作为限制特定吧友发言的手段。<br />3.11 对于较长的主题文章需要多个连续回复进行发布时，为预防打断文章内容的<em>插楼</em>（不含楼中楼）回复，楼主可在前几楼显眼处预告删除插楼者。预告在24小时内文章内容未发布完全时，对吧务操作内容以外的实际插楼内容有效（不需要提供其它删除理由）。<br />3.12 吧务或非吧务人员在本吧删除其他正常回复的，若能提供证据，吧友有权要求删除者解释；确认误删的，吧主应予以恢复；无合理理由删除的，吧务可视情况对删除者予以警告或封禁。</li></ul><h2 id="禁止内容"><a class="markdownIt-Anchor" href="#禁止内容"></a> 禁止内容</h2><p>4.1 以下行为无条件视为违规行为：作弊；伸手；侵权；（包括ID中的）不文明言行。<br />4.2 以下行为视为违规行为，除非提前通知并得到吧务批准：拜师；对非精品主题的挖坟；广告。<br />4.3 本吧封杀有关课程设计的贴子，包括求程序、代码、详细设计思路等。<br />4.4 本吧不支持作弊行为，所有考试求助贴一律删除。<br />4.5 广告内容不分私人广告和商业广告，一律删除（包括QQ群、论坛的推广等）。对和本吧主题相关的贴吧贴子和个人项目的宣传，吧务可根据具体内容不视为广告。<br />4.6 禁止标题长度不大于4字节的主题贴。贴子内容不限制字数。<br />4.7 禁止贴子标题故意出现吸引目光的字符（如火星文）。禁止贴子标题或内容出现大片重复或无意义文本。<br />4.8 过于影响版面的水贴会被删除。<br />4.9 过于影响版面的或有意的多次挖坟应被封禁。<br />4.10 禁止发布类似任何邮箱地址分享文件的贴子。<br />4.11 发生争吵、吧务调解无效，无视警告仍然继续的争吵贴子。<br />4.12 以下附则中规定的（典型）违规样例。</p><h2 id="违规样例"><a class="markdownIt-Anchor" href="#违规样例"></a> 违规样例</h2><p>[<span style="color: green">删</span>]请问我不会数学/英语/读书可以学么？ <sub>可以学，不过你会学的很想死的，先学好你的基础学科再说</sub><br />[<span style="color: green">删</span><span style="color: orange">循环封</span><span style="color: red">黑名单</span>]…回答不可以的滚…<sub>(那么请自己离开)</sub><br />[<span style="color: green">删</span><span style="color: orange">循环封</span><span style="color: red">黑名单</span>]wqnmlgb/人渣/垃圾/白痴<sub>(不送)</sub><br />[<span style="color: green">删</span><span style="color: orange">封</span>]我xxxx可以学C语言吗？（xxxx=现在初二/现在高二/大学毕业了/工作了/是女生/残疾人/蛋痛了/…）<sub>(无意义)</sub><br />[<span style="color: green">删</span>]请问这段代码哪里有错？<sub>(麻烦把问题说清楚)</sub><br />[<span style="color: green">删</span>]请问C语言怎么学？<sub>(天知道，看书，敲代码，查资料，或者说别的请自己想)</sub><br />[<span style="color: green">删</span>]请问谭XX的书可以吗？<sub>(除非你想考二级)</sub><br />[<span style="color: green">删</span><span style="color: orange">封</span>]请问这题怎么写？<sub>(不欢迎伸手，请先自己想想)</sub><br />[<span style="color: green">删</span><span style="color: orange">封</span>]请问这段代码什么意思？<sub>(自己去想，否则请说明你自己有什么搞不清楚)</sub><br />[<span style="color: green">删</span>]有没有QQ群<sub>(不欢迎QQ群之类的玩意，请自己找…)</sub><br />[<span style="color: green">删</span><span style="color: orange">封</span>]小女子请问xxxxxx？</p><h2 id="关于伸手贴"><a class="markdownIt-Anchor" href="#关于伸手贴"></a> 关于伸手贴</h2><p><strong>定义</strong>：没有通过自己去努力尝试解决的问题，贴子中体现不出任何自己努力过的证明，则判定为伸手贴子。<br /><strong>注意</strong>并不仅仅是把题目丢上来那种才叫伸手。<br />此定义下，至少包含了：作弊贴子，纯题目贴子，纯代码贴子。（作弊贴性质可能更恶劣，因此并不一定按伸手处理。）<br /><strong>注意</strong>本吧并不认为“只要不是要代码，要答案，就不是伸手”，这与以上定义有明显的区别。按这个定义，伸手贴明显并不包含纯代码贴子。</p><p>伸手与非伸手的区别示例（方括号表示标题）：</p><p>伸手：[求大神]这个代码错在哪里？<code>void main(){xxxxxx}</code><br />非伸手：[求阶乘代码结果不对]我这个求阶乘的代码，在编译器里编译通过，也能运行正常，但输出结果并不是3628800，而是24320，错在哪里？</p><p>评论：伸手的人问的问题，我连你到底代码要干什么都不知道，因为你根本没说这代码是干什么的，帮？想帮你的人连到底应该帮你干什么都不清楚，怎么帮？</p><p>伸手：[小白提问，这个题目不会]题目是XXXXXXXXX（以下省略一千字）<br />非伸手：[小白提问，数据输入问题]原题目很长，经过思考简化后，我发现其实是输入n个数进行排序，如果是固定个数的比如三个的我知道可以<code>scanf(&quot;%d %d %d&quot;);</code>来完成，但这种不定个数的我应该怎么处理呢？</p><p>评论：题目“低级”你就以为一定作为伸手了？你对比一下提问的方式看看。</p><p>伸手：[三个数从小到大输出]输入三个数怎么从小到大输出呢？<br />非伸手：[这个编译器警告是什么意思]对于输入三个数然后从小到大输出这个题目我写了个代码，但编译器给了我一个警告，在<code>if(a&lt;b&lt;c)</code>这一行里，为什么会有这个警告？这个警告是什么意思？<br />伸手：[三个数从小到大输出]输入三个数怎么从小到大输出呢？我知道怎么找最大最小的数，但合起来就不会了</p><p>评论：第三个我宁愿你不说你知道怎么找最大最小，这和你说你知道怎么输出<code>a</code>却不知道怎么输出<code>a*a</code>差不多。变通能力糟糕到一定境界的话，完全可以认为其实你连前一个问题都不会，你只不过是模仿出来了代码，实质你并不懂其意义。若提问者声明了会一个非常相近的问题（连代码的做法也非常相近），却不会稍微变化了的题目，那么判定为伸手无误。</p><p>伸手：[动态规划算法]怎么用动态规划解这个题？题目是XXXXXXXXXX，求完整代码，好人一生平安<br />非伸手：[动态规划算法]这个题目的状态转移方程这么列可以吗？题目出自XXX OJ的XXXX题号。我列的方程是XXXXXX</p><p>评论：题目“高级”你就以为不是伸手了？</p><h1 id="资料和教程"><a class="markdownIt-Anchor" href="#资料和教程"></a> 资料和教程</h1><h2 id="概念与纠错"><a class="markdownIt-Anchor" href="#概念与纠错"></a> 概念与纠错</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1411238421" target="_blank" rel="noopener">ISO C的一些基本概念</a></td><td style="text-align:right">幻の上帝</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1422487681" target="_blank" rel="noopener">ISO C11附录C</a></td><td style="text-align:right">幻の上帝</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1969958655" target="_blank" rel="noopener">关于<code>main</code>函数的原型和返回值(<code>void main</code> vs <code>int main</code>)</a></td><td style="text-align:right">幻の上帝</td></tr></tbody></table><h2 id="注意事项"><a class="markdownIt-Anchor" href="#注意事项"></a> 注意事项</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1877978397" target="_blank" rel="noopener">我们为什么那么痛恨计算机等级与那些问题（二级党请进）</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1213185590" target="_blank" rel="noopener">建议彻底封杀二级党</a></td><td style="text-align:right">serviper</td></tr><tr><td style="text-align:left"><a href="http://pan.baidu.com/share/link?shareid=302843&amp;uk=2417293519" target="_blank" rel="noopener">谭浩强《C程序设计》错误之不完全汇集</a></td><td style="text-align:right">别急还没硬</td></tr></tbody></table><h2 id="新手教程"><a class="markdownIt-Anchor" href="#新手教程"></a> 新手教程</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1165625989" target="_blank" rel="noopener">解读御坂美琴みさか的菱形打印程序——谈如何学习算法</a></td><td style="text-align:right">咱是仙人</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1109535412" target="_blank" rel="noopener">xxx管理系统(作业党你们懂的,伸手杀无赦)</a></td><td style="text-align:right">RichSelian</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1098980046" target="_blank" rel="noopener">教你构建MinGW＋Notepad++编程环境 for C/C++</a></td><td style="text-align:right">5B4B铅笔</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1570864020" target="_blank" rel="noopener">调试指南(问问题之前请自重)</a></td><td style="text-align:right">九头一存</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1393147869" target="_blank" rel="noopener">链表</a></td><td style="text-align:right">万能姬</td></tr><tr><td style="text-align:left"><a href="http://hi.baidu.com/misaka20001/item/d4a4144036d5fbefbdf451de" target="_blank" rel="noopener">[文]某吧主的学习经历</a></td><td style="text-align:right">御坂美琴みさか</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/f/good?kw=c%D3%EF%D1%D4" target="_blank" rel="noopener">更多请阅读’本吧精品区’</a></td><td style="text-align:right"></td></tr></tbody></table><h2 id="各种教程"><a class="markdownIt-Anchor" href="#各种教程"></a> 各种教程</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1597468718" target="_blank" rel="noopener">适合新手练习的几个题目，控制台不再单调呵呵（持续更新）</a></td><td style="text-align:right">Geodesic</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/2025276932" target="_blank" rel="noopener">对拼图问题可还原性的探究</a></td><td style="text-align:right">忆_碎碎念</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/2007516908" target="_blank" rel="noopener">C语言递归调用转化为栈处理的一般式</a></td><td style="text-align:right">elf0223</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/2092645577" target="_blank" rel="noopener">辅助的原理</a></td><td style="text-align:right">霸气外露真没有</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1313731304" target="_blank" rel="noopener">C语言180行随机迷宫代码 详解+分析</a></td><td style="text-align:right">追忆曾经_</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1360685329" target="_blank" rel="noopener">扫雷</a></td><td style="text-align:right">wysaid</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1972512091" target="_blank" rel="noopener">〔九重的百物语之二〕A cellular compiler</a></td><td style="text-align:right">守尸神主</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/2194826437" target="_blank" rel="noopener">【解】面码与万恶的商人砝码</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1797769781" target="_blank" rel="noopener">【新手进阶】话说那些聊天与游戏的网络交互实现</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1798139204" target="_blank" rel="noopener">【初入老鸟】那些网游外挂中大大小小的远程call</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1852969320" target="_blank" rel="noopener">【游戏编程】构架游戏中的粒子系统</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1795338852" target="_blank" rel="noopener">【新手教程】用C语言制作单机游戏外挂</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1868393695" target="_blank" rel="noopener">【音乐编程】基于DirectSound的音乐播放与FFT频谱可视化(part 1)</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1885477077" target="_blank" rel="noopener">【音乐编程】基于DirectSound的音乐播放与FFT频谱可视化(part 3)</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1906977428" target="_blank" rel="noopener">【音乐编程】播放器频谱可视化与语音的智能识别思想(part 3)</a></td><td style="text-align:right">汇蓝鸟</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/f/good?kw=c%D3%EF%D1%D4" target="_blank" rel="noopener">更多请阅读’本吧精品区’</a></td><td style="text-align:right"></td></tr></tbody></table><h2 id="吧友作品"><a class="markdownIt-Anchor" href="#吧友作品"></a> 吧友作品</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://code.google.com/p/comprox/" target="_blank" rel="noopener">Comprox - 肉牛的压缩机</a></td><td style="text-align:right">RichSelian</td></tr><tr><td style="text-align:left"><a href="http://misakamm.github.com/xege/" target="_blank" rel="noopener">EGE(Easy Graphics Engine) - 炮姐的图形库</a></td><td style="text-align:right">御坂美琴みさか</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1535637800" target="_blank" rel="noopener">四则计算器(其实人都是慢慢改进的)</a></td><td style="text-align:right">c_vs</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1894817975" target="_blank" rel="noopener">LL1表达式计算器</a></td><td style="text-align:right">御坂美琴みさか</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1977678397" target="_blank" rel="noopener">拼图游戏</a></td><td style="text-align:right">忆_碎碎念</td></tr></tbody></table><h2 id="其他"><a class="markdownIt-Anchor" href="#其他"></a> 其他</h2><table><thead><tr><th style="text-align:left">标题</th><th style="text-align:right">作者</th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/13382217" target="_blank" rel="noopener">原问题资料大全</a></td><td style="text-align:right">vc99</td></tr><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1620654727" target="_blank" rel="noopener">螺旋方阵</a></td><td style="text-align:right">寒云似雾</td></tr><tr><td style="text-align:left"><a href="http://netlib.bell-labs.com/cm/cs/pearls/index.html" target="_blank" rel="noopener">《编程珠玑》(适合有一定数据结构和算法基础的)</a></td><td style="text-align:right"></td></tr><tr><td style="text-align:left"><a href="http://c-faq-chn.sourceforge.net/" target="_blank" rel="noopener">C语言常见问题集/495个C语言问题</a></td><td style="text-align:right"></td></tr></tbody></table><h1 id="人物简介"><a class="markdownIt-Anchor" href="#人物简介"></a> 人物简介</h1><p>吧主: <a href="http://tieba.baidu.com/home/main?un=%E5%BE%A1%E5%9D%82%E7%BE%8E%E7%90%B4%E3%81%BF%E3%81%95%E3%81%8B&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">御坂美琴みさか</a> <a href="http://tieba.baidu.com/home/main?un=%E9%A1%B6%E4%B9%8B%E5%BA%A7__%E8%B5%AB%E5%8D%A1%E7%89%B9&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">顶之座__赫卡特</a> <a href="http://tieba.baidu.com/home/main?un=%E5%AF%92%E4%BA%91%E4%BC%BC%E9%9B%BE&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">寒云似雾</a></p><hr><p>小吧: <a href="http://tieba.baidu.com/home/main?un=assiss&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">assiss</a> <a href="http://tieba.baidu.com/home/main?un=%E9%98%BF%E5%96%80%E7%90%89%E6%96%AF%E4%B9%8B%E6%AE%87&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">阿喀琉斯之殇</a> <a href="http://tieba.baidu.com/home/main?un=yxyy3604&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">yxyy3604</a> <a href="http://tieba.baidu.com/home/main?un=RFrith&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">RFrith</a> <a href="http://tieba.baidu.com/home/main?un=zy123987&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">zy123987</a> <a href="http://tieba.baidu.com/home/main?un=Hope_20121221_&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Hope_20121221_</a> <a href="http://tieba.baidu.com/home/main?un=Laconism&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Laconism</a><a href="http://tieba.baidu.com/home/main?un=RichSelian&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">RichSelian</a><a href="http://tieba.baidu.com/home/main?un=%E6%88%91%E6%98%AF%E4%B8%8D%E6%98%AF%E5%B8%88%E5%85%84&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">我是不是师兄</a><a href="http://tieba.baidu.com/home/main?un=%E9%9B%BE%E9%A6%99_%E6%A5%BC%E5%85%B0&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">雾香_楼兰</a><a href="http://tieba.baidu.com/home/main?un=%E5%B9%BB%E3%81%AE%E4%B8%8A%E5%B8%9D&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">幻の上帝</a><a href="http://tieba.baidu.com/home/main?un=LarryGoode&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">LarryGoode</a><a href="http://tieba.baidu.com/home/main?un=Infinity_X&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Infinity_X</a><a href="http://tieba.baidu.com/home/main?un=%E7%A5%AD%E9%9F%B3_INoRi&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">祭音_INoRi</a><a href="http://tieba.baidu.com/home/main?un=%E5%85%B3%E7%AD%BE&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">关签</a><a href="http://tieba.baidu.com/home/main?un=%E6%98%9F%E6%9C%88and%E5%9C%A3%E5%86%B0%E9%9B%A8&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">星月and圣冰雨</a><a href="http://tieba.baidu.com/home/main?un=whatofor&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">whatofor</a><a href="http://tieba.baidu.com/home/main?un=_craftG&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">_craftG</a><a href="http://tieba.baidu.com/home/main?un=%E5%AF%92%E5%89%91lhj&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">寒剑lhj</a><a href="http://tieba.baidu.com/home/main?un=moehuster&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">moehuster</a><a href="http://tieba.baidu.com/home/main?un=%E5%BF%86_%E7%A2%8E%E7%A2%8E%E5%BF%B5&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">忆_碎碎念</a><a href="http://tieba.baidu.com/home/main?un=%E6%B1%87%E8%93%9D%E9%B8%9F&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">汇蓝鸟</a><a href="http://tieba.baidu.com/home/main?un=%E5%90%9E%E8%96%AF%E6%9D%A1&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">吞薯条</a><a href="http://tieba.baidu.com/home/main?un=%E2%91%A8chu&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">⑨chu</a><a href="http://tieba.baidu.com/home/main?un=%E9%82%A3%E6%9B%B2%E9%97%B2%E6%84%81&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">那曲闲愁</a><a href="http://tieba.baidu.com/home/main?un=zczqwd&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">zczqwd</a><a href="http://tieba.baidu.com/home/main?un=%E9%98%BF%E5%AE%BE%E5%92%8C%E7%99%BD%E6%B4%81&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">阿宾和白洁</a><a href="http://tieba.baidu.com/home/main?un=bc12358&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">bc12358</a><a href="http://tieba.baidu.com/home/main?un=code_%E6%96%B0%E4%B8%96%E7%BA%AA&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">code_新世纪</a><a href="http://tieba.baidu.com/home/main?un=%E5%B9%BD%E7%BD%B9%E7%84%B0&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">幽罹焰</a></p><hr><p>小编: <a href="http://tieba.baidu.com/home/main?un=EAgleLeo&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">EAgleLeo</a><a href="http://tieba.baidu.com/home/main?un=EGE%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">EGE娘</a><a href="http://tieba.baidu.com/home/main?un=%E6%B1%87%E8%93%9D%E9%B8%9F&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">汇蓝鸟</a><a href="http://tieba.baidu.com/home/main?un=%E5%BF%86_%E7%A2%8E%E7%A2%8E%E5%BF%B5&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">忆_碎碎念</a><a href="http://tieba.baidu.com/home/main?un=%E6%A9%98%E9%9B%BE%E5%8D%8E&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">橘雾华</a></p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><a href="http://tieba.baidu.com/home/main?un=RichTextBox&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">RichTextBox</a>/<a href="http://tieba.baidu.com/home/main?un=RichSelian&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">RichSelian</a>/<a href="http://tieba.baidu.com/home/main?un=EGG%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">EGG娘</a>:</td><td>ROX-滚床压缩肉牛[<a href="https://github.com/richox" target="_blank" rel="noopener">richox</a>]<sub>妹纸：某度娘HR //FIXME: @NailesHcir</sub>/本吧三大禽兽之一</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%AF%92%E4%BA%91%E4%BC%BC%E9%9B%BE&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">寒云似雾</a>/<a href="http://tieba.baidu.com/home/main?un=%E7%81%B5%E9%A3%8E%E7%AB%B9&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">灵风竹</a>/<a href="http://tieba.baidu.com/home/main?un=TetrisNoOSer&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">TetrisNoOSer</a>:</td><td>某支大水笔[<a href="https://github.com/hysw" target="_blank" rel="noopener">hysw</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=5230%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">5230娘</a>/<a href="http://tieba.baidu.com/home/main?un=%E9%A1%B6%E4%B9%8B%E5%BA%A7__%E8%B5%AB%E5%8D%A1%E7%89%B9&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">顶之座__赫卡特</a>/<a href="http://tieba.baidu.com/home/main?un=%E7%81%BC%E5%8F%91%E3%81%AE%E5%A4%8F%E5%A8%9C&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">灼发の夏娜</a>:</td><td>hecate/彩夏/ayaka/毛球<sub>日语巨触</sub></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%B9%BB%E3%81%AE%E4%B8%8A%E5%B8%9D&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">幻の上帝</a>/<a href="http://tieba.baidu.com/home/main?un=FrankHB&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">FrankHB</a>:</td><td>圆滚滚的工口帝球葱[<a href="https://bitbucket.org/frankhb/" target="_blank" rel="noopener">frankhb</a>][<a href="https://github.com/FrankHB" target="_blank" rel="noopener">FrankHB</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%BE%A1%E5%9D%82%E7%BE%8E%E7%90%B4%E3%81%BF%E3%81%95%E3%81%8B&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">御坂美琴みさか</a>/<a href="http://tieba.baidu.com/home/main?un=EGE%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">EGE娘</a>:</td><td>misaka-传说中的炮姐[<a href="https://github.com/misakamm" target="_blank" rel="noopener">misakamm</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Hope_20121221_&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Hope_20121221_</a>:</td><td>某个小正太[<a href="https://github.com/hope1" target="_blank" rel="noopener">hope1</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E9%82%A3%E6%9B%B2%E9%97%B2%E6%84%81&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">那曲闲愁</a>:</td><td>喵</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%88%AB%E6%80%A5%E8%BF%98%E6%B2%A1%E7%A1%AC&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">别急还没硬</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=EAgleLeo&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">EAgleLeo</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E6%88%91%E6%98%AF%E4%B8%8D%E6%98%AF%E5%B8%88%E5%85%84&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">我是不是师兄</a>:</td><td>这究竟是还是不是?</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=_craftG&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener"><em>craftG</a>/<a href="http://tieba.baidu.com/home/main?un=%E8%89%AF%E5%8C%96%E7%BA%B2%E9%A2%86_&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">良化纲领</em></a>/<a href="http://tieba.baidu.com/home/main?un=%E9%98%8E%E9%AD%94%E6%8A%BD&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">阎魔抽</a>/<a href="http://tieba.baidu.com/home/main?un=serviper&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">serviper</a>/<a href="http://tieba.baidu.com/home/main?un=%E4%B9%9D%E5%A4%B4%E4%B8%80%E5%AD%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">九头一存</a>/<a href="http://tieba.baidu.com/home/main?un=%E5%B8%95%E6%96%AF%E7%A7%91%E7%BB%B4&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">帕斯科维</a>/<a href="http://tieba.baidu.com/home/main?un=H%E4%B9%8B%E8%AF%BB%E5%A7%AC&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">H之读姬</a>/<a href="http://tieba.baidu.com/home/main?un=Razielize&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Razielize</a>/<a href="http://tieba.baidu.com/home/main?un=oxdead&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">oxdead</a>/<a href="http://tieba.baidu.com/home/main?un=Raptor%E9%85%B1&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Raptor酱</a>/<a href="http://tieba.baidu.com/home/main?un=%E6%89%AF%E8%9B%8B%E7%9A%84Aria&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">扯蛋的Aria</a>/<a href="http://tieba.baidu.com/home/main?un=Xenoneee&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Xenoneee</a>/<a href="http://tieba.baidu.com/home/main?un=%E4%B9%9D%E9%87%8D%E6%9D%9F%E9%A3%8E%E6%99%AF&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">九重束风景</a>/<a href="http://tieba.baidu.com/home/main?un=%E6%94%BB%E5%9F%8E%E5%B0%B8_&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">攻城尸_</a>/<a href="http://tieba.baidu.com/home/main?un=%E4%B8%87%E8%83%BD%E5%A7%AC&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">万能姬</a>/<a href="http://tieba.baidu.com/home/main?un=%E5%AE%88%E5%B0%B8%E7%A5%9E%E4%B8%BB&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">守尸神主</a>/<a href="http://tieba.baidu.com/home/main?un=...&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">…</a>:</td><td>撸之羊驼[<a href="https://github.com/Akvelog" target="_blank" rel="noopener">Akvelog</a>]/本吧三大禽兽之一</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=bc12358&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">bc12358</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Laconism&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Laconism</a>:</td><td>L大[<a href="https://github.com/laconism" target="_blank" rel="noopener">laconism</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=yxyy3604&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">yxyy3604</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%BF%86_%E7%A2%8E%E7%A2%8E%E5%BF%B5&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">忆_碎碎念</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E6%B1%87%E8%93%9D%E9%B8%9F&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">汇蓝鸟</a>:</td><td>面麻<sub>酱</sub> (英文+图形+…)</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%B9%BD%E7%BD%B9%E7%84%B0&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">幽罹焰</a>:</td><td><sub>jr</sub>rmz</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E7%81%BC%E7%9C%BC%E7%9A%84%E8%B6%85%E5%93%A5&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">灼眼的超哥</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=zy123987&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">zy123987</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=wysaid&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">wysaid</a>:</td><td>好像在搞3D(gl还是dx)似得</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=User32&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">User32</a>:</td><td>被揉坏掉了的冰凉小脸</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E6%98%9F%E6%9C%88and%E5%9C%A3%E5%86%B0%E9%9B%A8&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">星月and圣冰雨</a>:</td><td>算法大牛</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Luoji_1995&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Luoji_1995</a>:</td><td>GJK-逻辑神最近不知道去哪了</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=assiss&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">assiss</a>:</td><td>C语言吧元老<sub>似乎有女儿以后就很少来了……</sub></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E9%98%BF%E5%AE%BE%E5%92%8C%E7%99%BD%E6%B4%81&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">阿宾和白洁</a>/<a href="http://tieba.baidu.com/home/main?un=5320%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">5320娘</a>/<a href="http://tieba.baidu.com/home/main?un=N97%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">N97娘</a>/<a href="http://tieba.baidu.com/home/main?un=%E8%BF%91%E5%8D%AB_%E5%8F%B2%E8%8F%9C&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">近卫_史菜</a>/<a href="http://tieba.baidu.com/home/main?un=LoadLibrary&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">LoadLibrary</a>/<a href="http://tieba.baidu.com/home/main?un=...&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">…</a>:</td><td>已经彻底坏掉了/本吧三大禽兽之一</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=ZD_Tinson&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">ZD_Tinson</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=NEMESIS_T2&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">NEMESIS_T2</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Lemoneee&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Lemoneee</a>/<a href="http://tieba.baidu.com/home/main?un=Gilliland&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Gilliland</a>/<a href="http://tieba.baidu.com/home/main?un=SergeiSobolev&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">SergeiSobolev</a>/<a href="http://tieba.baidu.com/home/main?un=...&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">…</a>:</td><td>好久没出现的G算姬[<a href="https://github.com/Golevka" target="_blank" rel="noopener">Golevka</a>]/LEEE</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%BD%A9%E8%89%B2%E3%81%AE%E5%A4%A2%E2%88%A9o%E2%88%A9&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">彩色の夢∩o∩</a>/<a href="http://tieba.baidu.com/home/main?un=%E5%93%80%E5%82%B7%E4%B9%8B%E6%9C%88&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">哀傷之月</a>:</td><td>数学娘、别字娘、正体字娘<sub>伪娘</sub></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E6%80%AA%E5%85%BD%E5%A4%A7%E6%88%98%E9%AD%94%E4%BA%BA&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">怪兽大战魔人</a>:</td><td>编译器大神</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=NaylonSlain&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">NaylonSlain</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=MasterRay&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">MasterRay</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=8pm&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">8pm</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=gccer&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">gccer</a>:</td><td>史前大牛<sub>比揉揉牛更早顶着gnu的头像</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=CIW_BLUE&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">CIW_BLUE</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E7%9F%AE%E6%B2%B9%E5%AB%91%E9%85%B1%E7%B4%AB%E5%94%89&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">矮油嫑酱紫唉</a>:</td><td>法律<sub>好似是婚姻法</sub>人士在这里</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=nadesico19&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">nadesico19</a>:</td><td>C菌-日语巨触[<a href="https://github.com/nadesico19" target="_blank" rel="noopener">nadesico19</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Coding%E7%8B%82%E4%BA%BA&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Coding狂人</a>:</td><td>好似很久以前被气走了</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=LH_Mouse_EX&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">LH_Mouse_EX</a>/<a href="http://tieba.baidu.com/home/main?un=%E4%B9%90%E5%A4%A9%E6%B4%BE%E7%9A%84%E5%B0%8F%E8%80%97%E5%AD%90&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">乐天派的小耗子</a>:</td><td>玩窗户<sub>Win</sub>的耗吱</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%85%B3%E7%AD%BE&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">关签</a>:</td><td>灿烂的大菊<sub>花</sub>长</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E9%99%86umj&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">陆umj</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=Padme0Amidala&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Padme0Amidala</a>:</td><td>某著名大水笔</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%8C%97%E6%96%97(%E5%B7%B2%E8%A2%AB%E6%B0%B8%E5%B0%81)&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">北斗(已被永封)</a>/<a href="http://tieba.baidu.com/home/main?un=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%B5%B7%E5%86%9B%E5%8F%B8%E4%BB%A4&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">土耳其海军司令</a>:</td><td>隔壁的人肉删贴机[<a href="https://github.com/AbrahamHokuto" target="_blank" rel="noopener">AbrahamHokuto</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E9%A3%8E%E4%B9%8B%E8%BF%BD%E6%A2%A6%E8%80%85&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">风之追梦者</a>/<a href="http://tieba.baidu.com/home/main?un=%E6%A2%85%E6%B1%81%E8%BF%BD%E6%B1%82%E8%80%85&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">梅汁追求者</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=jingyingbox&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">jingyingbox</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=patricia_xiao&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">patricia_xiao</a>/<a href="http://tieba.baidu.com/home/main?un=Carbucketty&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">Carbucketty</a>:</td><td>某pku经验收集者…<sub>祭音_INoRi 的评语: 自从来C第一次见到1K+的帖子…</sub></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=HGtz2222&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">HGtz2222</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=whatofor&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">whatofor</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E2%91%A8chu&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">⑨chu</a>:</td><td>[<a href="https://github.com/9chu" target="_blank" rel="noopener">9chu</a>]</td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%8D%A9s%E7%81%AC%E9%A3%9E%E9%A3%9E&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">卩s灬飞飞</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E5%82%BB%E6%B8%A1%E5%A8%98&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">傻渡娘</a>:</td><td><sub>汉纸：啪啪熊</sub></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=china_gll&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">china_gll</a>:</td><td></td></tr><tr><td><a href="http://tieba.baidu.com/home/main?un=%E8%90%A7%E3%81%AE%E5%8D%81%E4%B8%89%E9%83%8E&amp;fr=frs&amp;ie=utf-8" target="_blank" rel="noopener">萧の十三郎</a>:</td><td></td></tr><tr><td>:</td><td></td></tr></tbody></table><h1 id="工具简介"><a class="markdownIt-Anchor" href="#工具简介"></a> 工具简介</h1><h2 id="集成开发环境-integrated-development-environmentide"><a class="markdownIt-Anchor" href="#集成开发环境-integrated-development-environmentide"></a> 集成开发环境: Integrated Development Environment(IDE)</h2><table><thead><tr><th>工具</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="http://www.visualstudio.com/downloads/download-visual-studio-vs" target="_blank" rel="noopener">MS Visual Studio(记得找Visual C++ Express，免费的 <strong>（编注：Express微软已经停止提供，请大家尝试社区版Community，也是免费的）</strong>)</a></td><td style="text-align:right">微软出品的C/C++/whatever IDE (Warning:2<sup>+</sup>GB)</td></tr><tr><td><a href="http://www.codeblocks.org/" target="_blank" rel="noopener">Code::Blocks(记得下载带MinGW的版本)</a></td><td style="text-align:right">开放源码的全功能的跨平台C/C++集成开发环境</td></tr><tr><td><a href="http://www.codelite.org/" target="_blank" rel="noopener">CodeLite</a></td><td style="text-align:right">开源、跨平台的C/C++集成开发环境</td></tr><tr><td><a href="http://sourceforge.net/projects/orwelldevcpp/" target="_blank" rel="noopener">Orwell Dev-C++</a></td><td style="text-align:right">可移植的C/C++IDE</td></tr><tr><td><a href="http://www.eclipse.org/downloads/" target="_blank" rel="noopener">Eclipse</a></td><td style="text-align:right">多语言的集成开发环境(设置较为复杂)</td></tr><tr><td><a href="http://netbeans.org/" target="_blank" rel="noopener">Netbeans</a></td><td style="text-align:right">…</td></tr><tr><td><a href="http://www.geany.org/" target="_blank" rel="noopener">Geany</a></td><td style="text-align:right">…</td></tr><tr><td><a href="http://qt.digia.com/" target="_blank" rel="noopener">Qt Creator</a></td><td style="text-align:right">…</td></tr><tr><td><a href="http://www.prgramarts.com/cfree_ch/download.htm" target="_blank" rel="noopener">C-Free</a></td><td style="text-align:right">据说还可以的某个IDE (专业版收费)</td></tr><tr><td><a href="http://www.lighttable.com/" target="_blank" rel="noopener">Light Table</a></td><td style="text-align:right">华丽丽的某玩意</td></tr></tbody></table><h2 id="编译器-compiler"><a class="markdownIt-Anchor" href="#编译器-compiler"></a> 编译器: Compiler</h2><table><thead><tr><th>工具</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="http://gcc.gnu.org/" target="_blank" rel="noopener">GCC</a></td><td style="text-align:right">the GNU Compiler Collection</td></tr><tr><td><a href="http://clang.llvm.org/" target="_blank" rel="noopener">Clang</a></td><td style="text-align:right">a C language family frontend for LLVM</td></tr><tr><td><a href="http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products" target="_blank" rel="noopener">Visual C++ :: cl.exe</a></td><td style="text-align:right">M$VC自带的编译器</td></tr><tr><td><a href="http://www.mingw.org/" target="_blank" rel="noopener">MinGW</a></td><td style="text-align:right">Minimalist GNU for Windows</td></tr></tbody></table><h2 id="编辑器-editor"><a class="markdownIt-Anchor" href="#编辑器-editor"></a> 编辑器: Editor</h2><table><thead><tr><th>工具</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="http://www.vim.org/" target="_blank" rel="noopener">Vim</a></td><td style="text-align:right">两大神器之一</td></tr><tr><td><a href="http://www.gnu.org/software/emacs/" target="_blank" rel="noopener">Emacs</a></td><td style="text-align:right">另一个神器</td></tr><tr><td><a href="http://www.nano-editor.org/" target="_blank" rel="noopener">Nano</a></td><td style="text-align:right">简洁实用的某个命令行编辑器</td></tr><tr><td><a href="#">Notepad++</a></td><td style="text-align:right">可以试试,挺不错的 <strong>（编注：作者态度+泛华，已不推荐）</strong></td></tr><tr><td><a href="http://kate-editor.org/" target="_blank" rel="noopener">Kate</a></td><td style="text-align:right">某个挺实在的编辑器</td></tr><tr><td><a href="http://projects.gnome.org/gedit/" target="_blank" rel="noopener">gedit</a></td><td style="text-align:right">还行的某玩意</td></tr><tr><td><a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code</a></td><td style="text-align:right">微软出品编辑器</td></tr><tr><td><a href="http://www.sublimetext.com/" target="_blank" rel="noopener">Sublime Text</a></td><td style="text-align:right">算半个神器[$70]</td></tr><tr><td><a href="http://www.editplus.com/" target="_blank" rel="noopener">EditPlus</a></td><td style="text-align:right">某个比较老牌的玩意[$35]</td></tr><tr><td><a href="http://www.ultraedit.com/" target="_blank" rel="noopener">UltraEdit</a></td><td style="text-align:right">另一个比较老牌的玩意[$60]</td></tr></tbody></table><h1 id="书籍简介"><a class="markdownIt-Anchor" href="#书籍简介"></a> 书籍简介</h1><h2 id="关于某些书"><a class="markdownIt-Anchor" href="#关于某些书"></a> 关于某些书</h2><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/c%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/4430361" target="_blank" rel="noopener">《C程序设计》 <sub>谭浩强(谭老湿) 著</sub></a></td><td style="text-align:right">一本挺渣的书,有一堆概念错误,误导性严重<sub>话说被误导的某些家伙经常会被喷的很惨</sub>传说中的C语言2级考试<sub>真是很2的考试</sub>神书,推荐给只为了考证的同学<sub>想好好学的还是算了吧</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/c%2B%2B%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/13878767" target="_blank" rel="noopener">《C++程序设计》 <sub>谭浩强(谭老湿) 著</sub></a></td><td style="text-align:right">渣渣 <strong>（编注：据C++吧的一些看过这本书的反映，这个《C++程序设计》同样有很多包括概念上的，和代码上的错误，谨慎选择）</strong></td></tr></tbody></table><h2 id="c语言"><a class="markdownIt-Anchor" href="#c语言"></a> C语言</h2><h3 id="入门书籍"><a class="markdownIt-Anchor" href="#入门书籍"></a> 入门书籍</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/c%20primer%20plus" target="_blank" rel="noopener">《C Primer Plus》 by Stephen Prata</a></td><td style="text-align:right">一本很经典的入门书籍<sub>据报告有不少打字错误,某个版本在489页有一个严重的错误</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8" target="_blank" rel="noopener">《C语言入门经典》 by Ivor Horton</a></td><td style="text-align:right">据说是本很经典的入门书籍<sub>ps.本人没看过</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80/10640335" target="_blank" rel="noopener">[TCPL]《C程序设计语言》 by Kernighan &amp; Ritchie</a></td><td style="text-align:right">传说中的K&amp;R C, 具有无上尊严的某书<sub>C语言的创造者的书,ANSI标准起源于此,有点难度</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%8E%B0%E4%BB%A3%E6%96%B9%E6%B3%95/1849531" target="_blank" rel="noopener">《C Programming: A Modern Approach》 by K. N King</a></td><td style="text-align:right"></td></tr></tbody></table><h3 id="进阶书籍"><a class="markdownIt-Anchor" href="#进阶书籍"></a> 进阶书籍</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/C%E5%92%8C%E6%8C%87%E9%92%88" target="_blank" rel="noopener">《C和指针》 by Kenneth Reek</a></td><td style="text-align:right">对每个学C语言的人而言都是值得一看的好书</td></tr><tr><td><a href="https://baike.baidu.com/item/C%E4%B8%93%E5%AE%B6%E7%BC%96%E7%A8%8B" target="_blank" rel="noopener">《C专家编程》 by Peter van der Linden</a></td><td style="text-align:right">深入地讲解了C语言的一些方面<sub>看此书得有点基础</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/C%E9%99%B7%E9%98%B1%E4%B8%8E%E7%BC%BA%E9%99%B7" target="_blank" rel="noopener">《C陷阱与缺陷》 by Andrew Koenig</a></td><td style="text-align:right">如何不想被bug整死,请看这里<sub>看完入门书之后可以花几天先浏览一遍,排毒养颜</sub></td></tr></tbody></table><h2 id="c"><a class="markdownIt-Anchor" href="#c"></a> C++</h2><h3 id="入门书籍-2"><a class="markdownIt-Anchor" href="#入门书籍-2"></a> 入门书籍</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%20Primer" target="_blank" rel="noopener">《C++ Primer》 by Stanley B. Lippman…</a></td><td style="text-align:right">一本非常经典的入门书籍<sub>需要一定的理论基础</sub></td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%20Primer%20plus" target="_blank" rel="noopener">《C++ Primer Plus》 by Stephen Prata</a></td><td style="text-align:right">挺不错的无基础入门书</td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80/657864" target="_blank" rel="noopener">《C++程序设计语言》 by Bjarne Stroustrup</a></td><td style="text-align:right">C++作者的书</td></tr></tbody></table><h3 id="进阶书籍-2"><a class="markdownIt-Anchor" href="#进阶书籍-2"></a> 进阶书籍</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/c++%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3/781611" target="_blank" rel="noopener">《Thinking In C++》 by Bruce Eckel</a></td><td style="text-align:right">C++编程思想, 适合研究研究</td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%E8%AE%BE%E8%AE%A1%E6%96%B0%E6%80%9D%E7%BB%B4" target="_blank" rel="noopener">《Modern C++ Design》 by Andrei Alexandrescu</a></td><td style="text-align:right">关于模板元编程的(Warning:非常难)</td></tr><tr><td><a href="https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E6%8E%A2%E7%B4%A2C%2B%2B%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B%EF%BC%88%E5%BD%B1%E5%8D%B0%E7%89%88%EF%BC%89/15181638" target="_blank" rel="noopener">《Inside The C++ Object Model》 by Stanley B. Lippman</a></td><td style="text-align:right">深入讲解了C++的对象模型</td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%E8%AF%AD%E8%A8%80%E7%9A%84%E8%AE%BE%E8%AE%A1%E5%92%8C%E6%BC%94%E5%8C%96/12107465" target="_blank" rel="noopener">《The Design and Evolution of C++》 by Bjarne Stroustrup</a></td><td style="text-align:right">C++的发展史</td></tr><tr><td><a href="https://baike.baidu.com/item/Effective%20C%2B%2B%E4%B8%AD%E6%96%87%E7%89%88" target="_blank" rel="noopener">《Effective C++》 by Scott Meyers</a></td><td style="text-align:right">详细的介绍了各种规则和坑</td></tr><tr><td><a href="https://baike.baidu.com/item/Exceptional%20C%2B%2B%EF%BC%88%E4%B8%AD%E6%96%87%E7%89%88%EF%BC%89" target="_blank" rel="noopener">《Exceptional C++》 by Herb Sutter</a></td><td style="text-align:right">类似Effective C++</td></tr><tr><td><a href="https://baike.baidu.com/item/Effective%20STL%E4%B8%AD%E6%96%87%E7%89%88%EF%BC%9A50%E6%9D%A1%E6%9C%89%E6%95%88%E4%BD%BF%E7%94%A8STL%E7%9A%84%E7%BB%8F%E9%AA%8C" target="_blank" rel="noopener">《Effective STL》 by Scott Meyers</a></td><td style="text-align:right">STL介绍</td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%E6%A0%87%E5%87%86%E5%BA%93%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89" target="_blank" rel="noopener">《The C++ standard library》 by Nicolai M. Josuttis</a></td><td style="text-align:right">字典</td></tr><tr><td><a href="https://baike.baidu.com/item/Accelerated%20C%2B%2B%E4%B8%AD%E6%96%87%E7%89%88" target="_blank" rel="noopener">《Accelerated C++》 by Andrew Koenig</a></td><td style="text-align:right">…</td></tr><tr><td><a href="https://baike.baidu.com/item/Essential%20C%2B%2B" target="_blank" rel="noopener">《Essential C++》 by Stanley B. Lippman</a></td><td style="text-align:right">…</td></tr><tr><td><a href="https://baike.baidu.com/item/Exceptional%20C%2B%2B%20Style%E4%B8%AD%E6%96%87%E7%89%88" target="_blank" rel="noopener">《Exceptional C++ Style》 by Herb Sutter</a></td><td style="text-align:right">风格问题</td></tr><tr><td><a href="https://baike.baidu.com/item/C%2B%2B%EF%BC%88Templates%E4%B8%AD%E6%96%87%E7%89%88%EF%BC%89" target="_blank" rel="noopener">《C++ Templates: The Complete Guide》 by David Vandevoorde…</a></td><td style="text-align:right">模板百科</td></tr></tbody></table><h2 id="高阶内容能看原版的去看原版去"><a class="markdownIt-Anchor" href="#高阶内容能看原版的去看原版去"></a> 高阶内容(能看原版的去看原版去…)</h2><h3 id="数学算法数据结构"><a class="markdownIt-Anchor" href="#数学算法数据结构"></a> 数学/算法/数据结构</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="#">《Algorithms》 by Robert Sedgewick</a></td><td style="text-align:right">算法</td></tr><tr><td><a href="#">[CLRS]《Introduction to Algorithms》 by C,L,R,S</a></td><td style="text-align:right">算法导论</td></tr><tr><td><a href="#">[TAOCP]《The Art of Computer Programming》 by Donald Knuth</a></td><td style="text-align:right">计算机程序设计艺术</td></tr><tr><td><a href="#">《Concrete Mathematics: A Foundation for Computer Science》 by Donald Knuth</a></td><td style="text-align:right">具体数学</td></tr></tbody></table><h3 id="计算机系统"><a class="markdownIt-Anchor" href="#计算机系统"></a> 计算机系统</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="#">[CSAPP]《Computer Systems: A Programmer’s Perspective》 by Randal E. Bryant…</a></td><td style="text-align:right">深入理解计算机系统</td></tr><tr><td><a href="#">[恐龙书]《Operating System Concepts》 by Greg Gagne…</a></td><td style="text-align:right">操作系统概念</td></tr><tr><td><a href="#">《Modern Operating Systems》 by Andrew S. Tanenbaum</a></td><td style="text-align:right">现代操作系统</td></tr><tr><td><a href="#">[APUE]《Advanced Programming in the Unix Environment》 by W. Richard Stevens</a></td><td style="text-align:right">UNIX环境高级编程</td></tr><tr><td><a href="#">《The UNIX Programming Envirment》 by Brian Kernighan</a></td><td style="text-align:right">UNIX编程环境</td></tr><tr><td><a href="#">《The Art of Unix Programming》 by Eric S. Raymond</a></td><td style="text-align:right">UNIX编程艺术</td></tr><tr><td><a href="#">《The Unix-Haters Handbook》 by Simson Garfinkel</a></td><td style="text-align:right">UNIX痛恨者手册</td></tr></tbody></table><h3 id="网络编程"><a class="markdownIt-Anchor" href="#网络编程"></a> 网络编程</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="#">《TCP/IP Illustrated》 by W. Richard Stevens</a></td><td style="text-align:right">TCP/IP 详解</td></tr><tr><td><a href="#">《Computer networks》 by Andrew S. Tanenbaum</a></td><td style="text-align:right">计算机网络</td></tr><tr><td><a href="#">《Internetworking With TCP/IP》 by Douglas E. Comer</a></td><td style="text-align:right">用TCP/IP进行网际互连</td></tr><tr><td><a href="#">[UNP]《UNIX Network Programming》 by W. Richard Stevens</a></td><td style="text-align:right">UNIX网络编程</td></tr></tbody></table><h3 id="计算机程序编译原理"><a class="markdownIt-Anchor" href="#计算机程序编译原理"></a> 计算机程序/编译原理</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="#">[DragonBook/龙书]《Compilers: Principles, Techniques, and Tools》 by Alfred Aho…</a></td><td style="text-align:right">编译原理</td></tr><tr><td><a href="#">[SICP]《Structure and Interpretation of Computer Programs》 by Gerald Jay Sussman</a></td><td style="text-align:right">计算机程序的构造和解释</td></tr></tbody></table><h3 id="其他-2"><a class="markdownIt-Anchor" href="#其他-2"></a> 其他</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="#">[GoF]《Design Patterns:Elements of Reusable Object-Oriented Software》 by Gang of Four</a></td><td style="text-align:right">设计模式</td></tr><tr><td><a href="#">《The Practice of Programming》 by Brian Kernighan…</a></td><td style="text-align:right">程序设计实践</td></tr></tbody></table><h2 id="其他-3"><a class="markdownIt-Anchor" href="#其他-3"></a> 其他</h2><h3 id="java"><a class="markdownIt-Anchor" href="#java"></a> Java</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/Java%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3" target="_blank" rel="noopener">《Thinking in Java》 by Bruce Eckel</a></td><td style="text-align:right"></td></tr></tbody></table><h3 id="noip"><a class="markdownIt-Anchor" href="#noip"></a> NOIP</h3><table><thead><tr><th>标题</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td><a href="https://baike.baidu.com/item/%E7%AE%97%E6%B3%95%E7%AB%9E%E8%B5%9B%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8" target="_blank" rel="noopener">《算法竞赛入门经典》 by 刘汝佳</a></td><td style="text-align:right"></td></tr></tbody></table><h1 id="常见问题"><a class="markdownIt-Anchor" href="#常见问题"></a> 常见问题</h1><h2 id="我现在在读xx学校年级能不能学c语言"><a class="markdownIt-Anchor" href="#我现在在读xx学校年级能不能学c语言"></a> 我现在在读xx[学校/年级…]，能不能学C语言</h2><p>能: 如果你愿意<em>浪费</em>时间在程序的苦海之中, 有兴趣坚持走下去, 并且有一定的数学基础<br />不能: C语言对于很多人而言<strong>真的很难</strong><br />你可以去学,学不学得了是你自己的问题</p><h2 id="学c语言该如何入门"><a class="markdownIt-Anchor" href="#学c语言该如何入门"></a> 学C语言该如何入门</h2><p>看书, 读代码, 敲代码, Wikipedia, csdn, 本吧精品区, Google, Bing, Baidu</p><h2 id="为神马推荐c-primer-plus而不推荐销量千万的c程序设计"><a class="markdownIt-Anchor" href="#为神马推荐c-primer-plus而不推荐销量千万的c程序设计"></a> 为神马推荐《C Primer Plus》而不推荐销量千万的《C程序设计》</h2><p>不是说崇洋媚外，不是外国书就没错误了，只是《C程序设计》的概念性错误太多了</p><h2 id="看完了谭的c程序设计或类似请问下一步该做什么"><a class="markdownIt-Anchor" href="#看完了谭的c程序设计或类似请问下一步该做什么"></a> 看完了谭的《C程序设计》(或类似)请问下一步该做什么</h2><p>考二级: 够了，不用学别的了<br />学校课程要求的，以后不用: 随你<br />学了要用的: 好吧[扔掉/烧掉/埋掉]随你,具体请看’书籍简介’</p><h2 id="c语言cjavapythonxxxyyy改如何选择"><a class="markdownIt-Anchor" href="#c语言cjavapythonxxxyyy改如何选择"></a> C语言,C++,Java,Python,XXX,YYY改如何选择</h2><p>自己试去<sub>ps.其实Python是个不错的入门选择</sub></p><h2 id="怎么样逃离可怕的黑框框"><a class="markdownIt-Anchor" href="#怎么样逃离可怕的黑框框"></a> 怎么样逃离可怕的黑框框</h2><p>命令行挺好的，实在要图形的话自己去搜GUI/D3D/GDI/OpenGL/QT/GTK…</p><h2 id="关于iiprintfdddiiiiii"><a class="markdownIt-Anchor" href="#关于iiprintfdddiiiiii"></a> 关于<code>(i++)+(++i)</code>,<code>printf(&quot;%d%d%d&quot;,++i,i,i++)</code>,<code>i+=i*=i</code></h2><p>警告: 别写(除了某些特殊情况,没人能保证这些类型的玩意会出现神马问题,参见《C陷阱与缺陷》)</p><h2 id="c语言有前钱途么"><a class="markdownIt-Anchor" href="#c语言有前钱途么"></a> C语言有前(钱)途么</h2><p>看你学的怎么样&amp;找的工作怎么样</p><h2 id="3264位windows-xp78该用神马软件"><a class="markdownIt-Anchor" href="#3264位windows-xp78该用神马软件"></a> 32/64位Windows xp/7/8该用神马软件</h2><p>集成开发环境介绍的基本都可以</p><h2 id="找vc6为什么不应该用vc6以及为什么vc6的兼容性如此之差"><a class="markdownIt-Anchor" href="#找vc6为什么不应该用vc6以及为什么vc6的兼容性如此之差"></a> 找VC6?为什么不应该用VC6，以及为什么VC6的兼容性如此之差</h2><p>和Windows98同样的道理(话说XP都到该被淘汰的时候了)</p><h2 id="有什么图形库"><a class="markdownIt-Anchor" href="#有什么图形库"></a> 有什么图形库</h2><p>EGE神马的挺好的(参见吧友作品)</p><h2 id="学c语言要多久"><a class="markdownIt-Anchor" href="#学c语言要多久"></a> 学C语言要多久</h2><p>一天(如果只是看语法定义的话),当然,别以为能很轻松的在几年内精通</p><h1 id="吧友语录"><a class="markdownIt-Anchor" href="#吧友语录"></a> 吧友语录</h1><h2 id="我是不是师兄关于挂科"><a class="markdownIt-Anchor" href="#我是不是师兄关于挂科"></a> 我是不是师兄:关于挂科</h2><p>好吧 我的老毛病又犯了<br />挂科队形 尾巴加一 C挂科<br />1 挂科不代表没天赋[尤其是C课的补考 展开点说 有时候真的是题目本身是错的你信不信]<br />2 学C[或者其他任何东西都]需要很多东西 但是唯独不需要天赋<br />3 忘掉关于天赋的各种神奇的传说吧 每一个人都是从<code>mian</code>函数和少<code>;</code>开始一步一步战斗<br />4 数组正确起点其实是0不是1<br />5 <code>'\0'</code>[学C应该懂]</p><h2 id="一招秒神帖子的标题"><a class="markdownIt-Anchor" href="#一招秒神帖子的标题"></a> 一招秒神:帖子的标题</h2><p>如果能在帖子的标题中正确有效的表达出你想问的问题而不是每天大神大哥小弟帮帮忙什么的，你觉得会被删么?<br />如果能在帖子的正文中清晰有序对说明你自己的思考过程（写注释最好），和自己思考时遇到的断点，吧友们会很乐意帮忙指点的，而不是贴出一段代码就伸手要答案要结果帮忙改错。<br />你真当这里是免费人肉编译器？</p><h1 id="其他-4"><a class="markdownIt-Anchor" href="#其他-4"></a> 其他</h1><h2 id="联络方式"><a class="markdownIt-Anchor" href="#联络方式"></a> 联络方式</h2><table><thead><tr><th style="text-align:left"></th><th style="text-align:right"></th></tr></thead><tbody><tr><td style="text-align:left"><a href="http://tieba.baidu.com/p/1941867601" target="_blank" rel="noopener">C语言吧IRC频道</a></td><td style="text-align:right">iyzsong</td></tr></tbody></table><h2 id="友情贴吧"><a class="markdownIt-Anchor" href="#友情贴吧"></a> 友情贴吧</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><a href="http://tieba.baidu.com/f?kw=c%D3%EF%D1%D4" target="_blank" rel="noopener">C语言吧</a></td><td></td></tr><tr><td><a href="http://tieba.baidu.com/f?kw=c%2B%2B" target="_blank" rel="noopener">C++吧</a></td><td></td></tr><tr><td><a href="http://tieba.baidu.com/f?ie=utf-8&amp;kw=C%E8%A8%80%E8%AF%AD" target="_blank" rel="noopener">C言语吧</a></td><td></td></tr></tbody></table><h2 id="credits"><a class="markdownIt-Anchor" href="#credits"></a> Credits</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><a href="http://tieba.baidu.com/p/1941867601" target="_blank" rel="noopener">IRC频道</a></td><td>…</td></tr><tr><td><a href="https://tieba.github.io/cpl/rox.html" target="_blank" rel="noopener">ROX版</a></td><td>RichSelian</td></tr><tr><td><a href="https://github.com/tieba/tieba.github.com" target="_blank" rel="noopener">本页源码</a></td><td>寒云似雾</td></tr><tr><td><a href="https://github.com/" target="_blank" rel="noopener">Hosted on GitHub Pages</a></td><td></td></tr></tbody></table><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      本吧规适用于百度C语言吧（以下称“本吧”），自公布即日起施行。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>随机图片API接口</title>
    <link href="https://no5972.moe/cms/archivers/30.html"/>
    <id>https://no5972.moe/cms/archivers/30.html</id>
    <published>2020-09-04T10:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E9%9A%8F%E6%9C%BA%E5%9B%BE%E7%89%87API%E6%8E%A5%E5%8F%A3-brightgreen" alt="随机图片API接口" /></a></p><p><a href="https://unsplash.it/1600/900?random" target="_blank" rel="noopener">https://unsplash.it/1600/900?random</a> （据说国内加载略慢，我试了一下还好都差不多）</p><p><a href="https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture" target="_blank" rel="noopener">https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture</a> （必应每日图片）</p><p><a href="https://uploadbeta.com/api/pictures/random" target="_blank" rel="noopener">https://uploadbeta.com/api/pictures/random</a> （必应图库，一些风景图人物图什么的，都是现代风格）</p><p><a href="https://source.unsplash.com/random" target="_blank" rel="noopener">https://source.unsplash.com/random</a> （风格同上，但这个的图尺寸不是大图）</p><p>下面是几个二次元的,都差不多ヽ(´o｀（大部分都在本地测试过，可以放心食用），但是以下这些唯一的问题就是，有些图片质量参差不齐。所以要想完全和自己口味的话还是自己做一个吧，有开源代码。</p><p><a href="https://img.xjh.me/random_img.php" target="_blank" rel="noopener">https://img.xjh.me/random_img.php</a> （850+） <a href="https://www.xjh.me/3069.html?replytocom=4888" target="_blank" rel="noopener">出处(・ω・)ノ</a></p><p><a href="http://www.dmoe.cc/random.php" target="_blank" rel="noopener">http://www.dmoe.cc/random.php</a> （1000+） <a href="http://www.dmoe.cc/" target="_blank" rel="noopener">出处(・ω・)ノ</a></p><p><a href="https://acg.yanwz.cn/api.php" target="_blank" rel="noopener">https://acg.yanwz.cn/api.php</a> （400+） <a href="https://acg.yanwz.cn/" target="_blank" rel="noopener">出处(・ω・)ノ</a></p><p><a href="https://img.paulzzh.tech/touhou/random" target="_blank" rel="noopener">https://img.paulzzh.tech/touhou/random</a> （东方的随机图，43000+）<a href="https://img.paulzzh.tech/" target="_blank" rel="noopener">出处(・ω・)ノ</a></p><p><a href="https://acg.toubiec.cn/random.php" target="_blank" rel="noopener">https://acg.toubiec.cn/random.php</a> （1000+） <a href="https://acg.toubiec.cn/" target="_blank" rel="noopener">出处(・ω・)ノ</a> 作者开源了，这篇博客里有介绍和源码，先蟹蟹大佬了。 <a href="https://www.toubiec.cn/164.html" target="_blank" rel="noopener">[项目]随机二次元图片API-已经开源</a></p><p>mark一下慢慢研究➡️ <a href="https://www.xhboke.com/14.html" target="_blank" rel="noopener">一个可在php中直接输出随机图片的API</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      下面是几个二次元的,都差不多ヽ(´o｀（大部分都在本地测试过，可以放心食用），但是以下这些唯一的问题就是，有些图片质量参差不齐。所以要想完全和自己口味的话还是自己做一个吧，有开源代码。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>使用jsDelivr不要瞎搞</title>
    <link href="https://no5972.moe/cms/archivers/29.html"/>
    <id>https://no5972.moe/cms/archivers/29.html</id>
    <published>2020-08-25T08:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>8月15日jsdelivr在官网更新了使用条款。虽然不清楚具体更新了哪些内容，但是注意到这几个处被很多人忽略了。瞎搞很容易被jsdelivr阻断连接。以下是需要注意的这几个处。</p><blockquote><h1 id="4-prohibited-use"><a class="markdownIt-Anchor" href="#4-prohibited-use"></a> 4. Prohibited Use</h1><p>The following behavior is prohibited:</p><ol><li>Hosting or accessing content that:</li></ol><ul><li>…</li></ul><ol start="2"><li>Abusing the service and its resources, or using jsDelivr as a general-purpose file or media hosting  service. This includes, for example:</li></ol><ul><li>running an image hosting website and using jsDelivr as a storage for all uploaded images,</li><li><strong>hosting videos, file backups, or other files in large quantities.</strong><br />We recognize that there are legitimate projects that consist of a large number of files, and these are not considered abuse. For example: icons packs, apps, or games with a large number of assets.</li></ul><ol start="3"><li>Trying to bypass our limits or restrictions in any way. We will be happy to remove limits or provide custom solutions for legitimate projects.</li></ol><h1 id="5-additional-restrictions-in-china"><a class="markdownIt-Anchor" href="#5-additional-restrictions-in-china"></a> 5. Additional Restrictions in China</h1><p>jsDelivr holds an ICP license issued by the Chinese government, which allows us to operate infrastructure directly in Mainland China. To keep this license and allow our Chinese users to benefit from the performance improvements it provides, <strong>any content served via our Chinese network must conform to Chinese policies.</strong> Content potentially violating Chinese policies may be blocked in China without warning.</p></blockquote><p>第4条写明禁止的使用行为其中就包括存放视频、文件备份或者其他大量的文件。所以不要试图在jsdelivr存放太大的媒体文件！随时会被阻断连接！</p><p>上面一条还有一条禁止的行为是说开设一个图床并且使用jsdelivr存储上传的图片。所以也不要当图床用！</p><p>此外，第5条也强调在国内使用jsdelivr一定要遵纪守法。违规内容会被不警告直接封停！</p><p>所以现在使用jsdelivr一定不能瞎搞，瞎搞很容易被jsdelivr查抄！</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      8月15日jsdelivr在官网更新了使用条款。虽然不清楚具体更新了哪些内容，但是注意到这几个处被很多人忽略了。瞎搞很容易被jsdelivr阻断连接。以下是需要注意的这几个处。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>java.math.BigDecimal保留指定位数的有效数字（不算前面的0）</title>
    <link href="https://no5972.moe/cms/archivers/28.html"/>
    <id>https://no5972.moe/cms/archivers/28.html</id>
    <published>2020-08-20T03:27:49.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>百度百科：从一个数的左边第一个非0数字起，到末位数字止，所有的数字都是这个数的有效数字。<br />就是一个数从左边第一个不为0的数字数起到末尾数字为止，所有的数字（包括0，科学计数法不计10的N次方），称为有效数字。简单的说，把一个数字前面的0都去掉，从第一个正整数到精确的数位止所有的都是有效数字了。<br />如：0.0109，前面两个0不是有效数字，后面的109均为有效数字（注意，中间的0也算）。</p></blockquote><p> <code>BigDecimal</code>类型的小数可以使用<code>MathContext</code>指定有效数字。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 写法来自StackOverflow的Kru </span></span><br><span class="line"><span class="comment"> * https://stackoverflow.com/questions/7572309/any-neat-way-to-limit-significant-figures-with-bigdecimal</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">System.out.println(<span class="keyword">new</span> BigDecimal(<span class="number">0.022223</span>).round(<span class="keyword">new</span> MathContext(<span class="number">3</span>, RoundingMode.HALF_UP)));</span><br><span class="line"><span class="comment">// （四舍五入）输出：0.0222</span></span><br><span class="line"></span><br><span class="line">System.out.println(<span class="keyword">new</span> BigDecimal(<span class="number">144.022223</span>).round(<span class="keyword">new</span> MathContext(<span class="number">5</span>, RoundingMode.HALF_UP)));</span><br><span class="line"><span class="comment">// （四舍五入）输出：144.02</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      BigDecimal类型的小数可以使用MathContext指定有效数字。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>我们为什么那么痛恨计算机等级与那些问题（二级党请进）</title>
    <link href="https://no5972.moe/cms/archivers/27.html"/>
    <id>https://no5972.moe/cms/archivers/27.html</id>
    <published>2020-08-20T03:27:49.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://tieba.baidu.com/p/1877978397" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/C%E8%AF%AD%E8%A8%80%E5%90%A7@%E6%B1%87%E8%93%9D%E9%B8%9F-%E6%88%91%E4%BB%AC%E4%B8%BA%E4%BB%80%E4%B9%88%E9%82%A3%E4%B9%88%E7%97%9B%E6%81%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%AD%89%E7%BA%A7%E4%B8%8E%E9%82%A3%E4%BA%9B%E9%97%AE%E9%A2%98%EF%BC%88%E4%BA%8C%E7%BA%A7%E5%85%9A%E8%AF%B7%E8%BF%9B%EF%BC%89-brightgreen" alt="C语言吧@汇蓝鸟-我们为什么那么痛恨计算机等级与那些问题（二级党请进）" /></a></p><p>如果要我评论天朝计算机等级的意义，四个字，劳民伤财。这句话甚至出自某个某即将当上教育局局长的人之口，别人问他他当上教育局长后第一件事是做什么，那兄台毫不客气：废除二四级，英语四级真有点用处这个我不做评论，要是废除计算机二级，我绝对举双手赞成，但是废了吗，没有，因为二级一次报名毛爷爷就要一张，那百来块也许有5块钱交给了出卷的老师，也许有2块钱用来付上机考试那没网烂电脑的上机电费，也许还拿了一块钱支付了那张笔试的考试纸，一块钱交给了改卷老师，剩下的百余元涉及了太太多多的利益关系（这句话摘抄自网上，有事联系原作者，本行仅作为检验本人屏幕光电及键盘机械性能测试），想废，没那么简单！</p><p>当然，这个绝对不是我痛恨计算机等级的原因，我不是粪青，我知道很多人不服，我考二级怎么了，有一个证也比没有一个证好啊，很多人对吧里封杀二级表示不理解，当他们打上<code>(i++)+(++i)</code>之类的题目并问个结果的时候，即使也许真与二级无关，但很多的时候就是被吧主给删掉了，并为此感到愤愤不平，因为很多人是刚刚学C语言的（我也是新手），谁没有菜的时候，就算是卡马克卡神也是从helloworld走过来的，提问自然理所当然。这点我完全同意，但是你们是否有想过，<strong>那些问题明明是出于自己的小粗心小缺漏造成的，只要自己静下心来多加思考，明明花上十几分钟就能自己解决的问题，却要到贴吧来请大神等回贴，然后最小化浏览器跑去打lol，斗地主。</strong></p><p>我敢说，其实你花在那问题上的时间不超过二十分钟，而你花在游戏上的时间却超过了三个小时。而那些代码就那么区区十几二十行。</p><p>我甚至不看问题都能猜到个八九分，比如少打了一个分号，大写变成了小写，<code>o</code>打成了<code>0</code>，和一些乱七八糟的语法错误，至于逻辑错误，那种程序的算法复杂度甚至不会超过解初中的二元一次方程，因为这个你在抱怨C语言难？</p><p>当然，二级党无可厚非，毕竟他们只是为了混上一张二级的护照，而那些二三四级计算机等级证我可以告诉你，这玩意对你找工作没有一点，哪怕是一点的帮助，它就像高中时候的会考，谁都知道那只是一个“joke”，而一个要付你工资的公司，会为了一个“joke”而雇佣你吗，是我绝对不会，就像我们团队的第一任首席招新的时候说的一句：别以为你拿到了等级证就有多大的优势，我宁愿你没过。按他的说法，那些屁证只要认真看个一两个星期的书，只要是个人就能过，假如有人为此炫耀，他说他甚至看都懒得看一眼。</p><p>所以，在讨论一个程序源代码的时候，请**摸摸你自己的胸口，问问自己是不是真的热爱C语言，真的热爱编程，假如是的话，重新坐在你的源代码面前，百度也好，谷歌也罢，最重要的是重新一个一个字母的省查自己的源代码，看看哪里与书上正确的代码不同，靠自己的力量解决一个问题，而不是去网上毫无目的的等大神。**假如不是，学编程的唯一目的就是为了考证，那么出门左拐进二级吧，看那些参考会比你在吧里等回复更有收效的多。</p><p>其实那句我宁愿你没过二级这句话更是意味深长，二级我也考过，书上除了教给你一些纯粹是装X的专业术语与概念，还教给你了一些极其糟糕的编程习惯，那种习惯除了不能参加代码混乱大赛之外，几乎涵盖了所有令人厌恶的书写规范，我甚至敢说要是我团队里有一个家伙敢写出像二级考试里那样的<code>(i++)+(++i)</code>之类的代码，我马上会抡起键盘敲死他。</p><p>在这里真的想为贴吧管理团队说句话，我觉得封杀这种二级与XX提问是有一定的理由的，谁都想把贴吧建设的更好，当初我也是抱着玩玩的姿态进c语言吧来看看的，但是最近我对这个已经不大感冒了，假如要我选的话，我会先去gamedev逛逛，然后可以去MSDN或CSDN论坛，只有突然看到百度上有回复的时候，才回到吧里看看，很多时候就是看完回复就走了，包括很多对我程序源代码的疑问我都没有回复，这不是说我想装X，而是包括贴吧里那些很多的疑问一样，错误都错的千篇一律，不管是谁看一个问题看了一千遍却还要解答都会厌烦，假如<strong>某天吧里全部都是那种伸手问题的话，那些懂得的估计都觉得无聊走光了，不懂的因为没人帮他解答也走光了，为什么那些知名的技术论坛能够经久不衰，是因为在哪里的不管是伸手还是奉献的都很有含金量。</strong></p><p>有一句话叫一屋不扫何以扫天下，二十几行代码都解决不了，以后成为老鸟面对几万行代码怎么办，二十分钟都坐不住，以后面对一个月都无法解决的bug怎么办，翻一翻书都觉得麻烦，以后还有没有勇气面对重新构架几千行代码的程序。</p><p>不是吧里那些大神冷血，哪一个大神不是“错”过来的，又有几个当初有老师教，当初连百度都没有，用电话线上网看到了外面的东西就兴奋了半天，假如说编程的那么些年我学到了什么，我觉得最重要学到的不是如何编码，是一种冷静分析的能力与持之以恒的耐力。<br />知道的越多，不知道的也就越多，这也就是为什么很多人学到后面越来越发现自己是一个弱笔，保持一个平稳的心态，自己琢磨了很久发现自己解决的代价太高再去虚心求教，少跳大神，偶尔犯2可以，毕竟人不犯2枉少年，但跳大神，发神论，作为娱乐可以，但你无法从中学到任何的东西。</p><p>最后，衷心祝愿那些热爱C语言热爱编程的朋友们学习愉快。</p><p><img src="https://s1.ax1x.com/2020/08/20/d8CMiF.png" alt="图片名称" /></p><center>～～面码拜</center><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      有一句话叫一屋不扫何以扫天下，二十几行代码都解决不了，以后成为老鸟面对几万行代码怎么办，二十分钟都坐不住，以后面对一个月都无法解决的bug怎么办，翻一翻书都觉得麻烦，以后还有没有勇气面对重新构架几千行代码的程序。
    
    </summary>
    
    
      <category term="C/C++" scheme="https://no5972.moe/cms/categories/C-C/"/>
    
    
  </entry>
  
  <entry>
    <title>JS保留两位小数只舍不进（简化写法）</title>
    <link href="https://no5972.moe/cms/archivers/26.html"/>
    <id>https://no5972.moe/cms/archivers/26.html</id>
    <published>2020-08-17T08:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> DECIMAL_PREFIX = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">var</span> x = <span class="number">144.4599999999</span>;</span><br><span class="line"><span class="keyword">var</span> y = <span class="built_in">parseFloat</span>(<span class="built_in">JSON</span>.stringify(x).substring(<span class="number">0</span>, <span class="built_in">JSON</span>.stringify(x).lastIndexOf(<span class="string">'.'</span>) + DECIMAL_PREFIX + <span class="number">2</span>)); <span class="comment">// 2 = 保留小数点后的位数</span></span><br><span class="line"><span class="built_in">console</span>.log(y);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出：144.45</span></span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      JS保留两位小数只舍不进（简化写法）
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
    
  </entry>
  
  <entry>
    <title>商业博客三大误区</title>
    <link href="https://no5972.moe/cms/archivers/25.html"/>
    <id>https://no5972.moe/cms/archivers/25.html</id>
    <published>2020-08-15T03:13:40.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://www.chinavalue.net/Biz/Article/2009-2-3/157174.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%BB%B7%E5%80%BC%E4%B8%AD%E5%9B%BD%E7%BD%91-%E6%A2%81%E6%99%94-brightgreen" alt="价值中国网 梁晔" /></a></p><p>博客不仅仅是一款优秀的社会软件，而且具有颠覆互联网的力量。许多嗅觉灵敏的企业也纷纷开设企业博客宣传自身的品牌以及产品，尤其是在各种博客门事件的发生之后，几乎没有企业敢轻视博客的力量，而同时，博客已经成为企业网站必备的基础应用之一。</p><p>中国博客经过多年发展，目前已渗透到经济、政治和社会生活的各个角落。利用企业博客进行信息发布、品牌推广和开展电子商务已成为商业发展的重要模式。随着互联网节点的急剧扩张，博客作为企业在互联网世界中的标识，具有与现实世界中商标和品牌同等重要的意义，是一种稀缺资源。</p><p>目前企业迫切需要的是，知道如何正确地创建一个商业博客，使之取得成功。以下是3个常见的错误，告诉公司与公司博客，可以做什么不可以做什么，以避免它们。</p><h1 id="第一误区没有目标"><a class="markdownIt-Anchor" href="#第一误区没有目标"></a> 第一误区：没有目标</h1><p>许多商业博客开始没有具体的目标。</p><p>博客软件通常是如此易于安装和设置，使得一些新的博客一诞生就处在被压倒的境地，因此很难使任何一个这样的商业博客脱颖而出。</p><p>企业要确定商业博客的宗旨，重要研究类似的博客和他们参与的行业社区。用户的网络与博客类似的目的和内容，以及和自己的博客相匹配的目标受众。</p><h1 id="第二误区无法控制"><a class="markdownIt-Anchor" href="#第二误区无法控制"></a> 第二误区：无法控制</h1><p>由于许多企业开始博客只是作为一个实验，他们往往没有进行慎重考虑。因此，通常使用第三方博客托管平台。</p><p>首先，你无法控制。如果您想更改博客平台，但通常是没有方法从旧到新的博客地址重新导向流量。</p><p>再者，在搜索引擎的排名也要重新开始，丧失原有的友好度。</p><p>独立域名的商业博客是企业控制发言权的首选。</p><h1 id="误区之三缺乏储备"><a class="markdownIt-Anchor" href="#误区之三缺乏储备"></a> 误区之三：缺乏储备</h1><p>商业博客的运作是一个考验。大多数人都很难写良好的电子邮件，更不用说400字的博客帖子。</p><p>博客写作的原始内容，如果没有编辑计划取得相应的采集内容，那么博客更新需要的每天至少一次或者一个星期数次成为不可能。</p><p>商业博客中还会出现更多的错误，公司与公司博客从来没有优化博客模板和标题等，张贴中也缺乏指标。</p><p>企业要尽量避免决策失误，在内需不足的情况下，商业博客可以聘请顾问博客，也可以把喜欢在TopRank或任何贡献者列为商业博客咨询名单。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      中国博客经过多年发展，目前已渗透到经济、政治和社会生活的各个角落。利用企业博客进行信息发布、品牌推广和开展电子商务已成为商业发展的重要模式。随着互联网节点的急剧扩张，博客作为企业在互联网世界中的标识，具有与现实世界中商标和品牌同等重要的意义，是一种稀缺资源。 目前企业迫切需要的是，知道如何正确地创建一个商业博客，使之取得成功。以下是3个常见的错误，告诉公司与公司博客，可以做什么不可以做什么，以避免它们。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>博客设置误区多</title>
    <link href="https://no5972.moe/cms/archivers/24.html"/>
    <id>https://no5972.moe/cms/archivers/24.html</id>
    <published>2020-08-11T03:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://navi.cnki.net/knavi/NPaperDetail?pcode=CCND&amp;bzpym=DINA" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E7%94%B5%E8%84%91%E6%8A%A5-%E5%B0%8F%E6%96%B0-brightgreen" alt="电脑报小新" /></a></p><p>博客很火，但是有的人气很旺，每天都有几千人来访问，而有的却门可罗雀。如果你很低调，不关心人气也就罢了。如果你一直很努力地在经营自己的博客，却不见兴旺，也许你的博客设置已经犯了很多不可饶恕的罪过。迷糊的你，赶紧擦亮眼睛，看看它们到底错在哪里？</p><h1 id="误区一默认播放音乐吓死人"><a class="markdownIt-Anchor" href="#误区一默认播放音乐吓死人"></a> 误区一：默认播放音乐吓死人</h1><p><strong>不良指数：</strong> ★★★★★</p><p>有很多人把博客设置为默认播放背景音乐，但是每个人的喜好不同，优美的音乐大家可以一起欣赏，但如果人家在夜深人静之时看你的博客，却突然蹦出一阵劲爆的摇滚背景乐，怕是要吓倒一批人吧。而且不少博客本身服务器不稳定，再加载背景音乐，网页很容易出现假死状态。</p><p><strong>解决方案：</strong> 取消博客的自己播放音乐功能，将自己喜欢的歌曲以列表的形式显示（图1），让访问者选择自己喜欢的歌曲来听。给访问者足够的选择空间，比强制放歌效果要好很多。</p><h1 id="误区二首页花哨挂饰过多-严重影响访问速度"><a class="markdownIt-Anchor" href="#误区二首页花哨挂饰过多-严重影响访问速度"></a> 误区二：首页花哨挂饰过多 严重影响访问速度</h1><p><strong>不良指数：</strong> ★★★★★</p><p>知道互联网中著名的六秒定律吗？那就是无论多好的网站，如果在六秒钟内无法打开首页内容，就会有一半的人不会再去访问该网站。要是在二十秒内还无法打开首页内容，绝大部分人不会再次访问。而加载过多闪闪亮亮的挂件（图2）就会严重影响到博客空间的打开速度。</p><p><strong>解决方案：</strong> 要学会合理地给首页添加挂饰，避免添加大尺寸的Flash和体积大的图片。这样在不失个性的前提下，也大大加快了博客访问速度。</p><h1 id="误区三需要注册才能下载和评论"><a class="markdownIt-Anchor" href="#误区三需要注册才能下载和评论"></a> 误区三：需要注册才能下载和评论</h1><p><strong>不良指数：</strong> ★★★</p><p>很多博客提供了一些实用软件下载，不过在下载的时候却需要注册，有的甚至连对博客评论也需要注册。这样博客的互动性优势就完全体现不出来了。</p><p><strong>解决方案：</strong> 在博客后台对下载和评论选项进行设置，关闭需注册用户才能下载和评论的选项，这样访问者就可以省去注册登录的烦恼，轻松共享博客的资源。</p><h1 id="误区四对非ie浏览器支持不佳"><a class="markdownIt-Anchor" href="#误区四对非ie浏览器支持不佳"></a> 误区四：对非IE浏览器支持不佳</h1><p><strong>不良指数：</strong> ★★★★</p><p>很多朋友喜欢用Flash动画装饰页面，可它们对非IE浏览器的支持不够好，经常会出现一个Flash把整个页面盖住或者页面变形的情况。这样，那些不用IE的网友就无法正常访问你的博客。</p><p><strong>解决方案：</strong> 在给博客添加特效的时候，除了要在IE中进行测试外，还需要在Firefox、TT、傲游等主流浏览器上进行效果测试。</p><h1 id="误区五无法留言"><a class="markdownIt-Anchor" href="#误区五无法留言"></a> 误区五：无法留言</h1><p><strong>不良指数：</strong> ★★★</p><p>大家经常会遇到，在博客上看到一篇好的文章，想留言发表一下自己看法的时候，突然发现因为种种原因，无法进行留言。那这个博客跟普通网站还有区别吗？</p><p><strong>解决方案：</strong> 想要让博客有更多人关注，最好将评论和留言功能打开（图3），让更多的人参与进来。</p><h1 id="误区六垃圾留言遍布"><a class="markdownIt-Anchor" href="#误区六垃圾留言遍布"></a> 误区六：垃圾留言遍布</h1><p><strong>不良指数：</strong> ★★★★★</p><p>在别人的博客留言，却发现在发表评论之前，上面已经有几十条垃圾留言（图4），你是留还是不留呢？留吧，这么多垃圾留言早把你的留言淹没了。不留吧，有些遗憾，毕竟自己还想说些什么。</p><p><strong>解决方案：</strong> 要想尊重别人，首先要尊重自己。就目前来说，要杜绝垃圾留言，能做到的就是常去删除垃圾留言。</p><p>看看你的博客是否存在上面的问题，如果有，赶快改之。相信改正了这些不足，会有更多的人喜欢上你的博客的。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      博客很火，但是有的人气很旺，每天都有几千人来访问，而有的却门可罗雀。如果你很低调，不关心人气也就罢了。如果你一直很努力地在经营自己的博客，却不见兴旺，也许你的博客设置已经犯了很多不可饶恕的罪过。迷糊的你，赶紧擦亮眼睛，看看它们到底错在哪里？
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>假宽带真相</title>
    <link href="https://no5972.moe/cms/archivers/23.html"/>
    <id>https://no5972.moe/cms/archivers/23.html</id>
    <published>2020-08-11T03:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="http://tv.cctv.com/2012/12/10/VIDE1355099956906900.shtml" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E4%B8%AD%E5%A4%AE%E7%94%B5%E8%A7%86%E5%8F%B0-%E6%AF%8F%E5%91%A8%E8%B4%A8%E9%87%8F%E6%8A%A5%E5%91%8A-brightgreen" alt="中央电视台每周质量报告" /></a></p><p>上网，现在已经成为人们生活中不可或缺的一部分，看新闻、看视频、网络购物、玩游戏、刷微博，网络服务也越来越五花八门、花样繁多了，随着网络服务的不断丰富人们对网络速度的要求也越来越高了，往往会花更多的钱购买更快的宽带网络服务。但是不少网民在花高价买了宽带服务之后，却发现网速并没有明显提升，甚至有人还觉得网速更慢了，这究竟是怎么回事呢？</p><p>北京市的苏小姐由于嫌4兆宽带网速慢，便在今年3月9号花2100元钱，购买了包月的6兆宽带。然而，钱花出去半年多了，至今网速都没有快起来。</p><p>苏小姐：基本都是很卡，一般比如说我要是看一个东西，我得先缓冲，缓冲5到10分钟，然后能看个5到10分钟，然后再缓冲，再看。</p><p>调查中，记者注意到，像苏小姐一样怀疑宽带网速有问题的用户不在少数。北京的郭先生甚至觉得家里的6兆宽带和之前安装的3兆宽带网速相差不大。</p><p>郭先生：网速这么慢，比如说看视频非常卡的时候，就会很影响心情，心情很糟糕。</p><p>记者调查发现，不少宽带用户怀疑自己包月购买的宽带有问题，然而，宽带网络服务商却往往另有说法。这家名为“英联宽带”的网络服务商强调，苏小姐等用户购买的宽带都是独享的，不会受别的宽带用户上网的影响，比如用户买的是6兆宽带，网速就能保证有6兆，宽带带宽越大，网速也就越快。</p><p>英联宽带公司业务员：这个速度肯定够，因为咱这帐号绑定宽带，独享的。</p><p>宽带服务商还建议怀疑网速有问题的用户，可以用网上公开的一些测速试软件检测去网速。用户测试后发现，尽管宽带用起来很慢，但测试显示的网速却并不低。宽带公司独享宽带的承诺，再加上用网上公开的网速测试软件测出来的网速并不低的印证结果，并不能彻底消除用户对网速慢的质疑。</p><p>根据全国消费者协会组织受理投诉情况的不完全统计，今年上半年，包括宽带服务在内的互联网服务等服务类投诉占投诉总量的比重继续呈上升趋势，由2011年同期的32.9%上升到34.5%。今年8月份，仅北京市工商局、北京市消费者协会的12315和96315两条热线，共受理涉及宽带网络接入类的投诉156件，比7月份增加了一半多。而且，投诉的主要问题就是宽带网速慢，经常断网，实际网速和合同约定不符。</p><p><img src="http://p2.img.cctvpic.com/program/zhiliangbaogao/20121008/images/1349650078029_1349650078029_r.jpg" alt="" /></p><p>为了了解用户所用宽带的真实技术参数信息，清华大学网络中心的专家先后对北京、四川、天津、河北、深圳等地的一些用户使用的宽带质量进行测试。</p><p>专家告诉记者，比如一首普通的MP3歌曲，用6兆带宽的宽带来下载，通常只需要6秒左右就能下载完毕，宽带越大，下载速度也就越快。</p><p>那么，苏小姐家所购买的6兆宽带，事实上到底是多大的带宽呢？</p><p>对于一般住宅小区宽带来说，白天时段是非上网高峰期，6月30日中午，专业技术人员对苏小姐家的宽带进行了第一次专业测试，结果发现，实际带宽和所购买的带宽相差甚远。</p><p>清华大学网络中心工程师许伟林：我们现在一共做了三个测速试验，我们可以得出一个结论，就是这个服务商它提供的带宽呢，实际上就是3兆左右。</p><p>专业技术人员在晚上八九点钟上网高峰期，对用户使用的宽带进一步测试后发现，实际网速更加慢。</p><p>清华大学网络中心工程师许伟林：首先我们是用iperf这个工具测试上传带宽，结果只有0.5兆，丢包率达到了12%；然后，我们用FTP协议测试下载带宽。最终结果显示，下载带宽只有0.29兆。也就是说，上网高峰期用户实际拥有的带宽还不到所购买宽带带宽的百分之五。</p><p><img src="http://p2.img.cctvpic.com/program/zhiliangbaogao/20121008/images/1349650125436_1349650125436_r.jpg" alt="" /></p><p>清华大学网络中心副教授诸葛建伟：他的网速之所以很慢，就是因为宽带的服务商并没有给他提供足量的网络带宽的资源。</p><p>技术人员随后对宽带测试结果进一步分析发现，用户在上网高峰期发送的数据文件在这个宽带传输时丢包率高达12%，反映出用户的宽带网速极其不稳定。</p><p>清华大学网络中心工程师许伟林：所谓丢包率，指的就是丢失的数据包数量占发送数据包数量的一个百分比。通俗地说，发送100个数据包，如果丢了12个，那么丢包率就是12%，这是一个非常高的数字，这就说明，这个宽带，网速不仅非常的慢而且还不太稳定。</p><p>此前，北京这家“英联宽带”网络服务商明确地告诉记者，他们向用户承诺的是独享带宽，也就是说，用户买的6兆的宽带，实际享用到的也就应该是6兆的带宽。</p><p>清华大学网络中心工程师许伟林：从6月到8月，我们不定期地在那个上网的高峰期和非上网高峰期多个时段进行了测试，发现带宽最高的时候只有3兆，最低的时候才零点几兆。这就充分说明一个问题，用户使用的这个宽带，它不是独享带宽，它肯定是一个共享带宽。共享带宽的一个显著特点就是，随着上网用户增多的时候，它的带宽是不稳定的，用户越多，它的网速，每个人分摊到的网速就越慢。</p><p>记者跟随清华大学的网络技术专家先后在北京、四川、天津、深圳、河北、山东等地，对英联宽带、中宽网、同创宽带等网络服务商提供给用户的宽带进行测试调查后发现，像这种宽带带宽缺斤短两、网速严重偏慢的现象绝非个别。</p><p>专业的中国互联网调查组织机构和数据平台DCCI互联网数据中心今年年初公布的一项《中国宽带用户调查》数据也表明，我国绝大部分互联网用户所使用的宽带的实际下载速率低于宽带运营商提供的名义宽带速率。用户所用宽带的实际平均上网速度，超过一半以上都达不到标定网速。数据显示，多数用户办理的固网宽带带宽为2M或4M。4M宽带，理论上应有512KB/s的网速；2M宽带，理论网速是256KB/s，而实际上，2M带宽下用户平均上网速度仅为142.2KB/s，4M带宽下平均网速仅仅为232.7KB/s，与名义速度相差很大。</p><p>通过专家的测试，发现宽带运营商提供给用户的带宽比所标称的带宽明显要小，但是，在调查中，记者注意到一个奇怪的现象，对于许多用户来说，由于无法证实自己对网速的怀疑，而只能用宽带运营商推荐的，或者网上公开的一些测试软件进行测试，但是测试结果往往却显示用户的宽带网速完全能够达到合同约定的带宽，这又是怎么回事呢？</p><p>记者调查发现，宽带用户按照宽带运营商的说法，用一些测试软件测试宽带网速，有些测试结果竟然比用户所购买的宽带所标称的网速还要高出很多。成都市龙泉驿区的李先生购买的原本是3兆的宽带，用网上免费使用的360安全卫士自带的网速测试软件进行测试后，发现所显示的宽带网速竟然达到10兆。</p><p>宽带用户李先生：一开始，我是用360的测速来(测速)，结果却显示，我的宽带速度接近10兆，它的速度，就是夸张点形容就是像火箭一样快，但是呢，我办的网上这个宽带只有3兆。</p><p><img src="http://p2.img.cctvpic.com/program/zhiliangbaogao/20121008/images/1349650033675_1349650033675_r.jpg" alt="" /></p><p>记者拨通了360安全卫士的网速测试软件的客户服务电话。</p><p>360安全卫士客户服务人员</p><p>记者：360吗？</p><p>对</p><p>记者：您好，我问一下，咱们这边用你的安全卫士带的测速软件会不会有问题？</p><p>不会有问题</p><p>记者：会不会不准？</p><p>不会不准。</p><p>记者：会不会有偏差？</p><p>不会有偏差。</p><p>记者：这么绝对啊？</p><p>对。</p><p>那么，真相到底如何，用360自带的测速工具等测速软件测试出的宽带速度又究竟是从何而来的呢？清华大学的网络研究专家对此进行仔细研究后发现，这类测速软件，本身就有明显的设计缺陷。</p><p>清华大学网络中心副教授诸葛建伟：它的P2SP一个测速方法存在着一个设计上的缺陷。这种P2SP测速方法，它会去选择一些同样安装了这款软件的其他的连接节点来进行测速，只要其中有一个节点，它是在这个用户同一个小区宽带的子网里面，它的这个链路质量就非常好，网速就非常快，所以它测得的网速就可能超过了运营商所提供的那样一个带宽的水平。</p><p>专家进一步研究后还发现，网上360安全卫士自带的测速工具、一些在线测速器等免费网速测试软件几乎都不可靠，测试结果可以轻易地被多种方法干扰。原本不到10兆的宽带，一经测试甚至会变成高达几百兆的宽带。</p><p>清华大学网络中心副教授诸葛建伟：我们发现很多方法，会干扰到测速软件的测试结果，比如DNAT，DNS污染，这些作弊手段，可以随心所欲地让测速软件测得任意的网速。那现在这款360安全卫士的软件，它提供的排行榜功能，就已经成为了一个骗人的道具。</p><p>用户花高价买到的宽带网速达不到宽带运营商所承诺的标准，而一些网速测试软件测试的结果又往往明显偏高。那么，这些测试软件掩饰真实网速的背后到底隐藏着什么秘密？</p><p>在北京天通苑这个小区的一栋公寓楼外，宽带服务商的广告特别醒目，所提供的宽带没有低于4兆的带宽。而且，带宽数值越大，用户需要缴纳的包月费用就越多。4兆的宽带，包1年送1年用户需要缴纳1960元钱；而6兆的宽带包1年送1年，用户则需要缴纳2100元，相当于1年包月的费用是1050元。</p><p>宽带公司业务员：天天能装个二三十户。我刚才跟您说，是我们之前几个月，是它突破一万户。</p><p>1万用户数，如果按照平均包月购买的都是6兆宽带来计算，这家名为英联宽带的运营商仅在这个小区的年业务收入为1050万元。专家告诉记者，如果该宽带公司履行承诺让用户使用上独享6兆宽带的话，该公司将入不敷出。</p><p>清华大学网络中心副教授诸葛建伟：即便这些宽带公司能够以一个极低的、3折的一个优惠，从一级运营商那里拿到这个带宽，那它们要保证1万户独享带宽的用户享受到6兆带宽的接入，那它们仅上交给一级运营商的一个成本就达到了2700多万元，那这些宽带公司早就破产了。</p><p>一位业内人士向记者透露，目前，我国宽带运营体系除联通公司和电信公司等一级宽带运营商外，还有许多大大小小的二级、三级宽带运营商，以及小区宽带运营商，他们从上一级宽带运营商手里集中购买一定数量的宽带，然后再转售给宽带用户牟利。由于宽带用户几乎很少会同时在线上网，对于宽带运营商、宽带公司来说，用最低的成本获取宽带资源，然后，再尽可能地最大化地利用这些资源，也就是卖给许许多多的宽带用户，就可以极大地摊薄宽带公司的运营成本，所以，大量的宽带用户，拥挤在有限的宽带资源上，必然会出现上网高峰期，网络拥挤，网速急速下降的情况。</p><p>宽带业内人员：比如说，包了100兆，或者包了10兆，包完之后，他自己再往外分。比如说10兆的话，可以分给10个人；每人1兆的话，它现在就分给100个人，然后也是每人1兆，这样共享。如果说这100个人，只有10个人在上网的时候，它就能保证它那个质量，但如果这100个人都在上网的话，那这个速度就达不到了。</p><p>这家宽带公司的业务员最终向记者承认：他们向苏小姐等宽带用户所提供的宽带网速事实上达不到所承诺的标准。而且他还向记者透露，宽带的带宽缺斤短两是行业内的一个普遍现象。</p><p>宽带公司业务员：都是一到上网高峰期，他的网速肯定不会达到理想的、预期这种效果。</p><p>记者：6兆的在高峰期、晚上，它不会低于多少兆？</p><p>4兆吧。</p><p>记者：那包4兆的呢，高峰期不会低于多少兆？</p><p>不会低于2.5兆。</p><p>记者：那怎么这个少了一半呢？怎么能这样干呢？</p><p>所有宽带都是这样。</p><p>至此，记者调查发现，我国一些宽带网络服务提供商在用最低的成本获取宽带资源后，便往往罔顾消费者利益，背弃当初向用户推销宽带时所许下的独享宽带、保证网速的承诺，把有限的宽带资源分卖给尽量多的用户，来摊薄运营成本，实现利益最大化；与此同时，一些网上公开供人免费使用的网速测试软件，由于有设计缺陷，会显示虚高的网速测试结果，无形中又帮了宽带网络服务商的忙，让用户不容易对宽带网速产生怀疑，如此一来，吃亏的总是宽带用户。</p><p>清华大学网络中心副教授诸葛建伟：经过我们的调查测算，我们发现全国固网宽带用户达到的实际带宽仅仅是标称带宽的55%。换句话说，这就意味着这些固网宽带用户在带宽上花的钱将近一半都是冤枉钱。</p><p>经过测试发现，不少用户花大价钱购买的高速宽带，实际上达不到网络服务商标定的带宽，因此有些用户感到网速过慢，甚至感觉到上当受骗。我们的生活已经在向网络化迈进，网络服务的质量关系和我们的生活关系已经越来越密切了。我国现在非常重视网络建设的投入和发展，甚至已经把宽带发展摆到了国家战略的层面。然而一些网络运营商和服务商却在提供网络服务的时候缺斤短两，愚弄用户。希望有关部门能切实加强对这种不合理现象的监管和打击力度，切实提高网速，维护消费者的正当权益。感谢收看《每周质量报告》，下周同一时间再见。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      上网，现在已经成为人们生活中不可或缺的一部分，看新闻、看视频、网络购物、玩游戏、刷微博，网络服务也越来越五花八门、花样繁多了，随着网络服务的不断丰富人们对网络速度的要求也越来越高了，往往会花更多的钱购买更快的宽带网络服务。但是不少网民在花高价买了宽带服务之后，却发现网速并没有明显提升，甚至有人还觉得网速更慢了，这究竟是怎么回事呢？
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>（正式版已修复）Hexo NexT主题 Valine评论 多语言失效</title>
    <link href="https://no5972.moe/cms/archivers/22.html"/>
    <id>https://no5972.moe/cms/archivers/22.html</id>
    <published>2020-08-06T08:15:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><div class="note info"><p><strong>8.0.0正式版已经修复了这个小bug，使用8.0.0正式版或者更新版本就可以避免出现此问题了。</strong></p></div><p>这个博客必然是要面向全世界开放的（所以为什么初次访问本博客顶部会出现Cookie声明），所以界面是英文的（博文暂不考虑翻译）。之前来必力评论发现发送评论之后页面并不能显示，后台显示了但是前台并没有显示。考虑到现在大部分新开的个人博客网站都采用了Valine框架的评论，这里也打算换用Valine。但是在NexT主题里面配置了<code>language</code>属性之后评论界面语言并没有发生变化，这个也是应当按英文来显示的。</p><p>原始的NexT配置文件里面的Valine配置是这样的。（这里找了8.0.0-rc.5的版本）</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Valine</span></span><br><span class="line"><span class="comment"># For more information: https://valine.js.org, https://github.com/xCss/Valine</span></span><br><span class="line"><span class="attr">valine:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">appId:</span> <span class="comment"># Your leancloud application appid</span></span><br><span class="line">  <span class="attr">appKey:</span> <span class="comment"># Your leancloud application appkey</span></span><br><span class="line">  <span class="attr">placeholder:</span> <span class="string">Just</span> <span class="string">go</span> <span class="string">go</span> <span class="comment"># Comment box placeholder</span></span><br><span class="line">  <span class="attr">avatar:</span> <span class="string">mm</span> <span class="comment"># Gravatar style</span></span><br><span class="line">  <span class="attr">meta:</span> <span class="string">[]</span> <span class="comment"># Custom comment header: [nick, mail, link]</span></span><br><span class="line">  <span class="attr">pageSize:</span> <span class="number">10</span> <span class="comment"># Pagination size</span></span><br><span class="line">  <span class="attr">language:</span> <span class="comment"># Language, available values: en, zh-cn</span></span><br><span class="line">  <span class="attr">visitor:</span> <span class="literal">false</span> <span class="comment"># Article reading statistic</span></span><br><span class="line">  <span class="attr">comment_count:</span> <span class="literal">true</span> <span class="comment"># If false, comment count will only be displayed in post page, not in home page</span></span><br><span class="line">  <span class="attr">recordIP:</span> <span class="literal">false</span> <span class="comment"># Whether to record the commenter IP</span></span><br><span class="line">  <span class="attr">serverURLs:</span> <span class="comment"># When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)</span></span><br><span class="line">  <span class="attr">enableQQ:</span> <span class="literal">false</span> <span class="comment"># Whether to enable the Nickname box to automatically get QQ Nickname and QQ Avatar</span></span><br><span class="line">  <span class="attr">requiredFields:</span> <span class="string">[]</span> <span class="comment"># Set required fields: [nick] | [nick, mail]</span></span><br><span class="line">  <span class="comment">#post_meta_order: 0</span></span><br></pre></td></tr></table></figure><p>发现了这个问题之后，查看服务器生成页面的源代码，注意到有个地方刚好键值对的名称和上面的yaml一一对应。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">NexT.utils.loadComments(<span class="string">'#valine-comments'</span>, () =&gt; &#123;</span><br><span class="line">  NexT.utils.getScript(<span class="string">'//cdn.jsdelivr.net/npm/valine@1.4.14/dist/Valine.min.js'</span>, () =&gt; &#123;</span><br><span class="line">    <span class="keyword">new</span> Valine(<span class="built_in">Object</span>.assign(&#123;</span><br><span class="line">      el  : <span class="string">'#valine-comments'</span>,</span><br><span class="line">      path: location.pathname,</span><br><span class="line">    &#125;, &#123;<span class="string">"enable"</span>:<span class="literal">true</span>,<span class="string">"appId"</span>:<span class="string">"..."</span>,<span class="string">"appKey"</span>:<span class="string">"..."</span>,<span class="string">"placeholder"</span>:<span class="string">"Just go go"</span>,<span class="string">"avatar"</span>:<span class="string">"mm"</span>,<span class="string">"meta"</span>:[<span class="string">"nick"</span>,<span class="string">"mail"</span>,<span class="string">"link"</span>],<span class="string">"pageSize"</span>:<span class="number">10</span>,<span class="string">"language"</span>:<span class="string">"en"</span>,<span class="string">"visitor"</span>:<span class="literal">false</span>,<span class="string">"comment_count"</span>:<span class="literal">true</span>,<span class="string">"recordIP"</span>:<span class="literal">false</span>,<span class="string">"serverURLs"</span>:<span class="literal">null</span>&#125;</span><br><span class="line">    ));</span><br><span class="line">  &#125;, <span class="built_in">window</span>.Valine);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>猜测是<code>language</code>属性读取有问题。查Valine的官方文档，打开“多语言支持”，发现配置语言的属性名称已经变成了<code>lang</code>而不是<code>language</code>。</p><p>于是将配置文件的这个<code>language</code>属性名称改成<code>lang</code>。重启服务器，刷新页面，此时可以看到评论界面已经成功变为英文。</p><p>目前鄙人已将此问题在NexT官方Github提交Issue。希望那边可以订正这个小BUG。</p><p><a href="https://github.com/next-theme/hexo-theme-next/issues/83" target="_blank" rel="noopener">一个小问题：Valine 1.4.14 多语言属性名字在这边主题配置里面不对（language应该是lang）</a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这个博客必然是要面向全世界开放的（所以为什么初次访问本博客顶部会出现Cookie声明），所以界面是英文的（博文暂不考虑翻译）。之前来必力评论发现发送评论之后页面并不能显示，后台显示了但是前台并没有显示。考虑到现在大部分新开的个人博客网站都采用了Valine框架的评论，这里也打算换用Valine。但是在NexT主题里面配置了```language```属性之后评论界面语言并没有发生变化，这个也是应当按英文来显示的。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>网站构建 可访问性</title>
    <link href="https://no5972.moe/cms/archivers/19.html"/>
    <id>https://no5972.moe/cms/archivers/19.html</id>
    <published>2020-08-03T01:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="https://developer.mozilla.org/zh-CN/docs/Learn/Accessibility/What_is_accessibility" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MDN-What%20is%20accessibility%3F-brightgreen" alt="What is accessibility?" /></a></p><p>本文作为本模块的开篇阐述了究竟什么是“可访问性” — 主要包括哪些用户群体是我们所需要和为什么需要考虑的，不同用户使用哪些工具与网页交互，以及我们在网站开发流程中如何构建可访问性。</p><h1 id="什么是可访问性"><a class="markdownIt-Anchor" href="#什么是可访问性"></a> 什么是可访问性?</h1><p>可访问性是一种让尽可能多的用户可以使用你的网站的做法。传统上我们认为这只与残疾人士有关，但提升网站的可访问性也可以让其他用户群体受益。比如使用移动设备的人群，那些使用低速网络连接的人群。</p><p>你也可以把可访问性看成是同等地对待每一个人，给他们平等的机会，无论他们的能力或所处的环境如何。就像一个大楼设计的坐轮椅的人进不去是错误的（现代公共建筑通常设有轮椅坡道或电梯）；我们的网站设计的视觉有障碍的人士浏览不了同样不正确。我们都是不同的，但我们都是人，因此享有同等的人权。</p><p>使网站具备可访问性才是正确的做法。它也是一些国家法律的一部分，它打开了一些重要的市场，否则那些市场的用户无法使用你的服务或者购买你的产品。</p><p>建立可访问的网站能让每个人都受益：</p><ul><li><p>使用原语HTML(译注：仅使用非样式标记而样式用CSS定义的HTML称为原语HTML。那些描述内容呈现效果的标记如<code>&lt;b&gt;</code>标记是样式标记，这些样式标记在HTML5中已经废弃），不仅提升了可访问性，也增强了搜索引擎优化，使你的网站更容易被找到。</p></li><li><p>关心可访问性表露出良好的道德品质，它提升了你的公众形象。</p></li><li><p>其他一些改善可访问性的做法也会让你的网站更容易被其他群体使用，比如手机用户，低速网络环境的用户等等。事实上，每个人都可以从这此改善中受益。</p></li><li><p>我们是否也曾提到过到这也是某些地方的法律规定？</p></li></ul><hr><h1 id="我们应关注的残疾都有哪些种类"><a class="markdownIt-Anchor" href="#我们应关注的残疾都有哪些种类"></a> 我们应关注的残疾都有哪些种类?</h1><p>残疾人士和正常人一样是多样化的，他们身患的残疾也多种多样。此处课题的关键是抛开思考你自已的电脑和你自己使用网页的方式，而是要开始学习别人如何使用网页——你不是你的用户。接下来会讲解需要考虑的主要残疾类型，以及他们访问网页内容时用到的一些特殊工具(被称为辅助技术或ATs)。</p><blockquote><p>**注意：**世界卫生组织的“残疾和健康”状况说明书指出：“超过10亿人，约占世界总人口的15%，患有某种形式的残疾”，而且“有1.1亿至1.9亿之间的成年人在身体功能上存在重大困难。”</p></blockquote><h2 id="有视觉障碍的人"><a class="markdownIt-Anchor" href="#有视觉障碍的人"></a> 有视觉障碍的人</h2><p>有视觉障碍的人包括盲人、视力水平低下者、色盲。许多视觉障碍人士使用屏幕放大镜，要么是物理放大镜或是软件缩放功能。现今大多数浏览器和操作系统都具备缩放功能。某些用户使用屏幕阅读器，这是一种可以大声朗读数字文本的软件。一些屏幕阅读器的示例如下：</p><ul><li><p>有些是付费产品， 比如 JAWS (Windows) 和 Window Eyes (Windows).</p></li><li><p>有些是免费产品， 比如 NVDA (Windows)， ChromeVox (Chrome, Windows 和 Mac OS X)， 和 Orca (Linux).</p></li><li><p>有些内置在操作系统中，比如 VoiceOver (Mac OS X and iOS)， Narrator (Microsoft Windows)， ChromeVox (on Chrome OS)，和 TalkBack (Android).</p></li></ul><p>让自己熟悉屏幕阅读器是个好主意；您还应该设置一个屏幕阅读器并充分的使用它（盘它），以了解它是如何工作的。请参阅我们的跨浏览器屏幕阅读器测试向导，以了解更多使用它们的细节。</p><p>据统计，世界卫生组织估计“全球有2.85亿人视力受损：3900万人失明，2.46亿人视力低下。”（参见视力障碍和失明）。这是一个庞大而重要的用户群却仅因为你的网站没有合理的设计代码而流失——几乎相当于美国的人口总数。</p><h2 id="有听觉障碍的人"><a class="markdownIt-Anchor" href="#有听觉障碍的人"></a> 有听觉障碍的人</h2><p>也被称为有听力障碍的人或聋子，这群人要么听力水平较低或者完全听不到。这些人使用 ATs（请参考 听力、语音、说话或语言障碍患者的辅助设备）， 但是并没有专用于计算机/网页的ATs。</p><p>但是，现在有专门的技术用于将文本转换成音频内容，范围从转换简单的文本文字到转换与视频一起显示的字幕。 稍后，有文章将讨论这些技术。</p><p>听力受损的人也代表着一个重要的用户群体——“全世界有4.66亿人患有听力障碍”，世界卫生组织的耳聋和听力受损状况报告如此宣称。</p><h2 id="行动障碍的人"><a class="markdownIt-Anchor" href="#行动障碍的人"></a> 行动障碍的人</h2><p>这些人在行动方面存在着残疾，可能是因为纯粹的身体问题（例如肢体丧失或瘫痪），或导致肢体无力或失去控制的神经系统/遗传疾病。 有些人可能难以做出使用鼠标所需的精准手部动作，而另一些人则可能受到的影响更为严重，可能会严重瘫痪到需要使用头部指针与计算机进行交互的地步。</p><p>这种残疾也可能是由于年老体衰导致，而不是任何特定的创伤或状况造成，也可能是由于硬件限制所致——有些用户可能没有鼠标。</p><p>这些残疾通常影响Web开发工作的方式是要求通过键盘就可以访问控件——我们将在本模块的后续文章中讨论键盘可访问性，但最好是仅通过使用键盘来尝试访问一些网站，看看你能够做些什么。例如，您可以使用Tab键在Web表单的不同控件之间移动吗？ 您可以在MDN的“跨浏览器测试使用本机键盘的可访问性”章节中找到有关键盘控制的更多详细信息。</p><p>据统计，有相当多的人患有行动障碍症。美国疾病控制与防御中心的“残疾与机能（18岁及以上的非住院成年人）”报道称美国有15.1%的成年人都患有身体功能疾病。</p><h2 id="有认知障碍的人"><a class="markdownIt-Anchor" href="#有认知障碍的人"></a> 有认知障碍的人</h2><p>认知障碍涵盖了一类范围广泛的残疾，从能力最受限的智障人士到随着年龄增长而导致思考和记忆困难的所有人。 该范围包括了患有精神疾病的人，例如抑郁症和精神分裂症患者。 还包括有学习障碍的人，例如阅读障碍患者和有注意力缺陷的多动症患者。 重要的是，尽管认知障碍的临床定义存在很多差异，但与之相关的人们会遇到同一类功能问题。 这类问题包括很难理解页面内容，难以记住如何完成任务，以及因不一致的网页布局而产生困惑。</p><p>对认识障碍人士来说一个好的可访问性机制包括：</p><ul><li><p>使用多种方式传达内容，比如从文本到语音或是视频；</p></li><li><p>更易理解的内容，例如使用更通俗的语言书写的文本；</p></li><li><p>将注意力集中在重要内容上；</p></li><li><p>尽量减少干扰，例如不必要的内容或广告；</p></li><li><p>一致的网页布局和导航；</p></li><li><p>相似的元素，比如未访问的下划线链接使用蓝色而访问过的使用紫色；</p></li><li><p>将过程划分为更有逻辑的，必要的步骤并附上进度指示器；</p></li><li><p>在不影响安全性的情况下尽可能让网站认证更简单；并且</p></li><li><p>使表单容易完成，例如带有清晰的错误消息和简单的错误恢复。</p></li></ul><h2 id="注意"><a class="markdownIt-Anchor" href="#注意"></a> 注意</h2><ul><li><p>具有认知可访问性的设计将导致良好的设计实践。 他们将使所有人受益。</p></li><li><p>许多有认知障碍的人也可能患有身体残疾。网站必须遵循W3C的“网页内容可访问性指南”包括认知可访问性指南。</p></li><li><p>W3C的“认知和学习残疾无障碍专案组”为认知障碍人士制作了web可访问性指南。</p></li><li><p>WebAIM有一个认知网页提供了相关的信息和资源。</p></li><li><p>美国疾病控制中心估计，截至2018年，美国四分之一的公民有残疾，其中认知障碍是年轻人最常见的疾病。</p></li><li><p>在美国，“智力障碍”是“智力低下”的新术语。 在英国，“智力障碍”通常是指“学习障碍”或“学习困难”。</p></li></ul><hr><h1 id="在你的项目中实现可访问性"><a class="markdownIt-Anchor" href="#在你的项目中实现可访问性"></a> 在你的项目中实现可访问性</h1><p>一个流行的关于可访问性的传言认为：可访问性是实施在项目上的昂贵“附加功能”。这个传言确实可能成立，只要遇到以下任一情况：</p><ul><li><p>你正在试图为一个现有存在重大可访问性问题的网站“改造”可访问性。</p></li><li><p>您只是在项目后期才开始考虑可访问性和此时才暴露的相关问题。</p></li></ul><p>然而如果你能在项目的开始阶段就考虑到可访问性的话，使大多数内容无障碍化的代价就会相当微小。</p><p>在规划项目时，将可访问性测试纳入测试体系，就像对其他任何重要目标受众群体（例如台式机或移动浏览器的目标用户）进行测试一样。 尽早和经常进行测试，理想情况下运行自动化测试找出程序化方式可检测到的缺失功能（例如，缺少图像替代文本或不良链接文字——请参阅元素关系与上下文），并对禁用的用户群进行一些测试，以查看更复杂的网站功能否为他们工作。 例如：</p><ul><li><p>我的日期选择器小部件是否可供使用屏幕阅读器的人使用？</p></li><li><p>如果内容动态更新，视力受损的人知道吗？</p></li><li><p>我的UI按钮是否可以使用键盘和触碰界面进行访问？</p></li></ul><p>您可以并且应该在内容中记下潜在的问题区域，这些地方需要进行一些工作才能使其变得可访问，确保对其进行了彻底的测试并考虑解决方案/替代方法。 文本内容（如您将在下一篇文章中看到的）相对容易，但是多媒体内容和时髦的3D图形又如何呢？ 您应该查看项目预算，并考虑可以使用哪些解决方案来实现这类内容的可访问性。 转录所有多媒体内容是一种选择，当然这可能很昂贵。</p><p>还有，现实一点。“100%的可访问性”是一个无法实现的理想——你总是会遇到某种边缘情况，导致某个用户发现某些内容难以使用——但你应该尽你所能去做。如果您计划包含一个使用WebGL呈现的时髦三维饼图，您可能希望也包含一个数据表，作为数据的可访问的替代表示。或者，您可能只需要包含表而去除3D饼图——这样每个人都可以访问该表，编写起来也更快，还能减少运行时的CPU耗费，维护也更容易。</p><p>另一方面，如果您正在一个画廊网站上展示有趣的3D艺术，期望每件艺术品都能被视觉障碍人士完美的访问是不合理的，毕竟它是一种完全的视觉媒体。</p><p>为了表明您关心并考虑了可访问性，请在您的网站上发布可访问性声明，其中详细说明您对可访问性的政策以及为使该站点可访问而采取的步骤。 如果有人确实抱怨您的网站存在可访问性问题，请与他们展开对话，保持同情心，并采取合理的步骤尝试解决问题。</p><blockquote><p>**注意：**我们的“处理常见的可访问性问题”一文涵盖了应更详细地测试的可访问性细节。</p></blockquote><p>总结：</p><ul><li><p>从项目一开始就考虑可访问性，并尽早进行测试。就像任何其他bug一样，越晚发现可访问性问题，修复它的代价会更高。</p></li><li><p>请记住，许多可访问性的最佳实践对每个人都有好处，而不仅仅局限于残疾人士。例如，原语标记不仅对屏幕阅读器有好处，而且使加载速度和性能也更快，因此对每个人来说都更有益，尤其是那些使用移动设备和/或慢速网络连接环境的人。</p></li><li><p>在您的站点上发布可访问性声明，并与遇到问题的人接触。</p></li></ul><hr><h1 id="无障碍指南和法律"><a class="markdownIt-Anchor" href="#无障碍指南和法律"></a> 无障碍指南和法律</h1><p>有许多可用于基于可访问性测试的检查列表和指南集，乍一看，这些准则可能会让人望而却步。我们的建议是让自己熟悉你需要注意的基本领域，以及理解与你最相关的指导方针的高层结构。</p><ul><li><p>首先，W3C发布了一个庞大而详细的文档，其中包含了非常精确的、与技术无关的可访问性一致性标准。这些被称为Web内容可访问性指南(WCAG)，它们绝不是短读的。这些标准分为四大类，它们指定如何使实现具有可感知性、可操作性、可理解性和鲁棒性。最好的地方得到一个简单的介绍和开始学习是一目了然。没有必要专门学习WCAG——注意主要关注的领域，并使用各种技术和工具来突出任何不符合WCAG标准的区域（更多信息见下文）。</p></li><li><p>贵国还可能有具体立法，规定为其人口提供服务的网站必须能够访问-例如，美国“康复法”第508条、德国关于无障碍信息技术的联邦法令、英国的“平等法”、意大利的“无障碍法”、澳大利亚的“残疾歧视法”等。</p></li></ul><p>因此，虽然WCAG是一套指导方针，但您的国家可能会有关于网络可访问性的法律，或者至少是对公众提供的服务的无障碍（包括网站、电视、物理空间等）。找出你的法律是个好主意。如果您不努力检查您的内容是否可访问，您可能会陷入法律的麻烦，如果有二重性的人抱怨它。</p><p>这听起来很严肃，但正如上文所述，您只需要将可访问性视为Web开发实践的主要优先事项。如果有疑问，请咨询合格的律师。我们不会提供比这更多的建议，因为我们不是律师。</p><hr><h1 id="可访问性api"><a class="markdownIt-Anchor" href="#可访问性api"></a> 可访问性API</h1><p>Web浏览器使用特殊的可访问性API（由底层操作系统提供），这些API公开对辅助技术(ATS)有用的信息-ATS大多倾向于使用原语信息，因此这些信息不包括样式信息或javascript之类的内容。此信息是在一个称为可访问性树的信息树中构造的。</p><p>不同的操作系统有不同的可访问性API：</p><ul><li><p>Windows: MSAA/IAccessible, UIAExpress, IAccessible2</p></li><li><p>Mac OS X: NSAccessibility</p></li><li><p>Linux: AT-SPI</p></li><li><p>Android: Accessibility framework</p></li><li><p>iOS: UIAccessibility<br />如果 Web 应用中的 HTML 元素提供的本机语义信息失效，则可以使用 WAI-ARIA specification 的功能来补充该信息，这些功能向辅助功能树添加语义信息以提高可访问性。在 WAI-ARIA basics 文章中了解有关 WAI-ARIA 的更多详细信息。</p></li></ul><hr><h1 id="摘要"><a class="markdownIt-Anchor" href="#摘要"></a> 摘要</h1><p>本文应该给您提供一个有用的可访问性的高级概述，向您展示为什么它是重要的，并研究如何将它融入您的工作流程。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      本文作为本模块的开篇阐述了究竟什么是“可访问性” — 主要包括哪些用户群体是我们所需要和为什么需要考虑的，不同用户使用哪些工具与网页交互，以及我们在网站开发流程中如何构建可访问性。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>Hexo 博客Github、Gitee同步</title>
    <link href="https://no5972.moe/cms/archivers/18.html"/>
    <id>https://no5972.moe/cms/archivers/18.html</id>
    <published>2020-08-01T09:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Github在国内访问还是偏慢的，尽管我们将所有能弄的静态资源都移到拥有国内节点的JSDelivr上了。这里决定将博客在Gitee建立一个镜像，这样如果国内访问太慢的话我们可以从Gitee也就是“码云”来访问网站。</p><p>首先当然要登录Gitee账号，没有的话需要注册。新建一个仓库，仓库名称和要输入和这个子路径相同的名称，到时候发布站点的时候系统生成的地址就是这个子路径的地址。路径系统自动生成可以不用管。</p><p>然后和Github一样设置免密更新。</p><p>我们需要在Hexo站点本地代码的配置中添加Gitee的远程地址。这是展示仓库，我们不需要手动到Gitee的仓库添加代码。</p><p>直接在<code>_config.yml</code>文件里面在<code>repo</code>里面的<code>github</code>处再另起一行，填写仓库SSH地址。但是这时候提交会发现Github的分支变成了<code>gh-page</code>。发布站点用的分支是<code>master</code>，这就造成了混乱，所以这里需要强调的地方就是如何在Hexo往多个远程仓库推送时分别指定对应的分支。</p><p>这里就不能用单独的<code>branch</code>属性了，需要用另外一种格式来指定远程仓库的分支。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">gitee:</span> <span class="string">git@gitee.com:[用户名]/[仓库名].git,[分支名]</span></span><br></pre></td></tr></table></figure><p>每一个仓库都要加上对应的分支。</p><p>完整的<code>deploy</code>部分的配置如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Deployment</span></span><br><span class="line"><span class="comment">## Docs: https://hexo.io/docs/deployment.html</span></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span></span><br><span class="line">    <span class="attr">github:</span> <span class="string">git@github.com:[Github用户名]/[Github仓库名].git,master</span></span><br><span class="line">    <span class="attr">gitee:</span> <span class="string">git@gitee.com:[Gitee用户名]/[Gitee仓库名].git,master</span></span><br></pre></td></tr></table></figure><p>到Gitee页面打开仓库，选择上面的服务-Gitee Pages，选择<code>master</code>分支，部署目录不填，最好勾选强制HTTPS。然后点击部署。注意查看部署的URL看看子路径是不是和Github的子路径一致。</p><p>类似的方法还可以部署到Coding、Gitlab等更多网站，这里就不再赘述了。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Github在国内访问还是偏慢的，尽管我们将所有能弄的静态资源都移到拥有国内节点的JSDelivr上了。这里决定将博客在Gitee建立一个镜像，这样如果国内访问太慢的话我们可以从Gitee也就是“码云”来访问网站。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>Rider 修改程序最终EXE文件图标</title>
    <link href="https://no5972.moe/cms/archivers/17.html"/>
    <id>https://no5972.moe/cms/archivers/17.html</id>
    <published>2020-07-18T15:30:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>由于Windows Installer服务已无法修复，只能用Rider来开发C#。但是又遇到怎么修改程序最终的EXE文件图标的问题。百度找了个遍也没找到，只好去必应国际版搜索，这才在StackOverflow上找到正确的答案。如果这是国内首发的解决方法的话希望能对广大使用Rider的开发人员起到帮助。</p><p>此答案原见于：<a href="https://stackoverflow.com/questions/51635816/change-icon-for-exe-in-jetbrains-rider" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/StackOverflow-Mikhail%20Filippov-brightgreen" alt="StackOverflow Mikhail Filippov" /></a></p><blockquote><p>Rider当前根本就没有修改程序图标的功能或者说是界面。必须手动修改配置文件才能设置图标。</p></blockquote><p>找到项目的<code>.csproj</code>文件，在<code>&lt;PropertyGroup&gt;</code>标签里面添加</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;ApplicationIcon&gt;YourIcon.ico&lt;&#x2F;ApplicationIcon&gt;</span><br></pre></td></tr></table></figure><p>其中，<code>YourIcon.ico</code>是你放在项目目录或者是程序能在相对路径找得到的需要设置为程序图标的ICO文件，参考其他文件名的写法。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      由于Windows Installer服务已无法修复，不能安装VS，只能用Rider来开发C#。但是又遇到怎么修改程序最终的EXE文件图标的问题。百度找了个遍也没找到，只好去必应国际版搜索，这才在StackOverflow上找到正确的答案。如果这是国内首发的解决方法的话希望能对广大使用Rider的开发人员起到帮助。
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
    
  </entry>
  
  <entry>
    <title>Github Hexo 一键更新</title>
    <link href="https://no5972.moe/cms/archivers/16.html"/>
    <id>https://no5972.moe/cms/archivers/16.html</id>
    <published>2020-07-17T17:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>这个博客换成Hexo后台之后变成了绑定3个仓库：展示仓库，后台仓库，主题仓库。结果每次更新需要输入3对账号密码，很不方便。整合各路搜集到的资料之后总结出来一套一键更新的方案，可以一次性同步后台代码、主题代码和展示代码。</p><ol><li><p>原来那个Next主题代码显然是已经不能再直接用了，即使是把后台代码单独拿出来建仓库，主题代码还是不能用自己修改的那个。把这个位于<code>themes\next</code>目录的主题代码单独拿出来，原来主题代码的目录建一个github仓库！然后把拿出来的主题代码拷回去！提交！</p></li><li><p>按照网上现有的操作步骤设置账号全局的免密更新。现在据说github也有针对单个仓库的免密密钥，但是个人不建议在Hexo博客环境使用单个仓库密钥，毕竟更新一次要更新好几个仓库，不方便管理。<br><br />这里再稍微重复一下。<br><br />在Git Bash里面<code>cd ~; ssh-keygen -t rsa -C &quot;你的邮箱地址&quot;</code>，然后全部回车默认设置。<br><br />继续执行<code>cd ~; cd .ssh; cat id_rsa.pub</code>，把从<code>ssh-rsa</code>开头一直到段落结尾复制。<br><br />在网页打开Github，账号Settings里面SSH and GPG Keys，New SSH Key，名字随便输入，下边的文本域粘贴刚才复制的pub内容。</p></li><li><p>这边设置好以后试一下git push origin发现还是要输入密码。之后查阅资料发现方式不对，最开始git clone的时候用的是 <code>https://github.com/用户名/仓库名</code> 的方式。这叫HTTPS方式，但是上文使用的是SSH方式，不是HTTPS方式。因此需要修改远程仓库地址格式，改成SSH的格式。<br><br />进入仓库的<code>.git</code>目录，编辑里面的<code>config</code>文件。把里面的<code>url</code>从 <code>https://github.com/用户名/仓库名</code> 改成 <code>git@github.com:用户名/仓库名</code> 。<br><br />3个仓库都要这么改！但是展示仓库的地址不在<code>config</code>文件，而是在后台仓库根目录的<code>_config.yml</code>文件。最下边有个<code>deploy</code>，把里面的<code>repo</code>改成 <code>git@github.com:用户名/仓库名</code> 。</p></li><li><p>免密更新配置好以后，编写一键更新的CMD批处理放到项目根目录。</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git pull origin master</span><br><span class="line">git commit -m <span class="string">"update"</span></span><br><span class="line">git push origin -u master</span><br><span class="line"><span class="built_in">cd</span> themes/next</span><br><span class="line">git add .</span><br><span class="line">git pull origin master</span><br><span class="line">git commit -m <span class="string">"update"</span></span><br><span class="line">git push origin -u master</span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">hexo clean &amp;&amp; hexo g &amp;&amp; hexo d</span><br></pre></td></tr></table></figure><ol start="5"><li>批处理搞定之后以后可以在编辑了主题代码、后台代码之后在后台仓库根目录直接执行<code>./保存的CMD文件名.cmd</code>即可实现一条命令将展示仓库，后台仓库，主题仓库一并更新。</li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这个博客换成Hexo后台之后变成了绑定3个仓库：展示仓库，后台仓库，主题仓库。结果每次更新需要输入3个密码，很不方便。整合各路搜集到的资料之后总结出来一套一键更新的方案，可以一次性同步后台代码、主题代码和展示代码。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>国内互联网Flash依赖状况调查</title>
    <link href="https://no5972.moe/cms/archivers/15.html"/>
    <id>https://no5972.moe/cms/archivers/15.html</id>
    <published>2020-07-13T07:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="以下仅为引用现有的观点不代表本站立场"><a class="markdownIt-Anchor" href="#以下仅为引用现有的观点不代表本站立场"></a> 以下仅为引用现有的观点，不代表本站立场。</h1><p>Flash即将在年底停止支持，但是国内依旧有很多平台在依赖Flash，究竟国内还有多少平台还在依赖Flash？</p><p>知乎@松果煲粥 ：大量的办公，报名，教育等公共平台都是用的Flash来运行的，原本我电脑上是根本没装Flash的，但是前几个月发现弟弟上网课的网页居然需要Flash插件才能看。</p><p>知乎 佚名：用flash的什么医学实验模拟课程 医学魔课.泰盟医学虚拟仿真实验教学平台的太烦人了</p><p>CSDN@wujiuqier ：有些时候你遇到某些非用不可的业务你还非用不可。例如各种网课平台、政务平台、以及这段时间出现的一些虚拟实验平台（特别是一些学校的内网的平台），这些你还说Flash淘汰了不要去，你敢不用试试？</p><p>知乎@梦沧海 ：无所谓，对flashplayer重度依赖的是内网环境，我单位多个业务系统没了这个就运作不正常。</p><p>B站@wujiuqier ：这里点名长江云这个平台，各大湖北省的省电视台，地市电视台，县市电视台的视频在PC页面还得非要用Flash才能播放，上线一个HLS播放就这么难吗？</p><p>B站@柏木ゆっき ：你不知道这个软件比你想象的更恶心 我为了上网课下的这个 只有中国版能有 然后我发现这个广告弹窗之后当时也给禁用了 结果 网课页面都进去了 几秒之后马上变成系统服务组件没有开启要我去下修复工具[微笑] 想了各种办法都没能给他降服 只要禁用就听不了网课 真就恶心的一批</p><p>B站@冥土追魂-呱太神医 ：删不了的，一堆政府网站，还有老网站都必须要flash支持，像是很知名的4399，7k7k，QQ空间都需要flash的支持。</p><p>知乎@爱做梦的大傻子 ：mooc课不用flash没办法看课程的ppt！</p><p>知乎 佚名：大量国企和事业单位的PC网页没有彻底放弃Flash；相当的商业网站仍不放弃Flash……</p><p>知乎 佚名：各位电脑大神，每次都是电脑上优慕课网址里面的视频一直要自动下载flash才能观看，这要如何解决啊？[鄙人：就是这个页面，提示文字和这边长江云的提示文字一模一样]</p><p>知乎@天涯羽伏麟 ：国内这些官媒、教育、校内教务的网站大部分还在用flash，不能不开，麻烦死，要那就多下一个浏览器，要嘛就得重新调开flash，无力吐槽。。也不知道是承包给谁做的，运维我都怀疑是校内老师兼职的。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Flash即将在年底停止支持，但是国内依旧有很多平台在依赖Flash，究竟国内还有多少平台还在依赖Flash？
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>网站构建 网站用户</title>
    <link href="https://no5972.moe/cms/archivers/14.html"/>
    <id>https://no5972.moe/cms/archivers/14.html</id>
    <published>2020-07-11T19:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><h2 id="您的用户所使用的硬件和软件各不相同"><a class="markdownIt-Anchor" href="#您的用户所使用的硬件和软件各不相同"></a> 您的用户所使用的硬件和软件各不相同。</h2><h2 id="最重要的事情是了解您的受众用户"><a class="markdownIt-Anchor" href="#最重要的事情是了解您的受众用户"></a> 最重要的事情是了解您的受众（用户）。</h2><h1 id="他们使用什么显示器"><a class="markdownIt-Anchor" href="#他们使用什么显示器"></a> 他们使用什么显示器？</h1><p>请记住，在 web 上并非所有用户都使用与您相同的显示器。如果您针对 1024x768 分辨率的现实设计网页，那么某些使用低分辨率显示器的访问者在阅读您的网页时就会出现问题。</p><p>尽管某些用户仍然在使用 640x480 或 800x600 分辨率的显示器，但是 1024x768 是低分辨率标准的趋势。</p><p>如果您是拥有极高分辨率的开发人员中的一员，请确保使用了不同的低分辨率显示器来测试您的网页。</p><p>当设计网页布局时有一种明智的方法是，把页面的某个部分设计为可变的尺寸，这样就可以适应更大或更小的分辨率显示器。</p><p>同时需要兼顾移动端的用户，这些用户可能会使用竖屏来浏览网页。</p><p>尤其需要注意的是部分用户可能会设置屏幕字体缩放，尤其是笔记本电脑的用户。请确保使用屏幕字体缩放不会出现网页变形。</p><h1 id="他们使用什么浏览器"><a class="markdownIt-Anchor" href="#他们使用什么浏览器"></a> 他们使用什么浏览器？</h1><p>两种主要的浏览器 (Netscape 和 Microsoft) 都有自己的特征和怪癖，这些都是您在设计网页时必须考虑的。</p><p>如果您很重视您的网站，那么请您不要忘记使用不同类型的浏览器来测试每张页面。</p><p>目前，最常见的浏览器是 Google Chrome （以及使用 Chromium 内核的浏览器，其中包括 Microsoft 的 Edge） 和 Mozilla Firefox。</p><p>此外，某些访问者也许会使用纯文本的浏览器，比如 Lynx，或者他们可能会通过某个类似 AOL 的在线服务来访问您的站点。这些浏览器中的某些可能不会按照您的预想来显示网页。</p><p>明智的做法是，使用严谨的、正式的且正确的 HTML（或 XHTML）。严谨且正确的编码总是有助于浏览器正确地显示您的页面。</p><h1 id="他们安装了什么插件"><a class="markdownIt-Anchor" href="#他们安装了什么插件"></a> 他们安装了什么插件？</h1><p>某些网页中的元素，比如声音和视频片断或者其他的多媒体内容，也许需要使用单独的程序（助手应用程序或插件）。</p><p>请不要在您的网页中使用这些元素，除非您能够保证访问者有权使用所需的软件来查看它们。</p><h1 id="怎样帮助残疾人士"><a class="markdownIt-Anchor" href="#怎样帮助残疾人士"></a> 怎样帮助残疾人士？</h1><p>一些人们拥有严重的视力或听力问题。这些用户也许同样需要访问您站点。</p><p>他们中的一些人会使用盲文点字法或基于语言的浏览器来设法阅读您的站点。请记住，如果您不为他们提供某些基于文本的选择来替代图象和其他图形元素，那么所有的视觉内容都会失去作用。</p><p>为残疾人士设计网站并非易事，但是有一件小事您是可以做到的 - 至少对于弱视的人们来说 - 令您的网页可使用可调节的字体尺寸。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      您的用户所使用的硬件和软件各不相同。最重要的事情是了解您的受众（用户）。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>网站构建 网站设计</title>
    <link href="https://no5972.moe/cms/archivers/13.html"/>
    <id>https://no5972.moe/cms/archivers/13.html</id>
    <published>2020-07-10T19:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>来源：<a href="#"><img src="https://img.shields.io/badge/%E6%9C%AA%E7%9F%A5-brightgreen" alt="未知" /></a></p><h2 id="设计网站需要严谨的思考和周全的计划"><a class="markdownIt-Anchor" href="#设计网站需要严谨的思考和周全的计划"></a> 设计网站需要严谨的思考和周全的计划。</h2><h2 id="最重要的事情是了解您的受众用户"><a class="markdownIt-Anchor" href="#最重要的事情是了解您的受众用户"></a> 最重要的事情是了解您的受众（用户）。</h2><h1 id="用户都是浏览者"><a class="markdownIt-Anchor" href="#用户都是浏览者"></a> 用户都是浏览者</h1><p>如果您认为一般的用户会完完整整地阅读您的网页，那么您就错了。</p><p>无论您在网页中发布了多么有用的信息，一个访问者在决定是否继续阅读之前仅仅会花几秒钟的时间进行浏览。</p><p>如果您希望用户阅读您的文字，请确保在页面段落的第一句就说明您的观点。另外，您还需要在整个页面中使用简短的段落以及有趣的标题。</p><h1 id="少即是多"><a class="markdownIt-Anchor" href="#少即是多"></a> 少即是多</h1><p>使所有的句子尽可能地短。使所有的段落尽可能地短。使所有的章节尽可能地短。使您的页面尽可能地短。</p><p>请在段落和章节之间使用很多的留白。充斥着冗长文字的页面会赶走您的用户。</p><p>也不要在单一的页面上放置太多的内容。如果确实有必要传递大量的信息，请尽量把内容分为小块，然后放入不同的页面中。不要指望每个访问者都能把一张数千字的页面一路滚动到底。</p><h1 id="导航"><a class="markdownIt-Anchor" href="#导航"></a> 导航</h1><p>尽量创建通用于网站中所有页面的导航结构。</p><p>把文本段落中的超链接使用量降至最低。请不要使用文本段落内的超链接随意地把访问者带到别的页面。因此这样做会破坏导航结构一致性的感觉。</p><p>如果您必须使用超级链接，请把它们添加到段落的底部，或站点的导航菜单。</p><h1 id="下载速度"><a class="markdownIt-Anchor" href="#下载速度"></a> 下载速度</h1><p>最常见的错误是用于网站开发者的开发环境造成的，例如使用一台本地的机器开发站点，或者使用一条高速的因特网连接。开发人员有时不会意识到下载他们的页面要花很长的时间。</p><p>因特网可用性方面的研究告诉我们，如果网页的下载时间超过7秒，大多数的访问者会选择离开。</p><p>在您发布任何大量的内容前，请确保这些页面在低速的调制解调器连接上进行过测试。如果您的页面需要花大量的时间下载，您或许应当考虑删除某些图片或多媒体内容。</p><h1 id="允许您的用户发言"><a class="markdownIt-Anchor" href="#允许您的用户发言"></a> 允许您的用户发言！</h1><p>得到来自用户的反馈是件好事情。您的访问者就是你的“客户”。他们经常会给您一些有价值的点子，或者无偿地向您提供改进的建议。</p><p>如果您提供了某种方便的联系途径，您将得到来自很多技能和知识都各不相同的人们大量有益的反馈。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      设计网站需要严谨的思考和周全的计划。最重要的事情是了解您的受众（用户）。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
    
  </entry>
  
  <entry>
    <title>常用软件之我见（不定期更新）</title>
    <link href="https://no5972.moe/cms/archivers/12.html"/>
    <id>https://no5972.moe/cms/archivers/12.html</id>
    <published>2020-07-08T08:40:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>在B站和不少个人博客上也看到了相当多的软件推荐。这里也将鄙人自己常用的一些电脑软件做一个分享。如有任何疏漏谬误欢迎指正。</p><ul><li>Edge：微软的新的Chromium内核的浏览器。支持国内直接微软账号登录，自己也有一套国内可以直接访问的扩展商店，扩展齐全。</li><li>Chrome：不用装专门的PDF阅读器来看PDF了！这个浏览器直接就能看PDF。<s>但是为什么不直接推荐Edge呢，新的Chromium内核的Edge居然还是不能按目录跳转！</s> <strong>（20.09.21更新：Edge在86版本终于上线了PDF目录跳转的功能，这个被全球用户吐槽的缺陷，微软终于给大家填坑了！！！Edge的PDF浏览界面在左上角已经增设了目录按钮，点击即可展开目录列表，然后就可以点击目录项来跳转位置了。）</strong></li><li>Everything：快速搜索</li><li>IrfanView：一款比较小众的看图软件。速度也快，也支持扩展。100MB以上的大图还没尝试过，有试过的欢迎反馈。</li><li>TamperMonkey：浏览器扩展，Edge和Firefox都能用。油猴脚本，可以对自定义适配的网站添加自定义脚本。强大的网址适配规则定义功能。但GreasyFork这个脚本分享网站并不是油猴开发的，这一点需注意。</li><li>7-Zip：免费开源的解压缩软件。甚至可以拆绝大部分的EXE文件。</li><li>Universal Extractor：解压绝大部分的EXE格式的安装包或归档，避免吃到恶意捆绑软件。</li><li>MPC-HC：全称Media Player Classic - Home Cinema。开源的媒体播放器。鄙人每天听歌就是用的这个。虽然项目已停更，但是基本上所有的媒体格式都能正常使用。甚至可以直接通过网络上.m3u8的流媒体URL来看电视。</li><li>Bandicam：老版本Win10没有XBOX录屏的备用录屏方案！</li><li>Ventoy：2020年才出来的一套U盘集成多个ISO启动的解决方案，将U盘通过该工具制成启动盘之后把各个ISO文件丢到U盘指定目录即可。支持同一个盘同时支持传统启动和UEFI启动。之前虽然老毛桃大白菜也有同样的功能，但是众所周知的那些8384的东西很闹心。这个是开源的解决方案，Github上面可以查阅源代码。</li><li>恋恋EX：也给我们群自家的软件打个小广告，虽然不是鄙人开发的。这个是修改DNF游戏NPK资源的一套开源解决方案。（EX是唯一公开闭源的，现在ES都已经开源了。。。）鄙人Github上面存了这个工具的源代码，仓库是在Koishi_Extractor_English_Translation。原作者Lucky-Koishi那个Github她说不会用。。。</li><li>EagleGet：MSDN我告诉你给的很多系统镜像的是ed2k和磁力链，ed2k现在还可以用迷你迅雷下载，但是磁力链现在很多软件都是不支持的。EagleGet是鄙人找了很久才找到的支持这个磁力链下载的。</li><li>LibreOffice：用不起正版Office又不想用WPS的可以试试这套开源的Office解决方案。</li><li>Wallpaper Engine：“啥都不说了，冲就完事了”。导入自定义的MP4视频，桌面就是极乐净土的舞台！就是还得装个Steam很烦。</li><li>Upupoo：不想花钱买楼上那个的话或者<strong>磁盘空间装不下Steam的话</strong>也可以用这个备用方案。就是这个占用系统资源稍微高一些（即使是屏蔽了那些插件的运行）。</li><li>Vpings Video Wallpaper：同上，系统资源占用介于Wallpaper Engine和Upupoo。</li><li>Native HLS Playback：看电视也可以在浏览器看，如果不想用播放器的话。在浏览器装了这个扩展就可以在浏览器播放.m3u8的直播源了。</li><li>HxD Hex Editor：轻量级的16进制编辑器。对编码支持很好。</li><li>Scanner：平时使用计算机时经常出现C盘空间飘红的情况。这个软件用来分析各个文件和各个目录在分区的占用空间占比，它很形象地使用了多层扇形图来表示文件或者目录的大小占比，就像机械硬盘的碟片一样。之前的各种管家里面也有大文件清理的功能，但是这个软件不仅能分析大文件，还能分析体积较大的文件夹。</li></ul><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      在B站和不少个人博客上也看到了相当多的软件推荐。这里也将鄙人自己常用的一些电脑软件做一个分享。如有任何疏漏谬误欢迎指正。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Just make a contract with me, and become a Magical Girl!</title>
    <link href="https://no5972.moe/cms/archivers/11.html"/>
    <id>https://no5972.moe/cms/archivers/11.html</id>
    <published>2020-07-06T15:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="#"><img src="https://img.shields.io/badge/Source-Web-lightgreen" alt="Web" /></a></p><p>That’s horrible…<br><br />You can’t help it.<br><br />One person can’t handle this alone.<br><br />But she knew that and came here anyway.<br><br />No, this isn’t right, it’s too much for her…<br><br />If she gives up, it’s over.<br><br />But, you have the power to change this destiny.<br><br />All this tragedy, all this destruction, you can change it, if you want.<br><br />The power to do so lies within you.<br><br />I can change it?<br><br />Even someone like me can do something to help?<br><br />Can I really change how this ends?<br><br />Of course, you can.<br><br />Just make a contract with me, and become a Magical Girl!<br><br /><br><br />That was a crazy dream…<br><br />Good morning, Dad.<br><br />Oh, good morning, Madoka.<br><br />Mom up yet?<br><br />Tatsuya’s waking her up.<br><br />He might need some help, though.<br><br />Okay.<br><br />Mama, mama!<br><br />Wake up, wake up!<br><br />C’mon, mama!<br><br />Mama, mama!<br><br />Rise and shine!!<br><br />Urghhhhhhhh!!<br><br />…What the…?<br><br />Mama woke up, yay!<br><br />What’s happening in your world?<br><br />Well, Hitomi got another love letter.<br><br />It’s the second one this month.<br><br />Huh, if he can’t say to her face, he’s not worth it.<br><br />How’s Kazuko doing?<br><br />I think her new boyfriend’s working out.<br><br />She can’t seem to talk about anything else during homeroom.<br><br />This week’s their three months anniversary, so I guess that’s the record.<br><br />Oh I hope they can make it.<br><br />They’re at a critical stage in their relationship.<br><br />They are?<br><br />If it’s not the real thing, this is usually when it starts to fall apart.<br><br />But if they made it this far, they should be okay for another year.<br><br />Oh…<br><br />I look fabulous.<br><br />I wonder which ribbon I should wear.<br><br />Really?<br><br />It’s not too flashy?<br><br />There’s no such thing as too flashy, hon.<br><br />A woman can’t afford to get teased 'cause she looks sloppy.<br><br />Hah, perfect!<br><br />Your secret admirers are gonna get all wobbly and knees.<br><br />I don’t have secret admirers.<br><br />But you should dress and behave like you do.<br><br />That’s the secret every pretty girl should know.<br><br />Hehe…<br><br />Ah…<br><br />Uh-oh!<br><br />Yay, safe!<br><br />Now be good, and eat it all up, okay?<br><br />Okay!<br><br />Hey honey, some more coffee?<br><br />Uh…<br><br />I better not.<br><br />All right!<br><br />I’m off to work, everyone.<br><br />Have a good day, honey.<br><br />Bye, mama.<br><br />Hey, you’re gonna be late if you don’t hurry.<br><br />Huh?!<br><br />Oh yeah.<br><br />See you later!<br><br />Have a great day!<br><br />Have a great day!<br><br /><br><br />Good morning, guys!<br><br />Good morning.<br><br />What took you so long, Madoka?<br><br />Look at you with your cute ribbons.<br><br />You think so?<br><br />They’re not too flashy?<br><br />I think they look lovely.<br><br />My mom said that if a boy can’t say he loves you to your face, he’s not worth your time.<br><br />Your mom is way cool, Madoka!<br><br />I mean she’s smart, gorgeous and successful.<br><br />If only I could make up my mind as easily as that.<br><br />If only everyone could have your problems.<br><br />You know, she is right.<br><br />I wish someone would send me a love letter some time.<br><br />It’d be nice to get one.<br><br />Ah, now I get it.<br><br />You want to be as beautiful and popular as Hitomi, don’t ya?<br><br />I bet that’s why you’re wearing those ribbons to change your image.<br><br />That’s not true!<br><br />My mom picked these out and…<br><br />You tricked your mom to tell you the secret to being popular, didn’t you?<br><br />I’m not gonna let that happen!<br><br />Ha!<br><br />No!<br><br />No, stop it!<br><br />No!<br><br />You’re just too cute!<br><br />I’m not gonna let you be popular with the boys.<br><br />You’re mine, Madoka!<br><br />Mine, mine, mine.<br><br />Ahem.<br><br />Ahem.<br><br /><br><br />I have a very important issue to discuss today.<br><br />So eyes front, ears open!<br><br />The correct way to fry an egg is sunny side up or down.<br><br />Come on, Nakazawa. I don’t have all day.<br><br />I… I gue… uh…<br><br />You can fry either way, can’t you?<br><br />Yes, precisely.<br><br />You can fry either way!<br><br />Therefore, go through without saying that you should never judge a women’s beauty by the way she fries her eggs.<br><br />Remember, girls, do not associate with men who refuse to eat eggs that’s been fried sunny side down.<br><br />I guess it didn’t work out.<br><br />But what gave you that idea?<br><br />And you boys, better make sure you don’t grow up to be men who complain about how the damn eggs are cooked, understand?!<br><br />Well, now that that’s out of the way, let’s give a big warm welcome to our new classmate!<br><br />Uh, maybe that should’ve come first?<br><br />Come in, Miss Akemi.<br><br />Don’t be shy!<br><br />Wow!<br><br />Wow, she’s super gorgeous.<br><br />Huh?<br><br />No way!<br><br />It couldn’t be!<br><br />Why don’t you tell the class a little bit about yourself.<br><br />I’m Homura Akemi.<br><br />It’s nice to meet you.<br><br />Uh…<br><br />Um…<br><br />Uh, Miss Akemi?<br><br /><br><br />What school did you go to before coming to this one?<br><br />I went to a private Catholic school in Tokyo.<br><br />Were you in a club?<br><br />How about sports?<br><br />Were you on any teams?<br><br />No, not really.<br><br />Your hair is really beautiful!<br><br />What kind of shampoo do you like to use?<br><br />There’s something awfully mysterious about that girl, don’t you think?<br><br />Hey, Madoka, do you know that girl?<br><br />I could’ve sworn to you she was glaring at you when she was in front of the class.<br><br />Well, I’m not really sure…<br><br />I’m sorry.<br><br />I think today’s been a little stressful for me.<br><br />I’m not feeling very well.<br><br />May I please go to the Nurse’s Office?<br><br />Ah, sure.<br><br />If you want, I can take you over there.<br><br />Good idea!<br><br />Can I come too?<br><br />Please don’t trouble yourselves.<br><br />I’ll ask the Nurse’s Aide to take me.<br><br />Huh?<br><br />Miss Madoka Kaname.<br><br />You are the Nurse’s Aide for this class, are you not?<br><br />Huh?<br><br />Um, well…<br><br />I uh…<br><br />Would you please come with me?<br><br />To the Nurse’s Office.<br><br />Um, I…was…<br><br />H-How did you know I was the Nurse’s Aide for the class?<br><br />Ms Saotome told me that you were.<br><br />Oh, right, of course she did.<br><br />By the way, the Nurse’s Office is over there.<br><br />This way, right?<br><br />Huh?<br><br />Uh, yeah, that’s right.<br><br />But, um…<br><br />So anyway, how do you know your way there?<br><br />I mean you’re new here and all.<br><br />Um…Miss, um…Akemi?<br><br />Call me Homura.<br><br />Oh, Homura.<br><br />What is it?<br><br />Uh, nothing. It’s just that…you have an unusual name.<br><br />But not in a bad way or anything, I was just thinking how it sounded cool…<br><br />for a first name, I mean.<br><br />Madoka Kaname, do you treasure the life you currently live?<br><br />And do you consider your family and your friends precious?<br><br />Oh, well, I uh…<br><br />Of course I do.<br><br />I mean I-I do.<br><br />My family and my friends, I love them very much and yes they’re very precious to me.<br><br />Do you mean it?<br><br />Absolutely.<br><br />I couldn’t lie about that!<br><br />Good.<br><br />Because if that’s the truth, then you wouldn’t try changing the life you have or the person you are.<br><br />Otherwise, you’d lose everything you love.<br><br />Huh?<br><br />Don’t change.<br><br />Stay as you are, Madoka Kaname.<br><br />Stay as you are, forever.<br><br /><br><br />Wow…<br><br />Wow…<br><br />She breaks the record of every school in this city?!<br><br />I can’t believe you can jump that high!<br><br /><br><br />She said what?!<br><br />It doesn’t make any sense, does it?<br><br />When I was thinking she was this awesome girl but it turns out she is a total psycho!<br><br />Ah! I hope she doesn’t think acting like a weird transfer student is cool.<br><br />That’s so MOE? It makes me sick!<br><br />This has to be misunderstanding.<br><br />Are you positive you’ve never met her before?<br><br />Hmm…<br><br />I guess the sensible answer will be “yes.”<br><br />Okay, what do you mean by sensible?<br><br />Either you met her or you didn’t?<br><br />Well, it’s like…<br><br />You’re gonna think I’m weird but I first met her in a dream or something.<br><br />Hahahaha… That’s awesome!<br><br />An anime character in you’s popping out, too!<br><br />Come on, that’s mean!<br><br />This is really bugging me!<br><br />I got it all figured out.<br><br />You guys knew each other in the past life and the fate is reached across time and space to bring you back together again.<br><br />In your dream, what happened when you met her?<br><br />That’s the thing. I can’t really remember what happened in it.<br><br />All I know is that was really strange and spooky.<br><br />If you want my opinion, I think it’s entirely possibly you met Miss Akemi somewhere before.<br><br />Huh?!<br><br />You might not remember meeting her, but your subconscious certainly took note of it.<br><br />When you were having that dream, your subconscious simply brought up the image of her.<br><br />Seriously?<br><br />That’s the heck of coincidence, don’t you think?<br><br />Uh, perhaps.<br><br />Uh-oh, look how late it’s gotten.<br><br />Excuse me, but I really should be going now.<br><br />Is it Piano today or classical dance?<br><br />Tea Ceremony lessons today.<br><br />Even though our Exams are coming up, my mother still wants me to continue taking them.<br><br />Yeah, there’s another reason to be glad I wasn’t born a rich girl.<br><br />We should get going too.<br><br />Madoka, you wanna hit the music store on the way home?<br><br />Okay.<br><br />Something for Kyosuke again?<br><br />Yeah, maybe.<br><br />Have fun shopping!<br><br />Bye bye!<br><br />Later!<br><br /><br><br />Help me!<br><br />Huh?<br><br />Madoka, help me!<br><br />Huh?<br><br />What?!<br><br />Please…help me!<br><br />Huh?<br><br />Hello?<br><br />Who are you?<br><br />Help me…!<br><br />Where are you?<br><br />Um, do I know you?<br><br />Help me!<br><br />Is that you?<br><br />Help me…<br><br />Homura?<br><br />Get away from that creature.<br><br />B-But he’s really hurt.<br><br />Leave him alone.<br><br />Why are you trying to hurt him?<br><br />This doesn’t concern you.<br><br />But he was calling me!<br><br />I could hear him calling my name!<br><br />He was asking me to help him!<br><br />Really?<br><br />Over here, Madoka!<br><br />Sayaka!<br><br />Why is this happening now?<br><br />Now she’s attacking you on cosplay?<br><br />What’s her problem?<br><br />And what’s that thing you’re carrying?<br><br />Looks like a stuffed animal. Is it alive?<br><br />I don’t know.<br><br />I don’t know why this is happening, but we have to save him!<br><br />Where’d the exit go?<br><br />Where are we?<br><br />I don’t like this place.<br><br />Everything keeps changing!<br><br />Oh, crap!<br><br />What the heck’s going on?!<br><br />There’s something over there!<br><br />Is this some kinda joke, right?<br><br />I’m stuck in a bad dream, but I am dreaming, right?<br><br />Right, Madoka?!<br><br />What’s happening?<br><br />I don’t know.<br><br />That was close, wasn’t it?<br><br />But don’t worry, you’re safe now.<br><br />Thank goodness.<br><br />You rescued Kyubey for me.<br><br />I’m very grateful.<br><br />He’s a dear friend of mine and I was so worried.<br><br />He called out to me.<br><br />I could hear his voice inside my head.<br><br />Ahh, I see.<br><br />I can tell by your uniforms that you both go to Mitakihara Middle School.<br><br />Are you 8th graders?<br><br />Who are you?<br><br />Oh, that’s right.<br><br />Maybe I should introduce myself.<br><br />Actually, it’s going to have to wait a bit.<br><br />Please excuse me.<br><br />I have to wrap this up first.<br><br />Wow, amazing!<br><br />We’re back!<br><br />The witch managed to escape.<br><br />If you wanna finish it off, you’d better go after it.<br><br />I won’t mind if you take it this time.<br><br />But I still have work to do here.<br><br />You don’t understand, do you?<br><br />I’m telling you I’m willing to overlook this.<br><br />Honestly, don’t you think it would be best if we didn’t do this right now?<br><br />Thank you, Mami!<br><br />You’re a lifesaver!<br><br />I’m not the one you should be thanking.<br><br />They saved you.<br><br />I was just passing by.<br><br /><br><br />Thank you very much!<br><br />My name is Kyubey.<br><br />Were you the one who was calling for help?<br><br />That’s right, Madoka Kaname,<br><br />And Sayaka Miki.<br><br />Wow, hang on a sec.<br><br />How do you know our names?<br><br />I came here because I have a favor to ask of you both.<br><br />Huh?<br><br />What do you mean?<br><br />I want you to make contracts with me, and become magical girls!<br></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Just make a contract with me, and become a Magical Girl!
    
    </summary>
    
    
      <category term="Other" scheme="https://no5972.moe/cms/categories/Other/"/>
    
    
  </entry>
  
  <entry>
    <title>恋恋Ex黑猫.4 试衣间教程</title>
    <link href="https://no5972.moe/cms/archivers/9.html"/>
    <id>https://no5972.moe/cms/archivers/9.html</id>
    <published>2020-06-20T09:15:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>摘自<a href="https://bbs.colg.cn/thread-7875151-1-1.html" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/%E6%81%8B%E6%81%8B%E3%81%AEEx%E9%BB%91%E7%8C%AB.4.4-brightgreen" alt="恋恋のEx黑猫.4.4" /></a> 作者：<a href="https://github.com/Lucky-Koishi" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/GitHub-Lucky--Koishi-brightgreen" alt="GitHub-Lucky-Koishi" /></a></p><h1 id="试衣间的基础使用方式"><a class="markdownIt-Anchor" href="#试衣间的基础使用方式"></a> 试衣间的基础使用方式</h1><p>首先按照职业对试衣间进行本地化，然后就能使用了。（详情：）<br />这篇教程就建立在试衣间本地化的基础上，对试衣间的基础功能进行描述。</p><h2 id="1-职业选择和装扮部位选择"><a class="markdownIt-Anchor" href="#1-职业选择和装扮部位选择"></a> 1. 职业选择和装扮部位选择</h2><p>职业选择按钮位于试衣间界面最左上方的像素头像上。点击它即可切换职业。</p><p>每次进行职业选择时，试衣间都会根据选择后的职业进行初始化。<br />初始化的时候会更新部件列表和展示图，并且部位选择将默认为衣服。<br />角色初始化时，除了皮肤、发型、上衣、下装、鞋子、武器外，其他部件均为脱下状态。</p><p>装扮部位选择按钮则位于像素头上右侧的10个按钮上。<br />依次为头饰、发型、面部、胸部、上衣、下装、腰带、鞋子、皮肤、武器。</p><p>点击对应的按钮，下面的列表和右侧的展示图就会进行相应的更新。<br />如果要选择武器，则需要点击武器按钮，然后在下拉菜单中选择对应的武器种类即可。</p><h2 id="2-部件切换和浏览"><a class="markdownIt-Anchor" href="#2-部件切换和浏览"></a> 2. 部件切换和浏览</h2><p>点击列表中的条目就可以切换对应部件的装扮。</p><p>如果想脱下，选择列表中的第一项即“无”即可，皮肤、上衣、下装、武器等默认未脱下的装扮也可以进行脱下。</p><p>点击列表项后，有关该装扮的信息会显示在列表下面的文本框中。</p><p>列表项中的装扮名称默认为“未命名+部件名+装扮的ID”，如果在映射表中，可以搜索到它的名字，则会显示名字。<br />如果名字后带有“[…]”的字样，则说明映射表中不止一条装扮与它对应（例如远古二·三的武器）。</p><p>对于浏览，可以进行单帧切换，也可以选择动作使角色按照选定的动画进行播放。</p><p>注意：角色进行动画动作的时候不要切装扮切的太快哦，否则偶尔会导致崩溃。</p><h2 id="3-通过展示图浏览"><a class="markdownIt-Anchor" href="#3-通过展示图浏览"></a> 3. 通过展示图浏览</h2><p>展示图是将某个角色的单件装扮以模特的方式进行罗列出来，一般为站姿。<br />但武器的展示是例外的（因为有些角色的站姿会挡住武器甚至不会掏出武器，如圣职者和神枪手）。</p><p>如果试衣间没有进行本地化，则展示图默认为不显示的，而是以一个刷新标志的按钮代替；<br />当资源NPK有新的装扮出现的时候（即出现了之前没有的ID），新的装扮的位置也会如此。<br />这个时候，可以右键点击“展示图”，然后在弹出菜单里选择“更新展示图”即可。</p><p>也可以使用工具栏上的“更新”按钮（左数第六个，为蓝绿色）对本职业该部件进行批量更新。</p><p>尽管如此，无论展示图是否进行了更新，点击展示图（或未更新展示图时的按钮）均会对穿上对应的装扮。</p><p>此外，展示图的右键弹出菜单还有一项为“登记装扮信息”，可以在映射表中为该装扮登记名称，并为其选择图标。</p><h2 id="4-通过图标浏览"><a class="markdownIt-Anchor" href="#4-通过图标浏览"></a> 4. 通过图标浏览</h2><p>图标则是通过点击装扮的图标对装扮进行选择。<br />点击工具栏上的“图标模式”按钮（左数第四个，为黄绿色）可以切换到图标模式。</p><p>（图标的示意图因为论坛不让上传那么大附件无法上传，大家可以在试衣间界面中体验）</p><p>如果未对图标进行本地化，否则不会显示，此时可以点击工具栏的“刷新”按钮，就会在资源文件夹下对应的NPK提取图标。<br />由于装扮本身不包含图标信息，所以装扮和图标的对应关系需通过一个映射表来进行表达。<br />该映射表须由用户自行编辑、增加和维护；这不是一个简单的工作，<br />但是目前黑猫.4.1提供了截至2020年年初所有装扮（含武器）的映射表，所以用户们目前所做的就是有新时装新武器自行追加就可以了（后期会出教程）。<br />图标上有时候会出现叹号的字样，这里的叹号表示无法显示该图标对应的装扮，点击其会视为脱下，其中：<br />红色的叹号：映射表内没有任何装扮使用该图标。如果映射表本身是空的，则全部的图标都会显示红色的叹号。<br />蓝色的叹号：映射表内存在某个装扮使用该图标，但是该装扮在资源目录中找不到。该符号在使用跨服映射表或资源文件的时候较为常见。</p><p>如果没有叹号，点击对应的图标就会将对应的装扮试穿了。<br />如果在图标模式下，想切回展示图模式，点击工具栏上的“展示图模式”按钮（左数第三个，未选中时为黄色）就切回展示图模式了。</p><h2 id="5-更改展示图的大小"><a class="markdownIt-Anchor" href="#5-更改展示图的大小"></a> 5. 更改展示图的大小</h2><p>有些部件太大了，小展示图显示不下？<br />或者有些部件太小了，想在一页中多显示几个？<br />请点击工具栏上的“切换展示图尺寸”按钮（左数第一个，为红色）进行切换即可。<br />小的展示图每页的显示多些；大显示图虽然每页显示的内容少些，但是可以看到全貌，适用于圣职者武器等大件的展示。</p><h2 id="6-切换tn"><a class="markdownIt-Anchor" href="#6-切换tn"></a> 6. 切换TN</h2><p>试衣间默认显示的装扮为未HX的。<br />如果想试穿已HX（即带“(tn)”字样的）的装扮，点击工具栏上的“和谐开关”（左数第二个，为橙色）按钮即可。</p><h2 id="7-套装功能"><a class="markdownIt-Anchor" href="#7-套装功能"></a> 7. 套装功能</h2><p>工具栏上的“套装工具”按钮包含的关于套装登记的功能，可以将装扮登记为套装，并生成套装共享码供其他人使用。<br />详细的教程会在过后放出。</p><h2 id="8-补丁制作相关"><a class="markdownIt-Anchor" href="#8-补丁制作相关"></a> 8. 补丁制作相关</h2><p>工具栏上的“补丁制作工具”包含了一些用于装扮补丁制作的便利功能。<br />其中最常用的应该是第一个，即将装扮按照图层顺序依次导入到当前的EX内（使用该功能前请注意自己正在做的补丁是否保存，会覆盖的）。<br />装扮图层顺序仅为参考建议装扮次序，偶尔会有穿模现象，需要制作者们自行进行调节。</p><p>其他功能就略为傻瓜式的了，下面也介绍一下：</p><ul><li>生成易于制作换装类的NPK文件<br />在EX中生成一个V4的本体图层和一个V2的隐藏图层，而其他IMG均为这俩图层的引用（衣服引用本体图层，其他引用隐藏图层）。<br />制作的时候，只要将本体图层替换为其他IMG（一般是已拼合的另一套装扮的IMG），就可以实现该时装改其他时装的补丁。<br />注意：皮肤不包含在内。</li></ul><p>（生成易于制作换装类的NPK文件的示意图因为论坛不让上传那么大附件无法上传，大家可以在软件中自行尝试）</p><ul><li>生成隐藏当前装扮的NPK文件<br />即反补丁，打上该补丁后，该时装就会被全数隐藏。该NPK内的“本体图层.img”本身没有任何用途，但是可作为参考IMG使用。</li></ul><p>（生成隐藏当前装扮的NPK文件的示意图因为论坛不让上传那么大附件无法上传，大家可以在软件中自行尝试）</p><ul><li>生成全时装改当前装扮的NPK文件<br />即一键生成全时装补丁，该补丁将当前职业的所有装扮（根据资源目录下NPK计算）均隐藏，并将所有皮肤文件均改为该时装，以实现目的。<br />这个补丁的所有IMG均采用引用方式，因此体积较小（KB级）。<br />同理，将这个文件中的“本体图层.IMG”改为其他IMG，就可以实现全职业改其他时装的补丁。</li></ul><p>（生成全时装改当前装扮的NPK文件的示意图因为论坛不让上传那么大附件无法上传，大家可以在软件中自行尝试）</p><h2 id="9本地化相关"><a class="markdownIt-Anchor" href="#9本地化相关"></a> 9.本地化相关</h2><p>本地化就是自动生成试衣间所用的展示图和图标，根据资源文件提取，按钮位于工具栏中最后一个按键。<br />一般来说第一次使用试衣间运行一次后就不用再运行了，新出现的装扮可以使用右键点击展示图更新的方式进行局部的本地化。<br />具体的内容在0号教程里都有说了。</p><p>展示图设定和映射表相关内容会在以后的教程中详细讲解。</p><h1 id="试衣间的本地化与映射表"><a class="markdownIt-Anchor" href="#试衣间的本地化与映射表"></a> 试衣间的本地化与映射表</h1><h2 id="0前言"><a class="markdownIt-Anchor" href="#0前言"></a> 0.前言</h2><p>我们知道，网络上的试衣间大都有个服务器用来储存试衣间里的相关数据，<br />因此，如果要把试衣间搬到本地来，就需要在本地硬盘上开辟一块空间用来存储这些数据。<br />这个过程便称为试衣间的本地化。</p><h2 id="1试衣间所使用的本地文件"><a class="markdownIt-Anchor" href="#1试衣间所使用的本地文件"></a> 1.试衣间所使用的本地文件</h2><p>试衣间的本地文件主要包含两个部分，展示图和映射表。</p><p>展示图是预先生成好的样式图，可由试衣间直接进行读取浏览而省去解析的时间。<br />它可以由软件根据提取资源NPK中的贴图来进行生成。<br />在第一次使用试衣间时，展示图是不存在的，因此试衣间里提供本地化功能来进行展示图的生成，</p><p>生成的文件存储在软件的输出目录下的Avatar文件夹里，由“巨大”、“大”、“中”、“小”、“图标”五个子文件夹构成，<br />存储的文件名为“部件+ID号”（图标为“部件+帧号”），格式为PNG。<br />试衣间里的展示图显示的就是这些图片的内容。<br />PS.也就是说，展示图生成后如果你手动修改这些文件，那试衣间里展示的也是你修改后的图。</p><p>映射表是以职业命名的一系列文本文件，里面以逗号分隔的方式存储装扮ID、装扮名称和图标的对应关系。<br />由于这些信息无法从资源NPK中直接获得，因此软件在第一次启动试衣间时，会生成对应的格式，而具体内容需要玩家自己填入。<br />填入的方式可以是直接打开文件进行编辑，也可以使用软件带的某些接口进行更为直观地编辑。<br />这些映射表文件同样存储在软件的输出目录下的Avatar文件夹里，<br />存储的文件名为“职业名+装扮表”，格式为TXT。<br />试衣间根据映射表确定的信息有很多，例如装扮的名称和对应的图标，套装名称和包含部件等。<br />目前最全的映射表整合到黑猫.4.1的发布包里，更新到2020年4月（包含装扮和武器信息，不包含套装）；<br />之后的映射表就要靠用户自己来进行追加和维护了。<br />PS.这份映射表如果产生乱码，就打开这个TXT，另存为并选择ascii编码（也可能是UTF8忘记了总之都试试），就OK了。</p><h2 id="2展示图的生成方式"><a class="markdownIt-Anchor" href="#2展示图的生成方式"></a> 2.展示图的生成方式</h2><p>软件总共提供了3种展示图的生成方式，单张生成、单部件生成、单职业生成、自由生成。</p><p>单张生成：右键点击试衣间的未更新的（或已更新的）展示图，在下拉菜单中选择“更新展示图”即可。<br />单张生成常用于资源目录的NPK中存在追加装扮的情形，届时试衣间内的展示图也会自动腾出位置，以便玩家为其生成展示图。</p><p>单部件生成：点击工具栏上的“更新”按钮，在弹出的询问对话框中选择“确定”即可。<br />单部件生成用于生成目前选择职业的目前浏览的部件的所有展示图；在图标模式，也适用于生成该职业该部件的所有图标。</p><p>单职业生成：点击工具栏上的“本地化设置”按钮，在弹出菜单中选择“对本职业进行本地化”，并点击“确定”。<br />单职业生成用于生成某一职业的所有部件的展示图和所有图标，如果您使用试衣间只热衷于制作一个职业的补丁的时候，可以选择该方式进行生成。</p><p>自由生成：点击工具栏上的“本地化设置”按钮，在弹出菜单中选择“对全职业进行本地化”，根据需要进行选择。<br />自由生成顾名思义就是自由度较高，可以选择生成哪些内容（时装展示图、武器展示图、时装图标、武器图标），哪些职业，按需生成。</p><h2 id="3映射表的文件格式"><a class="markdownIt-Anchor" href="#3映射表的文件格式"></a> 3.映射表的文件格式</h2><p>映射表文件在第一次使用试衣间的时候就会自动生成在输出目录下的，Avatar文件夹下，并职业进行区分。<br />每个职业都有个映射表文本文件存储相关信息，这些信息依次包括套装信息、装扮信息、武器信息。<br />在试衣间中，可以通过点击工具栏上的“本地化设置”按钮，然后点击“打开映射表文件”进行快捷地打开。<br />它的格式如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[suit]</span><br><span class="line">套装信息</span><br><span class="line">[avatar,cap]</span><br><span class="line">头饰信息</span><br><span class="line">[avatar,hair]</span><br><span class="line">发型信息</span><br><span class="line">……</span><br><span class="line">[weapon,武器类型缩写1(例如rod)]</span><br><span class="line">武器类型1信息</span><br><span class="line">[weapon,武器类型缩写2(例如staff)]</span><br><span class="line">武器类型2信息</span><br><span class="line">……</span><br></pre></td></tr></table></figure><p>下面介绍一下这些信息的存储格式。</p><p>套装信息：存储这个职业的套装名，每一行为一条，格式为：<br />套装名,头饰ID,发型ID,面部ID,胸部ID,上衣ID,下装ID,腰带ID,鞋ID,皮肤ID<br />复制代码</p><p>其中，逗号均为半角逗号，套装名为套装的名称（不得带半角逗号，如果套装名需要逗号则使用全角），<br />各部件的ID就是各部件的ID号，如果不使用该部件的话，填-1。<br />以下是个例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">初音未来的装扮,-1,18200,16300,17000,20400,18400,-1,18400,0</span><br></pre></td></tr></table></figure><p>头饰、发型等信息：存储这些装扮的信息，每一行为一条，格式为：<br />装扮ID,图标文件名,装扮名称<br />复制代码<br />其中，逗号均为半角逗号，装扮名称为该装扮的名称（不得带半角逗号，如果需要逗号则使用全角），<br />装扮ID就是这个装扮的ID号，图标文件名为Avatar\图标\对应职业目录下的图标文件名（不带扩展名）。<br />注意每个部件的条目一定要写在对应的标签下。<br />以下是个例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1700,头饰36,红色猫咪头饰</span><br></pre></td></tr></table></figure><p>武器信息：存储武器的信息，每一行为一条，格式为：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">武器装扮ID,图标文件名,武器(装扮)名称</span><br></pre></td></tr></table></figure><p>其中，逗号均为半角逗号，武器(装扮)名称名称为该武器的名称（不得带半角逗号，如果需要逗号则使用全角），<br />武器装扮ID就是这个武器装扮的ID号，图标文件名为Avatar\图标\对应职业目录下的图标文件名（不带扩展名）。<br />注意每个武器的条目一定要写在对应的武器的标签下。<br />以下是个例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0,法杖45,威利的戒言法杖</span><br></pre></td></tr></table></figure><p>PS.这里面，武器标签里的缩写是根据职业进行确定的，为该职业的NPK文件名所带的缩写，例如lswd、sswd等。<br />这里有一点有意思的地方。在资源NPK文件中，鬼剑、格斗系等武器并不是按照种类严格区分的；<br />例如光是短剑就有sswd、gemswd、boneswd等几种了，<br />而映射表内的标签使用的武器类型缩写采用的正是NPK文件名中的缩写，所以鬼剑的武器标签就会有10个之多。<br />相比之下，图标的种类是跟武器种类完全一致的，因此下面这种现象是正常的，虽然同为短剑却被分成了两类导致看上去很奇怪。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[weapon,boneswd]</span><br><span class="line">0,短剑3,骨剑</span><br><span class="line">1,短剑9,波刃骨剑</span><br><span class="line">2,短剑15,萨乌塔的椎骨剑</span><br><span class="line">3,短剑6,骸麒魔剑</span><br><span class="line">……</span><br><span class="line">[weapon,gemswd]</span><br><span class="line">0,短剑21,震波剑</span><br><span class="line">1,短剑16,卢克西的紫炎波刃剑</span><br><span class="line">2,短剑18,苍月剑</span><br><span class="line">3,短剑19,艾米丽的银妆刀</span><br><span class="line">……</span><br></pre></td></tr></table></figure><p>在映射表文件中，就是这样以一条条的方式罗列装扮、名称、图标和套装之间的关系。<br />有几点需要注意的：</p><ol><li>对应部件的条目一定要放在对应的标签下（因为需要根据标签和ID共同来提取贴图）。</li><li>同一部件的条目顺序可以颠倒，但使用软件进行修改时，会对其进行会自动排序。</li><li>同一个ID是允许有多个不同的名称的，遇到这种情况请分多条输入，例如：</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">400,魔杖26,幻影魔杖</span><br><span class="line">400,魔杖27,魔界的法师魔杖</span><br></pre></td></tr></table></figure><h2 id="4向映射表追加装扮条目"><a class="markdownIt-Anchor" href="#4向映射表追加装扮条目"></a> 4.向映射表追加装扮条目</h2><p>向映射表追加条目有两种方式，一种是打开映射表文件手动添加条目，另一种是通过软件的内置功能。<br />当然，直接修改映射表文件更为自由和灵活，但是如果这么做，则必须要先进行确定装扮ID和图标等繁琐的工作，<br />因此试衣间提供了简单功能，可以方便地直接向映射表追加条目，具体的方式是：<br />右键点击一个装扮的展示图，在弹出菜单中点击“登记装扮信息……”。</p><p>在弹出对话框中，为该装扮命名，并选择对应的图标就可以了。</p><p>此时打开映射表文件就会发现条目已经被自动添加了。</p><h2 id="5向映射表追加套装条目"><a class="markdownIt-Anchor" href="#5向映射表追加套装条目"></a> 5.向映射表追加套装条目</h2><p>向映射表追加套装条目也是两种方式，一种是打开映射表直接手动添加，另一种是通过软件的套装工具。<br />具体操作方式是：右键点击工具栏上的“套装工具”按钮，并在弹出菜单上选择“套装登记”。</p><p>在这里就会将当前浏览的装扮登记为一个套装，您唯一需要做的就是命名就好了。</p><p>此时打开映射表文件就会发现套装条目已经被自动添加了。</p><h2 id="6修改或删除映射表条目"><a class="markdownIt-Anchor" href="#6修改或删除映射表条目"></a> 6.修改或删除映射表条目</h2><p>修改和删除映射表条目只能通过编辑文本文件的方式进行修改或者删除。<br />用记事本的Ctrl+F查找目标内容，然后手动修改和删除即可。</p><h2 id="7映射表对图标模式的影响与图标上叹号的消除"><a class="markdownIt-Anchor" href="#7映射表对图标模式的影响与图标上叹号的消除"></a> 7.映射表对图标模式的影响与图标上叹号的消除</h2><p>第一次打开试衣间时，若已经进行本地化但是未对映射表进行编辑，此时切换到图标模式时，所有的图标上均带有红色叹号的标志。<br />这个标志说明映射表中，不存在任何装扮与该图标对应。<br />因此消除该标志的方式就是找到该图标对应的装扮，并使用本帖目录第四页的方式其分配该图标。<br />添加完毕后，就会发现该图标上的叹号已经消除。此时点击该图标则会正常试穿该装扮了。</p><p>有的时候，图标上会出现蓝色的叹号的标志，该标志表明虽然映射表中存在该图标对应的装扮，<br />但是资源NPK里没有。这个标志一般是由于映射表的制作方和资源NPK使用的服务器不一致导致的。<br />例如映射表中包含了韩服的装扮，但是资源NPK使用的是国服，那么国服资源NPK就不包含这个装扮的IMG文件，自然也就无法显示。<br />蓝色的叹号标志只能通过对资源NPK更新进行消除，如果资源NPK不包含该IMG，就无法消除蓝色的叹号。<br />在使用软件自行向映射表中添加条目时，由于这种装扮根本无法被选中，所以手动操作时永远不会出现蓝色叹号。</p><p>在图标模式点击带有叹号（无论红色还是蓝色）的图标时，对应部件的装扮会被视为脱下。</p><h2 id="8当客户端更新时如何更新映射表"><a class="markdownIt-Anchor" href="#8当客户端更新时如何更新映射表"></a> 8.当客户端更新时，如何更新映射表</h2><p>对于每一件新增的装扮，一般分三步来做：<br />1.当客户端更新的时候，如果客户端内出现新的装扮，那么打开试衣间的时候就会发现有若干个展示图显示为未更新的状态。<br />这个时候右键点击未更新的展示图，选择“更新展示图”即可。</p><p>2.如果图标也变多了，那么切换到图标模式，然后点击工具栏上的“更新”按钮对图标也进行更新。</p><p>3.切回到展示图模式，右键点击刚才更新的装扮，选择“登记装扮信息……”，输入该装扮对应的名称并为其选取图标，这样新增的装扮就已登记到映射表中了。</p><p>这里要注意：如果登记装扮的时候并不知道名字，随便起一个自己容易记的名字即可；等将来知道该信息的时候，可以在映射表中Ctrl+F手动更改；<br />如果没有在图标文件夹中找到对应的图标也没关系，图标那栏输入“不知道”或者别的就行，将来知道的时候也可以在映射表中手动更改。</p><p>对于每一套装扮，一般分两步来做：<br />1.首先找到这套内的装扮然后全部穿上（如果这套装扮没有包含所有部件，建议未包含的部件保持“脱下”状态）。<br />2.点击工具栏上的“套装工具”按钮，选择“登记当前套装”，在对话框里输入该套装的名字就可以了，这样新增的套装也会登记到映射表中了。</p><h2 id="9关于试衣间本地化前后的可用功能对比表"><a class="markdownIt-Anchor" href="#9关于试衣间本地化前后的可用功能对比表"></a> 9.关于试衣间本地化前后的可用功能对比（表）</h2><p>因为试衣间即使没有进行本地化，即使没有导入映射表，它依然可以使用，只要知道装扮的ID就可以分批进行浏览。<br />本地化的目的就是为了使试衣间更像网上的试衣间，让大家有个更好的舒适的环境；但终究它并不是必须的。<br />下表列出的了本地化展示图和映射表的功能对比。</p><p>| | 原始状态 | 展示图生成 | 加载映射表 |<br />|浏览试穿装扮 | √ | √ | √ |<br />|使用ID搜索装扮 | √ | √ | √ |<br />|查看装扮图层信息 | √ | √ | √ |<br />|使用展示图来试穿 | × | √ | √ |<br />|切换TN模式 | × | √ | √ |<br />|套装导入导出工具 | × | √ | √ |<br />|列表显示装扮名称 | × | × | √ |<br />|使用名称搜索装扮 | × | × | √ |<br />|使用图标模式 | × | × | √ |<br />|当前装扮导入到EX | √ | √ | √ |<br />|制作一键类补丁 | √ | √ | √ |</p><h2 id="10后记"><a class="markdownIt-Anchor" href="#10后记"></a> 10.后记</h2><p>这就是一种将纸娃娃搬到本地的一种方案。<br />装扮映射表这个东西本身并不属于NPK解析和贴图处理的范畴，所以我能做的也就只有提供大家自行处理这些事情的接口了。<br />其实这种方案早在黑猫的初始版本(黑猫.0)就有了，但是教程出的较少，操作也比较冗杂，相比之下大家也都懒得弄。<br />这次因为增加了武器和套装工具，对其进行了大量的优化，所以准备系统地出若干个教程，告诉大家应该怎么使用。<br />这个教程告诉大家在使用黑猫.4.1发布的映射表的基础上，如何使用、追加和维护自己的映射表。<br />因为映射表相当于试衣间的字典（其实以前的名字就叫装扮辞典），虽然不会影响到试衣间的核心功能，<br />但却对便利性有非常大的提升，就像以前的盒子那样。</p><p>最后也要声明一点：<br />关于映射表，除了黑猫.4.1（使用了小浅的数据提取的）附带的映射表外，应该被视为作品，作者应对此享有版权。<br />因此，虽然映射表可以共享，可以大家一起利用，但是也希望大家能够做到两条；<br />第一就是，希望以后国服出新的装扮、套装或者武器时，大家能够齐心协力，一起完成映射表的追加工作（比如可以按职业分工）并分享给广大网友；<br />第二就是，如果一个映射表是某位爱好者的心血，而他将映射表分享给大家，也请大家对该作者表示感谢和敬意。</p><p>最最后的声明：<br />恋恋のEx作者（也就是本人啦）不对任何映射表享有版权，黑猫.4.1附带的初始映射表也不例外。</p><h1 id="试衣间本地化文件说明"><a class="markdownIt-Anchor" href="#试衣间本地化文件说明"></a> 试衣间本地化文件说明</h1><p>关于试衣间本地化所用到的文件（文件夹）的说明：</p><h2 id="1-资源文件夹"><a class="markdownIt-Anchor" href="#1-资源文件夹"></a> 1. 资源文件夹</h2><p>即包含所有试衣间所需要的NPK文件的文件夹，一般设置为ImagePacks2文件夹的某个副本；<br />也可以在服务器上下载ImagePack2文件夹内的NPK文件后，将下载地址作为资源文件夹。<br />试衣间使用的所有NPK文件都需要从资源文件夹读取；包括装扮列表、装扮的浏览等信息；<br />展示图的生成也需要在资源文件夹里提取贴图，图标的生成也会在资源文件夹里提取图标贴图；<br />总之，它是试衣间的核心。</p><h2 id="2-avatar文件夹"><a class="markdownIt-Anchor" href="#2-avatar文件夹"></a> 2. Avatar文件夹</h2><p>试衣间本地化锁需要的文件的集合，默认为软件的输出目录下的Avatar文件夹。<br />只要使用试衣间软件就会在输出目录下生成该文件夹和一系列相关的文件。<br />存储试衣间本地化的各种内容。<br />目前包括展示图文件夹、图标文件夹、舞台文件夹、展示图生成设置和各职业的映射表。</p><h2 id="3-展示图文件夹巨大大中小"><a class="markdownIt-Anchor" href="#3-展示图文件夹巨大大中小"></a> 3. 展示图文件夹（巨大/大/中/小）</h2><p>试衣间使用本地化功能生成的展示图的贴图都存放在这里面，按职业和尺寸区分；<br />每个展示图都带有该装扮/武器的ID和浏览的样式。<br />试衣间里的展示图需要先生成展示图文件夹里的展示图片才能显示，否则会显示一个带有“刷新”标志的按钮。<br />展示图可以由软件提取资源NPK内的贴图进行生成，生成有很多操作方法，不再赘述。<br />如果展示图在生成之后被修改的话，那么试衣间里的展示图显示的就会是修改之后的显示图（但浏览图还是没变）。</p><h2 id="4-图标文件夹"><a class="markdownIt-Anchor" href="#4-图标文件夹"></a> 4. 图标文件夹</h2><p>试衣间的图标模式使用的图标贴图都存放在这里面，按职业区分。<br />图标由软件提取资源NPK内的贴图进行生成，可以由本地化功能生成，这里不再赘述。<br />值得注意的是，图标模式中尽管图标能显示，但是有的图标左上角带有叹号的标志，<br />表示软件由于某种原因无法找到图标对应的装扮贴图，点击它会被视为脱下。</p><h2 id="5-舞台文件夹"><a class="markdownIt-Anchor" href="#5-舞台文件夹"></a> 5. 舞台文件夹</h2><p>存放试衣间的浏览图（就是左下角的浏览图）的相关设置文件和贴图。<br />可以将其中的贴图作为浏览图的背景、背景部件、前景部件等。</p><h2 id="6-映射表文件"><a class="markdownIt-Anchor" href="#6-映射表文件"></a> 6. 映射表文件</h2><p>存储在Avatar文件夹下的，按职业区分的若干TXT文件。<br />该文件很重要，并且不能够由软件自己完善（只会生成空的映射表文件）。<br />里面存储了每个职业的装扮ID、名称与图标号的对应关系，以及每个职业的套装信息。<br />如果映射表不全，那么会有以下现象发生：<br />所有装扮/武器均为“未命名”的；<br />图标模式下，所有图标均带有“红色”叹号；<br />套装列表里没有内容，所有装扮均视为“散件”。<br />但是不会影响展示图的展示，试穿，查询ID，生成NPK等核心功能。<br />映射表文件里所需要的信息由于无法从资源NPK里提取（因为本身就不包含的缘故），<br />所以需要用户来自己添加、编辑和维护，软件为此提供了一些便利性功能；<br />当然，也可以直接导入其他来源（例如他人正在使用的或者网上下载现成的）的映射表。</p><h2 id="7模型生成设置文件"><a class="markdownIt-Anchor" href="#7模型生成设置文件"></a> 7.模型生成设置文件</h2><p>存储在Avatar文件夹下的一个TXT文件，里面存放展示图的生成设置信息。<br />展示图生成时采用的坐标偏移和帧号都存储在这里面，例如：<br />生成鞋子的展示图时，整个贴图要上移一定距离；<br />生成头饰的展示图时，整个贴图要下移一定距离；<br />生成手枪、步枪等展示图时，需要采用第25帧（因为第0帧时，神枪手没有掏出武器，自然也就无法展示）等。<br />这些信息都是作者预先调好的，应该是较好的一种状态，因此一般情况不需要修改此文件的内容。<br />如果想让展示图内的模特们做不同的动作，则可以修改该文件的内容。</p><h2 id="8npk资源文件夹"><a class="markdownIt-Anchor" href="#8npk资源文件夹"></a> 8.NPK资源文件夹</h2><p>试衣间的资源下载功能下载的资源NPK都存在这里。<br />如果手头没有DNF或者想体验一下不同服务器的装扮，可以使用该功能进行下载；<br />下载完毕后可以将资源文件夹设置在该目录下。</p><h1 id="试衣间faq"><a class="markdownIt-Anchor" href="#试衣间faq"></a> 试衣间FAQ</h1><p>一些FAQ：</p><p>Q: 打开试衣间后什么都不显示，列表也没有，这是为什么呢？<br />A: 试衣间的资源目录没有设置好，读取不到对应的NPK文件。请先设置资源目录（点击工具栏上的“本地化”按钮，然后点击“设置资源文件夹”）。</p><p>Q: 为什么打开试衣间后，右侧的展示图都不显示，而显示的都是刷新按钮呢？<br />A: 首先确保你的试衣间的资源文件夹是正确的。<br />试衣间所需要的展示图是需要生成的，生成有很多方式：<br />最简单的，右键单击对应的刷新按钮，在下拉菜单中选择更新展示图，就能马上显示，这个方法适用于单张更新。<br />稍微慢一点的，点击工具栏上的“刷新”按钮，可以更新当前浏览的部件的所有展示图。<br />再稍微慢一点但是能一劳永逸的，点击工具栏上的“本地化设置”按钮，点击“更新本(全)职业的展示图和图标”，然后根据需要操作即可。</p><p>Q: 为什么我的装扮列表里的装扮都显示的是未命名呢？<br />A: 因为映射表里没有查询到对应ID的装扮的名称，因此显示的是未命名+ID的格式，不过这个并不影响使用。<br />如果需要在装扮列表里显示名字，就要往映射表里添加内容，自己添加太麻烦的话，就要在网上下载或者在他人那里获得现成的映射表就好了。</p><p>Q: 为什么我的装扮列表里有的名字后带有“[…]”的字样呢？<br />A: 因为有很多装扮都使用这个IMG，比如说，非常多的年套都使用同一种皮肤资源；所有的远古二的武器都使用同一个武器资源等。</p><p>Q: 为什么鬼剑的武器分为这么多类，还有西洋剑、长太刀等类别？跟短剑、太刀类别有何区别？<br />A: 因为历史遗留原因，鬼剑的同一种武器不同的形态也被分配到不同的NPK里了，试衣间武器的类别是随着NPK名称确定的。</p><p>Q: 为什么点击了“和谐开关”按钮，展示图里的装扮并没有发生变化呢？<br />A: 和谐开关主要是用于IMG名带“(TN)”与不带“(TN)”之间的互相切换，如果展示图里的IMG都没有对应的“(TN)”的IMG，自然就没区别了。</p><p>Q: 为什么展示图要生成4种？有必要吗？<br />A: 展示图能切换大小是为了给用户带来便利，大的展示图显示的较广但是每一页显示的少，用以显示大叔武器等体型较大的装扮；<br />小的展示图显示的区域较小但是每一页显示的更多，用来显示腰带、面部装饰等小部件。</p><p>Q: 为什么我一直用的好好的，但是今天启动试衣间，发现展示图里面多了几个未更新的图，这是为什么呢？<br />A: 你的服务器又更新了新的装扮，右键点击这些空位置，为它们更新展示图吧。</p><p>Q: 预览图可以播放动画吗？<br />A: 可以，预览图下面有个“选择动作”的组合框，选择一个动作就可以播放该动作的动画了。</p><p>Q: 预览图的背景颜色能否改变？<br />A: 可以，打开“Avatar”文件夹（软件“特殊工具”按钮里选择“打开输出文件夹”就能看到）后有个“舞台”文件夹，<br />打开后里面有个“location.txt”；在这个文件夹下新建一个超过210×210的纯色PNG图像命名为“bg.png”；<br />然后打开“location.txt”在“[background]”下输入“bg”就可以了。<br />用同样的方式可以设置预览图的其他背景图片，还可以设置背景部件和前景部件等。</p><p>Q: 我在别人那里下载的映射表导入到试衣间后，为什么我的试衣间里的装扮列表显示的是乱码？<br />A: 这个暂时没有同一套可行性方案解决，涉及到区域设置和汉字文字编码问题。以下三种方法可以尝试（都有成功的例子，不保证都会成功）：<br />重新打开映射表文件，点击另存为，在文字编码选择“ANSL”后保存覆盖源文件。<br />更改系统区域和语言设置（控制面板&gt;时钟、语言和区域&gt;区域&gt;管理&gt;更改系统区域设置）为“中文（简体、中国）”。<br />新建一个Word文档，把映射表文件的内容都复制进去，然后选择另存为，并在保存类型选择“纯文本(*.txt)”。</p><p>Q: 为什么图标模式里没有显示图标啊？<br />A: 图标模式里的图标同样需要本地化进行更新，点击工具栏上的“刷新”按钮就可以了。</p><p>Q: 为什么我点击图标模式里的图标，对应的装扮不显示啊？<br />A: 这种情况出现在图标的左上角出现“叹号”标志的情形下，表示试衣间无法在资源里找到这个图标对应的装扮。<br />“红色叹号”表示映射表中无法查到某个装扮与这个图标对应，如果映射表是空的，那所有图标都会带这个标记；<br />“蓝色叹号”出现的更罕见一些，表示映射表中存在于这个图标对应的装扮，但是资源文件夹下没有这个IMG，一般出现在资源NPK和映射表跨服交叉使用的场合。</p><p>Q: 图标模式里的图标都是带红色叹号的，没法用啊，怎么办啊？<br />A: 较累的方案，自己在装扮中依次找该图标对应的装扮，为那个装扮分配该图标和名字，扩充映射表（一般服务器更新的时候就采取这种办法）。<br />较轻松的方案，下载网上已有的映射表合并到自己的映射表中，随着黑猫.3.1一起发布的压缩包内就有(但是只更新到2020年4月，基于国服版本生成)，或者干脆使用别人的映射表。</p><p>Q: 映射表怎么编辑啊？<br />A: 如果你选择亲自编辑映射表，那么你的行为是值得赞赏的，那么下面说下方法：<br />手动的：点击工具栏上“本地化设置”按钮，选择打开映射表，按照“装扮ID,图标序号,装扮名”的格式一条条手动输入（应该不会有人这么做吧）；<br />使用软件的功能：在展示图模式右键点击装扮，选择“登记装扮信息”，然后为其输入名字，然后选择一个图标，这种方式更舒服些，在服务器进行更新后，一般用这种方式为新的装扮追加映射表条目。</p><p>Q: 为什么图标模式里显示的图标不是连续的？<br />A: 在所有的服务器中，同一个图标在IMG内的帧位置是一样的，但是并不是所有图标对应的装扮在所有服务器都有推出，因此图标NPK中对应的帧的位置就是<br />个空图片，因此图标模式里显示的图标并不连续。</p><p>Q: 有什么套装代码可以查么？<br />A: 网上有肥猫发布的套装代码，可以使用试衣间的“套装工具”里的“导入套装共享码”导入即可。导入完毕后记得注册套装，以便以后使用。</p><p>Q: 将浏览的时装导入EX后，感觉IMG顺序不对啊，拼合后会穿模啊，怎么办呀？<br />A: 软件给出的拼合次序仅供参考，当然大体是正确的，细微之处需要用户自行调节。<br />另外黑猫.4.2之后的版本，软件的拼合图层操作次序和自动排序已经跟旧EX一致，与当前的试衣间导出顺序也一致了。</p><p>Q: 如何使用试衣间制作君YY式换装补丁（即A换B）？<br />A: 假设你要制作A装扮改B装扮的补丁，先在试衣间试穿全套B装扮，然后点击工具栏上的“补丁制作工具”按钮，选择“生成易于制作换装类的NPK文件”，<br />然后在EX中把“本体图层.IMG”提取出来；然后回到试衣间试穿全套A装扮，然后点击工具栏上的“补丁制作工具”按钮，选择“生成易于制作换装类的NPK文件”，<br />把“本体图层.IMG”替换为先前提取的IMG文件，替换后将NPK另存为一个文件名例如“a(XXX).NPK”，丢到ImagePack2文件夹后就可以了。</p><p>Q: 如何使用试衣间制作职业全时装换装补丁(即全时装换B)？<br />A: 假设你要制作全装扮改B装扮的补丁，先在试衣间试穿全套B装扮，然后点击工具栏上的“补丁制作工具”按钮，选择“生成去安装板改当前装扮的NPK文件”，<br />然后在EX中将NPK另存为一个文件名例如“a(XXX).NPK”，丢到ImagePack2文件夹后就可以了。<br />这个NPK文件也是个模板，将这个NPK文件里的“本体图层.IMG”文件替换成其他的IMG文件，就成为了全装扮改那个IMG文件的补丁了。</p><p>Q: 黑猫.4.1带的映射表文件里有好多重复项啊？有没有办法把重复的删除掉？<br />A: 整理重复而已。点击工具栏上的“本地化设置”按钮，在菜单中选择“映射表整理(去重复项)…”就可以了。</p><p>Q: 网上有新的映射表，怎么导入到我的映射表中？<br />A: 点击工具栏上的“本地化设置”按钮，在菜单中选择“合并其他映射表文件…”，记得职业要匹配。</p><p>Q: 这个工具栏的按钮的含义能再解释一下吗？<br />A: 自左到右依次是“切换展示图尺寸”、“和谐开关”、“展示图模式”、“图标模式”、“脱下”、“更新”、“前一页”、“后一页”、“套装工具”、“补丁制作工具”、“本地化设置”</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这篇教程就建立在试衣间本地化的基础上，对试衣间的功能进行描述。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>GitHub JSDelivr 更新</title>
    <link href="https://no5972.moe/cms/archivers/8.html"/>
    <id>https://no5972.moe/cms/archivers/8.html</id>
    <published>2020-06-12T09:15:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>在github编辑好文件以后在最后一个编辑的文件提交之前选择“Create a new branch for this commit and start a pull request.”创建一个分支，输入一个分支名称。然后访问URL即可更新为“<a href="https://cdn.jsdelivr.net/gh/%5B%E4%BD%A0%E7%9A%84github%E7%94%A8%E6%88%B7%E5%90%8D%5D/%5B%E4%BD%A0%E7%9A%84github%E4%BB%93%E5%BA%93%5D@%5B%E4%BD%A0%E5%88%9B%E5%BB%BA%E7%9A%84%E5%88%86%E6%94%AF%5D/%5B%E4%BD%A0%E7%9A%84%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%5D%E2%80%9D%E3%80%82" target="_blank" rel="noopener">https://cdn.jsdelivr.net/gh/[你的github用户名]/[你的github仓库]@[你创建的分支]/[你的文件路径]”。</a></p><div class="note warning"><p>注意仓库至少有一个Release才能被JSDelivr爬取到。</p></div><p>为节省服务器资源，建议在更新之后删除旧版不需要的分支。在git bash进入到本地仓库的目录执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin --delete [旧版分支名称]</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      在github编辑好文件以后在最后一个编辑的文件提交之前选择“Create a new branch for this commit and start a pull request.”创建一个分支，输入一个分支名称。然后访问URL即可更新为“https://cdn.jsdelivr.net/gh/[你的github用户名]/[你的github仓库]@[你创建的分支]/[你的文件路径]”。
    
    </summary>
    
    
      <category term="Web Building" scheme="https://no5972.moe/cms/categories/Web-Building/"/>
    
      <category term="Github" scheme="https://no5972.moe/cms/categories/Github/"/>
    
    
  </entry>
  
  <entry>
    <title>子佩录音盒二次开发（C#）</title>
    <link href="https://no5972.moe/cms/archivers/7.html"/>
    <id>https://no5972.moe/cms/archivers/7.html</id>
    <published>2020-06-06T03:00:00.000Z</published>
    <updated>2024-09-26T10:05:07.335Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>对子佩录音盒进行二次开发需要使用到其SDK中的两个DLL文件，qnviccub.dll，bridge.dll。在C#中导入DLL的API声明参考SDK中的BriSDKLib.cs。文件内容较长这里不再贴出。</p><p>子佩录音盒对于事件的监听是基于Win32的消息的。因此我们在接收程序中Windows消息的时候要判断消息类型（类型是一个UINT类型的无符号整数），而子佩录音盒的SDK里面也封装了一些消息类型的常量，我们只需要填写常量的名称即可。例如收到了来电的消息就是BriSDKLib.BriEvent_CallIn，得到了来电的电话号码就是BriSDKLib.BriEvent_GetCallID，等等。</p><p>C语言里面是在注册类的时候通过给WNDCLASSEX的lpfnWndProc属性绑定消息处理函数来监听消息从而做相应动作的。而我们在C#里面可以直接在WinForm代码里面重写DefWndProc方法来做消息处理，例如：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">protected override void DefWndProc(ref System.Windows.Forms.Message m)</span><br><span class="line">&#123;</span><br><span class="line">    switch (m.Msg)</span><br><span class="line">    &#123;</span><br><span class="line">        case BriSDKLib.BRI_EVENT_MESSAGE: &#x2F;&#x2F; 先判断是不是录音盒的消息</span><br><span class="line">        &#123;</span><br><span class="line">            BriSDKLib.TBriEvent_Data EventData &#x3D;</span><br><span class="line">                (BriSDKLib.TBriEvent_Data) Marshal.PtrToStructure(m.LParam, typeof(BriSDKLib.TBriEvent_Data));</span><br><span class="line">            string strValue &#x3D; &quot;&quot;;</span><br><span class="line">            switch (EventData.lEventType)</span><br><span class="line">            &#123;</span><br><span class="line">                case BriSDKLib.BriEvent_CallIn: &#123; ... break; &#125; &#x2F;&#x2F; 收到座机来电响铃的消息</span><br><span class="line">                case BriSDKLib.BriEvent_GetCallID: &#123; ... break; &#125; &#x2F;&#x2F; 收到座机来电号码的消息</span><br><span class="line">                &#x2F;&#x2F; 其他更多的消息类型</span><br><span class="line">                default: break;</span><br><span class="line">            &#125;</span><br><span class="line">            if (strValue.Length &gt; 0)</span><br><span class="line">            &#123;</span><br><span class="line">                AppendStatus(strValue);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; break;</span><br><span class="line">        default: &#x2F;&#x2F; 如果不是录音盒的消息则还按设计器里面添加的事件来处理</span><br><span class="line">            base.DefWndProc(ref m);</span><br><span class="line">            break;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>一个简单demo，没有界面，只有一个托盘图标，托盘图标只有一个退出菜单项。如果座机接到来电时，就将来电的电话号码读取出来。这里只是做了一个弹出消息框显示电话号码。将来还可以扩展成将 来电的时间、收到来电的座机所插的接口和电话号码存入数据库。</p><p>把BriSDKLib.cs复制进项目，然后在WinForm添加一个菜单控件（父级菜单和一个退出菜单项）和一个系统托盘图标控件，添加Form的Load事件、FormClosed事件、Shown事件，添加退出菜单项的点击事件。然后编写代码。</p><p>运行前将进户线接到录音盒的LINE口，把座机的电话线接到录音盒的PHONE口，把录音盒的USB口通过随机提供的数据线接到电脑的USB接口。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line">using System;</span><br><span class="line">using System.Collections.Generic;</span><br><span class="line">using System.ComponentModel;</span><br><span class="line">using System.Data;</span><br><span class="line">using System.Drawing;</span><br><span class="line">using System.Linq;</span><br><span class="line">using System.Runtime.InteropServices;</span><br><span class="line">using System.Text;</span><br><span class="line">using System.Threading.Tasks;</span><br><span class="line">using System.Windows.Forms;</span><br><span class="line"></span><br><span class="line">namespace GetPhoneNumber</span><br><span class="line">&#123;</span><br><span class="line">    public partial class Form1 : Form</span><br><span class="line">    &#123;</span><br><span class="line">        public static string FromUnicodeByteArray(byte[] characters)</span><br><span class="line">        &#123;</span><br><span class="line">            UnicodeEncoding u &#x3D; new UnicodeEncoding();</span><br><span class="line">            string ustring &#x3D; u.GetString(characters);</span><br><span class="line">            return ustring;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        public static string FromASCIIByteArray(byte[] characters)</span><br><span class="line">        &#123;</span><br><span class="line">            ASCIIEncoding encoding &#x3D; new ASCIIEncoding();</span><br><span class="line">            string constructedString &#x3D; encoding.GetString(characters);</span><br><span class="line">            return (constructedString);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        public Form1()</span><br><span class="line">        &#123;</span><br><span class="line">            InitializeComponent();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private void Form1_Load(object sender, EventArgs e)</span><br><span class="line">        &#123;</span><br><span class="line">            if (BriSDKLib.QNV_OpenDevice(BriSDKLib.ODT_LBRIDGE, 0, &quot;&quot;) &lt;&#x3D; 0 || BriSDKLib.QNV_DevInfo(0, BriSDKLib.QNV_DEVINFO_GETCHANNELS) &lt;&#x3D; 0)</span><br><span class="line">            &#123;</span><br><span class="line">                &#x2F;&#x2F; AppendStatus(&quot;打开设备失败&quot;);</span><br><span class="line">                MessageBox.Show(&quot;打开设备失败&quot;);</span><br><span class="line">                return;</span><br><span class="line">            &#125;</span><br><span class="line">            for (Int16 i &#x3D; 0; i &lt; BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)</span><br><span class="line">            &#123;</span><br><span class="line">                &#x2F;&#x2F;在windowproc处理接收到的消息</span><br><span class="line">                BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, &quot;&quot;, new StringBuilder(0), 0);</span><br><span class="line">                &#x2F;&#x2F; selchannel.Items.Add(i+1);               </span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private void Form1_FormClosed(object sender, FormClosedEventArgs e)</span><br><span class="line">        &#123;</span><br><span class="line">            BriSDKLib.QNV_CloseDevice(BriSDKLib.ODT_ALL, 0);</span><br><span class="line">            for (Int16 i &#x3D; 0; i &lt; BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)</span><br><span class="line">            &#123;</span><br><span class="line">                &#x2F;&#x2F;在windowproc处理接收到的消息</span><br><span class="line">                BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, &quot;&quot;, new StringBuilder(0), 0);</span><br><span class="line">                &#x2F;&#x2F; selchannel.Items.Add(i+1);               </span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        protected override void DefWndProc(ref System.Windows.Forms.Message m)</span><br><span class="line">        &#123;</span><br><span class="line">            switch (m.Msg)</span><br><span class="line">            &#123;</span><br><span class="line">                case BriSDKLib.BRI_EVENT_MESSAGE:</span><br><span class="line">                &#123;</span><br><span class="line">                    BriSDKLib.TBriEvent_Data EventData &#x3D;</span><br><span class="line">                        (BriSDKLib.TBriEvent_Data) Marshal.PtrToStructure(m.LParam, typeof(BriSDKLib.TBriEvent_Data));</span><br><span class="line">                    string strValue &#x3D; &quot;&quot;;</span><br><span class="line">                    switch (EventData.lEventType)</span><br><span class="line">                    &#123;</span><br><span class="line">                        case BriSDKLib.BriEvent_GetCallID:</span><br><span class="line">                        &#123;</span><br><span class="line">                            strValue &#x3D; &quot;通道&quot; + (EventData.uChannelID + 1).ToString() + &quot;：接收到来电号码 &quot; +</span><br><span class="line">                                       FromASCIIByteArray(EventData.szData);</span><br><span class="line">                            MessageBox.Show(strValue);</span><br><span class="line">                            this.Activate();</span><br><span class="line"></span><br><span class="line">                        &#125;</span><br><span class="line">                            break;</span><br><span class="line">                        default: break;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                    break;</span><br><span class="line">                default: </span><br><span class="line">                    base.DefWndProc(ref m);</span><br><span class="line">                    break;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)</span><br><span class="line">        &#123;</span><br><span class="line">            BriSDKLib.QNV_CloseDevice(BriSDKLib.ODT_ALL, 0);</span><br><span class="line">            for (Int16 i &#x3D; 0; i &lt; BriSDKLib.QNV_DevInfo(-1, BriSDKLib.QNV_DEVINFO_GETCHANNELS); i++)</span><br><span class="line">            &#123;</span><br><span class="line">                &#x2F;&#x2F;在windowproc处理接收到的消息</span><br><span class="line">                BriSDKLib.QNV_Event(i, BriSDKLib.QNV_EVENT_REGWND, (Int32) this.Handle, &quot;&quot;, new StringBuilder(0), 0);</span><br><span class="line">                &#x2F;&#x2F; selchannel.Items.Add(i+1);               </span><br><span class="line">            &#125;</span><br><span class="line">            Application.Exit();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private void Form1_Shown(object sender, EventArgs e)</span><br><span class="line">        &#123;</span><br><span class="line">            Hide();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      对子佩录音盒进行二次开发需要使用到其SDK中的两个DLL文件，qnviccub.dll，bridge.dll。在C#中导入DLL的API声明参考SDK中的BriSDKLib.cs。文件内容较长这里不再贴出。
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>探讨在国内使用Flash Player的解决方案 - 一些找到的线索</title>
    <link href="https://no5972.moe/cms/archivers/6.html"/>
    <id>https://no5972.moe/cms/archivers/6.html</id>
    <published>2020-05-26T04:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>目前在国内仍然有大量的而且是非用不可的业务必须依赖Flash Player。Flash确实是要在2020年底要停止支持了，但是这并不是说Flash要淘汰了你就可以不用了，也不是说你觉得这个网页需要依赖Flash你就不进这个网站了，有些时候你遇到某些非用不可的业务你还非用不可。例如各种网课平台、政务平台、以及这段时间出现的一些虚拟实验平台（特别是一些学校的内网的平台），这些你还说Flash淘汰了不要去，你敢不用试试？【手动狗头】（有的学生因为不能运行Flash导致网课旷课进而导致被学校退学）</p><ol><li><p>Edge浏览器集成：新的Edge浏览器已经集成了PPAPI的Flash Player，一些需要使用Flash Player的网站会出现点击加载Flash 的灰框，点击确认加载即可。有时候会报地区不相容，如果遇到这个情况应手动替换成那种不报地区不相容的pepflashplayer.dll（搜索关键字：替换插件解决Microsoft Edge浏览器Flash Player地区不兼容问题）。</p></li><li><p>地区不相容的问题也可以通过hosts解决，<a href="http://xn--geo2-fw9g.adobe.com" target="_blank" rel="noopener">将geo2.adobe.com</a>，<a href="http://flash.cn" target="_blank" rel="noopener">flash.cn</a>，<a href="http://www.flash.cn" target="_blank" rel="noopener">www.flash.cn</a>，<a href="http://flash.2144.com" target="_blank" rel="noopener">flash.2144.com</a>，<a href="http://www.2144.cn" target="_blank" rel="noopener">www.2144.cn</a>，<a href="http://fpdownload2.macromedia.com" target="_blank" rel="noopener">fpdownload2.macromedia.com</a>，<a href="http://fpdownload.macromedia.com" target="_blank" rel="noopener">fpdownload.macromedia.com</a>，macromedia.com这些域名都引到127.0.0.1，据说有效。</p></li><li><p>现在版本的PPAPI插件同样含有窃取隐私的服务。但截至撰稿时还可以搜索到一些Flash Player PPAPI版本27的插件，这个经专业鉴定是没有捆绑弹窗广告和窃取隐私服务的（搜索关键字：flashplayerPPAPI_27.0.0.159），注意安装完成后要选择从不更新，否则他会自动更新到特供版。</p></li><li><p>截至撰稿时国内目前仍然可以下载到睿派克技术论坛制作的Flash Player破解版。这个版本针对限制地区、弹窗广告和窃取隐私服务进行了破解（搜索关键字：Adobe Flash Player AX/NP/PP v32.0.0.223特别版）。</p></li><li><p>用特殊手段直接下载到外国的Flash Player，保证下载页面的域名不是.cn的。操作比较复杂，但是不保证有效（可能装上去之后用也是报地区不相容，参考解决方案第二条）。</p></li><li><p>目前的开源Flash解决方案普遍还不成熟，主要的两套方案LightSpark实测装上去之后FireFox并不能识别（Windows安装版），Gnash直接没有Windows的解决方案而且Linux里面也是一大堆依赖要装，安装过程甚至可以说是劝退级别。（搜索关键字：GNASH 移植）</p></li><li><p>据说在Firefox浏览器中，点击Flash对象所在区域，由系统自动搜索可用的Flash插件，搜索到后，将弹出Flash插件安装窗口，在窗口中就会列出支持Firefox浏览器的Flash插件，包括 Adobe Flash Player、Swfdec player for Adobe/Macromedia flash、Gnash SWF Player等可供选择。（搜索关键字：在Ubuntu系统中玩转Flash视频播放）</p></li><li><p>或者最简单的办法，但是可能比较占用比较多的系统资源。那就是用虚拟机安装一个XP系统然后直接在虚拟机里面装一个特供版Flash。随他去怎么弹广告盗隐私吧。<sup>_</sup> 反正只有专门需要用Flash的场合才会用到，平时我们也不会用这个虚拟机。</p></li></ol><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Flash即将在年底停止支持，但是国内依旧有很多平台在依赖Flash，究竟国内还有多少平台还在依赖Flash？目前在国内仍然有大量的而且是非用不可的业务必须依赖Flash Player。Flash确实是要在2020年底要停止支持了，但是这并不是说Flash要淘汰了你就可以不用了，也不是说你觉得这个网页需要依赖Flash你就不进这个网站了，有些时候你遇到某些非用不可的业务你还非用不可。例如各种网课平台、政务平台、以及这段时间出现的一些虚拟实验平台（特别是一些学校的内网的平台），这些你还说Flash淘汰了不要去，你敢不用试试？【手动狗头】（有的学生因为不能运行Flash导致网课旷课进而导致被学校退学）
    
    </summary>
    
    
      <category term="Moving Away from Flash" scheme="https://no5972.moe/cms/categories/Moving-Away-from-Flash/"/>
    
    
  </entry>
  
  <entry>
    <title>哔哩哔哩：弹幕屏蔽：百家姓：直接导入XML</title>
    <link href="https://no5972.moe/cms/archivers/5.html"/>
    <id>https://no5972.moe/cms/archivers/5.html</id>
    <published>2020-05-22T06:51:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>注意到B站有些视频特别是动物圈频道的视频，弹幕里面会大量的刷出人名，且不说这对名誉有影响，这是严重污染弹幕环境。</p><p>这里将《百家姓》的姓氏整理成哔哩哔哩弹幕屏蔽适用的正则表达式的批量导入XML，只需要从网页端导入XML即可有效屏蔽掉刷人名的弹幕。</p><p>使用方法：复制这段代码保存为XML格式，注意保存编码选择UTF-8。在网页端随便点开一个视频，点击弹幕列表右边的三个小点按钮，选择屏蔽设定，右击下方列表的空白处选择导入XML文件。将这个XML文件导入即可实现屏蔽人名弹幕。如果需要取消屏蔽，点击这个屏蔽条目的状态的启用，使其切换到关闭即可。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">filters</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">item</span> <span class="attr">enabled</span>=<span class="string">"true"</span>&gt;</span>r=赵|钱|孙|李|周|吴|郑|王|冯|陈|楮|卫|蒋|沈|韩|杨|朱|秦|尤|许|何|吕|施|张|孔|曹|严|华|金|魏|陶|姜|戚|谢|邹|喻|柏|水|窦|章|云|苏|潘|葛|奚|范|彭|郎|鲁|韦|昌|马|苗|凤|花|方|俞|任|袁|柳|酆|鲍|史|唐|费|廉|岑|薛|雷|贺|倪|汤|滕|殷|罗|毕|郝|邬|安|常|乐|于|时|傅|皮|卞|齐|康|伍|余|元|卜|顾|孟|平|黄|和|穆|萧|尹|姚|邵|湛|汪|祁|毛|禹|狄|米|贝|明|臧|计|伏|成|戴|谈|宋|茅|庞|熊|纪|舒|屈|项|祝|董|梁|杜|阮|蓝|闽|席|季|麻|强|贾|路|娄|危|江|童|颜|郭|梅|盛|林|刁|锺|徐|丘|骆|高|夏|蔡|田|樊|胡|凌|霍|虞|万|支|柯|昝|管|卢|莫|经|房|裘|缪|干|解|应|宗|丁|宣|贲|邓|郁|单|杭|洪|包|诸|左|石|崔|吉|钮|龚|程|嵇|邢|滑|裴|陆|荣|翁|荀|羊|於|惠|甄|麹|家|封|芮|羿|储|靳|汲|邴|糜|松|井|段|富|巫|乌|焦|巴|弓|牧|隗|山|谷|车|侯|宓|蓬|全|郗|班|仰|秋|仲|伊|宫|宁|仇|栾|暴|甘|斜|厉|戎|祖|武|符|刘|景|詹|束|龙|叶|幸|司|韶|郜|黎|蓟|薄|印|宿|白|怀|蒲|邰|从|鄂|索|咸|籍|赖|卓|蔺|屠|蒙|池|乔|阴|郁|胥|能|苍|双|闻|莘|党|翟|谭|贡|劳|逄|姬|申|扶|堵|冉|宰|郦|雍|郤|璩|桑|桂|濮|牛|寿|通|边|扈|燕|冀|郏|浦|尚|农|温|别|庄|晏|柴|瞿|阎|充|慕|连|茹|习|宦|艾|鱼|容|向|古|易|慎|戈|廖|庾|终|暨|居|衡|步|都|耿|满|弘|匡|国|文|寇|广|禄|阙|东|欧|殳|沃|利|蔚|越|夔|隆|师|巩|厍|聂|晁|勾|敖|融|冷|訾|辛|阚|那|简|饶|空|曾|毋|沙|乜|养|鞠|须|丰|巢|关|蒯|相|查|后|荆|红|游|竺|权|逑|盖|益|桓|公|万俟|司马|上官|欧阳|夏侯|诸葛|闻人|东方|赫连|皇甫|尉迟|公羊|澹台|公冶|宗政|濮阳|淳于|单于|太叔|申屠|公孙|仲孙|轩辕|令狐|锺离|宇文|长孙|慕容|鲜于|闾丘|司徒|司空|丌官|司寇|仉|督|子车|颛孙|端木|巫马|公西|漆雕|乐正|壤驷|公良|拓拔|夹谷|宰父|谷梁|晋|楚|阎|法|汝|鄢|涂|钦|段干|百里|东郭|南门|呼延|归|海|羊舌|微生|岳|帅|缑|亢|况|后|有|琴|梁丘|左丘|东门|西门|商|牟|佘|佴|伯|赏|南宫|墨|哈|谯|笪|年|爱|阳|佟|第五|言|福<span class="tag">&lt;/<span class="name">item</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">filters</span>&gt;</span></span><br></pre></td></tr></table></figure><p>或者也可以直接从这个链接下载然后按上述方法导入：<br /><a href="https://no5972.github.io/cms/static/tv.bilibili.player.baijiaxin.xml" target="_blank" rel="noopener">https://no5972.github.io/cms/static/tv.bilibili.player.baijiaxin.xml</a></p><p><a href="https://imgchr.com/i/B9LcnI" target="_blank" rel="noopener"><img src="https://s1.ax1x.com/2020/10/21/B9LcnI.png" alt="B9LcnI.png" /></a></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      这里将《百家姓》的姓氏整理成哔哩哔哩弹幕屏蔽适用的正则表达式的批量导入XML，只需要从网页端导入XML即可有效屏蔽掉刷人名的弹幕。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>本站工具整合导航</title>
    <link href="https://no5972.moe/cms/archivers/4.html"/>
    <id>https://no5972.moe/cms/archivers/4.html</id>
    <published>2020-04-16T09:19:00.000Z</published>
    <updated>2025-06-03T03:52:09.712Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本站开发上线的工具逐渐增多，为改善排版，现将已有的工具链接进行整合，在本文章进行统一集中。大家可以从本文章点击链接进入相应的工具。</p><hr /><p><strong>GIF Extractor / GIF提取器 网页版</strong></p><p><a href="/GIFExtractor/index.html" target="_blank">https://no5972.github.io/GIFExtractor/index.html</a></p><p><strong>DNFHellEmulator / DNF 深渊模拟器 网页版</strong></p><p><a href="/the-hell-emulator/the-hell-emulator.html" target="_blank">https://no5972.github.io/the-hell-emulator/the-hell-emulator.html</a></p><p><strong>Online QQShow Grabber by QQ Number / 在线通过QQ号获取QQ秀 - GIF格式</strong></p><p><a href="/qqshow-api/qqshow-api.html" target="_blank">https://no5972.github.io/qqshow-api/qqshow-api.html</a></p><p><strong>Online Local MIDI File Player Without MIDI Support / 在线播放本地MIDI文件（无需MIDI支持）</strong></p><p><a href="/midi-player/midi-player.html" target="_blank">https://no5972.github.io/midi-player/midi-player.html</a></p><p><strong>Pixiv Daily Top 50 / Pixiv 日榜 Top 50</strong></p><p><a href="/pixiv-daily-top50/pixiv-daily-top50.html" target="_blank">https://no5972.github.io/pixiv-daily-top50/pixiv-daily-top50.html</a></p><p><strong>Flower Fairy Week Cover Picture 小花仙 页游 每周封面</strong></p><p><a href="/xhxCover/cover.png" target="_blank">https://no5972.github.io/xhxCover/cover.png</a></p><p><strong>Mini Game: Touhou Akamakyou / 小游戏 東方赤魔郷 网页版</strong></p><p><a href="/TouhouDemo/index.html" target="_blank">https://no5972.github.io/TouhouDemo/index.html</a></p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Genshin Impact Wish Simulator / 原神许愿抽卡模拟器    </div>    <div class='spoiler-content'>        <p><strong>Genshin Impact Wish Simulator / 原神许愿抽卡模拟器</strong></p><p>Not by myself - By <a href="https://github.com/uzair-ashraf/genshin-impact-wish-simulator" target="_blank" rel="noopener">@uzair-ashraf</a> / 非本站开发——由 <a href="https://github.com/uzair-ashraf/genshin-impact-wish-simulator" target="_blank" rel="noopener">@uzair-ashraf</a> 开发</p><p>Copyright belongs to the original author / 版权归原作者所有</p><p>Star animation videos are removed due to the Fair Use Policy of Vercel / 抽卡 CG 视频去掉了，因为 Vercel 规定不允许存放媒体内容</p><p>FOR ENTERTAINMENT ONLY - THE PROBABLITIES ARE NOT RELATED TO THE ACTUAL GAME CONTENT / 仅作娱乐使用，概率与实际游戏内容无关</p><p><a href="/Genshin-Impact-Wish-Simulator/dist/index.html" target="_blank">https://no5972.github.io/Genshin-Impact-Wish-Simulator/dist/index.html</a></p>    </div></div><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      本站开发上线的工具逐渐增多，为改善排版，现将已有的工具链接进行整合，在本文章进行统一集中。大家可以从本文章点击链接进入相应的工具。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>中控CR10MW发卡器开发 (C#)</title>
    <link href="https://no5972.moe/cms/archivers/3.html"/>
    <id>https://no5972.moe/cms/archivers/3.html</id>
    <published>2020-03-31T01:31:00.000Z</published>
    <updated>2024-09-26T10:05:23.005Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>中控CR10MW提供的两个DLL库, mi.dll, USB.dll, 这两个需要用来作为调用发卡器的控制接口.<br />mi.dll是开发需要调用的接口, USB.dll是前者依赖的DLL.<br />mi.dll提供的API各种函数 (这里用C# 表示)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_OpenComm&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern long OpenComm(ref byte comm, long nBoudrate);</span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_CloseComm&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int CloseComm(long handle);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_PCDRead&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_PCDRead(int handle, int deviceAddr, byte mode, byte blk_Addr, byte Num_blk, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_PCDWrite&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_PCDWrite(int handle, int deviceAddr, byte mode, byte blk_Addr, byte Num_blk, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;设置通讯地址</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_SetDeviceAddress&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_SetDeviceAddress(int handle, int deviceAddr, byte new_Addr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;计算机的比特率</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_SetBandrate&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_SetBandrate(int handle, int deviceAddr, byte newBaud, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;设置灯的工作状态，包括，灯亮的周期以及循环的次数</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_ControlLED&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_ControlLED(int handle, int deviceAddr, byte freq, byte duration, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;设置灯的工作状态，包括，灯亮的周期以及循环的次数</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_ControlBuzzer&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_ControlBuzzer(int handle, int deviceAddr, byte freq, byte duration, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;读取由厂家预设的1个字节的读卡器地址和8个字节序列号</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_GetSerNum&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_GetSerNum(int handle, int deviceAddr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;读取由厂家预设的1个字节的读卡器地址和8个字节序列号</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_SetSerNum&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_SetSerNum(int handle, int deviceAddr, ref byte newvalue, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;自动读取卡Ultralight的卡号</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;UL_Request&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int UL_Request(int handle, int deviceAddr, byte mode, ref byte snr);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;选择卡，使卡进入被中断的状态…</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;MF_Halt&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int MF_Halt(int handle, int deviceAddr);</span><br><span class="line">&#x2F;&#x2F;读取卡中指定扇区的数据</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;UL_HLRead&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int UL_HLRead(int handle, int deviceAddr, byte mode, byte blk_Addr, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;写取卡中指定扇区的数据</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;UL_HLWrite&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int UL_HLWrite(int handle, int deviceAddr, byte mode, byte blk_Addr, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;写取卡中指定扇区的数据</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;ISO15693_Inventory&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int ISO15693_Inventory(int handle, int deviceAddr, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;读取数据</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_ISO15693Read&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_ISO15693Read(int handle, int deviceAddr, byte flags, int blk_Addr, int Num_blk, ref byte uid, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;写数据</span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_ISO15693Write&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_ISO15693Write(int handle, int deviceAddr, byte flags, int blk_Addr, int Num_blk, ref byte uid, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_PCDInitVal&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_PCDInitVal(int handle, int deviceAddr, byte mode, byte Num_blk, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_PCDDec&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_PCDDec(int handle, int deviceAddr, byte mode, byte Num_blk, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;API_PCDInc&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int API_PCDInc(int handle, int deviceAddr, byte mode, byte Num_blk, ref byte snr, ref byte Buffer);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[System.Runtime.InteropServices.DllImport(&quot;mi.dll&quot;, EntryPoint &#x3D; &quot;GET_SNR&quot;, ExactSpelling &#x3D; true, CharSet &#x3D; System.Runtime.InteropServices.CharSet.Ansi, SetLastError &#x3D; true)]</span><br><span class="line">public static extern int GET_SNR(int handle, int deviceAddr, byte mode, byte half, ref byte snr, ref byte Buffer);</span><br></pre></td></tr></table></figure><p>读取卡号的代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">int ret &#x3D; 0;</span><br><span class="line">int blk_Addr &#x3D; 0;</span><br><span class="line">int devAddr &#x3D; 0;</span><br><span class="line">byte mode &#x3D; 0;</span><br><span class="line">byte Num_blk &#x3D; 0;</span><br><span class="line"></span><br><span class="line">byte[] asnr &#x3D; new byte[21];</span><br><span class="line">byte[] aRecvBuffer &#x3D; new byte[2049];</span><br><span class="line"></span><br><span class="line">mode &#x3D; 0x0;</span><br><span class="line">&#x2F;&#x2F;设备地址，如果只有一个</span><br><span class="line">devAddr &#x3D; Convert.ToInt32(myVal(&quot;00&quot;));</span><br><span class="line">&#x2F;&#x2F;读取开始地址</span><br><span class="line">blk_Addr &#x3D; 0;</span><br><span class="line">int hComm &#x3D; 0;</span><br><span class="line"></span><br><span class="line">&#x2F;&#x2F;读取块数</span><br><span class="line">Num_blk &#x3D; 1;</span><br><span class="line">&#x2F;&#x2F;一个指针，传递的是六个字节的密钥</span><br><span class="line">ret &#x3D; Convert.ToInt32(hexToBin(&quot;FF FF FF FF FF FF&quot;, ref asnr));</span><br><span class="line">ret &#x3D; InterviewCardReader.API_PCDRead(0, devAddr, mode, (byte)blk_Addr, Num_blk, ref asnr[0], ref aRecvBuffer[0]);</span><br><span class="line">uint cardNum &#x3D; BitConverter.ToUInt32(asnr, 0);</span><br><span class="line">MessageBox.Show(&quot;卡号: &quot; + cardNum);</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">public int myVal(string str)</span><br><span class="line">&#123;</span><br><span class="line">    int retVal &#x3D; 0;</span><br><span class="line"></span><br><span class="line">    if (str.Length &#x3D;&#x3D; 1)</span><br><span class="line">    &#123;</span><br><span class="line">        if (string.CompareOrdinal(str, &quot;0&quot;) &gt;&#x3D; 0 &amp;&amp; string.CompareOrdinal(str, &quot;9&quot;) &lt;&#x3D; 0)</span><br><span class="line">        &#123;</span><br><span class="line">            retVal &#x3D; Convert.ToInt32(NumericHelper.Val(str));</span><br><span class="line">        &#125;</span><br><span class="line">        else if (string.CompareOrdinal(str, &quot;a&quot;) &gt;&#x3D; 0 &amp;&amp; string.CompareOrdinal(str, &quot;z&quot;) &lt;&#x3D; 0)</span><br><span class="line">        &#123;</span><br><span class="line">            retVal &#x3D; Microsoft.VisualBasic.Strings.Asc(str) - Microsoft.VisualBasic.Strings.Asc(&quot;a&quot;) + 10;</span><br><span class="line">        &#125;</span><br><span class="line">        else if (string.CompareOrdinal(str, &quot;A&quot;) &gt;&#x3D; 0 &amp;&amp; string.CompareOrdinal(str, &quot;Z&quot;) &lt;&#x3D; 0)</span><br><span class="line">        &#123;</span><br><span class="line">            retVal &#x3D; Microsoft.VisualBasic.Strings.Asc(str) - Microsoft.VisualBasic.Strings.Asc(&quot;A&quot;) + 10;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    return retVal;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      中控CR10MW提供的两个DLL库, mi.dll, USB.dll, 这两个需要用来作为调用发卡器的控制接口.
    
    </summary>
    
    
      <category term="C#" scheme="https://no5972.moe/cms/categories/C/"/>
    
      <category term="Hardware" scheme="https://no5972.moe/cms/categories/Hardware/"/>
    
    
  </entry>
  
  <entry>
    <title>HTML5 datalist 使用jquery快速获取选中项元素</title>
    <link href="https://no5972.moe/cms/archivers/2.html"/>
    <id>https://no5972.moe/cms/archivers/2.html</id>
    <published>2019-10-29T08:30:00.000Z</published>
    <updated>2023-09-06T08:39:28.127Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>注意到获取datalist目前仍然比较多的使用遍历datalist里面的option来获取选中项的元素(DOM). 如果项目数量比较多的时候效率会比较慢. 如果页面引用的有jquery的话可以直接使用jquery的选择器来快速获取选中项元素. 但是有一个前提, 就是所有option 的某个属性值一定是唯一的, 不能出现重复. 否则将会把全部对应选项都返回出来.</p><p>范例: 已经给一个input输入 框绑定了一个datalist, 现希望在change事件弹出对话框显示datalist选中项的标题.</p><p>HTML:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">id</span>=<span class="string">"type"</span> <span class="attr">list</span>=<span class="string">"dataList"</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">datalist</span> <span class="attr">id</span>=<span class="string">"dataList"</span>&gt;</span> <span class="comment">&lt;!-- 此范例value属性值必须唯一 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">"id_1"</span>&gt;</span>选项1<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">"id_2"</span>&gt;</span>选项2<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">"id_3"</span>&gt;</span>选项3<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">"id_4"</span>&gt;</span>选项4<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">datalist</span>&gt;</span></span><br></pre></td></tr></table></figure><p>JS:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="string">"#type"</span>).change(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">alert($(<span class="string">"#dataList option[value="</span> + <span class="keyword">this</span>.value + <span class="string">"]"</span>).text());</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>效果:</p><p><img src="https://picx.zhimg.com/80/v2-ec599a82b306c2e161274c6083def1cb.gif" alt="在这里插入图片描述" /></p><p>测试从6 192个选项中定位的计时:</p><p>遍历: 3 680ms</p><p>jquery选择器: 38ms</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      注意到获取datalist目前仍然比较多的使用遍历datalist里面的option来获取选中项的元素(DOM). 如果项目数量比较多的时候效率会比较慢. 如果页面引用的有jquery的话可以直接使用jquery的选择器来快速获取选中项元素. 但是有一个前提, 就是所有option 的某个属性值一定是唯一的, 不能出现重复. 否则将会把全部对应选项都返回出来.
    
    </summary>
    
    
      <category term="JavaScript" scheme="https://no5972.moe/cms/categories/JavaScript/"/>
    
    
  </entry>
  
  <entry>
    <title>Java树形统计: 各节点追加直属部门人数</title>
    <link href="https://no5972.moe/cms/archivers/20.html"/>
    <id>https://no5972.moe/cms/archivers/20.html</id>
    <published>2019-07-26T03:30:00.000Z</published>
    <updated>2023-03-15T10:29:24.487Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>代码修改自: <a href="https://blog.csdn.net/xuxingfan000/article/details/52159851" target="_blank" rel="noopener">https://blog.csdn.net/xuxingfan000/article/details/52159851</a><br />感谢@xuxingfan000</p><p>最近做项目遇到树形结构的统计，树的的深度不定，父亲节点=孩子节点之和<br />本修改代码要实现父亲节点的计数要追加父亲节点本身的数量.<br />实体bean代码略 参考上述链接<br />统计demo代码修改如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> tt;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">XxfMain</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> List&lt;Xmzb&gt; allList = <span class="keyword">new</span> ArrayList&lt;Xmzb&gt;();</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">Xmzb root = <span class="keyword">new</span> Xmzb(<span class="string">"1"</span>, <span class="string">"0"</span>, <span class="number">0</span>);</span><br><span class="line">Xmzb root1_1 = <span class="keyword">new</span> Xmzb(<span class="string">"1-1"</span>, <span class="string">"1"</span>, <span class="number">3999</span>);</span><br><span class="line">Xmzb root1_2 = <span class="keyword">new</span> Xmzb(<span class="string">"1-2"</span>, <span class="string">"1"</span>, <span class="number">1</span>);</span><br><span class="line">Xmzb root1_1_1 = <span class="keyword">new</span> Xmzb(<span class="string">"1-1-1"</span>, <span class="string">"1-1"</span>, <span class="number">1</span>);</span><br><span class="line">Xmzb root1_1_2 = <span class="keyword">new</span> Xmzb(<span class="string">"1-1-2"</span>, <span class="string">"1-1"</span>, <span class="number">0</span>);</span><br><span class="line">Xmzb root1_2_1 = <span class="keyword">new</span> Xmzb(<span class="string">"1-2-1"</span>, <span class="string">"1-2"</span>, <span class="number">1</span>);</span><br><span class="line">Xmzb root1_2_2 = <span class="keyword">new</span> Xmzb(<span class="string">"1-2-2"</span>, <span class="string">"1-2"</span>, <span class="number">0</span>);</span><br><span class="line">allList.add(root);</span><br><span class="line">allList.add(root1_1);</span><br><span class="line">allList.add(root1_2);</span><br><span class="line">allList.add(root1_1_1);</span><br><span class="line">allList.add(root1_1_2);</span><br><span class="line">allList.add(root1_2_1);</span><br><span class="line">allList.add(root1_2_2);</span><br><span class="line">List&lt;Xmzb&gt; list = <span class="keyword">new</span> ArrayList&lt;Xmzb&gt;();</span><br><span class="line">list.add(root);</span><br><span class="line">doCount(root, list);</span><br><span class="line"><span class="keyword">for</span> (Xmzb xmzb : allList) &#123;</span><br><span class="line">System.out.println(xmzb.getId() + <span class="string">":"</span> + xmzb.getXmgs());</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Map&lt;String, Object&gt; <span class="title">doCount</span><span class="params">(Xmzb root, List&lt;Xmzb&gt; list)</span> </span>&#123;</span><br><span class="line"><span class="comment">// System.out.println(root.getXmgs());</span></span><br><span class="line">Map&lt;String, Object&gt; map = <span class="keyword">new</span> HashMap&lt;String, Object&gt;();</span><br><span class="line">Double xmgs = <span class="number">0.0</span>;</span><br><span class="line"></span><br><span class="line">List&lt;Xmzb&gt; clist = findByQueryString(root.getId());<span class="comment">// 此处可以使用sql通过父节点查询孩子节点sql:from</span></span><br><span class="line"><span class="comment">// Xmzb where</span></span><br><span class="line"><span class="comment">// year='2016' and</span></span><br><span class="line"><span class="comment">// pid='"+root.getId()+"'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 叶子节点</span></span><br><span class="line"><span class="keyword">if</span> (clist == <span class="keyword">null</span> || clist.size() == <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">null</span> != root.getXmgs()) &#123;</span><br><span class="line">map.put(<span class="string">"xmgs"</span>, root.getXmgs());</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">map.put(<span class="string">"xmgs"</span>, xmgs);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> map;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 父节点</span></span><br><span class="line"><span class="keyword">if</span> (clist != <span class="keyword">null</span> &amp;&amp; clist.size() &gt; <span class="number">0</span>) &#123;</span><br><span class="line">list.addAll(clist);</span><br><span class="line"><span class="keyword">for</span> (Xmzb child : clist) &#123;</span><br><span class="line"><span class="comment">// 递归</span></span><br><span class="line">Map&lt;String, Object&gt; map_c = doCount(child, list);</span><br><span class="line">Double res = Double.parseDouble(map_c.get(<span class="string">"xmgs"</span>).toString());</span><br><span class="line">child.setXmgs(res.intValue());</span><br><span class="line"><span class="comment">// 统计当前元素的子节点个数</span></span><br><span class="line">xmgs += res;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/////////////////</span></span><br><span class="line"><span class="comment">//注意这两行修改//</span></span><br><span class="line"><span class="comment">/////////////////</span></span><br><span class="line">root.setXmgs(root.getXmgs() + xmgs.intValue()); </span><br><span class="line">map.put(<span class="string">"xmgs"</span>, root.getXmgs());</span><br><span class="line">    <span class="comment">/////////////////</span></span><br><span class="line"><span class="comment">//注意这两行修改//</span></span><br><span class="line"><span class="comment">/////////////////</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">map.put(<span class="string">"list"</span>, list);</span><br><span class="line"><span class="keyword">return</span> map;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List&lt;Xmzb&gt; <span class="title">findByQueryString</span><span class="params">(String pid)</span> </span>&#123;</span><br><span class="line">List&lt;Xmzb&gt; list = <span class="keyword">new</span> ArrayList&lt;Xmzb&gt;();</span><br><span class="line"><span class="keyword">for</span> (Xmzb xmzb : allList) &#123;</span><br><span class="line"><span class="keyword">if</span> (xmzb.getPid().equals(pid)) &#123;</span><br><span class="line">list.add(xmzb);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> list;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果如下</p><p><img src="https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/20190726111628862.png" alt="运行结果" /></p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      最近做项目遇到树形结构的统计，树的的深度不定，父亲节点=孩子节点之和，本修改代码要实现父亲节点的计数要追加父亲节点本身的数量。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>云服务器初始化Kafka</title>
    <link href="https://no5972.moe/cms/archivers/21.html"/>
    <id>https://no5972.moe/cms/archivers/21.html</id>
    <published>2019-05-07T09:00:00.000Z</published>
    <updated>2022-09-05T09:42:13.503Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="本地机器git-bash新版windows10也可以直接使用命令"><a class="markdownIt-Anchor" href="#本地机器git-bash新版windows10也可以直接使用命令"></a> 本地机器（Git Bash（新版Windows10也可以直接使用命令））</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">scp ./jdk-8u91-linux-x64.tar.gz root@公网IP:/root</span><br><span class="line">scp ./kafka_2.12-2.2.0.tgz root@公网IP:/root</span><br></pre></td></tr></table></figure><h1 id="云服务器登录后"><a class="markdownIt-Anchor" href="#云服务器登录后"></a> 云服务器登录后</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">tar zxvf jdk-8u91-linux-x64.tar.gz</span><br><span class="line">mv jdk1.8.0_91 /opt/java</span><br><span class="line"></span><br><span class="line">JAVA_HOME=/opt/java</span><br><span class="line">PATH=<span class="variable">$PATH</span>:<span class="variable">$JAVA_HOME</span>/bin</span><br><span class="line"><span class="built_in">export</span> JAVA_HOME PATH </span><br><span class="line"></span><br><span class="line">java -version</span><br><span class="line"></span><br><span class="line">tar zxvf kafka_2.12-2.2.0.tgz</span><br><span class="line"><span class="built_in">cd</span> kafka_2.12-2.2.0</span><br><span class="line">vi config/server.properties</span><br></pre></td></tr></table></figure><p>将listeners=PLAINTEXT://:9092注释去掉</p><p>将advertised.listeners=PLAINTEXT://your.host.name:9092注释去掉，your.host.name改成公网IP</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">bin/zookeeper-server-start.sh -daemon config/zookeeper.properties</span><br><span class="line">bin/kafka-server-start.sh -daemon config/server.properties</span><br><span class="line">bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic <span class="built_in">test</span></span><br><span class="line">bin/kafka-topics.sh --list --zookeeper localhost:2181</span><br><span class="line">bin/kafka-console-producer.sh --broker-list 公网IP:9092 --topic <span class="built_in">test</span></span><br><span class="line">bin/kafka-console-consumer.sh --bootstrap-server 公网IP:9092 --topic <span class="built_in">test</span> --from-beginning</span><br></pre></td></tr></table></figure><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      云服务器初始化Kafka
    
    </summary>
    
    
      <category term="AtoW" scheme="https://no5972.moe/cms/categories/AtoW/"/>
    
      <category term="Automation" scheme="https://no5972.moe/cms/categories/Automation/"/>
    
    
  </entry>
  
  <entry>
    <title>技术层：DFO美服不能通过禁用JS来强行访问登陆注册页面</title>
    <link href="https://no5972.moe/cms/archivers/1_1.html"/>
    <id>https://no5972.moe/cms/archivers/1_1.html</id>
    <published>2019-02-13T18:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>技术层：拦截器遇到限制地区的ip会返回302和新的URL。</p><p>在SpringBoot的拦截器里面通常写为：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">response.addHeader(<span class="string">"location"</span>, <span class="string">"/block/launcher?code=83"</span>);</span><br><span class="line">response.setStatus(<span class="number">302</span>);</span><br></pre></td></tr></table></figure><p>或者</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> <span class="string">"redirect:/block/launcher/?code=83"</span>;</span><br></pre></td></tr></table></figure><p>又或者</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">response.sendRedirect(<span class="string">"/block/launcher?code=83"</span>);</span><br></pre></td></tr></table></figure><p>除非能骗过DFO美服后台采用的接口的那个服务器，不然就不能通过这个拦截器。</p><p>结论是这个限制地区ip的页面并不是JS跳转，而是后台拦截器直接返回了“暂时被移动”的状态码。这就是说，试图通过关闭JS来强行访问DFO 的登陆/注册页面也是行不通的。</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      除非能骗过DFO美服后台采用的接口的那个服务器，不然就不能通过这个拦截器。结论是这个限制地区ip的页面并不是JS跳转，而是后台拦截器直接返回了“暂时被移动”的状态码。这就是说，试图通过关闭JS来强行访问DFO 的登陆/注册页面也是行不通的。
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>SpringMVC cannot map requests after importing Baidu Aip into Maven POM/在Maven配置里面添加百度语音之后SpringMVC不能映射请求</title>
    <link href="https://no5972.moe/cms/archivers/springmvc-baiduaip-problem.html"/>
    <id>https://no5972.moe/cms/archivers/springmvc-baiduaip-problem.html</id>
    <published>2018-12-11T09:34:26.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Encountered a problem about SpringMVC and Baidu Aip Speech.<br />After adding</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.baidu.aip<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>java-sdk<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>$&#123;baidu.aip.version&#125;<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><p>this into Maven POM, SpringMVC cannot map requests. The console does not display map information. But once deleted this, SpringMVC can map requests again. I would like to know how to solve the problem…</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      Encountered a problem about SpringMVC and Baidu Aip Speech.
    
    </summary>
    
    
      <category term="Java" scheme="https://no5972.moe/cms/categories/Java/"/>
    
    
  </entry>
  
  <entry>
    <title>【KEX】根据传说的ImagePacks2代码表修改的NPK辞典</title>
    <link href="https://no5972.moe/cms/archivers/1.html"/>
    <id>https://no5972.moe/cms/archivers/1.html</id>
    <published>2018-11-14T09:54:02.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1>此贴为鄙人受KEX作者恋恋委托发布，原帖摘自COLG。</h1><p>简易使用方法（详见此贴）：<a href="http://bbs.colg.cn/thread-7258459-1-1.html" target="_blank" rel="noopener">http://bbs.colg.cn/thread-7258459-1-1.html</a></p><p>将压缩包内的npklist.txt文件，拷贝到KEX软件的输出目录下，替换掉npklist.txt即可。</p><p>打开KEX，在“特殊工具”按钮菜单下找到“NPK辞典”并点击即可使用。</p><p>（兔子.4以前的版本在“系统菜单”按钮菜单下找到“小伙伴们的工具”-&gt;“NPK辞典”）</p><p>使用NPK辞典前需要设置资源文件夹，一般定向到DNF下ImagePacks2目录的副本下（可通过修改软件设置下的IMPACK2目录进行设置）。</p><p>然后在列表中选择一项，点击“使用EX打开该NPK”即可打开勾选NPK文件。</p><p>也可以像字典查询那样输入关键字来筛选NPK。</p><p>Easy To Use！</p><p>辞典根据精灵-传说发布的ImagePacks2代码表进行修改，并且已得到授权。原贴地址：</p><p>【传说】转载+自制的dnf_ImagePacks2代码表（2018.6.19）</p><p><a href="http://bbs.colg.cn/thread-7250959-1-1.html" target="_blank" rel="noopener">http://bbs.colg.cn/thread-7250959-1-1.html</a></p><p>(出处: 沃特碧们的Colg)</p><p>注：</p><p>本辞典因为也是仓促完成的，加上咱没太多时间，因此也亟待大家完善！待完善内容有三：</p><ol><li><p>原贴中有些文件名相似的内容没有补全（例如二觉宠物），本辞典未对其进行补全，这类文件的特征是没有以.npk作为结尾，希望大家能帮忙补全……</p></li><li><p>原贴中有些NPK的描述比较笼统，比如说“怪物”、“特效1”、“特效2”这些，希望大家能帮忙对辞典做一些更加全面的解释……</p></li><li><p>好像没了唉……</p></li></ol><p>希望大家完善后能够分享自己的辞典，并不需要附上我的名字（但是请附上原作者的名字）</p><p>大概就这样吧。希望大家使用愉快～做出更加心仪的补丁来～</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      此贴为鄙人受KEX作者恋恋委托发布，原帖摘自COLG。
    
    </summary>
    
    
      <category term="Webapp" scheme="https://no5972.moe/cms/categories/Webapp/"/>
    
    
  </entry>
  
  <entry>
    <title>Test</title>
    <link href="https://no5972.moe/cms/archivers/test3.html"/>
    <id>https://no5972.moe/cms/archivers/test3.html</id>
    <published>2018-11-14T09:26:02.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="hello-world2"><a class="markdownIt-Anchor" href="#hello-world2"></a> Hello, world2</h1><p>Hello world2</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/cms/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/cms/assets/js/APlayer.min
      
    
    </summary>
    
    
      <category term="jekyll update" scheme="https://no5972.moe/cms/categories/jekyll-update/"/>
    
    
  </entry>
  
  <entry>
    <title>Test</title>
    <link href="https://no5972.moe/cms/archivers/test2.html"/>
    <id>https://no5972.moe/cms/archivers/test2.html</id>
    <published>2018-11-14T09:24:02.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="hello-world"><a class="markdownIt-Anchor" href="#hello-world"></a> Hello, world</h1><p>Hello world</p><h1>Hello, world</h1><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/cms/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/cms/assets/js/APlayer.min
      
    
    </summary>
    
    
      <category term="jekyll update" scheme="https://no5972.moe/cms/categories/jekyll-update/"/>
    
    
  </entry>
  
  <entry>
    <title>Welcome to Jekyll and EasyBook</title>
    <link href="https://no5972.moe/cms/archivers/hello.html"/>
    <id>https://no5972.moe/cms/archivers/hello.html</id>
    <published>2014-12-30T01:00:13.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>You’ll find this post in your <code>_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code>jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p><p>To add new posts, simply add a file in the <code>_posts</code> directory that follows the convention <code>YYYY-MM-DD-name-of-post.ext</code> and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p><a id="more"></a><p>GitHub Flavored Markdown is supported.</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">print_hi</span><span class="params">(name)</span></span></span><br><span class="line">  puts <span class="string">"Hi, <span class="subst">#&#123;name&#125;</span>"</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">print_hi(<span class="string">'Tom'</span>)</span><br><span class="line"><span class="comment">#=&gt; prints 'Hi, Tom' to STDOUT.</span></span><br></pre></td></tr></table></figure><p>And <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="script">M</mi><mi>a</mi><mi>t</mi><mi>h</mi><mi>e</mi><mi>m</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">\mathcal{ Mathematics }</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord"><span class="mord mathcal">M</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">h</span><span class="mord mathdefault">e</span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">s</span></span></span></span></span> is supported!</p><p>Use <code>$$</code> to wrap your formulas. For example, <code>$e^{i\pi} + 1 = 0$</code> displays <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">e^{i\pi} + 1 = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.907994em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.824664em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">π</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span></p><p>Multi-line forumlas are supported too.</p><p class='katex-block'><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>J</mi><mo stretchy="false">(</mo><mi>w</mi><mo separator="true">,</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>m</mi></mfrac><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mi>L</mi><mo stretchy="false">(</mo><msup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mrow><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><msup><mi>y</mi><mrow><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo><mo>+</mo><mfrac><mi>λ</mi><mrow><mn>2</mn><mi>m</mi></mrow></mfrac><munderover><mo>∑</mo><mrow><mi>l</mi><mo>=</mo><mn>1</mn></mrow><mi>L</mi></munderover><msubsup><mrow><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi></mrow><mi>F</mi><mn>2</mn></msubsup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><msubsup><mrow><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi><mi mathvariant="normal">∣</mi></mrow><mi>F</mi><mn>2</mn></msubsup><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>n</mi><mo stretchy="false">[</mo><mi>l</mi><mo stretchy="false">]</mo></mrow></munderover><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>n</mi><mo stretchy="false">[</mo><mi>l</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow></munderover><mo stretchy="false">(</mo><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}&amp; J(w, b) = \frac{1}{m} \sum_{i=1}^{m}L(\hat{y}^{(i)}, y^{(i)})+ \frac{\lambda}{2m} \sum_{l=1}^{L}{||w||}^2_F\\\\&amp; {||w||}^2_F = \sum_{i = 1}^{n[l]}\sum_{j = 1}^{n[l-1]}(w_{ij})^2\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:8.605231000000002em;vertical-align:-4.052615500000001em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.552615500000001em;"><span style="top:-6.685284500000001em;"><span class="pstrut" style="height:3.9610050000000006em;"></span><span class="mord"></span></span><span style="top:-4.243171500000001em;"><span class="pstrut" style="height:3.9610050000000006em;"></span><span class="mord"></span></span><span style="top:-1.6221664999999996em;"><span class="pstrut" style="height:3.9610050000000006em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.052615500000001em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.552615500000001em;"><span style="top:-6.685284500000001em;"><span class="pstrut" style="height:3.9610050000000006em;"></span><span class="mord"><span class="mord"></span><span class="mord mathdefault" style="margin-right:0.09618em;">J</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">m</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.19444em;">^</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathdefault mtight">i</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathdefault mtight">i</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.37144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathdefault">m</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">λ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283360000000002em;"><span style="top:-1.8478869999999998em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.01968em;">l</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.302113em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mord">∣</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord">∣</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954008em;"><span style="top:-2.4003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29969999999999997em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.6221665000000014em;"><span class="pstrut" style="height:3.9610050000000006em;"></span><span class="mord"><span class="mord"></span><span class="mord"><span class="mord"><span class="mord">∣</span><span class="mord">∣</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord">∣</span><span class="mord">∣</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954008em;"><span style="top:-2.4003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.29969999999999997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.9610050000000003em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.386005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mopen mtight">[</span><span class="mord mathdefault mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">]</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.9610050000000006em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.386005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mopen mtight">[</span><span class="mord mathdefault mtight" style="margin-right:0.01968em;">l</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">]</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.052615499999999em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><h2 id="easybook-advanced-functions"><a class="markdownIt-Anchor" href="#easybook-advanced-functions"></a> EasyBook Advanced Functions</h2><p>You are using <a href="https://github.com/laobubu/jekyll-theme-EasyBook" target="_blank" rel="noopener">EasyBook</a> the template from <a href="http://laobubu.net" target="_blank" rel="noopener">laobubu.net</a>. Therefore some features are supported now:</p><ul><li><strong>Pagination</strong> is enabled.</li><li><strong>Disqus</strong> or <strong>多说</strong> is ready.</li><li><strong>TOC</strong> for posts is enabled.</li><li><strong>Profile</strong> including your links and avatar on the sidebar.</li><li><em>And more…</em></li></ul><blockquote><p><strong>Tips:</strong> You can disable Disqus or 多说 on posts/pages by adding <code>nocomments: true</code> into <a href="http://jekyllrb.com/docs/frontmatter/" target="_blank" rel="noopener">YAML Front Matter</a>.</p></blockquote><p>EasyBook uses upaiyun CDN to make everyone lncluding Chinese visitors feel speedy. You can find it in <code>_includes/footer.html</code> and change it to your favorite CDN like Google CDN.</p><h2 id="support-me-by"><a class="markdownIt-Anchor" href="#support-me-by"></a> Support me by…</h2><h3 id="add-a-link"><a class="markdownIt-Anchor" href="#add-a-link"></a> Add a link</h3><p>EasyBook does not make the footer heavy; the link to theme could be on <code>about.md</code>:</p><blockquote><p>This website is using <a href="http://laobubu.net" target="_blank" rel="noopener">laobubu</a>’s theme: <a href="https://github.com/laobubu/jekyll-theme-EasyBook" target="_blank" rel="noopener">EasyBook</a></p></blockquote><h3 id="donate-paypal-or-支付宝"><a class="markdownIt-Anchor" href="#donate-paypal-or-支付宝"></a> Donate (PayPal or 支付宝)</h3><p>That’s the best 😄</p><p>Please visit <a href="http://laobubu.net/donate.html" target="_blank" rel="noopener">http://laobubu.net/donate.html</a></p><h3 id="star-and-fork-on-github-free"><a class="markdownIt-Anchor" href="#star-and-fork-on-github-free"></a> Star and Fork on GitHub (free)</h3><p>Not going to donate? That’s okay. You can also send out your precious star <a href="https://github.com/laobubu/jekyll-theme-EasyBook" target="_blank" rel="noopener">on GitHub</a>.</p><h2 id="and-here-we-go"><a class="markdownIt-Anchor" href="#and-here-we-go"></a> And Here We Go</h2><p>Check out the <a href="http://jekyllrb.com" target="_blank" rel="noopener">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll" target="_blank" rel="noopener">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://github.com/jekyll/jekyll-help" target="_blank" rel="noopener">Jekyll’s dedicated Help repository</a>.</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;You’ll find this post in your &lt;code&gt;_posts&lt;/code&gt; directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run &lt;code&gt;jekyll serve&lt;/code&gt;, which launches a web server and auto-regenerates your site when a file is updated.&lt;/p&gt;
&lt;p&gt;To add new posts, simply add a file in the &lt;code&gt;_posts&lt;/code&gt; directory that follows the convention &lt;code&gt;YYYY-MM-DD-name-of-post.ext&lt;/code&gt; and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.&lt;/p&gt;
    
    </summary>
    
    
      <category term="jekyll update" scheme="https://no5972.moe/cms/categories/jekyll-update/"/>
    
    
  </entry>
  
  <entry>
    <title>Style Test</title>
    <link href="https://no5972.moe/cms/archivers/test.html"/>
    <id>https://no5972.moe/cms/archivers/test.html</id>
    <published>1970-01-01T00:00:00.000Z</published>
    <updated>2021-07-10T02:52:23.100Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/cms/assets/css/APlayer.min.css"><script src="/cms/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>This is just a style test post, filled with LoremIpsue. Feel free to delete the file.</p><p><img src="http://lorempixel.com/400/200/" alt="" /></p><h1 id="lorem-ipsum-dolor"><a class="markdownIt-Anchor" href="#lorem-ipsum-dolor"></a> Lorem ipsum dolor</h1><p>Sit amet, consectetur adipiscing elit. Phasellus nisi odio, scelerisque vitae volutpat non, facilisis non erat. In gravida placerat pulvinar. Maecenas ac pretium sem. In consectetur nulla leo, ut maximus nisi volutpat eget. Vestibulum vitae malesuada risus, egestas placerat felis. In sed sollicitudin elit. Sed bibendum porttitor dui. 111</p><h2 id="condimentum-mauris-accumsan"><a class="markdownIt-Anchor" href="#condimentum-mauris-accumsan"></a> Condimentum mauris Accumsan</h2><p>Eu. Suspendisse scelerisque, orci vel elementum accumsan, sem turpis congue justo, et vulputate lacus orci vel felis. Pellentesque at gravida felis, vitae pretium erat. Pellentesque convallis mi vitae lectus semper, quis pellentesque lectus tristique.</p><h2 id="duis-a-nibh-in"><a class="markdownIt-Anchor" href="#duis-a-nibh-in"></a> Duis a nibh in</h2><p>Consectetur ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p><blockquote><p>Vivamus placerat, tortor et aliquam porttitor, risus mi dapibus neque, vitae vulputate urna.<br />– Lorem</p></blockquote><p>Apurus vel sapien. Fusce at condimentum nibh.</p><h3 id="donec-ut-urna"><a class="markdownIt-Anchor" href="#donec-ut-urna"></a> Donec ut urna</h3><p>A dolor rhoncus posuere vel porttitor tortor. Integer ex lacus, sagittis ac tellus et, laoreet condimentum massa.</p><p><img src="http://lorempixel.com/400/400/" alt="" /></p><p>Aliquam tempor pharetra lacus, vel bibendum purus dapibus nec. Integer hendrerit massa ut libero euismod, id gravida neque facilisis.</p><h2 id="nunc-nec"><a class="markdownIt-Anchor" href="#nunc-nec"></a> Nunc nec</h2><p>Karan justo id turpis auctor pharetra. Fusce pretium ornare facilisis. Aliquam eget scelerisque ex, eu volutpat leo. Proin pharetra est felis, sit amet suscipit orci mattis quis.</p><ol><li>Etiam bibendum purus tincidunt</li><li>As dapibus enim et, porta ligula.</li><li>Morbi tempus, mauris sed sodales auctor, nulla erat fringilla purus, vel sodales nulla nunc sit amet purus.</li><li>Praesent pellentesque urna et leo eleifend molestie ac ac ex.</li><li>Ut eu sagittis metus, et malesuada libero.</li></ol><p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam placerat mauris a libero tempus facilisis. Maecenas ut augue lacinia, ornare mi in, lobortis arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis justo elit, blandit vel tincidunt ac, imperdiet ut neque.</p><h1 id="class-aptent"><a class="markdownIt-Anchor" href="#class-aptent"></a> Class aptent</h1><p>taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Sed at semper sem. Morbi in finibus tellus. Pellentesque nec dapibus risus.</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">"Hello world!"</span> &lt;&lt; <span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>vitae erat non congue. Proin sagittis vitae justo at cursus. Phasellus egestas bibendum urna vel condimentum.</p><h2 id="fusce-a-ullamcorper-nisl"><a class="markdownIt-Anchor" href="#fusce-a-ullamcorper-nisl"></a> Fusce a ullamcorper nisl</h2><p>Pellentesque vehicula faucibus nibh, <strong>a pharetra odio pretium ac.</strong> Mauris eget gravida orci, vitae tincidunt urna. Integer pharetra ante in porta maximus. Morbi ac arcu lacinia, posuere mauris vitae, lobortis dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae metus nibh. Cras quis malesuada nisi. Ut porttitor, ipsum vel suscipit posuere, elit purus egestas velit, ac lobortis urna orci nec mi.</p><h2 id="maecenas-bibendum-nisi"><a class="markdownIt-Anchor" href="#maecenas-bibendum-nisi"></a> Maecenas bibendum nisi</h2><p>Aleo facilisis porttitor ac ac metus. <strong>Vivamus faucibus faucibus bibendum.</strong> Donec efficitur consectetur erat quis porttitor. Ut id euismod nunc. Sed venenatis eleifend suscipit. Donec magna purus, porta eget enim a, ornare porttitor nibh. Cras nisl nibh, viverra vitae magna quis, hendrerit facilisis sem.</p><table><thead><tr><th style="text-align:center">table</th><th style="text-align:center">test</th><th style="text-align:center">lorem</th></tr></thead><tbody><tr><td style="text-align:center">Praesent ultrices</td><td style="text-align:center">convallis lorem</td><td style="text-align:center">at sollicitudin enim</td></tr><tr><td style="text-align:center">Mauris</td><td style="text-align:center">tristique cursus</td><td style="text-align:center">arcu ac</td></tr><tr><td style="text-align:center">facilisis</td><td style="text-align:center">Proin</td><td style="text-align:center">vulputate neque lectus</td></tr></tbody></table><p>maximus malesuada est rutrum ac. Sed blandit semper faucibus. Nam venenatis consectetur malesuada. Nulla lacus purus, ultrices ac eros porttitor, finibus sodales augue. Suspendisse tincidunt, felis in placerat euismod, libero nulla interdum nisl, commodo efficitur felis dui in libero. Integer lobortis sapien sit amet orci tristique auctor a sit amet neque. Nunc tincidunt iaculis purus eget maximus. Fusce risus justo, rutrum at magna sed, rhoncus lacinia lectus. Vivamus lobortis odio ex, ac vehicula nunc facilisis non. Aliquam fermentum diam massa. Sed cursus, nisi varius laoreet aliquet, tortor urna porta turpis, in dictum urna enim vel leo. Etiam at lacus lorem. Vivamus ornare vitae nisl vel malesuada.</p><link rel="stylesheet" href="/cms/css/spoiler.css" type="text/css"><script src="/cms/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    <summary type="html">
    
      This is just a style test post, filled with LoremIpsue. Feel free to delete the file.
    
    </summary>
    
    
      <category term="jekyll update" scheme="https://no5972.moe/cms/categories/jekyll-update/"/>
    
    
  </entry>
  
</feed>
