阅读视图

发现新文章,点击刷新页面。
☑️ ⭐

1.1.1.1、WARP 和 MASQUE

<blockquote><p>实际测试结果,虽然 Cloudflare 号称服务部署非常多,但使用 Warp 的 【VPN / 代理】功能,会明显增加网络延迟。(location &amp; ip: Japan)</p></blockquote><p>Cloudflare 提供了 1.1.1.1 DNS 服务,以及 WARP VPN + 代理。</p><h1 id="公共-DNS"><a href="#公共-DNS" class="headerlink" title="公共 DNS"></a>公共 DNS</h1><h2 id="运营商-DNS-有什么问题?"><a href="#运营商-DNS-有什么问题?" class="headerlink" title="运营商 DNS 有什么问题?"></a>运营商 DNS 有什么问题?</h2><p>直接使用运营商的 DNS 服务,有下面两个重要的问题:</p><ol><li>ISP 会通过 DNS 查询的域名,分析用户访问的网站。(DNS 查询是明文的 UDP)</li><li>ISP DNS 会有劫持、污染、缓存等</li></ol><p>那么公共 DNS 可以解决上面的问题吗?<strong>不行</strong>。</p><p>对于普通用户来说,使用运营商 DNS 没有任何问题,也会加快域名解析的速度。<br>如果想要安全,避免被运营商做【DNS 查询】分析,公共 DNS 无能为力。不管使用的公共 DNS 是 ipv4、ipv6、DoH,都无法解决。<br>DoH 是能用到最安全的级别了,但还是有 SNI 泄漏。</p><span id="more"></span><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- IPv4 和 IPv6:</span><br><span class="line"> - 1.1.1.1 和 2606:4700:4700::1111</span><br><span class="line"> - 1.0.0.1 和 2606:4700:4700::1001</span><br><span class="line">- DoH:</span><br><span class="line"> - https://cloudflare-dns.com/dns-query</span><br></pre></td></tr></tbody></table></figure><h2 id="公共-DNS-如何实现负载均衡"><a href="#公共-DNS-如何实现负载均衡" class="headerlink" title="公共 DNS 如何实现负载均衡"></a>公共 DNS 如何实现负载均衡</h2><p>通过域名,可以在 DNS 权威服务器上做 IP 的负载均衡。<br>那么,对于只有 IP 地址而没有域名的 DNS 服务,如何实现负载均衡呢?</p><p>每个 IP 能被发现,是通过网络节点之间的 BGP(边界网关协议)进行广播。<br>通过 <strong>Anycast</strong> 技术,可以在不同地理位置的多台主机上部署相同的 IP,从而让客户端就近连接到 IP 服务器。</p><h1 id="WARP"><a href="#WARP" class="headerlink" title="WARP"></a>WARP</h1><p>WARP 是 Cloudflare 提供的一种 VPN 服务,使用了 WireGuard 协议。<br>不同的 VPN 协议分别工作在网络模型的不同层次,其中 WireGuard 工作在第三层(网络层)。<br>因为 iOS 等系统,同一时间只能开启一个 VPN 服务,所以使用 WARP 的时候,数据包流向为:</p><ol><li>WARP app 拦截所有三层数据包并转发到 WARP 的 WireGuard 服务器,服务器向具体的 domain 发起请求。</li></ol><p>在 Mac 系统上,除了 WARP 还可以手动设置网络代理(Thrid Proxys),这些网络代理一般工作在应用层。这个时候数据包流向为:</p><ol><li>数据包转到 Third Proxys 进行封装,目标 domain 变成【代理 服务器】</li><li>WARP app 拦截所有三层数据包转发到【WARP 服务器】</li><li>【WARP 服务器】向【代理 服务器】发起请求</li><li>【代理 服务器】向具体的 domain 发起请求</li></ol><h1 id="MASQUE"><a href="#MASQUE" class="headerlink" title="MASQUE"></a>MASQUE</h1><blockquote><p>通常使用的翻墙工具并不是 VPN,而是网络代理(更准确地说,称为 “正向代理”)。<br>之所以经常将它们称为 VPN,是因为在 iOS 等设备上,需要开启 VPN 服务,这些软件才能拦截数据流量,实现代理转发。<br>但它们与通常所指的 WireGuard、OpenVPN 等 VPN 协议并不一致。</p></blockquote><p>WARP 推出了基于 MASQUE 协议的版本,用于替代 WireGuard。MASQUE 使用了 QUIC 协议,属于应用层的网络数据转发。</p><p>从本质上来说,此时的 WARP 已经不能称为 VPN,而是 “正向代理”。具体来说:</p><ul><li>WARP 在网络分层的底层(第三层网络层)捕获系统流量,这一点与使用 WireGuard 时相同。不同的是后续的处理方式:<ul><li><strong>WireGuard</strong>:使用该协议时,采用的是 VPN 方案。对拦截的数据包进行加密,然后通过隧道发送。</li><li><strong>MASQUE</strong>:使用该协议时,采用的是正向代理方案。对拦截的数据包,通过 QUIC 协议代理到 WARP 服务端节点。</li></ul></li></ul><p>这种技术方案与 macOS 上著名的代理软件 Surge 非常相似。Surge 有一个功能叫 “增强模式”。</p><ul><li>在正常情况下,Surge 通过在系统网络设置中的代理配置设置 localhost 代理,捕获应用层的流量进行转发。</li><li>开启增强模式后,Surge 会通过第三层捕获所有流量包,接管后进行转发。</li></ul><p>WARP 为什么抛弃【WireGuard】使用 【MASQUE】,可以参考官方介绍:<br><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNsb3VkZmxhcmUuY29tL21hc3F1ZS1idWlsZGluZy1hLW5ldy1wcm90b2NvbC1pbnRvLWNsb3VkZmxhcmUtd2FycC8=">https://blog.cloudflare.com/masque-building-a-new-protocol-into-cloudflare-warp/</span></p><hr>
☑️ ⭐

移动端换端方案与场景还原

<h1 id="换端能力"><a href="#换端能力" class="headerlink" title="换端能力"></a>换端能力</h1><p>在移动应用生态中, 换端 (App Switching) 是一个常见的需求。同一台设备上,有以下三个端: <code>M(Web网页)</code>、 <code>A(移动应用 app)</code>、 <code>B(待唤端的应用 app)</code>。 当 M 或 A 需要跳转至 B 时, 有两种技术方案: URL Scheme 和 Universal Link。</p><h2 id="URL-Scheme"><a href="#URL-Scheme" class="headerlink" title="URL Scheme"></a>URL Scheme</h2><ol><li>App 端先行验证能力:<ul><li>A 可以通过<code>canOpen</code>方法预先判断 B 是否已安装, 且此操作不会触发跳转</li></ul></li></ol><span id="more"></span><ol start="2"><li>Web 端无先行验证能力:<ul><li>M (Web) 无法预先判断 B 是否安装</li><li>通常采用延迟判断方案: 执行跳转后等待 2 秒, 根据页面状态判断跳转是否成功</li></ul></li></ol><p>URL Scheme 存在一个严重的安全问题: 不同的应用可以注册相同的 scheme。这意味着当 A 尝试跳转 B 时, 可能会被恶意应用 X/Y/Z 截获。正是由于这个安全隐患, URL Scheme 正逐渐被 Universal Link 替代。</p><h2 id="Universal-Link"><a href="#Universal-Link" class="headerlink" title="Universal Link"></a>Universal Link</h2><ol><li>预判限制:<ul><li>M 和 A 都无法预先判断 B 是否安装</li></ul></li><li>跳转控制:<ul><li>A 可以通过跳转参数强制使用 Universal Link 进行跳转</li><li>跳转执行后可以判断目标应用是否安装</li></ul></li></ol><h3 id="原理-挑战"><a href="#原理-挑战" class="headerlink" title="原理 &amp; 挑战"></a>原理 &amp; 挑战</h3><ul><li>应用安装时, 操作系统会向配置的 domain 请求资源文件 (开发人员提前配置),该文件包含应用约定的 Router 信息</li><li>如果 HTTPS 请求失败, 应用将暂时无法被 Universal Link 唤醒</li><li>Apple 未明确指定重试机制, 仅表示系统会在适当时机重新请求</li></ul><h1 id="微信的二次回跳验证机制"><a href="#微信的二次回跳验证机制" class="headerlink" title="微信的二次回跳验证机制"></a>微信的二次回跳验证机制</h1><h2 id="二次回跳说明"><a href="#二次回跳说明" class="headerlink" title="二次回跳说明"></a>二次回跳说明</h2><p>当应用 A 首次使用微信 SDK 的 Universal Link 功能进行分享时, 会出现双重跳转:</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">A -&gt; 微信 -&gt; A -&gt; 微信</span><br></pre></td></tr></tbody></table></figure><p>这种情况仅在首次分享时出现, 后续分享操作将直接完成。</p><h2 id="双重验证有效性"><a href="#双重验证有效性" class="headerlink" title="双重验证有效性"></a>双重验证有效性</h2><p>Universal Link 在安全的前提下,成功率较高,能保证其他 App 跳转到我的 App 的成功率。只要我的 App 配置了 Universal Link,大概率其他 App 跳转到我的 App 是没有问题的。<br>但是,我的 App 也需要跳转回其他 App,此时我的 App 并不信任其他 App(或者说不信任其他 App 的 Universal Link 配置)。<br>举个分享流程的例子,如果 A 通过 Universal Link 跳转到微信后,微信处理完分享流程。用户点击返回 A,但无法返回,此时就会造成严重的用户体验缺失(Bug)。</p><h2 id="二次回跳处理"><a href="#二次回跳处理" class="headerlink" title="二次回跳处理"></a>二次回跳处理</h2><p>微信采用类似 TCP 三次握手的验证机制,提前打通 A 和微信之间的换端通路。这可能涉及到降级处理,即 Universal Link 降级为 URL Scheme。仍以分享流程为例:</p><ol><li>A(通过微信 SDK API)使用 Universal Link 跳转到微信。<ul><li>SDK API 增加了选项控制,指定使用 Universal Link 方式。如果失败,直接降级到 URL Scheme 进行跳转,此时不会有二次回跳验证。</li></ul></li><li>微信拉取服务端资源,将 A 的 URL Scheme 和 Universal Link 拉取到本地(A 提前在微信的开发者平台进行了配置)。</li><li>微信通过 Universal Link 跳转回 A。<ul><li>指定使用 Universal Link。如果失败,说明 A 的 Universal Link 配置有问题,降级到 URL Scheme 通知 A。后续 A 和微信的操作(分享操作仍需继续)都通过 URL Scheme 完成。</li></ul></li><li>A(通过微信 SDK API)判断微信通过 Universal Link 成功唤起了自己,表明 A 和微信之间的 Universal Link 通路畅通。<ul><li>后续所有的换端操作,全部通过 Universal Link 完成。</li></ul></li><li>A(通过微信 SDK API)发起真正的分享换端,微信被唤醒后执行分享流程(朋友、朋友圈、收藏等),然后回跳到 A。</li><li>…</li><li>之后,所有换端操作都直接通过 Universal Link 进行,不再需要之前的二次回跳验证。</li></ol><h1 id="Web-向原生-App-发起登录验证"><a href="#Web-向原生-App-发起登录验证" class="headerlink" title="Web 向原生 App 发起登录验证"></a>Web 向原生 App 发起登录验证</h1><p>web 页面在需要登陆的场景,可能需要跳转到 app 中完成登陆,然后回到到网页中。</p><h2 id="处理流程"><a href="#处理流程" class="headerlink" title="处理流程"></a>处理流程</h2><ol><li><p>唤起阶段:</p><ul><li>Web 页面 (url_a) 通过 Universal Link 或 URL Scheme 唤起 App</li><li>携带必要的身份标识参数</li></ul></li><li><p>登录处理:</p><ul><li><p>方案一: 服务端传递 Token</p><ul><li>App 将 token 和身份标识发送至服务端</li><li>App 通过 <code>openURL(url_a)</code> 在 Safari 中刷新网页(不会新开页面)</li><li>Web 根据本地存储的标识参数,从服务器获取 Token。</li></ul></li><li><p>方案二: 换端传递 Token</p><ul><li>App 将 Token 拼接到 <code>url_b_{path}</code> 中,通过 openURL 唤醒。</li><li>Safari 会新开页面,新的页面是登录成功后的落地页。</li></ul></li></ul></li></ol><h1 id="Delay-Deep-Link(场景还原-一般用于广告投放)"><a href="#Delay-Deep-Link(场景还原-一般用于广告投放)" class="headerlink" title="Delay Deep Link(场景还原-一般用于广告投放)"></a>Delay Deep Link(场景还原 - 一般用于广告投放)</h1><p>通过 Universal Link,如果目标 App 未安装,此时可以跳转到 Web 中间页并转跳到 App Store。希望用户下载 App 并首次打开后,立即跳转到当初 Universal Link 的承接页。这也叫【场景还原】。<br>核心原理是,全新的 App 在第一次被打开后,需要通过某种途径,找到之前 Universal Link 中标记的落地页信息。</p><ol><li><p>方案一:本地</p><ul><li>在使用 Universal Link 进行换端时,发起换端的一方负责将换端链接存储到用户的剪贴板中。</li><li>当目标 App 打开后,自行读取剪贴板并进行落地页跳转。剪贴板有预探功能,可以先不触发用户的权限弹框,提前知道是否有需要的口令内容。</li></ul></li><li><p>方案二:设备标识(Device ID)</p><ul><li>这里的 Device ID 并不是真正的设备 ID,而是大家共同遵守的一套规则,可近乎唯一地标记一台设备,并保证漂移率很低。可以根据设备的开机时间、升级时间、系统版本等信息,组合成密钥字符。</li><li>在使用 Universal Link 进行换端时,发起换端的一方负责将 Device ID 和落地页信息存储到云端。</li><li>当目标 App 打开后,自行获取 Device ID,然后从云端回拉落地页信息。</li></ul></li></ol><p>一般来说,这些场景都牵涉到资金投放,需要尽可能高的识别精度。所以方案都是混合使用,有一个匹配上就算【场景还原】成功了。</p><hr>
☑️ ⭐

