<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>sanks</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://www.sanks-blog.com/icon.png</icon>
  <id>https://www.sanks-blog.com/</id>
  <link href="https://www.sanks-blog.com/" rel="alternate"/>
  <link href="https://www.sanks-blog.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, sanks</rights>
  <subtitle>知识付诸行动才有转换为能力的效果</subtitle>
  <title>sanks的博客</title>
  <updated>2026-08-16T13:10:00.000Z</updated>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="对象存储" scheme="https://www.sanks-blog.com/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="安全" scheme="https://www.sanks-blog.com/tags/%E5%AE%89%E5%85%A8/"/>
    <id>https://www.sanks-blog.com/evidence-presigned-url-access-audit/</id>
    <link href="https://www.sanks-blog.com/evidence-presigned-url-access-audit/"/>
    <published>2026-08-16T13:10:00.000Z</published>
    <summary>
      <![CDATA[<p>很多系统早期图省事，会把对象存储桶设成 public，前端直接拿 URL 预览图片和视频。开发快，但文件一旦变成「证据」，问题就来了：谁访问过、能不能撤回、链接被转发怎么办？</p>
<p>更稳的做法是：<strong>证据桶保持私有，前端每次预览或下载都通过业务 API 换取短期预签名 URL，同时记访问审计</strong>。</p>
<p>下文用脱敏后的巡检&#x2F;应急实践，整理这一访问模型。</p>]]>
    </summary>
    <title>证据预览不走公开桶：预签名 URL 与访问审计</title>
    <updated>2026-08-16T13:10:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="IoT" scheme="https://www.sanks-blog.com/tags/IoT/"/>
    <category term="MQTT" scheme="https://www.sanks-blog.com/tags/MQTT/"/>
    <category term="Redis" scheme="https://www.sanks-blog.com/tags/Redis/"/>
    <id>https://www.sanks-blog.com/mqtt-heartbeat-redis-ttl-device-presence/</id>
    <link href="https://www.sanks-blog.com/mqtt-heartbeat-redis-ttl-device-presence/"/>
    <published>2026-08-15T12:20:00.000Z</published>
    <summary>
      <![CDATA[<p>设备在线看起来简单：连着就在线，断了就离线。但在无人机、机库、传感器这类平台里，若让浏览器直连 Broker，或靠前端长连接判断在线，安全和一致性都难扛。</p>
<p>更稳妥的做法是：<strong>设备经 MQTT 上报心跳，后端消费后写 Redis TTL，前端仍用普通 HTTP 查设备列表里的在线状态</strong>。</p>
<p>下文是一套脱敏后的在线设计，不暴露真实 MQTT 账号、Topic 和设备编号。</p>]]>
    </summary>
    <title>设备在线不用浏览器长连接：MQTT 心跳 + Redis TTL 的在线状态设计</title>
    <updated>2026-08-15T12:20:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="对象存储" scheme="https://www.sanks-blog.com/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"/>
    <category term="数据治理" scheme="https://www.sanks-blog.com/tags/%E6%95%B0%E6%8D%AE%E6%B2%BB%E7%90%86/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <id>https://www.sanks-blog.com/evidence-center-object-key-migration/</id>
    <link href="https://www.sanks-blog.com/evidence-center-object-key-migration/"/>
    <published>2026-08-10T12:40:00.000Z</published>
    <summary>
      <![CDATA[<p>早期系统常把附件 URL 直接写进业务表。时间一长就会碰到：链路域名变更、临时签名过期、鉴权与审计无法统一。更稳的模型是：<strong>库里只存对象键（object key）与元数据，读取时再签发短期访问</strong>，并逐步演进成「证据中心」。</p>]]>
    </summary>
    <title>证据只存对象键：附件库到证据中心的演进</title>
    <updated>2026-08-10T12:40:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Framework" scheme="https://www.sanks-blog.com/categories/Framework/"/>
    <category term="AI" scheme="https://www.sanks-blog.com/tags/AI/"/>
    <category term="计算机视觉" scheme="https://www.sanks-blog.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    <category term="消息队列" scheme="https://www.sanks-blog.com/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"/>
    <id>https://www.sanks-blog.com/vision-detection-to-alert-pipeline/</id>
    <link href="https://www.sanks-blog.com/vision-detection-to-alert-pipeline/"/>
    <published>2026-08-08T11:55:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检场景里，模型打出「框和标签」只是起点；业务要的是 <strong>可分派、可抑制、可追溯的告警</strong>。与其把视觉服务直接耦合进业务库表，不如做成「检测事件 → 消息总线 → 告警服务」的闭环。</p>]]>
    </summary>
    <title>视觉检测如何接入告警闭环</title>
    <updated>2026-08-08T11:55:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Framework" scheme="https://www.sanks-blog.com/categories/Framework/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="Monorepo" scheme="https://www.sanks-blog.com/tags/Monorepo/"/>
    <category term="全栈" scheme="https://www.sanks-blog.com/tags/%E5%85%A8%E6%A0%88/"/>
    <id>https://www.sanks-blog.com/monorepo-small-platform-service-boundaries/</id>
    <link href="https://www.sanks-blog.com/monorepo-small-platform-service-boundaries/"/>
    <published>2026-08-03T10:30:00.000Z</published>
    <summary>
      <![CDATA[<p>当系统同时有三维前端、实时推送、领域业务、AI 推理时，「一个后端打天下」会很快失控。用 <strong>单体仓库 + 多服务边界</strong> 是一种折中：代码在一起好协作，运行时仍按职责拆开。下文给一种可参考的分工，不绑定具体产品名。</p>]]>
    </summary>
    <title>单体仓库里的小平台：前端与多后端如何分工</title>
    <updated>2026-08-03T10:30:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="安全" scheme="https://www.sanks-blog.com/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="OAuth" scheme="https://www.sanks-blog.com/tags/OAuth/"/>
    <id>https://www.sanks-blog.com/split-business-oidc-and-admin-jwt/</id>
    <link href="https://www.sanks-blog.com/split-business-oidc-and-admin-jwt/"/>
    <published>2026-07-27T11:40:00.000Z</published>
    <summary>
      <![CDATA[<p>不少平台会同时存在「业务用户」和「系统管理员」。把两套人马塞进同一个登录域，看起来省事，实际会在权限模型、审计与发布节奏上互相拖累。更稳妥的做法是：<strong>业务走企业级 OIDC，管理端走独立身份与 RBAC</strong>。</p>]]>
    </summary>
    <title>业务身份与管理端身份为什么要拆开</title>
    <updated>2026-07-27T11:40:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="MQTT" scheme="https://www.sanks-blog.com/tags/MQTT/"/>
    <category term="Socket.IO" scheme="https://www.sanks-blog.com/tags/Socket-IO/"/>
    <id>https://www.sanks-blog.com/socketio-scale-mqtt-cautious/</id>
    <link href="https://www.sanks-blog.com/socketio-scale-mqtt-cautious/"/>
    <published>2026-07-20T13:05:00.000Z</published>
    <summary>
      <![CDATA[<p>实时系统一忙就想「多开几个副本」。但 Web 推送和设备接入不是同一种扩展模型：Socket.IO 可以靠适配器水平扩展，MQTT 订阅端却常常必须是单活跃消费者。分不清边界，轻则消息重复，重则状态错乱。</p>]]>
    </summary>
    <title>Socket.IO 能扩、MQTT 慎扩：实时通道的多副本边界</title>
    <updated>2026-07-20T13:05:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="AI" scheme="https://www.sanks-blog.com/tags/AI/"/>
    <category term="Temporal" scheme="https://www.sanks-blog.com/tags/Temporal/"/>
    <id>https://www.sanks-blog.com/workflow-ai-streaming-without-storing-tokens/</id>
    <link href="https://www.sanks-blog.com/workflow-ai-streaming-without-storing-tokens/"/>
    <published>2026-07-13T12:15:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检分析、报告生成这类任务，既要边生成边展示，又要失败可重试、结果可审计。若把每个流式 token 都写进工作流历史，体积与重放成本都会爆炸。更干净的切法是：<strong>工作流管可靠结果，SSE 管实时观感</strong>。</p>]]>
    </summary>
    <title>工作流不存 Token：流式 AI 如何既实时又可靠</title>
    <updated>2026-07-13T12:15:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="架构" scheme="https://www.sanks-blog.com/tags/%E6%9E%B6%E6%9E%84/"/>
    <category term="SSE" scheme="https://www.sanks-blog.com/tags/SSE/"/>
    <category term="Gateway" scheme="https://www.sanks-blog.com/tags/Gateway/"/>
    <id>https://www.sanks-blog.com/sse-through-gateway-without-buffering/</id>
    <link href="https://www.sanks-blog.com/sse-through-gateway-without-buffering/"/>
    <published>2026-07-06T13:20:00.000Z</published>
    <summary>
      <![CDATA[<p>AI 对话、告警推送、长任务进度，这类场景常用 SSE。链路一旦变成「浏览器 → Nginx → Gateway → BFF → 业务服务」，任一层默认缓冲都会把「流式」攒成「最后一次性吐出」。下面记一遍怎么把 SSE <strong>真的流起来</strong>。</p>]]>
    </summary>
    <title>一条 SSE 如何穿过多层网关还不卡顿</title>
    <updated>2026-07-06T13:20:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="JavaScript" scheme="https://www.sanks-blog.com/categories/JavaScript/"/>
    <category term="Cesium" scheme="https://www.sanks-blog.com/tags/Cesium/"/>
    <category term="WebSocket" scheme="https://www.sanks-blog.com/tags/WebSocket/"/>
    <category term="IoT" scheme="https://www.sanks-blog.com/tags/IoT/"/>
    <id>https://www.sanks-blog.com/cesium-realtime-drone-telemetry/</id>
    <link href="https://www.sanks-blog.com/cesium-realtime-drone-telemetry/"/>
    <published>2026-06-08T13:30:00.000Z</published>
    <summary>
      <![CDATA[<p>巡检或应急三维控制台里，「飞机在不在动」往往比静态模型更抓人。本文基于一类 <strong>Vue + Cesium + 实时通道</strong> 的实践，梳理如何把设备遥测稳定画成「活的」飞行实体。厂商协议字段、内网地址等已脱敏，只保留可复用的设计思路。</p>]]>
    </summary>
    <title>Cesium 实时飞行：把遥测画成「活的」无人机</title>
    <updated>2026-06-08T13:30:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Vue" scheme="https://www.sanks-blog.com/categories/Vue/"/>
    <category term="Vue" scheme="https://www.sanks-blog.com/tags/Vue/"/>
    <id>https://www.sanks-blog.com/tree-table-component/</id>
    <link href="https://www.sanks-blog.com/tree-table-component/"/>
    <published>2021-12-15T15:25:41.000Z</published>
    <summary>
      <![CDATA[<div class="note info"><h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2></div>

<blockquote><p>距离上一篇博客有一月有余了吧，对于写博客的目的而言，我其实就是为了抒发自己无处宣泄的技术主张，在编写组件的过程中，很多同事嘲笑我“沉迷于组件”，也有的人让我“拿来主义”，并逼迫产品修改设计的重要显示和功能，但是我认为一个合格的程序员真的不应该是当这样的程序员，我何尝不知道工期紧，任务重，虽说我是修改别人的组件实现的最终效果吧，但是我这起码是当躲不开“造轮子”环节的时候，依然迎难而上。</p>
</blockquote>]]>
    </summary>
    <title>树形表格组件</title>
    <updated>2021-12-15T15:25:41.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="React" scheme="https://www.sanks-blog.com/categories/React/"/>
    <category term="React" scheme="https://www.sanks-blog.com/tags/React/"/>
    <id>https://www.sanks-blog.com/requestAnimationFrame/</id>
    <link href="https://www.sanks-blog.com/requestAnimationFrame/"/>
    <published>2021-11-07T03:05:45.000Z</published>
    <summary>
      <![CDATA[<div class="note info"><h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2></div>

<blockquote><p>当你写一个倒计时组件时，可能会出现的解决方案是应用 setInterval来做的。<br>我摘取网上的setInterval的实例代码，测试一下这个倒计时的误差。</p>
</blockquote>

<blockquote><p><span class="sanks-keywords">读者的疑问：一个倒计时组件，需要做的这么精准吗？</span><br>我的回答：这要看你对性能的要求是否是精益求精了，本着对计时精度的严格要求，尽量缩小倒计时误差，减小手机浏览器的内存消耗等很有必要；最重要的是，为以后的购物“秒杀”做准备，此组件扩展成“秒杀组件”是很简单的事。</p>
</blockquote>]]>
    </summary>
    <title>requestAnimationFrame解决传统定时器的BUG</title>
    <updated>2021-11-07T03:05:45.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="JavaScript" scheme="https://www.sanks-blog.com/categories/JavaScript/"/>
    <category term="ES6" scheme="https://www.sanks-blog.com/categories/JavaScript/ES6/"/>
    <category term="JavaScript" scheme="https://www.sanks-blog.com/tags/JavaScript/"/>
    <category term="ES6" scheme="https://www.sanks-blog.com/tags/ES6/"/>
    <id>https://www.sanks-blog.com/javascript-go-sleep-to-wait-next-execute/</id>
    <link href="https://www.sanks-blog.com/javascript-go-sleep-to-wait-next-execute/"/>
    <published>2020-08-22T01:32:38.000Z</published>
    <summary>
      <![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><blockquote><p>在做react的转场动画时，偶然想得一个解决方案中，需要拦截 React-router4 中 Prompt 的操作时，想让进程休眠，来执行转场动画，遗憾的是没有成功，但是意外获得了新技能 - javascript的休眠方法</p>
</blockquote>

<h2 id="如何编写sleep函数"><a href="#如何编写sleep函数" class="headerlink" title="如何编写sleep函数"></a>如何编写sleep函数</h2><blockquote><p>不卖关子了，直接上代码，不过需要你自己去验证，<span class="sanks-keywords">正所谓授之以鱼不如授之以渔</span></p>
</blockquote>]]>
    </summary>
    <title>如何使js进入休眠或等待</title>
    <updated>2020-08-22T01:32:38.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Framework" scheme="https://www.sanks-blog.com/categories/Framework/"/>
    <category term="Framework" scheme="https://www.sanks-blog.com/tags/Framework/"/>
    <id>https://www.sanks-blog.com/front-end-framework/</id>
    <link href="https://www.sanks-blog.com/front-end-framework/"/>
    <published>2020-06-25T11:38:37.000Z</published>
    <summary>
      <![CDATA[<div class="note info"><h2 id="权限拓展"><a href="#权限拓展" class="headerlink" title="权限拓展"></a>权限拓展</h2></div>

<blockquote><p>针对以往的权限控制职能到达页面及按钮级别，结合nodeJS中间件（路由代理），做出了延伸到接口的权限控制，概要图如下所示：</p>
<p><img src="/front-end-framework/permission.jpg" alt="permission structure chart" title="权限控制结构图"></p>]]>
    </summary>
    <title>前端框架设计及技术预研</title>
    <updated>2020-06-25T11:38:37.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="JavaScript" scheme="https://www.sanks-blog.com/categories/JavaScript/"/>
    <category term="JavaScript" scheme="https://www.sanks-blog.com/tags/JavaScript/"/>
    <id>https://www.sanks-blog.com/debounce-and-throttle/</id>
    <link href="https://www.sanks-blog.com/debounce-and-throttle/"/>
    <published>2020-05-20T15:40:45.000Z</published>
    <summary>
      <![CDATA[<h2 id="译文说明"><a href="#译文说明" class="headerlink" title="译文说明"></a>译文说明</h2><blockquote><p>作者：David Corbacho<br>原文链接：<a href="https://css-tricks.com/debouncing-throttling-explained-examples/">https://css-tricks.com/debouncing-throttling-explained-examples/</a></p>
</blockquote>

<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><blockquote><p><span style="font-style: italic">以下是伦敦前端工程师 <a href="https://twitter.com/dcorbacho">David Corbacho</a> 的客座文章。我们已经<a href="https://css-tricks.com/the-difference-between-throttling-and-debouncing/">之前讨论过这个主题</a>，但是这次，David将通过交互式演示来讲解这些概念，使事情变得非常清楚。</span></p>
</blockquote>

<blockquote><p><span style="font-weight: bolder">Debounce</span> 和 <span style="font-weight: bolder">throttle</span> 是两种类似(但不同的!)的技术，用于控制我们允许一个函数在一段时间内执行多少次。</p>
</blockquote>

<blockquote><p>在将函数附加到DOM事件时，具有函数的防抖动或节流的版本尤其有用。为什么呢?因为我们在事件和函数的执行之间给了自己一个控制层。请记住，我们不控制这些DOM事件的发出频率。它可以变化。</p>
</blockquote>]]>
    </summary>
    <title>通过例子解释防抖动和节流</title>
    <updated>2020-05-20T15:40:45.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Redux" scheme="https://www.sanks-blog.com/categories/Redux/"/>
    <category term="Redux" scheme="https://www.sanks-blog.com/tags/Redux/"/>
    <id>https://www.sanks-blog.com/connected-React-Router/</id>
    <link href="https://www.sanks-blog.com/connected-React-Router/"/>
    <published>2020-05-06T02:16:42.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote><p>最近在使用 Connnected React  Router 发现神奇的问题，居然没办法正常控制路由，身为专业的工程师，我们发挥福尔摩斯的精神，抽丝剥茧的找出问题出在哪。</p>
