<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>尝鲜 on wsmの随记</title>
		<link>https://g0g.top/tags/%E5%B0%9D%E9%B2%9C/</link>
		<description>Recent content in 尝鲜 on wsmの随记</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Thu, 28 Dec 2023 19:57:18 +0000</lastBuildDate>
		
			<atom:link href="https://g0g.top/tags/%E5%B0%9D%E9%B2%9C/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>ProtoBuf</title>
				<link>https://g0g.top/2023/12/protobuf-%E5%9F%BA%E7%A1%80/</link>
				<pubDate>Thu, 28 Dec 2023 19:57:18 +0000</pubDate>
				<guid>https://g0g.top/2023/12/protobuf-%E5%9F%BA%E7%A1%80/</guid>
				<description>&lt;p&gt;初次听闻 &lt;a href=&#34;https://protobuf.dev/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ProtoBuf&lt;/a&gt;，以为他是只是一种“二进制编码的 JSON 平替”。但事实与之相去甚远&lt;/p&gt;&#xA;&lt;h2 id=&#34;基本理解&#34;&gt;基本理解&lt;/h2&gt;&#xA;&lt;p&gt;在此节中我会将 JSON 与 ProtoBuf 进行横向对比。&lt;/p&gt;&#xA;&lt;p&gt;ProtoBuf 在设计上以“机器快速解析”为终极目标，并尽力减少不必要的数据（但不包括压缩）。为此它舍弃了 JSON 的以下优秀特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自解释性：单个 JSON 字符串就可以解析出一个完整的以键值对为基础的对象；然而，ProtoBuf 将格式定义与数据&lt;strong&gt;分离&lt;/strong&gt;，protobuf 数据必须依赖某个目标语言中预定义的类似 &lt;code&gt;struct&lt;/code&gt; 的东西、配合 protobuf 的数据编码解码算法才能够解析。&lt;/li&gt;&#xA;&lt;li&gt;可读性：很明显，作为一种二进制编码，它是不可读的。&lt;/li&gt;&#xA;&lt;li&gt;简单性/易手搓：JSON 如此流行不可不归功于其语法的简洁明了，这也意味着对于一个新语言而言支持非常简单。而 ProtoBuf 定义了一个新的数据结构，有点点复杂，不太好实现。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当然肯定有不少的优秀特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;高速解析：由于格式定义和数据的分离，格式定义被预编译进了代码内部，且以二进制编码数据，从而减少了解析时键名解析、类型判断、数值解析等开销，实现了 3-100 倍的解析性能提升。&lt;/li&gt;&#xA;&lt;li&gt;节省空间&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;：ProtoBuf 通过应用编号(Field Numbers)代替了键名，节省了寻键的开销和键的内存占用；ProtoBuf 用 Varint 和 ZigZag 减少了整数这种数据类型的内存占用。最重要的是，ProtoBuf 中所有部分都是可选的，实际传输中可以只传输要传输的那一部分，从而减少传输数据量；而不必像固定 struct 一样不论数据需不需要都会占固定内存。&lt;/li&gt;&#xA;&lt;li&gt;可变长度&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;：ProtoBuf LEB128 表示变长数据的长度，实现了非标记（例如 JSON的 &lt;code&gt;{}&lt;/code&gt;）变长度。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;个人感觉，ProtoBuf 是 Golang 开发者们为了 Golang 这样的静态语言而设计出的高效、扩展性强的结构化可选数据表示方式。如果把静态考虑在内，ProtoBuf 的确是最好的结构化&lt;strong&gt;可选&lt;/strong&gt;数据表示方式。&lt;/p&gt;&#xA;&lt;h2 id=&#34;打开方式&#34;&gt;打开方式&lt;/h2&gt;&#xA;&lt;p&gt;使用 ProtoBuf 需要三步：&lt;/p&gt;&#xA;&lt;ol start=&#34;0&#34;&gt;&#xA;&lt;li&gt;安装工具链，详见 &lt;a href=&#34;https://protobuf.dev/reference/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;在 &lt;code&gt;.proto&lt;/code&gt; 文件中编写你的 protobuf 格式&lt;/li&gt;&#xA;&lt;li&gt;用 &lt;code&gt;protoc&lt;/code&gt; 把 &lt;code&gt;.proto&lt;/code&gt; 文件编译成目标语言的代码&lt;/li&gt;&#xA;&lt;li&gt;在目标语言中引用编译出来的代码，引用 Google ProtoBuf 官方库，解析编码你的 ProtoBuf 数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;protobuf-语法&#34;&gt;ProtoBuf 语法&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/h3&gt;&#xA;&lt;p&gt;最基础的 protobuf 文件定义示例如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>微信小程序光速入门</title>
				<link>https://g0g.top/2023/12/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%85%89%E9%80%9F%E5%85%A5%E9%97%A8/</link>
				<pubDate>Sun, 17 Dec 2023 19:28:52 +0000</pubDate>
				<guid>https://g0g.top/2023/12/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%85%89%E9%80%9F%E5%85%A5%E9%97%A8/</guid>
				<description>&lt;h2 id=&#34;最小程序组成&#34;&gt;最小程序组成&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网&lt;/a&gt; 下载开发者工具安装好。&lt;/p&gt;&#xA;&lt;p&gt;新建一个目录。一个最小程序组成如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;//app.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;App&lt;/span&gt;({});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;pages/home&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-pages/home.js&#34; data-lang=&#34;pages/home.js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;//pages/home.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;Page&lt;/span&gt;({});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;&amp;lt;!--pages/home.wxml--&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;view&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;text&amp;gt;&lt;/span&gt;hello world&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;/text&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;/view&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;调用逻辑：首先运行 &lt;code&gt;app.js&lt;/code&gt;。&lt;code&gt;App()&lt;/code&gt; 检查了 &lt;code&gt;app.json&lt;/code&gt;。在此例中，将其中 &lt;code&gt;pages/home.js&lt;/code&gt; 加以处理，其 &lt;code&gt;Page()&lt;/code&gt; 编译 &lt;code&gt;pages/home.wxml&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;项目配置-appjson&#34;&gt;项目配置 &lt;code&gt;app.json&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;app.json&lt;/code&gt; 文件配置了小程序的全局参数，包括 &lt;code&gt;pages&lt;/code&gt; 列表和 &lt;code&gt;window&lt;/code&gt; 字典，和 &lt;a href=&#34;https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;其他&lt;/a&gt;。&lt;code&gt;pages&lt;/code&gt; 存储了所有待编译的页面，&lt;code&gt;window&lt;/code&gt; 包括了这堆页面的全局设定；常用 &lt;code&gt;navigationBarBackgroundColor&lt;/code&gt; 与 &lt;code&gt;navigationBarTitleText&lt;/code&gt; 两个参数。一个示例如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;pages/home&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;window&amp;#34;&lt;/span&gt;:{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarBackgroundColor&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;#fff&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTitleText&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;标题&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTextStyle&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;black&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;既然有“全局设定”，也就有局部设定。对于一个页面 &lt;code&gt;${NAME}.js&lt;/code&gt;，其 &lt;code&gt;window&lt;/code&gt; 设定存储在该目录下 &lt;code&gt;${NAME}.json&lt;/code&gt; 中，会覆盖全局的 &lt;code&gt;window&lt;/code&gt; 设定。例如&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarBackgroundColor&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;#000&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTitleText&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Title&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;程序启动&#34;&gt;程序启动&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;App()&lt;/code&gt; 必须在 &lt;code&gt;app.js&lt;/code&gt; 中调用，必须调用且只能调用一次。不然会出现无法预期的后果。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