分辨率 - 像素密度 - HiDPI

<p>对于电子显示屏而言,第一要务是要显示信息。与信息显示直接相关的硬件,是光源。每一个光源称为【物理像素】。</p><h1 id="光源-像素密度-物理像素"><a href="#光源-像素密度-物理像素" class="headerlink" title="光源 - 像素密度 - 物理像素"></a>光源 - 像素密度 - 物理像素</h1><p>像素本身是没有大小和尺寸的。同一个显示屏,可以有 100 * 100 个像素(光源),也可以有 10000 * 10000 个像素。但是显示屏的大小并没有改变,改变的是 光源 的多少。如果显示屏有更多的 光源,那么就可以显示更加细腻的画面。这是【像素密度】。</p><p>对于硬件来说,提升【像素密度】,可以在单个面积上,展示更加丰富的色彩。这需要制作工艺的提升,iPhone 4 首次将其商业化,开发出了 Retina (HiDPI)屏幕。当时称为 2 倍屏,和 iPhone 3G 相比,屏幕的物理尺寸没有改变,但是像素密度提升了 4 倍,即 宽、高 的密度提升了 2 倍。</p><p>这是硬件制作工艺上的提升,但如何有效的使用塞了更多光源的屏幕,是软件来工作的。实际上,很多复杂的逻辑,都是软件来规定的。毕竟硬件只提供了【像素密度】更高、更多的【光源】,其他并没有做。比如软件开发中如何实现 0.5px 的宽高、如何调整设置系统的分辨率等等。</p><p>光源,也称为【物理像素】,是真实的提供发光和色彩的源头。</p><span id="more"></span><h1 id="分辨率-虚拟像素"><a href="#分辨率-虚拟像素" class="headerlink" title="分辨率 - 虚拟像素"></a>分辨率 - 虚拟像素</h1><h2 id="px-的定义"><a href="#px-的定义" class="headerlink" title="px 的定义"></a>px 的定义</h2><p>随着制作工艺的提升,光源 会趋向于越来越小。所以 光源 是没有尺寸概念的,但是开发人员需要有这个概念,不然怎么设置一个图片的大小或者一个矩形的宽高呢?</p><p>所有的软件都是在操作系统上运行的,而操作系统对像素进行了抽象,即【分辨率】。</p><p>对于同一台电脑,可以在系统设置中调整不同的分辨率,如 100 *100 或者 1000 * 1000。这些分辨率是【虚拟像素】,即把当前屏幕的宽度分割成 100 或者 1000 份,每一份就是 1px。</p><blockquote><p>如果一台笔记本的屏幕光源(物理像素)是 2000 * 2000,系统设置分辨率为 2 * 2,即将整个屏幕的宽度和高度分割成 2 份。那么开发人员设置一个矩形的大小是 1 * 1,这个矩形就占据整个屏幕的 1 / 4,且使用了 500 * 500 个光源</p></blockquote><h2 id="px-是虚拟的"><a href="#px-是虚拟的" class="headerlink" title="px 是虚拟的"></a>px 是虚拟的</h2><p>通过上面的定义,可以看出 px 是操作系统层面根据当前屏幕的大小分割成 n 份后虚拟出来的尺寸。同样的分辨率,如果屏幕大小不同,那么 1px 的大小也是不同的。</p><p>px 是和 光源 直接相关的,如果 px 是真实的,那么就和 光源 绑定。而我们可以设置 0.5px,但 1 个光源 是不可能只亮一半的。</p><p>根据上面的例子 (2000 * 2000 物理像素的例子),如果设置 0.5px,实际上是使用 250 * 250 个光源。</p><h2 id="像素软件化"><a href="#像素软件化" class="headerlink" title="像素软件化"></a>像素软件化</h2><p>之前提到物理硬件上,只需要提高制作工艺来增加单位面积内的 光源 数量,即【物理像素密度】。除此之外,光源 出了提供不同色彩的亮度之外,并没有更多的变化性。</p><p>而软件,将对 光源 进行复杂的设定,来实现 高清晰度 等不同场景的使用效果。</p><p>准确来说,软件层面对 光源 最根本的对接是:对于需要展示的内容,如何更有效的使用 光源 来展示更加细腻、丰富的色彩。对接的不好,内容会有锯齿。对接的好,内容会很细腻。</p><h1 id="单纯提高硬件制成"><a href="#单纯提高硬件制成" class="headerlink" title="单纯提高硬件制成"></a>单纯提高硬件制成</h1><p>对于同一个尺寸大小的显示器,因为制成的提升,我们来看下渲染的变化,假设现在需要展示 100 * 100 大小的花朵:<br>原始:1000 * 1000 物理像素。设定屏幕分辨率(虚拟像素)为 500 * 500。一个虚拟像素需要 2 个物理像素。此时花朵的视觉效果是:宽度和高度都是屏幕的 1 / 5,占用 200 * 200 个光源。</p><p>制成提升:10000 * 10000 物理像素。</p><ul><li>如果屏幕分辨率保持 500 * 500 不变,一个虚拟像素需要 20 个物理像素。此时花朵的视觉效果是:宽度和高度都是屏幕的 1 / 5,占用 2000 * 2000 个光源。此时,在花朵的边缘部分因为有更多的光源,会变得清晰(清晰是加强原始的表现。若花朵像素不佳,这里的清晰会变成锯齿)。</li><li>如果屏幕分辨率调整 1000 * 1000,一个虚拟像素需要 10 个物理像素。此时花朵的视觉效果是:宽度和高度都是屏幕的 1 / 10,占用 1000 * 1000 个光源。此时,花朵在屏幕上看起来非常小。无法正常浏览。</li><li>在 2 的基础上,把屏幕设置 scale,即 200% 放大。此时花朵的视觉效果是:宽度和高度都是屏幕的 1 / 5,回到了正常效果。占用 2000 * 2000 个光源。此时,和 1 情况基本没有变化。</li></ul><p>通过上面的观察,可以发现单纯提高硬件制成,并不能有效的带来清晰度的提升。一来无法提高分辨率(导致无法使用),二来无法有效的提高清晰度(本来渲染内容的质量就不佳)。</p><blockquote><p>此时,还会无效的增加 CPU、GPU 的算力。渲染成指数的增加,但没有实际的视觉产出。</p></blockquote><p>这时候就需要软件的配合。在 iPhone 4 的 Retina 屏幕商用前,也有其他厂商提高了物理像素密度,但并没有 Retina 的效果。</p><h1 id="HiDPI-Retina"><a href="#HiDPI-Retina" class="headerlink" title="HiDPI - Retina"></a>HiDPI - Retina</h1><p>我们把具有物理像素高密度的屏幕,称为 HiDPI 屏幕,苹果把它叫做 Retina 屏幕,一样的。</p><p>实际上,并不是说需要单独制作 HiDPI 屏幕,而是只要一个屏幕的像素密度达到了一个标准,那么它就是 HiDPI 屏幕了。HiDPI 并不是一个功能开关,而是对具有高像素密度的屏幕的总称。</p><p>前面说到提高硬件制成并不能有效的带来视觉效果的提升,即 软件 需要参与进来。如果软件不主动的使用高密度,那就像前面(屏幕分辨率保持 500 * 500 不变)的例子中说明的,并不会带来显著的变化。</p><h1 id="软件提升视觉质量"><a href="#软件提升视觉质量" class="headerlink" title="软件提升视觉质量"></a>软件提升视觉质量</h1><p>使用 HiDPI,即创建了一个 N 倍虚拟分辨率来更加高效的使用高密度的光源。<br>假设有原始 10 * 10 图像,需要在 50 * 50 分辨率的显示屏上显示,显示屏的物理光源也是 50 * 50。<br>在这种情况下不开启 HiDPI,前面已经介绍过。下面说下开启 2 倍 HiDPI 的流程:</p><ol><li>原始图像中的 10 * 10 像素区域首先被放大到 20 * 20 的渲染像素。软件层面会使用插值算法 (如双线性插值) 来创建新的像素,提供了更多的颜色过渡空间,使过渡更平滑。</li><li>然后这个 20 * 20 的渲染区域被映射到 50 * 50 的物理像素区域。</li></ol><p>下面是对比效果:</p><figure class="highlight jsx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// raw px</span></span><br><span class="line">R G</span><br><span class="line">B W</span><br><span class="line"></span><br><span class="line"><span class="comment">// 不使用 HiDPI 直接进行渲染</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">BBBBBWWWWW</span></span><br><span class="line"><span class="variable constant_">BBBBBWWWWW</span></span><br><span class="line"><span class="variable constant_">BBBBBWWWWW</span></span><br><span class="line"><span class="variable constant_">BBBBBWWWWW</span></span><br><span class="line"><span class="variable constant_">BBBBBWWWWW</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用 HiDPI 直接进行渲染</span></span><br><span class="line"><span class="comment">// &gt; 使用 2 倍 HiDPI 软件层面放大</span></span><br><span class="line">R R<span class="string">' G'</span> G</span><br><span class="line">R<span class="string">' R'</span><span class="string">' G'</span><span class="string">' G'</span></span><br><span class="line">B<span class="string">' B'</span><span class="string">' W'</span><span class="string">' W'</span></span><br><span class="line">B B<span class="string">' W'</span> W</span><br><span class="line"></span><br><span class="line"><span class="comment">// &gt; 将 2 倍虚拟分辨率通过光源进行渲染</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RRRRRGGGGG</span></span><br><span class="line"><span class="variable constant_">RR</span><span class="string">''</span><span class="variable constant_">GGGGGG</span></span><br><span class="line">R<span class="string">''</span><span class="variable constant_">GGGGGG</span><span class="string">'</span></span><br><span class="line"><span class="string">R'</span><span class="variable constant_">GGGGG</span><span class="string">''</span>W</span><br><span class="line"><span class="variable constant_">BBBBWWWWWW</span></span><br><span class="line"><span class="variable constant_">BBBBWWWWWW</span></span><br><span class="line"><span class="variable constant_">BB</span><span class="string">''</span><span class="variable constant_">WWWWWW</span></span><br><span class="line">B<span class="string">''</span><span class="variable constant_">WWWWWW</span><span class="string">'</span></span><br><span class="line"><span class="string">BBWWWWWW'</span>W</span><br></pre></td></tr></tbody></table></figure><p>在这个例子中:</p><ul><li>原始的单一颜色区域 (如纯红色) 仍然保持清晰。</li><li>颜色过渡区域 (如红色到绿色的边界) 有更多的中间色, 使得过渡更加平滑。</li><li>边缘和细节更加平滑, 减少了锯齿感。</li></ul><p>这种渲染方法的优势:</p><ol><li>更多的渲染像素允许更精细的颜色渐变。</li><li>插值算法可以创建原始图像中不存在的中间色, 使边缘更平滑。</li><li>当这些渲染像素映射到物理像素时, 即使不是完全一一对应, 也能保留更多细节。</li></ol><h1 id="480p"><a href="#480p" class="headerlink" title="480p"></a>480p</h1><p>对于一个 480p 的视频,它的具体尺寸是多少?没有具体的尺寸,多大多小都可以。</p><p>480p 表示 640 * 480 px,即宽 640 个像素,高 480 个像素。每个像素存储的是 RGB 色彩信息,是数字信息。</p><p>480p 表示共计 640 * 480 个色彩点位的数字信息。具体到渲染的时候,可以放大缩小,放的太大了,就会模糊了。因为当使用 3000 个光源来表达 640 个色彩点,肯定有很多地方是填充补位的,那些光源并没有实际表达视频色彩,只是填充了过度色彩(甚至没有过度,锯齿会更加厉害)。</p><h1 id="High-Dynamic-Range-from-ai"><a href="#High-Dynamic-Range-from-ai" class="headerlink" title="High Dynamic Range - from ai"></a>High Dynamic Range - from ai</h1><p><strong>HDR</strong>(高动态范围)技术允许显示器在更宽的亮度范围内展示图像,能够同时提供更深的黑色和更亮的白色。这种技术增强了图像的总体对比度,使得色彩更加丰富和深邃。HDR 显示器可以更精确地展示从暗部到亮部的细节,这在标准动态范围(SDR)显示器中往往无法实现。</p><h2 id="Extreme-Dynamic-Range-XDR"><a href="#Extreme-Dynamic-Range-XDR" class="headerlink" title="Extreme Dynamic Range (XDR)"></a>Extreme Dynamic Range (XDR)</h2><p><strong>XDR</strong>(极致动态范围)是 Apple 公司对 HDR 技术的一种营销称呼,用于其某些显示产品。XDR 旨在提供比传统 HDR 更高的亮度和对比度水平,以达到更加出色的视觉效果。这种技术特别适合专业视频编辑和高端图像处理,其中对色彩准确性和细节展示的需求极高。</p><hr>
☑️ ⭐