</blockquote>

<h2 id="什么是-Connected-React-Router"><a href="#什么是-Connected-React-Router" class="headerlink" title="什么是 Connected React Router"></a>什么是 Connected React Router</h2><blockquote><p>如果你使用Redux，那么在 Redux 中使用 Side Effect Handler（像是 Redux Thunk、Redux Observable 或是 Redux Saga）做「流程管理」的时候，那么你一定会有一种情境是</p>
<div class="note primary"><p>如果你做完某件事，把目前页面跳转到另一个页面</p>
</div>

<p>如果你也使用 React Router，那么 Connected React Router 就是帮你在 Redux 的流程中也可以使用 Router 的功能，（像是 push、 goBack … etc 之类的 Api 帮助你管理路由）</p>
</blockquote>

<blockquote><p>也就是说，Connected React Router 是帮助同步「Router」与「Redux」的状态，帮助你可以使用 Redux 管理 React Router 的工具！</p>
</blockquote>]]>
    </summary>
    <title>connected React Router</title>
    <updated>2020-05-06T02:16:42.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="axios" scheme="https://www.sanks-blog.com/categories/axios/"/>
    <category term="request" scheme="https://www.sanks-blog.com/tags/request/"/>
    <id>https://www.sanks-blog.com/http-request-timeout/</id>
    <link href="https://www.sanks-blog.com/http-request-timeout/"/>
    <published>2020-04-13T01:24:58.000Z</published>
    <summary>
      <![CDATA[<h2 id="引语"><a href="#引语" class="headerlink" title="引语"></a>引语</h2><blockquote><p>鉴于之前axios版本升级，去掉了baseUrl配置的问题，前端对于axios库的升级未做版本固定，导致项目启动报错；除了写成固定版本，还可以自己写一套请求响应机制。</p>
</blockquote>]]>
    </summary>
    <title>http request timeout</title>
    <updated>2020-04-13T01:24:58.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/categories/Nodejs/"/>
    <category term="Nodejs" scheme="https://www.sanks-blog.com/tags/Nodejs/"/>
    <id>https://www.sanks-blog.com/NodeJS-Middleware/</id>
    <link href="https://www.sanks-blog.com/NodeJS-Middleware/"/>
    <published>2020-02-03T06:59:38.000Z</published>
    <summary>
      <![CDATA[<h2 id="Nodejs-作为中间层能做的事"><a href="#Nodejs-作为中间层能做的事" class="headerlink" title="Nodejs 作为中间层能做的事"></a>Nodejs 作为中间层能做的事</h2><blockquote><p>nodejs中间层能减少开发过程中的一些实际问题，比如跨域，也能分担后台开发人员的工作，比如文件上传服务器，也能做简单的即时消息聊天功能，都是基于nodejs的特性。</p>
</blockquote>

<h3 id="反向代理和跨域"><a href="#反向代理和跨域" class="headerlink" title="反向代理和跨域"></a>反向代理和跨域</h3><blockquote><p>同源策略（SOP）是为了防止CSRF（跨域请求伪造）的攻击，浏览器引入的策略。<br><img src="/NodeJS-Middleware/sop.png" alt="同源策略" title="同源策略"></p>
</blockquote>]]>
    </summary>
    <title>NodeJS Middleware</title>
    <updated>2020-02-03T06:59:38.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Flutter" scheme="https://www.sanks-blog.com/categories/Flutter/"/>
    <category term="Flutter" scheme="https://www.sanks-blog.com/tags/Flutter/"/>
    <id>https://www.sanks-blog.com/Flutter/</id>
    <link href="https://www.sanks-blog.com/Flutter/"/>
    <published>2020-02-01T07:53:14.000Z</published>
    <summary>
      <![CDATA[<h2 id="引语"><a href="#引语" class="headerlink" title="引语"></a>引语</h2><blockquote><p>Flutter 是 Google 研发的 移动 UI 框架，可以快速在iOS和Android上构建高质量的原生用户界面。</p>
</blockquote>

<h2 id="Dart"><a href="#Dart" class="headerlink" title="Dart"></a>Dart</h2><blockquote><p>Dart 是 Flutter 的开发语言， 如同 IOS开发用 swift 一样, </p>
</blockquote>

<h2 id="Flutter-SDK"><a href="#Flutter-SDK" class="headerlink" title="Flutter SDK"></a>Flutter SDK</h2><blockquote><h3 id="Flutter-SDK里面有什么？"><a href="#Flutter-SDK里面有什么？" class="headerlink" title="Flutter SDK里面有什么？"></a>Flutter SDK里面有什么？</h3><ul>
<li>深度优化了的、移动优先的2D渲染引擎</li>
<li>现代、响应式框架</li>
<li>丰富的Android和iOS套件</li>
<li>单元和集成测试的API</li>
<li>连接到系统和第三方SDK的Interop和插件API</li>
<li>无头的测试运行器，用于在Windows、Linux和Mac上运行测试</li>
<li>用于创建、构建、测试和编译应用程序的命令行工具</li>
</ul>
</blockquote>]]>
    </summary>
    <title>Flutter</title>
    <updated>2020-02-01T07:53:14.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>sanks</name>
    </author>
    <category term="Git" scheme="https://www.sanks-blog.com/categories/Git/"/>
    <category term="Git" scheme="https://www.sanks-blog.com/tags/Git/"/>
    <id>https://www.sanks-blog.com/Mutiple-SSH-keys-for-diffrent-github-accounts/</id>
    <link href="https://www.sanks-blog.com/Mutiple-SSH-keys-for-diffrent-github-accounts/"/>
    <published>2020-01-05T12:01:31.000Z</published>
    <summary>
      <![CDATA[<h2 id="create-different-public-key"><a href="#create-different-public-key" class="headerlink" title="create different public key"></a>create different public key</h2><blockquote><p><span style="color: #fe2c23">Note: blog’s git configuration is global, others is in your project</span></p>
</blockquote>

<h3 id="create-different-ssh-key-according-to-your-need"><a href="#create-different-ssh-key-according-to-your-need" class="headerlink" title="create different ssh key according to your need"></a>create different ssh key according to your need</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_activehacker -C &quot;jexlab@gmail.com&quot;</span><br><span class="line">$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_jexchan -C &quot;jexchan@gmail.com&quot;</span><br></pre></td></tr></table></figure>

<blockquote><p>If your command line has no arguments “-f ~&#x2F;.ssh&#x2F;id_rsa_activehacker”, as following</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -C &quot;jexlab@gmail.com&quot;</span><br><span class="line">$ ssh-keygen -t rsa -C &quot;jexchan@gmail.com&quot;</span><br></pre></td></tr></table></figure>

<p>运行上面那条命令后会让输入一个文件名，用于保存刚才生成的 SSH key 代码，此时需要输入完整的绝对路径，或者只输入文件名，在当前目录生成，生成后移动到指定的.ssh文件夹内，如：</p>
</blockquote>

<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file in which to save the key (/c/Users/SKS/.ssh/id_rsa): /c/Users/SKS/.ssh/id_rsa_activehacker</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>Mutiple SSH keys for diffrent github accounts</title>
    <updated>2020-01-05T12:01:31.000Z</updated>
  </entry>
</feed>
