<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Coiven</title>
        <link>https://coiven.com/posts/</link>
        <description>Recent content in Posts on Coiven</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Sat, 28 Nov 2020 11:40:44 +0800</lastBuildDate>
        <atom:link href="https://coiven.com/posts/index.xml" rel="self" type="application/rss+xml" />
        
        <item>
            <title>「rust」项目构建与管理</title>
            <link>https://coiven.com/posts/2020/11/rust%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%E4%B8%8E%E7%AE%A1%E7%90%86/</link>
            <pubDate>Sat, 28 Nov 2020 11:40:44 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/rust%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%E4%B8%8E%E7%AE%A1%E7%90%86/</guid>
            <description>安装 利用远程脚本安装 rustup
curl https://sh.rustup.rs -sSf | sh
脚本安装完成之后会自动添加环境变量，需要重启终端。
直接使用的话需要手动添加环境变量
source $HOME/.cargo/env
或者修改 ~/.bash_profile, 加一行
export PATH=&amp;quot;$HOME/.cargo/bin:$PATH&amp;quot;
更新和卸载 更新：rustup update
卸载：rustup self uninstall
版本校验与文档 检查版本：rustc --version
查看本地离线文档：rustup doc
使用 cargo  内置的依赖管理器和构建工具，它能轻松增加、编译和管理依赖。
 创建项目 使用命令 cargo new &amp;lt;project_name&amp;gt; 可以创建一个 rust 新项目，内含一个 Cargo.toml 配置文件，以及位于 /src/main.rs 的主函数文件，并且在项目创建时初始化了一个 git 仓库。
Cargo.toml 文件内容如下,
[package] 下存放当前项目信息：名称、版本号、作者、rust 版本等
[dependencies] 下存放当前项目依赖的代码包（crates）
[package] name = &amp;quot;hello_cargo&amp;quot; version = &amp;quot;0.1.0&amp;quot; authors = [&amp;quot;Your Name &amp;lt;you@example.com&amp;gt;&amp;quot;] edition = &amp;quot;2018&amp;quot; [dependencies]  构建并执行 使用命令 cargo build 会在 /target/debug 目录下创建一个和项目同名的可执行文件，并在根目录下创建一个 Cargo.</description>
            <content type="html"><![CDATA[

<h2 id="安装">安装</h2>

<p>利用远程脚本安装 <code>rustup</code></p>

<p><code>curl https://sh.rustup.rs -sSf | sh</code></p>

<p>脚本安装完成之后会自动添加环境变量，需要重启终端。</p>

<p>直接使用的话需要手动添加环境变量</p>

<p><code>source $HOME/.cargo/env</code></p>

<p>或者修改 <code>~/.bash_profile</code>, 加一行</p>

<p><code>export PATH=&quot;$HOME/.cargo/bin:$PATH&quot;</code></p>

<h2 id="更新和卸载">更新和卸载</h2>

<p>更新：<code>rustup update</code></p>

<p>卸载：<code>rustup self uninstall</code></p>

<h2 id="版本校验与文档">版本校验与文档</h2>

<p>检查版本：<code>rustc --version</code></p>

<p>查看本地离线文档：<code>rustup doc</code></p>

<h2 id="使用-cargo">使用 cargo</h2>

<blockquote>
<p>内置的依赖管理器和构建工具，它能轻松增加、编译和管理依赖。</p>
</blockquote>

<h3 id="创建项目">创建项目</h3>

<p>使用命令 <code>cargo new &lt;project_name&gt;</code> 可以创建一个 rust 新项目，内含一个 <strong>Cargo.toml</strong> 配置文件，以及位于 <strong>/src/main.rs</strong> 的主函数文件，并且在项目创建时初始化了一个 git 仓库。</p>

<p><strong>Cargo.toml</strong> 文件内容如下,</p>

<p><strong>[package]</strong> 下存放当前项目信息：名称、版本号、作者、rust 版本等</p>

<p><strong>[dependencies]</strong> 下存放当前项目依赖的代码包（crates）</p>

<pre><code class="language-toml">[package]
name = &quot;hello_cargo&quot;
version = &quot;0.1.0&quot;
authors = [&quot;Your Name &lt;you@example.com&gt;&quot;]
edition = &quot;2018&quot;

[dependencies]
</code></pre>

<h3 id="构建并执行">构建并执行</h3>

<p>使用命令 <code>cargo build</code> 会在 <strong>/target/debug</strong> 目录下创建一个和项目同名的可执行文件，并在根目录下创建一个 <strong>Cargo.lock</strong> 文件，用作当前依赖的版本、缓存判断。</p>

<p>使用命令 <code>cargo run</code> 可以一步构建并运行 rust 程序，若程序未被更改，则直接运行可执行文件。</p>

<p>使用命令 <code>cargo check</code> 可以快速检查代码确保其可以编译，但并不产生可执行文件。</p>

<h3 id="发布">发布</h3>

<p>执行 <code>cargo build --release</code> 命令可以在 <strong>/target/release</strong> 目录下生成用作发布的可执行文件，该过程会对代码进行优化，使其执行速度更快，但同时编译时间也会更长。</p>
]]></content>
        </item>
        
        <item>
            <title>Hugo 尝鲜</title>
            <link>https://coiven.com/posts/2020/11/hugo-%E5%B0%9D%E9%B2%9C/</link>
            <pubDate>Wed, 11 Nov 2020 15:19:56 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/hugo-%E5%B0%9D%E9%B2%9C/</guid>
            <description>Hugo  The world’s fastest framework for building websites
 起初看到这个 slogan 还是有点不服的，使用了一段时间后还是真香了。