要不要归零

<p>2022.04.14 日,我的订阅号被官方永久封杀了。对我呢,没啥影响,毕竟 4 年了,就 54 个粉丝。我也都是直接发文字,不是文章,没啥原创不原创的概念。<br>我对这次封杀,是很不满的。说有人举报了我,查明后给予了封杀。<br>但其实并没有人看我发的文字,我看后台其实就一位读者断断续续的漂两眼我的号,其实这个本身并不好判断,后台不提供哪些用户看了什么文章。只是因为我的关注量太少了,后台有一个阅读排名,刚好就是这位顾客。他是 18 年订阅的。我内心可以从容的断定,不是他举报的,也不是其他订阅者举报的。<br>这明明就是官方主动封杀的,却在封杀理由上写着因为用户举报,可无聊了。<br>我文字发出去前,你官方也审核通过了,为什么发出去后 30 分钟,就把我的号永久关停了?<br>我没有发啥敏感内容,如果真的敏感,肯定是发不出去的。我也没有刻意用拼音代替汉字,就那么一个读者,我犯不着还用心的躲避审查。<br>只是我的文字,是关于上海的一些想法,就被封了。<br>上海,一个国际化大都市,也变成敏感话题了。今天,“四月之声” 的视频被全网封杀后,我又看了一些其他公众号的控诉,才发现仅仅是审查门槛降低了,就稍微不满意就封杀的那种,可搞笑了。<br>订阅号被封,我还反馈了一下,说 7-10 天给反馈好像,也一直没有反馈我。我也不指望反馈,因为订阅号我不会再申请,不依靠它吃饭,对我意义不大。就是自己说的话都不兑现,可丢大公司的脸了。<br>之前,我还想着自媒体不能称为媒体,因为自媒体没有媒体的要素。现在想想,自媒体能不被封号就不错了,哪还能自由表达自己的想法。那些依靠订阅号生存的人,一旦封号,可就是没饭碗了,能留下一些读者吃广告费养家,不容易的。<br>Anyway,我的号是归零了。</p><span id="more"></span><p>最近,我咨询了一些移民的事情,发现自己时而坚定时而徘徊,心是有顾虑的。投资,我是没那个钱。国内的房产,让我这么多年除了银行负债,只有一两万的存款。黑下去,我也不能带着家人过那种生活,那还不如国内耗着。而工作,或许是个办法。<br>可是,真的到外面生活了,那可是从零起步呢,我心里也发毛。之前没想过,现在想着就越发心里没底了。而除了自身之外,周围的牵挂也是挥之不去的。这些,都无形中有顾忌。</p><p>我想着归零是需要很大的决心。归零,时常有人提起。可真到了某一个方面归零的时候,还是会有很多犹豫的。不像工作上提到的归零,还只是复盘的一个节点,或者是找个台阶的文艺说法,没有那么伤精痛骨的意义。<br>比如技能归零。大学生毕业后从事的工作很可能就是他几十年的工作了,因为不知道除了已经会的,其他的该如何走下去,转行可不仅仅是一个工作内容的变更,还有新的征途和未知的风险。<br>比如婚姻归零。那些婚姻不满意对方而期望离婚的,也会有孩子的考虑以及日后少一个人陪伴在身边的忧虑。<br>比如刚才说的移民,生活上基本归零,啥都是新的,像刚进入社会的学生一样。而且不在本土,日后的杰出与伟大或许只能臆想。</p><p>本次疫情,上海也是一次归零。期望从封城之外寻找疫情下城市发展不停滞的路线,这是相当值得支持并且赞扬的。不过,这次归零是完完全全的失败,因为归零的路线定了,也执行一段时间了,最后又把归零的方案本身给否决回到原始方案了。目前大家都可以看到,这代价是何其的大。上海的归零灾难,就是没有上峰的支持而冒然行动的后果。</p><p>我更倾向于认为,归零,是一种选择。选择路千万,而归零是其中最干净和纯粹的一个。<br>人生虽路漫漫,历史长河中,一个人和一粒沙一样的微不足道。一个人的价值,我认为在于三个方面:<br>一是个人思维的成长。几十年的光阴,每时每刻都在接受信息,都在学习,不断的输入和输出。每个人都是自己人生的王,是自己戏本里的主角。对个人而已,就是让自己的思维跟得上年龄的脚步,这样才能在各个年龄段都在戏本里相得益彰、和平相处。<br>二是家庭的付出。家庭需要经营,戏本里除了自己,还有父母妻儿。我们保障了自己,也要保障他们的方方面面。他们在戏本里有举足轻重的地址。<br>三是社会的输出。每个人都在为当前的社会奉献着自己,即使再微不足道,也真真实实的有付出。这其中有时间,有体力,有脑力,有资金等等,有人付出的多,有人付出的少,但都有输出。<br>一个人的贡献,看起来很大。可这世上那么多人,社会贡献池巨大无比,那个人的贡献其实是可以量化的,那就是<strong>十分微小</strong>。伟人自然贡献巨大,但个人能不能称为伟人,自知即可。<br>人在做选择的时候,更应该知晓在三个贡献方面进行权衡。自知而言,都是在个人成长和家庭付出上取最大值即可。<br>比如换个职业,选自己更感兴趣的方向,那对个人而已肯定是有价值增幅。对家庭来说有可能是价值降低的。选更能赚钱的方向,对个人有可能比较痛苦,对家庭可能有更好的生活条件。这个要做权衡。</p><p>归零,就是自己戏本里的大改变。我们作为自己人生戏本里的王,可以尝试着改写剧本。归零后,个人和家庭的权衡如果都朝着有益的方向,那为什么不去拼一把呢?<br>归零谈不上豪赌,但选择了这条路还是要做好心理准备。有得有失,没有完美。剧本都是人生道路一步一步搭起来的,前面的路不走,后面的剧本也没法写。</p><p>选择这条纯粹干净的路,也要评估时间等额外成本。比如上海的疫情防疫,是一场归零,奈何上峰都没同意就去实践,走回头路的代价可是很大的。再比如年过半百,已无更大精力去践行归零后的行动,强归无力徒伤悲。</p><hr><p>前两天写了半篇文章,关于 “世界那么多人,大家都不一样” 的。写了 3 个小时,放弃了。文笔不好,无法表达自己的感情,就放弃了。<br>今天想再回头看看还能不能补救,发现当时自己看不下去,给删除了。<br>其实是有些懊恼的,放在草稿里不就好了,抱怨下自己。</p>
☑️ ⭐

提高效率的手艺

