<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Wudi&#039;s Blog</title>
    <link>https://blog.wudilabs.com/</link>
    <description>Wudi&#039;s Technical Blog</description>
    <language>zh-cn</language>
    <copyright>Copyright (c) 2005-2014 Wudi Labs</copyright>
    <pubDate>Thu, 20 Apr 2023 14:32:10 +0000</pubDate>
    <lastBuildDate>Thu, 20 Apr 2023 14:32:10 +0000</lastBuildDate>
    <generator>Chaos (alpha)</generator>
    <item>
      <title>修改 TensorFlow C API 的代码，使得固定的 saved_model.pb 文件名变为可设置的</title>
      <link>https://blog.wudilabs.com/entry/a4a6c773/modified-tensorflow-source-code-to-make-the-fixed-saved-model-pb-become-variable</link>
      <comments>https://blog.wudilabs.com/entry/a4a6c773/modified-tensorflow-source-code-to-make-the-fixed-saved-model-pb-become-variable#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a4a6c773/modified-tensorflow-source-code-to-make-the-fixed-saved-model-pb-become-variable?lang=zh-CN</guid>
      <pubDate>Thu, 20 Apr 2023 14:32:10 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>改造</category>
      <category>计算机软件</category>
      <category>C/C++</category>
      <category>开源</category>
      <description>我在 2021 年 5 月份发出了一个 SpleeterMsvcExe 开源项目，当时是支持 11kHz 和 16kHz 两种模型，年底的时候又添加了对 22kHz 模型的支持。这三种不同频率上限的模型, variables 目录中的文件是完全相同的，只有 saved_model.pb 不同。但 TensorFlow 源码中这个文件名在 constants.h 中被定义为了固定值：

// SavedModel proto filename.
constexpr char kSavedModelFilenamePb[] = &quot;saved_model.pb&quot;;

// SavedModel text format proto filename.
constexpr char kSavedModelFilenamePbTxt[] = &quot;saved_model.pbtxt&quot;;

用于加载模型的 ReadMetaGraphDefFromSavedModel() API 函数会调用 reader.cc 中的 ReadSavedModel() 函数：

Status ReadSavedModel(const string&amp; export_dir, SavedModel* saved_model_proto) {
  LOG(INFO) &lt;&lt; &quot;Reading SavedModel from: &quot; &lt;&lt; export_dir;

  const string saved_model_pb_path =
      io::JoinPath(export_dir, kSavedModelFilenamePb);
  if (Env::Default()-&gt;FileExists(saved_model_pb_path).ok()) {
    return ReadBinaryProto(Env::Default(), saved_model_pb_path,
                           saved_model_proto);
  }
  const string saved_model_pbtxt_path =
      io::JoinPath(export_dir, kSavedModelFilenamePbTxt);
  if (Env::Default()-&gt;FileExists(saved_model_pbtxt_path).ok()) {
    return ReadTextProto(Env::Default(), saved_model_pbtxt_path,
                         saved_model_proto);
  }
  return Status(error::Code::NOT_FOUND,
                &quot;Could not find SavedModel .pb or .pbtxt at supplied export &quot;
                &quot;directory path: &quot; +
                    export_dir);
}

可以看到完全没有考虑让这个文件名可以被指定，而且一直到现在最新的 v2.12.0 版本都是这样的。

我之前曾经考虑过从模型下手，试图把三种种不同频率上限的模型合并为一个。搜索过几次 tensorflow saved model merge 之类的关键词，也借助 ChatGPT 修改过 checkpoint 到 saved model 的转换脚本，最终都没成功。而且从把 saved_model.pb 转换为 .pbtext 格式的结果看，整个 protobuf 文件中和频率上限相关的参数非常多，而且看文件里这些参数所在位置，也没法合并。

之前一直想尽量用官方提供的二进制版本，是考虑到这对于杀毒软件比较友好，自己编译的会有全新的 hash 值，有误报的风险。但现在考虑到 SpleeterMsvcExe, 即将发出的 WPF 版 Spleeter GUI 以及 BeatShow Player 程序的易用性，还是打算对 TensorFlow 的源码进行修改，自行编译一个版本来用了。

只是这一点需求，代码还是很好改的。直接在 ReadSavedModel() 中添加一段识别和处理环境变量的代码就可以了：