Hugo 对于 mac 用户还是比较友好的。
安装 brew install hugo
新建站点 hugo new site [site_name]
选择主题 cd [site_name]
git init
git submodule add [theme_git_url] themes/[theme_name]
可以去这里找更多皮肤
配置主题 将上一步配置的主题名写入 toml 配置文件中
echo &#39;theme = &amp;quot;[theme_name]&amp;quot;&#39; &amp;gt;&amp;gt; config.toml
新建文章 hugo new posts/[post_name].md
新建的 md 文件会自带如下头部
--- title: &amp;quot;[post_name]&amp;quot; date: 2019-03-26T08:47:11+01:00 draft: true ---   draft 表示当前文章是否为草稿，如需发布，改为 false 即可
 启动本地服务 hugo server -D</description>
            <content type="html"><![CDATA[

<h2 id="hugo">Hugo</h2>

<blockquote>
<p>The world’s fastest framework for building websites</p>
</blockquote>

<p>起初看到这个 slogan 还是有点不服的，使用了一段时间后还是真香了。</p>

<p>Hugo 对于 mac 用户还是比较友好的。</p>

<h3 id="安装">安装</h3>

<p><code>brew install hugo</code></p>

<h3 id="新建站点">新建站点</h3>

<p><code>hugo new site [site_name]</code></p>

<h3 id="选择主题">选择主题</h3>

<p><code>cd [site_name]</code></p>

<p><code>git init</code></p>

<p><code>git submodule add [theme_git_url] themes/[theme_name]</code></p>

<p>可以去这里找<a href="https://themes.gohugo.io/" target="_blank">更多皮肤</a></p>

<h3 id="配置主题">配置主题</h3>

<p>将上一步配置的主题名写入 toml 配置文件中</p>

<p><code>echo 'theme = &quot;[theme_name]&quot;' &gt;&gt; config.toml</code></p>

<h3 id="新建文章">新建文章</h3>

<p><code>hugo new posts/[post_name].md</code></p>

<p>新建的 md 文件会自带如下头部</p>

<pre><code class="language-markdown">---
title: &quot;[post_name]&quot;
date: 2019-03-26T08:47:11+01:00
draft: true
---
</code></pre>

<blockquote>
<p>draft 表示当前文章是否为草稿，如需发布，改为 false 即可</p>
</blockquote>

<h3 id="启动本地服务">启动本地服务</h3>

<p><code>hugo server -D</code></p>

<p>该命令将会在当前主机的 1313 端口启动一个支持热更新的 hugo 服务</p>

<h3 id="打包静态页面">打包静态页面</h3>

<p><code>hugo -D</code></p>

<p>该命令将会解析当前文章并在 public 文件夹内生成对应静态文件</p>

<h2 id="vercel">Vercel</h2>

<p>其实也可以部署到自己的服务器上，再配一个 github action 来自动化部署，但是比较繁琐，不如直接使用现成的。</p>

<p>Vercel 就是一个比较好的解决方案，将我们上面构建的 Hugo 项目托管到 github 之后，链接 Vercel 和对应仓库即可。</p>

<p>绑定成功后，可以用 Vercel 提供的域名访问，也可以把自己的域名解析到对应的 IP。</p>
]]></content>
        </item>
        
        <item>
            <title>Iterm2 实现 socks 代理</title>
            <link>https://coiven.com/posts/2020/11/iterm2-%E5%AE%9E%E7%8E%B0-socks-%E4%BB%A3%E7%90%86/</link>
            <pubDate>Wed, 11 Nov 2020 14:40:29 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/iterm2-%E5%AE%9E%E7%8E%B0-socks-%E4%BB%A3%E7%90%86/</guid>
            <description>测试当前 socks5 端口，及代理 IP curl --socks5 127.0.0.1:1086 http://cip.cc