<p>本来有更重要的事情要做,但那个事情急不得。我也就当作拖延时间一样,不去做它,转而分享两个对我近些年十分有帮助的手艺。</p><p>近十年有两个对我非常有益的手艺,极大的提高了我的工作舒适度。手艺一般称为个人经过学习从而有了一个能够吃饭的看家本领,那我这个称为手艺,其实有些夸大的,更多算作技巧。但我没有改动这个形容词,也只是想要描述这两个技巧对我的帮助很大。</p><h2 id="双拼"><a href="#双拼" class="headerlink" title="双拼"></a>双拼</h2><p>这个对我的帮助最大,是我极力推荐的。很多人都不知道双拼,我是在十年前接触了双拼,从此打字不再是苦恼。</p><p>双拼是一种打字的方式,和普通的拼音打字不同,在双拼的字典里面,任何一个汉子都只需要两个字母即可表达。比如<strong>双拼</strong>这两个汉字,键盘表达就是<code>ul</code>和<code>pb</code>。</p><span id="more"></span><p>双拼的学习曲线不是很陡,但需要熬过一个艰难的心里不适应期,一般在 3-5 天。有一套双拼码表需要背,虽然熟悉之后就是肌肉记忆了,但是刚学习的时候,还是要背的。</p><p>双拼有好几种码表方案,我开始的时候使用的搜狗双拼,后来改成了小鹤双拼,这个我觉得更好用。小鹤双拼的码表如下:</p><p><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202210241536030.png" alt="小鹤码表 from 官网"></p><p>举个例子,“这是一个测试” 这几个汉字,用小鹤双拼打,就是这样:<code>ve ui yi ge ce ui</code>。双拼也会有常用缓存,比如一个字你打的久了,后面打前一个字母,也就给这个字的推荐了。不过我不常用,因为两个字母已经够简洁了,而且肌肉记忆之后,打一个字母反而不习惯。</p><p>现在的双拼输入法,已经很普遍了,完全没有输入法选择困难。<br>我刚开始用双拼的时候,苹果键盘还没有小鹤双拼,我只能使用搜狗双拼。后面还是想用小鹤,因为其他平台有小鹤,转换起来两套码表把我都搞晕了,于是苹果上面我就用 Gboard,它支持小鹤。再往后苹果也支持了小鹤,我就转移到苹果的全拼音键盘了,很好用。</p><p>还有呢,我建议即使最后没有选择双拼,我也建议你不要用搜狗输入法,这是一个没有底线的侵犯隐私的输入法。我们打字过程中会有非常多的隐私泄漏,一定要非常注意。</p><h2 id="VIM"><a href="#VIM" class="headerlink" title="VIM"></a>VIM</h2><p>Vim 也是一个划时代工具,从青铜时代开始划的,一直划到现在,也会一直划下去。</p><p>我开始使用 Vim 是因为服务器操作只能使用 Vi 类编辑器,没得选择。<br>而后使用各类 IDE,快捷键呢完全记不住,脑子笨,就一直使用 Vim 插件了。</p><p>Vim 的曲线很高,需要 3-7 天适应期,也是肌肉记忆,熟悉了就很难忘记怎么用,但初期也是要背 Vim 快捷键的。</p><p>使用 Vim 的方便在于,学习一套快捷键,各大平台及 IDE 使用。可以做到不管在哪里编码,编码方式都不会断片。(除了一些特立独行的 IDE 如 xcode,目前 xcode 也原生支持 vim 了,但之前有 4 年左右的空档期)</p><p>Vim 的进阶难度很高,我使用 Vim 近十年,也是不思进取,只是简单使用,没有把 Vim 作为 IDE 使用。但怎么说呢,Vim 入门后基本就可以放心使用了,那些你不知道的奇思淫技,完全不使用也完全不影响工作,只能说知道的越多食用效果越佳。</p><p>Vim 解放了鼠标的移动和快捷键的记忆,非常有用。浏览器上面使用 Vim 也是超级棒,页面滚动和 tab 跳转都非常方便,效率 Double。<br>我其实很少用到鼠标 (触控板),网页、IDE、应用切换等常用的操作,都通过键盘来完成,速度快体感好。</p><h2 id="Xcode-机械键盘"><a href="#Xcode-机械键盘" class="headerlink" title="Xcode &amp; 机械键盘"></a>Xcode &amp; 机械键盘</h2><p>对于我这种习惯使用 vim 的人来说,写作其实很痛苦。因为写作要频繁的在中英文之间切换,不如写代码总是英文环境。这个时候 vim 很有局限性,要频繁的切换输入法才能切换模式。<br>经典和偏门的写作工具,我都体验了一遍,但不理想。主要局限性在两点:1. 不支持 vim。2. vim 频繁中英文切换体感非常差。<br>最后,我发现 Xcode 的 vim 模式解决了我的问题。Xcode 里面的 vim 是 apple 定制的,不需要特别安装插件。它可以在不切换输入法的情况下进行 vim 模式切换等各种复杂操作。体感相当爽,一用就停不下来了。<br>顺带说一下,Xcode 是 Apple 公司的官方 app 编辑器 (IDE),一般只有 iOS / Mac 开发同学使用,比较大,最近版本大小缩小到 6-7G,之前动不动就是 10G+。<br>现在我不仅对于 markdown 格式的 blog 使用 xcode 管理,对于笔记也迁移到了 xcode 管理。<br>blog 我通过外部文件夹引入,相当于 ln 命令。笔记我通过 swift playground + workspace + private github 实现。都是几分钟就可以完成的简易配置。效果图如下:</p><p><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202210241533450.png"></p><p>还有一个 case,就是频繁使用电脑的人,一定要使用机械键盘。体感完爆自带键盘,比如虽然 Apple 系列的自带键盘其实已经很好用了。<br>机械键盘可以在青轴和茶轴之间选择,青轴相比茶轴声音大一些,其实打字最舒服,但是比较吵人,如果在办公场景,最好使用茶轴。<br>还有就是键位的问题,Windows 选一个合适价位的机械键盘就可以了,Mac 的就比较难选,主要是键位和 Windows 不匹配。我推荐京造 K2,少有的低价且匹配 Mac 系列的机械键盘了。</p><p>好的工具,可以极大提高生产力和舒适度。而且工具往往不容易坏,可以用很久,一次投入长久享受。比如降噪的耳机、电瓶车的锂电次、高价位的床垫等等。</p><hr><p>希望孩子有一天可以出国学习,出去后,就别回来了。这个事呢,多说无益,鸡同鸭讲。<br>我就是担心那一天真的到来了后,我经不住亲人的劝阻,我希望我能够坚持下去。<br>我想了一下,如果我不坚持,孩子应该是没有机会出去的。</p>
☑️ ⭐

我的 2021