Status ReadSavedModel(const string&amp; export_dir, SavedModel* saved_model_proto) {
  LOG(INFO) &lt;&lt; &quot;Reading SavedModel from: &quot; &lt;&lt; export_dir;

  const char* tf_alt_saved_model_pb = getenv(&quot;TF_ALT_SAVED_MODEL_PB&quot;);
  if (tf_alt_saved_model_pb != nullptr) {
    LOG(INFO) &lt;&lt; &quot;Environment variable TF_ALT_SAVED_MODEL_PB is set: &quot; &lt;&lt; tf_alt_saved_model_pb;
    const string alt_saved_model_pb_path =
        io::JoinPath(export_dir, tf_alt_saved_model_pb);
    if (Env::Default()-&gt;FileExists(alt_saved_model_pb_path).ok()) {
      LOG(INFO) &lt;&lt; &quot;Will use &quot; &lt;&lt; tf_alt_saved_model_pb &lt;&lt; &quot; instead of saved_model.pb&quot;;
      return ReadBinaryProto(Env::Default(), alt_saved_model_pb_path,
                             saved_model_proto);
    } else {
      return Status(error::Code::NOT_FOUND,
                    &quot;Could not find the specified .pb file: &quot; + alt_saved_model_pb_path);
    }
  }

  const string saved_model_pb_path =
      io::JoinPath(export_dir, kSavedModelFilenamePb);

不用改 API 接口的定义，兼容性和灵活性都比较好。程序中调用 TensorFlow C API 前，设置一下 TF_ALT_SAVED_MODEL_PB 环境变量的值就可以了。

对于 TensorFlow 的编译过程，可以参考上一篇文章：
《B4E6F740 TENSORFLOW C API 动态库 V1.15 版本的编译过程》

2023-04-22 添加:


修改过的项目已经发到了 GitHub 上了: https://github.com/wudicgi/tensorflow-mod

实际的修改和之前贴的有差异，具体修改可以看 c5cfda2 这个提交。也可以直接下载 release 版本使用: https://github.com/wudicgi/tensorflow-mod/releases/tag/v1.15.5-mod.1
</description>
      <content:encoded>我在 2021 年 5 月份发出了一个 &lt;a href=&quot;https://github.com/wudicgi/SpleeterMsvcExe&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;SpleeterMsvcExe&lt;/a&gt; 开源项目，当时是支持 11kHz 和 16kHz 两种模型，年底的时候又添加了对 22kHz 模型的支持。这三种不同频率上限的模型, variables 目录中的文件是完全相同的，只有 saved_model.pb 不同。但 TensorFlow 源码中这个文件名在 &lt;a href=&quot;https://github.com/tensorflow/tensorflow/blob/8da16d856b3b085750b1bbb2457b81e69586f9a8/tensorflow/cc/saved_model/constants.h#L43&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;constants.h&lt;/a&gt; 中被定义为了固定值：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot; start=&quot;43&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SavedModel&amp;nbsp;proto&amp;nbsp;filename.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;constexpr&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;char&lt;/span&gt;&amp;nbsp;kSavedModelFilenamePb&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;saved_model.pb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SavedModel&amp;nbsp;text&amp;nbsp;format&amp;nbsp;proto&amp;nbsp;filename.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;constexpr&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;char&lt;/span&gt;&amp;nbsp;kSavedModelFilenamePbTxt&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;saved_model.pbtxt&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;用于加载模型的 ReadMetaGraphDefFromSavedModel() API 函数会调用 &lt;a href=&quot;https://github.com/tensorflow/tensorflow/blob/v1.15.5/tensorflow/cc/saved_model/reader.cc#L30&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;reader.cc&lt;/a&gt; 中的 ReadSavedModel() 函数：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot; start=&quot;30&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;Status&amp;nbsp;ReadSavedModel&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;export_dir,&amp;nbsp;SavedModel&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&amp;nbsp;saved_model_proto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;LOG&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;INFO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Reading&amp;nbsp;SavedModel&amp;nbsp;from:&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;export_dir&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;nbsp;saved_model_pb_path&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;io&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;JoinPath&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;export_dir,&amp;nbsp;kSavedModelFilenamePb&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;FileExists&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;saved_model_pb_path&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #008080;&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&amp;nbsp;ReadBinaryProto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;,&amp;nbsp;saved_model_pb_path,&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saved_model_proto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;nbsp;saved_model_pbtxt_path&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;io&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;JoinPath&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;export_dir,&amp;nbsp;kSavedModelFilenamePbTxt&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;FileExists&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;saved_model_pbtxt_path&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #008080;&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&amp;nbsp;ReadTextProto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;,&amp;nbsp;saved_model_pbtxt_path,&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saved_model_proto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&amp;nbsp;Status&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;error&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;NOT_FOUND&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;SavedModel&amp;nbsp;.pb&amp;nbsp;or&amp;nbsp;.pbtxt&amp;nbsp;at&amp;nbsp;supplied&amp;nbsp;export&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;directory&amp;nbsp;path:&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000040;&quot;&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;export_dir&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;可以看到完全没有考虑让这个文件名可以被指定，而且一直到现在最新的 v2.12.0 版本都是这样的。&lt;br /&gt;&lt;br /&gt;我之前曾经考虑过从模型下手，试图把三种种不同频率上限的模型合并为一个。搜索过几次 tensorflow saved model merge 之类的关键词，也借助 ChatGPT 修改过 checkpoint 到 saved model 的转换脚本，最终都没成功。而且从把 saved_model.pb 转换为 .pbtext 格式的结果看，整个 protobuf 文件中和频率上限相关的参数非常多，而且看文件里这些参数所在位置，也没法合并。&lt;br /&gt;&lt;br /&gt;之前一直想尽量用官方提供的二进制版本，是考虑到这对于杀毒软件比较友好，自己编译的会有全新的 hash 值，有误报的风险。但现在考虑到 SpleeterMsvcExe, 即将发出的 WPF 版 Spleeter GUI 以及 BeatShow Player 程序的易用性，还是打算对 TensorFlow 的源码进行修改，自行编译一个版本来用了。&lt;br /&gt;&lt;br /&gt;只是这一点需求，代码还是很好改的。直接在 ReadSavedModel() 中添加一段识别和处理环境变量的代码就可以了：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot; start=&quot;30&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;Status&amp;nbsp;ReadSavedModel&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;export_dir,&amp;nbsp;SavedModel&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&amp;nbsp;saved_model_proto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;LOG&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;INFO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Reading&amp;nbsp;SavedModel&amp;nbsp;from:&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;export_dir&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&amp;nbsp;tf_alt_saved_model_pb&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;getenv&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;TF_ALT_SAVED_MODEL_PB&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;tf_alt_saved_model_pb&amp;nbsp;&lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nullptr&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOG&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;INFO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Environment&amp;nbsp;variable&amp;nbsp;TF_ALT_SAVED_MODEL_PB&amp;nbsp;is&amp;nbsp;set:&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;tf_alt_saved_model_pb&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;nbsp;alt_saved_model_pb_path&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;io&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;JoinPath&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;export_dir,&amp;nbsp;tf_alt_saved_model_pb&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;FileExists&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;alt_saved_model_pb_path&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #008080;&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOG&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;INFO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Will&amp;nbsp;use&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;tf_alt_saved_model_pb&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;saved_model.pb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&amp;nbsp;ReadBinaryProto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Env&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Default&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;,&amp;nbsp;alt_saved_model_pb_path,&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saved_model_proto&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&amp;nbsp;Status&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;error&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;NOT_FOUND&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;.pb&amp;nbsp;file:&amp;nbsp;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000040;&quot;&gt;+&lt;/span&gt;&amp;nbsp;alt_saved_model_pb_path&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&amp;nbsp;saved_model_pb_path&amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;io&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;JoinPath&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;export_dir,&amp;nbsp;kSavedModelFilenamePb&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;不用改 API 接口的定义，兼容性和灵活性都比较好。程序中调用 TensorFlow C API 前，设置一下 TF_ALT_SAVED_MODEL_PB 环境变量的值就可以了。&lt;br /&gt;&lt;br /&gt;对于 TensorFlow 的编译过程，可以参考上一篇文章：&lt;br /&gt;《&lt;a href=&quot;https://blog.wudilabs.com/entry/b4e6f740/tensorflow-c-api-library-1-15-compile&quot;&gt;TensorFlow C API 动态库 v1.15 版本的编译过程&lt;/a&gt;》&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2023-04-22 添加:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;修改过的项目已经发到了 GitHub 上了: &lt;a href=&quot;https://github.com/wudicgi/tensorflow-mod&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/tensorflow-mod&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;实际的修改和之前贴的有差异，具体修改可以看 &lt;a href=&quot;https://github.com/wudicgi/tensorflow-mod/commit/c5cfda2b04da65345bc9d1c7434e8e685bfa69fe&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;c5cfda2 这个提交&lt;/a&gt;。也可以直接下载 release 版本使用: &lt;a href=&quot;https://github.com/wudicgi/tensorflow-mod/releases/tag/v1.15.5-mod.1&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/tensorflow-mod/releases/tag/v1.15.5-mod.1&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a4a6c773/modified-tensorflow-source-code-to-make-the-fixed-saved-model-pb-become-variable?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>TensorFlow C API 动态库 v1.15 版本的编译过程</title>
      <link>https://blog.wudilabs.com/entry/b4e6f740/tensorflow-c-api-library-1-15-compile</link>
      <comments>https://blog.wudilabs.com/entry/b4e6f740/tensorflow-c-api-library-1-15-compile#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b4e6f740/tensorflow-c-api-library-1-15-compile?lang=zh-CN</guid>
      <pubDate>Mon, 17 Apr 2023 15:15:00 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机软件</category>
      <category>开源</category>
      <description>自行编译的原因见下一篇文章：
《A4A6C773 修改 TENSORFLOW C API 的代码，使得固定的 SAVED_MODEL.PB 文件名变为可设置的》

整个编译工程基本参照官方的 在 Windows 环境中从源代码构建 说明就可以完成。之前搜到一些更早的版本是用 Cmake + Visual Studio 编译的，貌似编译过程中容易产生一些问题。TensorFlow v1 的最后一个版本 1.15.5 是是用 Bazel 进行构建的，它会直接调用 MSVC 编译器，整个编译过程还是比较顺利的。

经过测试的构建配置一节中, tensorflow-1.15.0 编译时使用的 Python 版本为 3.5-3.7, 编译器为 MSVC 2017, 构建工具为 Bazel 0.26.1. 下面会使用这些推荐的版本。

1. 安装 Python 和 TensorFlow 软件包依赖项

我的电脑上已安装有 Python 3.7 和 3.9, 但是 PATH 中 3.9 的目录在前边，因此先调整顺序将 3.7 放到前边。不调整的话，调用 Python 前通过以下命令临时设置一下环境变量也可以：

set PATH=C:\Python\Python37-64\Scripts;C:\Python\Python37-64;%PATH%

因为 v1.15.5 版本的 /tensorflow/tools/pip_package/setup.py 文件里有 &#039;keras_applications &gt;= 1.0.8&#039;, 因此我将官方构建说明中 keras_applications 的安装版本由 1.0.6 改为了 1.0.8, 执行：

pip3 install six numpy wheel
pip3 install keras_applications==1.0.8 --no-deps
pip3 install keras_preprocessing==1.0.5 --no-deps

2. 安装 Bazel

我电脑上没有 Bazelisk, 也没有 Chocolatey 和 Scoop, 因此我选择手动安装 Bazel.

从 https://github.com/bazelbuild/bazel/releases/tag/0.26.1 下载 bazel-0.26.1-windows-x86_64.zip, 把它解压到任意一个目录，并且把这个目录加入到 PATH 中后, Bazel 就可以使用了。

首次运行 bazel.exe 时，它会解压一些文件到 C:\Users\%USERNAME% 目录下，之后编译时生成的一些中间文件也会在用户的 Profile 目录下。

3. 安装 MSYS2

MSYS2 的安装可以参考 https://www.msys2.org/ 首页的说明。我的电脑上已经安装有 MSYS2 了，就只执行了一下 pacman:

pacman -S git patch unzip

并且确保 C:\msys64\usr\bin 在 PATH 中。

4. 安装 Visual Studio

我的电脑已安装有 Visual Studio 2017 和 2022.

如果没有安装任何版本的 Visual Studio, 要安装 VS 2017 可以到 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 下载，可能需要登录 Microsoft 账号。

如果已经安装有 VS 2019, 2022 等更高版本，建议先尝试是否能正常编译。在已安装高版本 VS 的情况下安装低版本 VS 可能会有问题。

5. 下载 TensorFlow 源代码

使用 TortoiseGit 克隆版本库 https://github.com/tensorflow/tensorflow.git, 分支填写 v1.15.5, 深度填写 1.

6. 配置 build

在克隆得到的 tensorflow 目录中，执行：

python ./configure.py

如果不需要 GPU 支持，可以所有问题都选择默认值。

7. 构建 C API 库文件

执行以下命令构建 C API 的 dll 和 lib 文件：

bazel build --config=v1 --config=opt //tensorflow:tensorflow.dll
bazel build --config=v1 --config=opt //tensorflow:tensorflow.lib

在我的 5900X 上整个编译过程耗时约 14 分钟，生成文件大小和官方提供的 libtensorflow-cpu-windows-x86_64-1.15.0.zip 基本相同。

2023-04-22 添加:


编译时可以使用命令：

bazel build --config=v1 --copt=/arch:AVX --copt=/arch:AVX2 tensorflow:tensorflow.dll tensorflow:tensorflow_dll_import_lib

这样可以忽略掉为 opt config 配置的编译参数，直接指定编译支持 AVX 和 AVX2 的版本 (执行 python ./configure.py 时, opt config 的编译参数默认只有 /arch:AVX, 会缺少对 AVX2 的支持)。
</description>
      <content:encoded>&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; padding: 0.5em 1em;&quot;&gt;自行编译的原因见下一篇文章：&lt;br /&gt;《&lt;a href=&quot;https://blog.wudilabs.com/entry/a4a6c773/modified-tensorflow-source-code-to-make-the-fixed-saved-model-pb-become-variable&quot;&gt;修改 TensorFlow C API 的代码，使得固定的 saved_model.pb 文件名变为可设置的&lt;/a&gt;》&lt;/div&gt;&lt;br /&gt;整个编译工程基本参照官方的 &lt;a href=&quot;https://www.tensorflow.org/install/source_windows?hl=zh-cn&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;在 Windows 环境中从源代码构建&lt;/a&gt; 说明就可以完成。之前搜到一些更早的版本是用 Cmake + Visual Studio 编译的，貌似编译过程中容易产生一些问题。TensorFlow v1 的最后一个版本 1.15.5 是是用 Bazel 进行构建的，它会直接调用 MSVC 编译器，整个编译过程还是比较顺利的。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.tensorflow.org/install/source_windows?hl=zh-cn#tested_build_configurations&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;经过测试的构建配置&lt;/a&gt;一节中, tensorflow-1.15.0 编译时使用的 Python 版本为 3.5-3.7, 编译器为 MSVC 2017, 构建工具为 Bazel 0.26.1. 下面会使用这些推荐的版本。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 安装 Python 和 TensorFlow 软件包依赖项&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;我的电脑上已安装有 Python 3.7 和 3.9, 但是 PATH 中 3.9 的目录在前边，因此先调整顺序将 3.7 放到前边。不调整的话，调用 Python 前通过以下命令临时设置一下环境变量也可以：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;set&amp;nbsp;PATH=C:\Python\Python37-64\Scripts;C:\Python\Python37-64;%PATH%&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;因为 v1.15.5 版本的 &lt;a href=&quot;https://github.com/tensorflow/tensorflow/blob/v1.15.5/tensorflow/tools/pip_package/setup.py#L52&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;/tensorflow/tools/pip_package/setup.py&lt;/a&gt; 文件里有 &#039;keras_applications &amp;gt;= 1.0.8&#039;, 因此我将官方构建说明中 keras_applications 的安装版本由 1.0.6 改为了 1.0.8, 执行：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;pip3&amp;nbsp;install&amp;nbsp;six&amp;nbsp;numpy&amp;nbsp;wheel&lt;br /&gt;
pip3&amp;nbsp;install&amp;nbsp;keras_applications==1.0.8&amp;nbsp;--no-deps&lt;br /&gt;
pip3&amp;nbsp;install&amp;nbsp;keras_preprocessing==1.0.5&amp;nbsp;--no-deps&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;2. 安装 Bazel&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;我电脑上没有 Bazelisk, 也没有 Chocolatey 和 Scoop, 因此我选择手动安装 Bazel.&lt;br /&gt;&lt;br /&gt;从 &lt;a href=&quot;https://github.com/bazelbuild/bazel/releases/tag/0.26.1&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/bazelbuild/bazel/releases/tag/0.26.1&lt;/a&gt; 下载 &lt;a href=&quot;https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-windows-x86_64.zip&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;bazel-0.26.1-windows-x86_64.zip&lt;/a&gt;, 把它解压到任意一个目录，并且把这个目录加入到 PATH 中后, Bazel 就可以使用了。&lt;br /&gt;&lt;br /&gt;首次运行 bazel.exe 时，它会解压一些文件到 C:\Users\%USERNAME% 目录下，之后编译时生成的一些中间文件也会在用户的 Profile 目录下。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 安装 MSYS2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MSYS2 的安装可以参考 &lt;a href=&quot;https://www.msys2.org/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.msys2.org/&lt;/a&gt; 首页的说明。我的电脑上已经安装有 MSYS2 了，就只执行了一下 pacman:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;pacman&amp;nbsp;-S&amp;nbsp;git&amp;nbsp;patch&amp;nbsp;unzip&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;并且确保 C:\msys64\usr\bin 在 PATH 中。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 安装 Visual Studio&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;我的电脑已安装有 Visual Studio 2017 和 2022.&lt;br /&gt;&lt;br /&gt;如果没有安装任何版本的 Visual Studio, 要安装 VS 2017 可以到 &lt;a href=&quot;https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/&lt;/a&gt; 下载，可能需要登录 Microsoft 账号。&lt;br /&gt;&lt;br /&gt;如果已经安装有 VS 2019, 2022 等更高版本，建议先尝试是否能正常编译。在已安装高版本 VS 的情况下安装低版本 VS 可能会有问题。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. 下载 TensorFlow 源代码&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;使用 TortoiseGit 克隆版本库 https://github.com/tensorflow/tensorflow.git, 分支填写 v1.15.5, 深度填写 1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. 配置 build&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;在克隆得到的 tensorflow 目录中，执行：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;python&amp;nbsp;./configure.py&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;如果不需要 GPU 支持，可以所有问题都选择默认值。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. 构建 C API 库文件&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;执行以下命令构建 C API 的 dll 和 lib 文件：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;bazel&amp;nbsp;build&amp;nbsp;--config=v1&amp;nbsp;--config=opt&amp;nbsp;//tensorflow:tensorflow.dll&lt;br /&gt;
bazel&amp;nbsp;build&amp;nbsp;--config=v1&amp;nbsp;--config=opt&amp;nbsp;//tensorflow:tensorflow.lib&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;在我的 5900X 上整个编译过程耗时约 14 分钟，生成文件大小和官方提供的 libtensorflow-cpu-windows-x86_64-1.15.0.zip 基本相同。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2023-04-22 添加:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;编译时可以使用命令：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;bazel&amp;nbsp;build&amp;nbsp;--config=v1&amp;nbsp;--copt=/arch:AVX&amp;nbsp;--copt=/arch:AVX2&amp;nbsp;tensorflow:tensorflow.dll&amp;nbsp;tensorflow:tensorflow_dll_import_lib&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;这样可以忽略掉为 opt config 配置的编译参数，直接指定编译支持 AVX 和 AVX2 的版本 (执行 python ./configure.py 时, opt config 的编译参数默认只有 /arch:AVX, 会缺少对 AVX2 的支持)。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b4e6f740/tensorflow-c-api-library-1-15-compile?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>入手 RTX 4070 显卡</title>
      <link>https://blog.wudilabs.com/entry/b4a686df/got-an-rtx-4070-graphics-card</link>
      <comments>https://blog.wudilabs.com/entry/b4a686df/got-an-rtx-4070-graphics-card#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b4a686df/got-an-rtx-4070-graphics-card?lang=zh-CN</guid>
      <pubDate>Sun, 16 Apr 2023 12:10:36 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机硬件</category>
      <description>去年夏天装的 AMD 5900X 的电脑，因为显卡价格原因没有买新显卡，而是接着用 2016 年买的 1050ti 显卡。6 年前的显卡显然已经非常不够用了，除了运算速度慢, 4GB 显存有些现在流行的开源项目根本跑不了。

前两天看到 4070 显卡发售了，查了下非常适合我用。华硕有一个双风扇的 DUAL GeForce RTX4070-12G 显卡，长度 27cm, 不用换机箱了。最大功耗 200W, 现在用的 750W 的电源也不用换了。为了保险又等了两天，稍微查了下 40 系另外 3 个型号的区别，在不需要 4090 算力的情况下, 4080 和 4090 比毫无性价比, 4070ti 比 4070 又强得有限，基本不用犹豫了。

今天上午下单，下午收到显卡。装上后简单测了下性能提升，和新的超分辨率功能。

性能提升

用 Whisper 的 ggml-large.bin 模型试了一下，之前用 1050ti 对一个 06:24 (384 秒) 的音频文件进行处理，耗时 160 秒：

Using GPU &quot;NVIDIA GeForce GTX 1050 Ti&quot;, feature level 12.1, effective flags Wave32 | NoReshapedMatMul
Loaded MEL filters, 62.8 kb RAM
Loaded vocabulary, 51865 strings, 3037.1 kb RAM
Loaded 1259 GPU tensors, 2950.66 MB VRAM
Loaded model from &quot;E:\Softwares\whisper-bin-x64\models\ggml-large.bin&quot; to VRAM
Created source reader from the file &quot;E:\CloudMusic\Nikita Fomin\Stranger (Dream Version).mp3&quot;
[00:00:00.000 --&gt; 00:00:03.480]   [MUSIC PLAYING]
...
[00:06:20.600 --&gt; 00:06:23.600]   [MUSIC PLAYING]
    CPU Tasks
LoadModel       2.77043 seconds
RunComplete     161.1 seconds
Run     160.168 seconds
...
    GPU Tasks
LoadModel       2.10459 seconds
Run     160.019 seconds
...

换成 4070 显卡后，耗时 26 秒：

Using GPU &quot;NVIDIA GeForce RTX 4070&quot;, feature level 12.1, effective flags Wave32 | NoReshapedMatMul
Loaded MEL filters, 62.8 kb RAM
Loaded vocabulary, 51865 strings, 3037.1 kb RAM
Loaded 1259 GPU tensors, 2950.66 MB VRAM
Computed CPU base frequency: 3.69996 GHz
Loaded model from &quot;E:\Softwares\whisper-bin-x64\models\ggml-large.bin&quot; to VRAM
Press Control+C or Control+Break to close this window
Created source reader from the file &quot;E:\CloudMusic\Nikita Fomin\Stranger (Dream Version).mp3&quot;
[00:00:00.000 --&gt; 00:00:03.480]   [MUSIC PLAYING]
...
[00:06:20.600 --&gt; 00:06:23.600]   [MUSIC PLAYING]
    CPU Tasks
LoadModel       1.56206 seconds
RunComplete     27.2146 seconds
Run     26.2726 seconds
...
    GPU Tasks
LoadModel       917.515 milliseconds
Run     26.1418 seconds
...

仅就这个应用来说，处理速度是之前的 6.15 倍。

超分辨率 (RTX Video Super Resolution) 功能

https://downloads.videolan.org/testing/vlc-rtx-upscaler/

https://github.com/emoose/VideoRenderer/releases/tag/rtx-1.1

https://www.videohelp.com/software/MPC-BE

K-Lite Mega Codec Pack 17.0.0, 2022-6-8

MPC-HC (Nightly, 64-bit)
------------------------

Build information:
    Version:            1.9.21.24 (1c7cdd24a)
    Compiler:           MSVC v19.29.30143
    Build date:         May 12 2022

LAV Filters:
    LAV Splitter:       0.76.1.3
    LAV Video:          0.76.1.3
    LAV Audio:          0.76.1.3
    FFmpeg compiler:    MinGW-w64 GCC 10.2.0

Operating system:
    Name:               Windows 10 (Build 21H2)
    Version:            10.0.19045 (64-bit)

Hardware:
    CPU:                AMD Ryzen 9 5900X 12-Core Processor
    GPU:                NVIDIA GeForce RTX 4070 (driver version: 31.0.15.3161)
</description>
      <content:encoded>去年夏天装的 AMD 5900X 的电脑，因为显卡价格原因没有买新显卡，而是接着用 2016 年买的 1050ti 显卡。6 年前的显卡显然已经非常不够用了，除了运算速度慢, 4GB 显存有些现在流行的开源项目根本跑不了。&lt;br /&gt;&lt;br /&gt;前两天看到 4070 显卡发售了，查了下非常适合我用。华硕有一个双风扇的 DUAL GeForce RTX4070-12G 显卡，长度 27cm, 不用换机箱了。最大功耗 200W, 现在用的 750W 的电源也不用换了。为了保险又等了两天，稍微查了下 40 系另外 3 个型号的区别，在不需要 4090 算力的情况下, 4080 和 4090 比毫无性价比, 4070ti 比 4070 又强得有限，基本不用犹豫了。&lt;br /&gt;&lt;br /&gt;今天上午下单，下午收到显卡。装上后简单测了下性能提升，和新的超分辨率功能。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;性能提升&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;用 &lt;a href=&quot;https://github.com/Const-me/Whisper&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Whisper&lt;/a&gt; 的 ggml-large.bin 模型试了一下，之前用 1050ti 对一个 06:24 (384 秒) 的音频文件进行处理，耗时 160 秒：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Using&amp;nbsp;GPU&amp;nbsp;&amp;quot;NVIDIA&amp;nbsp;GeForce&amp;nbsp;GTX&amp;nbsp;1050&amp;nbsp;Ti&amp;quot;,&amp;nbsp;feature&amp;nbsp;level&amp;nbsp;12.1,&amp;nbsp;effective&amp;nbsp;flags&amp;nbsp;Wave32&amp;nbsp;|&amp;nbsp;NoReshapedMatMul&lt;br /&gt;
Loaded&amp;nbsp;MEL&amp;nbsp;filters,&amp;nbsp;62.8&amp;nbsp;kb&amp;nbsp;RAM&lt;br /&gt;
Loaded&amp;nbsp;vocabulary,&amp;nbsp;51865&amp;nbsp;strings,&amp;nbsp;3037.1&amp;nbsp;kb&amp;nbsp;RAM&lt;br /&gt;
Loaded&amp;nbsp;1259&amp;nbsp;GPU&amp;nbsp;tensors,&amp;nbsp;2950.66&amp;nbsp;MB&amp;nbsp;VRAM&lt;br /&gt;
Loaded&amp;nbsp;model&amp;nbsp;from&amp;nbsp;&amp;quot;E:\Softwares\whisper-bin-x64\models\ggml-large.bin&amp;quot;&amp;nbsp;to&amp;nbsp;VRAM&lt;br /&gt;
Created&amp;nbsp;source&amp;nbsp;reader&amp;nbsp;from&amp;nbsp;the&amp;nbsp;file&amp;nbsp;&amp;quot;E:\CloudMusic\Nikita&amp;nbsp;Fomin\Stranger&amp;nbsp;(Dream&amp;nbsp;Version).mp3&amp;quot;&lt;br /&gt;
[00:00:00.000&amp;nbsp;--&amp;gt;&amp;nbsp;00:00:03.480]&amp;nbsp;&amp;nbsp;&amp;nbsp;[MUSIC&amp;nbsp;PLAYING]&lt;br /&gt;
...&lt;br /&gt;
[00:06:20.600&amp;nbsp;--&amp;gt;&amp;nbsp;00:06:23.600]&amp;nbsp;&amp;nbsp;&amp;nbsp;[MUSIC&amp;nbsp;PLAYING]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CPU&amp;nbsp;Tasks&lt;br /&gt;
LoadModel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.77043&amp;nbsp;seconds&lt;br /&gt;
RunComplete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;161.1&amp;nbsp;seconds&lt;br /&gt;
Run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;160.168&amp;nbsp;seconds&lt;br /&gt;
...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPU&amp;nbsp;Tasks&lt;br /&gt;
LoadModel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.10459&amp;nbsp;seconds&lt;br /&gt;
Run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;160.019&amp;nbsp;seconds&lt;br /&gt;
...&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;换成 4070 显卡后，耗时 26 秒：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Using&amp;nbsp;GPU&amp;nbsp;&amp;quot;NVIDIA&amp;nbsp;GeForce&amp;nbsp;RTX&amp;nbsp;4070&amp;quot;,&amp;nbsp;feature&amp;nbsp;level&amp;nbsp;12.1,&amp;nbsp;effective&amp;nbsp;flags&amp;nbsp;Wave32&amp;nbsp;|&amp;nbsp;NoReshapedMatMul&lt;br /&gt;
Loaded&amp;nbsp;MEL&amp;nbsp;filters,&amp;nbsp;62.8&amp;nbsp;kb&amp;nbsp;RAM&lt;br /&gt;
Loaded&amp;nbsp;vocabulary,&amp;nbsp;51865&amp;nbsp;strings,&amp;nbsp;3037.1&amp;nbsp;kb&amp;nbsp;RAM&lt;br /&gt;
Loaded&amp;nbsp;1259&amp;nbsp;GPU&amp;nbsp;tensors,&amp;nbsp;2950.66&amp;nbsp;MB&amp;nbsp;VRAM&lt;br /&gt;
Computed&amp;nbsp;CPU&amp;nbsp;base&amp;nbsp;frequency:&amp;nbsp;3.69996&amp;nbsp;GHz&lt;br /&gt;
Loaded&amp;nbsp;model&amp;nbsp;from&amp;nbsp;&amp;quot;E:\Softwares\whisper-bin-x64\models\ggml-large.bin&amp;quot;&amp;nbsp;to&amp;nbsp;VRAM&lt;br /&gt;
Press&amp;nbsp;Control+C&amp;nbsp;or&amp;nbsp;Control+Break&amp;nbsp;to&amp;nbsp;close&amp;nbsp;this&amp;nbsp;window&lt;br /&gt;
Created&amp;nbsp;source&amp;nbsp;reader&amp;nbsp;from&amp;nbsp;the&amp;nbsp;file&amp;nbsp;&amp;quot;E:\CloudMusic\Nikita&amp;nbsp;Fomin\Stranger&amp;nbsp;(Dream&amp;nbsp;Version).mp3&amp;quot;&lt;br /&gt;
[00:00:00.000&amp;nbsp;--&amp;gt;&amp;nbsp;00:00:03.480]&amp;nbsp;&amp;nbsp;&amp;nbsp;[MUSIC&amp;nbsp;PLAYING]&lt;br /&gt;
...&lt;br /&gt;
[00:06:20.600&amp;nbsp;--&amp;gt;&amp;nbsp;00:06:23.600]&amp;nbsp;&amp;nbsp;&amp;nbsp;[MUSIC&amp;nbsp;PLAYING]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CPU&amp;nbsp;Tasks&lt;br /&gt;
LoadModel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.56206&amp;nbsp;seconds&lt;br /&gt;
RunComplete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;27.2146&amp;nbsp;seconds&lt;br /&gt;
Run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26.2726&amp;nbsp;seconds&lt;br /&gt;
...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPU&amp;nbsp;Tasks&lt;br /&gt;
LoadModel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;917.515&amp;nbsp;milliseconds&lt;br /&gt;
Run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26.1418&amp;nbsp;seconds&lt;br /&gt;
...&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;仅就这个应用来说，处理速度是之前的 6.15 倍。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;超分辨率 (RTX Video Super Resolution) 功能&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://downloads.videolan.org/testing/vlc-rtx-upscaler/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://downloads.videolan.org/testing/vlc-rtx-upscaler/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/emoose/VideoRenderer/releases/tag/rtx-1.1&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/emoose/VideoRenderer/releases/tag/rtx-1.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.videohelp.com/software/MPC-BE&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.videohelp.com/software/MPC-BE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;K-Lite Mega Codec Pack 17.0.0, 2022-6-8&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;MPC-HC&amp;nbsp;(Nightly,&amp;nbsp;64-bit)&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
Build&amp;nbsp;information:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.9.21.24&amp;nbsp;(1c7cdd24a)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Compiler:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MSVC&amp;nbsp;v19.29.30143&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Build&amp;nbsp;date:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;May&amp;nbsp;12&amp;nbsp;2022&lt;br /&gt;
&lt;br /&gt;
LAV&amp;nbsp;Filters:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LAV&amp;nbsp;Splitter:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.76.1.3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LAV&amp;nbsp;Video:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.76.1.3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LAV&amp;nbsp;Audio:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.76.1.3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FFmpeg&amp;nbsp;compiler:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MinGW-w64&amp;nbsp;GCC&amp;nbsp;10.2.0&lt;br /&gt;
&lt;br /&gt;
Operating&amp;nbsp;system:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Windows&amp;nbsp;10&amp;nbsp;(Build&amp;nbsp;21H2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10.0.19045&amp;nbsp;(64-bit)&lt;br /&gt;
&lt;br /&gt;
Hardware:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CPU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AMD&amp;nbsp;Ryzen&amp;nbsp;9&amp;nbsp;5900X&amp;nbsp;12-Core&amp;nbsp;Processor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPU:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NVIDIA&amp;nbsp;GeForce&amp;nbsp;RTX&amp;nbsp;4070&amp;nbsp;(driver&amp;nbsp;version:&amp;nbsp;31.0.15.3161)&lt;/div&gt;&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b4a686df/got-an-rtx-4070-graphics-card?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>自己写了个 Windows 10 上用的快速启动栏，解决系统自带功能的对齐和缩放问题</title>
      <link>https://blog.wudilabs.com/entry/d4e4acb0/wrote-a-quick-launch-bar-for-windows-10-taskbar</link>
      <comments>https://blog.wudilabs.com/entry/d4e4acb0/wrote-a-quick-launch-bar-for-windows-10-taskbar#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d4e4acb0/wrote-a-quick-launch-bar-for-windows-10-taskbar?lang=zh-CN</guid>
      <pubDate>Fri, 01 Jul 2022 13:20:35 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>改造</category>
      <category>C# &amp; .NET</category>
      <category>计算机软件</category>
      <description>在 Windows 10 上，当任务栏选择使用小按钮时，快速启动栏中的图标会有对齐和缩放问题:

image_quick_launch_bar_win10_built_in

而且缩放比例越高，问题越明显。(例如在 4k 分辨率下通常会使用 200% 以上的缩放比例)

所以我基于 WPF 和 DeskBand 写了一个自己的快速启动栏，可正确对图标进行对齐和缩放:

image_quick_launch_bar_this_program

GitHub 项目地址是 https://github.com/wudicgi/Win10QuickLaunchBar

需要的小伙伴可以直接下载 release 压缩包使用。

PS, 写之前找了一圈示例程序，只找到 https://github.com/20154530/DeskBandTest 这个默认就能很好的自动缩放。所以最终是以这个项目为基础修改来的。
</description>
      <content:encoded>在 Windows 10 上，当任务栏选择使用小按钮时，快速启动栏中的图标会有对齐和缩放问题:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_quick_launch_bar_win10_built_in&quot; /&gt;&lt;br /&gt;&lt;br /&gt;而且缩放比例越高，问题越明显。(例如在 4k 分辨率下通常会使用 200% 以上的缩放比例)&lt;br /&gt;&lt;br /&gt;所以我基于 WPF 和 DeskBand 写了一个自己的快速启动栏，可正确对图标进行对齐和缩放:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_quick_launch_bar_this_program&quot; /&gt;&lt;br /&gt;&lt;br /&gt;GitHub 项目地址是 &lt;a href=&quot;https://github.com/wudicgi/Win10QuickLaunchBar&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/Win10QuickLaunchBar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;需要的小伙伴可以直接下载 release 压缩包使用。&lt;br /&gt;&lt;br /&gt;PS, 写之前找了一圈示例程序，只找到 &lt;a href=&quot;https://github.com/20154530/DeskBandTest&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/20154530/DeskBandTest&lt;/a&gt; 这个默认就能很好的自动缩放。所以最终是以这个项目为基础修改来的。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d4e4acb0/wrote-a-quick-launch-bar-for-windows-10-taskbar?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/d4e4acb0/wrote-a-quick-launch-bar-for-windows-10-taskbar?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>搞了一台 DIY 级别的雕刻机 CNC 3018</title>
      <link>https://blog.wudilabs.com/entry/e424963f/made-a-diy-level-engraving-machine-cnc-3018</link>
      <comments>https://blog.wudilabs.com/entry/e424963f/made-a-diy-level-engraving-machine-cnc-3018#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e424963f/made-a-diy-level-engraving-machine-cnc-3018?lang=zh-CN</guid>
      <pubDate>Sat, 16 Apr 2022 12:50:10 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>CNC 雕刻机</category>
      <category>DIY</category>
      <category>制造</category>
      <description>前两台在淘宝上以不到 650 的价格，购买了一个 CNC 3018 雕刻机的套件 (其中脱机控制器占 90 元)。
到货后这一盒子东西还有点分量:

image_thumb_cnc3018_assembly_01.jpg

除了主轴电机部分是装配好的一个整体，其他所有部分全是散件:

image_thumb_cnc3018_assembly_02.jpg

需要自己根据说明书完成组装:

image_thumb_cnc3018_assembly_04.jpg

image_thumb_cnc3018_assembly_03.jpg

实际装配时还看了下厂家在 ytb 上发的视频，装的顺序不对的话，对齐的时候会困难一些:

image_thumb_cnc3018_assembly_06.jpg

大约耗时两个晚上组装完成，看起来是这样的:

image_thumb_cnc3018_assembly_07.jpg

本来加工平台应该是居中放置的，我特意把它靠左放了。这是在购买前就考虑好的，目的是为了利用右侧的空间，来对塑料外壳的上下侧面进行加工。否则按这台 DIY 机器只有 45mm 的 Z 轴行程，塑料外壳根本没法立着固定在平台上来加工。

image_thumb_cnc3018_assembly_08.jpg

用脱机控制器简单铣了个方孔，感觉还不错。即使是不画图纸，临时手动随便开个孔，也比以前用电钻支架+十字工作台手动操作要方便一些。

image_thumb_cnc3018_assembly_09.jpg

当然这个之后准备是用 3D 打印制作好塑料外壳的夹具后，由 PC 来控制自动进行加工的。
</description>
      <content:encoded>前两台在淘宝上以不到 650 的价格，购买了一个 CNC 3018 雕刻机的套件 (其中脱机控制器占 90 元)。&lt;br /&gt;到货后这一盒子东西还有点分量:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_01.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_01.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;除了主轴电机部分是装配好的一个整体，其他所有部分全是散件:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_02.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_02.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;需要自己根据说明书完成组装:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_04.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_04.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_03.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_03.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;实际装配时还看了下厂家在 ytb 上发的视频，装的顺序不对的话，对齐的时候会困难一些:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_06.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_06.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;大约耗时两个晚上组装完成，看起来是这样的:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_07.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_07.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;本来加工平台应该是居中放置的，我特意把它靠左放了。这是在购买前就考虑好的，目的是为了利用右侧的空间，来对塑料外壳的上下侧面进行加工。否则按这台 DIY 机器只有 45mm 的 Z 轴行程，塑料外壳根本没法立着固定在平台上来加工。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_08.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_08.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;用脱机控制器简单铣了个方孔，感觉还不错。即使是不画图纸，临时手动随便开个孔，也比以前用电钻支架+十字工作台手动操作要方便一些。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_cnc3018_assembly_09.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_cnc3018_assembly_09.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;当然这个之后准备是用 3D 打印制作好塑料外壳的夹具后，由 PC 来控制自动进行加工的。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e424963f/made-a-diy-level-engraving-machine-cnc-3018?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>入手 Sermoon V1 3D 打印机，试打了第一个自己画的零件</title>
      <link>https://blog.wudilabs.com/entry/d4e4716d/bought-a-sermoon-v1-3d-printer</link>
      <comments>https://blog.wudilabs.com/entry/d4e4716d/bought-a-sermoon-v1-3d-printer#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d4e4716d/bought-a-sermoon-v1-3d-printer?lang=zh-CN</guid>
      <pubDate>Sun, 30 Jan 2022 11:03:20 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>3D 打印</category>
      <category>DIY</category>
      <category>制造</category>
      <description>赶在春节前购买了一台创想三维的 3D 打印机，型号 Sermoon V1:

image_thumb_3d_printer_sermoon_v1_01.jpg

选这个型号主要是因为它正好能放到我的货架上。Core XY 结构的，平台不会前后移动，这样机器就固定占据这么个空间就可以使用了:

image_thumb_3d_printer_sermoon_v1_05.jpg

买的时候这款是京东发货，夜里下单，下午就到了。晚上回去拆箱放好后，先插上附带的 U 盘打了个哨子。结果它附带这个哨子的 G-code 文件太精细了，用了 2 小时 20 分钟才打完:

image_thumb_3d_printer_sermoon_v1_04.jpg

今天简单研究了一下，在 Fusion 360 中画了一个小电磨的固定件。试了下用创想三维提供的配套软件生成 G-code 来打印，总体操作差不多属于傻瓜式了，默认的参数基本都没动，就打印成功了:

image_thumb_3d_printer_sermoon_v1_06.jpg

设计的时候留了一些公差，实际试了下尺寸 OK, 可以使用。这是把电磨装到电钻支架上之后的效果:

image_thumb_3d_printer_sermoon_v1_08.jpg
</description>
      <content:encoded>赶在春节前购买了一台创想三维的 3D 打印机，型号 Sermoon V1:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_3d_printer_sermoon_v1_01.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_3d_printer_sermoon_v1_01.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;选这个型号主要是因为它正好能放到我的货架上。Core XY 结构的，平台不会前后移动，这样机器就固定占据这么个空间就可以使用了:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_3d_printer_sermoon_v1_05.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_3d_printer_sermoon_v1_05.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;买的时候这款是京东发货，夜里下单，下午就到了。晚上回去拆箱放好后，先插上附带的 U 盘打了个哨子。结果它附带这个哨子的 G-code 文件太精细了，用了 2 小时 20 分钟才打完:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_3d_printer_sermoon_v1_04.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_3d_printer_sermoon_v1_04.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今天简单研究了一下，在 Fusion 360 中画了一个小电磨的固定件。试了下用创想三维提供的配套软件生成 G-code 来打印，总体操作差不多属于傻瓜式了，默认的参数基本都没动，就打印成功了:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_3d_printer_sermoon_v1_06.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_3d_printer_sermoon_v1_06.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;设计的时候留了一些公差，实际试了下尺寸 OK, 可以使用。这是把电磨装到电钻支架上之后的效果:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_3d_printer_sermoon_v1_08.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_thumb_3d_printer_sermoon_v1_08.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d4e4716d/bought-a-sermoon-v1-3d-printer?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/d4e4716d/bought-a-sermoon-v1-3d-printer?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>写了一个纯 C 语言版本的 Spleeter 人声、伴奏分离命令行程序</title>
      <link>https://blog.wudilabs.com/entry/84a2b85c/released-an-open-source-spleeter-command-line-program-spleeter-msvc-exe</link>
      <comments>https://blog.wudilabs.com/entry/84a2b85c/released-an-open-source-spleeter-command-line-program-spleeter-msvc-exe#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/84a2b85c/released-an-open-source-spleeter-command-line-program-spleeter-msvc-exe?lang=zh-CN</guid>
      <pubDate>Thu, 13 May 2021 13:50:16 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音频处理</category>
      <category>音乐</category>
      <category>开源</category>
      <category>计算机软件</category>
      <category>C/C++</category>
      <description>Spleeter 是 2019 年底 Deezer 公司开源的一个可以分离人声和背景音乐的程序 (也可分离出鼓、贝斯和钢琴)，效果拔群。售价 400 刀的 RX 8 软件中的 Music Rebalance 功能，用的就是 Spleeter 的模型。

一年多过去了，现在 Github 上的 Spleeter 程序，包括官方原版程序，基本还都是需要有 Python 环境或者内部包含了一个 Python 的。C++ 的几个静态库和命令行程序，不是用了 CMake 就是只支持 Linux 系统。对 Windows 平台开发者不太友好，如果是一般用户想直接使用就更不方便了。

最近将我的 BeatShow 程序中用到 Spleeter 的部分代码整理了一下，形成了一个独立的纯 C 语言编写的 Spleeter 命令行程序。编译完就是一个 exe 程序，其余 dll 文件是 TensorFlow C API 和 FFmpeg 的动态库。可以直接运行使用，不需要 Python 环境。

image_spleeter_msvc_exe_release_file_list

Github 项目地址是 https://github.com/wudicgi/SpleeterMsvcExe

根据说明直接下载 release 文件就好。models 文件比较大，如果下载速度不给力可以试试 https://ghproxy.com/

早上在 v2ex 发了个分享帖，地址是 https://www.v2ex.com/t/776618
</description>
      <content:encoded>Spleeter 是 2019 年底 Deezer 公司开源的一个可以分离人声和背景音乐的程序 (也可分离出鼓、贝斯和钢琴)，效果拔群。售价 400 刀的 RX 8 软件中的 Music Rebalance 功能，用的就是 Spleeter 的模型。&lt;br /&gt;&lt;br /&gt;一年多过去了，现在 Github 上的 Spleeter 程序，包括官方原版程序，基本还都是需要有 Python 环境或者内部包含了一个 Python 的。C++ 的几个静态库和命令行程序，不是用了 CMake 就是只支持 Linux 系统。对 Windows 平台开发者不太友好，如果是一般用户想直接使用就更不方便了。&lt;br /&gt;&lt;br /&gt;最近将我的 BeatShow 程序中用到 Spleeter 的部分代码整理了一下，形成了一个独立的纯 C 语言编写的 Spleeter 命令行程序。编译完就是一个 exe 程序，其余 dll 文件是 TensorFlow C API 和 FFmpeg 的动态库。可以直接运行使用，不需要 Python 环境。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_spleeter_msvc_exe_release_file_list&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Github 项目地址是 &lt;a href=&quot;https://github.com/wudicgi/SpleeterMsvcExe&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/SpleeterMsvcExe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;根据说明直接下载 release 文件就好。models 文件比较大，如果下载速度不给力可以试试 https://ghproxy.com/&lt;br /&gt;&lt;br /&gt;早上在 v2ex 发了个分享帖，地址是 &lt;a href=&quot;https://www.v2ex.com/t/776618&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.v2ex.com/t/776618&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/84a2b85c/released-an-open-source-spleeter-command-line-program-spleeter-msvc-exe?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/84a2b85c/released-an-open-source-spleeter-command-line-program-spleeter-msvc-exe?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>When We Disco 的 BeatShow 演示</title>
      <link>https://blog.wudilabs.com/entry/f421a0a9/beatshow-demo-when-we-disco</link>
      <comments>https://blog.wudilabs.com/entry/f421a0a9/beatshow-demo-when-we-disco#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/f421a0a9/beatshow-demo-when-we-disco?lang=zh-CN</guid>
      <pubDate>Thu, 10 Sep 2020 13:30:02 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>最近被这首歌洗脑了，忍不住又录了个 demo. 现在业余时间一直在完善这个项目，主要功能基本都完成了，还剩下一些收尾工作，应该很快就能公开提供下载了。

[[Video:https://v.youku.com/v_show/id_XNDg0ODgwMTMyMA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDg0ODgwMTMyMA==.html
在 bilibili 上观看: https://www.bilibili.com/video/BV1N64y1F73D
</description>
      <content:encoded>最近被这首歌洗脑了，忍不住又录了个 demo. 现在业余时间一直在完善这个项目，主要功能基本都完成了，还剩下一些收尾工作，应该很快就能公开提供下载了。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDg0ODgwMTMyMA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDg0ODgwMTMyMA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDg0ODgwMTMyMA==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/BV1N64y1F73D&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/BV1N64y1F73D&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/f421a0a9/beatshow-demo-when-we-disco?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>CH552 官方 USB HID 示例程序中的一处 bug</title>
      <link>https://blog.wudilabs.com/entry/e460af85/a-bug-in-the-official-usb-hid-sample-program-of-ch552</link>
      <comments>https://blog.wudilabs.com/entry/e460af85/a-bug-in-the-official-usb-hid-sample-program-of-ch552#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e460af85/a-bug-in-the-official-usb-hid-sample-program-of-ch552?lang=zh-CN</guid>
      <pubDate>Sat, 22 Aug 2020 13:35:26 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>C/C++</category>
      <category>USB</category>
      <category>电子</category>
      <description>最近在开发 BeatShow 设备的固件恢复功能时发现，使用 CH552 实现的 USB HID 设备总是获取不到设备名称，而 STM32F072 的就没问题。即使将所有 USB 描述符都改成一样的，问题也仍然存在。

调试 PC 端程序看到底层调用的 HidD_GetProductString() 函数执行结果是成功的，只是返回的字符串长度为 0, 所以就得从硬件下手了。

经过抓包，发现对于 CH552 设备，除了设备枚举过程中的正常 GET_DESCRIPTOR 请求，在 PC 端程序调用 HidD_GetProductString() 时系统又发送了额外的 GET_DESCRIPTOR 请求。而且这些请求的返回数据长度只有 2 字节，明显是不正常的。

CH552 设备枚举过程中正常的 GET_DESCRIPTOR 请求, wLength = 0x00FF = 255:
image_ch552_usb_hid_demo_bug_01_thumb

CH552 设备完成枚举后的额外 GET_DESCRIPTOR 请求, wLength = 0x0102 = 258:
image_ch552_usb_hid_demo_bug_02_thumb

STM32 设备在完成枚举后则没有这些额外的 GET_DESCRIPTOR 请求:
image_ch552_usb_hid_demo_bug_03_thumb

对于为什么系统只对 CH552 设备发送了这些额外的 GET_DESCRIPTOR 请求，经过一番搜索没有找到答案。但显然 CH552 的程序在这块的处理上有 bug。

CH552 实现的 bootloader 是以 WCH 官方的 USB HID 示例程序 CompatibilityHID.C 为基础，逐步重构和修改而来的。这个示例中有一段处理 SETUP 事物的代码是这样的:

case UIS_TOKEN_SETUP | 0:                       // SETUP 事务
    len = USB_RX_LEN;
    if (len == (sizeof(USB_SETUP_REQ)))
    {
        SetupLen = UsbSetupBuf-&gt;wLengthL;
        len = 0;                                // 默认为成功并且上传 0 长度
        SetupReq = UsbSetupBuf-&gt;bRequest;
        // ...

可以看到只取了 wLength 的低字节部分 wLengthL 作为 SetupLen, 完全没有使用高字节部分 wLengthH。而另一个 VendorDefinedDev.C 示例程序中，就对高字节部分 wLengthH 做了检查:

case UIS_TOKEN_SETUP | 0:                       // endpoint 0# SETUP
	len = USB_RX_LEN;
	if (len == sizeof(USB_SETUP_REQ)) {         // SETUP 包长度
		SetupLen = UsbSetupBuf-&gt;wLengthL;
		if (UsbSetupBuf-&gt;wLengthH || SetupLen &gt; 0x7F) SetupLen = 0x7F;      // 限制总长度
		len = 0;                                // 默认为成功并且上传 0 长度
		SetupReqCode = UsbSetupBuf-&gt;bRequest;
        // ...

CompositeKM.C 示例程序中也一样检查了 wLengthH:

case UIS_TOKEN_SETUP | 0:                       // SETUP 事务
    len = USB_RX_LEN;
    if (len == (sizeof(USB_SETUP_REQ)))
    {
        SetupLen = UsbSetupBuf-&gt;wLengthL;
        if (UsbSetupBuf-&gt;wLengthH || SetupLen &gt; 0x7F)
        {
            SetupLen = 0x7F;                    // 限制总长度
        }
        len = 0;                                // 默认为成功并且上传 0 长度
        SetupReq = UsbSetupBuf-&gt;bRequest;
        // ...

CompatibilityHID.C 示例程序中原本没有任何字符串描述符，也没有对 GET_DESCRIPTOR 请求的处理代码，相关的内容都是我后添加的。这可能是官方程序中这个 bug 存在了这么长时间的原因。

知道原因后就好修改了，只要在 wLengthH 不为 0 时把 SetupLen 限制到 uint8_t 范围内的最大值 0xFF 就可以了:

case UIS_TOKEN_SETUP | 0:                       // SETUP 事务
    len = USB_RX_LEN;
    if (len == (sizeof(USB_SETUP_REQ)))
    {
        SetupLen = UsbSetupBuf-&gt;wLengthL;
        if (UsbSetupBuf-&gt;wLengthH != 0)
        {
            SetupLen = 0xFF;                    // 限制总长度
        }
        len = 0;                                // 默认为成功并且上传 0 长度
        SetupReq = UsbSetupBuf-&gt;bRequest;
        // ...
</description>
      <content:encoded>最近在开发 BeatShow 设备的固件恢复功能时发现，使用 CH552 实现的 USB HID 设备总是获取不到设备名称，而 STM32F072 的就没问题。即使将所有 USB 描述符都改成一样的，问题也仍然存在。&lt;br /&gt;&lt;br /&gt;调试 PC 端程序看到底层调用的 HidD_GetProductString() 函数执行结果是成功的，只是返回的字符串长度为 0, 所以就得从硬件下手了。&lt;br /&gt;&lt;br /&gt;经过抓包，发现对于 CH552 设备，除了设备枚举过程中的正常 GET_DESCRIPTOR 请求，在 PC 端程序调用 HidD_GetProductString() 时系统又发送了额外的 GET_DESCRIPTOR 请求。而且这些请求的返回数据长度只有 2 字节，明显是不正常的。&lt;br /&gt;&lt;br /&gt;CH552 设备枚举过程中正常的 GET_DESCRIPTOR 请求, wLength = 0x&lt;b&gt;00&lt;/b&gt;FF = 255:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CH552 设备完成枚举后的额外 GET_DESCRIPTOR 请求, wLength = 0x&lt;b&gt;01&lt;/b&gt;02 = 258:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;STM32 设备在完成枚举后则没有这些额外的 GET_DESCRIPTOR 请求:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_ch552_usb_hid_demo_bug_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;对于为什么系统只对 CH552 设备发送了这些额外的 GET_DESCRIPTOR 请求，经过一番搜索没有找到答案。但显然 CH552 的程序在这块的处理上有 bug。&lt;br /&gt;&lt;br /&gt;CH552 实现的 bootloader 是以 &lt;a href=&quot;http://www.wch.cn/downloads/CH554EVT_ZIP.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;WCH 官方的 USB HID 示例程序 CompatibilityHID.C&lt;/a&gt; 为基础，逐步重构和修改而来的。这个示例中有一段处理 SETUP 事物的代码是这样的:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;case&lt;/span&gt;&amp;nbsp;UIS_TOKEN_SETUP&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SETUP&amp;nbsp;事务&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;USB_RX_LEN&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;USB_SETUP_REQ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthL&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;默认为成功并且上传&amp;nbsp;0&amp;nbsp;长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupReq&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;bRequest&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;可以看到只取了 wLength 的低字节部分 wLengthL 作为 SetupLen, 完全没有使用高字节部分 wLengthH。而另一个 VendorDefinedDev.C 示例程序中，就对高字节部分 wLengthH 做了检查:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;case&lt;/span&gt;&amp;nbsp;UIS_TOKEN_SETUP&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;endpoint&amp;nbsp;0#&amp;nbsp;SETUP&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;USB_RX_LEN&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;USB_SETUP_REQ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SETUP&amp;nbsp;包长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthL&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthH&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;||&lt;/span&gt;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;0x7F&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #208080;&quot;&gt;0x7F&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;限制总长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;默认为成功并且上传&amp;nbsp;0&amp;nbsp;长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupReqCode&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;bRequest&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;CompositeKM.C 示例程序中也一样检查了 wLengthH:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;case&lt;/span&gt;&amp;nbsp;UIS_TOKEN_SETUP&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SETUP&amp;nbsp;事务&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;USB_RX_LEN&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;USB_SETUP_REQ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthL&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthH&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;||&lt;/span&gt;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;0x7F&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #208080;&quot;&gt;0x7F&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;限制总长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;默认为成功并且上传&amp;nbsp;0&amp;nbsp;长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupReq&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;bRequest&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;CompatibilityHID.C 示例程序中原本没有任何字符串描述符，也没有对 GET_DESCRIPTOR 请求的处理代码，相关的内容都是我后添加的。这可能是官方程序中这个 bug 存在了这么长时间的原因。&lt;br /&gt;&lt;br /&gt;知道原因后就好修改了，只要在 wLengthH 不为 0 时把 SetupLen 限制到 uint8_t 范围内的最大值 0xFF 就可以了:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;case&lt;/span&gt;&amp;nbsp;UIS_TOKEN_SETUP&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;SETUP&amp;nbsp;事务&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;USB_RX_LEN&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;USB_SETUP_REQ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthL&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;wLengthH&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;!=&lt;/span&gt;&amp;nbsp;0&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupLen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #208080;&quot;&gt;0xFF&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;限制总长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;默认为成功并且上传&amp;nbsp;0&amp;nbsp;长度&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetupReq&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;UsbSetupBuf&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;bRequest&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e460af85/a-bug-in-the-official-usb-hid-sample-program-of-ch552?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>简单“修正”了一下 AStyle 中的一个重复缩进的问题</title>
      <link>https://blog.wudilabs.com/entry/d460ceb9/simply-fixed-a-duplicate-indentation-issue-in-astyle</link>
      <comments>https://blog.wudilabs.com/entry/d460ceb9/simply-fixed-a-duplicate-indentation-issue-in-astyle#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d460ceb9/simply-fixed-a-duplicate-indentation-issue-in-astyle?lang=zh-CN</guid>
      <pubDate>Mon, 10 Aug 2020 14:16:37 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>改造</category>
      <category>C/C++</category>
      <category>计算机软件</category>
      <description>GitHub 地址: https://github.com/wudicgi/astyle-modified
效果对比脚本: https://github.com/wudicgi/astyle-modified/tree/master/bin
修改后程序下载: https://github.com/wudicgi/astyle-modified/blob/master/bin/AStyle.exe

1. 发现问题

上周我在对 ffmpeg 的 transcoding.c 示例程序进行代码风格美化时，发现 AStyle 在很多处不需要改动的地方添加了额外的缩进:

// 处理前
ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, &quot;in&quot;,
        args, NULL, filter_graph);

// 处理后
ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, &quot;in&quot;,
                args, NULL, filter_graph);

其实以前也遇到过这个问题，但这次出现得比较集中、比较多，就准备解决一下了。打开 AStyle 的 VS2017 项目进行调试，发现对于我使用的选项

indent=spaces=4
indent-after-parens
indent-continuation=2

AStyle 在遇到赋值运算符 &#039;=&#039; 时为后续行添加 2 级缩进，而当继续处理遇到左括号 &#039;(&#039; 时又添加了 2 级缩进，于是后续行就拥有了多余的 2 级缩进。

2. 修改问题

我使用了一个简单粗暴的方式进行修改，就是在 ASBeautifier 类的 registerContinuationIndent() 方法中添加一个条件判断，使它在已经因为 &#039;=&#039; 添加了后续行缩进的情况下，不再因为其后出现的第一个 &#039;(&#039; 再添加缩进。

void ASBeautifier::registerContinuationIndent(const string&amp; line, int i, int spaceIndentCount_,
                                              int tabIncrementIn, int minIndent, bool updateParenStack)
{
    assert(i &gt;= -1);
    int remainingCharNum = line.length() - i;
    int nextNonWSChar = getNextProgramCharDistance(line, i);

    // if indent is around the last char in the line OR indent-after-paren is requested,
    // indent with the continuation indent
    if (nextNonWSChar == remainingCharNum || shouldIndentAfterParen)
    {
        // added by Wudi
        bool noDuplicatedIndentForFirstParen = updateParenStack // current indentation is for opening paren &#039;(&#039;
                &amp;&amp; !continuationIndentStack-&gt;empty()            // previously indented for an assignment &#039;=&#039;
                &amp;&amp; parenIndentStack-&gt;empty()                    // current &#039;(&#039; is the first opening paren needs to add indentation
                &amp;&amp; (i != 0);                                    // current &#039;(&#039; must not be the first char, otherwise there is no &#039;=&#039; ahead

        int previousIndent = spaceIndentCount_;
        if (!continuationIndentStack-&gt;empty())
            previousIndent = continuationIndentStack-&gt;back();

        int currIndent = continuationIndent * indentLength + previousIndent;

        // added by Wudi
        if (noDuplicatedIndentForFirstParen) {
            currIndent = previousIndent;
        }

        if (currIndent &gt; maxContinuationIndent &amp;&amp; line[i] != &#039;{&#039;)
            currIndent = indentLength * 2 + spaceIndentCount_;
        continuationIndentStack-&gt;emplace_back(currIndent);
        if (updateParenStack)
            parenIndentStack-&gt;emplace_back(previousIndent);
        return;
    }

    // ...

3. 修改前后效果对比

对同样的一段代码进行处理，原版 AStyle 的输出为:

int ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, &quot;in&quot;,
                args, NULL, filter_graph);

int (*enc_func_2)(AVCodecContext *, AVPacket *, const AVFrame *, int *) = (ifmt_ctx-&gt;streams[stream_index]-&gt;codecpar-&gt;codec_type ==
                AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;

ret = func(a, b, another_func(1, 2,
                        3),
                c, d);

修改后版本的输出为:

int ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, &quot;in&quot;,
        args, NULL, filter_graph);

int (*enc_func_2)(AVCodecContext *, AVPacket *, const AVFrame *, int *) = (ifmt_ctx-&gt;streams[stream_index]-&gt;codecpar-&gt;codec_type ==
        AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;

ret = func(a, b, another_func(1, 2,
                3),
        c, d);

4. 修改的副作用

标题中的“修正”带引号是因为这并不一定是个 bug, 同时现在所做的这个修改会有一些副作用。对于一些极端情况的代码，例如:

int ret = func(a, b, another_func(1, 2,
3, 4, 5),
c, d)
/ 123;

原版 AStyle 能保留所有缩进等级，输出结果为:

int ret = func(a, b, another_func(1, 2,
                        3, 4, 5),
                c, d)
        / 123;

而该修改版本的输出为:

int ret = func(a, b, another_func(1, 2,
                3, 4, 5),
        c, d)
        / 123;

最外层在缩进等级上没有与内层区分开来。但像这样的代码并不常见，所以为方便自己日常使用，“修正”一下还是有必要的。

附: AStyle 原版链接

AStyle 的官方项目地址为 http://astyle.sourceforge.net/
</description>
      <content:encoded>GitHub 地址: &lt;a href=&quot;https://github.com/wudicgi/astyle-modified&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/astyle-modified&lt;/a&gt;&lt;br /&gt;效果对比脚本: &lt;a href=&quot;https://github.com/wudicgi/astyle-modified/tree/master/bin&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/astyle-modified/tree/master/bin&lt;/a&gt;&lt;br /&gt;修改后程序下载: &lt;a href=&quot;https://github.com/wudicgi/astyle-modified/blob/master/bin/AStyle.exe&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/astyle-modified/blob/master/bin/AStyle.exe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 发现问题&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;上周我在对 &lt;a href=&quot;https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/transcoding.c&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;ffmpeg 的 transcoding.c 示例程序&lt;/a&gt;进行代码风格美化时，发现 AStyle 在很多处不需要改动的地方添加了额外的缩进:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;处理前&lt;/span&gt;&lt;br /&gt;
ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;avfilter_graph_create_filter&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;buffersrc_ctx&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;buffersrc&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;in&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;NULL&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;filter_graph&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;处理后&lt;/span&gt;&lt;br /&gt;
ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;avfilter_graph_create_filter&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;buffersrc_ctx&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;buffersrc&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;in&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;NULL&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;filter_graph&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;其实以前也遇到过这个问题，但这次出现得比较集中、比较多，就准备解决一下了。打开 AStyle 的 VS2017 项目进行调试，发现对于我使用的选项&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;indent=spaces=4&lt;br /&gt;
indent-after-parens&lt;br /&gt;
indent-continuation=2&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;AStyle 在遇到赋值运算符 &#039;=&#039; 时为后续行添加 2 级缩进，而当继续处理遇到左括号 &#039;(&#039; 时又添加了 2 级缩进，于是后续行就拥有了多余的 2 级缩进。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 修改问题&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;我使用了一个简单粗暴的方式进行修改，就是在 ASBeautifier 类的 registerContinuationIndent() 方法中添加一个条件判断，使它在已经因为 &#039;=&#039; 添加了后续行缩进的情况下，不再因为其后出现的第一个 &#039;(&#039; 再添加缩进。&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;void&lt;/span&gt;&amp;nbsp;ASBeautifier&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #202020;&quot;&gt;registerContinuationIndent&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;line&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;spaceIndentCount_&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;tabIncrementIn&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;minIndent&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;bool&amp;nbsp;updateParenStack&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;i&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;remainingCharNum&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;line.&lt;span style=&quot;color: #008080;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;nextNonWSChar&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getNextProgramCharDistance&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;line&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;if&amp;nbsp;indent&amp;nbsp;is&amp;nbsp;around&amp;nbsp;the&amp;nbsp;last&amp;nbsp;char&amp;nbsp;in&amp;nbsp;the&amp;nbsp;line&amp;nbsp;OR&amp;nbsp;indent-after-paren&amp;nbsp;is&amp;nbsp;requested,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;indent&amp;nbsp;with&amp;nbsp;the&amp;nbsp;continuation&amp;nbsp;indent&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;nextNonWSChar&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&amp;nbsp;remainingCharNum&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;||&lt;/span&gt;&amp;nbsp;shouldIndentAfterParen&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;added&amp;nbsp;by&amp;nbsp;Wudi&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool&amp;nbsp;noDuplicatedIndentForFirstParen&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;updateParenStack&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;current&amp;nbsp;indentation&amp;nbsp;is&amp;nbsp;for&amp;nbsp;opening&amp;nbsp;paren&amp;nbsp;&#039;(&#039;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;!&lt;/span&gt;continuationIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;empty&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;previously&amp;nbsp;indented&amp;nbsp;for&amp;nbsp;an&amp;nbsp;assignment&amp;nbsp;&#039;=&#039;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;parenIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;empty&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;current&amp;nbsp;&#039;(&#039;&amp;nbsp;is&amp;nbsp;the&amp;nbsp;first&amp;nbsp;opening&amp;nbsp;paren&amp;nbsp;needs&amp;nbsp;to&amp;nbsp;add&amp;nbsp;indentation&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;i&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;!=&lt;/span&gt;&amp;nbsp;0&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;current&amp;nbsp;&#039;(&#039;&amp;nbsp;must&amp;nbsp;not&amp;nbsp;be&amp;nbsp;the&amp;nbsp;first&amp;nbsp;char,&amp;nbsp;otherwise&amp;nbsp;there&amp;nbsp;is&amp;nbsp;no&amp;nbsp;&#039;=&#039;&amp;nbsp;ahead&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;previousIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;spaceIndentCount_&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;!&lt;/span&gt;continuationIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;empty&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;previousIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;continuationIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;back&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;currIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;continuationIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&amp;nbsp;indentLength&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;&amp;nbsp;previousIndent&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;added&amp;nbsp;by&amp;nbsp;Wudi&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;noDuplicatedIndentForFirstParen&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;previousIndent&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;currIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;maxContinuationIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;line&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;i&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;{&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currIndent&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;indentLength&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&amp;nbsp;2&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;&amp;nbsp;spaceIndentCount_&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continuationIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;emplace_back&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;currIndent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;updateParenStack&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parenIndentStack&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;emplace_back&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;previousIndent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;3. 修改前后效果对比&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;对同样的一段代码进行处理，原版 AStyle 的输出为:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;avfilter_graph_create_filter&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;buffersrc_ctx&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;buffersrc&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;in&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;NULL&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;filter_graph&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;enc_func_2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;AVCodecContext&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;AVPacket&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;AVFrame&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;ifmt_ctx&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;streams&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;stream_index&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;codecpar&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;codec_type&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AVMEDIA_TYPE_VIDEO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;?&lt;/span&gt;&amp;nbsp;avcodec_encode_video2&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;avcodec_encode_audio2&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;b&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;another_func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;2&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;d&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;修改后版本的输出为:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;avfilter_graph_create_filter&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;buffersrc_ctx&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;buffersrc&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;in&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;NULL&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;filter_graph&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;enc_func_2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;AVCodecContext&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;AVPacket&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;const&lt;/span&gt;&amp;nbsp;AVFrame&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*,&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;ifmt_ctx&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;streams&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;stream_index&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;codecpar&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;codec_type&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;==&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AVMEDIA_TYPE_VIDEO&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;?&lt;/span&gt;&amp;nbsp;avcodec_encode_video2&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&amp;nbsp;avcodec_encode_audio2&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;b&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;another_func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;2&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;d&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;4. 修改的副作用&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;标题中的“修正”带引号是因为这并不一定是个 bug, 同时现在所做的这个修改会有一些副作用。对于一些极端情况的代码，例如:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;b&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;another_func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;2&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
3&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;4&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;5&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
c&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;d&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;123&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;原版 AStyle 能保留所有缩进等级，输出结果为:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;b&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;another_func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;2&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;4&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;5&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;d&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;123&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;而该修改版本的输出为:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;int&lt;/span&gt;&amp;nbsp;ret&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;b&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;another_func&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;1&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;2&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;4&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;5&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;d&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;123&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;最外层在缩进等级上没有与内层区分开来。但像这样的代码并不常见，所以为方便自己日常使用，“修正”一下还是有必要的。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;附: AStyle 原版链接&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;AStyle 的官方项目地址为 &lt;a href=&quot;http://astyle.sourceforge.net/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://astyle.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d460ceb9/simply-fixed-a-duplicate-indentation-issue-in-astyle?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>开源一个剪贴板文本自动处理工具 Clipboard Auto Processor</title>
      <link>https://blog.wudilabs.com/entry/f4e09d12/released-an-open-source-clipboard-utility-clipboard-auto-processor</link>
      <comments>https://blog.wudilabs.com/entry/f4e09d12/released-an-open-source-clipboard-utility-clipboard-auto-processor#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/f4e09d12/released-an-open-source-clipboard-utility-clipboard-auto-processor?lang=zh-CN</guid>
      <pubDate>Sun, 19 Jul 2020 12:16:15 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>C# &amp; .NET</category>
      <category>开源</category>
      <category>计算机软件</category>
      <description>这个工具最开始是 2016 年时写了个很粗糙的版本，只有自己一直在用。今年业余抽时间整理了一下代码，把原来设计的基础功能都补充完整了，感觉可以发一个 1.0 版本了。目标用户主要是程序员，可以自己编写脚本把平时一些重复性的文本处理操作自动化。

GitHub 地址: https://github.com/wudicgi/clipboard-auto-processor

考虑到 GitHub 上的图片经常加载不出来，把 readme 的所有内容直接贴这儿了。

1. 简介

Clipboard Auto Processor 是一个剪贴板文本自动处理工具。不同于一般的剪贴板增强软件只是管理历史内容，该工具可以自动调用任何脚本，来自动处理剪贴板中的内容。

image_clipboard_auto_processor_v1_0_screenshot_thumb

脚本可以使用 PHP, Python 或 JavaScript 等任何您熟悉的语言来编写，只需实现从原始文本到所需结果的转换即可，其余工作均由 Clipboard Auto Processor 完成。

2. 使用方法

下载最新的 release 版本，解压到任意有写权限的位置，通常只要不放在 Windows, Program Files 或 C 盘根目录等路径下就可以。

首次运行 ClipboardAutoProcessor.exe 主程序时，程序会根据当前系统语言创建 config.ini 配置文件。之后可以修改该文件来设置脚本解释路径和显示字体等选项。

您可以手动创建快捷方式，放置到开始菜单中或桌面上。但是更推荐使用 Launchy, Wox 和 Keypirinha 等快速启动工具，实现随时快速打开使用。

image_clipboard_auto_processor_v1_0_launchy

3. 示例脚本

转换文件路径列表中的反斜杠 (查看 JS, PHP, Python 脚本)

image_clipboard_auto_processor_v1_0_sample_01_convert_copied_paths

调整从 PDF 文档所复制文本的格式 (查看 PHP 脚本)

image_clipboard_auto_processor_v1_0_sample_02_convert_esp8266_pdf_text

十六进制字符串到数组定义 (查看 PHP 脚本)

image_clipboard_auto_processor_v1_0_sample_03_hex_string_to_code

AStyle 代码风格美化 (查看 INI 配置文件)

image_clipboard_auto_processor_v1_0_sample_04_astyle_c_custom
</description>
      <content:encoded>这个工具最开始是 2016 年时写了个很粗糙的版本，只有自己一直在用。今年业余抽时间整理了一下代码，把原来设计的基础功能都补充完整了，感觉可以发一个 1.0 版本了。目标用户主要是程序员，可以自己编写脚本把平时一些重复性的文本处理操作自动化。&lt;br /&gt;&lt;br /&gt;GitHub 地址: &lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/clipboard-auto-processor&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;考虑到 GitHub 上的图片经常加载不出来，把 readme 的所有内容直接贴这儿了。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 简介&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Clipboard Auto Processor 是一个剪贴板文本自动处理工具。不同于一般的剪贴板增强软件只是管理历史内容，该工具可以自动调用任何脚本，来自动处理剪贴板中的内容。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_screenshot&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_screenshot_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;脚本可以使用 PHP, Python 或 JavaScript 等任何您熟悉的语言来编写，只需实现从原始文本到所需结果的转换即可，其余工作均由 Clipboard Auto Processor 完成。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 使用方法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;下载最新的 release 版本，解压到任意有写权限的位置，通常只要不放在 Windows, Program Files 或 C 盘根目录等路径下就可以。&lt;br /&gt;&lt;br /&gt;首次运行 ClipboardAutoProcessor.exe 主程序时，程序会根据当前系统语言创建 config.ini 配置文件。之后可以修改该文件来设置脚本解释路径和显示字体等选项。&lt;br /&gt;&lt;br /&gt;您可以手动创建快捷方式，放置到开始菜单中或桌面上。但是更推荐使用 &lt;a href=&quot;https://www.launchy.net/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Launchy&lt;/a&gt;, &lt;a href=&quot;http://www.wox.one/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Wox&lt;/a&gt; 和 &lt;a href=&quot;http://keypirinha.com/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Keypirinha&lt;/a&gt; 等快速启动工具，实现随时快速打开使用。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_launchy&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 示例脚本&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;转换文件路径列表中的反斜杠 (查看 &lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/convert_copied_paths.js&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;JS&lt;/a&gt;, &lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/convert_copied_paths.php&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;PHP&lt;/a&gt;, &lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/convert_copied_paths_base64_utf8.py&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Python&lt;/a&gt; 脚本)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_sample_01_convert_copied_paths&quot; /&gt;&lt;br /&gt;&lt;br /&gt;调整从 PDF 文档所复制文本的格式 (&lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/convert_esp8266_pdf_text.php&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;查看 PHP 脚本&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_sample_02_convert_esp8266_pdf_text&quot; /&gt;&lt;br /&gt;&lt;br /&gt;十六进制字符串到数组定义 (&lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/hex_string_to_code.php&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;查看 PHP 脚本&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_sample_03_hex_string_to_code&quot; /&gt;&lt;br /&gt;&lt;br /&gt;AStyle 代码风格美化 (&lt;a href=&quot;https://github.com/wudicgi/clipboard-auto-processor/tree/master/bin/Debug/scripts/astyle_c_custom.astyle-ini&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;查看 INI 配置文件&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_clipboard_auto_processor_v1_0_sample_04_astyle_c_custom&quot; /&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/f4e09d12/released-an-open-source-clipboard-utility-clipboard-auto-processor?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/f4e09d12/released-an-open-source-clipboard-utility-clipboard-auto-processor?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>已经成功将 Spleeter 引入到了 BeatShow 的音频处理过程中</title>
      <link>https://blog.wudilabs.com/entry/d4e0ac1b/spleeter-has-been-successfully-introduced-into-the-audio-processing-of-beatshow</link>
      <comments>https://blog.wudilabs.com/entry/d4e0ac1b/spleeter-has-been-successfully-introduced-into-the-audio-processing-of-beatshow#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d4e0ac1b/spleeter-has-been-successfully-introduced-into-the-audio-processing-of-beatshow?lang=zh-CN</guid>
      <pubDate>Sun, 12 Jul 2020 13:06:17 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>经过两个周末的努力，已经成功将 Spleeter 引入到 BeatShow 中，用于音频文件的预处理。现在像《东风破》这样节奏比较慢，人声分离度不是很高的音乐也可以处理了。

[[Video:https://v.youku.com/v_show/id_XNDc2ODIyOTM1Mg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODIyOTM1Mg==.html

不过要看效果的话，还是得节奏欢快一点的音乐才好看。现在相比之前，人声和乐器轨的效果更好了一些。

[[Video:https://v.youku.com/v_show/id_XNDc2ODIzMDY1Ng==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODIzMDY1Ng==.html
</description>
      <content:encoded>经过两个周末的努力，已经成功将 Spleeter 引入到 BeatShow 中，用于音频文件的预处理。现在像《东风破》这样节奏比较慢，人声分离度不是很高的音乐也可以处理了。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODIyOTM1Mg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODIyOTM1Mg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODIyOTM1Mg==.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;不过要看效果的话，还是得节奏欢快一点的音乐才好看。现在相比之前，人声和乐器轨的效果更好了一些。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODIzMDY1Ng==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODIzMDY1Ng==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODIzMDY1Ng==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d4e0ac1b/spleeter-has-been-successfully-introduced-into-the-audio-processing-of-beatshow?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>发现了一个开源的人声和乐器音轨分离软件 Spleeter</title>
      <link>https://blog.wudilabs.com/entry/a460ecf1/discovered-an-open-source-vocal-instrument-separation-software-spleeter</link>
      <comments>https://blog.wudilabs.com/entry/a460ecf1/discovered-an-open-source-vocal-instrument-separation-software-spleeter#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a460ecf1/discovered-an-open-source-vocal-instrument-separation-software-spleeter?lang=zh-CN</guid>
      <pubDate>Thu, 02 Jul 2020 15:10:35 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音频处理</category>
      <category>开源</category>
      <category>BeatShow</category>
      <description>用郭德纲的话说就是“晴天霹雳，kucha一声”，看看这《双截棍》的分离效果。

[[Video:https://v.youku.com/v_show/id_XNDc2ODEyMjM4NA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODEyMjM4NA==.html

我每隔一段时间就会搜一遍音乐节拍识别、人声和乐器分离以及小型灯光秀设备相关的东西，这次搜出大问题了。去年 11 月，一法国公司开源了 spleeter 程序及已训练好的模型，效果和售价 1000 多刀的 RX7 软件中的 Music Rebalance 功能一样好。考虑之后把这个类库作为前置处理环节引入 BeatShow 了，这样流行音乐就也能处理了。
</description>
      <content:encoded>用郭德纲的话说就是“晴天霹雳，kucha一声”，看看这《双截棍》的分离效果。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODEyMjM4NA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODEyMjM4NA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODEyMjM4NA==.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我每隔一段时间就会搜一遍音乐节拍识别、人声和乐器分离以及小型灯光秀设备相关的东西，这次搜出大问题了。去年 11 月，一法国公司开源了 spleeter 程序及已训练好的模型，效果和售价 1000 多刀的 RX7 软件中的 Music Rebalance 功能一样好。考虑之后把这个类库作为前置处理环节引入 BeatShow 了，这样流行音乐就也能处理了。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a460ecf1/discovered-an-open-source-vocal-instrument-separation-software-spleeter?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>FFmpeg 的 Windows build 现在有了 LGPL 版本</title>
      <link>https://blog.wudilabs.com/entry/b4606b7a/ffmpeg-the-lgpl-version-of-windows-build-is-now-available</link>
      <comments>https://blog.wudilabs.com/entry/b4606b7a/ffmpeg-the-lgpl-version-of-windows-build-is-now-available#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b4606b7a/ffmpeg-the-lgpl-version-of-windows-build-is-now-available?lang=zh-CN</guid>
      <pubDate>Sat, 27 Jun 2020 11:20:57 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机软件</category>
      <category>开源</category>
      <category>C/C++</category>
      <description>image_ffmpeg_windows_build_lgpl_thumb
</description>
      <content:encoded>&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_ffmpeg_windows_build_lgpl&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_ffmpeg_windows_build_lgpl_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b4606b7a/ffmpeg-the-lgpl-version-of-windows-build-is-now-available?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>为开源的 C# USB 库 Device.Net 添加了根据名称过滤设备的功能</title>
      <link>https://blog.wudilabs.com/entry/94d05940/added-filtering-devices-by-name-feature-in-device-dotnet-library</link>
      <comments>https://blog.wudilabs.com/entry/94d05940/added-filtering-devices-by-name-feature-in-device-dotnet-library#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/94d05940/added-filtering-devices-by-name-feature-in-device-dotnet-library?lang=zh-CN</guid>
      <pubDate>Sun, 17 May 2020 02:50:21 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>C# &amp; .NET</category>
      <category>改造</category>
      <category>开源</category>
      <description>修改后 Device.Net 库的 Github 地址:
https://github.com/wudicgi/Device.Net-display-name-filtering-enhanced

2020-06-07 添加:

今天在 BeatShow 中完善 USB 设备管理相关代码时，发现之前所修改的版本获取设备的 DisplayName 不太方便, IsDefinitionMatch() 方法中也没有检查 DisplayName 是否匹配，今天把这两个问题都改了。
</description>
      <content:encoded>修改后 Device.Net 库的 Github 地址:&lt;br /&gt;&lt;a href=&quot;https://github.com/wudicgi/Device.Net-display-name-filtering-enhanced&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/Device.Net-display-name-filtering-enhanced&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2020-06-07 添加:&lt;/span&gt;&lt;br /&gt;今天在 BeatShow 中完善 USB 设备管理相关代码时，发现之前所修改的版本获取设备的 DisplayName 不太方便, IsDefinitionMatch() 方法中也没有检查 DisplayName 是否匹配，今天把这两个问题都改了。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/94d05940/added-filtering-devices-by-name-feature-in-device-dotnet-library?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/94d05940/added-filtering-devices-by-name-feature-in-device-dotnet-library?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 的一种新的硬件形式</title>
      <link>https://blog.wudilabs.com/entry/b4d0a67b/a-new-hardware-form-of-beatshow</link>
      <comments>https://blog.wudilabs.com/entry/b4d0a67b/a-new-hardware-form-of-beatshow#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b4d0a67b/a-new-hardware-form-of-beatshow?lang=zh-CN</guid>
      <pubDate>Sun, 12 Apr 2020 05:05:10 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <description>新硬件，名字还没确定。这个设备是 USB 供电+通信的，Win7 以上的系统免驱。

[[Video:https://v.youku.com/v_show/id_XNDc2ODI4MjkxNg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODI4MjkxNg==.html
</description>
      <content:encoded>新硬件，名字还没确定。这个设备是 USB 供电+通信的，Win7 以上的系统免驱。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODI4MjkxNg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODI4MjkxNg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODI4MjkxNg==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b4d0a67b/a-new-hardware-form-of-beatshow?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>ATSHA204A 简明使用手册 (1/2: 配置项和常用命令)</title>
      <link>https://blog.wudilabs.com/entry/c4a0811d/atsha204a-brief-user-manual-1-of-2</link>
      <comments>https://blog.wudilabs.com/entry/c4a0811d/atsha204a-brief-user-manual-1-of-2#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/c4a0811d/atsha204a-brief-user-manual-1-of-2?lang=zh-CN</guid>
      <pubDate>Thu, 30 Jan 2020 12:06:52 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>电子</category>
      <description>本文共分 2 部分:

  C4A090C0 ATSHA204A 简明使用手册 (1/2: 配置项和常用命令)
  ATSHA204A 简明使用手册 (2/2: 防克隆应用和数据个人化) (编写中)


前言

在 BeatShow 硬件中，我需要使用 ATSHA204A 为 ESP8266 和 STM32 的固件提供一定的验证功能，以尽量保护硬件不被克隆。当然，我没有使用 MCU 验证 ATSHA204A 的这种方式，而是选择在通信过程中，由 PC 端来验证 ATSHA204A. 使用这种方式的好处在于, PC 端软件是可以通过混淆、虚拟化、加壳等手段来增加破解难度的，而且随着软件升级还可以修改验证时使用的数据，灵活度更高一些。

确定使用方式后，我本身其实只需要在生产阶段向 ATSHA204A 写入一些预先计算好的密钥值，然后在使用阶段由 PC 端软件通过指令交互来验证这些密钥值是否正确就可以了。但是 ATSHA204A 本身的功能比较多，配置也比较灵活，直接看 Atmel (当然被收购之后应该说 Microchip 了) 的 datasheet 容易被绕晕。网上能搜到的文章感觉写得也不够清楚，或者比较散，可能还不如直接看 datasheet. 因此我在阅读 datasheet 时专门梳理了一些我认为比较重要的概念和细节，并经过整理形成了本篇《ATSHA204A 简明使用手册》。

AT88CK590 评估板

Microchip 有一个 AT88CK590 评估套件 (Evaluation Kit), 可以用于评估 ATSHA204A, ATAES132A 和 ATECC508A 这三颗芯片。同时还可以自己打开外壳，在尾部的焊盘焊上插针，外接芯片使用。

image_atsha204a_brief_manual_at88ck590_01_thumb

有了这个评估套件后，就可以使用官方的 ACES CE 软件了，否则找不到设备的话是进入不了主界面的。

image_atsha204a_brief_manual_aces_ce_software_thumb

ATSHA204A 中的几个区域

Configuration Zone

Configuration Zone 是芯片内 EEPROM 中的一块存储配置信息的区域，共 88 bytes。整个 Configuration Zone 中的数据都是一直可读的，而且除了开头部分的 SN, RevNum 和 I2CEnable 不可修改外，其他数据在 Configuration Zone 未被锁定时是可写的。

image_atsha204a_brief_manual_configuration_zone_thumb

OTP Zone

OTP Zone 是 EEPROM 中的一块 32 * 2 = 64 bytes 大小的区域。在 Configuration Zone 已锁定，但 OTP Zone 未锁定时可写。

image_atsha204a_brief_manual_otp_zone_thumb

Data Zone

Data Zone 是 EEPROM 中的一块 32 * 16 = 512 bytes 大小的区域。

image_atsha204a_brief_manual_slot_09_thumb

TempKey

TempKey 是芯片内 SRAM 中的一块区域，数据长度为 32 bytes, 此外还有一些像 SlotID, SourceFlag, Valid 这样的一些状态数据。用于存储 Nonce 和 GenDig 命令的结果。

image_atsha204a_brief_manual_tempkey_thumb

区域锁定

在通过 Lock 命令写入 LockConfig 来锁定 Configuration Zone 前，OTP Zone 即不能读也不能写。只有在锁定 Configuration Zone 后，但还未通过 Lock 命令写入 LockValue 来锁定 OTP Zone 前，OTP Zone 可以通过 Write 命令写入。

ATSHA204A 的常用命令

ATSHA204A 共有 14 个命令，如下 (粗体: 较常用，灰色: 不推荐使用):


  CheckMac -- 检查 MAC 并返回 bool 结果，不推荐使用
  DeriveKey -- 从 target key 或 parent key 分散出一个 target key
  DevRev -- 获取 4 字节的芯片修订编号，软件不应该使用这个值
  GenDig -- 从一个随机或输入的种子和一个 key 生成一个数据保护摘要
  HMAC -- 计算 HMAC, 无兼容需求时不如使用 MAC 命令
  Lock -- 锁定 Configuration Zone 或 Data and OTP Zone
  MAC -- 使用 key 和其他内部数据计算一个 SHA-256 值，作为 MAC 用于验证
  Nonce -- 生成一个 32 字节的随机数 (返回)，和一个 nonce (内部存储于 TempKey, 不返回)
  Pause -- 暂停，MCU 只接一个 ATSHA204A 时用不到
  Random -- 生成一个 32 字节的随机数，不推荐使用，没有 Nonce 命令 TempKey 保密的作用
  Read -- 读取 EEPROM 中的数据
  SHA -- 计算 SHA-256 值，完全可以在 MCU 中算
  UpdateUltra -- 用于更新配置区域中的 UserExtra 和 Selector 字节，一般不用
  Write -- 写入数据到 EEPROM


不推荐使用的命令后边就不再介绍了，本文主要针对硬件防克隆这一应用介绍常用的几个命令。

使用阶段的常用命令

(符号约定: a || b 表示 a 与 b 相连接，&#039;12EF&#039; 中的 12, EF 为十六进制数据 0x12, 0xEF.)

使用阶段的常用命令有 Nonce, MAC, GenDig 和 DeriveKey.

Nonce

Nonce 是 ATSHA204A 的 datasheet 中随处可见的一个词，根据 Wiktionary 上的解释，&quot;The cryptography sense is commonly said to be a contraction of number used once, although this is probably incorrect.&quot; 把 nonce 理解成只使用一次的随机数在 ATSHA204A 中是非常恰当的，比使用 random number 多了只使用一次的含义。

Nonce 命令会生成一个 nonce, 以便在后续的 GenDig, MAC, HMAC, Read 或 Write 命令中使用。生成结果 (nonce) 会存储在 TempKey 中，同时将生成过程中产生的随机数 RandOut 返回。

Mode 参数的低 2 位指定 nonce 的生成方式:

  
    0b00
    生成一个新的随机数，将其和命令数据 NumIn 合并后，结果存储在 TempKey 中。在产生随机数前如果有必要则自动更新随机数发生器的 seed 值（推荐的方式，安全度高）。RandOut = 新生成的随机数 (32 bytes)TempKey = SHA256(RandOut || NumIn (20 bytes) || ...)
  
  
    0b01
    同 0b00, 除了生成随机数前不更新随机数发生器的 seed 值，直接使用原有的 seed 值。RandOut = 新生成的随机数 (32 bytes)TempKey = SHA256(RandOut || NumIn (20 bytes) || ...)
  
  
    0b11
    透传模式，直接将命令数据 NumIn 写入到 TempKey 中。RandOut = &#039;00&#039;TempKey = NumIn
  


MAC

使用芯片内存储的 key 或其他数据和命令数据 Challenge 计算一个 SHA-256 值，作为 MAC 返回。


Response = SHA256(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SlotID 指定的内部 key 或 TempKey ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;命令数据 Challenge 或 TempKey (推荐) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(OTP 的前 11 bytes) 或 (OTP 的前 8 bytes || &#039;000000&#039;) 或 (11 bytes &#039;00&#039;) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 调整过顺序的所有 9 bytes) 或 (SN 的最后 1 byte || 4 bytes &#039;00&#039; || SN 的前 2 bytes || 2 bytes &#039;00&#039;)
)


GenDig

生成摘要，使用内部存储的数据 (配置区域数据，OTP 数据，或 key 值) 和 TempKey 的当前内容计算一个 SHA-256 值，并将其更新到 TempKey 中。

执行该命令可以为需要使用 TempKey 值的命令 (如 MAC 和 DeriveKey 命令) 引入额外的参与运算的数据。

如果 Zone 参数为 0x02 (Data), 且SlotConfig&lt;SlotID&gt;.CheckOnly 位为 1, 则摘要按如下内容计算：


TempKey = SHA256(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SlotID 指定的内部 key ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;命令数据 OtherData ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey
)


否则按如下方式计算：


TempKey = SHA256(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Config 或 OTP 或 Data.slot 或 TransportKey ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey
)


DeriveKey

分散密钥，使用当前的一个 key 值 (source key) 和 TempKey 中存储的 nonce 计算一个 SHA-256 值，并将其写入到 target key 的 slot 中。

结果写入到哪个 slot 由命令参数 TargetKey 指定，SlotConfig&lt;TargetKey&gt;.Bit13 必须已被置位。

如果 SlotConfig&lt;TargetKey&gt;.Bit12 为 0, 则参与 hash 计算的 source key 就是 target key (即 key rolling, 密钥滚动操作)。
如果该位为 1, 则 source key 为该 target key 的 parent key, 通过 SlotConfig&lt;TargetKey&gt;.WriteKey 中指定的 slot 号来查找 (即密钥创建操作).

如果 SlotConfig&lt;TargetKey&gt;.Bit15 为 1, 则必须计算并提供命令数据 MAC 用于验证。
MAC = SHA256(ParentKey, Opcode, Param1, Param2, SN&lt;8&gt;, SN&lt;0:1&gt;)
其中 ParentKey 是 SlotConfig&lt;TargetKey&gt;.WriteKey 中指定的 slot 号的 key.


target key = SHA256(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source key (target key 或 parent key) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey
)


生产阶段的常用命令

生产 (数据个人化) 阶段的常用命令有 Write, Read 和 Lock. 待更新下一篇时再补充本部分内容。
</description>
      <content:encoded>本文共分 2 部分:&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.wudilabs.com/entry/c4a090c0/atsha204a-brief-user-manual-1-of-2&quot;&gt;ATSHA204A 简明使用手册 (1/2: 配置项和常用命令)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;ATSHA204A 简明使用手册 (2/2: 防克隆应用和数据个人化) (编写中)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;前言&lt;/div&gt;&lt;br /&gt;在 BeatShow 硬件中，我需要使用 ATSHA204A 为 ESP8266 和 STM32 的固件提供一定的验证功能，以尽量保护硬件不被克隆。当然，我没有使用 MCU 验证 ATSHA204A 的这种方式，而是选择在通信过程中，由 PC 端来验证 ATSHA204A. 使用这种方式的好处在于, PC 端软件是可以通过混淆、虚拟化、加壳等手段来增加破解难度的，而且随着软件升级还可以修改验证时使用的数据，灵活度更高一些。&lt;br /&gt;&lt;br /&gt;确定使用方式后，我本身其实只需要在生产阶段向 ATSHA204A 写入一些预先计算好的密钥值，然后在使用阶段由 PC 端软件通过指令交互来验证这些密钥值是否正确就可以了。但是 ATSHA204A 本身的功能比较多，配置也比较灵活，直接看 Atmel (当然被收购之后应该说 Microchip 了) 的 datasheet 容易被绕晕。网上能搜到的文章感觉写得也不够清楚，或者比较散，可能还不如直接看 datasheet. 因此我在阅读 datasheet 时专门梳理了一些我认为比较重要的概念和细节，并经过整理形成了本篇《ATSHA204A 简明使用手册》。&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;AT88CK590 评估板&lt;/div&gt;&lt;br /&gt;Microchip 有一个 &lt;a href=&quot;https://www.microchip.com/developmenttools/ProductDetails/at88ck590&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;AT88CK590 评估套件 (Evaluation Kit)&lt;/a&gt;, 可以用于评估 ATSHA204A, ATAES132A 和 ATECC508A 这三颗芯片。同时还可以自己打开外壳，在尾部的焊盘焊上插针，外接芯片使用。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_at88ck590_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_at88ck590_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;有了这个评估套件后，就可以使用&lt;a href=&quot;https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/Atmel%20Crypto%20%20Studio%20%28ACES%29&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;官方的 ACES CE 软件&lt;/a&gt;了，否则找不到设备的话是进入不了主界面的。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_aces_ce_software&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_aces_ce_software_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;ATSHA204A 中的几个区域&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Configuration Zone&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Configuration Zone 是芯片内 EEPROM 中的一块存储配置信息的区域，共 88 bytes。整个 Configuration Zone 中的数据都是一直可读的，而且除了开头部分的 SN, RevNum 和 I2CEnable 不可修改外，其他数据在 Configuration Zone 未被锁定时是可写的。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_configuration_zone&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_configuration_zone_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OTP Zone&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;OTP Zone 是 EEPROM 中的一块 32 * 2 = 64 bytes 大小的区域。在 Configuration Zone 已锁定，但 OTP Zone 未锁定时可写。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_otp_zone&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_otp_zone_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Data Zone&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Data Zone 是 EEPROM 中的一块 32 * 16 = 512 bytes 大小的区域。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_slot_09&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_slot_09_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TempKey&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TempKey 是芯片内 SRAM 中的一块区域，数据长度为 32 bytes, 此外还有一些像 SlotID, SourceFlag, Valid 这样的一些状态数据。用于存储 Nonce 和 GenDig 命令的结果。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_tempkey&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_atsha204a_brief_manual_tempkey_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;区域锁定&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;在通过 Lock 命令写入 LockConfig 来锁定 Configuration Zone 前，OTP Zone 即不能读也不能写。只有在锁定 Configuration Zone 后，但还未通过 Lock 命令写入 LockValue 来锁定 OTP Zone 前，OTP Zone 可以通过 Write 命令写入。&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;ATSHA204A 的常用命令&lt;/div&gt;&lt;br /&gt;ATSHA204A 共有 14 个命令，如下 (&lt;b&gt;粗体: 较常用&lt;/b&gt;，&lt;span style=&quot;color: #999999;&quot;&gt;灰色: 不推荐使用&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;CheckMac -- 检查 MAC 并返回 bool 结果，不推荐使用&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;DeriveKey -- 从 target key 或 parent key 分散出一个 target key&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;DevRev -- 获取 4 字节的芯片修订编号，软件不应该使用这个值&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;GenDig&lt;/b&gt; -- 从一个随机或输入的种子和一个 key 生成一个数据保护摘要&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;HMAC -- 计算 HMAC, 无兼容需求时不如使用 MAC 命令&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Lock&lt;/b&gt; -- 锁定 Configuration Zone 或 Data and OTP Zone&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;MAC&lt;/b&gt; -- 使用 key 和其他内部数据计算一个 SHA-256 值，作为 MAC 用于验证&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Nonce&lt;/b&gt; -- 生成一个 32 字节的随机数 (返回)，和一个 nonce (内部存储于 TempKey, 不返回)&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;Pause -- 暂停，MCU 只接一个 ATSHA204A 时用不到&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;Random -- 生成一个 32 字节的随机数，不推荐使用，没有 Nonce 命令 TempKey 保密的作用&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Read&lt;/b&gt; -- 读取 EEPROM 中的数据&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;SHA -- 计算 SHA-256 值，完全可以在 MCU 中算&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #999999;&quot;&gt;UpdateUltra -- 用于更新配置区域中的 UserExtra 和 Selector 字节，一般不用&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Write&lt;/b&gt; -- 写入数据到 EEPROM&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;不推荐使用的命令后边就不再介绍了，本文主要针对硬件防克隆这一应用介绍常用的几个命令。&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;使用阶段的常用命令&lt;/div&gt;&lt;br /&gt;(符号约定: a || b 表示 a 与 b 相连接，&#039;12EF&#039; 中的 12, EF 为十六进制数据 0x12, 0xEF.)&lt;br /&gt;&lt;br /&gt;使用阶段的常用命令有 Nonce, MAC, GenDig 和 DeriveKey.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nonce&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nonce 是 ATSHA204A 的 datasheet 中随处可见的一个词，根据 &lt;a href=&quot;https://en.wiktionary.org/wiki/nonce&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Wiktionary 上的解释&lt;/a&gt;，&quot;The cryptography sense is commonly said to be a contraction of number used once, although this is probably incorrect.&quot; 把 nonce 理解成只使用一次的随机数在 ATSHA204A 中是非常恰当的，比使用 random number 多了只使用一次的含义。&lt;br /&gt;&lt;br /&gt;Nonce 命令会生成一个 nonce, 以便在后续的 GenDig, MAC, HMAC, Read 或 Write 命令中使用。生成结果 (nonce) 会存储在 TempKey 中，同时将生成过程中产生的随机数 RandOut 返回。&lt;br /&gt;&lt;br /&gt;Mode 参数的低 2 位指定 nonce 的生成方式:&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;1&quot; cellpadding=&quot;5&quot; style=&quot;background-color: #999999; width: 100%;&quot;&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td valign=&quot;top&quot; style=&quot;padding-right: 2em;&quot;&gt;0b00&lt;/span&gt;&lt;/td&gt;
    &lt;td valign=&quot;top&quot;&gt;生成一个新的随机数，将其和命令数据 NumIn 合并后，结果存储在 TempKey 中。在产生随机数前如果有必要则自动更新随机数发生器的 seed 值（推荐的方式，安全度高）。&lt;br /&gt;RandOut = 新生成的随机数 (32 bytes)&lt;br /&gt;TempKey = SHA256(RandOut || NumIn (20 bytes) || ...)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td valign=&quot;top&quot;&gt;0b01&lt;/td&gt;
    &lt;td valign=&quot;top&quot;&gt;同 0b00, 除了生成随机数前不更新随机数发生器的 seed 值，直接使用原有的 seed 值。&lt;br /&gt;RandOut = 新生成的随机数 (32 bytes)&lt;br /&gt;TempKey = SHA256(RandOut || NumIn (20 bytes) || ...)&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td valign=&quot;top&quot;&gt;0b11&lt;/td&gt;
    &lt;td valign=&quot;top&quot;&gt;透传模式，直接将命令数据 NumIn 写入到 TempKey 中。&lt;br /&gt;RandOut = &#039;00&#039;&lt;br /&gt;TempKey = NumIn&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;&lt;b&gt;MAC&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;使用芯片内存储的 key 或其他数据和命令数据 Challenge 计算一个 SHA-256 值，作为 MAC 返回。&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #999999; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;
&lt;div style=&quot;padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Response = SHA256(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SlotID 指定的内部 key 或 TempKey ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;命令数据 Challenge 或 TempKey (推荐) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(OTP 的前 11 bytes) 或 (OTP 的前 8 bytes || &#039;000000&#039;) 或 (11 bytes &#039;00&#039;) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 调整过顺序的所有 9 bytes) 或 (SN 的最后 1 byte || 4 bytes &#039;00&#039; || SN 的前 2 bytes || 2 bytes &#039;00&#039;)&lt;br /&gt;
)&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;&lt;b&gt;GenDig&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;生成摘要，使用内部存储的数据 (配置区域数据，OTP 数据，或 key 值) 和 TempKey 的当前内容计算一个 SHA-256 值，并将其更新到 TempKey 中。&lt;br /&gt;&lt;br /&gt;执行该命令可以为需要使用 TempKey 值的命令 (如 MAC 和 DeriveKey 命令) 引入额外的参与运算的数据。&lt;br /&gt;&lt;br /&gt;如果 Zone 参数为 0x02 (Data), 且SlotConfig&amp;lt;SlotID&amp;gt;.CheckOnly 位为 1, 则摘要按如下内容计算：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #999999; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;
&lt;div style=&quot;padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;TempKey = SHA256(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SlotID 指定的内部 key ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;命令数据 OtherData ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey&lt;br /&gt;
)&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;否则按如下方式计算：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #999999; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;
&lt;div style=&quot;padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;TempKey = SHA256(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Config&lt;SlotID&gt; 或 OTP&lt;SlotID&gt; 或 Data.slot&lt;SlotID&gt; 或 TransportKey&lt;SlotID&gt; ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey&lt;br /&gt;
)&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;&lt;b&gt;DeriveKey&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;分散密钥，使用当前的一个 key 值 (source key) 和 TempKey 中存储的 nonce 计算一个 SHA-256 值，并将其写入到 target key 的 slot 中。&lt;br /&gt;&lt;br /&gt;结果写入到哪个 slot 由命令参数 TargetKey 指定，SlotConfig&amp;lt;TargetKey&amp;gt;.Bit13 必须已被置位。&lt;br /&gt;&lt;br /&gt;如果 SlotConfig&amp;lt;TargetKey&amp;gt;.Bit12 为 0, 则参与 hash 计算的 source key 就是 target key (即 key rolling, 密钥滚动操作)。&lt;br /&gt;如果该位为 1, 则 source key 为该 target key 的 parent key, 通过 SlotConfig&amp;lt;TargetKey&amp;gt;.WriteKey 中指定的 slot 号来查找 (即密钥创建操作).&lt;br /&gt;&lt;br /&gt;如果 SlotConfig&amp;lt;TargetKey&amp;gt;.Bit15 为 1, 则必须计算并提供命令数据 MAC 用于验证。&lt;br /&gt;MAC = SHA256(ParentKey, Opcode, Param1, Param2, SN&amp;lt;8&amp;gt;, SN&amp;lt;0:1&amp;gt;)&lt;br /&gt;其中 ParentKey 是 SlotConfig&amp;lt;TargetKey&amp;gt;.WriteKey 中指定的 slot 号的 key.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #999999; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;
&lt;div style=&quot;padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;target key = SHA256(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source key (target key 或 parent key) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SN 的最后 1 byte || SN 的前 2 bytes) ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... ||&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TempKey&lt;br /&gt;
)&lt;/div&gt;
&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;font-weight: bold; font-size: 14pt; text-align: center;&quot;&gt;生产阶段的常用命令&lt;/div&gt;&lt;br /&gt;生产 (数据个人化) 阶段的常用命令有 Write, Read 和 Lock. 待更新下一篇时再补充本部分内容。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/c4a0811d/atsha204a-brief-user-manual-1-of-2?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>尝试了一下根据鬼畜小课堂的扒谱教程进行扒谱</title>
      <link>https://blog.wudilabs.com/entry/e32fe1d7/i-tried-to-do-a-transcribing-according-to-a-tutorial-video</link>
      <comments>https://blog.wudilabs.com/entry/e32fe1d7/i-tried-to-do-a-transcribing-according-to-a-tutorial-video#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e32fe1d7/i-tried-to-do-a-transcribing-according-to-a-tutorial-video?lang=zh-CN</guid>
      <pubDate>Tue, 24 Sep 2019 15:15:23 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音乐</category>
      <description>昨天看到了 B 站 UP 主 还有一天就放假了 发的一个 《【鬼畜小课堂018】使用FL Studio扒谱》教程，今天就试了一下。

感觉对于我这种完全不懂乐理，也听不出 do re mi 的人来说还是挺适用的。下边是我扒的 Pain in My Heart 中的一个小片段:

[[Video:https://v.youku.com/v_show/id_XNDc2ODI5ODkyMA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODI5ODkyMA==.html
</description>
      <content:encoded>昨天看到了 B 站 UP 主 &lt;a href=&quot;https://space.bilibili.com/7792521&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;还有一天就放假了&lt;/a&gt; 发的一个 《&lt;a href=&quot;https://www.bilibili.com/video/av67539627&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;【鬼畜小课堂018】使用FL Studio扒谱&lt;/a&gt;》教程，今天就试了一下。&lt;br /&gt;&lt;br /&gt;感觉对于我这种完全不懂乐理，也听不出 do re mi 的人来说还是挺适用的。下边是我扒的 Pain in My Heart 中的一个小片段:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODI5ODkyMA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODI5ODkyMA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODI5ODkyMA==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e32fe1d7/i-tried-to-do-a-transcribing-according-to-a-tutorial-video?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>你所没见过的银河 SOHO...</title>
      <link>https://blog.wudilabs.com/entry/a34e1488/the-galaxy-soho-you-have-never-seen</link>
      <comments>https://blog.wudilabs.com/entry/a34e1488/the-galaxy-soho-you-have-never-seen#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a34e1488/the-galaxy-soho-you-have-never-seen?lang=zh-CN</guid>
      <pubDate>Fri, 08 Mar 2019 16:16:25 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>晚上拍的，你所没见过的银河 SOHO...

[[Video:https://v.youku.com/v_show/id_XNDc2ODI5MzMzNg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XNDc2ODI5MzMzNg==.html

本来想一圈一圈 PS 的，但 GoPro 夜间拍出来的画质还是比较渣，就先不弄了。
</description>
      <content:encoded>晚上拍的，你所没见过的银河 SOHO...&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XNDc2ODI5MzMzNg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XNDc2ODI5MzMzNg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XNDc2ODI5MzMzNg==.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;本来想一圈一圈 PS 的，但 GoPro 夜间拍出来的画质还是比较渣，就先不弄了。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a34e1488/the-galaxy-soho-you-have-never-seen?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>配置出一个更好用的 Windows 10</title>
      <link>https://blog.wudilabs.com/entry/c3ee92cb/making-windows-10-better-to-use</link>
      <comments>https://blog.wudilabs.com/entry/c3ee92cb/making-windows-10-better-to-use#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/c3ee92cb/making-windows-10-better-to-use?lang=zh-CN</guid>
      <pubDate>Tue, 12 Feb 2019 12:51:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>计算机软件</category>
      <description>
历史相关文章：
2013-01-28: 《93A221AB 将 WINDOWS 7 配置成 WINDOWS XP 的样子 (同时关闭一些恼人的功能)》
2015-10-31: 《B357B3FE 将 WINDOWS 7 配置成 WINDOWS 8.1 的样子》
2016-01-03: 《F3E89092 配置出一个更好用的 WINDOWS 8.1》

以下配置过程是我在配置 Windows 10 系统的过程中记录下来的，仅供参考。

1. 调节 DPI


  右键点击桌面 -&gt; 显示设置 -&gt; 缩放与布局
  更改文本、应用等项目的大小 -&gt; 选择一个文字大小适中的缩放比例
  点击缩放比例选择下方的“高级缩放设置”
  修复应用缩放 -&gt; 允许 Windows 尝试修复应用，使其不模糊 -&gt; 打开
  注销并重新登入
  右键点击桌面 -&amp;gt; 查看 -&amp;gt; 选择“小图标”
  右键点击桌面 -&amp;gt; 查看 -&amp;gt; 开启“自动排列图标”


2. 禁用动画效果


  右键点击开始菜单按钮 -&amp;gt; 文件资源管理器, 或按 Win+E 快捷键打开资源管理器
  右键点击左侧导航窗格的“此电脑” -&amp;gt; 属性 -&amp;gt; 高级系统设置
  高级 -&amp;gt; 性能 -&amp;gt; 设置... -&amp;gt; 视觉效果 -&amp;gt; 取消所有动画效果的选择



3. 设置 UAC


  开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 用户帐户 -&amp;gt; 更改用户帐户控制设置
  选择“仅当应用尝试更改计算机时通知我 (不降低桌面亮度)”


4. 安装 Open-Shell


  从 github 上 Open-Shell-Menu 项目的Releases 页面下载安装程序 OpenShellSetup_xxx.exe
  安装 Open-Shell, 最好选择不安装其中的 Classic IE 和 Open-Shell Update 组件.



关于 Open-Shell
Ivo Beltchev 的 Classic Shell 已经于 2017 年 12 月停止开发，原因是 Win10 现在滚动更新得太频繁了，而且很多组件在由经典 Win32 程序向 UWP 程序迁移，作者能用于此项目的业余时间也不多，无法持续跟进更新。
Open-Shell 是其他人在 Classic Shell 上 fork 出来的一个分支，宣称会继续开发。不过我看了一下在 github 上的提交历史，到目前为止的修改基本只是替换软件名称，之后是否会持续更新不得而知。

5. 设置开始菜单


  开始菜单 -&gt; 程序 -&gt; Open-Shell -&gt; Open-Shell Menu Settings
  在 Start Menu Style 选项卡中，选择 Classic style
  勾选顶部的 Show all settings
  逐个选项卡查看，并按自己的喜好进行配置，也可以导入以前使用过的配置
  以下是我自己所进行的设置，供参考：


Special Items
    Computer: 选择 Don&#039;t display this item
    取消选择 Show Help and Support
Main Menu
    Show recent or frequent programs: 选择 Don&#039;t show
    取消选择 Enable jumplists
General Behavior
    取消选择 Highlight newly installed programs
    取消选择 Check for Windows updates on shutdown
Skin
    选择 Windows 8
Taskbar
    选择 Customize taskbar
        Taskbar look: 选择 Opaque
        Taskbar color: 选择一个较深的颜色，如蓝色主题可使用深蓝色 976600

6. 设置资源管理器

首先，设置 Open-Shell 所提供的选项。


  开始菜单 -&gt; 程序 -&gt; Open-Shell -&gt; Classic Explorer Settings
  勾选顶部的 Show all settings
  逐个选项卡查看，并按自己的喜好进行配置，也可以导入以前使用过的配置
  以下是我自己所进行的设置，供参考：


Navigation Pane
    Navigation pane style: 选择 Windows XP Simple
    选择 Don&#039;t fade buttons
    选择 Full-size offset for sub-folders
    Auto-navigate to the selected folder: 选择 Always
    Auto-navigation delay: 由默认值 100 改为 200
Title Bar
    选择 Disable breadcrumbs

接着，设置 Windows 资源管理器自身提供的选项。


  按 Win+E 快捷键打开资源管理器
  右键点击工具栏空白处，取消选择 Classic Explorer Bar
  查看 -&gt; 选项，打开文件夹选项对话框
  常规 -&gt; 打开文件资源管理器时打开 -&gt; 选择“此电脑”
  常规 -&gt; 隐私 -&gt; 取消选择 在“快速访问”中显示最近使用的文件
  常规 -&gt; 隐私 -&gt; 取消选择 在“快速访问”中显示常用文件夹
  常规 -&gt; 隐私 -&gt; 清除文件资源管理器历史记录 -&gt; 点击“清除”
  查看 -&gt; 导航窗格 -&gt; 选择“展开到打开的文件夹”
  查看 -&gt; 导航窗格 -&gt; 按个人喜好决定是否选择“显示库”
  查看 -&gt; 文件和文件夹 -&gt; 隐藏文件和文件夹 -&gt; 选择“显示隐藏的文件、文件夹和驱动器”
  查看 -&gt; 文件和文件夹 -&gt; 选择“用彩色显示加密或压缩的 NTFS 文件”
  点击确定按钮，保存设置


17. 设置标题栏和任务栏颜色


  右键点击桌面 -&gt; 个性化 -&gt; 颜色
  选择颜色 -&gt; Windows 颜色 -&gt; 选择一个较深的蓝色
  更多选项 -&gt; 更多选项 -&gt; 透明效果 -&gt; 关闭
  更多选项 -&gt; 在以下区域显示主题色 -&gt; 选中“开始菜单、任务栏和操作中心”
  更多选项 -&gt; 在以下区域显示主题色 -&gt; 选中“标题栏”



任务栏背景颜色，和活动窗口任务栏按钮颜色的配置
任务栏背景颜色: 在 Open-Shell 的开始菜单设置中 Taskbar -&gt; Customize taskbar -&gt; Taskbar color 所指定的颜色。
任务栏上活动窗口按钮的颜色: 在 Windows 的 个性化 -&gt; 颜色 -&gt; 选择颜色 中所选择的颜色。
这两个颜色应该有良好的区分度，例如状态栏背景使用蓝色的话，活动窗口按钮颜色就使用深蓝色。

7. 设置任务栏


  右键点击任务栏空白位置 -&amp;gt; 任务栏设置
  在桌面模式下自动隐藏任务栏 -&amp;gt; 打开
  使用小任务栏按钮 -&amp;gt; 打开
  当我右键单击“开始”按钮或按下 Windows 键 + X 时，在菜单中将命令提示符替换为 Windows PowerShell -&amp;gt; 关闭
  合并任务栏按钮 -&amp;gt; 选择“从不”
  通知区域 -&amp;gt; 选择哪些图标显示在任务栏上 -&amp;gt; 按自己的喜好设置
  通知区域 -&amp;gt; 打开或关闭系统图标 -&amp;gt; 按自己的喜好设置
  人脉 -&amp;gt; 在任务栏上显示联系人 -&gt; 关闭
  右键点击任务栏空白位置 -&amp;gt; Cortana -&gt; 选择“隐藏”
  右键点击任务栏空白位置 -&amp;gt; 取消选择 显示“任务视图”按钮


9. 为任务栏添加快速启动栏


按 Win+E 快捷键打开资源管理器，在地址栏中输入 %APPDATA%\Microsoft\Internet Explorer\Quick Launch 并按回车
复制地址栏中的地址，应为 C:\Users\&amp;lt;你的用户名&amp;gt;\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
右键点击任务栏空白位置 -&amp;gt; 工具栏 -&gt; 选择“新建工具栏...”
将刚才复制的 Quick Launch 目录完整路径粘贴到选择文件夹对话框的地址栏中，按回车，然后点击选择文件夹
右键点击任务栏空白位置 -&amp;gt; 取消选择“锁定任务栏”
拖拽刚才新建的 Quick Launch 工具栏到开始按钮右侧
右键点击 Quick Launch 工具栏 -&gt; 取消选择“显示文本”
右键点击 Quick Launch 工具栏 -&gt; 取消选择“显示标题”
在 %APPDATA%\Microsoft\Internet Explorer\Quick Launch 目录中放置少量自己常用程序的快捷方式，例如浏览器，和使用资源管理器打开 D 盘的快捷方式: C:\Windows\explorer.exe /e,D:\
删除 Quick Launch 目录中原本可能存在的“显示桌面”和“在窗口之间切换”快捷方式
调节 Quick Launch 工具栏所占的宽度，需要来回切换是否锁定任务栏，以调节到宽度合适
右键点击任务栏空白位置 -&amp;gt; 选择“锁定任务栏”
关闭所有已打开的窗口
右键逐一点击任务栏上的程序图标 -&amp;gt; 选择“从任务栏取消固定”



使用快速启动栏，相比将应用固定到任务栏的优势
从 Windows 7 开始，任务栏上的快速启动栏默认就不存在了，转而出现了新的将程序固定到任务栏的用法。这种新的用法有两个问题：
(1) 严重降低了程序切换的效率。尤其是在同一个程序开启了多个窗口的情况下，用户不得不先将鼠标移动到任务栏的图标上，等窗口预览弹出后再选择要切换到哪个窗口。
(2) 各个程序的任务栏按钮宽度可能会不一致。固定到任务栏上的程序在未打开时只显示图标，而任务栏如果设置了显示不隐藏标签，打开的程序是会显示标题文本的。


8. 安装 7+ Taskbar Tweak


  从7+ Taskbar Tweaker - RaMMicHaeL&#039;s Blog下载 7tt_setup.exe, 并安装
  配置各项。我的设置如下图所示，供参考：



10. 设置时间选项


  开始 -&amp;gt; 设置 -&gt; 电脑设置 -&amp;gt; 时间和语言
  日期和时间 -&gt; 格式 -&gt; 更改日期和时间格式
  一周的第一天: 星期日
  短日期格式: yyyy-M-d


11. 键盘快捷方式下划线


  开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 轻松使用设置中心 -&amp;gt; 使键盘更易于使用
  取消选择“始终朗读这个部分”
  取消选择“始终扫描这个部分”
  使鼠标更易于使用 -&gt; 勾选“将窗口移动到屏幕边缘时不要自动排列窗口”
  使键盘更易于使用 -&gt; 勾选“给键盘快捷方式和访问键加下划线”



“给键盘快捷方式和访问键加下划线”选项的作用：
(1) 在英文版系统中，只有开启该选项后，像文件右键菜单中的 Rename 才会显示为 Rename，从而能看出键盘快捷键是什么。而中文版系统中，由于一般会使用“重命名(M)”这种形式，是否开启则只看个人喜好，对使用影响不大。
(2) 只有开启该选项后，复选框和桌面图标等控件在获得焦点时，才会显示虚线边框，有助于确认当前获得焦点的控件是哪个，也便于键盘操作。

12. 关闭自动播放


  开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 自动播放
  先点击最下方的“重置所有默认值”按钮，使每个选择框都为“选择默认值”状态
  然后取消选中最上方的“为所有媒体和设备使用自动播放”复选框
  点击“保存”按钮完成设置


13. 隐藏资源管理器左侧目录树中的 3D 对象、文档、下载等文件夹


  从How to Remove the Folders From &quot;This PC&quot; on Windows 10下载 Remove-Folders-From-This-PC-on-Windows-10.zip
  解压出 64-bit versions of Windows 10\Remove All User Folders From This PC 64-bit.reg 文件，并导入注册表
  从How to Remove &quot;3D Objects&quot; From This PC on Windows 10下载 Remove-3D-Objects-Folder.zip
  解压出 Remove 3D Objects Folder (64-bit Windows).reg 文件，并导入注册表


14. 禁用压缩文件夹


  将如下内容保存为 Disable_ZIP_Compressed_Folders.reg 文件，并导入注册表


Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\CompressedFolder\CLSID]

[-HKEY_CLASSES_ROOT\SystemFileAssociations\.zip\CLSID]


    将如下内容保存为 Disable_CAB_Files.reg 文件，并导入注册表


Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\CABFolder\CLSID]

[-HKEY_CLASSES_ROOT\SystemFileAssociations\.cab\CLSID]

15. 禁用文件夹内容识别


  从Change Folder Template in Windows 10下载 Reset_Folder_View_Settings_of_All_Folders_to_Default.bat, 并以管理员身份运行
  从上一步骤的同一页面下载 All_Folders_Use_General_Items_Folder_Template.bat, 并以管理员身份运行



关于 Windows 的文件夹模板和文件夹内容识别
大概是从 Win7 开始，Windows 默认就会对文件夹进行内容识别，以它认为合适的方式来展示文件列表。比如对于存放了大量 .mp3 音频文件的文件夹，以详细信息方式查看时文件列表标题会由默认的名称、类型、修改日期等变为名称、参与创作的艺术家、唱片集等。十分影响对文件的正常管理操作，对于任何类型的文件，修改日期、文件类型和文件大小信息都是比这些元数据更为重要的。

16. 设置文件夹默认视图


  按 Win+E 快捷键打开资源管理器
  查看 -&gt; 选项，打开文件夹选项对话框
  查看 -&gt; 文件夹视图 -&gt; 点击“重置文件夹”，把所有文件夹都重置为默认视图
  点击“确定”按钮，关闭文件夹选项对话框
  打开一个普通的文件夹，调整查看类型 (我习惯使用详细列表) 和名称、修改日期、类型等各列的宽度
  查看 -&gt; 选项，再次打开文件夹选项对话框
  查看 -&gt; 文件夹视图 -&gt; 点击“应用到文件夹”，使所有文件夹都使用刚才设置好的视图
  点击“确定”按钮，关闭文件夹选项对话框
  关闭资源管理器


17. 设置系统声音


  开始 -&amp;gt; 设置 -&gt; 控制面板 -&gt; 声音
  声音 -&gt; 声音方案，选择“无声”，点击确定


18. 设置输入法

Win10 上中文输入法的设置方法较为复杂，具体请看之前所发的文章《932E7229 修改 WINDOWS 10 的中文输入法配置，使其像 WIN7, XP 一样易于使用》。

</description>
      <content:encoded>&lt;div style=&quot;line-height: 1.8em;&quot;&gt;历史相关文章：&lt;br /&gt;2013-01-28: 《&lt;a href=&quot;https://blog.wudilabs.com/entry/93a221ab/transform-windows-7-into-windows-xp-and-disable-some-annoying-features&quot;&gt;将 Windows 7 配置成 Windows XP 的样子 (同时关闭一些恼人的功能)&lt;/a&gt;》&lt;br /&gt;2015-10-31: 《&lt;a href=&quot;https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1&quot;&gt;将 Windows 7 配置成 Windows 8.1 的样子&lt;/a&gt;》&lt;br /&gt;2016-01-03: 《&lt;a href=&quot;https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use&quot;&gt;配置出一个更好用的 Windows 8.1&lt;/a&gt;》&lt;br /&gt;&lt;br /&gt;以下配置过程是我在配置 Windows 10 系统的过程中记录下来的，仅供参考。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 调节 DPI&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击桌面 -&gt; 显示设置 -&gt; 缩放与布局&lt;/li&gt;
  &lt;li&gt;更改文本、应用等项目的大小 -&gt; 选择一个文字大小适中的缩放比例&lt;/li&gt;
  &lt;li&gt;点击缩放比例选择下方的“高级缩放设置”&lt;/li&gt;
  &lt;li&gt;修复应用缩放 -&gt; 允许 Windows 尝试修复应用，使其不模糊 -&gt; 打开&lt;/li&gt;
  &lt;li&gt;注销并重新登入&lt;/li&gt;
  &lt;li&gt;右键点击桌面 -&amp;gt; 查看 -&amp;gt; 选择“小图标”&lt;/li&gt;
  &lt;li&gt;右键点击桌面 -&amp;gt; 查看 -&amp;gt; 开启“自动排列图标”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;2. 禁用动画效果&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击开始菜单按钮 -&amp;gt; 文件资源管理器, 或按 Win+E 快捷键打开资源管理器&lt;/li&gt;
  &lt;li&gt;右键点击左侧导航窗格的“此电脑” -&amp;gt; 属性 -&amp;gt; 高级系统设置&lt;/li&gt;
  &lt;li&gt;高级 -&amp;gt; 性能 -&amp;gt; 设置... -&amp;gt; 视觉效果 -&amp;gt; 取消所有动画效果的选择&lt;/li&gt;
&lt;/ul&gt;
&lt;!--[[Image:image_win10_config_01_thumb|image_win10_config_01]]--&gt;&lt;br /&gt;&lt;b&gt;3. 设置 UAC&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 用户帐户 -&amp;gt; 更改用户帐户控制设置&lt;/li&gt;
  &lt;li&gt;选择“仅当应用尝试更改计算机时通知我 (不降低桌面亮度)”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;4. 安装 Open-Shell&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;从 github 上 Open-Shell-Menu 项目的 &lt;a href=&quot;https://github.com/Open-Shell/Open-Shell-Menu/releases&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Releases 页面&lt;/a&gt; 下载安装程序 OpenShellSetup_xxx.exe&lt;/li&gt;
  &lt;li&gt;安装 Open-Shell, 最好选择不安装其中的 Classic IE 和 Open-Shell Update 组件.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; width: 80%; margin: 0 auto; padding: 0.5em 1em;&quot;&gt;
&lt;div style=&quot;margin-bottom: 0.5em; font-weight: bold;&quot;&gt;关于 Open-Shell&lt;/div&gt;Ivo Beltchev 的 &lt;a href=&quot;http://www.classicshell.net/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Classic Shell&lt;/a&gt; 已经&lt;a href=&quot;http://www.classicshell.net/forum/viewtopic.php?f=4&amp;amp;t=8147&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;于 2017 年 12 月停止开发&lt;/a&gt;，原因是 Win10 现在滚动更新得太频繁了，而且很多组件在由经典 Win32 程序向 UWP 程序迁移，作者能用于此项目的业余时间也不多，无法持续跟进更新。&lt;br /&gt;Open-Shell 是其他人在 Classic Shell 上 fork 出来的一个分支，宣称会继续开发。不过我看了一下在 github 上的提交历史，到目前为止的修改基本只是替换软件名称，之后是否会持续更新不得而知。&lt;/div&gt;&lt;br /&gt;&lt;b&gt;5. 设置开始菜单&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始菜单 -&gt; 程序 -&gt; Open-Shell -&gt; Open-Shell Menu Settings&lt;/li&gt;
  &lt;li&gt;在 Start Menu Style 选项卡中，选择 Classic style&lt;/li&gt;
  &lt;li&gt;勾选顶部的 Show all settings&lt;/li&gt;
  &lt;li&gt;逐个选项卡查看，并按自己的喜好进行配置，也可以导入以前使用过的配置&lt;/li&gt;
  &lt;li&gt;以下是我自己所进行的设置，供参考：&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Special&amp;nbsp;Items&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Computer:&amp;nbsp;选择&amp;nbsp;Don&amp;#039;t&amp;nbsp;display&amp;nbsp;this&amp;nbsp;item&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;取消选择&amp;nbsp;Show&amp;nbsp;Help&amp;nbsp;and&amp;nbsp;Support&lt;br /&gt;
Main&amp;nbsp;Menu&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Show&amp;nbsp;recent&amp;nbsp;or&amp;nbsp;frequent&amp;nbsp;programs:&amp;nbsp;选择&amp;nbsp;Don&amp;#039;t&amp;nbsp;show&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;取消选择&amp;nbsp;Enable&amp;nbsp;jumplists&lt;br /&gt;
General&amp;nbsp;Behavior&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;取消选择&amp;nbsp;Highlight&amp;nbsp;newly&amp;nbsp;installed&amp;nbsp;programs&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;取消选择&amp;nbsp;Check&amp;nbsp;for&amp;nbsp;Windows&amp;nbsp;updates&amp;nbsp;on&amp;nbsp;shutdown&lt;br /&gt;
Skin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选择&amp;nbsp;Windows&amp;nbsp;8&lt;br /&gt;
Taskbar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选择&amp;nbsp;Customize&amp;nbsp;taskbar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Taskbar&amp;nbsp;look:&amp;nbsp;选择&amp;nbsp;Opaque&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Taskbar&amp;nbsp;color:&amp;nbsp;选择一个较深的颜色，如蓝色主题可使用深蓝色&amp;nbsp;976600&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;6. 设置资源管理器&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;首先，设置 Open-Shell 所提供的选项。&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始菜单 -&gt; 程序 -&gt; Open-Shell -&gt; Classic Explorer Settings&lt;/li&gt;
  &lt;li&gt;勾选顶部的 Show all settings&lt;/li&gt;
  &lt;li&gt;逐个选项卡查看，并按自己的喜好进行配置，也可以导入以前使用过的配置&lt;/li&gt;
  &lt;li&gt;以下是我自己所进行的设置，供参考：&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Navigation&amp;nbsp;Pane&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Navigation&amp;nbsp;pane&amp;nbsp;style:&amp;nbsp;选择&amp;nbsp;Windows&amp;nbsp;XP&amp;nbsp;Simple&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选择&amp;nbsp;Don&amp;#039;t&amp;nbsp;fade&amp;nbsp;buttons&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选择&amp;nbsp;Full-size&amp;nbsp;offset&amp;nbsp;for&amp;nbsp;sub-folders&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Auto-navigate&amp;nbsp;to&amp;nbsp;the&amp;nbsp;selected&amp;nbsp;folder:&amp;nbsp;选择&amp;nbsp;Always&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Auto-navigation&amp;nbsp;delay:&amp;nbsp;由默认值&amp;nbsp;100&amp;nbsp;改为&amp;nbsp;200&lt;br /&gt;
Title&amp;nbsp;Bar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选择&amp;nbsp;Disable&amp;nbsp;breadcrumbs&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;接着，设置 Windows 资源管理器自身提供的选项。&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;按 Win+E 快捷键打开资源管理器&lt;/li&gt;
  &lt;li&gt;右键点击工具栏空白处，取消选择 Classic Explorer Bar&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 选项，打开文件夹选项对话框&lt;/li&gt;
  &lt;li&gt;常规 -&gt; 打开文件资源管理器时打开 -&gt; 选择“此电脑”&lt;/li&gt;
  &lt;li&gt;常规 -&gt; 隐私 -&gt; 取消选择 在“快速访问”中显示最近使用的文件&lt;/li&gt;
  &lt;li&gt;常规 -&gt; 隐私 -&gt; 取消选择 在“快速访问”中显示常用文件夹&lt;/li&gt;
  &lt;li&gt;常规 -&gt; 隐私 -&gt; 清除文件资源管理器历史记录 -&gt; 点击“清除”&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 导航窗格 -&gt; 选择“展开到打开的文件夹”&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 导航窗格 -&gt; 按个人喜好决定是否选择“显示库”&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 文件和文件夹 -&gt; 隐藏文件和文件夹 -&gt; 选择“显示隐藏的文件、文件夹和驱动器”&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 文件和文件夹 -&gt; 选择“用彩色显示加密或压缩的 NTFS 文件”&lt;/li&gt;
  &lt;li&gt;点击确定按钮，保存设置&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;17. 设置标题栏和任务栏颜色&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击桌面 -&gt; 个性化 -&gt; 颜色&lt;/li&gt;
  &lt;li&gt;选择颜色 -&gt; Windows 颜色 -&gt; 选择一个较深的蓝色&lt;/li&gt;
  &lt;li&gt;更多选项 -&gt; 更多选项 -&gt; 透明效果 -&gt; 关闭&lt;/li&gt;
  &lt;li&gt;更多选项 -&gt; 在以下区域显示主题色 -&gt; 选中“开始菜单、任务栏和操作中心”&lt;/li&gt;
  &lt;li&gt;更多选项 -&gt; 在以下区域显示主题色 -&gt; 选中“标题栏”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; width: 80%; margin: 0 auto; padding: 0.5em 1em;&quot;&gt;
&lt;div style=&quot;margin-bottom: 0.5em; font-weight: bold;&quot;&gt;任务栏背景颜色，和活动窗口任务栏按钮颜色的配置&lt;/div&gt;任务栏背景颜色: 在 Open-Shell 的开始菜单设置中 Taskbar -&amp;gt; Customize taskbar -&amp;gt; Taskbar color 所指定的颜色。&lt;br /&gt;任务栏上活动窗口按钮的颜色: 在 Windows 的 个性化 -&amp;gt; 颜色 -&amp;gt; 选择颜色 中所选择的颜色。&lt;br /&gt;这两个颜色应该有良好的区分度，例如状态栏背景使用蓝色的话，活动窗口按钮颜色就使用深蓝色。&lt;/div&gt;&lt;br /&gt;&lt;b&gt;7. 设置任务栏&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击任务栏空白位置 -&amp;gt; 任务栏设置&lt;/li&gt;
  &lt;li&gt;在桌面模式下自动隐藏任务栏 -&amp;gt; 打开&lt;/li&gt;
  &lt;li&gt;使用小任务栏按钮 -&amp;gt; 打开&lt;/li&gt;
  &lt;li&gt;当我右键单击“开始”按钮或按下 Windows 键 + X 时，在菜单中将命令提示符替换为 Windows PowerShell -&amp;gt; 关闭&lt;/li&gt;
  &lt;li&gt;合并任务栏按钮 -&amp;gt; 选择“从不”&lt;/li&gt;
  &lt;li&gt;通知区域 -&amp;gt; 选择哪些图标显示在任务栏上 -&amp;gt; 按自己的喜好设置&lt;/li&gt;
  &lt;li&gt;通知区域 -&amp;gt; 打开或关闭系统图标 -&amp;gt; 按自己的喜好设置&lt;/li&gt;
  &lt;li&gt;人脉 -&amp;gt; 在任务栏上显示联系人 -&gt; 关闭&lt;/li&gt;
  &lt;li&gt;右键点击任务栏空白位置 -&amp;gt; Cortana -&gt; 选择“隐藏”&lt;/li&gt;
  &lt;li&gt;右键点击任务栏空白位置 -&amp;gt; 取消选择 显示“任务视图”按钮&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;9. 为任务栏添加快速启动栏&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
&lt;li&gt;按 Win+E 快捷键打开资源管理器，在地址栏中输入 %APPDATA%\Microsoft\Internet Explorer\Quick Launch 并按回车&lt;/li&gt;
&lt;li&gt;复制地址栏中的地址，应为 C:\Users\&amp;lt;你的用户名&amp;gt;\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch&lt;/li&gt;
&lt;li&gt;右键点击任务栏空白位置 -&amp;gt; 工具栏 -&gt; 选择“新建工具栏...”&lt;/li&gt;
&lt;li&gt;将刚才复制的 Quick Launch 目录完整路径粘贴到选择文件夹对话框的地址栏中，按回车，然后点击选择文件夹&lt;/li&gt;
&lt;li&gt;右键点击任务栏空白位置 -&amp;gt; 取消选择“锁定任务栏”&lt;/li&gt;
&lt;li&gt;拖拽刚才新建的 Quick Launch 工具栏到开始按钮右侧&lt;/li&gt;
&lt;li&gt;右键点击 Quick Launch 工具栏 -&gt; 取消选择“显示文本”&lt;/li&gt;
&lt;li&gt;右键点击 Quick Launch 工具栏 -&gt; 取消选择“显示标题”&lt;/li&gt;
&lt;li&gt;在 %APPDATA%\Microsoft\Internet Explorer\Quick Launch 目录中放置少量自己常用程序的快捷方式，例如浏览器，和使用资源管理器打开 D 盘的快捷方式: C:\Windows\explorer.exe /e,D:\&lt;/li&gt;
&lt;li&gt;删除 Quick Launch 目录中原本可能存在的“显示桌面”和“在窗口之间切换”快捷方式&lt;/li&gt;
&lt;li&gt;调节 Quick Launch 工具栏所占的宽度，需要来回切换是否锁定任务栏，以调节到宽度合适&lt;/li&gt;
&lt;li&gt;右键点击任务栏空白位置 -&amp;gt; 选择“锁定任务栏”&lt;/li&gt;
&lt;li&gt;关闭所有已打开的窗口&lt;/li&gt;
&lt;li&gt;右键逐一点击任务栏上的程序图标 -&amp;gt; 选择“从任务栏取消固定”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; width: 80%; margin: 0 auto; padding: 0.5em 1em;&quot;&gt;
&lt;div style=&quot;margin-bottom: 0.5em; font-weight: bold;&quot;&gt;使用快速启动栏，相比将应用固定到任务栏的优势&lt;/div&gt;从 Windows 7 开始，任务栏上的快速启动栏默认就不存在了，转而出现了新的将程序固定到任务栏的用法。这种新的用法有两个问题：&lt;br /&gt;(1) 严重降低了程序切换的效率。尤其是在同一个程序开启了多个窗口的情况下，用户不得不先将鼠标移动到任务栏的图标上，等窗口预览弹出后再选择要切换到哪个窗口。&lt;br /&gt;(2) 各个程序的任务栏按钮宽度可能会不一致。固定到任务栏上的程序在未打开时只显示图标，而任务栏如果设置了显示不隐藏标签，打开的程序是会显示标题文本的。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;8. 安装 7+ Taskbar Tweak&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;从 &lt;a href=&quot;https://rammichael.com/7-taskbar-tweaker&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;7+ Taskbar Tweaker - RaMMicHaeL&amp;#039;s Blog&lt;/a&gt; 下载 7tt_setup.exe, 并安装&lt;/li&gt;
  &lt;li&gt;配置各项。我的设置如下图所示，供参考：&lt;/li&gt;
&lt;/ul&gt;
&lt;!--[[Image:image_win10_config_02_thumb|image_win10_config_02]]--&gt;&lt;br /&gt;&lt;b&gt;10. 设置时间选项&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 设置 -&gt; 电脑设置 -&amp;gt; 时间和语言&lt;/li&gt;
  &lt;li&gt;日期和时间 -&gt; 格式 -&gt; 更改日期和时间格式&lt;/li&gt;
  &lt;li&gt;一周的第一天: 星期日&lt;/li&gt;
  &lt;li&gt;短日期格式: yyyy-M-d&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;11. 键盘快捷方式下划线&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 轻松使用设置中心 -&amp;gt; 使键盘更易于使用&lt;/li&gt;
  &lt;li&gt;取消选择“始终朗读这个部分”&lt;/li&gt;
  &lt;li&gt;取消选择“始终扫描这个部分”&lt;/li&gt;
  &lt;li&gt;使鼠标更易于使用 -&gt; 勾选“将窗口移动到屏幕边缘时不要自动排列窗口”&lt;/li&gt;
  &lt;li&gt;使键盘更易于使用 -&gt; 勾选“给键盘快捷方式和访问键加下划线”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; width: 80%; margin: 0 auto; padding: 0.5em 1em;&quot;&gt;
&lt;div style=&quot;margin-bottom: 0.5em; font-weight: bold;&quot;&gt;“给键盘快捷方式和访问键加下划线”选项的作用：&lt;/div&gt;(1) 在英文版系统中，只有开启该选项后，像文件右键菜单中的 Rename 才会显示为 Rena&lt;u&gt;m&lt;/u&gt;e，从而能看出键盘快捷键是什么。而中文版系统中，由于一般会使用“重命名(M)”这种形式，是否开启则只看个人喜好，对使用影响不大。&lt;br /&gt;(2) 只有开启该选项后，复选框和桌面图标等控件在获得焦点时，才会显示虚线边框，有助于确认当前获得焦点的控件是哪个，也便于键盘操作。&lt;/div&gt;&lt;br /&gt;&lt;b&gt;12. 关闭自动播放&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 设置 -&gt; 控制面板 -&amp;gt; 自动播放&lt;/li&gt;
  &lt;li&gt;先点击最下方的“重置所有默认值”按钮，使每个选择框都为“选择默认值”状态&lt;/li&gt;
  &lt;li&gt;然后取消选中最上方的“为所有媒体和设备使用自动播放”复选框&lt;/li&gt;
  &lt;li&gt;点击“保存”按钮完成设置&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;13. 隐藏资源管理器左侧目录树中的 3D 对象、文档、下载等文件夹&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;从 &lt;a href=&quot;https://www.howtogeek.com/222057/how-to-remove-the-folders-from-%E2%80%9Cthis-pc%E2%80%9D-on-windows-10/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;How to Remove the Folders From &amp;quot;This PC&amp;quot; on Windows 10&lt;/a&gt; 下载 Remove-Folders-From-This-PC-on-Windows-10.zip&lt;/li&gt;
  &lt;li&gt;解压出 64-bit versions of Windows 10\Remove All User Folders From This PC 64-bit.reg 文件，并导入注册表&lt;/li&gt;
  &lt;li&gt;从 &lt;a href=&quot;https://www.howtogeek.com/331361/how-to-remove-the-3d-objects-folder-from-this-pc-on-windows-10/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;How to Remove &amp;quot;3D Objects&amp;quot; From This PC on Windows 10&lt;/a&gt; 下载 Remove-3D-Objects-Folder.zip&lt;/li&gt;
  &lt;li&gt;解压出 Remove 3D Objects Folder (64-bit Windows).reg 文件，并导入注册表&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;14. 禁用压缩文件夹&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;将如下内容保存为 Disable_ZIP_Compressed_Folders.reg 文件，并导入注册表&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Windows&amp;nbsp;Registry&amp;nbsp;Editor&amp;nbsp;Version&amp;nbsp;5.00&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\CompressedFolder\CLSID]&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\SystemFileAssociations\.zip\CLSID]&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
    &lt;li&gt;将如下内容保存为 Disable_CAB_Files.reg 文件，并导入注册表&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Windows&amp;nbsp;Registry&amp;nbsp;Editor&amp;nbsp;Version&amp;nbsp;5.00&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\CABFolder\CLSID]&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\SystemFileAssociations\.cab\CLSID]&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;15. 禁用文件夹内容识别&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;从 &lt;a href=&quot;https://www.tenforums.com/tutorials/7923-change-folder-template-windows-10-a.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Change Folder Template in Windows 10&lt;/a&gt; 下载 Reset_Folder_View_Settings_of_All_Folders_to_Default.bat, 并以管理员身份运行&lt;/li&gt;
  &lt;li&gt;从上一步骤的同一页面下载 All_Folders_Use_General_Items_Folder_Template.bat, 并以管理员身份运行&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;border: 1px solid #e5e99c; background-color: #f7f8e0; width: 80%; margin: 0 auto; padding: 0.5em 1em;&quot;&gt;
&lt;div style=&quot;margin-bottom: 0.5em; font-weight: bold;&quot;&gt;关于 Windows 的文件夹模板和文件夹内容识别&lt;/div&gt;大概是从 Win7 开始，Windows 默认就会对文件夹进行内容识别，以它认为合适的方式来展示文件列表。比如对于存放了大量 .mp3 音频文件的文件夹，以详细信息方式查看时文件列表标题会由默认的名称、类型、修改日期等变为名称、参与创作的艺术家、唱片集等。十分影响对文件的正常管理操作，对于任何类型的文件，修改日期、文件类型和文件大小信息都是比这些元数据更为重要的。&lt;/div&gt;&lt;br /&gt;&lt;b&gt;16. 设置文件夹默认视图&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;按 Win+E 快捷键打开资源管理器&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 选项，打开文件夹选项对话框&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 文件夹视图 -&gt; 点击“重置文件夹”，把所有文件夹都重置为默认视图&lt;/li&gt;
  &lt;li&gt;点击“确定”按钮，关闭文件夹选项对话框&lt;/li&gt;
  &lt;li&gt;打开一个普通的文件夹，调整查看类型 (我习惯使用详细列表) 和名称、修改日期、类型等各列的宽度&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 选项，再次打开文件夹选项对话框&lt;/li&gt;
  &lt;li&gt;查看 -&gt; 文件夹视图 -&gt; 点击“应用到文件夹”，使所有文件夹都使用刚才设置好的视图&lt;/li&gt;
  &lt;li&gt;点击“确定”按钮，关闭文件夹选项对话框&lt;/li&gt;
  &lt;li&gt;关闭资源管理器&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;17. 设置系统声音&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 设置 -&gt; 控制面板 -&gt; 声音&lt;/li&gt;
  &lt;li&gt;声音 -&gt; 声音方案，选择“无声”，点击确定&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;18. 设置输入法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Win10 上中文输入法的设置方法较为复杂，具体请看之前所发的文章《&lt;a href=&quot;https://blog.wudilabs.com/entry/932e7229/configure-windows-10-to-make-the-chinese-input-method-easier-to-use&quot;&gt;修改 Windows 10 的中文输入法配置，使其像 Win7, XP 一样易于使用&lt;/a&gt;》。&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/c3ee92cb/making-windows-10-better-to-use?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>修改 Windows 10 的中文输入法配置，使其像 Win7, XP 一样易于使用</title>
      <link>https://blog.wudilabs.com/entry/932e7229/configure-windows-10-to-make-the-chinese-input-method-easier-to-use</link>
      <comments>https://blog.wudilabs.com/entry/932e7229/configure-windows-10-to-make-the-chinese-input-method-easier-to-use#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/932e7229/configure-windows-10-to-make-the-chinese-input-method-easier-to-use?lang=zh-CN</guid>
      <pubDate>Sun, 10 Feb 2019 11:20:16 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>计算机软件</category>
      <description>我之前这几年时间主要都在使用 Win 8.1 系统，而最近，因为办公电脑和新购买的笔记本预装的都是 Win 10 系统，就不得不研究如何将 Win 10 系统配置得易用一些了。

相比以前 Win 8.1 上的配置流程，Win 10 的配置还真是有不少变化，输入法的配置现在就比以前要麻烦得多。因此这里将自己的配置方法总结一下，供大家参考。

最终效果：可以通过 Ctrl + Space 切换中英文输入，并且每个程序打开时默认都是英文输入状态，每个程序的中英文输入状态也互相不影响。同时，处于中文输入状态时会有浮动显示的输入法状态栏，英文输入时则没有。

问题背景

XP 和 Win7 用户在刚升级到 Win8.1 或 Win10 时，可能都会感觉到输入法用着没有以前方便了。

在 XP 和 Win7 中，安装的各个输入法和默认的英文输入状态是平等的，打字时通过 Ctrl + Space 快捷键来开启/关闭中文输入法，在安装有多个输入法时通过 Ctrl + Shift 快捷键在不同输入法间切换。

而从 Win8 开始，输入法的选择就变为了 2 级。第 1 级是语言，语言下才是输入法。对于中文版的系统，安装完成后默认只有“中文”这一个语言，下边有一个微软拼音输入法。在任何情况下都是通过这个输入法输入的，中英文切换也是通过按 Shift 键切换这个输入法的中/英文输入状态来完成的。

Win8 和 Win10 中输入法的问题

这种新的输入法用法的问题有：

中/英文输入状态区分不明显，甚至无法区分：在 Win8 以前，一般屏幕上显示有输入法的浮动条时，是中文输入状态，否则是英文输入状态，非常明显。而从 Win8 开始，以微软拼音输入法为例，中文/英文输入状态只能靠任务栏托盘区显示的是“中”还是“英”来区分，在任务栏隐藏时就完全看不到了。虽然还有一个叫语言栏的东西可以浮动于任务栏之外，但这个语言栏除了很丑之外，也从来不会完全隐藏掉，输入状态区分并不明显。

按 Shift 键时容易误切换输入法：只要是经常打英文，就免不了要按 Shift 键输入大写字母，而单按 Shift 键也是输入法中切换中/英文的快捷键，十分容易误操作。

Win10 下输入法的配置思路

2016 年时，我曾在文章《F3E89092 配置出一个更好用的 WINDOWS 8.1》的“21. 语言设置”中提供了一种在 Win8 中配置输入法的方法。就是自己添加一个 English 语言，把默认输入法设置为 English 语言下的 US Keyboard, 然后通过 Ctrl + Shift 切换语言来实现 US Keyboard 和中文输入法的切换。再通过 AutoHotkey 脚本实现按 Ctrl + Space 时自动触发 Ctrl + Shift 按键，以保留以前的快捷键习惯。

Win10 下还是采用类似的方法。但我以前一直使用的 Google 拼音输入法最后一次更新还是在 2011 年，只支持到 Win8, 官方的页面不知何时都变成 404 了。因此在 Win10 上我改为使用 QQ 拼音输入法，但它会比较流氓地把自己设为默认输入法，带来了不少麻烦，好在最后找到了解决办法。

Win10 下输入法的具体配置步骤

1. 首先，下载、安装 QQ 拼音输入法，并按自己的喜好进行配置。我的设置如下，仅供参考 (图片点击可看大图)：

image_win10_input_method_tweak_01_thumb

2. 右键点击开始菜单按钮，选择设置，打开设置程序。在左侧选择区域和语言，然后在右侧的语言列表上点击“添加语言”。

image_win10_input_method_tweak_02_thumb

3. 输入 us 进行搜索，选择 English (United States), 点击“下一步”。

image_win10_input_method_tweak_03_thumb

4. 取消勾选“设置为我的 Windows 显示语言”，如果不需要也可以同时取消勾选“语言”和“手写”功能。点击“安装”。

image_win10_input_method_tweak_04_thumb

5. 点击语言列表中的中文，然后点击“选项”。

image_win10_input_method_tweak_05_thumb

6. 删除原有的微软拼音，仅保留一个中文输入法，这里是 QQ 拼音输入法。

image_win10_input_method_tweak_06_thumb

7. 返回到区域和语言页面设置页面后，点击相关设置中的“高级键盘设置”。


  在“替代默认输入法”中，选择“英语(美国) - 美式键盘”。
  在“切换输入法”中，勾选“允许我为每个应用窗口使用不同的输入法”。
  点击“语言栏选项”，在“高级键设置”中，将“在输入语言之间”进行切换的快捷键修改为 Ctrl+Shift, 然后点击确定完成修改。


image_win10_input_method_tweak_07_thumb

QQ 拼音经常将自己设为默认输入法的解决办法

在完成上述步骤的设置之后，可以按 Win+E 快捷键打开资源管理器，查看默认输入法是否为“英语(美国) - 美式键盘”，也就是不显示 QQ 拼音浮动条的英文输入状态。当然很有可能此时默认输入法是 QQ 拼音。

经过多次尝试，我发现 QQ 拼音在属性设置窗口中，只要进入到了“高级”选项卡，QQ 拼音就会将自己设为默认输入法。且该设置和“高级键盘设置”页面的默认输入法选择并无关系。一种可行的解决方法如下：

8. 在语言列表中选择 English, 然后点击“选项”。

image_win10_input_method_tweak_08_thumb

9. 再为 English 语言添加一个键盘布局，比如“美国英语-国际”。

image_win10_input_method_tweak_09_thumb

10. 然后再进入“高级键盘设置”页面，先将默认输入法改为“英语(美国) - 美国英语-国际”。

image_win10_input_method_tweak_10_thumb

11. 接着再将默认输入法改回“英语(美国) - 美式键盘”。

image_win10_input_method_tweak_11_thumb

12. 最后回到 English 语言的选项界面，删除刚才添加的“美国英语-国际”键盘布局。

image_win10_input_method_tweak_12_thumb

此时再按 Win+E 快捷键打开资源管理器进行检查，默认输入法应该就是美式键盘了。如果之后不小心又进入了 QQ 拼音属性设置的高级选项卡，或需要设置那些选项，只要再按 8 - 12 步骤操作一遍就可以了。

通过 AutoHotkey 实现按 Ctrl + Space 切换中英文输入

因为在“语言栏选项”的“高级键设置”选项卡中，“在输入语言之间”进行切换的快捷键无法指定为 Ctrl + Space. 要保留这个 XP, Win7 时代的操作习惯，可以通过 AutoHotkey 脚本来完成。

13. 下载、安装 AutoHotkey 软件。

14. 新建一个 .ahk 脚本，例如 InputMethodSwitch.ahk, 内容如下：

; Ctrl + Shift
^space::^shift

15. 为该 .ahk 脚本文件生成一个快捷方式，并拖到到开始菜单 -&gt; 程序 -&gt; 启动中。这样每次开机后都会自动运行该脚本，在按下 Ctrl + Space 快捷键时触发一个 Ctrl + Shift 快捷键，实现按 Ctrl + Space 切换中英文输入的效果。

输入法的配置到这里就完成了，其他诸如开始菜单、任务栏和文件夹模板等部分的配置，之后会再写一篇文章。

撰写本文时所用软件版本：
Windows: Windows 10 操作系统 1803 版本 (2018 年 9 月更新)
输入法: QQ 拼音输入法 6.1 (2019.1.31)
</description>
      <content:encoded>我之前这几年时间主要都在使用 Win 8.1 系统，而最近，因为办公电脑和新购买的笔记本预装的都是 Win 10 系统，就不得不研究如何将 Win 10 系统配置得易用一些了。&lt;br /&gt;&lt;br /&gt;相比以前 Win 8.1 上的配置流程，Win 10 的配置还真是有不少变化，输入法的配置现在就比以前要麻烦得多。因此这里将自己的配置方法总结一下，供大家参考。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;最终效果：可以通过 Ctrl + Space 切换中英文输入，并且每个程序打开时默认都是英文输入状态&lt;/span&gt;，每个程序的中英文输入状态也互相不影响。同时，&lt;span style=&quot;color: red;&quot;&gt;处于中文输入状态时会有浮动显示的输入法状态栏，英文输入时则没有&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;问题背景&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;XP 和 Win7 用户在刚升级到 Win8.1 或 Win10 时，可能都会感觉到输入法用着没有以前方便了。&lt;br /&gt;&lt;br /&gt;在 XP 和 Win7 中，安装的各个输入法和默认的英文输入状态是平等的，打字时通过 Ctrl + Space 快捷键来开启/关闭中文输入法，在安装有多个输入法时通过 Ctrl + Shift 快捷键在不同输入法间切换。&lt;br /&gt;&lt;br /&gt;而从 Win8 开始，输入法的选择就变为了 2 级。第 1 级是语言，语言下才是输入法。对于中文版的系统，安装完成后默认只有“中文”这一个语言，下边有一个微软拼音输入法。在任何情况下都是通过这个输入法输入的，中英文切换也是通过按 Shift 键切换这个输入法的中/英文输入状态来完成的。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Win8 和 Win10 中输入法的问题&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;这种新的输入法用法的问题有：&lt;br /&gt;&lt;br /&gt;中/英文输入状态区分不明显，甚至无法区分：在 Win8 以前，一般屏幕上显示有输入法的浮动条时，是中文输入状态，否则是英文输入状态，非常明显。而从 Win8 开始，以微软拼音输入法为例，中文/英文输入状态只能靠任务栏托盘区显示的是“中”还是“英”来区分，在任务栏隐藏时就完全看不到了。虽然还有一个叫语言栏的东西可以浮动于任务栏之外，但这个语言栏除了很丑之外，也从来不会完全隐藏掉，输入状态区分并不明显。&lt;br /&gt;&lt;br /&gt;按 Shift 键时容易误切换输入法：只要是经常打英文，就免不了要按 Shift 键输入大写字母，而单按 Shift 键也是输入法中切换中/英文的快捷键，十分容易误操作。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Win10 下输入法的配置思路&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;2016 年时，我曾在文章《&lt;a href=&quot;https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use&quot;&gt;配置出一个更好用的 Windows 8.1&lt;/a&gt;》的“21. 语言设置”中提供了一种在 Win8 中配置输入法的方法。就是自己添加一个 English 语言，把默认输入法设置为 English 语言下的 US Keyboard, 然后通过 Ctrl + Shift 切换语言来实现 US Keyboard 和中文输入法的切换。再通过 AutoHotkey 脚本实现按 Ctrl + Space 时自动触发 Ctrl + Shift 按键，以保留以前的快捷键习惯。&lt;br /&gt;&lt;br /&gt;Win10 下还是采用类似的方法。但我以前一直使用的 Google 拼音输入法最后一次更新还是在 2011 年，只支持到 Win8, 官方的页面不知何时都变成 404 了。因此在 Win10 上我改为使用 QQ 拼音输入法，但它会比较流氓地把自己设为默认输入法，带来了不少麻烦，好在最后找到了解决办法。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Win10 下输入法的具体配置步骤&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. 首先，&lt;a href=&quot;http://qq.pinyin.cn/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;、安装 QQ 拼音输入法，并按自己的喜好进行配置。我的设置如下，仅供参考 (图片点击可看大图)：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. 右键点击开始菜单按钮，选择设置，打开设置程序。在左侧选择区域和语言，然后在右侧的语言列表上点击“添加语言”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. 输入 us 进行搜索，选择 English (United States), 点击“下一步”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. 取消勾选“设置为我的 Windows 显示语言”，如果不需要也可以同时取消勾选“语言”和“手写”功能。点击“安装”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_04&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_04_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. 点击语言列表中的中文，然后点击“选项”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_05&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_05_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. 删除原有的微软拼音，仅保留一个中文输入法，这里是 QQ 拼音输入法。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_06&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_06_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7. 返回到区域和语言页面设置页面后，点击相关设置中的“高级键盘设置”。&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;在“替代默认输入法”中，选择“英语(美国) - 美式键盘”。&lt;/li&gt;
  &lt;li&gt;在“切换输入法”中，勾选“允许我为每个应用窗口使用不同的输入法”。&lt;/li&gt;
  &lt;li&gt;点击“语言栏选项”，在“高级键设置”中，将“在输入语言之间”进行切换的快捷键修改为 Ctrl+Shift, 然后点击确定完成修改。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_07&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_07_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;QQ 拼音经常将自己设为默认输入法的解决办法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;在完成上述步骤的设置之后，可以按 Win+E 快捷键打开资源管理器，查看默认输入法是否为“英语(美国) - 美式键盘”，也就是不显示 QQ 拼音浮动条的英文输入状态。当然很有可能此时默认输入法是 QQ 拼音。&lt;br /&gt;&lt;br /&gt;经过多次尝试，我发现 QQ 拼音在属性设置窗口中，只要进入到了“高级”选项卡，QQ 拼音就会将自己设为默认输入法。且该设置和“高级键盘设置”页面的默认输入法选择并无关系。一种可行的解决方法如下：&lt;br /&gt;&lt;br /&gt;8. 在语言列表中选择 English, 然后点击“选项”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_08&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_08_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;9. 再为 English 语言添加一个键盘布局，比如“美国英语-国际”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_09&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_09_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;10. 然后再进入“高级键盘设置”页面，先将默认输入法改为“英语(美国) - 美国英语-国际”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_10&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_10_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;11. 接着再将默认输入法改回“英语(美国) - 美式键盘”。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_11&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_11_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;12. 最后回到 English 语言的选项界面，删除刚才添加的“美国英语-国际”键盘布局。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_12&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win10_input_method_tweak_12_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;此时再按 Win+E 快捷键打开资源管理器进行检查，默认输入法应该就是美式键盘了。如果之后不小心又进入了 QQ 拼音属性设置的高级选项卡，或需要设置那些选项，只要再按 8 - 12 步骤操作一遍就可以了。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;通过 AutoHotkey 实现按 Ctrl + Space 切换中英文输入&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;因为在“语言栏选项”的“高级键设置”选项卡中，“在输入语言之间”进行切换的快捷键无法指定为 Ctrl + Space. 要保留这个 XP, Win7 时代的操作习惯，可以通过 AutoHotkey 脚本来完成。&lt;br /&gt;&lt;br /&gt;13. &lt;a href=&quot;https://www.autohotkey.com/download/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;、安装 AutoHotkey 软件。&lt;br /&gt;&lt;br /&gt;14. 新建一个 .ahk 脚本，例如 InputMethodSwitch.ahk, 内容如下：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;Shift&lt;br /&gt;
^space::^shift&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;15. 为该 .ahk 脚本文件生成一个快捷方式，并拖到到开始菜单 -&amp;gt; 程序 -&amp;gt; 启动中。这样每次开机后都会自动运行该脚本，在按下 Ctrl + Space 快捷键时触发一个 Ctrl + Shift 快捷键，实现按 Ctrl + Space 切换中英文输入的效果。&lt;br /&gt;&lt;br /&gt;输入法的配置到这里就完成了，其他诸如开始菜单、任务栏和文件夹模板等部分的配置，之后会再写一篇文章。&lt;br /&gt;&lt;br /&gt;
&lt;div style=&quot;color: #999999;&quot;&gt;撰写本文时所用软件版本：&lt;br /&gt;
Windows: Windows 10 操作系统 1803 版本 (2018 年 9 月更新)&lt;br /&gt;
输入法: QQ 拼音输入法 6.1 (2019.1.31)
&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/932e7229/configure-windows-10-to-make-the-chinese-input-method-easier-to-use?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>Italo Disco 新作推荐: Franck Choppin - Pain in My Heart</title>
      <link>https://blog.wudilabs.com/entry/c3edf5a5/new-italo-disco-recommendation-franck-choppin-pain-in-my-heart</link>
      <comments>https://blog.wudilabs.com/entry/c3edf5a5/new-italo-disco-recommendation-franck-choppin-pain-in-my-heart#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/c3edf5a5/new-italo-disco-recommendation-franck-choppin-pain-in-my-heart?lang=zh-CN</guid>
      <pubDate>Thu, 22 Nov 2018 15:51:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音乐</category>
      <description>今天凌晨的时候，在 B 站搜索 Italo Disco 偶然发现了《用合成器做出年代感之 Killer Italo Disco track featuring DX7 and Juno-106》这个视频，很惊艳。开始看标题一直以为是弹奏的过去的 Italo Disco, 后来找到作者的 Youtube 原视频和 Facebook 主页，才发现居然是今年 7 月份刚发布的新曲子。

image_franck_choppin_pain_in_my_heart_03

B 站的视频请手动点击 https://www.bilibili.com/video/av30551002/ 观看，从 8:50 开始是完整弹奏。由于 B 站的 HTML5 播放器会自动加载视频，为了节省大家流量我这里就不嵌入了。Youtube 上作者的原视频地址是 https://www.youtube.com/watch?v=IQw56Gz7F5E。

image_franck_choppin_pain_in_my_heart_01_thumb

此外还有一个有歌词的版本 Pain in My Heart (feat. Emphavoice), Youtube 视频地址是 https://www.youtube.com/watch?v=OHtsg95TkTM。但是初次听还是建议听纯音乐版的，人声版的前奏、间奏比一般 Radio Edit 的 Italo Disco 还要短一些，没有纯音乐版的震撼。而且初听时会感觉人声音色和传统 Italo Disco 的也不太一样，听时间长了逐渐适应之后还挺好听的。

image_franck_choppin_pain_in_my_heart_02_thumb

只想听音频的同学可以到网易云音乐，两首我都留下评论了哈哈:

Pain in My Heart (Instrumental): https://music.163.com/#/song?id=864202766
Pain in My Heart: https://music.163.com/#/song?id=864202765

2018-12-21 添加:


作者昨天又在 Youtube 上传了 Extended 版本: Pain in My Heart (Extended) [feat. Emphavoice], 视频地址是 https://www.youtube.com/watch?v=FW8yC25vQVc

2018-12-23 添加:


Extended 版本在网易云音乐上也有了, Pain in My Heart (Extended): https://music.163.com/#/song?id=1334290669</description>
      <content:encoded>今天凌晨的时候，在 B 站搜索 Italo Disco 偶然发现了《用合成器做出年代感之 Killer Italo Disco track featuring DX7 and Juno-106》这个视频，很惊艳。开始看标题一直以为是弹奏的过去的 Italo Disco, 后来找到作者的 Youtube 原视频和 Facebook 主页，才发现居然是今年 7 月份刚发布的新曲子。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_franck_choppin_pain_in_my_heart_03&quot; /&gt;&lt;br /&gt;&lt;br /&gt;B 站的视频请手动点击 &lt;a href=&quot;https://www.bilibili.com/video/av30551002/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av30551002/&lt;/a&gt; 观看，从 8:50 开始是完整弹奏。由于 B 站的 HTML5 播放器会自动加载视频，为了节省大家流量我这里就不嵌入了。Youtube 上作者的原视频地址是 &lt;a href=&quot;https://www.youtube.com/watch?v=IQw56Gz7F5E&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=IQw56Gz7F5E&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_franck_choppin_pain_in_my_heart_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_franck_choppin_pain_in_my_heart_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;此外还有一个有歌词的版本 Pain in My Heart (feat. Emphavoice), Youtube 视频地址是 &lt;a href=&quot;https://www.youtube.com/watch?v=OHtsg95TkTM&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=OHtsg95TkTM&lt;/a&gt;。但是初次听还是建议听纯音乐版的，人声版的前奏、间奏比一般 Radio Edit 的 Italo Disco 还要短一些，没有纯音乐版的震撼。而且初听时会感觉人声音色和传统 Italo Disco 的也不太一样，听时间长了逐渐适应之后还挺好听的。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_franck_choppin_pain_in_my_heart_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_franck_choppin_pain_in_my_heart_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;只想听音频的同学可以到网易云音乐，两首我都留下评论了哈哈:&lt;br /&gt;&lt;br /&gt;Pain in My Heart (Instrumental): &lt;a href=&quot;https://music.163.com/#/song?id=864202766&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://music.163.com/#/song?id=864202766&lt;/a&gt;&lt;br /&gt;Pain in My Heart: &lt;a href=&quot;https://music.163.com/#/song?id=864202765&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://music.163.com/#/song?id=864202765&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2018-12-21 添加:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;作者昨天又在 Youtube 上传了 Extended 版本: Pain in My Heart (Extended) [feat. Emphavoice], 视频地址是 &lt;a href=&quot;https://www.youtube.com/watch?v=FW8yC25vQVc&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=FW8yC25vQVc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2018-12-23 添加:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Extended 版本在网易云音乐上也有了, Pain in My Heart (Extended): &lt;a href=&quot;https://music.163.com/#/song?id=1334290669&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://music.163.com/#/song?id=1334290669&lt;/a&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/c3edf5a5/new-italo-disco-recommendation-franck-choppin-pain-in-my-heart?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>音乐可视化软件 + 预处理外挂</title>
      <link>https://blog.wudilabs.com/entry/a3ad8554/music-visualizer-plus-preprocessing-plugin</link>
      <comments>https://blog.wudilabs.com/entry/a3ad8554/music-visualizer-plus-preprocessing-plugin#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a3ad8554/music-visualizer-plus-preprocessing-plugin?lang=zh-CN</guid>
      <pubDate>Wed, 21 Nov 2018 12:32:10 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>音乐可视化效果想必大家都不陌生了，从古老的 Winamp, 到系统自带的 Windows Media Player, 还有更专业一些的 foobar2000, 很多播放器软件都有随音乐显示一些动画的功能。甚至还有专门的音乐可视化软件，例如 VSXu 和本次视频中使用到的 Plane9。

但是对于喜爱 Italo Disco 这类节奏感较强音乐的我来说，这些软件产生的动画都太过舒缓了，完全反映不出音乐的节奏。于是我就想到，如果利用预处理得到的节拍信息，对原始音频文件中的鼓点进行加强，再将处理后产生的音频文件提供给这类软件产生动画，结果会如何呢？

最终得到的一段效果对比，就请看视频吧：

[[Video:http://v.youku.com/v_show/id_XMzkyODE0MjM0OA==.html]]
在优酷上观看: http://v.youku.com/v_show/id_XMzkyODE0MjM0OA==.html
在 bilibili 上观看: https://www.bilibili.com/video/av36389551/
</description>
      <content:encoded>音乐可视化效果想必大家都不陌生了，从古老的 Winamp, 到系统自带的 Windows Media Player, 还有更专业一些的 foobar2000, 很多播放器软件都有随音乐显示一些动画的功能。甚至还有专门的音乐可视化软件，例如 VSXu 和本次视频中使用到的 Plane9。&lt;br /&gt;&lt;br /&gt;但是对于喜爱 Italo Disco 这类节奏感较强音乐的我来说，这些软件产生的动画都太过舒缓了，完全反映不出音乐的节奏。于是我就想到，如果利用预处理得到的节拍信息，对原始音频文件中的鼓点进行加强，再将处理后产生的音频文件提供给这类软件产生动画，结果会如何呢？&lt;br /&gt;&lt;br /&gt;最终得到的一段效果对比，就请看视频吧：&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzkyODE0MjM0OA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;http://v.youku.com/v_show/id_XMzkyODE0MjM0OA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://v.youku.com/v_show/id_XMzkyODE0MjM0OA==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av36389551/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av36389551/&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a3ad8554/music-visualizer-plus-preprocessing-plugin?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>为 Dancing Together 制作歌词并传到了网易云音乐</title>
      <link>https://blog.wudilabs.com/entry/c35de5d3/created-lyrics-for-dancing-together-and-uploaded-them-to-netease-cloud-music</link>
      <comments>https://blog.wudilabs.com/entry/c35de5d3/created-lyrics-for-dancing-together-and-uploaded-them-to-netease-cloud-music#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/c35de5d3/created-lyrics-for-dancing-together-and-uploaded-them-to-netease-cloud-music?lang=zh-CN</guid>
      <pubDate>Tue, 20 Nov 2018 07:16:01 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音乐</category>
      <description>去年 4 月份的时候，为我网易云音乐总听歌排行第 2, 3 位的 I Wanna Love You Once Again 和 S.O.S. 分别制作了歌词，并上传到了网易云音乐。转眼一年多过去了，听了很多遍的排到第 4 位的 Dancing Together 依然一直没有歌词。想唱的时候很多词不知道，也没法完整的唱下来。

于是昨天晚上在网上搜啊搜，终于找到了这一份某网友贡献出来的自己听出来的歌词，还说了可能有错误，后来看也确实是有不少错误。至于说我为啥不自己直接听写歌词？英语词汇量和听力水平还不够……

找到的这份歌词是在 https://th-vision.net/detail/ken-laszlo-dancing-together-Ik5QBY2WZsc.html 上贴出的，内容如下，换行都丢了：

LYRICS (since there is basically none in the internet), created myself so there
are errors Come on everybody, come on feel the rhythm Get along to feel the
groove (it&#039;s the right time) Wake up for the fiesta, waiting for the fiesta,
Take my hand and go and move (in the night time) True for disco, when we&#039;ll
meet Happy people feel the beat Flashing bottles of every kind And no more
worries all the night Ooh dancing together Move it to the music and the DJ&#039;s
on the dance floor Ooh singing together Hands up for the music and the DJ&#039;s
song will have more Working by the daytime, working by the morning Every time
it gasps me down (like a fever) Worries by the night time, worries from
my heartache Let me go get it into town, let me leave him True for disco,
when we&#039;ll meet Happy people feel the beat Flashing bottles of every kind
And no more worries all the night Ooh dancing together Move it to the music
and the DJ up the dance floor Ooh singing together Hands up for the music
and the DJ&#039;s song will have more Ooh dancing together Grooving to the music
and the DJ on the dance floor Ooh singing together Hands up for the music
and the DJ&#039;s song will have more DJ&#039;s playing music, sweep around the vinyl
Melodies are what we need (for a lifetime) Dancing with my baby, dancing with
my heartache Let me go get into town, let me leave him True for disco, when
we&#039;ll meet Happy people feel the beat Flashing bottles of every kind And
no more worries all the night Ooh dancing together Grooving to the music
and the DJ&#039;s on the dance floor Ooh singing together Hands up for the music
and the DJ&#039;s song will have more Ooh dancing together Grooving to the music
and the DJ&#039;s on the dance floor Ooh singing together Hands up for the music
and the DJ&#039;s song will have more
Eli SuryanaEli Suryana4

由于这首歌是 2009 年发行的，Live 很少有唱到这首的。我只在 Ken Laszlo live at 330LIVE 2011 这场 Live 中找到了这首，而且在 42:00 的位置，Ken 居然说 &quot;I don&#039;t remember the words&quot;, 后边有好几句也确实是明显唱错了 (⊙﹏⊙)

经过我反复地听、对比、纠错，最终修改了这么多地方 (点击可查看大图):

image_dancing_together_lyric_01_thumb

修改完的歌词如下:

Ken Laszlo - Dancing Together (Vocal Version) lyric

Come on everybody, come on feel the rhythm
Get along to feel the groove (it&#039;s the right time)
Wake up for the fiesta, waiting for the fiesta
Take my hand and go and move (in the night time)
To the disco, where we&#039;ll meet
Happy people feel the beats
Flashing colors of every kind
And no more worries all your mind
Ooh, dancing together
Moving to the music and the DJ on the dance floor
Ooh, singing together
Hands up for the music and the DJ&#039;s song will have more

Working in the daytime, working for the money
Every day it gets we down (like a fever)
Worries in the night time, worries for my honey
Let me go get it into town (let me leave it)
To the disco, where we&#039;ll meet
Happy people feel the beats
Flashing colors of every kind
And no more worries all my mind
Ooh, dancing together
Moving to the music and the DJ on the dance floor
Ooh, singing together
Hands up for the music and the DJ&#039;s song will have more
Ooh, dancing together
Grooving with the music and the DJ on the dance floor
Ooh, singing together
Hands up for the music and the DJ&#039;s song will have more

DJ&#039;s playing music, sweep around the vinyl
Melodies are what we&#039;ll need (for a lifetime)
Dancing with my baby, dancing with my honey
Let&#039;s go get into town (in the night time)
To the disco, where we&#039;ll meet
Happy people feel the beats
Flashing colors of every kind
And no more worries all my mind
Ooh, dancing together
Moving to the music and the DJ on the dance floor
Ooh, singing together
Hands up for the music and the DJ&#039;s song will have more
Ooh, dancing together
Grooving with the music and the DJ on the dance floor
Ooh, singing together
Hands up for the music and the DJ&#039;s song will have more

其中我主要就对 &quot;Every day it gets we down&quot; 这一句存疑，发音像 &quot;gets we down&quot;, 但这里用 &quot;we&quot; 语法有问题，如果是 &quot;way&quot; 好像也解释不通。哪位能听出来是什么的可以留言告诉我一下。

PS, 没听过这歌 Dancing Together 的强烈推荐听一听，1 分钟的前奏 + 长达 1 分 45 秒 (03:15 - 05:00) 的间奏听着非常过瘾。I Wanna Love You Once Again 也是 1 分 30 秒的前奏 + 1 分 35 秒 (03:55 - 05:30) 的间奏，纯音乐部分非常长。不过感觉现在大家都听惯了 3, 4 分钟的流行音乐，对这种动不动就 6, 7 分钟的 Disco 好像接受起来有点困难。
</description>
      <content:encoded>去年 4 月份的时候，为我网易云音乐总听歌排行第 2, 3 位的 &lt;a href=&quot;https://music.163.com/#/song?id=28546120&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;I Wanna Love You Once Again&lt;/a&gt; 和 &lt;a href=&quot;https://music.163.com/#/song?id=28546114&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;S.O.S.&lt;/a&gt; 分别制作了歌词，并上传到了网易云音乐。转眼一年多过去了，听了很多遍的排到第 4 位的 &lt;a href=&quot;https://music.163.com/#/song?id=407485850&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Dancing Together&lt;/a&gt; 依然一直没有歌词。想唱的时候很多词不知道，也没法完整的唱下来。&lt;br /&gt;&lt;br /&gt;于是昨天晚上在网上搜啊搜，终于找到了这一份某网友贡献出来的自己听出来的歌词，还说了可能有错误，后来看也确实是有不少错误。至于说我为啥不自己直接听写歌词？英语词汇量和听力水平还不够……&lt;br /&gt;&lt;br /&gt;找到的这份歌词是在 &lt;a href=&quot;https://th-vision.net/detail/ken-laszlo-dancing-together-Ik5QBY2WZsc.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://th-vision.net/detail/ken-laszlo-dancing-together-Ik5QBY2WZsc.html&lt;/a&gt; 上贴出的，内容如下，换行都丢了：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;LYRICS&amp;nbsp;(since&amp;nbsp;there&amp;nbsp;is&amp;nbsp;basically&amp;nbsp;none&amp;nbsp;in&amp;nbsp;the&amp;nbsp;internet),&amp;nbsp;created&amp;nbsp;myself&amp;nbsp;so&amp;nbsp;there&lt;br /&gt;
are&amp;nbsp;errors&amp;nbsp;Come&amp;nbsp;on&amp;nbsp;everybody,&amp;nbsp;come&amp;nbsp;on&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;rhythm&amp;nbsp;Get&amp;nbsp;along&amp;nbsp;to&amp;nbsp;feel&amp;nbsp;the&lt;br /&gt;
groove&amp;nbsp;(it&amp;#039;s&amp;nbsp;the&amp;nbsp;right&amp;nbsp;time)&amp;nbsp;Wake&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;fiesta,&amp;nbsp;waiting&amp;nbsp;for&amp;nbsp;the&amp;nbsp;fiesta,&lt;br /&gt;
Take&amp;nbsp;my&amp;nbsp;hand&amp;nbsp;and&amp;nbsp;go&amp;nbsp;and&amp;nbsp;move&amp;nbsp;(in&amp;nbsp;the&amp;nbsp;night&amp;nbsp;time)&amp;nbsp;True&amp;nbsp;for&amp;nbsp;disco,&amp;nbsp;when&amp;nbsp;we&amp;#039;ll&lt;br /&gt;
meet&amp;nbsp;Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beat&amp;nbsp;Flashing&amp;nbsp;bottles&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&amp;nbsp;And&amp;nbsp;no&amp;nbsp;more&lt;br /&gt;
worries&amp;nbsp;all&amp;nbsp;the&amp;nbsp;night&amp;nbsp;Ooh&amp;nbsp;dancing&amp;nbsp;together&amp;nbsp;Move&amp;nbsp;it&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&lt;br /&gt;
on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&amp;nbsp;Ooh&amp;nbsp;singing&amp;nbsp;together&amp;nbsp;Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&lt;br /&gt;
song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&amp;nbsp;Working&amp;nbsp;by&amp;nbsp;the&amp;nbsp;daytime,&amp;nbsp;working&amp;nbsp;by&amp;nbsp;the&amp;nbsp;morning&amp;nbsp;Every&amp;nbsp;time&lt;br /&gt;
it&amp;nbsp;gasps&amp;nbsp;me&amp;nbsp;down&amp;nbsp;(like&amp;nbsp;a&amp;nbsp;fever)&amp;nbsp;Worries&amp;nbsp;by&amp;nbsp;the&amp;nbsp;night&amp;nbsp;time,&amp;nbsp;worries&amp;nbsp;from&lt;br /&gt;
my&amp;nbsp;heartache&amp;nbsp;Let&amp;nbsp;me&amp;nbsp;go&amp;nbsp;get&amp;nbsp;it&amp;nbsp;into&amp;nbsp;town,&amp;nbsp;let&amp;nbsp;me&amp;nbsp;leave&amp;nbsp;him&amp;nbsp;True&amp;nbsp;for&amp;nbsp;disco,&lt;br /&gt;
when&amp;nbsp;we&amp;#039;ll&amp;nbsp;meet&amp;nbsp;Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beat&amp;nbsp;Flashing&amp;nbsp;bottles&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&lt;br /&gt;
And&amp;nbsp;no&amp;nbsp;more&amp;nbsp;worries&amp;nbsp;all&amp;nbsp;the&amp;nbsp;night&amp;nbsp;Ooh&amp;nbsp;dancing&amp;nbsp;together&amp;nbsp;Move&amp;nbsp;it&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;up&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&amp;nbsp;Ooh&amp;nbsp;singing&amp;nbsp;together&amp;nbsp;Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&amp;nbsp;Ooh&amp;nbsp;dancing&amp;nbsp;together&amp;nbsp;Grooving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&amp;nbsp;Ooh&amp;nbsp;singing&amp;nbsp;together&amp;nbsp;Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&amp;nbsp;DJ&amp;#039;s&amp;nbsp;playing&amp;nbsp;music,&amp;nbsp;sweep&amp;nbsp;around&amp;nbsp;the&amp;nbsp;vinyl&lt;br /&gt;
Melodies&amp;nbsp;are&amp;nbsp;what&amp;nbsp;we&amp;nbsp;need&amp;nbsp;(for&amp;nbsp;a&amp;nbsp;lifetime)&amp;nbsp;Dancing&amp;nbsp;with&amp;nbsp;my&amp;nbsp;baby,&amp;nbsp;dancing&amp;nbsp;with&lt;br /&gt;
my&amp;nbsp;heartache&amp;nbsp;Let&amp;nbsp;me&amp;nbsp;go&amp;nbsp;get&amp;nbsp;into&amp;nbsp;town,&amp;nbsp;let&amp;nbsp;me&amp;nbsp;leave&amp;nbsp;him&amp;nbsp;True&amp;nbsp;for&amp;nbsp;disco,&amp;nbsp;when&lt;br /&gt;
we&amp;#039;ll&amp;nbsp;meet&amp;nbsp;Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beat&amp;nbsp;Flashing&amp;nbsp;bottles&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&amp;nbsp;And&lt;br /&gt;
no&amp;nbsp;more&amp;nbsp;worries&amp;nbsp;all&amp;nbsp;the&amp;nbsp;night&amp;nbsp;Ooh&amp;nbsp;dancing&amp;nbsp;together&amp;nbsp;Grooving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&amp;nbsp;Ooh&amp;nbsp;singing&amp;nbsp;together&amp;nbsp;Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&amp;nbsp;Ooh&amp;nbsp;dancing&amp;nbsp;together&amp;nbsp;Grooving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&amp;nbsp;Ooh&amp;nbsp;singing&amp;nbsp;together&amp;nbsp;Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&lt;br /&gt;
and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;br /&gt;
Eli&amp;nbsp;SuryanaEli&amp;nbsp;Suryana4&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;由于这首歌是 2009 年发行的，Live 很少有唱到这首的。我只在 &lt;a href=&quot;https://www.youtube.com/watch?v=yo7Zgr4YGs8&amp;amp;t=2520s&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Ken Laszlo live at 330LIVE 2011&lt;/a&gt; 这场 Live 中找到了这首，而且在 &lt;a href=&quot;https://www.youtube.com/watch?v=yo7Zgr4YGs8&amp;amp;t=2520s&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;42:00&lt;/a&gt; 的位置，Ken 居然说 &quot;I don&#039;t remember the words&quot;, 后边有好几句也确实是明显唱错了 (⊙﹏⊙)&lt;br /&gt;&lt;br /&gt;经过我反复地听、对比、纠错，最终修改了这么多地方 (点击可查看大图):&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_dancing_together_lyric_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_dancing_together_lyric_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;修改完的歌词如下:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Ken&amp;nbsp;Laszlo&amp;nbsp;-&amp;nbsp;Dancing&amp;nbsp;Together&amp;nbsp;(Vocal&amp;nbsp;Version)&amp;nbsp;lyric&lt;br /&gt;
&lt;br /&gt;
Come&amp;nbsp;on&amp;nbsp;everybody,&amp;nbsp;come&amp;nbsp;on&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;rhythm&lt;br /&gt;
Get&amp;nbsp;along&amp;nbsp;to&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;groove&amp;nbsp;(it&amp;#039;s&amp;nbsp;the&amp;nbsp;right&amp;nbsp;time)&lt;br /&gt;
Wake&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;fiesta,&amp;nbsp;waiting&amp;nbsp;for&amp;nbsp;the&amp;nbsp;fiesta&lt;br /&gt;
Take&amp;nbsp;my&amp;nbsp;hand&amp;nbsp;and&amp;nbsp;go&amp;nbsp;and&amp;nbsp;move&amp;nbsp;(in&amp;nbsp;the&amp;nbsp;night&amp;nbsp;time)&lt;br /&gt;
To&amp;nbsp;the&amp;nbsp;disco,&amp;nbsp;where&amp;nbsp;we&amp;#039;ll&amp;nbsp;meet&lt;br /&gt;
Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beats&lt;br /&gt;
Flashing&amp;nbsp;colors&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&lt;br /&gt;
And&amp;nbsp;no&amp;nbsp;more&amp;nbsp;worries&amp;nbsp;all&amp;nbsp;your&amp;nbsp;mind&lt;br /&gt;
Ooh,&amp;nbsp;dancing&amp;nbsp;together&lt;br /&gt;
Moving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&lt;br /&gt;
Ooh,&amp;nbsp;singing&amp;nbsp;together&lt;br /&gt;
Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;br /&gt;
&lt;br /&gt;
Working&amp;nbsp;in&amp;nbsp;the&amp;nbsp;daytime,&amp;nbsp;working&amp;nbsp;for&amp;nbsp;the&amp;nbsp;money&lt;br /&gt;
Every&amp;nbsp;day&amp;nbsp;it&amp;nbsp;gets&amp;nbsp;we&amp;nbsp;down&amp;nbsp;(like&amp;nbsp;a&amp;nbsp;fever)&lt;br /&gt;
Worries&amp;nbsp;in&amp;nbsp;the&amp;nbsp;night&amp;nbsp;time,&amp;nbsp;worries&amp;nbsp;for&amp;nbsp;my&amp;nbsp;honey&lt;br /&gt;
Let&amp;nbsp;me&amp;nbsp;go&amp;nbsp;get&amp;nbsp;it&amp;nbsp;into&amp;nbsp;town&amp;nbsp;(let&amp;nbsp;me&amp;nbsp;leave&amp;nbsp;it)&lt;br /&gt;
To&amp;nbsp;the&amp;nbsp;disco,&amp;nbsp;where&amp;nbsp;we&amp;#039;ll&amp;nbsp;meet&lt;br /&gt;
Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beats&lt;br /&gt;
Flashing&amp;nbsp;colors&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&lt;br /&gt;
And&amp;nbsp;no&amp;nbsp;more&amp;nbsp;worries&amp;nbsp;all&amp;nbsp;my&amp;nbsp;mind&lt;br /&gt;
Ooh,&amp;nbsp;dancing&amp;nbsp;together&lt;br /&gt;
Moving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&lt;br /&gt;
Ooh,&amp;nbsp;singing&amp;nbsp;together&lt;br /&gt;
Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;br /&gt;
Ooh,&amp;nbsp;dancing&amp;nbsp;together&lt;br /&gt;
Grooving&amp;nbsp;with&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&lt;br /&gt;
Ooh,&amp;nbsp;singing&amp;nbsp;together&lt;br /&gt;
Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;br /&gt;
&lt;br /&gt;
DJ&amp;#039;s&amp;nbsp;playing&amp;nbsp;music,&amp;nbsp;sweep&amp;nbsp;around&amp;nbsp;the&amp;nbsp;vinyl&lt;br /&gt;
Melodies&amp;nbsp;are&amp;nbsp;what&amp;nbsp;we&amp;#039;ll&amp;nbsp;need&amp;nbsp;(for&amp;nbsp;a&amp;nbsp;lifetime)&lt;br /&gt;
Dancing&amp;nbsp;with&amp;nbsp;my&amp;nbsp;baby,&amp;nbsp;dancing&amp;nbsp;with&amp;nbsp;my&amp;nbsp;honey&lt;br /&gt;
Let&amp;#039;s&amp;nbsp;go&amp;nbsp;get&amp;nbsp;into&amp;nbsp;town&amp;nbsp;(in&amp;nbsp;the&amp;nbsp;night&amp;nbsp;time)&lt;br /&gt;
To&amp;nbsp;the&amp;nbsp;disco,&amp;nbsp;where&amp;nbsp;we&amp;#039;ll&amp;nbsp;meet&lt;br /&gt;
Happy&amp;nbsp;people&amp;nbsp;feel&amp;nbsp;the&amp;nbsp;beats&lt;br /&gt;
Flashing&amp;nbsp;colors&amp;nbsp;of&amp;nbsp;every&amp;nbsp;kind&lt;br /&gt;
And&amp;nbsp;no&amp;nbsp;more&amp;nbsp;worries&amp;nbsp;all&amp;nbsp;my&amp;nbsp;mind&lt;br /&gt;
Ooh,&amp;nbsp;dancing&amp;nbsp;together&lt;br /&gt;
Moving&amp;nbsp;to&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&lt;br /&gt;
Ooh,&amp;nbsp;singing&amp;nbsp;together&lt;br /&gt;
Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;br /&gt;
Ooh,&amp;nbsp;dancing&amp;nbsp;together&lt;br /&gt;
Grooving&amp;nbsp;with&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;nbsp;on&amp;nbsp;the&amp;nbsp;dance&amp;nbsp;floor&lt;br /&gt;
Ooh,&amp;nbsp;singing&amp;nbsp;together&lt;br /&gt;
Hands&amp;nbsp;up&amp;nbsp;for&amp;nbsp;the&amp;nbsp;music&amp;nbsp;and&amp;nbsp;the&amp;nbsp;DJ&amp;#039;s&amp;nbsp;song&amp;nbsp;will&amp;nbsp;have&amp;nbsp;more&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;其中我主要就对 &quot;Every day it gets we down&quot; 这一句存疑，发音像 &quot;gets we down&quot;, 但这里用 &quot;we&quot; 语法有问题，如果是 &quot;way&quot; 好像也解释不通。哪位能听出来是什么的可以留言告诉我一下。&lt;br /&gt;&lt;br /&gt;PS, 没听过这歌 &lt;a href=&quot;https://music.163.com/#/song?id=407485850&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Dancing Together&lt;/a&gt; 的强烈推荐听一听，1 分钟的前奏 + 长达 1 分 45 秒 (03:15 - 05:00) 的间奏听着非常过瘾。&lt;a href=&quot;https://music.163.com/#/song?id=28546120&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;I Wanna Love You Once Again&lt;/a&gt; 也是 1 分 30 秒的前奏 + 1 分 35 秒 (03:55 - 05:30) 的间奏，纯音乐部分非常长。不过感觉现在大家都听惯了 3, 4 分钟的流行音乐，对这种动不动就 6, 7 分钟的 Disco 好像接受起来有点困难。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/c35de5d3/created-lyrics-for-dancing-together-and-uploaded-them-to-netease-cloud-music?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow @ Maker Faire Beijing 2018</title>
      <link>https://blog.wudilabs.com/entry/b3edd531/beatshow-at-maker-faire-beijing-2018</link>
      <comments>https://blog.wudilabs.com/entry/b3edd531/beatshow-at-maker-faire-beijing-2018#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b3edd531/beatshow-at-maker-faire-beijing-2018?lang=zh-CN</guid>
      <pubDate>Sun, 18 Nov 2018 14:15:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <description>今年以个人身份报名参加 Maker Faire Beijing 2018 活动，展示了业余时间制作的 BeatShow - 自动音乐灯光秀系统。

活动举办地点在国家体育馆东广场，原定于十一期间举办，后来因为种种原因推迟到 10 月中旬。

image_beatshow_bmf2018_01_thumb

下面这张就是 BeatShow 展位的样子啦～ 初次参加这种活动，还欠缺经验。由于环境比较亮，后边的 LED 幕布相比黑暗环境中效果差了很多。

image_beatshow_bmf2018_02_thumb

相比之下，平板形式的硬件受环境的影响比较小。至于笔记本屏幕后边贴的背景灯，貌似大家一般都注意不到～～～

image_beatshow_bmf2018_03_thumb

最后一天撤展前拍了点视频，活动结束后又在室内暗光条件下拍了一些视频，加在一起剪了个视频：

[[Video:http://v.youku.com/v_show/id_XMzkyNTI4MjI0NA==.html]]
在优酷上观看: http://v.youku.com/v_show/id_XMzkyNTI4MjI0NA==.html
在 bilibili 上观看: https://www.bilibili.com/video/av36271614/</description>
      <content:encoded>今年以个人身份报名参加 Maker Faire Beijing 2018 活动，展示了业余时间制作的 BeatShow - 自动音乐灯光秀系统。&lt;br /&gt;&lt;br /&gt;活动举办地点在国家体育馆东广场，原定于十一期间举办，后来因为种种原因推迟到 10 月中旬。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;下面这张就是 BeatShow 展位的样子啦～ 初次参加这种活动，还欠缺经验。由于环境比较亮，后边的 LED 幕布相比黑暗环境中效果差了很多。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;相比之下，平板形式的硬件受环境的影响比较小。至于笔记本屏幕后边贴的背景灯，貌似大家一般都注意不到～～～&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_beatshow_bmf2018_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;最后一天撤展前拍了点视频，活动结束后又在室内暗光条件下拍了一些视频，加在一起剪了个视频：&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzkyNTI4MjI0NA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;http://v.youku.com/v_show/id_XMzkyNTI4MjI0NA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://v.youku.com/v_show/id_XMzkyNTI4MjI0NA==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av36271614/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av36271614/&lt;/a&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3edd531/beatshow-at-maker-faire-beijing-2018?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3edd531/beatshow-at-maker-faire-beijing-2018?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>PALMEXPO 2018 第27届中国国际专业音响·灯光展</title>
      <link>https://blog.wudilabs.com/entry/d36db010/palmexpo-2018-the-27th-china-international-professional-audio-and-lighting-exhibition</link>
      <comments>https://blog.wudilabs.com/entry/d36db010/palmexpo-2018-the-27th-china-international-professional-audio-and-lighting-exhibition#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d36db010/palmexpo-2018-the-27th-china-international-professional-audio-and-lighting-exhibition?lang=zh-CN</guid>
      <pubDate>Sat, 01 Sep 2018 13:51:06 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音乐</category>
      <description>上周四 (8月23日) 的时候，去国家会议中心看了一下 PALMEXPO 2018 第27届中国国际专业音响·灯光·乐器及技术展览会 (音响灯光展)。主要看的是舞台灯光类的展台，还有一些纯音响设备和做舞台设计的也拍了，但没有剪辑。

[[Video:http://v.youku.com/v_show/id_XMzgwNzA0MzUwNA==.html]]
在优酷上观看: http://v.youku.com/v_show/id_XMzgwNzA0MzUwNA==.html
在 bilibili 上观看: https://www.bilibili.com/video/av30896539/</description>
      <content:encoded>上周四 (8月23日) 的时候，去国家会议中心看了一下 PALMEXPO 2018 第27届中国国际专业音响·灯光·乐器及技术展览会 (音响灯光展)。主要看的是舞台灯光类的展台，还有一些纯音响设备和做舞台设计的也拍了，但没有剪辑。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzgwNzA0MzUwNA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;http://v.youku.com/v_show/id_XMzgwNzA0MzUwNA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://v.youku.com/v_show/id_XMzgwNzA0MzUwNA==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av30896539/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av30896539/&lt;/a&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d36db010/palmexpo-2018-the-27th-china-international-professional-audio-and-lighting-exhibition?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 演示视频设备篇</title>
      <link>https://blog.wudilabs.com/entry/a3ecef7d/beatshow-demonstration-video-equipment</link>
      <comments>https://blog.wudilabs.com/entry/a3ecef7d/beatshow-demonstration-video-equipment#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a3ecef7d/beatshow-demonstration-video-equipment?lang=zh-CN</guid>
      <pubDate>Thu, 30 Aug 2018 15:19:56 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>这两天制作了两个 BeatShow 设备篇的演示视频。

设备篇 (1): DIY 显示器音乐背景灯

这是一个 BeatShow 以显示器背景灯的形式使用时的效果演示。

[[Video:https://v.youku.com/v_show/id_XMzgwMTgzMjg1Mg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzgwMTgzMjg1Mg==.html
在 bilibili 上观看: https://www.bilibili.com/video/av30579352/

设备篇 (2): 自供电便携 LED 音乐幕布

这个想法是很早就有了，但做 PCB 的话要考虑电源管理芯片的选型，按键、显示的位置等等所有细节。所以最近干脆先用现成的一些模块做了几个硬件原型出来，看看效果。结果在安装过程中发现，好像用上次给显示器用的那个硬件来做也没差多少……

[[Video:https://v.youku.com/v_show/id_XMzgwNDU2ODU2NA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzgwNDU2ODU2NA==.html
在 bilibili 上观看: https://www.bilibili.com/video/av30744071/
</description>
      <content:encoded>这两天制作了两个 BeatShow 设备篇的演示视频。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;设备篇 (1): DIY 显示器音乐背景灯&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;这是一个 BeatShow 以显示器背景灯的形式使用时的效果演示。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzgwMTgzMjg1Mg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzgwMTgzMjg1Mg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzgwMTgzMjg1Mg==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av30579352/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av30579352/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;设备篇 (2): 自供电便携 LED 音乐幕布&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;这个想法是很早就有了，但做 PCB 的话要考虑电源管理芯片的选型，按键、显示的位置等等所有细节。所以最近干脆先用现成的一些模块做了几个硬件原型出来，看看效果。结果在安装过程中发现，好像用上次给显示器用的那个硬件来做也没差多少……&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzgwNDU2ODU2NA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzgwNDU2ODU2NA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzgwNDU2ODU2NA==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av30744071/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av30744071/&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a3ecef7d/beatshow-demonstration-video-equipment?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 介绍视频和演示视频番外篇</title>
      <link>https://blog.wudilabs.com/entry/e3dcfeba/beatshow-intro-video-and-demo-video-bonus</link>
      <comments>https://blog.wudilabs.com/entry/e3dcfeba/beatshow-intro-video-and-demo-video-bonus#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e3dcfeba/beatshow-intro-video-and-demo-video-bonus?lang=zh-CN</guid>
      <pubDate>Sat, 11 Aug 2018 07:01:26 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>音乐</category>
      <description>这周四的时候把原来在优酷上传过的一些视频也传到 bilibili 去了, 成为了一名 B 站的 UP 主。BeatShow 现在已经开始准备大范围的公开了，之前 Youtube 上的视频上传之后都是设为不可见的的，只是留个底用，现在也都设为公开了。

昨天又做了两个新视频，一个是 BeatShow 的介绍视频，还有一个是《燃烧我的卡路里》的演示视频。最近这首歌在B站的鬼畜区很火，所以就录了一个灯光秀效果演示，作为番外篇的第一个视频。现在看着只是比 5 月份的演示视频多了几种效果，但其实前端时间把整个效果生成的 JavaScript 代码重写了。现在的代码结构更容易实现新的效果，而且为多个设备同步展示做好了准备工作。

BeatShow 简要介绍视频

[[Video:https://v.youku.com/v_show/id_XMzc3NDg4Njg1Mg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzc3NDg4Njg1Mg==.html
在 bilibili 上观看: https://www.bilibili.com/video/av29082259/

演示视频番外篇: 燃烧我的卡路里

[[Video:https://v.youku.com/v_show/id_XMzc3NDg3ODAzNg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzc3NDg3ODAzNg==.html
在 bilibili 上观看: https://www.bilibili.com/video/av29076973/

PS, B 站的个人空间地址是 https://space.bilibili.com/2907742/
</description>
      <content:encoded>这周四的时候把原来在优酷上传过的一些视频也传到 bilibili 去了, 成为了一名 B 站的 UP 主。BeatShow 现在已经开始准备大范围的公开了，之前 Youtube 上的视频上传之后都是设为不可见的的，只是留个底用，现在也都设为公开了。&lt;br /&gt;&lt;br /&gt;昨天又做了两个新视频，一个是 BeatShow 的介绍视频，还有一个是《燃烧我的卡路里》的演示视频。最近这首歌在B站的鬼畜区很火，所以就录了一个灯光秀效果演示，作为番外篇的第一个视频。现在看着只是比 5 月份的演示视频多了几种效果，但其实前端时间把整个效果生成的 JavaScript 代码重写了。现在的代码结构更容易实现新的效果，而且为多个设备同步展示做好了准备工作。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BeatShow 简要介绍视频&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzc3NDg4Njg1Mg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzc3NDg4Njg1Mg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzc3NDg4Njg1Mg==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av29082259/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av29082259/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;演示视频番外篇: 燃烧我的卡路里&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzc3NDg3ODAzNg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzc3NDg3ODAzNg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzc3NDg3ODAzNg==.html&lt;/a&gt;&lt;br /&gt;在 bilibili 上观看: &lt;a href=&quot;https://www.bilibili.com/video/av29076973/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.bilibili.com/video/av29076973/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS, B 站的个人空间地址是 &lt;a href=&quot;https://space.bilibili.com/2907742/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://space.bilibili.com/2907742/&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e3dcfeba/beatshow-intro-video-and-demo-video-bonus?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>2018 北京科博会一瞥</title>
      <link>https://blog.wudilabs.com/entry/d3cc1933/a-glimpse-of-the-2018-beijing-science-and-technology-expo</link>
      <comments>https://blog.wudilabs.com/entry/d3cc1933/a-glimpse-of-the-2018-beijing-science-and-technology-expo#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d3cc1933/a-glimpse-of-the-2018-beijing-science-and-technology-expo?lang=zh-CN</guid>
      <pubDate>Sat, 19 May 2018 16:35:52 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>杂项</category>
      <description>科博会一瞥。1 号馆没什么好看的，二层教育部分很多机器人和搞图形编程的。大部分都是在 8A 馆拍的，智慧教育/电子科技展区。还看到了一个电脑看面相的，结果感觉纯粹是糊弄人的，估计同一个人站两次结果都不一样。看了几个人的识别结果，感觉很不准。

[[Video:https://v.youku.com/v_show/id_XMzYxNTcyMDkyNA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzYxNTcyMDkyNA==.html
</description>
      <content:encoded>科博会一瞥。1 号馆没什么好看的，二层教育部分很多机器人和搞图形编程的。大部分都是在 8A 馆拍的，智慧教育/电子科技展区。还看到了一个电脑看面相的，结果感觉纯粹是糊弄人的，估计同一个人站两次结果都不一样。看了几个人的识别结果，感觉很不准。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzYxNTcyMDkyNA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzYxNTcyMDkyNA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzYxNTcyMDkyNA==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d3cc1933/a-glimpse-of-the-2018-beijing-science-and-technology-expo?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 开发阶段预览 (3 - 5)</title>
      <link>https://blog.wudilabs.com/entry/d36cf8a5/beatshow-development-stage-preview-3-5</link>
      <comments>https://blog.wudilabs.com/entry/d36cf8a5/beatshow-development-stage-preview-3-5#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d36cf8a5/beatshow-development-stage-preview-3-5?lang=zh-CN</guid>
      <pubDate>Sun, 06 May 2018 15:51:06 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <description>预览 (3) - 概览

距上个演示视频又有 8 个月了，现在演示中用的算法和原来的基本一样，差别在于硬件初步有了点模样 (后续还有其他形态的硬件)，PC 端软件所显示的信息也丰富了很多。

[[Video:https://v.youku.com/v_show/id_XMzU4ODU3MTc2OA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzU4ODU3MTc2OA==.html
在 Youtube 上观看: https://www.youtube.com/watch?v=cR6CQ3Y08vE

预览 (4) - 单曲 It&#039;s A Fine Day

这次预览视频还有两个完整单曲的。首先这个 It&#039;s A Fine Day 在最近几个月之内洗脑循环了很多遍，现在网易云统计累计播放 89 次，在网易云之外播放的应该也超过了 100 次，强力推荐听一听。单曲版本视频用的是原版音频，而不是现场收音的。

[[Video:https://v.youku.com/v_show/id_XMzU4ODY0NjUwOA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzU4ODY0NjUwOA==.html
在 Youtube 上观看: https://www.youtube.com/watch?v=I9CAPZlS8K4

预览 (5) - 单曲 The Rain

还有这首 The Rain, 是今年某天晚上网易日推中听到的，到现在统计数字是累计播放 116 次。不用在意歌词，间奏很好听。而且因为是翻唱的老曲子，整首歌时长有 6:15。

[[Video:https://v.youku.com/v_show/id_XMzU4ODY3MDE5Mg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzU4ODY3MDE5Mg==.html
在 Youtube 上观看: https://www.youtube.com/watch?v=l5G7iJvaLPQ
</description>
      <content:encoded>&lt;b&gt;预览 (3) - 概览&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;距上个演示视频又有 8 个月了，现在演示中用的算法和原来的基本一样，差别在于硬件初步有了点模样 (后续还有其他形态的硬件)，PC 端软件所显示的信息也丰富了很多。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzU4ODU3MTc2OA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzU4ODU3MTc2OA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzU4ODU3MTc2OA==.html&lt;/a&gt;&lt;br /&gt;在 Youtube 上观看: &lt;a href=&quot;https://www.youtube.com/watch?v=cR6CQ3Y08vE&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=cR6CQ3Y08vE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;预览 (4) - 单曲 It&#039;s A Fine Day&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;这次预览视频还有两个完整单曲的。首先这个 It&#039;s A Fine Day 在最近几个月之内洗脑循环了很多遍，现在网易云统计累计播放 89 次，在网易云之外播放的应该也超过了 100 次，强力推荐听一听。单曲版本视频用的是原版音频，而不是现场收音的。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzU4ODY0NjUwOA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzU4ODY0NjUwOA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzU4ODY0NjUwOA==.html&lt;/a&gt;&lt;br /&gt;在 Youtube 上观看: &lt;a href=&quot;https://www.youtube.com/watch?v=I9CAPZlS8K4&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=I9CAPZlS8K4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;预览 (5) - 单曲 The Rain&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;还有这首 The Rain, 是今年某天晚上网易日推中听到的，到现在统计数字是累计播放 116 次。不用在意歌词，间奏很好听。而且因为是翻唱的老曲子，整首歌时长有 6:15。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzU4ODY3MDE5Mg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzU4ODY3MDE5Mg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzU4ODY3MDE5Mg==.html&lt;/a&gt;&lt;br /&gt;在 Youtube 上观看: &lt;a href=&quot;https://www.youtube.com/watch?v=l5G7iJvaLPQ&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=l5G7iJvaLPQ&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d36cf8a5/beatshow-development-stage-preview-3-5?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/d36cf8a5/beatshow-development-stage-preview-3-5?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>2017 南宫艺术灯光夜/灯光节</title>
      <link>https://blog.wudilabs.com/entry/e36b32c5/the-2017-nangong-art-lighting-festival</link>
      <comments>https://blog.wudilabs.com/entry/e36b32c5/the-2017-nangong-art-lighting-festival#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e36b32c5/the-2017-nangong-art-lighting-festival?lang=zh-CN</guid>
      <pubDate>Fri, 06 Oct 2017 09:35:26 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>杂项</category>
      <description>千里迢迢去考察了南宫艺术灯光节，北区和西区两个园区各转了两圈，全程拍摄视频。大部分灯都是流星雨或者串灯，RGB 的灯带都不多，而且都是固定模式循环显示的。

[[Video:https://v.youku.com/v_show/id_XMzA2ODEyNzM4OA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzA2ODEyNzM4OA==.html
</description>
      <content:encoded>千里迢迢去考察了南宫艺术灯光节，北区和西区两个园区各转了两圈，全程拍摄视频。大部分灯都是流星雨或者串灯，RGB 的灯带都不多，而且都是固定模式循环显示的。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzA2ODEyNzM4OA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzA2ODEyNzM4OA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzA2ODEyNzM4OA==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e36b32c5/the-2017-nangong-art-lighting-festival?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 开发阶段预览 (2)</title>
      <link>https://blog.wudilabs.com/entry/b3abd0d9/beatshow-development-stage-preview-2</link>
      <comments>https://blog.wudilabs.com/entry/b3abd0d9/beatshow-development-stage-preview-2#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b3abd0d9/beatshow-development-stage-preview-2?lang=zh-CN</guid>
      <pubDate>Sun, 10 Sep 2017 14:16:30 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <description>时隔 5 个月，又改进了一下 BeatShow 的算法。现在基础节拍识别能适应更多类型的音乐了，此外还增加了对显著的乐器声音的展示 (中间的绿条)。视频拍摄和剪辑都很仓促，因为算法还未调整完，仍然只是个预览。

[[Video:https://v.youku.com/v_show/id_XMzAxNjgxMDU0NA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMzAxNjgxMDU0NA==.html

在 Youtube 上观看: https://www.youtube.com/watch?v=YAK_k-aDpX4
</description>
      <content:encoded>时隔 5 个月，又改进了一下 BeatShow 的算法。现在基础节拍识别能适应更多类型的音乐了，此外还增加了对显著的乐器声音的展示 (中间的绿条)。视频拍摄和剪辑都很仓促，因为算法还未调整完，仍然只是个预览。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMzAxNjgxMDU0NA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMzAxNjgxMDU0NA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMzAxNjgxMDU0NA==.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在 Youtube 上观看: &lt;a href=&quot;https://www.youtube.com/watch?v=YAK_k-aDpX4&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=YAK_k-aDpX4&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3abd0d9/beatshow-development-stage-preview-2?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3abd0d9/beatshow-development-stage-preview-2?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>北京创客盛会 Maker Faire Beijing 2017</title>
      <link>https://blog.wudilabs.com/entry/d36aee1c/maker-faire-beijing-2017</link>
      <comments>https://blog.wudilabs.com/entry/d36aee1c/maker-faire-beijing-2017#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d36aee1c/maker-faire-beijing-2017?lang=zh-CN</guid>
      <pubDate>Sun, 13 Aug 2017 15:05:16 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>DIY</category>
      <category>电子</category>
      <category>杂项</category>
      <description>昨天从论坛中一个辉光数码管时钟的图片搜到了 Maker Faire 这个活动，再一搜，还真巧，北京这两天正好正在办一个，在中华世纪坛。一共 3 天，今天是最后一天了，所以吃过午饭就直接去看了。

结果到了之后就知道为啥有家庭套票卖了，一多半内容都是面向小孩的，这点和国外的 Maker Faire 不太一样。个人制作的东西也比较少，大多是公司开发的面向小朋友的制作套件。

[[Video:https://v.youku.com/v_show/id_XMjk2NzMwMTI5Mg==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMjk2NzMwMTI5Mg==.html
</description>
      <content:encoded>昨天从论坛中一个辉光数码管时钟的图片搜到了 Maker Faire 这个活动，再一搜，还真巧，北京这两天正好正在办一个，在中华世纪坛。一共 3 天，今天是最后一天了，所以吃过午饭就直接去看了。&lt;br /&gt;&lt;br /&gt;结果到了之后就知道为啥有家庭套票卖了，一多半内容都是面向小孩的，这点和国外的 Maker Faire 不太一样。个人制作的东西也比较少，大多是公司开发的面向小朋友的制作套件。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMjk2NzMwMTI5Mg==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMjk2NzMwMTI5Mg==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMjk2NzMwMTI5Mg==.html&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d36aee1c/maker-faire-beijing-2017?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>PowerDirector 15 中不正常的鼠标滚轮行为</title>
      <link>https://blog.wudilabs.com/entry/83aab766/unusual-mouse-wheel-behavior-in-powerdirector-15</link>
      <comments>https://blog.wudilabs.com/entry/83aab766/unusual-mouse-wheel-behavior-in-powerdirector-15#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/83aab766/unusual-mouse-wheel-behavior-in-powerdirector-15?lang=zh-CN</guid>
      <pubDate>Sun, 23 Apr 2017 13:50:16 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机软件</category>
      <description>Why does the behavior of mouse wheel in timeline differ from most softwares?</description>
      <content:encoded>&lt;a href=&quot;http://forum.cyberlink.com/forum/posts/list/52113.page&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Why does the behavior of mouse wheel in timeline differ from most softwares?&lt;/a&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/83aab766/unusual-mouse-wheel-behavior-in-powerdirector-15?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/83aab766/unusual-mouse-wheel-behavior-in-powerdirector-15?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>BeatShow 开发阶段预览视频</title>
      <link>https://blog.wudilabs.com/entry/93eaf6b8/beatshow-development-stage-preview</link>
      <comments>https://blog.wudilabs.com/entry/93eaf6b8/beatshow-development-stage-preview#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/93eaf6b8/beatshow-development-stage-preview?lang=zh-CN</guid>
      <pubDate>Sun, 09 Apr 2017 15:21:50 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <description>昨天拍了 BeatShow 的一个开发阶段演示视频，现在已经能大概看出点最终的样子了。硬件、软件和算法从春节假期开始，在周末断断续续弄的，前期耗时主要在算法上。

[[Video:https://v.youku.com/v_show/id_XMjY5ODA3MzYyNA==.html]]
在优酷上观看: https://v.youku.com/v_show/id_XMjY5ODA3MzYyNA==.html
在 Youtube 上观看: https://www.youtube.com/watch?v=9bLKVEQo254

硬件是通过 WiFi 接入家里的无线网络的，所以最后做一个 Android 的 app 的话，手机上也可以直接用。
</description>
      <content:encoded>昨天拍了 BeatShow 的一个开发阶段演示视频，现在已经能大概看出点最终的样子了。硬件、软件和算法从春节假期开始，在周末断断续续弄的，前期耗时主要在算法上。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;video_wrapper&quot;&gt;&lt;iframe width=&quot;340&quot; height=&quot;190&quot; src=&quot;https://player.youku.com/embed/XMjY5ODA3MzYyNA==?autoplay=false&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;在优酷上观看: &lt;a href=&quot;https://v.youku.com/v_show/id_XMjY5ODA3MzYyNA==.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://v.youku.com/v_show/id_XMjY5ODA3MzYyNA==.html&lt;/a&gt;&lt;br /&gt;在 Youtube 上观看: &lt;a href=&quot;https://www.youtube.com/watch?v=9bLKVEQo254&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.youtube.com/watch?v=9bLKVEQo254&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;硬件是通过 WiFi 接入家里的无线网络的，所以最后做一个 Android 的 app 的话，手机上也可以直接用。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/93eaf6b8/beatshow-development-stage-preview?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/93eaf6b8/beatshow-development-stage-preview?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>Hit&#039;n&#039;Mix</title>
      <link>https://blog.wudilabs.com/entry/936af27c/hit-n-mix</link>
      <comments>https://blog.wudilabs.com/entry/936af27c/hit-n-mix#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/936af27c/hit-n-mix?lang=zh-CN</guid>
      <pubDate>Mon, 13 Feb 2017 15:59:30 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音频处理</category>
      <category>计算机软件</category>
      <description>有没有可能把一首歌曲的人声和伴奏分离？它的原理是什么？主要用到什么技术？ - 音频 - 知乎
Hit&#039;n&#039;Mix - Downloads
</description>
      <content:encoded>&lt;a href=&quot;https://www.zhihu.com/question/20104628&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;有没有可能把一首歌曲的人声和伴奏分离？它的原理是什么？主要用到什么技术？ - 音频 - 知乎&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.hitnmix.com/downloads.htm&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Hit&amp;#039;n&amp;#039;Mix - Downloads&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/936af27c/hit-n-mix?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>注册了域名 beatshow.net</title>
      <link>https://blog.wudilabs.com/entry/936ad2c6/registered-the-domain-beatshow-net</link>
      <comments>https://blog.wudilabs.com/entry/936ad2c6/registered-the-domain-beatshow-net#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/936ad2c6/registered-the-domain-beatshow-net?lang=zh-CN</guid>
      <pubDate>Tue, 07 Feb 2017 14:05:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>BeatShow</category>
      <category>杂项</category>
      <description>今年春节期间又开始新的音乐节拍识别程序的编码工作。这两天搜索域名时发现 beatshow.net 还可注册，就赶紧注册下来了，将来作为新的自动音乐灯光秀的独立网站使用。

其他像 lightshow.com, lightshow.org 之类的的域名都是售价超过 $1000 USD 的 Premium Domain. light-show.com 也标到了 $4000+ USD. 像 beatshow.net 这样比较好记好读的 .net 域名居然还能用原价购买，还真不错。
</description>
      <content:encoded>今年春节期间又开始新的音乐节拍识别程序的编码工作。这两天搜索域名时发现 beatshow.net 还可注册，就赶紧注册下来了，将来作为新的自动音乐灯光秀的独立网站使用。&lt;br /&gt;&lt;br /&gt;其他像 lightshow.com, lightshow.org 之类的的域名都是售价超过 $1000 USD 的 Premium Domain. light-show.com 也标到了 $4000+ USD. 像 beatshow.net 这样比较好记好读的 .net 域名居然还能用原价购买，还真不错。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/936ad2c6/registered-the-domain-beatshow-net?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>原来老外也觉得 WinRAR 卖得太贵了</title>
      <link>https://blog.wudilabs.com/entry/e36ae106/i-see-that-the-foreigners-also-think-winrar-is-too-expensive</link>
      <comments>https://blog.wudilabs.com/entry/e36ae106/i-see-that-the-foreigners-also-think-winrar-is-too-expensive#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e36ae106/i-see-that-the-foreigners-also-think-winrar-is-too-expensive?lang=zh-CN</guid>
      <pubDate>Mon, 23 Jan 2017 15:56:01 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机软件</category>
      <description>今天看到 imgur 上有个页面 WinRAR isn&#039;t THAT expensive... 挺有意思的，

原图:
image_winrar_price_01

回复: Yes, Yes you are.
image_winrar_price_02

原来老外也觉得 WinRAR $29 的售价太高了，尤其是它的 license 还是按电脑算的，而不是按用户算的。上个月买 PowerDirector 15 Ultimate 附送 AudioDirector 才 $56, 这还是比 WinRAR 市场小的多得多的软件。

想起前年买了份 WinRAR 装在公司电脑上还是挺心疼的，如果公司买 500 台 PC 的批量授权，每份只要 $6 (好吧，虽然 WinRAR 是目前最好用的压缩软件，但毕竟只是个压缩软件，500 台 $3000 的价格也不算便宜了)。

PS, 发完才发现第二张图片是 WinZip 的，WinZip 卖 $29.95 比 WinRAR 还过分。</description>
      <content:encoded>今天看到 imgur 上有个页面 &lt;a href=&quot;http://imgur.com/gallery/kUCSRnf&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;WinRAR isn&amp;#039;t THAT expensive...&lt;/a&gt; 挺有意思的，&lt;br /&gt;&lt;br /&gt;原图:&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_winrar_price_01&quot; /&gt;&lt;br /&gt;&lt;br /&gt;回复: Yes, Yes you are.&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_winrar_price_02&quot; /&gt;&lt;br /&gt;&lt;br /&gt;原来老外也觉得 WinRAR $29 的售价太高了，尤其是它的 license 还是按电脑算的，而不是按用户算的。上个月买 PowerDirector 15 Ultimate 附送 AudioDirector 才 $56, 这还是比 WinRAR 市场小的多得多的软件。&lt;br /&gt;&lt;br /&gt;想起前年买了份 WinRAR 装在公司电脑上还是挺心疼的，如果公司买 500 台 PC 的批量授权，每份只要 $6 (好吧，虽然 WinRAR 是目前最好用的压缩软件，但毕竟只是个压缩软件，500 台 $3000 的价格也不算便宜了)。&lt;br /&gt;&lt;br /&gt;PS, 发完才发现第二张图片是 WinZip 的，WinZip 卖 $29.95 比 WinRAR 还过分。&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e36ae106/i-see-that-the-foreigners-also-think-winrar-is-too-expensive?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>找到了 TESTV 的祖传 BGM</title>
      <link>https://blog.wudilabs.com/entry/836a40d6/found-the-ancestral-bgm-of-testv</link>
      <comments>https://blog.wudilabs.com/entry/836a40d6/found-the-ancestral-bgm-of-testv#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/836a40d6/found-the-ancestral-bgm-of-testv?lang=zh-CN</guid>
      <pubDate>Sat, 07 Jan 2017 10:01:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>音频处理</category>
      <description>前段时间买运动相机时看了一些评测，在搜索 GoPro 时就找到了 TESTV 的这两期节目：
BB Time第四十五期： 颤抖吧！凡人，你们对GoPro的力量一无所知——GoPro Hero 5开箱体验
《值不值得买》第104期：双11虐狗？连“狗”都凑成对——GoPro Hero5

其实 TESTV 的节目之前看过一期，就是《值不值得买》第三十六期：来自喜马拉雅的听书宝这期，当时应该是从首页点进去的，但看完没有订阅。

在看完 GoPro 的评测视频后，又看了不少之前投稿的视频。每期都有的旁白背景音乐在 B 站弹幕中被称为“祖传 BGM”，但是各种搜索居然没找到这个 BGM 是什么，最后决定自己来找。

先是试着用 Shazam 来识别，因为节目中旁白的话太多，没有持续时间较长的纯 BGM, 所以没识别成功。即使是话比较少的第一期节目都是这样。但是后来试了一下，发现对第一期节目使用普通的去除音乐人声的声道重混缩就能把旁白的人声去除的差不多，再用 Shazam 识别就能找到了。

TESTV 的“祖传 BGM”是 Hip Hop Groove (No Horns)，有版权，获取和使用需要付费，具体地址为 https://www.pond5.com/stock-music/1038258/hip-hop-groove-no-horns.html

此外，我今天还在网易云音乐上创建了一个名为 TESTV 歌单 - 个人筛选 的歌单，都是我自己从 TESTV 的官方歌单中筛选出来的认为比较好听或者做视频可能用的到的音乐。</description>
      <content:encoded>前段时间买运动相机时看了一些评测，在搜索 GoPro 时就找到了 TESTV 的这两期节目：&lt;br /&gt;&lt;a href=&quot;http://www.bilibili.com/video/av6857386/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;BB Time第四十五期： 颤抖吧！凡人，你们对GoPro的力量一无所知——GoPro Hero 5开箱体验&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.bilibili.com/video/av7035167/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;《值不值得买》第104期：双11虐狗？连“狗”都凑成对——GoPro Hero5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;其实 TESTV 的节目之前看过一期，就是&lt;a href=&quot;http://www.bilibili.com/video/av3284495/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;《值不值得买》第三十六期：来自喜马拉雅的听书宝&lt;/a&gt;这期，当时应该是从首页点进去的，但看完没有订阅。&lt;br /&gt;&lt;br /&gt;在看完 GoPro 的评测视频后，又看了不少之前投稿的视频。每期都有的旁白背景音乐在 B 站弹幕中被称为“祖传 BGM”，但是各种搜索居然没找到这个 BGM 是什么，最后决定自己来找。&lt;br /&gt;&lt;br /&gt;先是试着用 Shazam 来识别，因为节目中旁白的话太多，没有持续时间较长的纯 BGM, 所以没识别成功。即使是话比较少的第一期节目都是这样。但是后来试了一下，发现对第一期节目使用普通的去除音乐人声的声道重混缩就能把旁白的人声去除的差不多，再用 Shazam 识别就能找到了。&lt;br /&gt;&lt;br /&gt;TESTV 的“祖传 BGM”是 Hip Hop Groove (No Horns)，有版权，获取和使用需要付费，具体地址为 &lt;a href=&quot;https://www.pond5.com/stock-music/1038258/hip-hop-groove-no-horns.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://www.pond5.com/stock-music/1038258/hip-hop-groove-no-horns.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;此外，我今天还在网易云音乐上创建了一个名为 &lt;a href=&quot;http://music.163.com/#/playlist?id=561796093&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;TESTV 歌单 - 个人筛选&lt;/a&gt; 的歌单，都是我自己从 TESTV 的官方歌单中筛选出来的认为比较好听或者做视频可能用的到的音乐。&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/836a40d6/found-the-ancestral-bgm-of-testv?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>小蚁 4k 运动相机</title>
      <link>https://blog.wudilabs.com/entry/a38a5086/yi-4k-action-camera</link>
      <comments>https://blog.wudilabs.com/entry/a38a5086/yi-4k-action-camera#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a38a5086/yi-4k-action-camera?lang=zh-CN</guid>
      <pubDate>Fri, 06 Jan 2017 18:51:25 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>电子产品</category>
      <description>元旦时入手了小蚁的 Yi 4k 运动相机。买之前也是看了些评测，总的来说国外对这个运动相机的评价是相当好的 (比如 Linus Tech Tips 这个评测 和 AuthenTech 这个评测)。但不知为什么，是国内像什么值得买这样的网站上，负面评价非常多。我这些天用了几次觉得还是很不错的，没有那些负面评价说的那么糟糕。

小蚁 4k 的设置中有一堆分辨率、帧率和是否开启自动低光、电子防抖、畸变修正的选项可以配置，我都试了试。Ultra 分辨率都不能开启电子防抖和畸变修正，应该是用到了传感器的最大宽度，拍出来的视频两侧畸变相当严重，除了需要特别广视角的情况，一般还是不用为好。各种设置试下来，觉得平时拍视频 2.7k 60fps (开启自动低光、电子防抖，不开启畸变修正) 最为实用。如果不需要防抖且光线较为充足的话，可以用 4k 30fps 获得更高的分辨率。

各种分辨率和帧率下，自动低光、电子防抖和畸变修正都是否可以开启，可以看我总结出来的这个表格。红色字体标注的是我认为比较实用的配置。


  
    分辨率
    帧率
    自动低光
    电子防抖
    畸变修正
  
  
    4K (3840x2160)
    30fps
    不支持
    不支持
    不支持
  
  
    4K Ultra (3840x2160)
    24fps
    不支持
    不支持
    不支持
  
  
    2.7K (2704x1520)
    30fps
    不支持
    支持
    支持
  
  
    60fps
    支持
    支持
  
  
    2.7K Ultra (2704x1520)
    30fps
    不支持
    支持
    不支持
  
  
    2.7K 4:3 (2704x2032)
    30fps
    不支持
    支持
    支持
  
  
    1440 (1920x1440)
    30fps
    不支持
    支持
    支持
  
  
    60fps
    支持
    支持
  
  
    1080 (1920x1080)
    30fps
    不支持
    支持
    支持
  
  
    60fps
    支持
    支持
  
  
    120fps
    支持
    不支持
  
  
    1080 Ultra (1920x1080)
    30fps
    不支持
    不支持
    不支持
  
  
    60fps
    支持
    不支持
  
  
    90fps
    支持
    不支持
  
  
    960 (1280x960)
    60fps
    支持
    支持
    支持
  
  
    120fps
    支持
    不支持
  
  
    720 (1280x720)
    240fps
    不支持
    不支持
    支持
  
  
    720 Ultra (1280x720)
    60fps
    支持
    不支持
    不支持
  
  
    120fps
    支持
    不支持
  
  
    480 (848x480)
    240fps
    不支持
    不支持
    支持
  
</description>
      <content:encoded>元旦时入手了小蚁的 Yi 4k 运动相机。买之前也是看了些评测，总的来说国外对这个运动相机的评价是相当好的 (比如 &lt;a href=&quot;https://www.youtube.com/watch?v=28k7uBDojb8&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Linus Tech Tips 这个评测&lt;/a&gt; 和 &lt;a href=&quot;https://www.youtube.com/watch?v=uXa49dOj_oY&amp;amp;t=11s&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;AuthenTech 这个评测&lt;/a&gt;)。但不知为什么，是国内像什么值得买这样的网站上，负面评价非常多。我这些天用了几次觉得还是很不错的，没有那些负面评价说的那么糟糕。&lt;br /&gt;&lt;br /&gt;小蚁 4k 的设置中有一堆分辨率、帧率和是否开启自动低光、电子防抖、畸变修正的选项可以配置，我都试了试。Ultra 分辨率都不能开启电子防抖和畸变修正，应该是用到了传感器的最大宽度，拍出来的视频两侧畸变相当严重，除了需要特别广视角的情况，一般还是不用为好。各种设置试下来，觉得平时拍视频 2.7k 60fps (开启自动低光、电子防抖，不开启畸变修正) 最为实用。如果不需要防抖且光线较为充足的话，可以用 4k 30fps 获得更高的分辨率。&lt;br /&gt;&lt;br /&gt;各种分辨率和帧率下，自动低光、电子防抖和畸变修正都是否可以开启，可以看我总结出来的这个表格。红色字体标注的是我认为比较实用的配置。&lt;br /&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;1&quot; cellpadding=&quot;5&quot; style=&quot;background-color: #999999; width: 95%;&quot;&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;width: 35%; background-color: #e0e0e0;&quot;&gt;分辨率&lt;/td&gt;
    &lt;td style=&quot;width: 20%; background-color: #e0e0e0; text-align: center;&quot;&gt;帧率&lt;/td&gt;
    &lt;td style=&quot;width: 15%; background-color: #e0e0e0; text-align: center;&quot;&gt;自动低光&lt;/td&gt;
    &lt;td style=&quot;width: 15%; background-color: #e0e0e0; text-align: center;&quot;&gt;电子防抖&lt;/td&gt;
    &lt;td style=&quot;width: 15%; background-color: #e0e0e0; text-align: center;&quot;&gt;畸变修正&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;4K (3840x2160)&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;30fps&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;4K Ultra (3840x2160)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;24fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;vertical-align: top;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;2.7K (2704x1520)&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;30fps&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;60fps&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;2.7K Ultra (2704x1520)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;30fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;2.7K 4:3 (2704x2032)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;30fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;vertical-align: top;&quot;&gt;1440 (1920x1440)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;30fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;60fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;3&quot; style=&quot;vertical-align: top;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;1080 (1920x1080)&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;30fps&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td rowspan=&quot;3&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;60fps&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;120fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;3&quot; style=&quot;vertical-align: top;&quot;&gt;1080 Ultra (1920x1080)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;30fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td rowspan=&quot;3&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;60fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;90fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;vertical-align: top;&quot;&gt;960 (1280x960)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;60fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;120fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;720 (1280x720)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;240fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;vertical-align: top;&quot;&gt;720 Ultra (1280x720)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;60fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td rowspan=&quot;2&quot; style=&quot;text-align: center; vertical-align: top;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;120fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr style=&quot;background-color: #ffffff;&quot;&gt;
    &lt;td&gt;480 (848x480)&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;240fps&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;不支持&lt;/td&gt;
    &lt;td style=&quot;text-align: center;&quot;&gt;支持&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a38a5086/yi-4k-action-camera?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/a38a5086/yi-4k-action-camera?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>.NET 下的 JavaScript 引擎 - ClearScript</title>
      <link>https://blog.wudilabs.com/entry/d3e9b292/clearscript</link>
      <comments>https://blog.wudilabs.com/entry/d3e9b292/clearscript#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d3e9b292/clearscript?lang=zh-CN</guid>
      <pubDate>Mon, 03 Oct 2016 13:35:20 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>C# &amp; .NET</category>
      <category>JavaScript</category>
      <description>今天找了一圈 .NET 下的 JavaScript 引擎，包括 jint, Javascript.Net, ClearScript 等。最后感觉还是 ClearScript 比较靠谱。

这篇 Which .NET JavaScript Engine is the fastest? 对一些 JS 引擎做了速度测试，结果中 JavaScript.Net 是最快的，但看了眼它的 github 页面，已经一年多没更新了。而第二快的 ClearScript 还是微软自家的，就是它了。</description>
      <content:encoded>今天找了一圈 .NET 下的 JavaScript 引擎，包括 jint, Javascript.Net, ClearScript 等。最后感觉还是 &lt;a href=&quot;http://clearscript.codeplex.com/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;ClearScript&lt;/a&gt; 比较靠谱。&lt;br /&gt;&lt;br /&gt;这篇 &lt;a href=&quot;https://rushfrisby.com/which-net-javascript-engine-is-the-fastest/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Which .NET JavaScript Engine is the fastest?&lt;/a&gt; 对一些 JS 引擎做了速度测试，结果中 JavaScript.Net 是最快的，但看了眼它的 &lt;a href=&quot;https://github.com/JavascriptNet/Javascript.Net&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;github 页面&lt;/a&gt;，已经一年多没更新了。而第二快的 ClearScript 还是微软自家的，就是它了。&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d3e9b292/clearscript?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>永久禁用 Windows 8.1 的驱动签名强制检查</title>
      <link>https://blog.wudilabs.com/entry/b3095290/permanently-disable-driver-signature-enforcement-in-windows-8-1</link>
      <comments>https://blog.wudilabs.com/entry/b3095290/permanently-disable-driver-signature-enforcement-in-windows-8-1#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b3095290/permanently-disable-driver-signature-enforcement-in-windows-8-1?lang=zh-CN</guid>
      <pubDate>Fri, 30 Sep 2016 18:30:50 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>计算机软件</category>
      <description>对于某些没有签名的驱动程序，必须要禁用掉系统的强制签名检查才能正常使用。Windows 8.1 中，这个禁用操作需要重启，而且之后再重新开机或者正常重启之后，强制签名检查又变成默认启用了，也就是说这个设置不是永久生效的。

那么对于使用这样驱动程序的设备来说，每次用前就都得折腾重启一遍系统，久而久之就懒得用了。昨天晚上用飞傲 X3 II 的 USB DAC 功能试听新耳机，就又折腾了一遍，折腾完之后想去看看官方有没有更新驱动解决这个问题，结果在论坛看到X3 II 固件的最新版本已经到 2.0 了，，而且还有一个“飞傲新版驱动及教程”，貌似新版的驱动在 Win8/Win8.1/Win10 下不需要禁用强制签名就能使用了。但是通过回复和这个帖子，又发现从 1.6 版本开始 USB OTG 支持就被去掉了，所以还是得解决驱动签名检查的问题。

经过搜索，看到 Permanently disable driver signature enforcement on Win 8.1 x64 这个帖子中有人提到了 Driver Signature Enforcement Overrider 这个程序 (也可以从 Softpedia 下载)。

image_dseo_screenshot

虽然 Supported OS 只写到了 Windows 7 64-bit, 但是经过测试 Win 8.1 中也可以使用。按照程序自带的说明操作即可：

So how do I use it?
First and foremost; you are using this software at your own risk, we do not
take responsibility for any damages to your system, but we do not believe it
can harm anyone anyway. Secondly, User Account Control (UAC) must be
disabled in-order to use this tool as well.

1. Go ahead download and launch the application from the link below. Inside
its main menu, press on the &quot;Enable Test Mode&quot; button and follow the
instructions on the screen. This will enable TESTSIGNING mode, which
allows unverified system files to be loaded.

2. Now all you have to do is to add the unverified signature to the required
system files. To do so press on the &quot;Sign a System File&quot; button from the main
menu, and enter specific filename including full path. For example: if
ATITool64.sys from C:\Windows\System32\drivers refuses to load due to
driver signature enforcement, you should type: &quot;C:\Windows
\System32\drivers\ATITool64.sys&quot;, and if you would like to sign more than a
single file, just repeat this procedure until you’re done, and finally reboot.

After you enabled Test Mode and added signatures to the required system
files, they should bypass Windows’s driver signature enforcement and load
without any issues. However, if for some reason you are interested to revert
it, you can re-launch the application, choose &quot;Disable Test Mode&quot; from the
main menu, and reboot. If you encounter issues or having questions, feel free
to post it on our forums.</description>
      <content:encoded>对于某些没有签名的驱动程序，必须要禁用掉系统的强制签名检查才能正常使用。Windows 8.1 中，这个禁用操作需要重启，而且之后再重新开机或者正常重启之后，强制签名检查又变成默认启用了，也就是说这个设置不是永久生效的。&lt;br /&gt;&lt;br /&gt;那么对于使用这样驱动程序的设备来说，每次用前就都得折腾重启一遍系统，久而久之就懒得用了。昨天晚上用飞傲 X3 II 的 USB DAC 功能试听新耳机，就又折腾了一遍，折腾完之后想去看看官方有没有更新驱动解决这个问题，结果在论坛看到&lt;a href=&quot;http://www.fiio.pw/forum.php?mod=viewthread&amp;amp;tid=72509&amp;amp;extra=page%3D2&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;X3 II 固件的最新版本已经到 2.0 了&lt;/a&gt;，，而且还有一个“飞傲新版驱动及教程”，貌似新版的驱动在 Win8/Win8.1/Win10 下不需要禁用强制签名就能使用了。但是通过回复和&lt;a href=&quot;http://www.fiio.pw/forum.php?mod=viewthread&amp;amp;tid=72506&amp;amp;highlight=OTG&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;这个帖子&lt;/a&gt;，又发现从 1.6 版本开始 USB OTG 支持就被去掉了，所以还是得解决驱动签名检查的问题。&lt;br /&gt;&lt;br /&gt;经过搜索，看到 &lt;a href=&quot;https://social.technet.microsoft.com/Forums/windows/en-US/8ee77513-95ce-4f26-aa2e-e15615422a74/permanently-disable-driver-signature-enforcement-on-win-81-x64?forum=w8itprohardware&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Permanently disable driver signature enforcement on Win 8.1 x64&lt;/a&gt; 这个帖子中有人提到了 &lt;a href=&quot;http://www.ngohq.com/home.php?page=dseo&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Driver Signature Enforcement Overrider&lt;/a&gt; 这个程序 (也可以&lt;a href=&quot;http://www.softpedia.com/get/Tweak/Video-Tweak/Driver-Signature-Enforcement-Overrider.shtml&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;从 Softpedia 下载&lt;/a&gt;)。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_dseo_screenshot&quot; /&gt;&lt;br /&gt;&lt;br /&gt;虽然 Supported OS 只写到了 Windows 7 64-bit, 但是经过测试 Win 8.1 中也可以使用。按照程序自带的说明操作即可：&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;So&amp;nbsp;how&amp;nbsp;do&amp;nbsp;I&amp;nbsp;use&amp;nbsp;it?&lt;br /&gt;
First&amp;nbsp;and&amp;nbsp;foremost;&amp;nbsp;you&amp;nbsp;are&amp;nbsp;using&amp;nbsp;this&amp;nbsp;software&amp;nbsp;at&amp;nbsp;your&amp;nbsp;own&amp;nbsp;risk,&amp;nbsp;we&amp;nbsp;do&amp;nbsp;not&lt;br /&gt;
take&amp;nbsp;responsibility&amp;nbsp;for&amp;nbsp;any&amp;nbsp;damages&amp;nbsp;to&amp;nbsp;your&amp;nbsp;system,&amp;nbsp;but&amp;nbsp;we&amp;nbsp;do&amp;nbsp;not&amp;nbsp;believe&amp;nbsp;it&lt;br /&gt;
can&amp;nbsp;harm&amp;nbsp;anyone&amp;nbsp;anyway.&amp;nbsp;Secondly,&amp;nbsp;User&amp;nbsp;Account&amp;nbsp;Control&amp;nbsp;(UAC)&amp;nbsp;must&amp;nbsp;be&lt;br /&gt;
disabled&amp;nbsp;in-order&amp;nbsp;to&amp;nbsp;use&amp;nbsp;this&amp;nbsp;tool&amp;nbsp;as&amp;nbsp;well.&lt;br /&gt;
&lt;br /&gt;
1.&amp;nbsp;Go&amp;nbsp;ahead&amp;nbsp;download&amp;nbsp;and&amp;nbsp;launch&amp;nbsp;the&amp;nbsp;application&amp;nbsp;from&amp;nbsp;the&amp;nbsp;link&amp;nbsp;below.&amp;nbsp;Inside&lt;br /&gt;
its&amp;nbsp;main&amp;nbsp;menu,&amp;nbsp;press&amp;nbsp;on&amp;nbsp;the&amp;nbsp;&amp;quot;Enable&amp;nbsp;Test&amp;nbsp;Mode&amp;quot;&amp;nbsp;button&amp;nbsp;and&amp;nbsp;follow&amp;nbsp;the&lt;br /&gt;
instructions&amp;nbsp;on&amp;nbsp;the&amp;nbsp;screen.&amp;nbsp;This&amp;nbsp;will&amp;nbsp;enable&amp;nbsp;TESTSIGNING&amp;nbsp;mode,&amp;nbsp;which&lt;br /&gt;
allows&amp;nbsp;unverified&amp;nbsp;system&amp;nbsp;files&amp;nbsp;to&amp;nbsp;be&amp;nbsp;loaded.&lt;br /&gt;
&lt;br /&gt;
2.&amp;nbsp;Now&amp;nbsp;all&amp;nbsp;you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;do&amp;nbsp;is&amp;nbsp;to&amp;nbsp;add&amp;nbsp;the&amp;nbsp;unverified&amp;nbsp;signature&amp;nbsp;to&amp;nbsp;the&amp;nbsp;required&lt;br /&gt;
system&amp;nbsp;files.&amp;nbsp;To&amp;nbsp;do&amp;nbsp;so&amp;nbsp;press&amp;nbsp;on&amp;nbsp;the&amp;nbsp;&amp;quot;Sign&amp;nbsp;a&amp;nbsp;System&amp;nbsp;File&amp;quot;&amp;nbsp;button&amp;nbsp;from&amp;nbsp;the&amp;nbsp;main&lt;br /&gt;
menu,&amp;nbsp;and&amp;nbsp;enter&amp;nbsp;specific&amp;nbsp;filename&amp;nbsp;including&amp;nbsp;full&amp;nbsp;path.&amp;nbsp;For&amp;nbsp;example:&amp;nbsp;if&lt;br /&gt;
ATITool64.sys&amp;nbsp;from&amp;nbsp;C:\Windows\System32\drivers&amp;nbsp;refuses&amp;nbsp;to&amp;nbsp;load&amp;nbsp;due&amp;nbsp;to&lt;br /&gt;
driver&amp;nbsp;signature&amp;nbsp;enforcement,&amp;nbsp;you&amp;nbsp;should&amp;nbsp;type:&amp;nbsp;&amp;quot;C:\Windows&lt;br /&gt;
\System32\drivers\ATITool64.sys&amp;quot;,&amp;nbsp;and&amp;nbsp;if&amp;nbsp;you&amp;nbsp;would&amp;nbsp;like&amp;nbsp;to&amp;nbsp;sign&amp;nbsp;more&amp;nbsp;than&amp;nbsp;a&lt;br /&gt;
single&amp;nbsp;file,&amp;nbsp;just&amp;nbsp;repeat&amp;nbsp;this&amp;nbsp;procedure&amp;nbsp;until&amp;nbsp;you’re&amp;nbsp;done,&amp;nbsp;and&amp;nbsp;finally&amp;nbsp;reboot.&lt;br /&gt;
&lt;br /&gt;
After&amp;nbsp;you&amp;nbsp;enabled&amp;nbsp;Test&amp;nbsp;Mode&amp;nbsp;and&amp;nbsp;added&amp;nbsp;signatures&amp;nbsp;to&amp;nbsp;the&amp;nbsp;required&amp;nbsp;system&lt;br /&gt;
files,&amp;nbsp;they&amp;nbsp;should&amp;nbsp;bypass&amp;nbsp;Windows’s&amp;nbsp;driver&amp;nbsp;signature&amp;nbsp;enforcement&amp;nbsp;and&amp;nbsp;load&lt;br /&gt;
without&amp;nbsp;any&amp;nbsp;issues.&amp;nbsp;However,&amp;nbsp;if&amp;nbsp;for&amp;nbsp;some&amp;nbsp;reason&amp;nbsp;you&amp;nbsp;are&amp;nbsp;interested&amp;nbsp;to&amp;nbsp;revert&lt;br /&gt;
it,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;re-launch&amp;nbsp;the&amp;nbsp;application,&amp;nbsp;choose&amp;nbsp;&amp;quot;Disable&amp;nbsp;Test&amp;nbsp;Mode&amp;quot;&amp;nbsp;from&amp;nbsp;the&lt;br /&gt;
main&amp;nbsp;menu,&amp;nbsp;and&amp;nbsp;reboot.&amp;nbsp;If&amp;nbsp;you&amp;nbsp;encounter&amp;nbsp;issues&amp;nbsp;or&amp;nbsp;having&amp;nbsp;questions,&amp;nbsp;feel&amp;nbsp;free&lt;br /&gt;
to&amp;nbsp;post&amp;nbsp;it&amp;nbsp;on&amp;nbsp;our&amp;nbsp;forums.&lt;/div&gt;&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3095290/permanently-disable-driver-signature-enforcement-in-windows-8-1?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/b3095290/permanently-disable-driver-signature-enforcement-in-windows-8-1?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>物理禁用中兴小兴看看 mini 网络摄像头的麦克风和喇叭</title>
      <link>https://blog.wudilabs.com/entry/932900ee/physically-disabled-the-microphone-and-speaker-of-a-zte-mini-webcam</link>
      <comments>https://blog.wudilabs.com/entry/932900ee/physically-disabled-the-microphone-and-speaker-of-a-zte-mini-webcam#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/932900ee/physically-disabled-the-microphone-and-speaker-of-a-zte-mini-webcam?lang=zh-CN</guid>
      <pubDate>Thu, 15 Sep 2016 08:05:01 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>电子产品</category>
      <category>改造</category>
      <description>这篇文章有点水，主要是想说一下这个摄像头非常容易拆。

1. 撬开外壳的接缝处:
image_zte_web_monitor_camera_01_thumb

2. 拧下固定电路板的 3 颗螺丝，然后撬下电路板:
image_zte_web_monitor_camera_02_thumb

3. 拔下扬声器的插头:
image_zte_web_monitor_camera_03_thumb

4. 用胶布缠上扬声器插头防止意外的短路，堵上麦克风的拾音口:
image_zte_web_monitor_camera_04_thumb

5. 装回外壳时发现堵麦克风的胶布太大了，改成合适的尺寸:
image_zte_web_monitor_camera_05_thumb

6. 通过前面拆解能看出，其实如果只是想物理禁用麦克风的话，直接堵上外壳的拾音孔应该也行，为了保险我又粘了块胶布:
image_zte_web_monitor_camera_06_thumb
</description>
      <content:encoded>这篇文章有点水，主要是想说一下这个摄像头非常容易拆。&lt;br /&gt;&lt;br /&gt;1. 撬开外壳的接缝处:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. 拧下固定电路板的 3 颗螺丝，然后撬下电路板:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. 拔下扬声器的插头:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. 用胶布缠上扬声器插头防止意外的短路，堵上麦克风的拾音口:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_04&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_04_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. 装回外壳时发现堵麦克风的胶布太大了，改成合适的尺寸:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_05&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_05_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. 通过前面拆解能看出，其实如果只是想物理禁用麦克风的话，直接堵上外壳的拾音孔应该也行，为了保险我又粘了块胶布:&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_06&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_zte_web_monitor_camera_06_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/932900ee/physically-disabled-the-microphone-and-speaker-of-a-zte-mini-webcam?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>FileSystemFinder: 一个可以使用通配符和正则表达式逐层获取文件和目录列表的 PHP 类库</title>
      <link>https://blog.wudilabs.com/entry/d3d8d1a0/filesystemfinder-a-php-library-that-make-file-and-directory-listing-easier</link>
      <comments>https://blog.wudilabs.com/entry/d3d8d1a0/filesystemfinder-a-php-library-that-make-file-and-directory-listing-easier#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/d3d8d1a0/filesystemfinder-a-php-library-that-make-file-and-directory-listing-easier?lang=zh-CN</guid>
      <pubDate>Sun, 17 Jan 2016 06:35:52 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>PHP</category>
      <description>其实这个 PHP 类库也是去年十一期间写的第一个版本，但那时还没现在这么完整。今天整理代码，并写了示例程序后就推送到 github 上去了，在：

https://github.com/wudicgi/file-system-finder

示例程序如下:
&lt;?php
include_once &#039;FileSystemFinder.php&#039;;

// List files using static method FileSystemFinder::find()

$filelist = FileSystemFinder::find(&#039;C:/php/ext/php_pdo_*.dll&#039;);

print_r($filelist);                 // via __debugInfo()
echo &quot;\r\n&quot;;


// List files using file() method with a wildcard pattern

$filelist = (new FileSystemFinder(&#039;C:/php/ext&#039;))
    -&gt;file(&#039;php_pdo_*.dll&#039;);

print_r($filelist-&gt;toArray());      // using toArray()
echo &quot;\r\n&quot;;


// List files using dir() and file() method with wildcard and regex patterns

$filelist = (new FileSystemFinder(&#039;C:/php&#039;))
    -&gt;dir(&#039;dev|ext&#039;)                                    // using default wildcard matcher
    -&gt;file(&#039;/[0-9]/&#039;, FileSystemFinder::REGEX_MATCHER); // using the specified regex matcher

foreach ($filelist as $path) {      // via SeekableIterator interface
    echo &quot;$path\r\n&quot;;
}
echo &quot;\r\n&quot;;


// A combination of using both static and non-static method

$filelist = FileSystemFinder::find(&#039;C:/php/dev|ext&#039;, FileSystemFinder::DIR_ONLY);
print_r($filelist);

$filelist = $filelist-&gt;file(&#039;/[0-9]/&#039;, FileSystemFinder::REGEX_MATCHER);
print_r($filelist);

echo &quot;\r\n&quot;;


// List files using wfio extension

if (extension_loaded(&#039;wfio&#039;)) {
    $filelist = FileSystemFinder::find(&#039;wfio://E:/Music/* 笑话/* 欢乐剧场/??? *大*.wma&#039;);

    for ($i = 0; $i &lt; count($filelist); $i++) {     // via Countable interface
        echo &quot;[$i] =&gt; $filelist[$i]\r\n&quot;;           // via ArrayAccess interface
    }
} else {
    echo &quot;The wfio extension is not loaded.\r\n&quot;;
}

?&gt;

上述代码的输出为:
FileSystemFinder Object
(
    [0] =&gt; C:/php/ext/php_pdo_firebird.dll
    [1] =&gt; C:/php/ext/php_pdo_mysql.dll
    [2] =&gt; C:/php/ext/php_pdo_oci.dll
    [3] =&gt; C:/php/ext/php_pdo_odbc.dll
    [4] =&gt; C:/php/ext/php_pdo_pgsql.dll
    [5] =&gt; C:/php/ext/php_pdo_sqlite.dll
)

Array
(
    [0] =&gt; C:/php/ext/php_pdo_firebird.dll
    [1] =&gt; C:/php/ext/php_pdo_mysql.dll
    [2] =&gt; C:/php/ext/php_pdo_oci.dll
    [3] =&gt; C:/php/ext/php_pdo_odbc.dll
    [4] =&gt; C:/php/ext/php_pdo_pgsql.dll
    [5] =&gt; C:/php/ext/php_pdo_sqlite.dll
)

C:/php/dev/php5ts.lib
C:/php/ext/php_bz2.dll
C:/php/ext/php_gd2.dll
C:/php/ext/php_oci8_12c.dll
C:/php/ext/php_sqlite3.dll

FileSystemFinder Object
(
    [0] =&gt; C:/php/dev
    [1] =&gt; C:/php/ext
)
FileSystemFinder Object
(
    [0] =&gt; C:/php/dev/php5ts.lib
    [1] =&gt; C:/php/ext/php_bz2.dll
    [2] =&gt; C:/php/ext/php_gd2.dll
    [3] =&gt; C:/php/ext/php_oci8_12c.dll
    [4] =&gt; C:/php/ext/php_sqlite3.dll
)

[0] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/036 武大日记.wma
[1] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/087 大学趣闻.wma
[2] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/109 武大郎后传.wma
[3] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/117 孙大圣“评职”申请书.wma
[4] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/120 肖大明白.wma
[5] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/156 吃大户.wma
[6] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/160 说大道小.wma
[7] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/168 四大…….wma
[8] =&gt; wfio://E:/Music/04 笑话/01 欢乐剧场/197 过大年.wma
</description>
      <content:encoded>其实这个 PHP 类库也是去年十一期间写的第一个版本，但那时还没现在这么完整。今天整理代码，并写了示例程序后就推送到 github 上去了，在：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/wudicgi/file-system-finder&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/file-system-finder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;示例程序如下:&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;include_once&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;FileSystemFinder.php&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;List&amp;nbsp;files&amp;nbsp;using&amp;nbsp;static&amp;nbsp;method&amp;nbsp;FileSystemFinder::find()&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;C:/php/ext/php_pdo_*.dll&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;print_r&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;via&amp;nbsp;__debugInfo()&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;List&amp;nbsp;files&amp;nbsp;using&amp;nbsp;file()&amp;nbsp;method&amp;nbsp;with&amp;nbsp;a&amp;nbsp;wildcard&amp;nbsp;pattern&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;C:/php/ext&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;php_pdo_*.dll&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;print_r&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;toArray&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;using&amp;nbsp;toArray()&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;List&amp;nbsp;files&amp;nbsp;using&amp;nbsp;dir()&amp;nbsp;and&amp;nbsp;file()&amp;nbsp;method&amp;nbsp;with&amp;nbsp;wildcard&amp;nbsp;and&amp;nbsp;regex&amp;nbsp;patterns&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;C:/php&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;dir&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;dev|ext&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;using&amp;nbsp;default&amp;nbsp;wildcard&amp;nbsp;matcher&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;/[0-9]/&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;REGEX_MATCHER&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;using&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;regex&amp;nbsp;matcher&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$path&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;via&amp;nbsp;SeekableIterator&amp;nbsp;interface&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$path&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;A&amp;nbsp;combination&amp;nbsp;of&amp;nbsp;using&amp;nbsp;both&amp;nbsp;static&amp;nbsp;and&amp;nbsp;non-static&amp;nbsp;method&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;C:/php/dev|ext&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;DIR_ONLY&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;print_r&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;/[0-9]/&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;REGEX_MATCHER&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;print_r&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;List&amp;nbsp;files&amp;nbsp;using&amp;nbsp;wfio&amp;nbsp;extension&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;extension_loaded&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;wfio&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;FileSystemFinder&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;wfio://E:/Music/*&amp;nbsp;笑话/*&amp;nbsp;欢乐剧场/???&amp;nbsp;*大*.wma&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$i&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$i&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff0000;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$filelist&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$i&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;via&amp;nbsp;Countable&amp;nbsp;interface&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;[&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$i&lt;/span&gt;]&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$filelist&lt;/span&gt;[&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$i&lt;/span&gt;]&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;via&amp;nbsp;ArrayAccess&amp;nbsp;interface&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;The&amp;nbsp;wfio&amp;nbsp;extension&amp;nbsp;is&amp;nbsp;not&amp;nbsp;loaded.&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;上述代码的输出为:&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;FileSystemFinder&amp;nbsp;Object&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_firebird.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[1]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_mysql.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[2]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_oci.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_odbc.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[4]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_pgsql.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[5]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_sqlite.dll&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Array&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_firebird.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[1]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_mysql.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[2]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_oci.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_odbc.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[4]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_pgsql.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[5]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_pdo_sqlite.dll&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
C:/php/dev/php5ts.lib&lt;br /&gt;
C:/php/ext/php_bz2.dll&lt;br /&gt;
C:/php/ext/php_gd2.dll&lt;br /&gt;
C:/php/ext/php_oci8_12c.dll&lt;br /&gt;
C:/php/ext/php_sqlite3.dll&lt;br /&gt;
&lt;br /&gt;
FileSystemFinder&amp;nbsp;Object&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/dev&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[1]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext&lt;br /&gt;
)&lt;br /&gt;
FileSystemFinder&amp;nbsp;Object&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[0]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/dev/php5ts.lib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[1]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_bz2.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[2]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_gd2.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_oci8_12c.dll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[4]&amp;nbsp;=&amp;gt;&amp;nbsp;C:/php/ext/php_sqlite3.dll&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
[0]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/036&amp;nbsp;武大日记.wma&lt;br /&gt;
[1]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/087&amp;nbsp;大学趣闻.wma&lt;br /&gt;
[2]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/109&amp;nbsp;武大郎后传.wma&lt;br /&gt;
[3]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/117&amp;nbsp;孙大圣“评职”申请书.wma&lt;br /&gt;
[4]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/120&amp;nbsp;肖大明白.wma&lt;br /&gt;
[5]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/156&amp;nbsp;吃大户.wma&lt;br /&gt;
[6]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/160&amp;nbsp;说大道小.wma&lt;br /&gt;
[7]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/168&amp;nbsp;四大…….wma&lt;br /&gt;
[8]&amp;nbsp;=&amp;gt;&amp;nbsp;wfio://E:/Music/04&amp;nbsp;笑话/01&amp;nbsp;欢乐剧场/197&amp;nbsp;过大年.wma&lt;/div&gt;&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/d3d8d1a0/filesystemfinder-a-php-library-that-make-file-and-directory-listing-easier?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/d3d8d1a0/filesystemfinder-a-php-library-that-make-file-and-directory-listing-easier?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>配置出一个更好用的 Windows 8.1</title>
      <link>https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use</link>
      <comments>https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use?lang=zh-CN</guid>
      <pubDate>Sun, 03 Jan 2016 12:05:26 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>计算机软件</category>
      <description>以下配置过程是我在配置 Windows 8.1 64-bit 系统的过程中记录下来的，仅供参考。

1. UAC


  开始 -&amp;gt; 控制面板 -&amp;gt; 用户帐户 -&amp;gt; 改变用户帐户控制设置
  选择“从不通知”


2. DPI


  右键点击桌面 -&gt; 屏幕分辨率 -&gt; 放大或缩小文本和其他项目
  选择“中等 - 125%”
  选中“让我选择一个适合我的所有显示器的缩放级别”
  登出并重新登入
  右键点击桌面 -&amp;gt; 查看 -&amp;gt; 小图标


3. 动画效果


  开始 -&amp;gt; 控制面板 -&amp;gt; 系统 -&amp;gt; 高级系统设置
  高级 -&amp;gt; 性能 -&amp;gt; 设置... -&amp;gt; 视觉效果 -&amp;gt; 取消选中所有动画效果


4. Classic Shell


  安装 Classic Shell (不安装其中的 Classic IE9 和 Update) (下载)
  配置各项，或导入配置文件
  资源管理器 -&amp;gt; 隐藏 Classic Explorer Bar


5. 7+ Taskbar Tweak


  安装 7+ Taskbar Tweak (下载)
  配置各项


6. 任务栏和导航属性


  右键点击任务栏 -&amp;gt; 属性
  任务栏 -&amp;gt; 选中“自动隐藏任务栏”
  任务栏 -&amp;gt; 选中“使用小任务栏按钮”
  任务栏 -&amp;gt; 任务栏按钮: 从不合并
  跳转列表 -&amp;gt; 取消选中“在跳转列表中存储并显示最近打开的项目”


7. 安装硬件驱动程序

8. 默认字体


  使用 Windows 8 Font Changer (下载) 修改默认字体为 Tahoma
  重启
  调节 ClearType


9. 区域选项


  开始 -&amp;gt; 控制面板 -&amp;gt; 区域
  短日期: yyyy-M-d
  一周的第一天: 星期日


10. 键盘快捷方式下划线


  开始 -&amp;gt; 控制面板 -&amp;gt; 轻松访问中心 -&amp;gt; 使键盘更易于使用
  选中“给键盘快捷方式和访问键加下划线”
  选中“防止将窗口移动到屏幕边缘时自动排列窗口”


11. 自动播放


  开始 -&amp;gt; 控制面板 -&amp;gt; 自动播放
  取消选中“为所有媒体和设备使用自动播放”
  每个选择框保持默认的“选择默认值”



  运行 gpedit.msc
  用户配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; 自动播放策略 -&amp;gt; 关闭自动播放 -&amp;gt; 在所有驱动器上启用
  计算机配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; 自动播放策略 -&amp;gt; 关闭自动播放 -&amp;gt; 在所有驱动器上启用


12. 内置的 CD 刻录功能


  运行 gpedit.msc
  用户配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; Windows 资源管理器 -&amp;gt; 移除 CD 刻录功能 -&amp;gt; 启用


13. 临时文件目录 (可选)


  开始 -&amp;gt; 控制面板 -&amp;gt; 系统 -&amp;gt; 高级系统设置
  高级 -&amp;gt; 环境变量...
  设置 TEMP, TMP = F:\Temp
  清除原来的文件 (%USERPROFILE%\AppData\Local\Temp)


14. 文件夹内容识别


  运行 Restore_Default_Folder_Templates.bat (下载)
  运行 All_Folders_Use_General_Items_Folder_Template.bat (下载同上)


15. 隐藏库文件夹


  参照Windows 8.1: Hide Library Folders in My Computer, 隐藏音乐、下载等 6 个库文件夹


16. 设置文件夹默认视图

17. Zip 文件夹


  导入 Disable_ZIP_Compressed_Folders.reg


Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\CompressedFolder\CLSID]

[-HKEY_CLASSES_ROOT\SystemFileAssociations\.zip\CLSID]


  导入 Disable_CAB_Files.reg


Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\CABFolder\CLSID]

[-HKEY_CLASSES_ROOT\SystemFileAssociations\.cab\CLSID]

18. 压缩软件


  安装 WinRAR 或 7-zip


19. 系统配置


  配置声音 (设置为无声)
  配置 Windows 颜色
  配置 Quick Launch Bar


20. 安装输入法

21. 语言设置


  开始 -&amp;gt; 控制面板 -&amp;gt; 语言
  高级设置 -&amp;gt; 切换输入法 -&amp;gt; 让我为每个应用窗口选择不同的输入法
  改变语言栏热键 -&amp;gt; 切换输入语言: Ctrl + Shift
  按下列截图配置 (对中文版 Win 8.1, 默认输入法需要选择英语，而不是推荐值)：


image_win81_config_language_01_thumb

image_win81_config_language_02_thumb

image_win81_config_language_03_thumb

image_win81_config_language_04_thumb

22. AutoHotkey


  安装 AutoHotkey
  配置启动后加载如下脚本：


; Ctrl + Shift
^space::^shift

23. WinSAT 计划任务


  开始 -&amp;gt; 控制面板 -&amp;gt; 管理工具 -&amp;gt; 任务计划程序
  计划任务程序库 -&amp;gt; Microsoft -&amp;gt; Windows -&amp;gt; Maintenance
  右键点击 WinSAT，选择“禁用”


24. 设置电源选项
</description>
      <content:encoded>以下配置过程是我在配置 Windows 8.1 64-bit 系统的过程中记录下来的，仅供参考。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. UAC&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 用户帐户 -&amp;gt; 改变用户帐户控制设置&lt;/li&gt;
  &lt;li&gt;选择“从不通知”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;2. DPI&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击桌面 -&gt; 屏幕分辨率 -&gt; 放大或缩小文本和其他项目&lt;/li&gt;
  &lt;li&gt;选择“中等 - 125%”&lt;/li&gt;
  &lt;li&gt;选中“让我选择一个适合我的所有显示器的缩放级别”&lt;/li&gt;
  &lt;li&gt;登出并重新登入&lt;/li&gt;
  &lt;li&gt;右键点击桌面 -&amp;gt; 查看 -&amp;gt; 小图标&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;3. 动画效果&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 系统 -&amp;gt; 高级系统设置&lt;/li&gt;
  &lt;li&gt;高级 -&amp;gt; 性能 -&amp;gt; 设置... -&amp;gt; 视觉效果 -&amp;gt; 取消选中所有动画效果&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;4. Classic Shell&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;安装 Classic Shell (不安装其中的 Classic IE9 和 Update) (&lt;a href=&quot;http://www.classicshell.net/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;配置各项，或导入配置文件&lt;/li&gt;
  &lt;li&gt;资源管理器 -&amp;gt; 隐藏 Classic Explorer Bar&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;5. 7+ Taskbar Tweak&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;安装 7+ Taskbar Tweak (&lt;a href=&quot;http://rammichael.com/7-taskbar-tweaker&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;配置各项&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;6. 任务栏和导航属性&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;右键点击任务栏 -&amp;gt; 属性&lt;/li&gt;
  &lt;li&gt;任务栏 -&amp;gt; 选中“自动隐藏任务栏”&lt;/li&gt;
  &lt;li&gt;任务栏 -&amp;gt; 选中“使用小任务栏按钮”&lt;/li&gt;
  &lt;li&gt;任务栏 -&amp;gt; 任务栏按钮: 从不合并&lt;/li&gt;
  &lt;li&gt;跳转列表 -&amp;gt; 取消选中“在跳转列表中存储并显示最近打开的项目”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;7. 安装硬件驱动程序&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. 默认字体&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;使用 Windows 8 Font Changer (&lt;a href=&quot;http://www.ilovefreesoftware.com/09/windows8/change-the-default-font-in-windows-8-windows-8-font-changer.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;) 修改默认字体为 Tahoma&lt;/li&gt;
  &lt;li&gt;重启&lt;/li&gt;
  &lt;li&gt;调节 ClearType&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;9. 区域选项&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 区域&lt;/li&gt;
  &lt;li&gt;短日期: yyyy-M-d&lt;/li&gt;
  &lt;li&gt;一周的第一天: 星期日&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;10. 键盘快捷方式下划线&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 轻松访问中心 -&amp;gt; 使键盘更易于使用&lt;/li&gt;
  &lt;li&gt;选中“给键盘快捷方式和访问键加下划线”&lt;/li&gt;
  &lt;li&gt;选中“防止将窗口移动到屏幕边缘时自动排列窗口”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;11. 自动播放&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 自动播放&lt;/li&gt;
  &lt;li&gt;取消选中“为所有媒体和设备使用自动播放”&lt;/li&gt;
  &lt;li&gt;每个选择框保持默认的“选择默认值”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;运行 gpedit.msc&lt;/li&gt;
  &lt;li&gt;用户配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; 自动播放策略 -&amp;gt; 关闭自动播放 -&amp;gt; 在所有驱动器上启用&lt;/li&gt;
  &lt;li&gt;计算机配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; 自动播放策略 -&amp;gt; 关闭自动播放 -&amp;gt; 在所有驱动器上启用&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;12. 内置的 CD 刻录功能&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;运行 gpedit.msc&lt;/li&gt;
  &lt;li&gt;用户配置 -&amp;gt; 管理模板 -&amp;gt; Windows 组件 -&amp;gt; Windows 资源管理器 -&amp;gt; 移除 CD 刻录功能 -&amp;gt; 启用&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;13. 临时文件目录&lt;/b&gt; (可选)&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 系统 -&amp;gt; 高级系统设置&lt;/li&gt;
  &lt;li&gt;高级 -&amp;gt; 环境变量...&lt;/li&gt;
  &lt;li&gt;设置 TEMP, TMP = F:\Temp&lt;/li&gt;
  &lt;li&gt;清除原来的文件 (%USERPROFILE%\AppData\Local\Temp)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;14. 文件夹内容识别&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;运行 Restore_Default_Folder_Templates.bat (&lt;a href=&quot;http://www.sevenforums.com/tutorials/15699-folder-template-default.html&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;下载&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;运行 All_Folders_Use_General_Items_Folder_Template.bat (下载同上)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;15. 隐藏库文件夹&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;参照 &lt;a href=&quot;http://www.tech-recipes.com/rx/42957/windows-8-1-hide-librar-folders-in-my-computer/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;Windows 8.1: Hide Library Folders in My Computer&lt;/a&gt;, 隐藏音乐、下载等 6 个库文件夹&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;16. 设置文件夹默认视图&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;17. Zip 文件夹&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;导入 Disable_ZIP_Compressed_Folders.reg&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Windows&amp;nbsp;Registry&amp;nbsp;Editor&amp;nbsp;Version&amp;nbsp;5.00&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\CompressedFolder\CLSID]&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\SystemFileAssociations\.zip\CLSID]&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;导入 Disable_CAB_Files.reg&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;Windows&amp;nbsp;Registry&amp;nbsp;Editor&amp;nbsp;Version&amp;nbsp;5.00&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\CABFolder\CLSID]&lt;br /&gt;
&lt;br /&gt;
[-HKEY_CLASSES_ROOT\SystemFileAssociations\.cab\CLSID]&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;18. 压缩软件&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;安装 WinRAR 或 7-zip&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;19. 系统配置&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;配置声音 (设置为无声)&lt;/li&gt;
  &lt;li&gt;配置 Windows 颜色&lt;/li&gt;
  &lt;li&gt;配置 Quick Launch Bar&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;20. 安装输入法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;21. 语言设置&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 语言&lt;/li&gt;
  &lt;li&gt;高级设置 -&amp;gt; 切换输入法 -&amp;gt; 让我为每个应用窗口选择不同的输入法&lt;/li&gt;
  &lt;li&gt;改变语言栏热键 -&amp;gt; 切换输入语言: Ctrl + Shift&lt;/li&gt;
  &lt;li&gt;按下列截图配置 (对中文版 Win 8.1, 默认输入法需要选择英语，而不是推荐值)：&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_04&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win81_config_language_04_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;22. AutoHotkey&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;安装 AutoHotkey&lt;/li&gt;
  &lt;li&gt;配置启动后加载如下脚本：&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;border-left: 3px solid #005ebb; padding: 2px 0px 4px 3px; font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #ffffff;&quot;&gt;;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;Shift&lt;br /&gt;
^space::^shift&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;23. WinSAT 计划任务&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul style=&quot;padding-left: 1em; list-style-type: disc;&quot;&gt;
  &lt;li&gt;开始 -&amp;gt; 控制面板 -&amp;gt; 管理工具 -&amp;gt; 任务计划程序&lt;/li&gt;
  &lt;li&gt;计划任务程序库 -&amp;gt; Microsoft -&amp;gt; Windows -&amp;gt; Maintenance&lt;/li&gt;
  &lt;li&gt;右键点击 WinSAT，选择“禁用”&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;24. 设置电源选项&lt;/b&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/f3e89092/making-windows-8-1-better-to-use?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>今天才知道 SysWOW64 是什么意思</title>
      <link>https://blog.wudilabs.com/entry/e3e7c79c/today-i-know-what-syswow64-means</link>
      <comments>https://blog.wudilabs.com/entry/e3e7c79c/today-i-know-what-syswow64-means#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/e3e7c79c/today-i-know-what-syswow64-means?lang=zh-CN</guid>
      <pubDate>Tue, 29 Dec 2015 14:15:20 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <description>现在平时很少有机会手动往 System32 目录里复制 dll 文件了。今天把 VC++ 2010 Debug 版的运行时 dll 文件复制到 System32 和 SysWOW64 目录后，运行程序还是报错。用 Dependency Walker 查看，发现这个 32 位的程序加载的是 64 位版本的 dll。

在网上一番搜索才知道，原来在 64 位 Windows 中，System32 目录下存放的都是 64 位的东西，而 SysWOW64 下存放的才是 32 位的东西。为了保持兼容性，System32 的名称就没改，而 SysWOW64 其实也没体现出来 32-bit Windows on 64-bit Windows，所以这两个文件夹的名称现在看着很容易让人糊涂。

文章就是这篇《什么是SysWow64》，推荐阅读一下。
</description>
      <content:encoded>现在平时很少有机会手动往 System32 目录里复制 dll 文件了。今天把 VC++ 2010 Debug 版的运行时 dll 文件复制到 System32 和 SysWOW64 目录后，运行程序还是报错。用 Dependency Walker 查看，发现这个 32 位的程序加载的是 64 位版本的 dll。&lt;br /&gt;&lt;br /&gt;在网上一番搜索才知道，原来在 64 位 Windows 中，System32 目录下存放的都是 64 位的东西，而 SysWOW64 下存放的才是 32 位的东西。为了保持兼容性，System32 的名称就没改，而 SysWOW64 其实也没体现出来 &lt;b&gt;32-bit&lt;/b&gt; Windows on 64-bit Windows，所以这两个文件夹的名称现在看着很容易让人糊涂。&lt;br /&gt;&lt;br /&gt;文章就是这篇《&lt;a href=&quot;http://blogs.msdn.com/b/tianlin/archive/2011/10/26/syswow64.aspx&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;什么是SysWow64&lt;/a&gt;》，推荐阅读一下。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/e3e7c79c/today-i-know-what-syswow64-means?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>PHP 语法高亮增强版的 Notepad++</title>
      <link>https://blog.wudilabs.com/entry/9367b410/notepad-plus-plus-with-enhanced-php-syntax-highlighting</link>
      <comments>https://blog.wudilabs.com/entry/9367b410/notepad-plus-plus-with-enhanced-php-syntax-highlighting#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/9367b410/notepad-plus-plus-with-enhanced-php-syntax-highlighting?lang=zh-CN</guid>
      <pubDate>Sun, 01 Nov 2015 13:32:05 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>计算机软件</category>
      <category>C/C++</category>
      <category>改造</category>
      <description>十一期间寻找现用文本编辑器的替代品，看了一圈最后打算换用 Notepad++, 但是一开始用就发现它的语法高亮功能很弱，比如 PHP 语言的关键字和函数名都不能设置不同的高亮颜色。

经过一番搜索，得知 Notepad++ 所用的 Scintilla 编辑器组件对语法高亮的处理是 hard-coded 的，想增加一类关键词高亮类型得改 C++ 源代码。而且 PHP 的保留字和函数名一直混在一块，不能单独设颜色这个问题已经 9 年没解决了。

本来都打算放弃 Notepad++, 接着找商业软件去了。但是试用大名鼎鼎的 Sublime Text 后也仍然觉得不好用，就又回来考虑修改 Notepad++ 的源代码。经过 10 月 5 号一天的修改，已经基本上搞定 PHP 语法高亮的问题了，并且提交到了我在 github 上 fork 出来的项目上：

https://github.com/wudicgi/npp-customized

值得一提的是，其中 PHP 7 关键词和函数列表的提取，就是通过我的 HtmlMinerDocument 类库从 php.net 的在线文档中抓取的。待该关键词抓取工具的代码整理完毕后，我会把它也提交到 github 上去。

今天我又将最新的 v6.8.6 版本的代码合并到了我的修改分支上。

原版的 PHP 高亮效果是这样的：
image_npp_php_enhanced_01_thumb

我修改后的版本是这样的：
image_npp_php_enhanced_02_thumb

现在在语言格式设置中，可以为 PHP 的关键词 (WORD) 和函数名 (FUNCTION) 指定不同的颜色：
image_npp_php_enhanced_03_thumb
</description>
      <content:encoded>十一期间寻找现用文本编辑器的替代品，看了一圈最后打算换用 Notepad++, 但是一开始用就发现它的语法高亮功能很弱，比如 PHP 语言的关键字和函数名都不能设置不同的高亮颜色。&lt;br /&gt;&lt;br /&gt;经过&lt;a href=&quot;http://sourceforge.net/p/notepad-plus/discussion/331754/thread/f58b6b26/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;一番搜索&lt;/a&gt;，得知 Notepad++ 所用的 Scintilla 编辑器组件对语法高亮的处理是 hard-coded 的，想增加一类关键词高亮类型得改 C++ 源代码。而且 PHP 的保留字和函数名一直混在一块，不能单独设颜色这个问题已经 9 年没解决了。&lt;br /&gt;&lt;br /&gt;本来都打算放弃 Notepad++, 接着找商业软件去了。但是试用大名鼎鼎的 Sublime Text 后也仍然觉得不好用，就又回来考虑修改 Notepad++ 的源代码。经过 &lt;a href=&quot;https://github.com/wudicgi/npp-customized/commit/7b8c485d2c91dca5d4e09b2a85fae2d49f7c1aab&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;10 月 5 号一天的修改&lt;/a&gt;，已经基本上搞定 PHP 语法高亮的问题了，并且提交到了我在 github 上 fork 出来的项目上：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/wudicgi/npp-customized&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/npp-customized&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;值得一提的是，其中 PHP 7 关键词和函数列表的提取，就是通过我的 HtmlMinerDocument 类库从 php.net 的在线文档中抓取的。待该关键词抓取工具的代码整理完毕后，我会把它也提交到 github 上去。&lt;br /&gt;&lt;br /&gt;今天我又将最新的 v6.8.6 版本的代码&lt;a href=&quot;https://github.com/wudicgi/npp-customized/commit/cda2604c7edb5bc868a114dd605aa8016f09a091&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;合并到了我的修改分支&lt;/a&gt;上。&lt;br /&gt;&lt;br /&gt;原版的 PHP 高亮效果是这样的：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我修改后的版本是这样的：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;现在在语言格式设置中，可以为 PHP 的关键词 (WORD) 和函数名 (FUNCTION) 指定不同的颜色：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_npp_php_enhanced_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/9367b410/notepad-plus-plus-with-enhanced-php-syntax-highlighting?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/9367b410/notepad-plus-plus-with-enhanced-php-syntax-highlighting?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>将 Windows 7 配置成 Windows 8.1 的样子</title>
      <link>https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1</link>
      <comments>https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1?lang=zh-CN</guid>
      <pubDate>Sat, 31 Oct 2015 05:56:21 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>Windows</category>
      <category>计算机软件</category>
      <description>前两天给公司电脑的 Win 7 系统装上了个 Win 8.1 主题，现在看起来舒服多了。这么多年了，还是忍受不了 Win7 的默认主题。

image_win8_theme_for_win7

这个主题的下载地址为:
http://www.askvg.com/download-windows-8-rtm-theme-for-windows-7/

如果除了主题还想换开始菜单按钮和登陆界面等地方的话，可以参考这篇文章:
http://www.askvg.com/transform-windows-7-into-windows-8-vnext-without-using-customization-pack/

可能是由于 Win 7 和 Win 8.1 的主题系统差异较小，这套主题的效果非常好，换上后看着很自然，不像D353B0B2 以前我用过的 WINDOWS XP 主题那样会感觉有点怪。
</description>
      <content:encoded>前两天给公司电脑的 Win 7 系统装上了个 Win 8.1 主题，现在看起来舒服多了。这么多年了，还是忍受不了 Win7 的默认主题。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_win8_theme_for_win7&quot; /&gt;&lt;br /&gt;&lt;br /&gt;这个主题的下载地址为:&lt;br /&gt;&lt;a href=&quot;http://www.askvg.com/download-windows-8-rtm-theme-for-windows-7/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://www.askvg.com/download-windows-8-rtm-theme-for-windows-7/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;如果除了主题还想换开始菜单按钮和登陆界面等地方的话，可以参考这篇文章:&lt;br /&gt;&lt;a href=&quot;http://www.askvg.com/transform-windows-7-into-windows-8-vnext-without-using-customization-pack/&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;http://www.askvg.com/transform-windows-7-into-windows-8-vnext-without-using-customization-pack/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可能是由于 Win 7 和 Win 8.1 的主题系统差异较小，这套主题的效果非常好，换上后看着很自然，不像&lt;a href=&quot;https://blog.wudilabs.com/entry/d353b0b2/screenshot-supplements-to-transform-windows-7-into-windows-xp&quot;&gt;以前我用过的 Windows XP 主题&lt;/a&gt;那样会感觉有点怪。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/b357b3fe/transform-windows-7-into-windows-8-1?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>写了一个新的 PHP 类库: HtmlMinerDocument</title>
      <link>https://blog.wudilabs.com/entry/c3a7b2c5/wrote-a-new-php-library-htmlminerdocument</link>
      <comments>https://blog.wudilabs.com/entry/c3a7b2c5/wrote-a-new-php-library-htmlminerdocument#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/c3a7b2c5/wrote-a-new-php-library-htmlminerdocument?lang=zh-CN</guid>
      <pubDate>Tue, 06 Oct 2015 13:50:32 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>PHP</category>
      <description>十一期间写了一个新的 PHP 类库，通过它可以很方便的使用 CSS 选择器来提取网页中的元素。

现在已经上传到了 github 上，地址为：
https://github.com/wudicgi/html-miner-document

用法很简单，例如使用如下代码就能提取网易新闻首页头条新闻的标题和 URL:
&lt;?php
include_once &#039;HtmlMinerDocument.php&#039;;

// Find all elements matching the given CSS selectors

$doc = new HtmlMinerDocument(file_get_contents(&#039;http://news.163.com/&#039;));

$news_list = $doc-&gt;findAll(&#039;div.ns-wnews h3 a&#039;);

foreach ($news_list as $news) {
    echo &quot;$news[text] ($news[href])\r\n&quot;;
}

echo &quot;\r\n&quot;;
?&gt;

使用如下代码就能获取 amobbs 全部帖汇总的帖子列表：
&lt;?php
include_once &#039;HtmlMinerDocument.php&#039;;

// Find elements by group

$doc = new HtmlMinerDocument(file_get_contents(&#039;http://www.amobbs.com/forum-9892-1.html&#039;));

$threads = $doc
    -&gt;findFirst(&#039;table#threadlisttableid&#039;)
    -&gt;findAll(&#039;tr&#039;)
    -&gt;findAllByGroup(array(
        &#039;title&#039;         =&gt; &#039;th a.s&#039;,
        &#039;author&#039;        =&gt; &#039;td.by cite a&#039;,
        &#039;last_reply&#039;    =&gt; &#039;td.by em span&#039;
    ));

foreach ($threads as $thread) {
    echo $thread[&#039;title&#039;][&#039;text&#039;];
    echo &#039; by &#039; . $thread[&#039;author&#039;][&#039;text&#039;];
    echo &#039; (&#039; . $thread[&#039;last_reply&#039;][&#039;text&#039;] . &#039;)&#039;;
    echo &quot;\r\n&quot;;
}
?&gt;
</description>
      <content:encoded>十一期间写了一个新的 PHP 类库，通过它可以很方便的使用 CSS 选择器来提取网页中的元素。&lt;br /&gt;&lt;br /&gt;现在已经上传到了 github 上，地址为：&lt;br /&gt;&lt;a href=&quot;https://github.com/wudicgi/html-miner-document&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; class=&quot;external&quot;&gt;https://github.com/wudicgi/html-miner-document&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;用法很简单，例如使用如下代码就能提取网易新闻首页头条新闻的标题和 URL:&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;include_once&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;HtmlMinerDocument.php&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;Find&amp;nbsp;all&amp;nbsp;elements&amp;nbsp;matching&amp;nbsp;the&amp;nbsp;given&amp;nbsp;CSS&amp;nbsp;selectors&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$doc&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt;&amp;nbsp;HtmlMinerDocument&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;file_get_contents&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;http://news.163.com/&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$news_list&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$doc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;div.ns-wnews&amp;nbsp;h3&amp;nbsp;a&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$news_list&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$news&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$news[text]&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #006699; font-weight: bold;&quot;&gt;$news[href]&lt;/span&gt;)&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;使用如下代码就能获取 amobbs 全部帖汇总的帖子列表：&lt;br /&gt;&lt;div style=&quot;width: 100%; border: 1px solid #c0c0c0; word-wrap: normal; white-space: nowrap; overflow: auto;&quot;&gt;&lt;div style=&quot;font-family: Consolas, &#039;Courier New&#039;, monospace, &#039;SimSun&#039;; background-color: #e7e5dc;&quot;&gt;&lt;ol style=&quot;margin: 0px 0px 0px 45px; padding: 0;&quot;&gt;&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;include_once&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;HtmlMinerDocument.php&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&amp;nbsp;Find&amp;nbsp;elements&amp;nbsp;by&amp;nbsp;group&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$doc&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt;&amp;nbsp;HtmlMinerDocument&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;file_get_contents&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;http://www.amobbs.com/forum-9892-1.html&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$threads&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$doc&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;findFirst&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;table#threadlisttableid&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;tr&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;findAllByGroup&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;title&#039;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;th&amp;nbsp;a.s&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;author&#039;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;td.by&amp;nbsp;cite&amp;nbsp;a&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;last_reply&#039;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;td.by&amp;nbsp;em&amp;nbsp;span&#039;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$threads&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$thread&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$thread&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;title&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;text&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;&amp;nbsp;by&amp;nbsp;&#039;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$thread&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;author&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;text&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;&amp;nbsp;(&#039;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000088;&quot;&gt;$thread&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;last_reply&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;text&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&#039;)&#039;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff; font-weight: bold;&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #f8f8f8;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&quot;border-left: 3px solid #005ebb; padding: 0px 3px 0px 8px; font-weight: normal; vertical-align: top; background-color: #ffffff;&quot;&gt;&lt;div style=&quot;padding: 0; font: normal normal 1em/1.2em; vertical-align: top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/c3a7b2c5/wrote-a-new-php-library-htmlminerdocument?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt; &amp;#183; also available in: &lt;a href=&quot;https://blog.wudilabs.com/entry/c3a7b2c5/wrote-a-new-php-library-htmlminerdocument?lang=en-US&quot;&gt;English&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
    <item>
      <title>入手 Kindle DXG</title>
      <link>https://blog.wudilabs.com/entry/a3a68e97/got-a-kindle-dxg</link>
      <comments>https://blog.wudilabs.com/entry/a3a68e97/got-a-kindle-dxg#comments</comments>
      <guid isPermaLink="false">https://blog.wudilabs.com/entry/a3a68e97/got-a-kindle-dxg?lang=zh-CN</guid>
      <pubDate>Sat, 08 Aug 2015 12:52:30 +0000</pubDate>
      <dc:creator>五帝</dc:creator>
      <dc:language>zh-cn</dc:language>
      <category>电子产品</category>
      <category>图书</category>
      <description>今天收到了前两天在淘宝上买的盒装未拆封官翻的 Kindle DXG, 收到后刷了多看。

看扫描版的 PDF, 裁边后和纸质书对比如下：
image_kindle_dxg_01_thumb

能看出字号比纸质书还是稍小一些：
image_kindle_dxg_02_thumb

整页对比，把 PDF 四周的空白裁掉，9.7 寸屏的显示区域也还是比 16 开纸质书的文字部分小：
image_kindle_dxg_03_thumb

上边对比所选的书是《你必须知道的495个C语言问题》，之所以选这本书不是因为近期在看，而是这本书是我以 2 倍定价的价格从 china-pub 买的 POD (按需印刷) 的书。如果当时有 Kindle DXG, 不知道是不是就不会买纸质书收藏了。

不过 Kindle DXG 实际看起书来，字号和分辨率的影响不算大，主要是翻页时的刷新速度比较慢，翻几页后还会黑屏全刷。这应该就是说电子书不适合看技术类书籍的原因了，将来技术类的图书还是要接着买的。

2016-5-22 后记: Kindle DXG 除了看一个规范 (specification) 的 PDF 文档用过几天外，大部分时间都是在吃灰，扫描版的技术类书籍不如看纸质的，其他类型的书自己找电子书也很麻烦。所以后来还是又入手了 Kindle Paperwhite 3, 可以在淘宝上买中亚的充值卡充值，之后用一键下单买书，很方便。买一些非技术类书籍，便宜又不占地。而且 KPW3 有背光确实比较省眼。
</description>
      <content:encoded>今天收到了前两天在淘宝上买的盒装未拆封官翻的 Kindle DXG, 收到后刷了多看。&lt;br /&gt;&lt;br /&gt;看扫描版的 PDF, 裁边后和纸质书对比如下：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_01&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_01_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;能看出字号比纸质书还是稍小一些：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_02&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_02_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;整页对比，把 PDF 四周的空白裁掉，9.7 寸屏的显示区域也还是比 16 开纸质书的文字部分小：&lt;br /&gt;&lt;a href=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_03&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.wudilabs.com/?redirect=image_kindle_dxg_03_thumb&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上边对比所选的书是《你必须知道的495个C语言问题》，之所以选这本书不是因为近期在看，而是这本书是我以 2 倍定价的价格从 china-pub 买的 POD (按需印刷) 的书。如果当时有 Kindle DXG, 不知道是不是就不会买纸质书收藏了。&lt;br /&gt;&lt;br /&gt;不过 Kindle DXG 实际看起书来，字号和分辨率的影响不算大，主要是翻页时的刷新速度比较慢，翻几页后还会黑屏全刷。这应该就是说电子书不适合看技术类书籍的原因了，将来技术类的图书还是要接着买的。&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; color: red;&quot;&gt;2016-5-22 后记:&lt;/span&gt; Kindle DXG 除了看一个规范 (specification) 的 PDF 文档用过几天外，大部分时间都是在吃灰，扫描版的技术类书籍不如看纸质的，其他类型的书自己找电子书也很麻烦。所以后来还是又入手了 Kindle Paperwhite 3, 可以在淘宝上买中亚的充值卡充值，之后用一键下单买书，很方便。买一些非技术类书籍，便宜又不占地。而且 KPW3 有背光确实比较省眼。&lt;br /&gt;&lt;div style=&quot;margin-top: 1.2em; color: #666666;&quot;&gt;当前语言: &lt;a href=&quot;https://blog.wudilabs.com/entry/a3a68e97/got-a-kindle-dxg?lang=zh-CN&quot;&gt;中文 (简体)&lt;/a&gt;&lt;/div&gt;</content:encoded>
    </item>
  </channel>
</rss>