安装 Privoxy brew install Privoxy
修改 /usr/local/etc/privoxy/config 文件添加如下2行
forward-socks5 / 127.0.0.1:1086 . （注意：1086是shdowsocks默认的端口）
listen-address 0.0.0.0:8118
启动 Privoxy brew services start privoxy
快捷命令 alias proxyon=&amp;quot;export http_proxy=&#39;http://localhost:8118&#39;; export https_proxy=&#39;http://localhost:8118&#39;&amp;quot;
alias proxyoff=&amp;quot;unset http_proxy; unset https_proxy&amp;quot;
将上面👆这两段放到 ~/.zshrc 下
查看是否启动成功 ps aux | grep privoxy
proxyon 开启代理
curl http://cip.cc</description>
            <content type="html"><![CDATA[

<h2 id="测试当前-socks5-端口-及代理-ip">测试当前 socks5 端口，及代理 IP</h2>

<p><code>curl --socks5 127.0.0.1:1086 http://cip.cc</code></p>

<h2 id="安装-privoxy">安装 Privoxy</h2>

<p><code>brew install Privoxy</code></p>

<h2 id="修改-usr-local-etc-privoxy-config">修改 /usr/local/etc/privoxy/config</h2>

<p>文件添加如下2行</p>

<p><code>forward-socks5 / 127.0.0.1:1086 .</code> （注意：1086是shdowsocks默认的端口）</p>

<p><code>listen-address  0.0.0.0:8118</code></p>

<h2 id="启动-privoxy">启动 Privoxy</h2>

<p><code>brew services start privoxy</code></p>

<h2 id="快捷命令">快捷命令</h2>

<p><code>alias proxyon=&quot;export http_proxy='http://localhost:8118'; export https_proxy='http://localhost:8118'&quot;</code></p>

<p><code>alias proxyoff=&quot;unset http_proxy; unset https_proxy&quot;</code></p>

<p>将上面👆这两段放到 ~/.zshrc 下</p>

<h2 id="查看是否启动成功">查看是否启动成功</h2>

<p><code>ps aux | grep privoxy</code></p>

<p><code>proxyon</code>  开启代理</p>

<p><code>curl http://cip.cc</code></p>
]]></content>
        </item>
        
        <item>
            <title>「Vue3」reactivity 模块</title>
            <link>https://coiven.com/posts/2020/11/vue3reactivity-%E6%A8%A1%E5%9D%97/</link>
            <pubDate>Wed, 11 Nov 2020 14:11:47 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/vue3reactivity-%E6%A8%A1%E5%9D%97/</guid>
            <description>模块概述  baseHandlers.ts  响应式对象 Proxy 的各个处理方式 追踪数组变化 (includes、indexOf、lastIndexOf) 对比 2.0，新增 Proxy、Reflect  collectionHandlers.ts  采集处理 (Set、Map、WeakMap、WeakSet) 构建迭代器 检测内部变化  computed.ts  是否只读通过传入参数是 object 还是 function 判断 获取 value 时收集依赖  effect.ts  封装副作用函数 单独维护一个副作用堆（effectStack），防止循环调用 track 采集 [副作用] 添加到 [依赖] 中 trigger 触发 [依赖] 中的 [副作用]  operations.ts  常量定义：采集类型、触发类型  reactive.ts  reactive：将对象转为响应式对象 shadowReactive：返回对象的响应式副本 readonly：将对象转为只读对象 shadowReadonly：返回对象的只读副本 以上四种各自维护一个字典映射转换前后对象，防止重复转换 利用对应的 Proxy 配置将对象转换为 observed 观察者对象 isReactive 判断当前对象是否是响应式对象 isReadonly 判断当前对象是否是只读对象 isProxy 传入对象是否经过代理（响应式对象 或 只读对象） toRaw 将响应式对象、只读对象转为原始值 markRaw 将传入对象标记为原生对象，禁止转换  refs.</description>
            <content type="html"><![CDATA[

<h2 id="模块概述">模块概述</h2>

<ul>
<li>baseHandlers.ts

<ul>
<li>响应式对象 Proxy 的各个处理方式</li>
<li>追踪数组变化 (includes、indexOf、lastIndexOf)</li>
<li>对比 2.0，新增 Proxy、Reflect</li>
</ul></li>
<li>collectionHandlers.ts

<ul>
<li>采集处理 (Set、Map、WeakMap、WeakSet)</li>
<li>构建迭代器</li>
<li>检测内部变化</li>
</ul></li>
<li>computed.ts

<ul>
<li>是否只读通过传入参数是 object 还是 function 判断</li>
<li>获取 value 时收集依赖</li>
</ul></li>
<li>effect.ts

<ul>
<li>封装副作用函数</li>
<li>单独维护一个副作用堆（effectStack），防止循环调用</li>
<li>track 采集 [副作用] 添加到 [依赖] 中</li>
<li>trigger 触发 [依赖] 中的 [副作用]</li>
</ul></li>
<li>operations.ts

<ul>
<li>常量定义：采集类型、触发类型</li>
</ul></li>
<li>reactive.ts

<ul>
<li>reactive：将对象转为响应式对象</li>
<li>shadowReactive：返回对象的响应式副本</li>
<li>readonly：将对象转为只读对象</li>
<li>shadowReadonly：返回对象的只读副本</li>
<li>以上四种各自维护一个字典映射转换前后对象，防止重复转换</li>
<li>利用对应的 Proxy 配置将对象转换为 observed 观察者对象</li>
<li>isReactive 判断当前对象是否是响应式对象</li>
<li>isReadonly 判断当前对象是否是只读对象</li>
<li>isProxy 传入对象是否经过代理（响应式对象 或 只读对象）</li>
<li>toRaw 将响应式对象、只读对象转为原始值</li>
<li>markRaw 将传入对象标记为原生对象，禁止转换</li>
</ul></li>
<li>refs.ts

<ul>
<li>类似computed.ts，对ref传入的值、对象进行封装。</li>
</ul></li>
</ul>

<h2 id="reactive-effect-使用">reactive + effect 使用</h2>

<p>结合vue官方提供的测试用例：</p>

<pre><code class="language-javascript">it('should observe basic properties', () =&gt; {
    let dummy
    const counter = reactive({ num: 0 })
    effect(() =&gt; (dummy = counter.num))
    expect(dummy).toBe(0)
    counter.num = 7
    expect(dummy).toBe(7)
})
</code></pre>

<p>可以看到，经过了如下步骤：</p>

<ol>
<li>利用 reactive 将 { num: 0 } 封装为响应式对象并赋值给 counter</li>
<li>利用 effect 将 () =&gt; (dummy = counter.num) 封装为副作用</li>
<li>effect 内部 fn 会立即执行，即触发 counter 的 get，并给 dummy 赋值</li>
<li>get 触发，开始采集依赖（track），将此时的 activeEffect 作为依赖收集</li>
<li>对 dummy 进行断言，值为 0</li>
<li>给响应式对象 counter 的 num 属性赋值，触发 counter 的 set</li>
<li>set 触发，开始触发依赖（trigger），将 counter 对应的所有依赖依次触发</li>
<li>effect 内部 fn 再次执行，给 dummy 赋值</li>
<li>对 dummy 进行断言，值为 7</li>
</ol>

<h2 id="总结">总结</h2>

<p>3.0 的 reactivity 模块对比 2.0 的响应式系统
* 加入了 Proxy 来更加完善的代理对象中的方法（例如 2.0 中较为诟病的数组方法）以替换原来的 Object.definePropert ，但同时也放弃了对低版本浏览器的兼容。
* 加入了 effect 副作用来更好的描述依赖的收集、触发
* 为所有 reactive 封装的对象维护了各自的映射表，避免重复封装、循环调用，由此也提供了撤销响应式的方法（toRaw）
* 抽离出作为单独模块加载，结构更清晰，更易理解，同时支持了 hooks</p>
]]></content>
        </item>
        
        <item>
            <title>FE 环境配置</title>
            <link>https://coiven.com/posts/2020/11/fe-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</link>
            <pubDate>Wed, 11 Nov 2020 12:19:00 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/fe-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</guid>
            <description>Docker 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