<p>转眼一晃,一年又过去了。我和孩子都长了一岁。不过我们成年人感受到的时间飞逝,和孩子有一些异同。<br>孩子在一年过程中,是没心没肺的玩耍娱乐,这些经验和快乐,有些是没有记忆的,比如哪一天的楼下滑车。有一些是潜移默化的,比如哭闹后的面壁,让孩子对道理有深刻认识。对于孩子而言,一年中的经历,是无形中植入的种子,谁也不知道哪一天会发芽,或者早已经在孩子成长的过程中生根。其中弊利,谁也无法能给个断定。因为孩子的可能是巨大的,谁又知道这一刻的同伴辱骂,会让其走向懦弱暴躁或者虚怀若谷的两个极端,抑或只是无声无响等待被抹除的记忆?<br>我们成年人的一年和孩子是不一样的体感。一年的时间,并不是一个成年人的基本单位。有人一无所有,有人衣食无忧,有人捶胸顿足,有人把酒言欢,诸多改变,很可能都不是一年之内养成的。一个赌博的习惯培养了十多年,才有可能让一个中年人一夜走向穷困。一个二十多年的烟民,才可能在短时间内走向生命尽头。我们对一年内发生的每件事,都有自己的思考和认知,是有明确的利弊权衡,这和孩子的被动接受是有区别的。</p><p>时间是极为可怕的怪物,对任何事物都有一致的光阴长河。比如铁片在生锈、沙漠在升温、高山在变矮,孩子在长高等等。在光阴长河里,万事万物都在同一个度量单位里面平滑的向前移动。这种温水煮青蛙的方式对于万事万物都是一样的刻量,有生命的、有物质形态的甚至虚无缥缈的万事万物,都随着时光的流逝,不同程度的发生了不可逆转的变化。<br>对于我们这些置身于怪物掌控下的一粒沙来说,短时间内有大的行为波动是不现实的。就像那些一年内暴富的机缘,不可遇更不可求。我们都是在一步步的被时间打磨,一年时间,说长不长,说短也不短,值得做一个总结和回味,也值得在以后的岁月中慢慢咀嚼,毕竟人生能有几个一年?</p><p>又一年过去了,我也慢慢逼近三十岁的门槛。2021 年,不是一个平坦年,有人欢喜但更多的人是哭。我没啥机缘,所以没有啥特别欢喜的,感觉这一年也都是水到渠成的故事。哭呢,悲惨的事情也都没有发生在我的身上,我也没有哭的必要。当我觉得又得过且过了一年的时候,我还是想回顾一下,就翻看了年度相册作为事件源,发现能写的东西还是非常多的。个中甘甜与辛酸,均冷暖自知。</p><span id="more"></span><h3 id="个人篇"><a href="#个人篇" class="headerlink" title="个人篇"></a>个人篇</h3><p>我现在很胖了,体重直线往上升,160 斤的体重,看得我瑟瑟发抖。今年工作压力很大很大,烟酒没有停过,饿了么外卖的年度账单里面搞到小 5K,大部分都是夜宵了。<br>我 2020 年 9 月进入这个集中营后,试用期 3 个月,就开始了正式工的一年,这一年恰好都是在 2021 年经历的。工作不如意十有八九,晚上回到家就要吃东西喝酒减压,第二天继续集中营的生活。就这样,体重从 130 升到了 160,还没有停下来的意思。</p><p>今年我做了一个重大的外观上的改变,就是留长发了。之前也都是短长发,这一次我扎了辫子,我很喜欢。除了老婆,也没有人支持我,所幸在自己的坚持下,没有放弃。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061849161.png" width="30%"><br>今年依旧没有驾照没有车,感觉后面几年也都不会有。其实我心里很想骑机车,十一回老家打算搞一个摩托车驾照的,家里弄这个驾照很方便,但是老婆担心骑车危险,没让搞。C 照嘛,我和老婆都没有开车的兴趣,也都没有学。每次外出都是骑着电动车带着老婆孩子,天冷的时候挺受苦的。有一次带着口罩骑车的场景很像猩猩,老婆孩子笑了好久。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061852460.gif" width="30%"><br>今年身心感觉不是很健康,和老婆说过想找个心理医生,后来也作罢了。公司也有免费的心里医生可以咨询,其实想的话完全可以去咨询。只是中国人的通病吧,感觉心里问题羞于表达和外漏,也不愿意和其他人诉说。</p><p>烟酒和夜宵的刺激,我现在身体差的厉害,自己也感觉到了。想着戒烟戒不掉,现在也开始习惯电子烟了。家人都反感我抽烟,尤其是爸爸,说世代没有抽烟的,出了我这么一个烟鬼和酒鬼。我听的长了,也就不感冒了,我知道烟酒也都是上瘾,和毒品类似。但是每当有烦心事的时候,我真不知道除了烟酒还有啥可以帮我减压,当然这也是我这个烟酒为自己的狡辩吧,毕竟不抽烟不喝酒的人那么多。</p><p>脱口秀看了一段时间,最后没有养成习惯。脱口秀里面都是段子,可是那些段子和抖音、视频一样,看了就忘,没有知识性,几乎没有价值。有几个晚上,我就刷着社交软件里面的短视频无限 feeds 流刷到大半夜,过后又发现毫无价值。带来了瞬间的笑点,可是过后的空虚和对于时间流逝的懊恼远远大于那个笑点带来的开心。那些不是愉悦,因为愉悦肯定是持久的,至少也会持久那么几个小时或者几天,不会像脱口秀和抖音那样。</p><p>《剑来》断断续续的看了不少,后面换成 kindle 看了。kindle 看书的确很爽,剑来写的非常不错。目前觉得好看的小说,屈指可数。有诛仙、哈利波特、平凡世界、鬼吹灯、三体这些,这一次到剑来了。这些小说,都不应该拍成影视,否者不仅仅侮辱了小说,也侮辱了看节目的人。可是总有很多资本,想着把那只欲望的手伸到这伟大的故事当中,然后一顿掀桌子。中国影视真的不能再差了,再差下去,就改叫媒体吧。</p><h3 id="家庭篇"><a href="#家庭篇" class="headerlink" title="家庭篇"></a>家庭篇</h3><p>连续两年没有回家过年了,疫情给我们带来的影响还是很大的。<br>这一年也没有啥地方玩,远的不方便走动,近的玩了一遍又一遍。2020 年过年期间西溪湿地免费开放了,我带孩子去转了一圈,不好玩,2021 年不免费了,也就更没去了。其他游玩的地方,屈指可数,宝寿山、湿地博物馆、福堤、青山湖、南湖、西溪旺角这些。</p><p>吃的话,还是找到了好去处,就是菲吃布渴,我们吃了很多次,每次去都吃很多螃蟹,我非常喜欢那边的刺身和白葡萄酒,我现在超爱刺身了。其他的就是简单吃一些了,有羊老三、大骨头、汉堡王这些。大渔铁板烧是挺让人失望的,我去过几次,因为团队聚餐。我带老婆去过一次,老婆也是很不喜欢,还死贵,和菲吃布渴比起来差距太大。</p><p>今年还有一个比较重要的事情就是房子,房子交付了,年底前也全部装修好了,打算 2022 年中搬过去。装修找的远亲,也给了我们很多优惠,装的是很不错的,加上家电等杂七杂八的,目前总费用在 16W,还有一些家电没有买,打算入住的时候购置。房子整体是简洁风,客厅留了很大的空给孩子玩耍,装了一个大桌子用作吃饭和办公,加了一个墙柜用来放书和手办,整个客厅的家具目前都是木质的。对电视没有大的渴望,也就没有装,但也预留了投影仪的空。主卧没打算放床,单独买了金可儿的 2mx2m 床垫放在地板上,这一点的确没有一个人同意我,但是我还是坚持了下来。次卧软装还没有弄,打算搬过去后,让孩子选择她自己喜欢的装修风格。整个装修过程还是挺麻烦的,我 sketch 一遍一遍出图,计算沙发、大桌子、墙柜等等的位置,就怕弄错了导致杂七杂八的一些后遗症。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061853232.png" width="30%"><br>房子交付了,老婆也把她的户口迁过来了,主要还是为了孩子上学方便。迁户口迁了好几次,折腾了不少时间,因为社保原因花了 4500 左右。</p><p>今年整体来说,和老婆关系还是很和谐的,没有上一年吵架次数多。和老婆结婚 4 年多了,大家也都相互了解和理解了,更多的是我们相互都是尊重对方的,这一点难能可贵。老婆主要是教育孩子,孩子的成长的确很不错,至少比我们小时候好多了,一代比一代好吧。老婆总是埋怨性生活质量太低,一来这个出租房的床真不好,再者我也发觉当压力大的时候,对性的渴望也会降低。这一年我的压力是不少,来自很多方面。</p><p>闹闹已经陪伴我们有 6 年了,它给我们带来了很多快乐。因为闹闹比孩子大,现在孩子也会开玩笑的叫它姐姐了。经常我们出去吃饭,有骨头也会带回来给它。每次去菲吃布渴,我都会带两块羊排回来,它吃的可开心了。现在闹闹拉屎习惯是养成了,出去遛狗得拉 2-4 次屎,最后一坨呢,我们不睡觉它不拉屎,灯关了趟被窝了,阳台就飘来一坨臭屎味,可厌烦人了。后面搬到新家了,得给它弄个好窝。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061854044.png" width="30%"><br>我和父母没有常见面,更少有聊天,这一年尤其明显。他们经常开视频过来看孩子,也都是我老婆和孩子与父母聊长聊短。一来每次视频我都不在家,其次也是我刻意躲避他们。爸爸很厌烦我抽烟的,10 月份还给了我最后通牒。每次说我就有些烦,可是我又戒不了烟,也不敢面对他们。因为当年买房子花光了积蓄,当时给双方父母都购置了保险,又交了一年。</p><h3 id="孩子篇"><a href="#孩子篇" class="headerlink" title="孩子篇"></a>孩子篇</h3><p>孩子明显长大了好多,每次到电梯,她都说自己能碰到哪一层的按键了,之前都不行。以前我都是叫她 “汤圆”,现在已经不自觉的在 “汤圆” 和 “安歌” 之间轮流喊了,尤其是生气的时候。今年是孩子成长最快的一年,出乎想象。</p><p>孩子上学了,中班,上了半个学期了。就这个幼儿园,孩子哭了差不多两个月才适应下来。孩子不想上学,经常和老婆说 “我不想上学了”,一到周末就很开心,到周一就很沮丧,像极了我这个上班族。<br>给孩子报了跳舞的班,孩子很喜欢,很多次给我们表演劈叉。当时报班,只是想让孩子从另一个方面了解规则,以熟悉和适应学校规则,因为她非常不喜欢上学,在学校也很不老实,到没想到她喜欢上了跳舞。有次老师给老婆发消息,说安歌不好好上课,还挑唆班里一个同学说要上卫生间,结果到卫生间两个人聊天去了。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061857249.png" width="30%"><br>孩子还学会了我到现在都不会的技能,一个是轮滑,一个是跳绳。这都让我有些惊讶,她现在轮滑可厉害了,至少我是这么感觉。<br>令我吃惊的是,孩子现在已经很安稳的骑车了。我教了她半小时左右,两轮子的车她完全上手了。在看到她骑车的时候,已经非常熟练了。想当年,我还是在 3 年级左右学会的那种超大的横杠自行车,有横梁的那种,就一只脚斜跨进三角形的横梁区域然后半蹬半蹬的那种。</p><p>孩子牙齿还是很不好,前段时间吃糖就粘掉了一颗牙。现在满口牙,除了 6 岁左右会换牙的那些,其他的都做了补牙或者根管治疗。生病次数倒没有多少,但滨江的儿童医院也跑了几次。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061858881.png" width="30%"></p><h3 id="工作-学习篇"><a href="#工作-学习篇" class="headerlink" title="工作 &amp; 学习篇"></a>工作 &amp; 学习篇</h3><p>2021 年是我在公司真真实实呆着的一年,有太多的辛酸,索幸是坚持了下来。这一年绩效没咋好过,两次都是 3.5。整体来说,就是瞎忙活,做些无足轻重的业务,可有可无,无关痛痒。<br>工作本身并没有给我带来过多的惊喜,除了内网的一些技术文章挺有意思,其他的我能接触到的范围内并没有多少让我心动,这也是我经常有跳槽想法的原因。每个人只要按部就班的完成自己的工作,就已经可以保障工作的稳定和体面。可这种非必要无激情的工作,多少让人有些乏味。</p><p>我在公司感触颇深的是人,工作上与同事的交往和对大多同事的心里评价尤为有意思。<br>同事很多是自私主义者,不管六脉神剑的企业文化如何熏陶,这是无法改变的事实。这也是很多同事工作困难的原因。<br>擅长甩锅和说半句话,甩锅不用细说,就是把那些自身的责任,想一万个方法强加到别人身上,比如工作内容和故障。这里着重说一下工作内容的甩锅,就是一项工作明明一位同学做比较合适,但那位同学就一万个理由不做,让别人来搞,我经历的一位就是说业务价值不高不想做,最后升到主管那位同学才接下来。<br>说半句话就有些微妙了,你能想象你和别人说话,对方说半话,剩下的不说了?让人云里雾里的谈话,十分让人迷惑。好像什么都说了,但又摸不着头脑。但是环境对一个人的影响很大很大,现在有些时候我说话也会说半句,因为这种行为,一来不给自己惹麻烦,二来对自己工作干扰量少,当然不到重要时刻,我不会这样,我感觉这样不违法但缺德。说半句话还有一个表现,是打错字。这一点我是深恶痛绝,总有人经常打错字,文字这种东西,不同的表达完全就是两个意思了,打字不分段还有谐音字,有时候完全不知道说的啥。</p><p>当然了,我不是站在吹毛求疵或者批评的立场来工作和学习,公司给我带来的成长是这些年最大的,真是一年更比六年强。在这里体验到了体系化结构化的工作方式,学会了远程办公的复杂多样性,熟悉了技术和规则同时保障项目稳定迭代的重要性,这些都是非常重要的宝贵经历,不愧是中国科技圈的黄埔军校。所以刚毕业的大学生能进一家对的公司,对人生有举足轻重的作用。</p><p>再说到这一年的学习情况,应该是这些年进步最大的。我生性愚笨且自知,所以学东西也不讲快,只能退而求其次做到熟知和理解。前几年打下了计算机基础知识的入门锤炼,今年有所收获,很多知识都像血液一样在我的身体里逐渐清晰明朗起来。比较重要的板块有 CPU、汇编、编译、操作系统、网络、算法等。书读了很多,对计算机的世界也越发了解和熟悉了。说到这些基础知识有什么用?其实用处真的很大,现在看不同的语言,都有一个客观的运行足迹在大脑中奔腾,不管是 C、C++、OC 此类编译语言,还是 js、java 此类解释语言,以及 java 和 js 为了进一步提高效率依靠 v8 和 jit 实现的运行时编译,我能想到他们这些语言本身,在历史发展过程中,在运行高效和开发高效之间的权衡,就像算法在空间和时间之间的不断权衡一样。</p><p>前段时间看到 C++ 的模板,有编译期间显示化。即下面这样:</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// templatedemo.hpp</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Swap</span><span class="params">(T &amp;a, T &amp;b)</span> </span>{</span><br><span class="line"> T temp = a;</span><br><span class="line"> a = b;</span><br><span class="line"> b = temp;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// test.cpp</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"templatedemo.hpp"</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">test_m_p_test</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="type">int</span> a = <span class="number">3</span>,b = <span class="number">4</span>;</span><br><span class="line"> <span class="type">float</span> c = <span class="number">5</span>,d = <span class="number">6</span>;</span><br><span class="line"> <span class="built_in">Swap</span>(a, b);</span><br><span class="line"> <span class="built_in">Swap</span>(c, d);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// main.cpp</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"templatedemo.hpp"</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> * argv[])</span> </span>{</span><br><span class="line"> <span class="type">int</span> a = <span class="number">3</span>,b = <span class="number">4</span>;</span><br><span class="line"> <span class="built_in">Swap</span>(a, b);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>上面在<code>templatedemo</code>头文件中编写了模板,在 test 目标文件编译期同时生成了 Swap (int,int) 和 Swap (float,float) 类型的函数,又在 main 目标文件编译期生成了 Swap (int,int) 函数。我当时就有疑问,这难道不会函数命名冲突吗?我打消了函数签名不一样所以共存的想法,因为书上的确说最后只会生成一个 Swap (int,int) 函数。于是我开始通过汇编查看细节,发现这两个目标文件中函数签名的确是完全一样的,最后生成的可执行文件真的也只有一份,另一份无缘无故消失了。简单验证后发现,C++ 编译器在链接阶段,完全根据函数签名仅仅保留了第一个函数,把后面同名的函数都 pass 了,所以在这种场景下,如果两个函数的具体实现不一样,也只会保留一个,莫名的 bug 就这样产生了。我当时就顿悟了。<br>上面问题,我从产生疑问到最后顿悟,总耗时在半小时以内。如果对于编译流程和汇编不熟悉,一来无法短时间知道真相,二来也无法理解彻底。</p><p>前段时间捡起 java 语言看了看,也很快就走马观花般停止了。不是难以理解不看了,毕竟我大学写了一年多 java 有些印象只是现在淡忘了。而是发现 java 也非常容易理解,和大学时期学习 java 时候的苦恼简直天壤之别。万般语言均是为了业务服务,说到底还是在特定场景下有各自的生存空间。而这些语言在各自领域有了一定影响力之后,又开始做大做强压榨 CPU 和内存。<br>高级语言真的没啥贵贱之分,只是在特定业务场景下的产物,最后又约束在特定的语言范式下,说到底 C 和汇编才是中流砥柱。因为硬件资源组合是多样的,不同资源的速度又是有差异的。所以才会在不同场景抓住不同的资源有的放矢。所有语言都是在安全性、可移植性、高性能三者之间做权衡,性能这块又有抓 cpu 性能和内存、硬盘、网络资源性能的。</p><p>这一年看了不少书,还有两个在线平台,他们给了我很大帮助。不少书和文章都是看了一遍又一遍,比如《程序员的自我修养 - 编译链接 &amp; 库》。极客时间和 C 语言中文网,做的都是非常不错的。这几年在知识上的资金投入还是不少的,也是值得的。随着了解知识的增多,也越发感觉到焦虑,越感觉到人生的渺小。那一眼望不到头的专业领域,就如盲人摸象一般,进不去,也无法探知。或许到了一定年龄,就得想着抛弃了,抛弃那些自己明确要抛弃的,抓住那些自己明确要抓住的。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061859541.png" width="30%"><br>对自己失望的是,2021 年一篇技术文章都没有产出。来年得补上。</p><h3 id="心境-认知篇"><a href="#心境-认知篇" class="headerlink" title="心境 &amp; 认知篇"></a>心境 &amp; 认知篇</h3><p>多重人格,我承认我是失败了。因为我不愿意在多个人格之间切换,我还是想做我自己,何必苟且呢。欣喜的是我发现我其实并没有社交恐惧症,或许有那么一丢丢,但我还是挺喜欢和各种人交往的。我更大的主观驱动性是喜欢独处,我内心渴望有一个安静的只有我的空间,在那个空间里,或许我什么都不用干,也可以看书或者打游戏。</p><p>一年里心境有些破碎,关于未来和家庭。我很恐惧未来的路该往何处,也担心孩子和家庭以后的生活走下坡路。我想做一些事情来弥补,就一直看书学习,以此来打磨心境。因为看书学习的时候,会不自觉的专心起来,就忘记那些杂七杂八的担忧。一觉醒来,就又上班了,上班也没有时间考虑那些了。今年,希望能找到出路,在这条路上有稳定的收入,但何其难哦。</p><p>我在碎碎念中多次提到这是一个糟糕的时代,我并不是站在自己的角度来考量这个问题。即便能看到我这个文章的你,生活都不会差。因为那些年收入在 10W 及以下的,可能真不会翻到这篇文章,而 10W 年收入,就能保障在这个时代不会混不下去了。你或许会认为自己过的不如意,但是你已经活的很好了。这是一个糟糕的时代,有太多太多的人每天行走在崩溃之间,他们在绝望之中找不到生命意义。也有太多太多的人,从来没有考虑过生命意义,他们仅仅如行尸走肉般的生活工作着,他们缺少一盏思考的灯。国家并没有多富强,社会也没有那么包容,家庭并没有那么温馨,个人也没有很多尊严,这才是大家应该看到的真相。黑客帝国是每个中国人都应该观看和思考的一部电影,我们每个人都如那些肉体存放培养皿而思想被禁锢在虚拟网络。有人觉醒了,觉醒的人需要被消灭,有人逃出了,锡安也要被一锅端。我对于媒体和政府,就是希望能说真话,能解决问题,但显然已经一年不如一年,越来越猖狂和明目张胆,法律已经在荷枪实弹的保护下走出笼子,面向世人张牙舞爪。<br>我以前有一个愿望,是希望将来有一天,能够拿出一部分钱,组织一批有才能的人定期向偏远地区的孩子们说教。给这些孩子说城市的模样,给他们说人生的理想和意义,给他们说个人的责任。近期我这个想法动摇了,一来源于我对自己未来的担忧,还有就是我感觉到自己的无能为力。这根本不是一个小工程,我只是在杯水车薪。其实但凡国家层面能稍微放开一点,这些孩子的心性都会变得不一样,可惜那个层面是如此的牢不可破,万般皆蝼蚁。诛仙中有一句话:天地不仁,以万物为刍狗。<br>所幸的是,我个人没有丝毫影响力目前,但有很多有影响力的自媒体们,虽然赚钱是一部分,但还是在努力的奋斗着。他们深爱着这片土地和人们,也有一股倔强的心境。他们在通过各种委婉的方式,在唤醒那些 “肉体存放培养皿而思想被禁锢在虚拟网络” 中的人。</p><p>今年政府出台了很多政策,让各个公司存活的极为困难。我个人觉得这是不合理的,这是通过权利影响经济,而经济是所有文明发展的首要条件。中国的监管,像胡闹一样,该监管的不监管,不该监管的一头劲。我是一个愚人,都知道自由经济和改革开放才是时代发展的命脉,现在的监管更多的感觉是在示威而不是进步。<br>比如那教育行业,孩子是最重要的财富,教育是必不可少的。孩子的压力不是来自教育,而是来自环境。因为环境让大人焦虑,大人才通过教育希望孩子的未来上一个台阶。现在教育没有了,孩子的未来又在哪里?而大人的焦虑有哪怕一点降低吗?不降反增!这种已经明确先有<code>问题A</code>然后引来<code>灾难B</code>的逻辑问题,现在不解决 A,把 B 一刀切,这就是从源头斩断了那些未来有可能跨阶级升迁的孩子们的路。再者,教育难道不应该是国家层面出力吗?良好的师资力量、良好的教育环境、保障孩子的学校饮食健康和营养、保障孩子思想的开放等等,哪一个不应该是应该大力发展的方向?可是呢?有些孩子求爹告奶都不能有一个学校接纳孩子,最基本的教育入口都不开放,这才是现状。我的孩子 2022 年要上大班了,因为搬家肯定是要插班的,可是那边之前中班都不让我插,我把那边的幼儿园都跑遍了,那些老师的口气可严肃了,我感觉不到为人师表教书育人的影子,我也对几个月后孩子能否继续上学感到怀疑。这就是我正在经历的现状,那些一口一句 “来生还做中国人” 的同胞们可以换个角度思考一下,“满足一定条件才能入学” 这样的规则,真的合适吗?满足了一定条件就能入学吗?人多资源少是老生常谈的原因,你有想过资源到底有多少?或者资源是不是没有那么少?什么事都怕问一个问什么。中国的教育,埋葬了太多的学生。而思想解放更是社会进度国家强大的第一的生产力,可这堵墙偏偏是牢不可破的,就更不用提了。<br>还有那游戏行业,中国已经好久没有通过游戏审批号了。就是说国内,很长一段时间没有任何一款游戏能够上架。估计有近一年了吧,而这还会持续下去。即使在之前有通过版权号,能通过的也是寥寥。相信 “影响孩子身心健康” 作为理由人们,你们想想如果因为孩子就把整个游戏行业打压,那孩子的地位得是多少的举足轻重啊,可现实呢?孩子和妇女的地位,真是草菅人命不为过。<br>这里还想多嘴一句,很多人说女性现在翻身做主人了。这些翻身做主人的女性大多有中专以上教育,他们是靠自身的知识底蕴找到了不低声下气的勇气,他们在一二三线城市生活着。中国面积太大了,太多太多的女性还在水深火热当中,没人报道,无处伸冤。很多人觉得都什么年代了,还有家暴?还有欺凌?但凡媒体能够稍微公正一点,都会颠覆很多人的认知。即使在法律上,买卖妇女的代价都很低,妇女不如狗。法律当然也在不断完善,可这都什么年代了…… 这基本的人权还没完善好?良好的社会肯定是男女平等的,只有那一天,你生了男孩不担心以后媳妇欺负他,你生了女孩不担心以后丈夫孽待她,你没有子女婚姻的安全层面顾虑,那才是男女平等了。因为这样至少可以说明,法律可以让作出欺凌的一方接受到惩罚。能够看到我这篇文章的路人们,我就默认你一定接受了足够的教育和一定的生存技能,相信我,只要你有了孩子,尤其是女孩,你一定会担心她以后的婚姻安全问题。你甚至不担心她婚后会不会生活受苦,因为你想着真不行还可以帮他们些,但你一定会担心她被家暴。</p><p>这是一个混乱的时代,国家和人民都挺疯狂的。我一两年前是不相信很多言论是网上的键盘侠们发出的,我以为那是水军。我甚至还会嘲笑朋友说 “你们不知道,那不是真实用户写的,那都是水军发出来的”。但是当我发现那是真真实实的用户敲打出来的言论后,我就内心崩塌了。疯狂的不仅仅是国家层面,还有很多人民,一个愿打一个愿挨。鉴于那些人民也都不会看到我的文章,我也假装不担心他们会来骂我。我希望有那么一天,思想能够开放,让人做人,让人们富足,让社会和谐,让国家强大。</p><p>有一天,我带孩子去公司玩,公司有大绿人雕像,我让孩子在雕像脚下拍了照。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202308061903779.png" width="30%"><br>这个照片我发了朋友圈,老婆说雕像有私部暴漏,影响不好,让我删掉。老婆的思想其实挺开放了,我们甚至都带着孩子举办的婚礼,在很多方面并不受思想的约束。但这次的雕像照片还是觉得有忌讳。我就觉得我应该说些本应该被大众接受的思想,性就是一个方面。<br>性,是美好生活的代名词,这世间还有什么是比性更伟大的吗?没有性就没有人类的繁衍和文明的传承,你说伟大不伟大?性不应该羞于表达,性教育是从孩子时期就应该教育起来的。<br>我在初中对性的感知是见到女同学会害羞,高中知道精子卵子结合方式,大学知道自慰和性释放,结婚前和老婆有了性行为。我感觉这很落后了,周围所有人都对性绝口不提,认为那是不入耳目,认为那是洪堤野兽。爸妈可能以为我知道了,大部分朋友以为我是懂装不懂,可我真的是不知道。<br>很多人说性不能大势宣扬,那会引发很多人的罪恶。那些由性引发的邪恶,应该被法律制裁。如果有人胆敢跨越法律,就需要承担后果。所以现在就有一个问题,就是法律不触达,那么就把性关押起来,不让说不让提让其变成羞耻。这难道不应该由法律来管辖吗?法律你不干好自己的事情是为啥?要你法律何用?<br>你有勇气和朋友说你的性生活一周几次,每次多长时间吗?你觉得这是个人隐私不说完全没有问题,但当你想说又因为害羞、不好意思等原因刻意压制不说,就像羞于看心理医生一样,这就是问题。性这样伟大的事物,应该和大米、吃饭、长河一样的地位存在,没有性,就没有人类。<br>如果哪一天,性能够在日常街道上被自由讨论,那一定是文明的时代。</p><h3 id="杂项"><a href="#杂项" class="headerlink" title="杂项"></a>杂项</h3><p>2021 年,我自身和周围环境也有一些变化,有些值得一提。</p><p>好朋友离婚了,离婚原因也很复杂,但离婚后的烂摊子,感觉好朋友前半生是毁了。孩子和母亲生活,好朋友虚无缥缈的只剩下无处安放的房产,心境几近崩塌。他想着挽回婚姻现在看来是没有希望,他为了挽回婚姻考了很多次编制目前也没有结果。好朋友的壮年时期是悲喜交加,如今孤独在城市里生活。</p><p>好朋友结婚了,今年参加的唯一一场婚礼。她是一个性格要强的女孩子如今也趋于平静,初中高中都很刻苦,但学习一直算不上优秀。同龄人也都结婚生子了,我们这一辈,都奔 30 了。</p><p>对春晚的态度,发生了翻天覆地的变化。小时候,我妈妈会看春晚的前半场,我和爸爸哥哥一定会看完整场春晚,到那个难忘今宵。最近几年越发破了家庭规矩,对春晚有些冷漠,今年的春晚,就一眼都没看了,甚至目前已经过去快一周了,一个场景画面都没有去查看。也不知道谁主持也不知道谁表演,随它去吧。我实在是厌烦了那份太平粉饰一片安好,也实在厌烦了朱门酒肉臭路有冻死骨。小时候我父亲每晚一定要守在新闻联播前观看,有时候我会闹着换台,父亲就会生气。好久不在父亲身边了,也不知道他是否还有这个习惯。难说,家里一直很忙,而且父亲有了手机后网络资讯也丰富了,不定还会看新闻联播。希望他不看了吧,父亲是聪慧的明白人,可有些事情他没法知道和想象。</p><p>还有大年初一 1:3 败给越南的男足吧。这有什么好说的?其实也没啥,人民早已经没有底线了。中国一直在弱势项目中发力,国际运动会上,啥跳水、射箭等运动,就经常看到中国身影。可是强势运动,比如篮球、足球这些,中国就草草收场了。这也是国家的战略吧,只是当运动不能全民,当运动变成利益只为了面子表现,当运动失去它本来的意义,运动还有它存在的意义吗?男足是个例外,纳税人的钱是真花了,效果在哪里?真要比拼努力,那么努力一定是有收获的。比上不足比下有余嘛,这点我还是有体会的。所以男足这个怪圈,运动员自身的问题或许并不大。</p><h3 id="来年想法"><a href="#来年想法" class="headerlink" title="来年想法"></a>来年想法</h3><p>新的一年,也有一些期待。自己对未来的迷茫,也希望能够稍微找到一个入口。列一下吧:<br>个人:</p><ul><li>体重到 150kg</li><li>适当锻炼</li><li>烟少抽些</li><li>稍微找到离开迷茫的入口</li></ul><p>家庭:</p><ul><li>安稳搬到新家,家具等软装购置完成,次卧和书房安装完毕</li><li>和老婆吵架不要太剧烈,不上升到父母(老婆上一次和我争吵说是故意的,因为不吵架有些事情不好解决,不吵架生活没激情,,,)</li></ul><p>孩子;</p><ul><li>买一个 6-8 岁的山地自行车</li><li>顺利进入大班插班</li><li>练习跆拳道</li></ul><p>学习:</p><ul><li>写作能力提升(产出 5 + 文章)</li><li>英语能力稍微提升</li><li>设计模式</li><li>编程范式</li></ul>
☑️ ⭐

【旅游】沿海旅游 (威海、青岛)

<p>最近难得休了一次长假,计划和家人出去旅游。近十几年来,基本没有什么旅游经历。如果公司团建也算旅游的话,那也可以算增加一些经验值。<br>老婆说一直想看海,于是趁着旺季,把山东的威海和青岛逛了一圈。</p><p>简单记录一下威海和青岛两座城市的备忘,给有缘人。<br>威海主打的就是海,政府也对旅游提供了较大的支持,建设了一个环海公路。<br>去威海旅游,一辆电瓶车就可以解决一大半行程。有很多租电瓶车的地方,60 元 / 天。<br>沿着环海公路,可以直接从国际沙滩骑到海上公园,6 小时可以玩完,整个旅途都适合小孩子。<br>住的话,一定要选择在韩乐坊附近,最好距离韩乐坊 500-1000 米以内。这个位置距离海边也近,晚上有比较多的活动选择,尤其吃喝方便。<br>华夏城那里有一个小孩子的户外娱乐场所,非常棒。玩累了可以带孩子去耍,只在白天开放。</p><span id="more"></span><p>青岛虽然整体是比威海好,不管是娱乐设施还是沙滩环境。但几个著名的景点,并没有什么惊喜的特色。<br>因为缺少短途的交通工具,不如威海玩的开心。旅游景点都有地铁,但走路还是需要一些时间的。行程上比较累,不痛快。<br>崂山有些失望,作为著名的旅游景点,并没有什么特别的地方。</p><p>旅途中,住宿是一个大难题。一定要提前预定住宿,防止临时找的房子太差。<br>住宿不好,绝对会影响整个旅游的心情。尤其房间有异味、拥挤、破旧。千万不要因为房子,耽误了旅游的心情。<br>旺季的时候,房子普遍偏贵,威海和青岛我预定的都是 400 元 / 晚,不算贵。<br>提前花时间挑选,面积也都比较大,30-40 平米左右。环境也较好,整体都是很满意的。<br>因为有孩子,衣服比较多,我选的也都是民宿,有洗衣机。如家等经济酒店,是没有洗衣机的,而且面积偏小。<br>有几个技巧,一是用美团订房,多看评论。飞猪在定房赛道上被美团打趴下了。<br>二是预定多天,鸡蛋分开放虽然可以抵御风险,但提前规划好,还是可以一次选到好房源的。玩累了早上会睡懒觉,中午搬家会很麻烦,不要给旅途凭添麻烦。</p><p>这次旅途,吃的上面并没有带来惊喜。海鲜是挺多的,但各地都能吃,这里也没有便宜太多,顶多算新鲜。韩国烤肉还算可以,不过不算惊喜。青岛一厂的啤酒是挺不错的。<br>我们基本去的都是 top 餐厅,怕踩坑。但没有被什么美食惊艳到,挺出乎意料的。</p><p>路途上,基本超过 1 公里,就会选择打车,这样会比较轻松,也节省时间。<br>高德打车发展的真不错,车源很多,是可以和滴滴拼一拼了。但是论服务质量,还是滴滴的优享专车更好一些。</p><p>还有一个很重要的点,就是旅游地点规划,一定要提前做。有些景点会来不及去,但一定要提前规划有哪些景点可以逛。<br>这样可以更好的做时间排挡。</p><p>最后一点,关闭钉钉、微信通知,工作会扰乱旅游的心情和节奏。</p><p>旅游,如果仅仅是看风景的话,意义看起来不大。至少我这几天已经疲惫。<br>美食、山水、风景、花草、乐园等等,各个地方都有,千篇一律。除非没见过山海的,可以多认识这个世界。<br>如果在不同的风景、环境中,有不同的成长和感悟,就非常棒。<br>单纯行千里路,卵用没有。</p><hr><p>旅途中,看到国内出现抢盐了。什么时候,才能不听到这些搞笑、诡异、荒诞、离奇的全民运动啊。<br>一天天的,一年年的。<br>有日本华人在朋友圈拉黑了很多国内人,说这是一次清洗的机会。<br>也有很多国内人去干预日本店铺,说是爱国和惩戒。<br>一群人看着另一群人,相互认为是小丑,这是平行的世界,近几十年是无法调和了。</p><p>不在乎你生死,也不会关心你健康。自以为的守护神,手里可是一直拿着镰刀。<br>说辐射致癌,不少人买了仪器来测试周边风险,发现本身就超标 N 倍。这样的套娃喜剧,什么时候才能够结束啊。</p>
☑️ ⭐