更新仓库
sudo apt-get update
安装依赖
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common  添加 Docker 的官方 GPG 密钥：
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
检查密钥
sudo apt-key fingerprint 0EBFCD88
设置稳定版仓库
sudo add-apt-repository \ &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable&amp;quot;  安装
sudo apt-get install docker-ce docker-ce-cli containerd.io
开机自启
systemctl enable docker.</description>
            <content type="html"><![CDATA[

<h2 id="docker">Docker</h2>

<p>卸载旧版本</p>

<p><code>sudo apt-get remove docker docker-engine docker.io containerd runc</code></p>

<p>更新仓库</p>

<p><code>sudo apt-get update</code></p>

<p>安装依赖</p>

<pre><code class="language-bash">sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
</code></pre>

<p>添加 Docker 的官方 GPG 密钥：</p>

<p><code>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></p>

<p>检查密钥</p>

<p><code>sudo apt-key fingerprint 0EBFCD88</code></p>

<p>设置稳定版仓库</p>

<pre><code class="language-bash">sudo add-apt-repository \
   &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable&quot;
</code></pre>

<p>安装</p>

<p><code>sudo apt-get install docker-ce docker-ce-cli containerd.io</code></p>

<p>开机自启</p>

<p><code>systemctl enable docker.service</code></p>

<p>在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启：</p>

<p><code>docker run --restart=always</code></p>

<p>如果已经启动了则可以使用如下命令：</p>

<p><code>docker update --restart=always &lt;CONTAINER ID&gt;</code></p>

<h2 id="nginx">Nginx</h2>

<p>拉取镜像</p>

<p><code>docker pull nginx</code></p>

<p>启动</p>

<p><code>docker run --name docker-nginx -d -p 80:80 -v /etc/docker/docker-nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /etc/docker/docker-nginx/conf.d:/etc/nginx/conf.d nginx</code></p>

<h2 id="postgres">Postgres</h2>

<p>拉取镜像</p>

<p><code>docker pull postgres:latest</code></p>

<p>创建卷进行持久化</p>

<p><code>docker volume create pgdata</code></p>

<p>启动</p>

<p><code>docker run -v pgdata:/var/lib/postgres/data -p 5432:5432 -e POSTGRES_PASSWORD=970306 -d postgres:latest</code></p>

<h2 id="nvm">nvm</h2>

<p>脚本安装</p>

<p><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash</code></p>

<p>环境变量</p>

<pre><code class="language-bash">export NVM_DIR=&quot;$([ -z &quot;${XDG_CONFIG_HOME-}&quot; ] &amp;&amp; printf %s &quot;${HOME}/.nvm&quot; || printf %s &quot;${XDG_CONFIG_HOME}/nvm&quot;)&quot;
[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;&amp; \. &quot;$NVM_DIR/nvm.sh&quot;
</code></pre>

<h2 id="yarn">yarn</h2>

<p>仓库</p>

<p><code>curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -</code></p>

<p>脚本安装</p>

<p><code>sudo apt install yarn</code></p>
]]></content>
        </item>
        
        <item>
            <title>重启</title>
            <link>https://coiven.com/posts/2020/11/%E9%87%8D%E5%90%AF/</link>
            <pubDate>Tue, 10 Nov 2020 18:06:34 +0800</pubDate>
            
            <guid>https://coiven.com/posts/2020/11/%E9%87%8D%E5%90%AF/</guid>
            <description>不知道为啥，又把博客弄了起来，可能我是 nt 叭🤷‍♂️</description>
            <content type="html"><![CDATA[<p>不知道为啥，又把博客弄了起来，可能我是 nt 叭🤷‍♂️</p>
]]></content>
        </item>
        
    </channel>
</rss>