数字签名

<p>数字签名可以解决数据安全里面的<strong>完整性</strong>,<strong>身份认证</strong>和<strong>不可否认</strong>三大特性,但是解决不了<strong>机密性</strong>问题。机密性需要通过对称密钥/公私钥解决,所以数字签名其实和加解密/密文/机密性这些在概念上非一个层次。<br>签名的本质不在于加解密,而是加验签。<br>数字签名,<span class="exturl" data-url="aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnL3dpa2kvJUU2JTk1JUI4JUU0JUJEJThEJUU3JUIwJUJEJUU3JUFCJUEw">定义</span>上是<strong>拿着私钥的一方,通过私钥 X 对消息 M 进行加密 (加签),生成签名 N,并把消息 M 和签名 N 一起给出去。拿着公钥的一方,用公钥 Y 对签名 N 进行解密 (验签) 生成 M’。用消息 M 和 M’ 做比较,如果相等,则数据没有被篡改。如果不想等,则数据不再安全</strong>。<br>对于公私钥,我们一般是使用公钥加密私钥解密,这样可以保障单向数据机密性。而私钥加密公钥解密是解决不了机密性问题的,如果要通过公私钥完全解决数据机密性,则需要双向认证。<br>数字签名就使用了私钥加密公钥解密这套方案,所以数字签名是没有密文 / 机密性可言的。在数据签名里,一般把私钥加密叫做<strong>加签</strong>,公钥解密叫做<strong>验签</strong>。</p><span id="more"></span><h3 id="对称场景下摘要保障完整性"><a href="#对称场景下摘要保障完整性" class="headerlink" title="对称场景下摘要保障完整性"></a>对称场景下摘要保障完整性</h3><p>摘要和摘要算法就不解释了。<strong>摘要可以保障完整性</strong>,说的是对称加密场景下。<br>这里有一个疑问点,那就是对称加密场景下,数据本身已经安全了 (机密性)。即中间人无法解开信息,也就无法更改内容。这时候为什么还需要保障完整性?<br>这里说的对称加密,是排除密钥不安全的场景的。我们已经确定双方持有的对称密钥一定是安全的。这时候黑客虽然拿不到会话密钥,无法破解密文,但可以通过窃听收集到足够多的密文,再尝试着修改、重组后发给服务端。因为没有完整性保证,服务端会 “照单全收”,然后黑客就可以通过服务端的响应获取进一步的线索,最终就会破解出明文。<br>如果对称加密算法足够安全、对称密钥足够长、使用一次性对称密钥减少通信密文的数量,这些都可以进一步增加破解明文的时间。<br>但如果因为一些原因,没有上面的安全性保障,就有可能让黑客拿到足够多的样本,增加风险。这时候可以通过摘要来保障密文的篡改:<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202301021647506.jpeg"></p><p>有了摘要保障完整性,服务端拿到数据后就可以校验一下,不符合完整性要求就可以直接拒绝服务了。<br>从这里可以看到,摘要就是原数据<strong>小且精确</strong>的数据替身。通过这个替身只能做到<strong>数据完整性</strong>校验,对于身份认证这些就做不了了。<br>实际上单纯在对称场景下,是无法保障数据安全的。因为最多只能做到机密性和完整性,而无法确定密钥的有效性,即身份认证和不可否认。</p><h3 id="非对称场景下的摘要和数字签名"><a href="#非对称场景下的摘要和数字签名" class="headerlink" title="非对称场景下的摘要和数字签名"></a>非对称场景下的摘要和数字签名</h3><p>开头我们说到了数字签名的定义,从定义上可以看到,数字签名不依赖摘要。前面说到摘要是原数据<strong>小且精确</strong>的替身,既然是替身,那么数字签名就可以直接操作原数据避开摘要。<br>因为非对称加密的性能原因,公私钥对大数据的加解密是非常耗时的。有些数据可能达到几百 M 或者几个 G,用公私钥对这些原数据操作的代价是非常大的。<br>所以数字签名一般不直接对原数据进行加验签,而是通过摘要实现。数据签名并不一定非要使用摘要,但是一般都使用摘要。</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">性能原因主要发生在原数据过大的场景:</span><br><span class="line">1. 私钥加签耗时严重</span><br><span class="line">2. 签名过大,增加传输时间和流量,验签的相等性依靠字符串匹配算法,也会增加耗时。</span><br></pre></td></tr></tbody></table></figure><p>数字签名流程如下:<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202301021647508.jpeg"></p><p><strong>和对称场景下的密文/机密性/完整性不同,数据签名只用于非对称场景下的明文数据</strong>。即:<br>1.(完整性)我给了你一份明文数据,这份数据虽然大家都可以看到,但我通过数据签名可以保障给你的数据一定是完整的,不会被其他人修改里面的内容,篡改了内容你肯定验签失败。<br>2.(身份认证)我还可以保障给你的这份数据一定是我给你的,因为你用我的公钥解开了数据,如果不是我亲自用私钥加签,你那边不可能解开数据,验签肯定失败。<br>3. (不可否认)而且以后我也否认不了本次交易的事实。因为基于完整性和身份认证两个前提,你拿到的数据一定是我亲自给你的有效数据。我无法否认本次交易的数据内容和本次交易的存在事实。</p><p>完成这套机制的核心就在于,<strong>私钥是非公开的</strong>。因为私钥的绝对安全和单一持有,保障了加签人和加签数据的唯一性。</p><p>这里说数据签名用于明文场景,是因为数据签名定义上,就是使用私钥进行加签。但加签的数据可以被所有公钥验签后获取,所以没有私密性可言。这也符合非对称加密的特点,即单向安全。数据签名正好使用的是反向,自然就没有密文一说了。<br>非对称加密只有在公钥加密私钥解密情况下才是安全的,这就是单向认证。如果希望双方的数据都是安全的,就需要使用双向认证了。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202301021647509.jpeg"></p><h3 id="数字签名应用场景:PassKey"><a href="#数字签名应用场景:PassKey" class="headerlink" title="数字签名应用场景:PassKey"></a>数字签名应用场景:PassKey</h3><p>天下苦 登陆 &amp; 验证码 久矣。<br>passkey 无密码登陆,是相当期待的功能。目前 Google 平台已经全面上线,Apple 和 微软 都已经对 passkey 做了支持。<br>无密码登陆,就是通过在终端如 iPhone/Android/Mac/Window 上,建立一份公私钥。<br>注册的时候,将终端私钥上传到服务端。<br>登陆的时候,服务端给一个校验字符串,让终端来加签。最后服务端用当初的公钥来解签。能解开并且和校验字符串一致,则表示当前用户值得信任。</p><p><span class="exturl" data-url="aHR0cHM6Ly93d3cucGFzc2tleXMuaW8v">https://www.passkeys.io/</span> 已经做了 passkey 注册的 demo,我体验了一遍,效果很棒。部分流程如下:<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202307172322604.jpg" width="30%"><br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202307172322603.jpg" width="10%"></p><p>图中,是通过 iPhone 终端登录的。其实也可以通过 Mac 端直接登录,这样就可以少了换端的成本。<br>当通过其他端同步的时候,其实 chrome 浏览器是通过开启一个 socket 通道,使用中继服务器完成 passkey 的获取。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202307172322601.jpg" width="30%"></p><p>这里其实还有两个问题可以解答:</p><ol><li>终端的公私钥,该怎么保存?这里 iPhone 会通过端侧加密和 iCloud 同步的方案,在 Apple 生态的机子上共享。还可以分享给他人。Android 等终端也都有差不多的能力。</li><li>终端如何确保不是他人来申请 passkey 能力?这里一般通过指纹和面部识别,也可以通过其他硬件辅助验证。</li></ol><p>下面是整套 passkey 注册和登录的流程图:</p><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202307172332616.jpg" width="40%"><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202307172332617.jpg" width="40%"><h3 id="数字签名应用场景:SSL-(2025-01-18-更)"><a href="#数字签名应用场景:SSL-(2025-01-18-更)" class="headerlink" title="数字签名应用场景:SSL (2025.01.18 更)"></a>数字签名应用场景:SSL (2025.01.18 更)</h3><p>在 7 层网络协议里,SSL 分为握手协议和记录协议,分别处于表示层和会话层,主要负责网络数据的传输安全。<br>从对称场景下的摘要可以知道,对称场景下是没有身份认证的,这样就会使得密钥存疑。如果 A 和 B 通信的密钥被 C 给更换了,那么 C 就可以假冒 B 与 A 通信。所以 HTTP 退出了历史舞台。<br>非对称加密的双向认证是可以解决这个问题,但因为非对称加密耗时厉害,没有被有效的采用。所以就有了通过数字签名来传输公钥,通过单向安全性把临时对称密钥给到对方,而后双方使用对称密钥通信的策略。这就是 HTTPS (SSL / TSL) 使用的方案。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202301021647510.jpeg" alt="SSL/TSL 本身还是复杂的,上面只是简化流程,表达数字签名的用途"></p><p>HTTPS 的安全核心在于对称密钥 (或者种子) 的安全传输。根据非对称加密单向安全性,只要拥有公钥的一方生成对称密钥并把密钥通过公钥加密给到另一方,拥有私钥的对方才可以解开数据并拿到密钥,这样就安全传输了。<br>而数据签名之所以能传递有效的公钥,就是因为它具有完整性、身份认证、不可否认的特点。拿到的公钥,一定是安全的公钥,如果被动了手脚,一定会被发现。</p><h4 id="SSL-证书格式"><a href="#SSL-证书格式" class="headerlink" title="SSL 证书格式"></a>SSL 证书格式</h4><p>SSL 证书,是一个二进制文件或者 base64 文件,包含源信息(公钥、网站名称、有效期等)和数字签名(背书机构通过其私钥对源信息进行的签名)。<br>其中,每个 SSL pem 证书包含的公钥是当前证书管理者的公钥,数字签名是上级证书管理者对当前证书的签名。</p><p>对于用户申请的 SSL 证书(向中间 CA 机构申请)pem 格式,一般包含以下几个部分:</p><ol><li>证书信息:包含证书的有效期、颁发机构、域名、签名算法等</li><li>公钥:当前用户网站 / 域名的公钥(私钥也只有当前用户知晓,保存于用户的服务器,用于后续的 https 对称通信密钥的生成)</li><li>数字签名:中间 CA 机构私钥对当前源信息(证书信息 + 公钥 + Other)进行加签后生成的签名,用于验证当前证书完整性</li></ol><p>SSL 证书是通过证书链来进行验证的,下一级证书(中间 CA)的信息如下:</p><ol><li>证书信息:包含证书的有效期、颁发机构、签名算法等</li><li>公钥:中间 CA 机构的公钥</li><li>数字签名:根 CA 机构私钥对当前源信息 (中间 CA 证书) 进行加签后生成的签名,用于验证当前证书完整性</li></ol><p>根 CA 证书信息如下:</p><ol><li>证书信息:包含证书的有效期、颁发机构、签名算法等</li><li>公钥:根 CA 机构的公钥</li><li>数字签名:根 CA 机构私钥对当前源信息 (根 CA 证书) 进行加签后生成的签名,用于验证当前证书完整性</li></ol><h4 id="证书链"><a href="#证书链" class="headerlink" title="证书链"></a>证书链</h4><p>在具有安全效益的证书中,都是采用【证书链】机制的。即每一个【终端证书】,都是通过【根证书】或者【中间证书】签发的(层层签发)。<br>比如 A 网站,它向 M 中间 CA 机构申请 SSL 证书的时候,机构会提供证书链供下载,包括【A 终端证书】、【M 中间证书】和【根证书】。<br>用户 T 访问 A 访问的时候,服务器返回的 pem 会包含【A 终端证书】、【M 中间证书】,一般不用返回根证书,因为用户的电脑里面有【根证书】,这是信任链的源头。<br>证书链验证流程:</p><h5 id="正向解析证书链"><a href="#正向解析证书链" class="headerlink" title="正向解析证书链"></a>正向解析证书链</h5><p>浏览器根据 A 证书、M 证书,分析出 根证书,从而确定证书链:A -&gt; M -&gt; 本机根证书</p><h5 id="逆向验证证书链"><a href="#逆向验证证书链" class="headerlink" title="逆向验证证书链"></a>逆向验证证书链</h5><ol start="0"><li>默认相信本机根证书,这是信任的源头</li><li>浏览器根据本机根证书里面的公钥,验证 M 证书是否有效<br> a. 浏览器验证 M 证书有效期等信息是否合法<br> b. 浏览器根据 M 证书的签名算法规则,对【源信息】生成【摘要】<br> c. 浏览器根据根证书的公钥,对 M 证书里面的签名进行解签,得到【解签后的摘要】<br> d. 比较【源信息摘要】和【解签后的摘要】是否一致。若一致,则 M 证书有效。提取 M 证书里面的公钥进入下一层使用。</li><li>浏览器根据 M 证书里面的公钥,验证 A 证书是否有效<br> a. 浏览器验证 A 证书有效期等信息是否合法<br> b. 浏览器根据 A 证书的签名算法规则,对【源信息】生成【摘要】<br> c. 浏览器根据上一层验证拿到的 M 证书的公钥,对 A 证书里面的签名进行解签,得到【解签后的摘要】<br> d. 比较【源信息摘要】和【解签后的摘要】是否一致。若一致,则 A 证书有效。提取 A 证书里面的公钥进入下一层使用。</li><li>验证 A 证书有效后,后续的 HTTPS 通信就可以使用 A 证书里面的公钥来生成对称密钥了。</li></ol><h5 id="特别说明-交叉验证"><a href="#特别说明-交叉验证" class="headerlink" title="特别说明 - 交叉验证"></a>特别说明 - 交叉验证</h5><p>证书链的验证是一个链条过程,只要有一环验证失败,整个链条就会失败。这就需要根 CA 预先存储于本机中。<br>一般来说,操作系统和浏览器,都会主动的更新本机的根 CA 证书,但如果本机真的没有根 CA 证书,就会影响到证书链的验证。<br>比如 Google 在 2017 年也成为根 CA 发行机构,那就有可能出现一些机器本机根本没有 Google 的根证书,那么它发行的中间 CA 证书就无法验证了。</p><blockquote><p>Google 根证书:GTS Root R4, Google 中间证书:WE1, a.com 证书: A</p></blockquote><p>有一种交叉验证的方式,即 这里的 WE1 证书,不仅仅可以通过 GTS Root R4 根证书加签,还可能通过其他根证书加签(确保本机已经存在的根证书)。<br>这样,虽然本机没有 GTS Root R4 根证书,但是通过其他根证书,也可以验证 WE1 证书的有效性,进一步验证 A 证书的有效性。</p><h4 id="自签名证书"><a href="#自签名证书" class="headerlink" title="自签名证书"></a>自签名证书</h4><p>对于非 CA 机构签发的用于自行测试的【自签名证书】,有两种方案:</p><ol><li>先生成自签名的【根证书】,而后通过【自签名根证书】来生成所有的【终端证书】</li><li>直接生成【终端证书】</li></ol><p>采用方案一的话,直接把【自签名根证书】导入用户设备并信任,后续所有的【终端证书】都能够使用了,通常用在企业内部或者测试场景。</p><h3 id="数字签名应用场景:SSH"><a href="#数字签名应用场景:SSH" class="headerlink" title="数字签名应用场景:SSH"></a>数字签名应用场景:SSH</h3><p>SSH 全称 <code>Secure Shell</code>,即 “安全壳协议 “。SSH 突破安全枷锁的方式和 SSL 是一样的,相比来说少了<code>证书链校验</code>这个环节,即 Client 和 Service 需要自行保障公钥的可靠。<br>具体来说很直接,就是如果 Client 需要登陆 Service,第一次登陆的时候 SSH 工具会提示 Service 的公钥,人们需要看下这个公钥和 Service 那边公开的公钥是否一致。一致后 Client 侧会做公钥缓存,后面就不会再提示了。<br>其他的都和 HTTPS 是一样的了,通过公私钥确认对称密钥,通过对称密钥进行数据安全传输。</p><h3 id="数字签名应用场景:iPhone-App"><a href="#数字签名应用场景:iPhone-App" class="headerlink" title="数字签名应用场景:iPhone App"></a>数字签名应用场景:iPhone App</h3><p>iPhone 的 ipa 包,有非常多的安装限制,都是通过数字签名来控制的。Apple 使用的<strong>双重认证</strong>方案,即开发者和 Apple 公司同时提供公私钥签名,来使得 ipa 包不会被滥用和滥安装。<br><img data-src="https://cdn.jsdelivr.net/gh/yigegongjiang/image_space@main/blog_img/202301021647511.jpeg"></p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>数字签名是通过私钥加签,所有公钥都能验签,所以没有机密性可言。数字签名实现了<strong>完整性</strong>、<strong>身份认证</strong>、<strong>不可否认</strong>,而<strong>机密性</strong>则是通过对称加密 / 非对称加密来完成密文保障。<br>数字签名,是数据安全的基石。</p>
❌